From 02f30c6c4282c4ae30963403eafe6989c62ddc4b Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Tue, 19 Apr 2022 22:00:02 +0100
Subject: [PATCH] cleanup static model rendering code

---
 fggl/gfx/ogl4/models.cpp | 114 +++++++++++++++++----------------------
 1 file changed, 48 insertions(+), 66 deletions(-)

diff --git a/fggl/gfx/ogl4/models.cpp b/fggl/gfx/ogl4/models.cpp
index 177d95d..d6ff011 100644
--- a/fggl/gfx/ogl4/models.cpp
+++ b/fggl/gfx/ogl4/models.cpp
@@ -30,6 +30,44 @@
 
 namespace fggl::gfx::ogl4 {
 
+	static std::shared_ptr<ogl::ArrayBuffer> setupArrayBuffer(std::shared_ptr<ogl::VertexArray>& vao,
+								 std::vector<data::Vertex>& data) {
+		auto buff = std::make_shared<ogl::ArrayBuffer>();
+		buff->write(data.size() * sizeof(data::Vertex), data.data(), ogl::BufUsage::STATIC_DRAW);
+
+		// set up the vertex attributes
+		auto posAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, posititon));
+		auto normalAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, normal));
+		auto colAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, colour));
+
+		vao->setAttribute( *buff.get(), 0, posAttr );
+		vao->setAttribute( *buff.get(), 1, normalAttr );
+		vao->setAttribute( *buff.get(), 3, colAttr );
+		return buff;
+	}
+
+	static std::shared_ptr<ogl::ElementBuffer> setupIndexBuffer(std::shared_ptr<ogl::VertexArray>& vao,
+																std::vector<uint32_t>& data) {
+		auto elementBuffer = std::make_shared<ogl::ElementBuffer>();
+		elementBuffer->write(data.size() * sizeof(uint32_t),
+							 data.data(), ogl::BufUsage::STATIC_DRAW);
+		return elementBuffer;
+	}
+
+	static void setupComponent(StaticModel* modelComp, std::shared_ptr<ogl::Shader>& shader, data::Mesh& mesh) {
+		auto vao = std::make_shared< ogl::VertexArray >();
+		auto meshBuffer = setupArrayBuffer(vao, mesh.vertexList());
+		auto elementBuffer = setupIndexBuffer(vao, mesh.indexList());
+
+		// set up the element attributes
+		modelComp->vao = vao;
+		modelComp->vertexData = meshBuffer;
+		modelComp->elements = elementBuffer;
+		modelComp->pipeline = shader;
+		modelComp->elementCount = mesh.indexCount();
+		modelComp->drawType = ogl::Primative::TRIANGLE;
+	}
+
 	void StaticModelRenderer::resolveModels(ecs3::World &world) {
 		// FIXME: this needs something reactive or performance will suck.
 		auto renderables = world.findMatching<gfx::StaticMesh>();
@@ -40,38 +78,8 @@ namespace fggl::gfx::ogl4 {
 			}
 
 			auto* meshComp = world.get<gfx::StaticMesh>(renderable);
-
-			// create a vao to store the mesh
-			auto vao = std::make_shared< ogl::VertexArray >();
-			vao->bind();
-
-			// setup the mesh buffer stuff
-			auto meshToUpload = meshComp->mesh;
-			auto meshBuffer = std::make_shared<ogl::ArrayBuffer>();
-
-			spdlog::info("mesh data to upload: {}", meshToUpload.vertexCount());
-			meshBuffer->write(meshToUpload.vertexCount() * sizeof(data::Vertex), meshToUpload.vertexList().data(), ogl::BufUsage::STATIC_DRAW);
-
-			// set up the vertex attributes
-			auto posAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, posititon));
-			auto normalAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, normal));
-			auto colAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, colour));
-
-			vao->setAttribute( *meshBuffer.get(), 0, posAttr );
-			vao->setAttribute( *meshBuffer.get(), 1, normalAttr );
-			vao->setAttribute( *meshBuffer.get(), 3, colAttr );
-
-			// set up the element attributes
-			auto elementBuffer = std::make_shared<ogl::ElementBuffer>();
-			elementBuffer->write(meshToUpload.indexCount() * sizeof(uint32_t), meshToUpload.indexList().data(), ogl::BufUsage::STATIC_DRAW);
-
 			auto* modelComp = world.add<StaticModel>(renderable);
-			modelComp->vao = vao;
-			modelComp->vertexData = meshBuffer;
-			modelComp->elements = elementBuffer;
-			modelComp->pipeline = m_phong;
-			modelComp->elementCount = meshToUpload.indexCount();
-			modelComp->drawType = ogl::Primative::TRIANGLE;
+			setupComponent(modelComp, m_phong, meshComp->mesh);
 
 			// no active model, we need to resolve/load one.
 			spdlog::info("looks like {} needs a static mesh", renderable);
@@ -86,40 +94,16 @@ namespace fggl::gfx::ogl4 {
 			}
 
 			auto* heightmap = world.get<data::HeightMap>(renderable);
-
-			// create a vao to store the mesh
-			auto vao = std::make_shared< ogl::VertexArray >();
-			vao->bind();
-
-			// setup the mesh buffer stuff
-			data::Mesh meshToUpload{};
-			data::generateHeightMesh(heightmap, meshToUpload);
-			auto meshBuffer = std::make_shared<ogl::ArrayBuffer>();
-
-			spdlog::info("mesh data to upload: {}", meshToUpload.vertexCount());
-			meshBuffer->write(meshToUpload.vertexCount() * sizeof(data::Vertex), meshToUpload.vertexList().data(), ogl::BufUsage::STATIC_DRAW);
-
-			// set up the vertex attributes
-			auto posAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, posititon));
-			auto normalAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, normal));
-			auto colAttr = ogl::attribute<data::Vertex, math::vec3>(offsetof(data::Vertex, colour));
-
-			vao->setAttribute( *meshBuffer.get(), 0, posAttr );
-			vao->setAttribute( *meshBuffer.get(), 1, normalAttr );
-			vao->setAttribute( *meshBuffer.get(), 3, colAttr );
-
-			// set up the element attributes
-			auto elementBuffer = std::make_shared<ogl::ElementBuffer>();
-			elementBuffer->write(meshToUpload.indexCount() * sizeof(uint32_t), meshToUpload.indexList().data(), ogl::BufUsage::STATIC_DRAW);
+			data::Mesh heightMapMesh{};
+			data::generateHeightMesh(heightmap, heightMapMesh);
 
 			auto* modelComp = world.add<StaticModel>(renderable);
-			modelComp->vao = vao;
-			modelComp->vertexData = meshBuffer;
-			modelComp->elements = elementBuffer;
-			modelComp->pipeline = m_phong;
-			modelComp->elementCount = meshToUpload.indexCount();
+			setupComponent(modelComp, m_phong, heightMapMesh);
+
+			// we know this is a triangle strip with a restart vertex...
+			// FIXME the model should be telling us this...
 			modelComp->drawType = ogl::Primative::TRIANGLE_STRIP;
-			modelComp->restartIndex = meshToUpload.restartVertex;
+			modelComp->restartIndex = heightMapMesh.restartVertex;
 
 			// no active model, we need to resolve/load one.
 			spdlog::info("looks like heightmap, {} needs a static mesh", renderable);
@@ -137,8 +121,6 @@ namespace fggl::gfx::ogl4 {
 			return;
 		}
 
-		float deltaTime = 0.0f;
-
 		// perform a rendering pass for each camera (will usually only be one...)
 		for ( auto& cameraEnt : cameras ){
 			//TODO should be cliping this to only visible objects
@@ -154,8 +136,8 @@ namespace fggl::gfx::ogl4 {
 			auto* const camTransform = world.get<math::Transform>(cameraEnt);
 			auto* const camComp = world.get<gfx::Camera>(cameraEnt);
 
-			math::mat4 projectionMatrix = glm::perspective(camComp->fov, camComp->aspectRatio, camComp->nearPlane, camComp->farPlane);
-			math::mat4 viewMatrix = glm::lookAt( camTransform->origin(), camComp->target, camTransform->up() );
+			const math::mat4 projectionMatrix = glm::perspective(camComp->fov, camComp->aspectRatio, camComp->nearPlane, camComp->farPlane);
+			const math::mat4 viewMatrix = glm::lookAt( camTransform->origin(), camComp->target, camTransform->up() );
 
 			// TODO lighting needs to not be this...
 			math::vec3 lightPos{20.0f, 20.0f, 15.0f};
-- 
GitLab