mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[c] Ported last few methods of AnimationState. Fixing up errors/warnings, testing
This commit is contained in:
parent
677eb60cec
commit
14ffdec885
@ -201,12 +201,13 @@ typedef struct _spAnimationState {
|
|||||||
spAnimationState super;
|
spAnimationState super;
|
||||||
|
|
||||||
int eventsCount;
|
int eventsCount;
|
||||||
int eventsCapacity;
|
|
||||||
spEvent** events;
|
spEvent** events;
|
||||||
|
|
||||||
_spEventQueue* queue;
|
_spEventQueue* queue;
|
||||||
|
|
||||||
void* propertyIDs;
|
int* propertyIDs;
|
||||||
|
int propertyIDsCount;
|
||||||
|
int propertyIDsCapacity;
|
||||||
|
|
||||||
int /*boolean*/ animationsChanged;
|
int /*boolean*/ animationsChanged;
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#include <spine/AnimationState.h>
|
#include <spine/AnimationState.h>
|
||||||
#include <spine/extension.h>
|
#include <spine/extension.h>
|
||||||
#include <string.h>
|
#include <limits.h>
|
||||||
|
|
||||||
static spAnimation* SP_EMPTY_ANIMATION = 0;
|
static spAnimation* SP_EMPTY_ANIMATION = 0;
|
||||||
|
|
||||||
@ -177,9 +177,11 @@ spAnimationState* spAnimationState_create (spAnimationStateData* data) {
|
|||||||
self->timeScale = 1;
|
self->timeScale = 1;
|
||||||
|
|
||||||
internal->queue = _spEventQueue_create(self);
|
internal->queue = _spEventQueue_create(self);
|
||||||
internal->events = CALLOC(spEvent*, 64);
|
internal->events = CALLOC(spEvent*, 128);
|
||||||
internal->eventsCapacity = 64;
|
|
||||||
// FIXME propertyIDs
|
internal->propertyIDs = CALLOC(int, 128);
|
||||||
|
internal->propertyIDsCapacity = 128;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,7 +304,7 @@ void spAnimationState_apply (spAnimationState* self, spSkeleton* skeleton) {
|
|||||||
spTimeline_apply(timelines[ii], skeleton, animationLast, animationTime, internal->events, internal->eventsCount, 1, 1, 0);
|
spTimeline_apply(timelines[ii], skeleton, animationLast, animationTime, internal->events, internal->eventsCount, 1, 1, 0);
|
||||||
} else {
|
} else {
|
||||||
firstFrame = current->timelinesRotationCount == 0;
|
firstFrame = current->timelinesRotationCount == 0;
|
||||||
if (firstFrame) current->timelinesRotation.setSize(timelineCount << 1);
|
if (firstFrame) _spAnimationState_resizeTimelinesRotation(current, timelineCount << 1);
|
||||||
timelinesRotation = current->timelinesRotation;
|
timelinesRotation = current->timelinesRotation;
|
||||||
|
|
||||||
timelinesFirst = current->timelinesFirst;
|
timelinesFirst = current->timelinesFirst;
|
||||||
@ -361,7 +363,7 @@ float _spAnimationState_applyMixingFrom (spAnimationState* self, spTrackEntry* e
|
|||||||
alpha = from->alpha * entry->mixAlpha * (1 - mix);
|
alpha = from->alpha * entry->mixAlpha * (1 - mix);
|
||||||
|
|
||||||
firstFrame = from->timelinesRotationCount == 0;
|
firstFrame = from->timelinesRotationCount == 0;
|
||||||
if (firstFrame) from->timelinesRotation.setSize(timelineCount << 1);
|
if (firstFrame) _spAnimationState_resizeTimelinesRotation(from, timelineCount << 1);
|
||||||
timelinesRotation = from->timelinesRotation;
|
timelinesRotation = from->timelinesRotation;
|
||||||
|
|
||||||
for (int i = 0; i < timelineCount; i++) {
|
for (int i = 0; i < timelineCount; i++) {
|
||||||
@ -574,7 +576,7 @@ spTrackEntry* spAnimationState_setAnimation (spAnimationState* self, int trackIn
|
|||||||
} else
|
} else
|
||||||
_spAnimationState_disposeNext(self, current);
|
_spAnimationState_disposeNext(self, current);
|
||||||
}
|
}
|
||||||
entry = _spAnimationstate_trackEntry(self, trackIndex, animation, loop, current);
|
entry = _spAnimationState_trackEntry(self, trackIndex, animation, loop, current);
|
||||||
_spAnimationState_setCurrent(self, trackIndex, entry);
|
_spAnimationState_setCurrent(self, trackIndex, entry);
|
||||||
_spEventQueue_drain(internal->queue);
|
_spEventQueue_drain(internal->queue);
|
||||||
return entry;
|
return entry;
|
||||||
@ -677,7 +679,7 @@ spTrackEntry* _spAnimationState_trackEntry (spAnimationState* self, int trackInd
|
|||||||
entry->trackTime = 0;
|
entry->trackTime = 0;
|
||||||
entry->trackLast = -1;
|
entry->trackLast = -1;
|
||||||
entry->nextTrackLast = -1;
|
entry->nextTrackLast = -1;
|
||||||
entry->trackEnd = loop ? Integer.MAX_VALUE : entry->animationEnd;
|
entry->trackEnd = loop ? (float)INT_MAX : entry->animationEnd;
|
||||||
entry->timeScale = 1;
|
entry->timeScale = 1;
|
||||||
|
|
||||||
entry->alpha = 1;
|
entry->alpha = 1;
|
||||||
@ -697,6 +699,109 @@ void _spAnimationState_disposeNext (spAnimationState* self, spTrackEntry* entry)
|
|||||||
entry->next = 0;
|
entry->next = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _spAnimationState_animationsChanged (spAnimationState* self) {
|
||||||
|
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||||
|
int i, n;
|
||||||
|
spTrackEntry* entry;
|
||||||
|
internal->animationsChanged = 0;
|
||||||
|
|
||||||
|
i = 0; n = self->tracksCount;
|
||||||
|
internal->propertyIDsCount = 0;
|
||||||
|
|
||||||
|
for (; i < n; i++) {
|
||||||
|
entry = self->tracks[i];
|
||||||
|
if (!entry) continue;
|
||||||
|
_spAnimationState_setTimelinesFirst(self, entry);
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (; i < n; i++) {
|
||||||
|
entry = self->tracks[i];
|
||||||
|
if (entry) _spAnimationState_checkTimelinesFirst(self, entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float* _spAnimationState_resizeTimelinesRotation(spTrackEntry* entry, int newSize) {
|
||||||
|
if (entry->timelinesRotation != newSize) {
|
||||||
|
float* newTimelinesRotation = CALLOC(float, newSize);
|
||||||
|
FREE(entry->timelinesRotation);
|
||||||
|
entry->timelinesRotation = newTimelinesRotation;
|
||||||
|
entry->timelinesRotationCount = newSize;
|
||||||
|
}
|
||||||
|
return entry->timelinesRotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
int* _spAnimationState_resizeTimelinesFirst(spTrackEntry* entry, int newSize) {
|
||||||
|
if (entry->timelinesFirstCount != newSize) {
|
||||||
|
int* newTimelinesFirst = CALLOC(int, newSize);
|
||||||
|
FREE(entry->timelinesFirst);
|
||||||
|
entry->timelinesFirst = newTimelinesFirst;
|
||||||
|
entry->timelinesFirstCount = newSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry->timelinesFirst;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _spAnimationState_ensureCapacityPropertyIDs(spAnimationState* self, int capacity) {
|
||||||
|
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||||
|
if (internal->propertyIDsCapacity < capacity) {
|
||||||
|
int *newPropertyIDs = CALLOC(int, capacity << 1);
|
||||||
|
memcpy(newPropertyIDs, internal->propertyIDs, internal->propertyIDsCount);
|
||||||
|
FREE(internal->propertyIDs);
|
||||||
|
internal->propertyIDs = newPropertyIDs;
|
||||||
|
internal->propertyIDsCapacity = capacity << 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _spAnimationState_addPropertyID(spAnimationState* self, int id) {
|
||||||
|
int i, n;
|
||||||
|
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||||
|
|
||||||
|
for (i = 0, n = internal->propertyIDsCount; i < n; i++) {
|
||||||
|
if (internal->propertyIDs[i] == id) return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_spAnimationState_ensureCapacityPropertyIDs(self, internal->propertyIDsCount + 1);
|
||||||
|
internal->propertyIDs[internal->propertyIDsCount] = id;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _spAnimationState_setTimelinesFirst (spAnimationState* self, spTrackEntry* entry) {
|
||||||
|
int i, n;
|
||||||
|
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||||
|
int *propertyIDs = internal->propertyIDs;
|
||||||
|
spTimeline** timelines;
|
||||||
|
|
||||||
|
if (entry->mixingFrom) {
|
||||||
|
_spAnimationState_setTimelinesFirst(self, entry->mixingFrom);
|
||||||
|
_spAnimationState_checkTimelinesUsage(self, entry);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = entry->animation->timelinesCount;
|
||||||
|
timelines = entry->animation->timelines;
|
||||||
|
int* usage = _spAnimationState_resizeTimelinesFirst(entry, n);
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
_spAnimationState_addPropertyID(self, spTimeline_getPropertyId(timelines[i]));
|
||||||
|
usage[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _spAnimationState_checkTimelinesFirst (spAnimationState* self, spTrackEntry* entry) {
|
||||||
|
if (entry->mixingFrom) _spAnimationState_checkTimelinesFirst(self, entry->mixingFrom);
|
||||||
|
_spAnimationState_checkTimelinesUsage(self, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _spAnimationState_checkTimelinesUsage (spAnimationState* self, spTrackEntry* entry) {
|
||||||
|
int i, n;
|
||||||
|
_spAnimationState* internal = SUB_CAST(_spAnimationState, self);
|
||||||
|
n = entry->animation->timelinesCount;
|
||||||
|
spTimeline** timelines = entry->animation->timelines;
|
||||||
|
int* usage = _spAnimationState_resizeTimelinesFirst(entry, n);
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
usage[i] = _spAnimationState_addPropertyID(self, spTimeline_getPropertyId(timelines[i]));
|
||||||
|
}
|
||||||
|
|
||||||
spTrackEntry* spAnimationState_getCurrent (spAnimationState* self, int trackIndex) {
|
spTrackEntry* spAnimationState_getCurrent (spAnimationState* self, int trackIndex) {
|
||||||
if (trackIndex >= self->tracksCount) return 0;
|
if (trackIndex >= self->tracksCount) return 0;
|
||||||
return self->tracks[trackIndex];
|
return self->tracks[trackIndex];
|
||||||
@ -711,7 +816,7 @@ float spTrackEntry_getAnimationTime (spTrackEntry* entry) {
|
|||||||
if (entry->loop) {
|
if (entry->loop) {
|
||||||
float duration = entry->animationEnd - entry->animationStart;
|
float duration = entry->animationEnd - entry->animationStart;
|
||||||
if (duration == 0) return entry->animationStart;
|
if (duration == 0) return entry->animationStart;
|
||||||
return (FMOD(entry->trackTime, duration) + entry->animationStart;
|
return FMOD(entry->trackTime, duration) + entry->animationStart;
|
||||||
}
|
}
|
||||||
return MIN(entry->trackTime + entry->animationStart, entry->animationEnd);
|
return MIN(entry->trackTime + entry->animationStart, entry->animationEnd);
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user