--- /dev/null
+#include "renderer.h"
+#include <msp/game/entity.h>
+#include <msp/game/stage.h>
+#include <msp/game/transform.h>
+#include <msp/gl/sequencebuilder.h>
+
+using namespace std;
+
+namespace Msp::GameView {
+
+Renderer::Renderer(Game::Stage &s, GL::View &v):
+ System(s),
+ view(v),
+ event_observer(s.get_event_bus())
+{
+ event_observer.observe<Game::Events::CameraChanged>([this](auto &e){ camera_changed(e); });
+
+ if(Game::Handle<Game::Camera> ac = stage.get_active_camera())
+ camera_changed({ ac });
+
+ view.set_camera(&gl_camera);
+}
+
+Renderer::~Renderer()
+{ }
+
+void Renderer::camera_changed(const Game::Events::CameraChanged &event)
+{
+ active_camera = event.camera;
+ if(event.camera)
+ {
+ const string &seq_name = event.camera->get_sequence_name();
+ if(seq_name!=current_seq_name)
+ {
+ current_seq_name = seq_name;
+ GL::SequenceBuilder bld(stage.get_resources().get<GL::SequenceTemplate>(seq_name));
+ bld.set_renderable("content", scene);
+ sequence.reset(bld.build(view));
+ view.set_content(sequence.get());
+ }
+ }
+}
+
+void Renderer::tick(Time::TimeDelta)
+{
+ if(active_camera)
+ {
+ Game::Handle<Game::Transform> transform = active_camera->get_entity()->get_transform();
+ if(transform)
+ gl_camera.set_object_matrix(transform->get_world_matrix());
+ else
+ gl_camera.set_object_matrix(GL::Matrix());
+ if(active_camera->is_orthographic())
+ {
+ const LinAl::Vector<float, 2> &size = active_camera->get_size();
+ gl_camera.set_orthographic(size.x, size.y);
+ }
+ else
+ 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());
+ }
+ view.render();
+}
+
+} // namespace Msp::GameView