]> git.tdb.fi Git - libs/game.git/commitdiff
Track destruction of individual components in Renderer
authorMikko Rasa <tdb@tdb.fi>
Mon, 15 May 2023 20:38:04 +0000 (23:38 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 15 May 2023 20:42:44 +0000 (23:42 +0300)
source/gameview/renderer.cpp
source/gameview/renderer.h

index f9dae4b3c7e51c90855148dc7f415944d7a24697..8a4c416f2da53017fe1b9d2948d07c737862a2c8 100644 (file)
@@ -25,7 +25,7 @@ Renderer::Renderer(Game::Stage &s, GL::View &v):
        declare_dependency<MeshRenderer>(WRITE);
 
        event_observer.observe<Game::Events::ComponentCreated>([this](auto &e){ component_created(e); });
-       event_observer.observe<Game::Events::EntityDestroyed>([this](auto &e){ entity_destroyed(e); });
+       event_observer.observe<Game::Events::ComponentDestroyed>([this](auto &e){ component_destroyed(e); });
        event_observer.observe<Game::Events::CameraChanged>([this](auto &e){ camera_changed(e); });
 
        stage.synthesize_initial_events(event_observer);
@@ -77,11 +77,17 @@ Renderer::RenderedEntity &Renderer::get_rendered_entity(Game::Handle<Game::Entit
        return *entities.emplace(i, entity);
 }
 
-void Renderer::entity_destroyed(const Game::Events::EntityDestroyed &event)
+void Renderer::component_destroyed(const Game::Events::ComponentDestroyed &event)
 {
-       auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity);
-       if(i!=entities.end() && i->entity==event.entity)
-               entities.erase(i);
+       Game::Handle<Game::Entity> entity = event.component->get_entity();
+       auto i = lower_bound_member(entities, entity, &RenderedEntity::entity);
+       if(i!=entities.end() && i->entity==entity)
+       {
+               if(dynamic_handle_cast<Game::MeshSource>(event.component))
+                       i->mesh_renderer = nullptr;
+               if(dynamic_handle_cast<Game::Light>(event.component))
+                       i->light_emitter = nullptr;
+       }
 }
 
 void Renderer::camera_changed(const Game::Events::CameraChanged &event)
index 23ea5b4a247276b304792663768d41feac3ba1ad..3b39945a19e4005e981664736181c3e8045971b6 100644 (file)
@@ -47,7 +47,7 @@ public:
 private:
        void component_created(const Game::Events::ComponentCreated &);
        RenderedEntity &get_rendered_entity(Game::Handle<Game::Entity>);
-       void entity_destroyed(const Game::Events::EntityDestroyed &);
+       void component_destroyed(const Game::Events::ComponentDestroyed &);
        void camera_changed(const Game::Events::CameraChanged &);
 
 public: