diff --git a/engine/inc/renderer/3d/pipeline/renderer_3d_pipeline.hpp b/engine/inc/renderer/3d/pipeline/renderer_3d_pipeline.hpp index d447c71..998a5cb 100644 --- a/engine/inc/renderer/3d/pipeline/renderer_3d_pipeline.hpp +++ b/engine/inc/renderer/3d/pipeline/renderer_3d_pipeline.hpp @@ -16,12 +16,13 @@ namespace Tyra { class Renderer3DPipeline { public: - Renderer3DPipeline() {} + Renderer3DPipeline() { onDestroy = nullptr; } ~Renderer3DPipeline() {} virtual void setRenderer(RendererCore* core) = 0; virtual void onUse() = 0; virtual void onUseEnd() = 0; + std::function onDestroy; }; } // namespace Tyra diff --git a/engine/inc/renderer/3d/renderer_3d.hpp b/engine/inc/renderer/3d/renderer_3d.hpp index 70d4401..9460b77 100644 --- a/engine/inc/renderer/3d/renderer_3d.hpp +++ b/engine/inc/renderer/3d/renderer_3d.hpp @@ -19,10 +19,12 @@ class Renderer3D { Renderer3D(); ~Renderer3D(); + /** Deinitialize previous pipeline and initialize new pipeline */ void usePipeline(Renderer3DPipeline* pipeline); private: Renderer3DPipeline* currentPipeline; + void onDestroy(Renderer3DPipeline* pipeline); }; } // namespace Tyra diff --git a/engine/src/renderer/3d/pipeline/dynamic/dynamic_pipeline.cpp b/engine/src/renderer/3d/pipeline/dynamic/dynamic_pipeline.cpp index 1ec4de8..a38532b 100644 --- a/engine/src/renderer/3d/pipeline/dynamic/dynamic_pipeline.cpp +++ b/engine/src/renderer/3d/pipeline/dynamic/dynamic_pipeline.cpp @@ -17,7 +17,9 @@ const u32 DynamicPipeline::halfBuffersCount = buffersCount / 2; DynamicPipeline::DynamicPipeline() {} -DynamicPipeline::~DynamicPipeline() {} +DynamicPipeline::~DynamicPipeline() { + if (onDestroy) onDestroy(this); +} void DynamicPipeline::setRenderer(RendererCore* t_core) { rendererCore = t_core; diff --git a/engine/src/renderer/3d/pipeline/minecraft/minecraft_pipeline.cpp b/engine/src/renderer/3d/pipeline/minecraft/minecraft_pipeline.cpp index 49ab140..6f791ff 100644 --- a/engine/src/renderer/3d/pipeline/minecraft/minecraft_pipeline.cpp +++ b/engine/src/renderer/3d/pipeline/minecraft/minecraft_pipeline.cpp @@ -21,6 +21,7 @@ MinecraftPipeline::MinecraftPipeline() { } MinecraftPipeline::~MinecraftPipeline() { + if (onDestroy) onDestroy(this); if (bbox) { delete bbox; } diff --git a/engine/src/renderer/3d/pipeline/static/static_pipeline.cpp b/engine/src/renderer/3d/pipeline/static/static_pipeline.cpp index 34b93e6..9fd57af 100644 --- a/engine/src/renderer/3d/pipeline/static/static_pipeline.cpp +++ b/engine/src/renderer/3d/pipeline/static/static_pipeline.cpp @@ -15,7 +15,9 @@ namespace Tyra { StaticPipeline::StaticPipeline() {} -StaticPipeline::~StaticPipeline() {} +StaticPipeline::~StaticPipeline() { + if (onDestroy) onDestroy(this); +} void StaticPipeline::setRenderer(RendererCore* t_core) { rendererCore = t_core; diff --git a/engine/src/renderer/3d/renderer_3d.cpp b/engine/src/renderer/3d/renderer_3d.cpp index 061df60..e8e50f5 100644 --- a/engine/src/renderer/3d/renderer_3d.cpp +++ b/engine/src/renderer/3d/renderer_3d.cpp @@ -21,8 +21,17 @@ void Renderer3D::usePipeline(Renderer3DPipeline* pipeline) { if (currentPipeline != pipeline) { if (currentPipeline) currentPipeline->onUseEnd(); currentPipeline = pipeline; + currentPipeline->onDestroy = + std::bind(&Renderer3D::onDestroy, this, std::placeholders::_1); currentPipeline->onUse(); } } +void Renderer3D::onDestroy(Renderer3DPipeline* pipeline) { + if (currentPipeline == pipeline) { + currentPipeline->onUseEnd(); + currentPipeline = nullptr; + } +} + } // namespace Tyra