]> git.tdb.fi Git - libs/game.git/blobdiff - source/gameview/renderer.cpp
Provide a way to request events for existing entities and components
[libs/game.git] / source / gameview / renderer.cpp
index 4bce48420ecd12cca0f48a0dd5d8daaa22a8c4eb..ca4e8a91323af48ed16ba2fc2ef2ac0cab9c1e62 100644 (file)
@@ -1,8 +1,10 @@
 #include "renderer.h"
 #include <msp/game/entity.h>
+#include <msp/game/meshsource.h>
 #include <msp/game/stage.h>
 #include <msp/game/transform.h>
 #include <msp/gl/sequencebuilder.h>
+#include "meshrenderer.h"
 
 using namespace std;
 
@@ -13,10 +15,11 @@ Renderer::Renderer(Game::Stage &s, GL::View &v):
        view(v),
        event_observer(s.get_event_bus())
 {
+       event_observer.observe<Game::Events::EntityCreated>([this](auto &e){ entity_created(e); });
+       event_observer.observe<Game::Events::EntityDestroyed>([this](auto &e){ entity_destroyed(e); });
        event_observer.observe<Game::Events::CameraChanged>([this](auto &e){ camera_changed(e); });
 
-       if(Game::Handle<Game::Camera> ac = stage.get_active_camera())
-               camera_changed({ ac });
+       stage.synthesize_initial_events(event_observer);
 
        view.set_camera(&gl_camera);
 }
@@ -24,6 +27,28 @@ Renderer::Renderer(Game::Stage &s, GL::View &v):
 Renderer::~Renderer()
 { }
 
+void Renderer::entity_created(const Game::Events::EntityCreated &event)
+{
+       Game::Handle<Game::MeshSource> mesh_source = event.entity->get_component<Game::MeshSource>();
+       Game::Handle<MeshRenderer> mesh_renderer = event.entity->get_component<MeshRenderer>();
+       if(mesh_source && !mesh_renderer)
+       {
+               auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity);
+               i = entities.emplace(i, event.entity, Game::Owned<MeshRenderer>(event.entity, mesh_source));
+               scene.add(i->mesh_renderer->get_instance());
+       }
+}
+
+void Renderer::entity_destroyed(const Game::Events::EntityDestroyed &event)
+{
+       auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity);
+       if(i!=entities.end() && i->entity==event.entity)
+       {
+               scene.remove(i->mesh_renderer->get_instance());
+               entities.erase(i);
+       }
+}
+
 void Renderer::camera_changed(const Game::Events::CameraChanged &event)
 {
        active_camera = event.camera;
@@ -59,6 +84,10 @@ void Renderer::tick(Time::TimeDelta)
                        gl_camera.set_field_of_view(active_camera->get_fov_vertical());
                gl_camera.set_depth_clip(active_camera->get_near_clip(), active_camera->get_far_clip());
        }
+
+       for(const RenderedEntity &e: entities)
+               e.mesh_renderer->update_matrix();
+
        view.render();
 }