X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgameview%2Frenderer.cpp;h=ca4e8a91323af48ed16ba2fc2ef2ac0cab9c1e62;hb=fce6e7846814e54de9d38000d2f5e2295ee2119e;hp=4bce48420ecd12cca0f48a0dd5d8daaa22a8c4eb;hpb=f298027c2042b63cec903c98dfc97e792a4f923f;p=libs%2Fgame.git diff --git a/source/gameview/renderer.cpp b/source/gameview/renderer.cpp index 4bce484..ca4e8a9 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,10 +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); }); - if(Game::Handle 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 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 +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(); }