Parcourir la source

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

Mario Zechner il y a 4 ans
Parent
commit
a71d73928d

+ 4 - 1
spine-c/spine-c/src/spine/Animation.c

@@ -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) {

+ 15 - 15
spine-sfml/c/example/main.cpp

@@ -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;
 }

+ 10 - 0
spine-sfml/c/src/spine/spine-sfml.cpp

@@ -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 {

+ 3 - 3
spine-sfml/cpp/example/main.cpp

@@ -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);

+ 10 - 0
spine-sfml/cpp/src/spine/spine-sfml.cpp

@@ -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 {