2 #include <msp/game/entity.h>
3 #include <msp/game/meshsource.h>
4 #include <msp/game/stage.h>
5 #include <msp/game/transform.h>
6 #include <msp/gl/sequencebuilder.h>
7 #include "meshrenderer.h"
11 namespace Msp::GameView {
13 Renderer::Renderer(Game::Stage &s, GL::View &v):
16 event_observer(s.get_event_bus())
18 event_observer.observe<Game::Events::EntityCreated>([this](auto &e){ entity_created(e); });
19 event_observer.observe<Game::Events::EntityDestroyed>([this](auto &e){ entity_destroyed(e); });
20 event_observer.observe<Game::Events::CameraChanged>([this](auto &e){ camera_changed(e); });
22 stage.iterate_objects<Game::Entity>([this](auto &e){ entity_created({ Game::Handle<Game::Entity>::from_object(&e) }); });
23 if(Game::Handle<Game::Camera> ac = stage.get_active_camera())
24 camera_changed({ ac });
26 view.set_camera(&gl_camera);
32 void Renderer::entity_created(const Game::Events::EntityCreated &event)
34 Game::Handle<Game::MeshSource> mesh_source = event.entity->get_component<Game::MeshSource>();
35 Game::Handle<MeshRenderer> mesh_renderer = event.entity->get_component<MeshRenderer>();
36 if(mesh_source && !mesh_renderer)
38 auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity);
39 i = entities.emplace(i, event.entity, Game::Owned<MeshRenderer>(event.entity, mesh_source));
40 scene.add(i->mesh_renderer->get_instance());
44 void Renderer::entity_destroyed(const Game::Events::EntityDestroyed &event)
46 auto i = lower_bound_member(entities, event.entity, &RenderedEntity::entity);
47 if(i!=entities.end() && i->entity==event.entity)
49 scene.remove(i->mesh_renderer->get_instance());
54 void Renderer::camera_changed(const Game::Events::CameraChanged &event)
56 active_camera = event.camera;
59 const string &seq_name = event.camera->get_sequence_name();
60 if(seq_name!=current_seq_name)
62 current_seq_name = seq_name;
63 GL::SequenceBuilder bld(stage.get_resources().get<GL::SequenceTemplate>(seq_name));
64 bld.set_renderable("content", scene);
65 sequence.reset(bld.build(view));
66 view.set_content(sequence.get());
71 void Renderer::tick(Time::TimeDelta)
75 Game::Handle<Game::Transform> transform = active_camera->get_entity()->get_transform();
77 gl_camera.set_object_matrix(transform->get_world_matrix());
79 gl_camera.set_object_matrix(GL::Matrix());
80 if(active_camera->is_orthographic())
82 const LinAl::Vector<float, 2> &size = active_camera->get_size();
83 gl_camera.set_orthographic(size.x, size.y);
86 gl_camera.set_field_of_view(active_camera->get_fov_vertical());
87 gl_camera.set_depth_clip(active_camera->get_near_clip(), active_camera->get_far_clip());
90 for(const RenderedEntity &e: entities)
91 e.mesh_renderer->update_matrix();
96 } // namespace Msp::GameView