From 8c9af1210b4c72f1513378966eeae700128ecb2e Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Sat, 17 Jul 2021 19:22:34 +0100
Subject: [PATCH] use transforms for entities in the demo

---
 demo/main.cpp         | 39 +++++++++++++++++++++++++++++++--------
 fggl/gfx/renderer.cpp |  6 +++---
 fggl/math/types.hpp   | 11 ++++++++++-
 3 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/demo/main.cpp b/demo/main.cpp
index e02b23f..a5a4561 100644
--- a/demo/main.cpp
+++ b/demo/main.cpp
@@ -64,16 +64,39 @@ int main(int argc, char* argv[]) {
 	// create ECS
 	fggl::ecs::ECS ecs;
 	ecs.registerComponent<fggl::gfx::MeshToken>();
+	ecs.registerComponent<fggl::math::Transform>();
 
-	// create an entity
-	auto entity = ecs.createEntity();
+	for (int i=0; i<3; i++) {
+		// create an entity
+		auto entity = ecs.createEntity();
 
-	// in a supprise to no one it's a triangle
-//	auto mesh = fggl::data::make_quad_xy();
-	auto mesh = fggl::data::make_point();
-	auto token = meshRenderer.upload(mesh);
-	token.pipeline = shader;
-	ecs.addComponent<fggl::gfx::MeshToken>(entity, token);
+		// set the position
+		auto result = ecs.addComponent<fggl::math::Transform>(entity);
+		result->origin( glm::vec3( 0.0f, 0.0f, i * -1.0f) );
+
+		// in a supprise to no one it's a triangle
+		auto mesh = fggl::data::make_cube();
+		auto token = meshRenderer.upload(mesh);
+		token.pipeline = shader;
+		ecs.addComponent<fggl::gfx::MeshToken>(entity, token);
+	}
+
+	constexpr float HALF_PI = M_PI / 2.0f;
+	for (int i=0; i<3; i++) {
+		// create an entity
+		auto entity = ecs.createEntity();
+
+		// set the position
+		auto result = ecs.addComponent<fggl::math::Transform>(entity);
+		result->origin( glm::vec3( 1.0f, 0.0f, i * -1.0f) );
+		result->euler( glm::vec3( 0.0f, HALF_PI, 0.0f) );
+
+		// in a supprise to no one it's a triangle
+		auto mesh = fggl::data::make_slope();
+		auto token = meshRenderer.upload(mesh);
+		token.pipeline = shader;
+		ecs.addComponent<fggl::gfx::MeshToken>(entity, token);
+	}
 
 	while( !win.closeRequested() ) {
 		ctx.pollEvents();
diff --git a/fggl/gfx/renderer.cpp b/fggl/gfx/renderer.cpp
index 635021e..fe3e9d0 100644
--- a/fggl/gfx/renderer.cpp
+++ b/fggl/gfx/renderer.cpp
@@ -81,16 +81,16 @@ void MeshRenderer::render(const Window& window, const fggl::ecs::ECS& ecs, float
 
     glm::mat4 view = glm::lookAt( glm::vec3 ( 0.0f, 3.0f, 3.0f ), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f) );
     glm::mat4 proj = glm::perspective( glm::radians(45.0f), 1280.0f/720.0f, 0.1f, 100.0f);
-//    glm::mat4 proj = glm::mat4(1.0f);
 
 
     // TODO better performance if grouped by vao first
     // TODO the nvidia performance presentation said I shouldn't use uniforms for large data
     for ( auto& entity : entities ) {
+	    const auto& transform = ecs.getComponent<fggl::math::Transform>(entity);
 	    const auto& mesh = ecs.getComponent<GlRenderToken>(entity);
 
-    	    glm::mat4 model = glm::mat4(1.0f);
-	    model = glm::rotate(model, glm::radians(total/2048.0f * 360.0f), glm::vec3(0.0f,1.0f,0.0f));
+	    glm::mat4 model = transform->model();
+//	    model = glm::rotate(model, glm::radians(total/2048.0f * 360.0f), glm::vec3(0.0f,1.0f,0.0f));
 
 	    auto shader = mesh->pipeline;
 	    glUseProgram( shader );
diff --git a/fggl/math/types.hpp b/fggl/math/types.hpp
index d3c5b6e..77373e6 100644
--- a/fggl/math/types.hpp
+++ b/fggl/math/types.hpp
@@ -1,6 +1,7 @@
 #ifndef FGGL_MATH_TYPES_H
 #define FGGL_MATH_TYPES_H
 
+#include <glm/ext/matrix_transform.hpp>
 #include <glm/glm.hpp>
 #include <glm/gtc/quaternion.hpp>
 #include <glm/gtx/quaternion.hpp>
@@ -21,7 +22,7 @@ namespace fggl::math {
 
 	struct Transform {
 
-		Transform() : m_local(1.0f), m_origin(0.0f), m_model(), m_rotation() {
+		Transform() : m_local(1.0f), m_origin(0.0f), m_model(1.0f), m_rotation() {
 		}
 
 		// local reference vectors
@@ -65,6 +66,14 @@ namespace fggl::math {
 			return glm::eulerAngles(m_rotation);
 		}
 
+		inline mat4 model() const {
+			mat4 tmp(1.0f);
+			tmp = glm::translate(tmp, m_origin);
+			tmp = tmp * glm::toMat4(m_rotation);
+
+			return tmp;
+		}
+
 		private:
 			mat4 m_local; // us -> parent
 			mat4 m_model; // us -> world
-- 
GitLab