From 928c0aaaf72363fc83c794b0259556ad68bd2530 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 5 Jun 2013 19:40:54 +0200 Subject: [PATCH] Added IndexBuffer optimization to Mesh parameters Former-commit-id: 073b37fa9ede92f88861110fb4fb0b84d54e26ae --- include/Nazara/Utility/Mesh.hpp | 7 +++++-- src/Nazara/Graphics/Loaders/OBJ/Loader.cpp | 3 +++ src/Nazara/Utility/Loaders/MD2/Loader.cpp | 9 +++++---- src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp | 19 +++++++++++-------- src/Nazara/Utility/Mesh.cpp | 3 +++ 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index 3bebdaf2e..64017faad 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -23,12 +23,15 @@ struct NAZARA_API NzMeshParams { NzMeshParams(); // Vérifie que le storage par défaut est supporté (software autrement) - // Si ceci sera le stockage choisi par le loader + // Si ceci sera le stockage utilisé par les buffers nzBufferStorage storage = nzBufferStorage_Hardware; - // Le loader doit-il charger une version animée du mesh si possible ? + // Charger une version animée du mesh si possible ? bool animated = true; + // Faut-il optimiser les index buffers ? (Rendu plus rapide, mais le chargement dure plus longtemps) + bool optimizeIndexBuffers = true; + bool IsValid() const; }; diff --git a/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp b/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp index ae39ebb1d..7cb189435 100644 --- a/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp +++ b/src/Nazara/Graphics/Loaders/OBJ/Loader.cpp @@ -155,6 +155,9 @@ namespace } vertexBuffer.release(); + if (parameters.mesh.optimizeIndexBuffers) + indexBuffer->Optimize(); + subMesh->SetIndexBuffer(indexBuffer.get()); indexBuffer.release(); diff --git a/src/Nazara/Utility/Loaders/MD2/Loader.cpp b/src/Nazara/Utility/Loaders/MD2/Loader.cpp index 433d8f0e1..ab89431d5 100644 --- a/src/Nazara/Utility/Loaders/MD2/Loader.cpp +++ b/src/Nazara/Utility/Loaders/MD2/Loader.cpp @@ -103,6 +103,7 @@ namespace /// Chargement des submesh // Actuellement le loader ne charge qu'un submesh std::unique_ptr indexBuffer(new NzIndexBuffer(header.num_tris * 3, false, parameters.storage, nzBufferUsage_Static)); + indexBuffer->SetPersistent(false); /// Lecture des triangles std::vector triangles(header.num_tris); @@ -148,8 +149,6 @@ namespace } #endif - const unsigned int indexFix[3] = {0, 2, 1}; // Pour respécifier les indices dans le bon ordre - std::unique_ptr vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), header.num_vertices, parameters.storage, nzBufferUsage_Static)); std::unique_ptr subMesh(new NzStaticMesh(mesh)); if (!subMesh->Create(vertexBuffer.get())) @@ -158,9 +157,10 @@ namespace return false; } - subMesh->SetIndexBuffer(indexBuffer.get()); + if (parameters.optimizeIndexBuffers) + indexBuffer->Optimize(); - indexBuffer->SetPersistent(false); + subMesh->SetIndexBuffer(indexBuffer.get()); indexBuffer.release(); /// Chargement des vertices @@ -187,6 +187,7 @@ namespace NzMeshVertex* vertex = reinterpret_cast(vertexMapper.GetPointer()); /// Chargement des coordonnées de texture + const unsigned int indexFix[3] = {0, 2, 1}; // Pour respécifier les indices dans le bon ordre for (unsigned int i = 0; i < header.num_tris; ++i) { for (unsigned int j = 0; j < 3; ++j) diff --git a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp index e0e2a7cd7..3366e7f5c 100644 --- a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp +++ b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -290,17 +291,18 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) bool largeIndices = (vertexCount > std::numeric_limits::max()); std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, largeIndices, m_parameters.storage)); - NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); + indexBuffer->SetPersistent(false); + + NzIndexMapper indexMapper(indexBuffer.get(), nzBufferAccess_DiscardAndWrite); + NzIndexIterator index = indexMapper.begin(); - unsigned int index = 0; for (const Mesh::Triangle& triangle : md5Mesh.triangles) { // On les respécifie dans le bon ordre - indexMapper.Set(index++, triangle.x); - indexMapper.Set(index++, triangle.z); - indexMapper.Set(index++, triangle.y); + *index++ = triangle.x; + *index++ = triangle.z; + *index++ = triangle.y; } - indexMapper.Unmap(); // Vertex buffer @@ -339,9 +341,10 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) vertexBuffer->SetPersistent(false); vertexBuffer.release(); - subMesh->SetIndexBuffer(indexBuffer.get()); + if (m_parameters.optimizeIndexBuffers) + indexBuffer->Optimize(); - indexBuffer->SetPersistent(false); + subMesh->SetIndexBuffer(indexBuffer.get()); indexBuffer.release(); // Material diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index a68fea8c1..c4e01be7f 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -287,6 +287,9 @@ void NzMesh::Build(const NzPrimitiveList& list, const NzMeshParams& params) } vertexBuffer.release(); + if (params.optimizeIndexBuffers) + indexBuffer->Optimize(); + subMesh->SetIndexBuffer(indexBuffer.get()); indexBuffer.release();