2626 sp . Skeleton . CanvasRenderCmd = function ( renderableObject ) {
2727 cc . Node . CanvasRenderCmd . call ( this , renderableObject ) ;
2828 this . _needDraw = true ;
29-
30- this . _skeletonSprites = [ ] ;
3129 } ;
3230
3331 var proto = sp . Skeleton . CanvasRenderCmd . prototype = Object . create ( cc . Node . CanvasRenderCmd . prototype ) ;
3432 proto . constructor = sp . Skeleton . CanvasRenderCmd ;
3533
3634 proto . rendering = function ( wrapper , scaleX , scaleY ) {
37- var node = this . _node , i , n ;
35+ var node = this . _node , i , n , slot , slotNode ;
3836 wrapper = wrapper || cc . _renderContext ;
39- var context = wrapper . getContext ( ) ;
40-
41- var locSkeleton = node . _skeleton , color = node . getColor ( ) ;
42- locSkeleton . r = color . r / 255 ;
43- locSkeleton . g = color . g / 255 ;
44- locSkeleton . b = color . b / 255 ;
45- locSkeleton . a = this . getDisplayedOpacity ( ) / 255 ;
46- if ( node . _premultipliedAlpha ) {
47- locSkeleton . r *= locSkeleton . a ;
48- locSkeleton . g *= locSkeleton . a ;
49- locSkeleton . b *= locSkeleton . a ;
50- }
51-
52- /*wrapper.setTransform(this._worldTransform, scaleX, scaleY);
53- context.save();
54- //draw skeleton by itself.
55- var slot, attachment, selTexture, selBone, rendererObject;
56- for (i = 0, n = locSkeleton.drawOrder.length; i < n; i++) {
57- slot = locSkeleton.drawOrder[i];
58- if (!slot.attachment)
59- continue;
6037
61- attachment = slot.attachment;
62- rendererObject = attachment.rendererObject;
63- selTexture = rendererObject.page._texture;
64- if(!selTexture || !selTexture._textureLoaded || !slot.bone)
65- continue;
66-
67- selBone = slot.bone;
68- //context.transform(selBone.m00, selBone.m01, selBone.m10, selBone.m11, selBone.worldX, selBone.worldY);
69- context.translate(selBone.worldX, selBone.worldY);
70- context.scale(selBone.worldScaleX, selBone.worldScaleY);
71- console.log(selBone);
72- context.rotate(selBone.worldRotation);
73- context.drawImage(selTexture._htmlElementObj,
74- rendererObject.x, rendererObject.y, rendererObject.width, rendererObject.height,
75- //locX * scaleX, locY * scaleY, locWidth * scaleX, locHeight * scaleY);
76- 0, 0, rendererObject.width * scaleX, rendererObject.height * scaleY);
77-
78- }
79- context.restore();*/
80-
81- //draw skeleton sprite by it self
82- /* wrapper.save();
83- //set to armature mode (spine need same way to draw)
84- wrapper._switchToArmatureMode(true, this._worldTransform, scaleX, scaleY);
85- var sprites = this._skeletonSprites, slot, selSpriteCmd,attachment;
86- for (i = 0, n = sprites.length; i < n; i++) {
87- selSpriteCmd = sprites[i]._renderCmd;
88- if (sprites[i]._visible && selSpriteCmd && selSpriteCmd.rendering) {
89- selSpriteCmd.rendering(wrapper, scaleX, scaleY);
90- selSpriteCmd._dirtyFlag = 0;
91- }
92- }
93- wrapper._switchToArmatureMode(false);
94- wrapper.restore();*/
95-
96- //set to armature mode (spine need same way to draw)
97- var sprites = this . _skeletonSprites , slot , selSpriteCmd , attachment ;
98- for ( i = 0 , n = sprites . length ; i < n ; i ++ ) {
99- selSpriteCmd = sprites [ i ] . _renderCmd ;
100- if ( sprites [ i ] . _visible && selSpriteCmd && selSpriteCmd . rendering ) {
101- selSpriteCmd . transform ( this , false ) ;
102- selSpriteCmd . rendering ( wrapper , scaleX , scaleY ) ;
103- selSpriteCmd . _dirtyFlag = 0 ;
38+ var locSkeleton = node . _skeleton , drawOrder = locSkeleton . drawOrder ;
39+ for ( i = 0 , n = drawOrder . length ; i < n ; i ++ ) {
40+ slot = drawOrder [ i ] ;
41+ slotNode = slot . _slotNode ;
42+ if ( slotNode . _visible && slotNode . _renderCmd && slot . currentSprite ) {
43+ slotNode . _renderCmd . transform ( this , true ) ;
44+ slot . currentSprite . _renderCmd . rendering ( wrapper , scaleX , scaleY ) ;
45+ slotNode . _renderCmd . _dirtyFlag = slot . currentSprite . _renderCmd . _dirtyFlag = 0 ;
10446 }
10547 }
10648
10749 if ( ! node . _debugSlots && ! node . _debugBones )
10850 return ;
51+
10952 wrapper . setTransform ( this . _worldTransform , scaleX , scaleY ) ;
110- var drawingUtil = cc . _drawingUtil ;
53+ wrapper . setGlobalAlpha ( 1 ) ;
54+ var attachment , drawingUtil = cc . _drawingUtil ;
11155 if ( node . _debugSlots ) {
11256 // Slots.
11357 drawingUtil . setDrawColor ( 0 , 0 , 255 , 255 ) ;
11458 drawingUtil . setLineWidth ( 1 ) ;
11559
11660 var points = [ ] ;
117- var drawOrder = node . _skeleton . drawOrder ;
118- for ( i = 0 , n = drawOrder . length ; i < n ; i ++ ) {
119- //for (i = 0, n = locSkeleton.slots.length; i < n; i++) {
61+ for ( i = 0 , n = locSkeleton . slots . length ; i < n ; i ++ ) {
12062 slot = locSkeleton . drawOrder [ i ] ;
12163 if ( ! slot . attachment || slot . attachment . type != sp . ATTACHMENT_TYPE . REGION )
12264 continue ;
169111
170112 proto . _createChildFormSkeletonData = function ( ) {
171113 var node = this . _node ;
172- var locSkeleton = node . _skeleton , rendererObject , rect ;
173- for ( var i = 0 , n = locSkeleton . drawOrder . length ; i < n ; i ++ ) {
174- var slot = locSkeleton . drawOrder [ i ] ;
175- var attachment = slot . attachment ;
176- if ( ! ( attachment instanceof spine . RegionAttachment ) )
177- continue ;
178- rendererObject = attachment . rendererObject ;
179- rect = cc . rect ( rendererObject . x , rendererObject . y , rendererObject . width , rendererObject . height ) ;
180- var sprite = new cc . Sprite ( ) ;
181- sprite . initWithTexture ( rendererObject . page . _texture , rect , rendererObject . rotate , false ) ;
182- sprite . _rect . width = attachment . width ;
183- sprite . _rect . height = attachment . height ;
184- sprite . setContentSize ( attachment . width , attachment . height ) ;
185- sprite . setRotation ( - ( slot . bone . worldRotation + attachment . rotation ) ) ;
186- this . _skeletonSprites . push ( sprite ) ;
187- slot . currentSprite = sprite ;
114+ var locSkeleton = node . _skeleton , spriteName , sprite ;
115+ for ( var i = 0 , n = locSkeleton . slots . length ; i < n ; i ++ ) {
116+ var slot = locSkeleton . slots [ i ] , attachment = slot . attachment ;
117+ var slotNode = new cc . Node ( ) ;
118+ slot . _slotNode = slotNode ;
119+
120+ if ( attachment instanceof spine . RegionAttachment ) {
121+ spriteName = attachment . rendererObject . name ;
122+ sprite = this . _createSprite ( slot , attachment ) ;
123+ slot . currentSprite = sprite ;
124+ slot . currentSpriteName = spriteName ;
125+ slotNode . addChild ( sprite ) ;
126+ } else if ( attachment instanceof spine . MeshAttachment ) {
127+ //todo for mesh
128+ }
188129 }
189130 } ;
190131
132+ proto . _createSprite = function ( slot , attachment ) {
133+ var rendererObject = attachment . rendererObject ;
134+ var texture = rendererObject . page . _texture ;
135+ var rect = new cc . Rect ( rendererObject . x , rendererObject . y , rendererObject . width , rendererObject . height ) ;
136+ var sprite = new cc . Sprite ( ) ;
137+ sprite . initWithTexture ( rendererObject . page . _texture , rect , rendererObject . rotate , false ) ;
138+ sprite . _rect . width = attachment . width ;
139+ sprite . _rect . height = attachment . height ;
140+ sprite . setContentSize ( attachment . width , attachment . height ) ;
141+ sprite . setRotation ( - attachment . rotation ) ;
142+ sprite . setScale ( rendererObject . width / rendererObject . originalWidth * attachment . scaleX ,
143+ rendererObject . height / rendererObject . originalHeight * attachment . scaleY ) ;
144+
145+ slot . sprites = slot . sprites || { } ;
146+ slot . sprites [ rendererObject . name ] = sprite ;
147+
148+ return sprite ;
149+ } ;
150+
191151 proto . _updateChild = function ( ) {
192- var node = this . _node ;
193- var locSkeleton = node . _skeleton , locSkeletonSprites = this . _skeletonSprites ;
194- locSkeleton . updateWorldTransform ( ) ;
195- locSkeletonSprites . length = 0 ;
196- var drawOrder = node . _skeleton . drawOrder ;
197- for ( var i = 0 , n = drawOrder . length ; i < n ; i ++ ) {
198- var slot = drawOrder [ i ] ;
199- var attachment = slot . attachment , selSprite = slot . currentSprite ;
200- if ( ! ( attachment instanceof spine . RegionAttachment ) ) {
201- if ( selSprite )
202- selSprite . setVisible ( false ) ;
152+ var locSkeleton = this . _node . _skeleton , slots = locSkeleton . slots ;
153+ var i , n , selSprite ;
154+
155+ var slot , attachment , slotNode ;
156+ for ( i = 0 , n = slots . length ; i < n ; i ++ ) {
157+ slot = slots [ i ] ;
158+ attachment = slot . attachment ;
159+ slotNode = slot . _slotNode ;
160+ if ( ! attachment ) {
161+ slotNode . setVisible ( false ) ;
162+ continue ;
163+ }
164+ var type = attachment . type ;
165+ if ( type === spine . AttachmentType . region ) {
166+ if ( attachment . rendererObject ) {
167+ if ( ! slot . currentSpriteName || slot . currentSpriteName !== attachment . name ) {
168+ var spriteName = attachment . rendererObject . name ;
169+ if ( slot . currentSprite !== undefined )
170+ slot . currentSprite . setVisible ( false ) ;
171+ slot . sprites = slot . sprites || { } ;
172+ if ( slot . sprites [ spriteName ] !== undefined )
173+ slot . sprites [ spriteName ] . setVisible ( true ) ;
174+ else {
175+ var sprite = this . _createSprite ( slot , attachment ) ;
176+ slotNode . addChild ( sprite ) ;
177+ }
178+ slot . currentSprite = slot . sprites [ spriteName ] ;
179+ slot . currentSpriteName = spriteName ;
180+ }
181+ }
182+ var bone = slot . bone ;
183+ slotNode . setPosition ( bone . worldX + attachment . x * bone . m00 + attachment . y * bone . m01 ,
184+ bone . worldY + attachment . x * bone . m10 + attachment . y * bone . m11 ) ;
185+ slotNode . setScale ( bone . worldScaleX , bone . worldScaleY ) ;
186+
187+ //set the color and opacity
188+ selSprite = slot . currentSprite ;
189+ selSprite . _flippedX = bone . worldFlipX ;
190+ selSprite . _flippedY = bone . worldFlipY ;
191+ if ( selSprite . _flippedY || selSprite . _flippedX ) {
192+ slotNode . setRotation ( bone . worldRotation ) ;
193+ selSprite . setRotation ( attachment . rotation ) ;
194+ } else {
195+ slotNode . setRotation ( - bone . worldRotation ) ;
196+ selSprite . setRotation ( - attachment . rotation ) ;
197+ }
198+
199+ //hack for sprite
200+ selSprite . _renderCmd . _displayedOpacity = 0 | ( locSkeleton . a * slot . a * 255 ) ;
201+ var r = 0 | ( locSkeleton . r * slot . r * 255 ) , g = 0 | ( locSkeleton . g * slot . g * 255 ) , b = 0 | ( locSkeleton . b * slot . b * 255 ) ;
202+ selSprite . setColor ( cc . color ( r , g , b ) ) ;
203+ selSprite . _renderCmd . _updateColor ( ) ;
204+ } else if ( type === spine . AttachmentType . skinnedmesh ) {
205+ //todo for mesh
206+ } else {
207+ slotNode . setVisible ( false ) ;
203208 continue ;
204209 }
205- var rendererObject = attachment . rendererObject ;
206- var rect = cc . rect ( rendererObject . x , rendererObject . y , rendererObject . width , rendererObject . height ) ;
207- if ( ! selSprite ) {
208- var sprite = new cc . Sprite ( ) ;
209- locSkeletonSprites . push ( sprite ) ;
210- selSprite = slot . currentSprite = sprite ;
211- } else
212- locSkeletonSprites . push ( selSprite ) ;
213- selSprite . initWithTexture ( rendererObject . page . _texture , rect , rendererObject . rotate , false ) ;
214- selSprite . setContentSize ( attachment . width , attachment . height ) ;
215- selSprite . _rect . width = attachment . width ;
216- selSprite . _rect . height = attachment . height ;
217-
218- selSprite . setVisible ( true ) ;
219- //update color and blendFunc
220- selSprite . setBlendFunc ( cc . BLEND_SRC , slot . data . additiveBlending ? cc . ONE : cc . BLEND_DST ) ;
221-
222- var bone = slot . bone ;
223- selSprite . setPosition ( bone . worldX , bone . worldY ) ;
224- selSprite . setScale ( bone . worldScaleX , bone . worldScaleY ) ;
225- //selSprite.setRotation(-(slot.bone.worldRotation + attachment.rotation));
226- selSprite . setRotation ( - bone . worldRotation ) ;
227- selSprite . setOpacity ( 0 | ( node . _skeleton . a * slot . a * 255 ) ) ;
228- selSprite . setFlippedX ( bone . flipX ) ;
229- selSprite . setFlippedY ( bone . flipY ) ;
230- var r = 0 | ( node . _skeleton . r * slot . r * 255 ) ;
231- var g = 0 | ( node . _skeleton . g * slot . g * 255 ) ;
232- var b = 0 | ( node . _skeleton . b * slot . b * 255 ) ;
233- selSprite . setColor ( cc . color ( r , g , b ) ) ;
210+ slotNode . setVisible ( true ) ;
234211 }
235212 } ;
236213} ) ( ) ;
0 commit comments