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 /**
 26  * @ignore
 27  */
 28 ccs.DisplayFactory = ccs.DisplayFactory || ccs.Class.extend({});
 29 ccs.DisplayFactory.addDisplay = function (bone, decoDisplay, displayData) {
 30     switch (displayData.displayType) {
 31         case ccs.DISPLAY_TYPE_SPRITE:
 32             this.addSpriteDisplay(bone, decoDisplay, displayData);
 33             break;
 34         case  ccs.DISPLAY_TYPE_PARTICLE:
 35             this.addParticleDisplay(bone, decoDisplay, displayData);
 36             break;
 37         case  ccs.DISPLAY_TYPE_ARMATURE:
 38             this.addArmatureDisplay(bone, decoDisplay, displayData);
 39             break;
 40         default:
 41             break;
 42     }
 43 };
 44 ccs.DisplayFactory.createDisplay = function (bone, decoDisplay) {
 45     switch (decoDisplay.getDisplayData().displayType) {
 46         case ccs.DISPLAY_TYPE_SPRITE:
 47             this.createSpriteDisplay(bone, decoDisplay);
 48             break;
 49         case ccs.DISPLAY_TYPE_PARTICLE:
 50             this.createParticleDisplay(bone, decoDisplay);
 51             break;
 52         case ccs.DISPLAY_TYPE_ARMATURE:
 53             this.createArmatureDisplay(bone, decoDisplay);
 54             break;
 55         default:
 56             break;
 57     }
 58 };
 59 ccs.DisplayFactory._helpTransform =  {a:1, b:0, c:0, d:1, tx:0, ty:0};
 60 ccs.DisplayFactory.updateDisplay = function (bone,dt, dirty) {
 61     var display = bone.getDisplayRenderNode();
 62     if(!display)
 63         return;
 64 
 65     switch (bone.getDisplayRenderNodeType()) {
 66         case ccs.DISPLAY_TYPE_SPRITE:
 67             if (dirty){
 68                 display.updateArmatureTransform();
 69             }
 70             break;
 71         case ccs.DISPLAY_TYPE_PARTICLE:
 72             this.updateParticleDisplay(bone, display, dt);
 73             break;
 74         case ccs.DISPLAY_TYPE_ARMATURE:
 75             this.updateArmatureDisplay(bone, display, dt);
 76             break;
 77         default:
 78             display.setAdditionalTransform(bone.nodeToArmatureTransform());
 79             break;
 80     }
 81 
 82     if (ccs.ENABLE_PHYSICS_CHIPMUNK_DETECT || ccs.ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX) {
 83         if (dirty) {
 84             var decoDisplay = bone.getDisplayManager().getCurrentDecorativeDisplay();
 85             var detector = decoDisplay.getColliderDetector();
 86             if (detector) {
 87                 var node = decoDisplay.getDisplay();
 88                 var displayTransform = node.nodeToParentTransform();
 89                 var helpTransform = this._helpTransform;
 90                 helpTransform.a = displayTransform.a;
 91                 helpTransform.b = displayTransform.b;
 92                 helpTransform.c = displayTransform.c;
 93                 helpTransform.d = displayTransform.d;
 94                 helpTransform.tx = displayTransform.tx;
 95                 helpTransform.ty = displayTransform.ty;
 96                 var anchorPoint =  node.getAnchorPointInPoints();
 97                 anchorPoint = cc.PointApplyAffineTransform(anchorPoint, helpTransform);
 98                 helpTransform.tx = anchorPoint.x;
 99                 helpTransform.ty = anchorPoint.y;
100                 var t = cc.AffineTransformConcat(helpTransform, bone.getArmature().nodeToParentTransform());
101                 detector.updateTransform(t);
102             }
103         }
104     }
105 
106 };
107 ccs.DisplayFactory.addSpriteDisplay = function (bone, decoDisplay, displayData) {
108     var sdp = new ccs.SpriteDisplayData();
109     sdp.copy(displayData);
110     decoDisplay.setDisplayData(sdp);
111     this.createSpriteDisplay(bone, decoDisplay);
112 };
113 
114 ccs.DisplayFactory.createSpriteDisplay = function (bone, decoDisplay) {
115     var skin = null;
116     var displayData = decoDisplay.getDisplayData();
117     //! remove .xxx
118     var textureName = displayData.displayName;
119     var startPos = textureName.lastIndexOf(".");
120     if (startPos != -1) {
121         textureName = textureName.substring(0, startPos);
122     }
123     //! create display
124     if (textureName == "") {
125         skin = ccs.Skin.create();
126     }
127     else {
128         skin = ccs.Skin.createWithSpriteFrameName(textureName + ".png");
129     }
130     decoDisplay.setDisplay(skin);
131     skin.setBone(bone);
132     this.initSpriteDisplay(bone, decoDisplay, displayData.displayName, skin);
133     var armature = bone.getArmature();
134     if (armature) {
135         if (armature.getArmatureData().dataVersion >= ccs.CONST_VERSION_COMBINED)
136             skin.setSkinData(displayData.skinData);
137         else
138             skin.setSkinData(bone.getBoneData());
139     }
140 
141 
142 };
143 
144 ccs.DisplayFactory.initSpriteDisplay = function(bone, decoDisplay, displayName, skin){
145     var textureName = displayName;
146     var startPos = textureName.lastIndexOf(".");
147     if (startPos != -1) {
148         textureName = textureName.substring(0, startPos);
149     }
150     var textureData = ccs.armatureDataManager.getTextureData(textureName);
151     if (textureData) {
152         //! Init display anchorPoint, every Texture have a anchor point
153         skin.setAnchorPoint(textureData.pivotX, textureData.pivotY);
154     }
155     if (ccs.ENABLE_PHYSICS_CHIPMUNK_DETECT || ccs.ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX) {
156         if (textureData && textureData.contourDataList.length > 0)        {
157             var colliderDetector = ccs.ColliderDetector.create(bone);
158             colliderDetector.addContourDataList(textureData.contourDataList);
159             decoDisplay.setColliderDetector(colliderDetector);
160         }
161     }
162 };
163 
164 ccs.DisplayFactory.addArmatureDisplay = function (bone, decoDisplay, displayData) {
165     var adp = new ccs.ArmatureDisplayData();
166     adp.copy(displayData);
167     decoDisplay.setDisplayData(adp);
168 
169     this.createArmatureDisplay(bone, decoDisplay);
170 };
171 ccs.DisplayFactory.createArmatureDisplay = function (bone, decoDisplay) {
172     var displayData = decoDisplay.getDisplayData();
173     var armature = ccs.Armature.create(displayData.displayName, bone);
174     decoDisplay.setDisplay(armature);
175 };
176 ccs.DisplayFactory.updateArmatureDisplay = function (bone, armature, dt) {
177     if (armature) {
178         armature.sortAllChildren();
179         armature.update(dt);
180     }
181 };
182 
183 ccs.DisplayFactory.addParticleDisplay = function (bone, decoDisplay, displayData) {
184     var adp = new ccs.ParticleDisplayData();
185     adp.copy(displayData);
186     decoDisplay.setDisplayData(adp);
187     this.createParticleDisplay(bone, decoDisplay);
188 };
189 ccs.DisplayFactory.createParticleDisplay = function (bone, decoDisplay) {
190     var displayData = decoDisplay.getDisplayData();
191     var system = cc.ParticleSystem.create(displayData.displayName);
192     var armature = bone.getArmature();
193     if (armature)    {
194         system.setParent(bone.getArmature());
195     }
196     decoDisplay.setDisplay(system);
197 };
198 ccs.DisplayFactory.updateParticleDisplay = function (bone, particleSystem, dt) {
199     var node = new ccs.BaseData();
200     ccs.TransformHelp.matrixToNode(bone.nodeToArmatureTransform(), node);
201     particleSystem.setPosition(node.x, node.y);
202     particleSystem.setScaleX(node.scaleX);
203     particleSystem.setScaleY(node.scaleY);
204     particleSystem.update(dt);
205 };
206