Browse Source

[sfml] Added mix-and-match example. See #1375.

badlogic 6 years ago
parent
commit
76af7851dc

+ 4 - 4
spine-c/spine-c/src/spine/SkeletonBinary.c

@@ -832,16 +832,16 @@ spSkin* spSkeletonBinary_readSkin(spSkeletonBinary* self, _dataInput* input, int
 
 	if (!defaultSkin) {
 		for (i = 0, n = readVarint(input, 1); i < n; i++)
-			spBoneDataArray_add(skin->bones, spSkeletonData_findBone(skeletonData, readVarint(input, 1)));
+			spBoneDataArray_add(skin->bones, skeletonData->bones[readVarint(input, 1)]);
 
 		for (i = 0, n = readVarint(input, 1); i < n; i++)
-			spIkConstraintDataArray_add(skin->ikConstraints, spSkeletonData_findIkConstraint(skeletonData, readVarint(input, 1)));
+			spIkConstraintDataArray_add(skin->ikConstraints, skeletonData->ikConstraints[readVarint(input, 1)]);
 
 		for (i = 0, n = readVarint(input, 1); i < n; i++)
-			spTransformConstraintDataArray_add(skin->transformConstraints, spSkeletonData_findTransformConstraint(skeletonData, readVarint(input, 1)));
+			spTransformConstraintDataArray_add(skin->transformConstraints, skeletonData->transformConstraints[readVarint(input, 1)]);
 
 		for (i = 0, n = readVarint(input, 1); i < n; i++)
-			spPathConstraintDataArray_add(skin->pathConstraints, spSkeletonData_findPathConstraint(skeletonData, readVarint(input, 1)));
+			spPathConstraintDataArray_add(skin->pathConstraints, skeletonData->pathConstraints[readVarint(input, 1)]);
 	}
 
 	for (i = 0, n = readVarint(input, 1); i < n; ++i) {

+ 54 - 1
spine-sfml/c/example/main.cpp

@@ -487,8 +487,60 @@ void testSkinsApi(SkeletonData* skeletonData, Atlas* atlas) {
 	spSkin_dispose(skin);
 }
 
+void testMixAndMatch(SkeletonData* skeletonData, Atlas* atlas) {
+	SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData);
+	drawable->timeScale = 1;
+	drawable->setUsePremultipliedAlpha(true);
+
+	Skeleton* skeleton = drawable->skeleton;
+
+	// Create a new skin, by mixing and matching other skins
+	// that fit together. Items making up the girl are individual
+	// skins. Using the skin API, a new skin is created which is
+	// a combination of all these individual item skins.
+	spSkin* skin = spSkin_create("mix-and-match");
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "skin-base"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "nose/short"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "eyes/eyelids-girly"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "eyes/violet"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "hair/brown"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "clothes/hoodie-orange"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "legs/pants-jeans"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "accessories/bag"));
+	spSkin_addSkin(skin, spSkeletonData_findSkin(skeletonData, "accessories/hat-red-yellow"));
+	spSkeleton_setSkin(skeleton, skin);
+	spSkeleton_setSlotsToSetupPose(skeleton);
+
+	skeleton->x = 320;
+	skeleton->y = 590;
+	Skeleton_updateWorldTransform(skeleton);
+
+	AnimationState_setAnimationByName(drawable->state, 0, "dance", true);
+
+	sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - mix and match");
+	window.setFramerateLimit(60);
+	sf::Event event;
+	sf::Clock deltaClock;
+	while (window.isOpen()) {
+		while (window.pollEvent(event))
+			if (event.type == sf::Event::Closed) window.close();
+
+		float delta = deltaClock.getElapsedTime().asSeconds();
+		deltaClock.restart();
+
+		drawable->update(delta);
+
+		window.clear();
+		window.draw(*drawable);
+		window.display();
+	}
+
+	spSkin_clear(skin);
+	spSkin_dispose(skin);
+}
+
 int main () {
-	testcase(testSkinsApi, "data/goblins-pro.json", "data/goblins-pro.skel", "data/goblins-pma.atlas", 1.4f);
+	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);
@@ -499,5 +551,6 @@ int main () {
 	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);
 	return 0;
 }

+ 46 - 0
spine-sfml/cpp/example/main.cpp

@@ -450,6 +450,51 @@ void owl (SkeletonData* skeletonData, Atlas* atlas) {
 	}
 }
 
+void mixAndMatch (SkeletonData* skeletonData, Atlas* atlas) {
+	SkeletonDrawable drawable(skeletonData);
+	drawable.timeScale = 1;
+	drawable.setUsePremultipliedAlpha(true);
+
+	Skeleton* skeleton = drawable.skeleton;
+
+	Skin skin("mix-and-match");
+	skin.addSkin(skeletonData->findSkin("skin-base"));
+	skin.addSkin(skeletonData->findSkin("nose/short"));
+	skin.addSkin(skeletonData->findSkin("eyes/eyelids-girly"));
+	skin.addSkin(skeletonData->findSkin("eyes/violet"));
+	skin.addSkin(skeletonData->findSkin("hair/brown"));
+	skin.addSkin(skeletonData->findSkin("clothes/hoodie-orange"));
+	skin.addSkin(skeletonData->findSkin("legs/pants-jeans"));
+	skin.addSkin(skeletonData->findSkin("accessories/bag"));
+	skin.addSkin(skeletonData->findSkin("accessories/hat-red-yellow"));
+
+	skeleton->setSkin(&skin);
+	skeleton->setSlotsToSetupPose();
+
+	skeleton->setPosition(320, 590);
+	skeleton->updateWorldTransform();
+
+	drawable.state->setAnimation(0, "dance", true);
+
+	sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - goblins");
+	window.setFramerateLimit(60);
+	sf::Event event;
+	sf::Clock deltaClock;
+	while (window.isOpen()) {
+		while (window.pollEvent(event))
+			if (event.type == sf::Event::Closed) window.close();
+
+		float delta = deltaClock.getElapsedTime().asSeconds();
+		deltaClock.restart();
+
+		drawable.update(delta);
+
+		window.clear();
+		window.draw(drawable);
+		window.display();
+	}
+}
+
 /**
  * Used for debugging purposes during runtime development
  */
@@ -472,6 +517,7 @@ int main () {
 	DebugExtension dbgExtension(SpineExtension::getInstance());
 	SpineExtension::setInstance(&dbgExtension);
 
+	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);