Skip to content

Commit 65e7ee4

Browse files
committed
Merge pull request cocos2d#2772 from dingpinglv/Iss2760_Spine
Issue cocos2d#2760: update some spine skeleton APIs, but it doesn't support Mesh.
2 parents a88060f + 3c71278 commit 65e7ee4

File tree

4 files changed

+216
-64
lines changed

4 files changed

+216
-64
lines changed

extensions/spine/CCSkeleton.js

+43-7
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,15 @@ sp.VERTEX_INDEX = {
4848
};
4949

5050
/**
51-
* The attachment type of spine. It contains three type: REGION(0), BOUNDING_BOX(1), REGION_SEQUENCE(2) and MESH(2).
51+
* The attachment type of spine. It contains three type: REGION(0), BOUNDING_BOX(1), MESH(2) and SKINNED_MESH.
5252
* @constant
5353
* @type {{REGION: number, BOUNDING_BOX: number, REGION_SEQUENCE: number, MESH: number}}
5454
*/
5555
sp.ATTACHMENT_TYPE = {
5656
REGION: 0,
5757
BOUNDING_BOX: 1,
58-
REGION_SEQUENCE: 2,
59-
MESH: 2
58+
MESH: 2,
59+
SKINNED_MESH:3
6060
};
6161

6262
/**
@@ -112,7 +112,7 @@ sp.Skeleton = cc.Node.extend(/** @lends sp.Skeleton# */{
112112
},
113113

114114
/**
115-
* Sets whether open debug solots.
115+
* Sets whether open debug slots.
116116
* @param {boolean} enable true to open, false to close.
117117
*/
118118
setDebugSolots:function(enable){
@@ -127,12 +127,48 @@ sp.Skeleton = cc.Node.extend(/** @lends sp.Skeleton# */{
127127
this._debugBones = enable;
128128
},
129129

130+
/**
131+
* Sets whether open debug slots.
132+
* @param {boolean} enabled true to open, false to close.
133+
*/
134+
setDebugSlotsEnabled: function(enabled) {
135+
this._debugSlots = enabled;
136+
},
137+
138+
/**
139+
* Gets whether open debug slots.
140+
* @returns {boolean} true to open, false to close.
141+
*/
142+
getDebugSlotsEnabled: function() {
143+
return this._debugSlots;
144+
},
145+
146+
/**
147+
* Sets whether open debug bones.
148+
* @param {boolean} enabled
149+
*/
150+
setDebugBonesEnabled: function(enabled) {
151+
this._debugBones = enabled;
152+
},
153+
154+
/**
155+
* Gets whether open debug bones.
156+
* @returns {boolean} true to open, false to close.
157+
*/
158+
getDebugBonesEnabled: function() {
159+
return this._debugBones;
160+
},
161+
130162
/**
131163
* Sets the time scale of sp.Skeleton.
132-
* @param {Number} v
164+
* @param {Number} scale
133165
*/
134-
setTimeScale:function(v){
135-
this._timeScale = v;
166+
setTimeScale:function(scale){
167+
this._timeScale = scale;
168+
},
169+
170+
getTimeScale: function(){
171+
return this._timeScale;
136172
},
137173

138174
/**

extensions/spine/CCSkeletonAnimation.js

+121-3
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ sp._regionAttachment_updateQuad = function(self, slot, quad, premultipliedAlpha)
119119

120120
sp._meshAttachment_updateQuad = function(self, slot, quad, premultipliedAlpha) {
121121
var vertices = {};
122-
self.computeVertices(slot.bone.x, slot.bone.y, slot.bone, vertices);
122+
self.computeWorldVertices(slot.bone.x, slot.bone.y, slot, vertices);
123123
var r = slot.bone.skeleton.r * slot.r * 255;
124124
var g = slot.bone.skeleton.g * slot.g * 255;
125125
var b = slot.bone.skeleton.b * slot.b * 255;
@@ -182,6 +182,25 @@ sp.ANIMATION_EVENT_TYPE = {
182182
EVENT: 3
183183
};
184184

185+
sp.TrackEntryListeners = function(startListener, endListener, completeListener, eventListener){
186+
this.startListener = startListener || null;
187+
this.endListener = endListener || null;
188+
this.completeListener = completeListener || null;
189+
this.eventListener = eventListener || null;
190+
};
191+
192+
sp.TrackEntryListeners.getListeners = function(entry){
193+
if(!entry.rendererObject){
194+
entry.rendererObject = new sp.TrackEntryListeners();
195+
entry.listener = sp.trackEntryCallback;
196+
}
197+
return entry.rendererObject;
198+
};
199+
200+
sp.trackEntryCallback = function(state, trackIndex, type, event, loopCount) {
201+
state.rendererObject.onTrackEntryEvent(trackIndex, type, event, loopCount);
202+
};
203+
185204
/**
186205
* The skeleton animation of spine. It updates animation's state and skeleton's world transform.
187206
* @class
@@ -195,12 +214,19 @@ sp.SkeletonAnimation = sp.Skeleton.extend(/** @lends sp.SkeletonAnimation# */{
195214
_target: null,
196215
_callback: null,
197216

217+
_ownsAnimationStateData: false,
218+
_startListener: null,
219+
_endListener: null,
220+
_completeListener: null,
221+
_eventListener: null,
222+
198223
/**
199224
* Initializes a sp.SkeletonAnimation. please do not call this function by yourself, you should pass the parameters to constructor to initialize it.
200225
* @override
201226
*/
202227
init: function () {
203228
sp.Skeleton.prototype.init.call(this);
229+
this._ownsAnimationStateData = true;
204230
this.setAnimationStateData(new spine.AnimationStateData(this._skeleton.data));
205231
},
206232

@@ -210,6 +236,7 @@ sp.SkeletonAnimation = sp.Skeleton.extend(/** @lends sp.SkeletonAnimation# */{
210236
*/
211237
setAnimationStateData: function (stateData) {
212238
var state = new spine.AnimationState(stateData);
239+
state.rendererObject = this;
213240
state.onStart = this._onAnimationStateStart.bind(this);
214241
state.onComplete = this._onAnimationStateComplete.bind(this);
215242
state.onEnd = this._onAnimationStateEnd.bind(this);
@@ -258,10 +285,11 @@ sp.SkeletonAnimation = sp.Skeleton.extend(/** @lends sp.SkeletonAnimation# */{
258285
* @param {Number} trackIndex
259286
* @param {String} name
260287
* @param {Boolean} loop
261-
* @param {Number} delay
288+
* @param {Number} [delay=0]
262289
* @returns {spine.TrackEntry|null}
263290
*/
264291
addAnimation: function (trackIndex, name, loop, delay) {
292+
delay = delay == null ? 0 : delay;
265293
var animation = this._skeleton.data.findAnimation(name);
266294
if (!animation) {
267295
cc.log("Spine: Animation not found:" + name);
@@ -302,13 +330,102 @@ sp.SkeletonAnimation = sp.Skeleton.extend(/** @lends sp.SkeletonAnimation# */{
302330
*/
303331
update: function (dt) {
304332
this._super(dt);
305-
306333
dt *= this._timeScale;
307334
this._state.update(dt);
308335
this._state.apply(this._skeleton);
309336
this._skeleton.updateWorldTransform();
310337
},
311338

339+
/**
340+
* Set the start event listener.
341+
* @param {function} listener
342+
*/
343+
setStartListener: function(listener){
344+
this._startListener = listener;
345+
},
346+
347+
/**
348+
* Set the end event listener.
349+
* @param {function} listener
350+
*/
351+
setEndListener: function(listener) {
352+
this._endListener = listener;
353+
},
354+
355+
setCompleteListener: function(listener) {
356+
this._completeListener = listener;
357+
},
358+
359+
setEventListener: function(listener){
360+
this._eventListener = listener;
361+
},
362+
363+
setTrackStartListener: function(entry, listener){
364+
sp.TrackEntryListeners.getListeners(entry).startListener = listener;
365+
},
366+
367+
setTrackEndListener: function(entry, listener){
368+
sp.TrackEntryListeners.getListeners(entry).endListener = listener;
369+
},
370+
371+
setTrackCompleteListener: function(entry, listener){
372+
sp.TrackEntryListeners.getListeners(entry).completeListener = listener;
373+
},
374+
375+
setTrackEventListener: function(entry, listener){
376+
sp.TrackEntryListeners.getListeners(entry).eventListener = listener;
377+
},
378+
379+
onTrackEntryEvent: function(traceIndex, type, event, loopCount){
380+
var entry = this._state.getCurrent(traceIndex);
381+
if(!entry.rendererObject)
382+
return;
383+
var listeners = entry.rendererObject;
384+
switch (type){
385+
case sp.ANIMATION_EVENT_TYPE.START:
386+
if(listeners.startListener)
387+
listeners.startListener(traceIndex);
388+
break;
389+
case sp.ANIMATION_EVENT_TYPE.END:
390+
if(listeners.endListener)
391+
listeners.endListener(traceIndex);
392+
break;
393+
case sp.ANIMATION_EVENT_TYPE.COMPLETE:
394+
if(listeners.completeListener)
395+
listeners.completeListener(traceIndex, loopCount);
396+
break;
397+
case sp.ANIMATION_EVENT_TYPE.EVENT:
398+
if(listeners.eventListener)
399+
listeners.eventListener(traceIndex, event);
400+
break;
401+
}
402+
},
403+
404+
onAnimationStateEvent: function(trackIndex, type, event, loopCount) {
405+
switch(type){
406+
case sp.ANIMATION_EVENT_TYPE.START:
407+
if(this._startListener)
408+
this._startListener(trackIndex);
409+
break;
410+
case sp.ANIMATION_EVENT_TYPE.END:
411+
if(this._endListener)
412+
this._endListener(trackIndex);
413+
break;
414+
case sp.ANIMATION_EVENT_TYPE.COMPLETE:
415+
if(this._completeListener)
416+
this._completeListener(trackIndex, loopCount);
417+
break;
418+
case sp.ANIMATION_EVENT_TYPE.EVENT:
419+
if(this._eventListener)
420+
this._eventListener(trackIndex, event);
421+
break;
422+
}
423+
},
424+
425+
getState: function(){
426+
return this._state;
427+
},
428+
312429
_onAnimationStateStart: function (trackIndex) {
313430
this._animationStateCallback(trackIndex, sp.ANIMATION_EVENT_TYPE.START, null, 0);
314431
},
@@ -322,6 +439,7 @@ sp.SkeletonAnimation = sp.Skeleton.extend(/** @lends sp.SkeletonAnimation# */{
322439
this._animationStateCallback(trackIndex, sp.ANIMATION_EVENT_TYPE.EVENT, event, 0);
323440
},
324441
_animationStateCallback: function (trackIndex, type, event, loopCount) {
442+
this.onAnimationStateEvent(trackIndex, type, event, loopCount);
325443
if (this._target && this._callback) {
326444
this._callback.call(this._target, this, trackIndex, type, event, loopCount)
327445
}

extensions/spine/CCSkeletonWebGLRenderCmd.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@
8282

8383
switch(slot.attachment.type) {
8484
case sp.ATTACHMENT_TYPE.REGION:
85-
sp._regionAttachment_updateQuad(attachment, slot, quad, node._premultipliedAlpha);
86-
break;
85+
sp._regionAttachment_updateQuad(attachment, slot, quad, node._premultipliedAlpha);
86+
break;
8787
case sp.ATTACHMENT_TYPE.MESH:
88-
sp._meshAttachment_updateQuad(attachment, slot, quad, node._premultipliedAlpha);
89-
break;
88+
sp._meshAttachment_updateQuad(attachment, slot, quad, node._premultipliedAlpha);
89+
break;
90+
case sp.ATTACHMENT_TYPE.SKINNED_MESH:
91+
break;
9092
}
9193

9294
textureAtlas.updateQuad(quad, quadCount);
@@ -98,9 +100,8 @@
98100
}
99101

100102
if (node._debugBones || node._debugSlots) {
101-
102103
cc.kmGLMatrixMode(cc.KM_GL_MODELVIEW);
103-
//cc.kmGLPushMatrixWitMat4(node._stackMatrix);
104+
//cc.kmGLPushMatrixWitMat4(this._stackMatrix);
104105
cc.current_stack.stack.push(cc.current_stack.top);
105106
cc.current_stack.top = this._stackMatrix;
106107

0 commit comments

Comments
 (0)