From f9c25b7c401c44b0d4d5de95d4ad01fd5cda8583 Mon Sep 17 00:00:00 2001 From: badlogic Date: Wed, 27 Jun 2018 14:55:35 +0200 Subject: [PATCH] Updated SFML example to use unique_prts and stack allocation where possible. --- .../include/spine/HasRendererObject.h | 2 +- spine-sfml/cpp/CMakeLists.txt | 2 +- spine-sfml/cpp/example/main.cpp | 186 ++++++++---------- spine-sfml/cpp/src/spine/spine-sfml.cpp | 4 +- 4 files changed, 86 insertions(+), 108 deletions(-) diff --git a/spine-cpp/spine-cpp/include/spine/HasRendererObject.h b/spine-cpp/spine-cpp/include/spine/HasRendererObject.h index b636cf987..4096313ec 100644 --- a/spine-cpp/spine-cpp/include/spine/HasRendererObject.h +++ b/spine-cpp/spine-cpp/include/spine/HasRendererObject.h @@ -40,7 +40,7 @@ public: explicit HasRendererObject() : _rendererObject(NULL) {}; virtual ~HasRendererObject() { - if (_dispose) + if (_dispose && _rendererObject) _dispose(_rendererObject); } diff --git a/spine-sfml/cpp/CMakeLists.txt b/spine-sfml/cpp/CMakeLists.txt index 3095ea4d9..f3052e87c 100644 --- a/spine-sfml/cpp/CMakeLists.txt +++ b/spine-sfml/cpp/CMakeLists.txt @@ -49,7 +49,7 @@ if(MSVC) set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS") else() set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic -std=c89") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wnon-virtual-dtor -pedantic -std=c++03 -fno-exceptions -fno-rtti") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wnon-virtual-dtor -pedantic -std=c++11 -fno-exceptions -fno-rtti") endif() # Define spine-sfml-cpp library diff --git a/spine-sfml/cpp/example/main.cpp b/spine-sfml/cpp/example/main.cpp index 166d47628..ecb3b7a8d 100644 --- a/spine-sfml/cpp/example/main.cpp +++ b/spine-sfml/cpp/example/main.cpp @@ -35,8 +35,12 @@ using namespace std; using namespace spine; -#include -#include +#include + +template +std::unique_ptr make_unique(Args&&... args) { + return std::unique_ptr(new T(std::forward(args)...)); +} void callback (AnimationState* state, EventType type, TrackEntry* entry, Event* event) { const String& animationName = (entry && entry->getAnimation()) ? entry->getAnimation()->getName() : String(""); @@ -77,15 +81,13 @@ SkeletonData* readSkeletonJsonData (const String& filename, Atlas* atlas, float } SkeletonData* readSkeletonBinaryData (const char* filename, Atlas* atlas, float scale) { - SkeletonBinary* binary = new (__FILE__, __LINE__) SkeletonBinary(atlas); - binary->setScale(scale); - SkeletonData *skeletonData = binary->readSkeletonDataFile(filename); + SkeletonBinary binary(atlas); + binary.setScale(scale); + SkeletonData *skeletonData = binary.readSkeletonDataFile(filename); if (!skeletonData) { - printf("%s\n", binary->getError().buffer()); - delete binary; + printf("%s\n", binary.getError().buffer()); exit(0); } - delete binary; return skeletonData; } @@ -93,17 +95,13 @@ void testcase (void func(SkeletonData* skeletonData, Atlas* atlas), const char* jsonName, const char* binaryName, const char* atlasName, float scale) { SFMLTextureLoader textureLoader; - Atlas* atlas = new (__FILE__, __LINE__) Atlas(atlasName, &textureLoader); + auto atlas = make_unique(atlasName, &textureLoader); - SkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas, scale); - func(skeletonData, atlas); - delete skeletonData; + auto skeletonData = unique_ptr(readSkeletonJsonData(jsonName, atlas.get(), scale)); + func(skeletonData.get(), atlas.get()); - skeletonData = readSkeletonBinaryData(binaryName, atlas, scale); - func(skeletonData, atlas); - delete skeletonData; - - delete atlas; + skeletonData = unique_ptr(readSkeletonBinaryData(binaryName, atlas.get(), scale)); + func(skeletonData.get(), atlas.get()); } void spineboy (SkeletonData* skeletonData, Atlas* atlas) { @@ -114,10 +112,10 @@ void spineboy (SkeletonData* skeletonData, Atlas* atlas) { stateData.setMix("walk", "jump", 0.2f); stateData.setMix("jump", "run", 0.2f); - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData, &stateData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData, &stateData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setFlipX(false); skeleton->setFlipY(false); skeleton->setToSetupPose(); @@ -127,10 +125,10 @@ void spineboy (SkeletonData* skeletonData, Atlas* atlas) { Slot* headSlot = skeleton->findSlot("head"); - drawable->state->setListener(callback); - drawable->state->addAnimation(0, "walk", true, 0); - drawable->state->addAnimation(0, "jump", false, 3); - drawable->state->addAnimation(0, "run", true, 0); + drawable.state->setListener(callback); + drawable.state->addAnimation(0, "walk", true, 0); + drawable.state->addAnimation(0, "jump", false, 3); + drawable.state->addAnimation(0, "run", true, 0); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - spineboy"); window.setFramerateLimit(60); @@ -153,21 +151,19 @@ void spineboy (SkeletonData* skeletonData, Atlas* atlas) { headSlot->getColor().b = 1; } - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void goblins (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setFlipX(false); skeleton->setFlipY(false); skeleton->setSkin("goblin"); @@ -176,7 +172,7 @@ void goblins (SkeletonData* skeletonData, Atlas* atlas) { skeleton->setPosition(320, 590); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "walk", true); + drawable.state->setAnimation(0, "walk", true); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - goblins"); window.setFramerateLimit(60); @@ -189,32 +185,30 @@ void goblins (SkeletonData* skeletonData, Atlas* atlas) { float delta = deltaClock.getElapsedTime().asSeconds(); deltaClock.restart(); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void raptor (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; PowInterpolation pow2(2); PowOutInterpolation powOut2(2); SwirlVertexEffect effect(400, powOut2); effect.setCenterY(-200); - drawable->vertexEffect = &effect; + drawable.vertexEffect = &effect; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setPosition(320, 590); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "walk", true); - drawable->state->addAnimation(1, "gun-grab", false, 2); + drawable.state->setAnimation(0, "walk", true); + drawable.state->addAnimation(1, "gun-grab", false, 2); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - raptor"); window.setFramerateLimit(60); @@ -233,25 +227,23 @@ void raptor (SkeletonData* skeletonData, Atlas* atlas) { if (percent > 1) percent = 1 - (percent - 1); effect.setAngle(pow2.interpolate(-60.0f, 60.0f, percent)); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void tank (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setPosition(500, 590); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "drive", true); + drawable.state->setAnimation(0, "drive", true); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - tank"); window.setFramerateLimit(60); @@ -264,24 +256,22 @@ void tank (SkeletonData* skeletonData, Atlas* atlas) { float delta = deltaClock.getElapsedTime().asSeconds(); deltaClock.restart(); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void vine (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setPosition(320, 590); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "grow", true); + drawable.state->setAnimation(0, "grow", true); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - vine"); window.setFramerateLimit(60); @@ -294,28 +284,26 @@ void vine (SkeletonData* skeletonData, Atlas* atlas) { float delta = deltaClock.getElapsedTime().asSeconds(); deltaClock.restart(); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void stretchyman (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setFlipX(false); skeleton->setFlipY(false); skeleton->setPosition(100, 590); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "sneak", true); + drawable.state->setAnimation(0, "sneak", true); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - Streatchyman"); window.setFramerateLimit(60); @@ -328,26 +316,24 @@ void stretchyman (SkeletonData* skeletonData, Atlas* atlas) { float delta = deltaClock.getElapsedTime().asSeconds(); deltaClock.restart(); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void coin (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setPosition(320, 590); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "rotate", true); - drawable->update(1); + drawable.state->setAnimation(0, "rotate", true); + drawable.update(1); sf::RenderWindow window(sf::VideoMode(640, 640), "Spine SFML - coin"); window.setFramerateLimit(60); @@ -364,30 +350,28 @@ void coin (SkeletonData* skeletonData, Atlas* atlas) { // float delta = deltaClock.getElapsedTime().asSeconds(); // deltaClock.restart(); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } void owl (SkeletonData* skeletonData, Atlas* atlas) { - SkeletonDrawable* drawable = new SkeletonDrawable(skeletonData); - drawable->timeScale = 1; + SkeletonDrawable drawable(skeletonData); + drawable.timeScale = 1; - Skeleton* skeleton = drawable->skeleton; + Skeleton* skeleton = drawable.skeleton; skeleton->setPosition(320, 400); skeleton->updateWorldTransform(); - drawable->state->setAnimation(0, "idle", true); - drawable->state->setAnimation(1, "blink", true); - TrackEntry* left = drawable->state->setAnimation(2, "left", true); - TrackEntry* right = drawable->state->setAnimation(3, "right", true); - TrackEntry* up = drawable->state->setAnimation(4, "up", true); - TrackEntry* down = drawable->state->setAnimation(5, "down", true); + drawable.state->setAnimation(0, "idle", true); + drawable.state->setAnimation(1, "blink", true); + TrackEntry* left = drawable.state->setAnimation(2, "left", true); + TrackEntry* right = drawable.state->setAnimation(3, "right", true); + TrackEntry* up = drawable.state->setAnimation(4, "up", true); + TrackEntry* down = drawable.state->setAnimation(5, "down", true); left->setAlpha(0); left->setMixBlend(MixBlend_Add); @@ -419,36 +403,30 @@ void owl (SkeletonData* skeletonData, Atlas* atlas) { float delta = deltaClock.getElapsedTime().asSeconds(); deltaClock.restart(); - drawable->update(delta); + drawable.update(delta); window.clear(); - window.draw(*drawable); + window.draw(drawable); window.display(); } - - delete drawable; } /** * Used for debugging purposes during runtime development */ void test (SkeletonData* skeletonData, Atlas* atlas) { - Skeleton* skeleton = new (__FILE__, __LINE__) Skeleton(skeletonData); - AnimationStateData* animData = new (__FILE__, __LINE__) AnimationStateData(skeletonData); - AnimationState* animState = new (__FILE__, __LINE__) AnimationState(animData); - animState->setAnimation(0, "drive", true); + Skeleton skeleton(skeletonData); + AnimationStateData animationStateData(skeletonData); + AnimationState animationState(&animationStateData); + animationState.setAnimation(0, "drive", true); float d = 3; for (int i = 0; i < 1; i++) { - animState->update(d); - animState->apply(*skeleton); - skeleton->updateWorldTransform(); + animationState.update(d); + animationState.apply(skeleton); + skeleton.updateWorldTransform(); d += 0.1f; } - - delete skeleton; - delete animData; - delete animState; } int main () { @@ -456,10 +434,10 @@ int main () { SpineExtension::setInstance(&dbgExtension); testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor.atlas", 0.5f); + testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin.atlas", 0.5f); testcase(test, "data/tank-pro.json", "data/tank-pro.skel", "data/tank.atlas", 1.0f); testcase(spineboy, "data/spineboy-ess.json", "data/spineboy-ess.skel", "data/spineboy.atlas", 0.6f); testcase(owl, "data/owl-pro.json", "data/owl-pro.skel", "data/owl.atlas", 0.5f); - testcase(coin, "data/coin-pro.json", "data/coin-pro.skel", "data/coin.atlas", 0.5f); testcase(vine, "data/vine-pro.json", "data/vine-pro.skel", "data/vine.atlas", 0.5f); testcase(tank, "data/tank-pro.json", "data/tank-pro.skel", "data/tank.atlas", 0.2f); testcase(raptor, "data/raptor-pro.json", "data/raptor-pro.skel", "data/raptor.atlas", 0.5f); diff --git a/spine-sfml/cpp/src/spine/spine-sfml.cpp b/spine-sfml/cpp/src/spine/spine-sfml.cpp index 68bf67d7e..39d372ea5 100644 --- a/spine-sfml/cpp/src/spine/spine-sfml.cpp +++ b/spine-sfml/cpp/src/spine/spine-sfml.cpp @@ -278,7 +278,7 @@ void SFMLTextureLoader::unload(void *texture) { deleteTexture(texture); } -/*SpineExtension *getDefaultExtension() { +SpineExtension *getDefaultExtension() { return new DefaultSpineExtension(); -}*/ +} }