#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;
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 });
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;
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();
}