From f0d3603b105b18cedd65f462b871ecdfda6529ce Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Sat, 22 Oct 2022 18:45:44 +0100
Subject: [PATCH] allow triggering of debug mode

---
 demo/data/redbook/debug_frag.glsl | 2 +-
 demo/demo/models/viewer.cpp       | 6 +++++-
 demo/include/models/viewer.hpp    | 1 +
 fggl/gfx/ogl/renderer.cpp         | 4 ++--
 fggl/gfx/ogl4/models.cpp          | 4 ++--
 fggl/gfx/ogl4/module.cpp          | 5 +++++
 include/fggl/data/model.hpp       | 4 ++--
 include/fggl/gfx/interfaces.hpp   | 2 +-
 include/fggl/gfx/ogl/renderer.hpp | 2 +-
 include/fggl/gfx/ogl4/models.hpp  | 8 +++-----
 10 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/demo/data/redbook/debug_frag.glsl b/demo/data/redbook/debug_frag.glsl
index 04ed267..aa8e88c 100644
--- a/demo/data/redbook/debug_frag.glsl
+++ b/demo/data/redbook/debug_frag.glsl
@@ -12,5 +12,5 @@ out vec4 FragColour;
 
 void main() {
     vec3 normalScale = 0.5 + (Normal / 2);
-    FragColour = vec4(normalScale, 1);
+    FragColour = Colour * vec4(normalScale, 1);
 }
\ No newline at end of file
diff --git a/demo/demo/models/viewer.cpp b/demo/demo/models/viewer.cpp
index 048b8e5..c1860d2 100644
--- a/demo/demo/models/viewer.cpp
+++ b/demo/demo/models/viewer.cpp
@@ -121,12 +121,16 @@ namespace demo {
 	void Viewer::update(float dt) {
 		Game::update(dt);
 		process_camera(world(), input());
+
+		if ( input().keyboard.pressed(glfwGetKeyScancode(GLFW_KEY_F2)) ) {
+			m_debug = !m_debug;
+		}
 	}
 
 	void Viewer::render(fggl::gfx::Graphics &gfx) {
 		Game::render(gfx);
 
-		gfx.drawScene(world());
+		gfx.drawScene(world(), m_debug);
 	}
 
 }
diff --git a/demo/include/models/viewer.hpp b/demo/include/models/viewer.hpp
index 7e29623..242cd35 100644
--- a/demo/include/models/viewer.hpp
+++ b/demo/include/models/viewer.hpp
@@ -36,6 +36,7 @@ namespace demo {
 
 		private:
 			fggl::entity::EntityID m_model;
+			bool m_debug = false;
 
 	};
 }
diff --git a/fggl/gfx/ogl/renderer.cpp b/fggl/gfx/ogl/renderer.cpp
index d1d024c..c13ef6c 100644
--- a/fggl/gfx/ogl/renderer.cpp
+++ b/fggl/gfx/ogl/renderer.cpp
@@ -204,9 +204,9 @@ namespace fggl::gfx {
 		m_canvasRenderer->render(*m_canvasPipeline, paint);
 	}
 
-	void OpenGL4Backend::drawScene(entity::EntityManager &world) {
+	void OpenGL4Backend::drawScene(entity::EntityManager &world, bool debugMode) {
 		if (m_modelRenderer) {
-			m_modelRenderer->render(world);
+			m_modelRenderer->render(world, debugMode);
 		}
 
 		if (m_debugRenderer) {
diff --git a/fggl/gfx/ogl4/models.cpp b/fggl/gfx/ogl4/models.cpp
index 99a2384..cfe500d 100644
--- a/fggl/gfx/ogl4/models.cpp
+++ b/fggl/gfx/ogl4/models.cpp
@@ -410,7 +410,7 @@ namespace fggl::gfx::ogl4 {
 		}
 	}
 
-	void StaticModelRenderer::renderModelsForward(const entity::EntityManager &world) {
+	void StaticModelRenderer::renderModelsForward(const entity::EntityManager &world, bool debugMode) {
 
 		// fetch cameras we will need to render with
 		auto cameras = world.find<gfx::Camera>();
@@ -430,7 +430,7 @@ namespace fggl::gfx::ogl4 {
 			forward_pass<ogl4::StaticMultiMesh>(cameraEnt, world);
 
 			// enable rendering normals
-			if ( m_renderNormals ) {
+			if ( debugMode ) {
 				auto normalShader = m_shaders->get("normals");
 				forward_pass_normals<StaticMesh>(cameraEnt, world, normalShader);
 				forward_pass_normals<StaticMultiMesh>(cameraEnt, world, normalShader);
diff --git a/fggl/gfx/ogl4/module.cpp b/fggl/gfx/ogl4/module.cpp
index 5c5289d..e18cce7 100644
--- a/fggl/gfx/ogl4/module.cpp
+++ b/fggl/gfx/ogl4/module.cpp
@@ -18,6 +18,7 @@
 
 #include "fggl/gfx/ogl4/module.hpp"
 #include "fggl/gfx/phong.hpp"
+#include "fggl/mesh/components.hpp"
 #include "fggl/data/procedural.hpp"
 
 #include "fggl/assets/loader.hpp"
@@ -154,6 +155,10 @@ namespace fggl::gfx {
 			// register as responsible for creating rendering components
 			auto *entityFactory = services.get<entity::EntityFactory>();
 			entityFactory->bind(data::StaticMesh::guid, attach_mesh);
+
+			entityFactory->bind(mesh::StaticMesh3D::guid, attach_mesh);
+			entityFactory->bind(mesh::StaticMultiMesh3D::guid, attach_mesh);
+
 			entityFactory->bind(gfx::PhongMaterial::guid, attach_material);
 			entityFactory->bind(gfx::Light::guid, attach_light);
 
diff --git a/include/fggl/data/model.hpp b/include/fggl/data/model.hpp
index b042590..d11a03a 100644
--- a/include/fggl/data/model.hpp
+++ b/include/fggl/data/model.hpp
@@ -29,8 +29,8 @@ namespace fggl::data {
 
 	struct Vertex {
 		math::vec3 posititon;
-		math::vec3 normal;
-		math::vec3 colour;
+		math::vec3 normal = ILLEGAL_NORMAL;
+		math::vec3 colour = DEFAULT_COLOUR;
 		math::vec2 texPos;
 
 		inline static Vertex from_pos(math::vec3 pos) {
diff --git a/include/fggl/gfx/interfaces.hpp b/include/fggl/gfx/interfaces.hpp
index 52150c2..4e1953d 100644
--- a/include/fggl/gfx/interfaces.hpp
+++ b/include/fggl/gfx/interfaces.hpp
@@ -43,7 +43,7 @@ namespace fggl::gfx {
 			virtual Bounds canvasBounds() = 0;
 			virtual void draw2D(const Paint &paint) = 0;
 
-			virtual void drawScene(entity::EntityManager &) = 0;
+			virtual void drawScene(entity::EntityManager &, bool debugMode = false) = 0;
 	};
 
 } // namespace fggl::gfx
diff --git a/include/fggl/gfx/ogl/renderer.hpp b/include/fggl/gfx/ogl/renderer.hpp
index c0d8d06..39cb5ba 100644
--- a/include/fggl/gfx/ogl/renderer.hpp
+++ b/include/fggl/gfx/ogl/renderer.hpp
@@ -93,7 +93,7 @@ namespace fggl::gfx {
 			 *
 			 * @param world the world to render
 			 */
-			void drawScene(entity::EntityManager &world) override;
+			void drawScene(entity::EntityManager &world, bool debugMode=false) override;
 
 			/**
 			 * Get the 2D canvas bounds.
diff --git a/include/fggl/gfx/ogl4/models.hpp b/include/fggl/gfx/ogl4/models.hpp
index bf58fdd..66ffbe2 100644
--- a/include/fggl/gfx/ogl4/models.hpp
+++ b/include/fggl/gfx/ogl4/models.hpp
@@ -85,15 +85,13 @@ namespace fggl::gfx::ogl4 {
 			StaticModel* uploadMesh(assets::AssetGUID guid, const data::Mesh& mesh, bool allowCache=true);
 			StaticModelGPU* uploadMesh2(const assets::AssetGUID& meshName, const data::Mesh& mesh);
 
-			void render(entity::EntityManager &world) {
+			void render(entity::EntityManager &world, bool debugMode = false) {
 				#ifdef FGGL_ALLOW_DEFERRED_UPLOAD
 					resolveModels(world);
 				#endif
-				renderModelsForward(world);
+				renderModelsForward(world, debugMode);
 			}
 
-			bool m_renderNormals = true;
-
 		private:
 
 			#ifdef FGGL_ALLOW_DEFERRED_UPLOAD
@@ -106,7 +104,7 @@ namespace fggl::gfx::ogl4 {
 			/**
 			 * Render all visible objects according to their render tokens.
 			 */
-			void renderModelsForward(const entity::EntityManager &world);
+			void renderModelsForward(const entity::EntityManager &world, bool debugMode);
 
 			assets::AssetManager *m_assets;
 			gfx::ShaderCache *m_shaders;
-- 
GitLab