Skip to content

Commit 6da998a

Browse files
committed
Fixed cocos2d#2806: fixed a bug of cc.SkeletonAnimation that its canvas renderCmd doesn't work
1 parent 9ed0478 commit 6da998a

File tree

6 files changed

+108
-142
lines changed

6 files changed

+108
-142
lines changed

extensions/spine/CCSkeleton.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ sp.Skeleton = cc.Node.extend(/** @lends sp.Skeleton# */{
105105
*/
106106
init: function () {
107107
cc.Node.prototype.init.call(this);
108-
this.setOpacityModifyRGB(true);
108+
//this.setOpacityModifyRGB(true);
109109
this._blendFunc.src = cc.ONE;
110110
this._blendFunc.dst = cc.ONE_MINUS_SRC_ALPHA;
111111
this.scheduleUpdate();
@@ -345,6 +345,7 @@ sp.Skeleton = cc.Node.extend(/** @lends sp.Skeleton# */{
345345
this.setContentSize(skeletonData.width / cc.director.getContentScaleFactor(), skeletonData.height / cc.director.getContentScaleFactor());
346346

347347
this._skeleton = new spine.Skeleton(skeletonData);
348+
this._skeleton.updateWorldTransform();
348349
this._rootBone = this._skeleton.getRootBone();
349350
this._ownsSkeletonData = ownsSkeletonData;
350351

@@ -390,7 +391,6 @@ sp.Skeleton = cc.Node.extend(/** @lends sp.Skeleton# */{
390391
*/
391392
update: function (dt) {
392393
this._skeleton.update(dt);
393-
this._renderCmd._updateChild();
394394
}
395395
});
396396

extensions/spine/CCSkeletonAnimation.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ sp.SkeletonAnimation = sp.Skeleton.extend(/** @lends sp.SkeletonAnimation# */{
222222
this._state.update(dt);
223223
this._state.apply(this._skeleton);
224224
this._skeleton.updateWorldTransform();
225+
this._renderCmd._updateChild();
225226
},
226227

227228
/**

extensions/spine/CCSkeletonCanvasRenderCmd.js

Lines changed: 104 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -26,97 +26,39 @@
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;
@@ -169,68 +111,103 @@
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
})();

template/project.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"showFPS" : true,
55
"frameRate" : 60,
66
"id" : "gameCanvas",
7-
"renderMode" : 1,
7+
"renderMode" : 0,
88
"engineDir":"../",
99

1010
"modules" : ["cocos2d", "extensions"],

template/src/myApp.js

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@ var MyLayer = cc.Layer.extend({
4444
this.sprite.setPosition(size.width / 2, size.height / 2);
4545
this.sprite.setScale(size.height / this.sprite.getContentSize().height);
4646
this.addChild(this.sprite, 0);
47-
48-
var spineBoy = new sp.SkeletonAnimation('skeleton.json', 'skeleton.atlas');
49-
spineBoy.setPosition(cc.p(size.width / 2, size.height / 2 - 150));
50-
this.addChild(spineBoy, 10);
51-
spineBoy.setAnimation(0, 'attack5', true);
52-
spineBoy.setTimeScale(0.1);
53-
//spineBoy.setDebugBonesEnabled(true);
54-
spineBoy.setDebugSlotsEnabled(true);
55-
window.spineBoy = spineBoy;
5647
}
5748
});
5849

template/src/resource.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ var g_resources = [
66
//image
77
s_HelloWorld,
88
s_CloseNormal,
9-
"skeleton.png",
10-
"skeleton.atlas",
11-
"skeleton.json",
129
s_CloseSelected
1310

1411
//plist

0 commit comments

Comments
 (0)