diff --git a/spine-c/spine-c/src/spine/SkeletonBinary.c b/spine-c/spine-c/src/spine/SkeletonBinary.c index 0825ac19c..9ee15d847 100644 --- a/spine-c/spine-c/src/spine/SkeletonBinary.c +++ b/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) { diff --git a/spine-sfml/c/example/main.cpp b/spine-sfml/c/example/main.cpp index 6d32d0a32..3c6d2f8f9 100644 --- a/spine-sfml/c/example/main.cpp +++ b/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; } diff --git a/spine-sfml/cpp/example/main.cpp b/spine-sfml/cpp/example/main.cpp index bc710e496..e37172402 100644 --- a/spine-sfml/cpp/example/main.cpp +++ b/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);