]> git.tdb.fi Git - libs/game.git/blobdiff - source/gameview/renderer.cpp
Add components for giving entities a visual appearance
[libs/game.git] / source / gameview / renderer.cpp
index 4bce48420ecd12cca0f48a0dd5d8daaa22a8c4eb..068aa09221a6647021e51df8c3cfb5f6e095c72b 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,8 +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); });
 
+       stage.iterate_objects<Game::Entity>([this](auto &e){ entity_created({ Game::Handle<Game::Entity>::from_object(&e) }); });
        if(Game::Handle<Game::Camera> ac = stage.get_active_camera())
                camera_changed({ ac });
 
@@ -24,6 +29,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 +86,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();
 }