diff --git a/CMakeLists.txt b/CMakeLists.txt index 4165403..19f1444 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ CPMAddPackage( URL https://git.redacted.cc/Redacted/ReWindow/archive/Prerelease-26.zip ) -#set(CMAKE_CXX_FLAGS "-O3 -Wall -Wextra") +set(CMAKE_CXX_FLAGS "-O3 -Wall -Wextra") file(GLOB_RECURSE HEADERS "include/*.h" "include/*.hpp") file(GLOB_RECURSE SOURCES "src/*.c" "src/*.cpp") diff --git a/include/Engine/types/entity/InstancedSprite.h b/include/Engine/types/entity/InstancedSprite.h index e1435f3..4fb7c1d 100644 --- a/include/Engine/types/entity/InstancedSprite.h +++ b/include/Engine/types/entity/InstancedSprite.h @@ -21,8 +21,9 @@ public: * If there is no instanced alpha mask and unique alpha mask is set * to nullptr, Then there is no alpha mask. - Redacted. */ + ~InstancedSprite() override; InstancedSprite(const Vector2& position, unsigned int layer, const std::string& instanced_texture_filesystem_path, float face_angle = 0.0f, const Color4& base_color = Colors::White, Texture* unique_alpha_mask = nullptr, const std::string& instanced_alpha_mask_filesystem_path = "") - : texture_path(instanced_texture_filesystem_path), alpha_mask_path(instanced_alpha_mask_filesystem_path), - Sprite(position, layer, face_angle, base_color, nullptr, unique_alpha_mask) {} + : Sprite(position, layer, face_angle, base_color, nullptr, unique_alpha_mask), texture_path(instanced_texture_filesystem_path), + alpha_mask_path(instanced_alpha_mask_filesystem_path) {} }; diff --git a/include/Engine/types/scene/Scene.h b/include/Engine/types/scene/Scene.h index 58ca8d4..e629bd5 100644 --- a/include/Engine/types/scene/Scene.h +++ b/include/Engine/types/scene/Scene.h @@ -34,8 +34,11 @@ public: [[nodiscard]] size_t EntityCount() const; [[nodiscard]] std::string GetName() const; [[nodiscard]] Camera* GetActiveCamera() const; - [[nodiscard]] Texture* GetInstancedTexture(const InstancedSprite* user); - [[nodiscard]] Texture* GetInstancedAlphaMask(const InstancedSprite* user); + [[nodiscard]] InstancedTexture* GetInstancedTexture(const InstancedSprite* user); + [[nodiscard]] InstancedTexture* GetInstancedAlphaMask(const InstancedSprite* user); + void DestroyInstancedTexture(const InstancedTexture* itx); + void DestroyInstancedAlphaMask(const InstancedTexture* alpha_mask); + public: void AppendEntity(Entity* entity); void AppendFixed(Fixed* fixed); diff --git a/include/Game/entity/Box.h b/include/Game/entity/Box.h index a947daf..6ea9cf8 100644 --- a/include/Game/entity/Box.h +++ b/include/Game/entity/Box.h @@ -1,17 +1,14 @@ #pragma once -#include -#include -#include +#include namespace Game { class Box; } -class Game::Box final : public Engine::Entity, public Engine::Renderable, public Engine::Movable { +class Game::Box final : public Engine::InstancedSprite { public: - void Render() final; void Update() final; public: - explicit Box(const Vector2& position, unsigned int depth = 0, float rotation = 0.0f) : Renderable(depth), Movable(position, rotation) {} + explicit Box(const Vector2& position, unsigned int depth = 0, float rad_rotation = 0.0f) : Engine::InstancedSprite(position, depth, "assets/sprites/Re3D.png", rad_rotation) {} }; \ No newline at end of file diff --git a/src/Engine/types/entity/InstancedSprite.cpp b/src/Engine/types/entity/InstancedSprite.cpp index 53e7faf..cb0d18d 100644 --- a/src/Engine/types/entity/InstancedSprite.cpp +++ b/src/Engine/types/entity/InstancedSprite.cpp @@ -3,11 +3,27 @@ using namespace Engine; Texture* InstancedSprite::GetTexture() { - return Globals::CurrentScene->GetInstancedTexture(this); + return Globals::CurrentScene->GetInstancedTexture(this)->GetTexture(); } Texture* InstancedSprite::GetAlphaMask() { if (Sprite::GetAlphaMask()) return Sprite::GetAlphaMask(); - return Globals::CurrentScene->GetInstancedAlphaMask(this); -} \ No newline at end of file + return Globals::CurrentScene->GetInstancedAlphaMask(this)->GetTexture(); +} + +InstancedSprite::~InstancedSprite() { + auto* itx = Globals::CurrentScene->GetInstancedTexture(this); + if (itx) { + itx->RemoveUser(this); + if (itx->ReferenceCount() == 0) + Globals::CurrentScene->DestroyInstancedTexture(itx); + } + + auto* ita = Globals::CurrentScene->GetInstancedAlphaMask(this); + if (ita) { + ita->RemoveUser(this); + if (ita->ReferenceCount() == 0) + Globals::CurrentScene->DestroyInstancedAlphaMask(ita); + } +} diff --git a/src/Engine/types/scene/Scene.cpp b/src/Engine/types/scene/Scene.cpp index 7869b9b..99309cc 100644 --- a/src/Engine/types/scene/Scene.cpp +++ b/src/Engine/types/scene/Scene.cpp @@ -76,6 +76,12 @@ Scene::~Scene() { for (auto* e : entity_list) delete e; + for (auto* itx : instanced_textures) + delete itx; + + for (auto* a : instanced_alpha_masks) + delete a; + delete heads_up_display; delete active_camera; } @@ -145,28 +151,40 @@ std::vector Scene::GetFlatEntityList(const std::vector& ent_li return result; } -Texture* Scene::GetInstancedTexture(const InstancedSprite* user) { +InstancedTexture* Scene::GetInstancedTexture(const InstancedSprite* user) { for (auto* itx : instanced_textures) if (itx->InUseBy(user)) - return itx->GetTexture(); + return itx; auto* t = new Texture(user->GetTextureFilesystemPath()); auto* itx = new InstancedTexture(t, user); instanced_textures.push_back(itx); - return t; + return itx; } -Texture* Scene::GetInstancedAlphaMask(const InstancedSprite* user) { +InstancedTexture* Scene::GetInstancedAlphaMask(const InstancedSprite* user) { for (auto* itx : instanced_alpha_masks) if (itx->InUseBy(user)) - return itx->GetTexture(); + return itx; if (!user->GetAlphaMaskFilesystemPath().empty()) { auto *t = new Texture(user->GetTextureFilesystemPath()); auto *itx = new InstancedTexture(t, user); instanced_textures.push_back(itx); - return t; + return itx; } return nullptr; } +void Scene::DestroyInstancedTexture(const InstancedTexture* itx) { + auto it = std::find(instanced_textures.begin(), instanced_textures.end(), itx); + if (it != instanced_textures.end()) + delete *it, instanced_textures.erase(it); +} + +void Scene::DestroyInstancedAlphaMask(const Engine::InstancedTexture* alpha_mask) { + auto it = std::find(instanced_alpha_masks.begin(), instanced_alpha_masks.end(), alpha_mask); + if (it != instanced_alpha_masks.end()) + delete *it, instanced_alpha_masks.erase(it); +} + diff --git a/src/Game/Entities/Box.cpp b/src/Game/Entities/Box.cpp index 3d72cf7..9ce0f93 100644 --- a/src/Game/Entities/Box.cpp +++ b/src/Game/Entities/Box.cpp @@ -2,10 +2,6 @@ #include #include -void Game::Box::Render() { - J2D::FillRect(Colors::Red, Vector2(position), {20, 20}); -} - void Game::Box::Update() { if (Globals::Window->IsKeyDown(Keys::W)) MoveY(-500);