فهرست منبع

Make game_dispatch take a renderer pointer.
Make scene::render take a renderer as an argument instead of using a member variable.
Fixing batch_renderer linker error on destructor.

Sam Jaffe 6 سال پیش
والد
کامیت
f01765f5a8

+ 6 - 1
engine/include/game/engine/game_dispatch.hpp

@@ -18,10 +18,14 @@
 #include "events.hpp"
 #include "game/util/time.hpp"
 
+namespace graphics {
+  class renderer;
+}
+
 namespace engine {
   class game_dispatch {
   public:
-    game_dispatch();
+    game_dispatch(std::shared_ptr<graphics::renderer> renderer);
 
     void process_key_event(raw_key_t key, bool press);
     void process_mouse_event(math::vec2 click, bool press);
@@ -38,6 +42,7 @@ namespace engine {
     tick get_tick();
 
   private:
+    std::shared_ptr<graphics::renderer> renderer;
     math::vec2 screen_size;
     env::clock::duration minimum_frame_duration;
 

+ 1 - 2
engine/include/game/engine/scene.hpp

@@ -30,7 +30,7 @@ namespace engine {
     virtual ~scene();
 
     virtual void update(float delta);
-    virtual void render();
+    virtual void render(graphics::renderer & renderer);
     virtual void handle_key_event(event::key_event evt);
     virtual void handle_mouse_event(event::mouse_event evt);
 
@@ -41,7 +41,6 @@ namespace engine {
     void change_scene(std::string const & scene_id);
 
   protected:
-    graphics::renderer * renderer;
     std::vector<entity> entities;
 
     // Map from entity::collides_with -> [entity*]

+ 9 - 4
engine/src/game_dispatch.cpp

@@ -11,6 +11,7 @@
 
 #include "game/engine/events.hpp"
 #include "game/engine/scene.hpp"
+#include "game/graphics/renderer.hpp"
 #include "game/util/env.hpp"
 
 namespace engine {
@@ -21,9 +22,10 @@ namespace engine {
     }
   }
 
-  game_dispatch::game_dispatch()
-      : screen_size(env::screen_size()), minimum_frame_duration(env::fps::v60),
-        scenes(), current_timestamp(env::clock::now()), curr_scene() {}
+  game_dispatch::game_dispatch(std::shared_ptr<graphics::renderer> renderer)
+      : renderer(renderer), screen_size(env::screen_size()),
+        minimum_frame_duration(env::fps::v60), scenes(),
+        current_timestamp(env::clock::now()), curr_scene() {}
 
   game_dispatch::current_scene_info::current_scene_info() {}
 
@@ -63,5 +65,8 @@ namespace engine {
 
   void game_dispatch::update() { curr_scene.ptr->update(next_frame()); }
 
-  void game_dispatch::render() { curr_scene.ptr->render(); }
+  void game_dispatch::render() {
+    graphics::batch_renderer batch(renderer.get());
+    curr_scene.ptr->render(batch);
+  }
 }

+ 2 - 2
engine/src/scene.cpp

@@ -34,9 +34,9 @@ void scene::update(float delta) {
   }
 }
 
-void scene::render() {
+void scene::render(graphics::renderer & renderer) {
   for (auto & ent : entities) {
-    renderer->draw(ent.render_info());
+    renderer.draw(ent.render_info());
   }
 }
 

+ 1 - 0
graphics/include/game/graphics/renderer.hpp

@@ -46,6 +46,7 @@ namespace graphics {
   class batch_renderer : public renderer {
   public:
     batch_renderer(renderer * impl, std::size_t batch_size = 0);
+    ~batch_renderer();
     void draw(object const & obj) override;
     void draw(flyweight<material>, math::matr4 const &,
               std::vector<vertex> const &) override;

+ 2 - 0
graphics/src/renderer.cxx

@@ -44,6 +44,8 @@ void direct_renderer::flush() { pimpl->flush(); }
 batch_renderer::batch_renderer(renderer * impl, std::size_t batch_size)
     : impl_(impl), batches_(), batch_size_(batch_size), elements_(0) {}
 
+batch_renderer::~batch_renderer() {}
+
 void batch_renderer::draw(object const & obj) {
   std::vector<vertex> & batch_verts = batches_[obj.material];
   auto old_size = batch_verts.size();