]> git.tdb.fi Git - libs/game.git/blobdiff - source/gameview/renderer.cpp
Add a view sub-library, including a Camera component
[libs/game.git] / source / gameview / renderer.cpp
diff --git a/source/gameview/renderer.cpp b/source/gameview/renderer.cpp
new file mode 100644 (file)
index 0000000..4bce484
--- /dev/null
@@ -0,0 +1,65 @@
+#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