X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgameview%2Frenderer.cpp;fp=source%2Fgameview%2Frenderer.cpp;h=4bce48420ecd12cca0f48a0dd5d8daaa22a8c4eb;hb=f298027c2042b63cec903c98dfc97e792a4f923f;hp=0000000000000000000000000000000000000000;hpb=38ffef0320a70909f3e13e9681e4720352e440aa;p=libs%2Fgame.git diff --git a/source/gameview/renderer.cpp b/source/gameview/renderer.cpp new file mode 100644 index 0000000..4bce484 --- /dev/null +++ b/source/gameview/renderer.cpp @@ -0,0 +1,65 @@ +#include "renderer.h" +#include +#include +#include +#include + +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([this](auto &e){ camera_changed(e); }); + + if(Game::Handle 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(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 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 &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