From d3c8ccbfc116ccf59325e4963d9d1f63a2abd76d Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Mon, 1 Jul 2024 15:48:34 +0200 Subject: [PATCH] [sdl] Better leak detection in example --- spine-sdl/example/main.cpp | 110 +++++++++++++++++--------------- spine-sdl/src/spine-sdl-cpp.cpp | 14 ++-- 2 files changed, 68 insertions(+), 56 deletions(-) diff --git a/spine-sdl/example/main.cpp b/spine-sdl/example/main.cpp index 42e7bcf31..2c0f70533 100644 --- a/spine-sdl/example/main.cpp +++ b/spine-sdl/example/main.cpp @@ -29,64 +29,74 @@ #include #include +#include #undef main +spine::DebugExtension dbgExtension(spine::SpineExtension::getInstance()); +extern spine::SkeletonRenderer *skeletonRenderer; -int main(int argc, char **argv) { - if (SDL_Init(SDL_INIT_VIDEO)) { - printf("Error: %s", SDL_GetError()); - return -1; - } - SDL_Window *window = SDL_CreateWindow("Spine SDL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, 0); - if (!window) { - printf("Error: %s", SDL_GetError()); - return -1; - } - SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (!renderer) { - printf("Error: %s", SDL_GetError()); - return -1; - } +int main() { + spine::SpineExtension::setInstance(&dbgExtension); + { + if (SDL_Init(SDL_INIT_VIDEO)) { + printf("Error: %s", SDL_GetError()); + return -1; + } + SDL_Window *window = SDL_CreateWindow("Spine SDL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, + 0); + if (!window) { + printf("Error: %s", SDL_GetError()); + return -1; + } + SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + if (!renderer) { + printf("Error: %s", SDL_GetError()); + return -1; + } - spine::SDLTextureLoader textureLoader(renderer); - spine::Atlas atlas("data/spineboy-pma.atlas", &textureLoader); - spine::AtlasAttachmentLoader attachmentLoader(&atlas); - spine::SkeletonJson json(&attachmentLoader); - json.setScale(0.5f); - spine::SkeletonData *skeletonData = json.readSkeletonDataFile("data/spineboy-pro.json"); - spine::SkeletonDrawable drawable(skeletonData); - drawable.usePremultipliedAlpha = true; - drawable.animationState->getData()->setDefaultMix(0.2f); - drawable.skeleton->setPosition(400, 500); - drawable.skeleton->setToSetupPose(); - drawable.animationState->setAnimation(0, "portal", true); - drawable.animationState->addAnimation(0, "run", true, 0); - drawable.update(0, spine::Physics_Update); + spine::SDLTextureLoader textureLoader(renderer); + spine::Atlas atlas("data/spineboy-pma.atlas", &textureLoader); + spine::AtlasAttachmentLoader attachmentLoader(&atlas); + spine::SkeletonJson json(&attachmentLoader); + json.setScale(0.5f); + spine::SkeletonData *skeletonData = json.readSkeletonDataFile("data/spineboy-pro.json"); + spine::SkeletonDrawable drawable(skeletonData); + drawable.usePremultipliedAlpha = true; + drawable.animationState->getData()->setDefaultMix(0.2f); + drawable.skeleton->setPosition(400, 500); + drawable.skeleton->setToSetupPose(); + drawable.animationState->setAnimation(0, "portal", true); + drawable.animationState->addAnimation(0, "run", true, 0); + drawable.update(0, spine::Physics_Update); - bool quit = false; - uint64_t lastFrameTime = SDL_GetPerformanceCounter(); - while (!quit) { - SDL_Event event; - while (SDL_PollEvent(&event) != 0) { - if (event.type == SDL_QUIT) { - quit = true; - break; - } - } + bool quit = false; + uint64_t lastFrameTime = SDL_GetPerformanceCounter(); + while (!quit) { + SDL_Event event; + while (SDL_PollEvent(&event) != 0) { + if (event.type == SDL_QUIT) { + quit = true; + break; + } + } - SDL_SetRenderDrawColor(renderer, 94, 93, 96, 255); - SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, 94, 93, 96, 255); + SDL_RenderClear(renderer); - uint64_t now = SDL_GetPerformanceCounter(); - double deltaTime = (now - lastFrameTime) / (double) SDL_GetPerformanceFrequency(); - lastFrameTime = now; + uint64_t now = SDL_GetPerformanceCounter(); + double deltaTime = (now - lastFrameTime) / (double) SDL_GetPerformanceFrequency(); + lastFrameTime = now; - drawable.update(deltaTime, spine::Physics_Update); - drawable.draw(renderer); + drawable.update(deltaTime, spine::Physics_Update); + drawable.draw(renderer); - SDL_RenderPresent(renderer); - } + SDL_RenderPresent(renderer); + } - SDL_DestroyWindow(window); - SDL_Quit(); + SDL_DestroyWindow(window); + SDL_Quit(); + delete skeletonData; + } + delete skeletonRenderer; + dbgExtension.reportLeaks(); return 0; } diff --git a/spine-sdl/src/spine-sdl-cpp.cpp b/spine-sdl/src/spine-sdl-cpp.cpp index 62924568a..fc34c9196 100644 --- a/spine-sdl/src/spine-sdl-cpp.cpp +++ b/spine-sdl/src/spine-sdl-cpp.cpp @@ -33,10 +33,11 @@ #define STB_IMAGE_IMPLEMENTATION #include +#include using namespace spine; -SkeletonRenderer skeletonRenderer; +SkeletonRenderer *skeletonRenderer = nullptr; SkeletonDrawable::SkeletonDrawable(SkeletonData *skeletonData, AnimationStateData *animationStateData) { Bone::setYDown(true); @@ -61,14 +62,15 @@ void SkeletonDrawable::update(float delta, Physics physics) { } inline void toSDLColor(uint32_t color, SDL_Color *sdlColor) { - sdlColor->r = (color >> 24) & 0xFF; - sdlColor->g = (color >> 16) & 0xFF; - sdlColor->b = (color >> 8) & 0xFF; - sdlColor->a = color & 0xFF; + sdlColor->a = (color >> 24) & 0xFF; + sdlColor->r = (color >> 16) & 0xFF; + sdlColor->g = (color >> 8) & 0xFF; + sdlColor->b = color & 0xFF; } void SkeletonDrawable::draw(SDL_Renderer *renderer) { - RenderCommand *command = skeletonRenderer.render(*skeleton); + if (!skeletonRenderer) skeletonRenderer = new (__FILE__, __LINE__) SkeletonRenderer(); + RenderCommand *command = skeletonRenderer->render(*skeleton); while(command) { float *positions = command->positions; float *uvs = command->uvs;