[c] Fix frame and curve array initialization in timelines, add debugging methods.

This commit is contained in:
Mario Zechner 2021-05-31 15:58:18 +02:00
parent 315ad0e523
commit a71d73928d
5 changed files with 42 additions and 19 deletions

View File

@ -112,6 +112,7 @@ void _spTimeline_init (spTimeline* self,
) {
int i, n;
self->frames = spFloatArray_create(frameCount * frameEntries);
self->frames->size = frameCount * frameEntries;
self->frameCount = frameCount;
self->frameEntries = frameEntries;
self->vtable.dispose = dispose;
@ -120,6 +121,7 @@ void _spTimeline_init (spTimeline* self,
for (i = 0, n = propertyIdsCount; i < n; i++)
self->propertyIds[i] = propertyIds[i];
self->propertyIdsCount = propertyIdsCount;
}
void spTimeline_dispose (spTimeline* self) {
@ -139,7 +141,7 @@ void spTimeline_setBezier(spTimeline* self, int bezier, int frame, float value,
}
int spTimeline_getFrameCount (const spTimeline* self) {
return self->frameCount / self->frameEntries;
return self->frameCount;
}
float spTimeline_getDuration (const spTimeline* self) {
@ -166,6 +168,7 @@ void _spCurveTimeline_init (spCurveTimeline* self,
float cx2, float cy2, float time2, float value2)) {
_spTimeline_init(SUPER(self), frameCount, frameEntries, propertyIds, propertyIdsCount, dispose, apply, setBezier);
self->curves = spFloatArray_create(frameCount + bezierCount * BEZIER_SIZE);
self->curves->size = frameCount + bezierCount * BEZIER_SIZE;
}
void _spCurveTimeline_dispose (spTimeline* self) {

View File

@ -94,12 +94,12 @@ void testcase (void func(spSkeletonData* skeletonData, spAtlas* atlas),
const char* jsonName, const char* binaryName, const char* atlasName,
float scale) {
spAtlas* atlas = spAtlas_createFromFile(atlasName, 0);
spSkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas, scale);
UNUSED(jsonName);
/*spSkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas, scale);
func(skeletonData, atlas);
spSkeletonData_dispose(skeletonData);
spSkeletonData_dispose(skeletonData);*/
skeletonData = readSkeletonBinaryData(binaryName, atlas, scale);
spSkeletonData *skeletonData = readSkeletonBinaryData(binaryName, atlas, scale);
func(skeletonData, atlas);
spSkeletonData_dispose(skeletonData);
@ -289,8 +289,8 @@ void raptor (spSkeletonData* skeletonData, spAtlas* atlas) {
skeleton->y = 590;
spSkeleton_updateWorldTransform(skeleton);
spAnimationState_setAnimationByName(drawable->state, 0, "walk", true);
spAnimationState_addAnimationByName(drawable->state, 1, "gun-grab", false, 2);
spAnimationState_setAnimationByName(drawable->state, 0, "walk", true);
spAnimationState_addAnimationByName(drawable->state, 1, "gun-grab", false, 2);
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - raptor");
window.setFramerateLimit(60);
@ -438,7 +438,7 @@ void coin (spSkeletonData* skeletonData, spAtlas* atlas) {
float delta = deltaClock.getElapsedTime().asSeconds();
deltaClock.restart();
drawable->update(delta);
drawable->update(delta - delta);
window.clear();
window.draw(*drawable);
@ -625,17 +625,17 @@ void testMixAndMatch(spSkeletonData* skeletonData, spAtlas* atlas) {
}
int main () {
testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
testcase(testMixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl-pma.atlas", 0.5f);
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
// testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
// testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
testcase(testMixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 1.0f);
testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl-pma.atlas", 0.5f);
testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine-pma.atlas", 0.5f);
testcase(tank, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 0.2f);
testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor-pma.atlas", 0.5f);
testcase(stretchyman, "data/stretchyman-pro.json", "data/stretchyman-pro.skel", "data/stretchyman-pma.atlas", 0.6f);
// testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
return 0;
}

View File

@ -151,11 +151,21 @@ SkeletonDrawable::~SkeletonDrawable () {
spColorArray_dispose(tempColors);
}
void printSkeleton(spSkeleton* skeleton) {
int i, n;
printf("===== Skeleton\n");
for (i = 0, n = skeleton->bonesCount; i < n; i++) {
spBone *bone = skeleton->bones[i];
printf("%s: %f, %f, %f, %f, %f, %f\n", bone->data->name, bone->a, bone->b, bone->c, bone->d, bone->worldX, bone->worldY);
}
}
void SkeletonDrawable::update (float deltaTime) {
spSkeleton_update(skeleton, deltaTime);
spAnimationState_update(state, deltaTime * timeScale);
spAnimationState_apply(state, skeleton);
spSkeleton_updateWorldTransform(skeleton);
printSkeleton(skeleton);
}
void SkeletonDrawable::draw (RenderTarget& target, RenderStates states) const {

View File

@ -462,7 +462,7 @@ void coin (SkeletonData* skeletonData, Atlas* atlas) {
skeleton->setPosition(320, 320);
skeleton->updateWorldTransform();
drawable.state->setAnimation(0, "animation", true);
// drawable.state->setAnimation(0, "animation", true);
sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - coin");
window.setFramerateLimit(60);
@ -477,7 +477,7 @@ void coin (SkeletonData* skeletonData, Atlas* atlas) {
float delta = deltaClock.getElapsedTime().asSeconds();
deltaClock.restart();
drawable.update(delta);
drawable.update(delta - delta);
window.clear();
window.draw(drawable);
@ -615,13 +615,13 @@ DebugExtension dbgExtension(SpineExtension::getInstance());
int main () {
SpineExtension::setInstance(&dbgExtension);
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
testcase(ikDemo, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
testcase(mixAndMatch, "data/mix-and-match-pro.json", "data/mix-and-match-pro.skel", "data/mix-and-match-pma.atlas", 0.5f);
testcase(goblins, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl-pma.atlas", 0.5f);
testcase(spineboy, "data/spineboy-pro.json", "data/spineboy-pro.skel", "data/spineboy-pma.atlas", 0.6f);
testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor-pma.atlas", 0.5f);
testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin-pma.atlas", 0.5f);
testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine-pma.atlas", 0.5f);
testcase(tank, "data/tank-pro.json", "data/tank-pro.skel", "data/tank-pma.atlas", 0.2f);
testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor-pma.atlas", 0.5f);

View File

@ -77,11 +77,21 @@ SkeletonDrawable::~SkeletonDrawable() {
delete skeleton;
}
void printSkeleton(Skeleton* skeleton) {
int i, n;
printf("===== Skeleton\n");
for (i = 0, n = skeleton->getBones().size(); i < n; i++) {
Bone *bone = skeleton->getBones()[i];
printf("%s: %f, %f, %f, %f, %f, %f\n", bone->getData().getName().buffer(), bone->getA(), bone->getB(), bone->getC(), bone->getD(), bone->getWorldX(), bone->getWorldY());
}
}
void SkeletonDrawable::update(float deltaTime) {
skeleton->update(deltaTime);
state->update(deltaTime * timeScale);
state->apply(*skeleton);
skeleton->updateWorldTransform();
printSkeleton(skeleton);
}
void SkeletonDrawable::draw(RenderTarget &target, RenderStates states) const {