X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgameview%2Frenderer.cpp;h=068aa09221a6647021e51df8c3cfb5f6e095c72b;hb=76d859d1429782901799c9886f833cd331b670ce;hp=4bce48420ecd12cca0f48a0dd5d8daaa22a8c4eb;hpb=9dcf96c82741e2e1d02e2fbc6f6e465e51ac9690;p=libs%2Fgame.git diff --git a/source/gameview/renderer.cpp b/source/gameview/renderer.cpp index 4bce484..068aa09 100644 --- a/source/gameview/renderer.cpp +++ b/source/gameview/renderer.cpp @@ -1,8 +1,10 @@ #include "renderer.h" #include +#include #include #include #include +#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([this](auto &e){ entity_created(e); }); + event_observer.observe([this](auto &e){ entity_destroyed(e); }); event_observer.observe([this](auto &e){ camera_changed(e); }); + stage.iterate_objects([this](auto &e){ entity_created({ Game::Handle::from_object(&e) }); }); if(Game::Handle 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 mesh_source = event.entity->get_component(); + Game::Handle mesh_renderer = event.entity->get_component(); + if(mesh_source && !mesh_renderer) + { + auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity); + i = entities.emplace(i, event.entity, Game::Owned(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(); }