]> git.tdb.fi Git - libs/game.git/blob - source/gameview/renderer.cpp
Add a view sub-library, including a Camera component
[libs/game.git] / source / gameview / renderer.cpp
1 #include "renderer.h"
2 #include <msp/game/entity.h>
3 #include <msp/game/stage.h>
4 #include <msp/game/transform.h>
5 #include <msp/gl/sequencebuilder.h>
6
7 using namespace std;
8
9 namespace Msp::GameView {
10
11 Renderer::Renderer(Game::Stage &s, GL::View &v):
12         System(s),
13         view(v),
14         event_observer(s.get_event_bus())
15 {
16         event_observer.observe<Game::Events::CameraChanged>([this](auto &e){ camera_changed(e); });
17
18         if(Game::Handle<Game::Camera> ac = stage.get_active_camera())
19                 camera_changed({ ac });
20
21         view.set_camera(&gl_camera);
22 }
23
24 Renderer::~Renderer()
25 { }
26
27 void Renderer::camera_changed(const Game::Events::CameraChanged &event)
28 {
29         active_camera = event.camera;
30         if(event.camera)
31         {
32                 const string &seq_name = event.camera->get_sequence_name();
33                 if(seq_name!=current_seq_name)
34                 {
35                         current_seq_name = seq_name;
36                         GL::SequenceBuilder bld(stage.get_resources().get<GL::SequenceTemplate>(seq_name));
37                         bld.set_renderable("content", scene);
38                         sequence.reset(bld.build(view));
39                         view.set_content(sequence.get());
40                 }
41         }
42 }
43
44 void Renderer::tick(Time::TimeDelta)
45 {
46         if(active_camera)
47         {
48                 Game::Handle<Game::Transform> transform = active_camera->get_entity()->get_transform();
49                 if(transform)
50                         gl_camera.set_object_matrix(transform->get_world_matrix());
51                 else
52                         gl_camera.set_object_matrix(GL::Matrix());
53                 if(active_camera->is_orthographic())
54                 {
55                         const LinAl::Vector<float, 2> &size = active_camera->get_size();
56                         gl_camera.set_orthographic(size.x, size.y);
57                 }
58                 else
59                         gl_camera.set_field_of_view(active_camera->get_fov_vertical());
60                 gl_camera.set_depth_clip(active_camera->get_near_clip(), active_camera->get_far_clip());
61         }
62         view.render();
63 }
64
65 } // namespace Msp::GameView