1 /****************************************************************************
  2  Copyright (c) 2010-2012 cocos2d-x.org
  3 
  4  http://www.cocos2d-x.org
  5 
  6  Permission is hereby granted, free of charge, to any person obtaining a copy
  7  of this software and associated documentation files (the "Software"), to deal
  8  in the Software without restriction, including without limitation the rights
  9  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 10  copies of the Software, and to permit persons to whom the Software is
 11  furnished to do so, subject to the following conditions:
 12 
 13  The above copyright notice and this permission notice shall be included in
 14  all copies or substantial portions of the Software.
 15 
 16  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 17  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 18  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 19  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 20  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 21  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 22  THE SOFTWARE.
 23  ****************************************************************************/
 24 
 25 ccs.DisplayFactory = ccs.DisplayFactory || ccs.Class.extend({});
 26 ccs.DisplayFactory.addDisplay = function (bone, decoDisplay, displayData) {
 27     switch (displayData.displayType) {
 28         case ccs.DisplayType.sprite:
 29             this.addSpriteDisplay(bone, decoDisplay, displayData);
 30             break;
 31         case  ccs.DisplayType.particle:
 32             this.addParticleDisplay(bone, decoDisplay, displayData);
 33             break;
 34         case  ccs.DisplayType.armature:
 35             this.addArmatureDisplay(bone, decoDisplay, displayData);
 36             break;
 37         default:
 38             break;
 39     }
 40 };
 41 ccs.DisplayFactory.createDisplay = function (bone, decoDisplay) {
 42     switch (decoDisplay.getDisplayData().displayType) {
 43         case ccs.DisplayType.sprite:
 44             this.createSpriteDisplay(bone, decoDisplay);
 45             break;
 46         case ccs.DisplayType.particle:
 47             this.createParticleDisplay(bone, decoDisplay);
 48             break;
 49         case ccs.DisplayType.armature:
 50             this.createArmatureDisplay(bone, decoDisplay);
 51             break;
 52         default:
 53             break;
 54     }
 55 };
 56 ccs.DisplayFactory._helpTransform =  {a:1, b:0, c:0, d:1, tx:0, ty:0};
 57 ccs.DisplayFactory.updateDisplay = function (bone,dt, dirty) {
 58     var display = bone.getDisplayRenderNode();
 59     if(!display)
 60         return;
 61 
 62     switch (bone.getDisplayRenderNodeType()) {
 63         case ccs.DisplayType.sprite:
 64             if (dirty){
 65                 display.updateArmatureTransform();
 66             }
 67             break;
 68         case ccs.DisplayType.particle:
 69             this.updateParticleDisplay(bone, display, dt);
 70             break;
 71         case ccs.DisplayType.armature:
 72             this.updateArmatureDisplay(bone, display, dt);
 73             break;
 74         default:
 75             display.setAdditionalTransform(bone.nodeToArmatureTransform());
 76             break;
 77     }
 78 
 79     if (ccs.ENABLE_PHYSICS_CHIPMUNK_DETECT || ccs.ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX) {
 80         if (dirty) {
 81             var decoDisplay = bone.getDisplayManager().getCurrentDecorativeDisplay();
 82             var detector = decoDisplay.getColliderDetector();
 83             if (detector) {
 84                 var node = decoDisplay.getDisplay();
 85                 var displayTransform = node.nodeToParentTransform();
 86                 var helpTransform = this._helpTransform;
 87                 helpTransform.a = displayTransform.a;
 88                 helpTransform.b = displayTransform.b;
 89                 helpTransform.c = displayTransform.c;
 90                 helpTransform.d = displayTransform.d;
 91                 helpTransform.tx = displayTransform.tx;
 92                 helpTransform.ty = displayTransform.ty;
 93                 var anchorPoint =  node.getAnchorPointInPoints();
 94                 anchorPoint = cc.PointApplyAffineTransform(anchorPoint, helpTransform);
 95                 helpTransform.tx = anchorPoint.x;
 96                 helpTransform.ty = anchorPoint.y;
 97                 var t = cc.AffineTransformConcat(helpTransform, bone.getArmature().nodeToParentTransform());
 98                 detector.updateTransform(t);
 99             }
100         }
101     }
102 
103 };
104 ccs.DisplayFactory.addSpriteDisplay = function (bone, decoDisplay, displayData) {
105     var sdp = new ccs.SpriteDisplayData();
106     sdp.copy(displayData);
107     decoDisplay.setDisplayData(sdp);
108     this.createSpriteDisplay(bone, decoDisplay);
109 };
110 
111 ccs.DisplayFactory.createSpriteDisplay = function (bone, decoDisplay) {
112     var skin = null;
113     var displayData = decoDisplay.getDisplayData();
114     //! remove .xxx
115     var textureName = displayData.displayName;
116     var startPos = textureName.lastIndexOf(".");
117     if (startPos != -1) {
118         textureName = textureName.substring(0, startPos);
119     }
120     //! create display
121     if (textureName == "") {
122         skin = ccs.Skin.create();
123     }
124     else {
125         skin = ccs.Skin.createWithSpriteFrameName(textureName + ".png");
126     }
127     decoDisplay.setDisplay(skin);
128     skin.setBone(bone);
129     this.initSpriteDisplay(bone, decoDisplay, displayData.displayName, skin);
130     var armature = bone.getArmature();
131     if (armature) {
132         if (armature.getArmatureData().dataVersion >= ccs.CONST_VERSION_COMBINED)
133             skin.setSkinData(displayData.skinData);
134         else
135             skin.setSkinData(bone.getBoneData());
136     }
137 
138 
139 };
140 
141 ccs.DisplayFactory.initSpriteDisplay = function(bone, decoDisplay, displayName, skin){
142     var textureName = displayName;
143     var startPos = textureName.lastIndexOf(".");
144     if (startPos != -1) {
145         textureName = textureName.substring(0, startPos);
146     }
147     var textureData = ccs.ArmatureDataManager.getInstance().getTextureData(textureName);
148     if (textureData) {
149         //! Init display anchorPoint, every Texture have a anchor point
150         skin.setAnchorPoint(textureData.pivotX, textureData.pivotY);
151     }
152     if (ccs.ENABLE_PHYSICS_CHIPMUNK_DETECT || ccs.ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX) {
153         if (textureData && textureData.contourDataList.length > 0)        {
154             var colliderDetector = ccs.ColliderDetector.create(bone);
155             colliderDetector.addContourDataList(textureData.contourDataList);
156             decoDisplay.setColliderDetector(colliderDetector);
157         }
158     }
159 };
160 
161 ccs.DisplayFactory.addArmatureDisplay = function (bone, decoDisplay, displayData) {
162     var adp = new ccs.ArmatureDisplayData();
163     adp.copy(displayData);
164     decoDisplay.setDisplayData(adp);
165 
166     this.createArmatureDisplay(bone, decoDisplay);
167 };
168 ccs.DisplayFactory.createArmatureDisplay = function (bone, decoDisplay) {
169     var displayData = decoDisplay.getDisplayData();
170     var armature = ccs.Armature.create(displayData.displayName, bone);
171     decoDisplay.setDisplay(armature);
172 };
173 ccs.DisplayFactory.updateArmatureDisplay = function (bone, armature, dt) {
174     if (armature) {
175         armature.sortAllChildren();
176         armature.update(dt);
177     }
178 };
179 
180 ccs.DisplayFactory.addParticleDisplay = function (bone, decoDisplay, displayData) {
181     var adp = new ccs.ParticleDisplayData();
182     adp.copy(displayData);
183     decoDisplay.setDisplayData(adp);
184     this.createParticleDisplay(bone, decoDisplay);
185 };
186 ccs.DisplayFactory.createParticleDisplay = function (bone, decoDisplay) {
187     var displayData = decoDisplay.getDisplayData();
188     var system = cc.ParticleSystem.create(displayData.displayName);
189     var armature = bone.getArmature();
190     if (armature)    {
191         system.setParent(bone.getArmature());
192     }
193     decoDisplay.setDisplay(system);
194 };
195 ccs.DisplayFactory.updateParticleDisplay = function (bone, particleSystem, dt) {
196     var node = new ccs.BaseData();
197     ccs.TransformHelp.matrixToNode(bone.nodeToArmatureTransform(), node);
198     particleSystem.setPosition(node.x, node.y);
199     particleSystem.setScaleX(node.scaleX);
200     particleSystem.setScaleY(node.scaleY);
201     particleSystem.update(dt);
202 };
203