Bladeren bron

Don't provide the renderer impl through the constructor of direct_renderer.

Sam Jaffe 6 jaren geleden
bovenliggende
commit
cd16ccf132

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

@@ -26,9 +26,11 @@ namespace graphics {
     virtual void flush() = 0;
   };
 
+  enum class driver { openGL };
+
   class direct_renderer : public renderer {
   public:
-    direct_renderer(renderer_impl * impl);
+    direct_renderer(driver d);
     void draw(flyweight<material>, math::matr4 const &,
               std::vector<vertex> const &) override;
     void clear() override;

+ 6 - 1
graphics/src/opengl_renderer.cxx

@@ -20,7 +20,7 @@
 using namespace graphics;
 
 class opengl_renderer : public renderer_impl {
-private:
+public:
   opengl_renderer();
   ~opengl_renderer();
 
@@ -108,3 +108,8 @@ void opengl_renderer::draw(flyweight<material> material,
   glDisableVertexAttribArray(colorLocation);
   glDisableVertexAttribArray(texCoordsLocation);
 }
+
+template <> renderer_impl * graphics::get_renderer_impl<driver::openGL>() {
+  static opengl_renderer impl;
+  return &impl;
+}

+ 10 - 1
graphics/src/renderer.cxx

@@ -15,7 +15,16 @@
 
 using namespace graphics;
 
-direct_renderer::direct_renderer(renderer_impl * impl) : pimpl(impl) {}
+renderer_impl * get_renderer_impl(driver d) {
+  switch (d) {
+  case driver::openGL:
+    return get_renderer_impl<driver::openGL>();
+  default:
+    throw;
+  }
+}
+
+direct_renderer::direct_renderer(driver d) : pimpl(::get_renderer_impl(d)) {}
 
 void direct_renderer::draw(flyweight<material> material, math::matr4 const &,
                            std::vector<vertex> const & verts) {

+ 3 - 0
graphics/src/renderer_impl.hpp

@@ -8,10 +8,13 @@
 
 #pragma once
 
+#include "game/graphics/renderer.hpp"
 #include "game/math/math_fwd.hpp"
 #include "game/util/flyweight.hpp"
 
 namespace graphics {
+  template <driver> renderer_impl * get_renderer_impl();
+
   class material;
   struct vertex;