Make AnimationState TrackEntry create/dispose functions optional.

closes #218
This commit is contained in:
NathanSweet 2014-05-12 17:12:24 +02:00
parent 7199d22417
commit 36809166a2
4 changed files with 43 additions and 25 deletions

View File

@ -87,8 +87,6 @@ extern "C" {
void _spAtlasPage_createTexture (spAtlasPage* self, const char* path);
void _spAtlasPage_disposeTexture (spAtlasPage* self);
char* _spUtil_readFile (const char* path, int* length);
spTrackEntry* _spAnimationState_createTrackEntry (spAnimationState* self);
void _spAnimationState_disposeTrackEntry (spAnimationState* self, spTrackEntry* entry);
#ifdef SPINE_SHORT_NAMES
#define _AtlasPage_createTexture(...) _spAtlasPage_createTexture(__VA_ARGS__)
@ -112,6 +110,14 @@ char* _readFile (const char* path, int* length);
/**/
typedef struct {
spAnimationState super;
spEvent** events;
spTrackEntry* (*createTrackEntry) (spAnimationState* self);
void (*disposeTrackEntry) (spAnimationState* self, spTrackEntry* entry);
} _spAnimationState;
spTrackEntry* _spTrackEntry_create ();
void _spTrackEntry_dispose (spTrackEntry* entry);

View File

@ -47,12 +47,13 @@ void _spTrackEntry_dispose (spTrackEntry* entry) {
/**/
typedef struct {
spAnimationState super;
spEvent** events;
} _spAnimationState;
spTrackEntry* _spAnimationState_createTrackEntry (spAnimationState* self) {
return _spTrackEntry_create();
}
void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* entry);
void _spAnimationState_disposeTrackEntry (spAnimationState* self, spTrackEntry* entry) {
_spTrackEntry_dispose(entry);
}
spAnimationState* spAnimationState_create (spAnimationStateData* data) {
_spAnimationState* internal = NEW(_spAnimationState);
@ -60,13 +61,16 @@ spAnimationState* spAnimationState_create (spAnimationStateData* data) {
internal->events = MALLOC(spEvent*, 64);
self->timeScale = 1;
CONST_CAST(spAnimationStateData*, self->data) = data;
internal->createTrackEntry = _spAnimationState_createTrackEntry;
internal->disposeTrackEntry = _spAnimationState_disposeTrackEntry;
return self;
}
void _spAnimationState_disposeAllEntries (spAnimationState* self, spTrackEntry* entry) {
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
while (entry) {
spTrackEntry* next = entry->next;
_spAnimationState_disposeTrackEntry(self, entry);
internal->disposeTrackEntry(self, entry);
entry = next;
}
}
@ -81,6 +85,8 @@ void spAnimationState_dispose (spAnimationState* self) {
FREE(self);
}
void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* entry);
void spAnimationState_update (spAnimationState* self, float delta) {
int i;
float previousDelta;
@ -140,7 +146,7 @@ void spAnimationState_apply (spAnimationState* self, spSkeleton* skeleton) {
if (alpha >= 1) {
alpha = 1;
_spAnimationState_disposeTrackEntry(self, current->previous);
internal->disposeTrackEntry(self, current->previous);
current->previous = 0;
}
spAnimation_mix(current->animation, skeleton, current->lastTime, time,
@ -193,6 +199,8 @@ void spAnimationState_clearTracks (spAnimationState* self) {
}
void spAnimationState_clearTrack (spAnimationState* self, int trackIndex) {
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
spTrackEntry* current;
if (trackIndex >= self->trackCount) return;
current = self->tracks[trackIndex];
@ -203,7 +211,7 @@ void spAnimationState_clearTrack (spAnimationState* self, int trackIndex) {
self->tracks[trackIndex] = 0;
if (current->previous) _spAnimationState_disposeTrackEntry(self, current->previous);
if (current->previous) internal->disposeTrackEntry(self, current->previous);
_spAnimationState_disposeAllEntries(self, current);
}
@ -219,6 +227,8 @@ spTrackEntry* _spAnimationState_expandToIndex (spAnimationState* self, int index
}
void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEntry* entry) {
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
spTrackEntry* current = _spAnimationState_expandToIndex(self, index);
if (current) {
spTrackEntry* previous = current->previous;
@ -237,9 +247,9 @@ void _spAnimationState_setCurrent (spAnimationState* self, int index, spTrackEnt
} else
entry->previous = current;
} else
_spAnimationState_disposeTrackEntry(self, current);
internal->disposeTrackEntry(self, current);
if (previous) _spAnimationState_disposeTrackEntry(self, previous);
if (previous) internal->disposeTrackEntry(self, previous);
}
self->tracks[index] = entry;
@ -258,11 +268,13 @@ spTrackEntry* spAnimationState_setAnimationByName (spAnimationState* self, int t
}
spTrackEntry* spAnimationState_setAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop) {
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
spTrackEntry* entry;
spTrackEntry* current = _spAnimationState_expandToIndex(self, trackIndex);
if (current) _spAnimationState_disposeAllEntries(self, current->next);
entry = _spAnimationState_createTrackEntry(self);
entry = internal->createTrackEntry(self);
entry->animation = animation;
entry->loop = loop;
entry->endTime = animation->duration;
@ -278,9 +290,10 @@ spTrackEntry* spAnimationState_addAnimationByName (spAnimationState* self, int t
spTrackEntry* spAnimationState_addAnimation (spAnimationState* self, int trackIndex, spAnimation* animation, int/*bool*/loop,
float delay) {
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
spTrackEntry* last;
spTrackEntry* entry = _spAnimationState_createTrackEntry(self);
spTrackEntry* entry = internal->createTrackEntry(self);
entry->animation = animation;
entry->loop = loop;
entry->endTime = animation->duration;

View File

@ -40,14 +40,19 @@ using std::vector;
namespace spine {
static void animationCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
void animationCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
((SkeletonAnimation*)state->rendererObject)->onAnimationStateEvent(trackIndex, type, event, loopCount);
}
static void trackEntryCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
void trackEntryCallback (spAnimationState* state, int trackIndex, spEventType type, spEvent* event, int loopCount) {
((SkeletonAnimation*)state->rendererObject)->onTrackEntryEvent(trackIndex, type, event, loopCount);
}
void disposeTrackEntry (spAnimationState* self, spTrackEntry* entry) {
if (entry->rendererObject) FREE(entry->rendererObject);
_spTrackEntry_dispose(entry);
}
SkeletonAnimation* SkeletonAnimation::createWithData (spSkeletonData* skeletonData) {
SkeletonAnimation* node = new SkeletonAnimation(skeletonData);
node->autorelease();
@ -71,6 +76,9 @@ void SkeletonAnimation::initialize () {
state = spAnimationState_create(spAnimationStateData_create(skeleton->data));
state->rendererObject = this;
state->listener = animationCallback;
_spAnimationState* stateInternal = (_spAnimationState*)state;
stateInternal->disposeTrackEntry = disposeTrackEntry;
}
SkeletonAnimation::SkeletonAnimation (spSkeletonData *skeletonData)

View File

@ -55,15 +55,6 @@ char* _spUtil_readFile (const char* path, int* length) {
return bytes;
}
spTrackEntry* _spAnimationState_createTrackEntry (spAnimationState* self) {
return _spTrackEntry_create();
}
void _spAnimationState_disposeTrackEntry (spAnimationState* self, spTrackEntry* entry) {
if (entry->rendererObject) FREE(entry->rendererObject);
_spTrackEntry_dispose(entry);
}
/**/
namespace spine {