Added IndexBuffer optimization to Mesh parameters
Former-commit-id: 073b37fa9ede92f88861110fb4fb0b84d54e26ae
This commit is contained in:
parent
ccb6f5b729
commit
928c0aaaf7
|
|
@ -23,12 +23,15 @@ struct NAZARA_API NzMeshParams
|
||||||
{
|
{
|
||||||
NzMeshParams(); // Vérifie que le storage par défaut est supporté (software autrement)
|
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;
|
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;
|
bool animated = true;
|
||||||
|
|
||||||
|
// Faut-il optimiser les index buffers ? (Rendu plus rapide, mais le chargement dure plus longtemps)
|
||||||
|
bool optimizeIndexBuffers = true;
|
||||||
|
|
||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,9 @@ namespace
|
||||||
}
|
}
|
||||||
vertexBuffer.release();
|
vertexBuffer.release();
|
||||||
|
|
||||||
|
if (parameters.mesh.optimizeIndexBuffers)
|
||||||
|
indexBuffer->Optimize();
|
||||||
|
|
||||||
subMesh->SetIndexBuffer(indexBuffer.get());
|
subMesh->SetIndexBuffer(indexBuffer.get());
|
||||||
indexBuffer.release();
|
indexBuffer.release();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,7 @@ namespace
|
||||||
/// Chargement des submesh
|
/// Chargement des submesh
|
||||||
// Actuellement le loader ne charge qu'un submesh
|
// Actuellement le loader ne charge qu'un submesh
|
||||||
std::unique_ptr<NzIndexBuffer> indexBuffer(new NzIndexBuffer(header.num_tris * 3, false, parameters.storage, nzBufferUsage_Static));
|
std::unique_ptr<NzIndexBuffer> indexBuffer(new NzIndexBuffer(header.num_tris * 3, false, parameters.storage, nzBufferUsage_Static));
|
||||||
|
indexBuffer->SetPersistent(false);
|
||||||
|
|
||||||
/// Lecture des triangles
|
/// Lecture des triangles
|
||||||
std::vector<md2_triangle> triangles(header.num_tris);
|
std::vector<md2_triangle> triangles(header.num_tris);
|
||||||
|
|
@ -148,8 +149,6 @@ namespace
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const unsigned int indexFix[3] = {0, 2, 1}; // Pour respécifier les indices dans le bon ordre
|
|
||||||
|
|
||||||
std::unique_ptr<NzVertexBuffer> vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), header.num_vertices, parameters.storage, nzBufferUsage_Static));
|
std::unique_ptr<NzVertexBuffer> vertexBuffer(new NzVertexBuffer(NzMesh::GetDeclaration(), header.num_vertices, parameters.storage, nzBufferUsage_Static));
|
||||||
std::unique_ptr<NzStaticMesh> subMesh(new NzStaticMesh(mesh));
|
std::unique_ptr<NzStaticMesh> subMesh(new NzStaticMesh(mesh));
|
||||||
if (!subMesh->Create(vertexBuffer.get()))
|
if (!subMesh->Create(vertexBuffer.get()))
|
||||||
|
|
@ -158,9 +157,10 @@ namespace
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
subMesh->SetIndexBuffer(indexBuffer.get());
|
if (parameters.optimizeIndexBuffers)
|
||||||
|
indexBuffer->Optimize();
|
||||||
|
|
||||||
indexBuffer->SetPersistent(false);
|
subMesh->SetIndexBuffer(indexBuffer.get());
|
||||||
indexBuffer.release();
|
indexBuffer.release();
|
||||||
|
|
||||||
/// Chargement des vertices
|
/// Chargement des vertices
|
||||||
|
|
@ -187,6 +187,7 @@ namespace
|
||||||
NzMeshVertex* vertex = reinterpret_cast<NzMeshVertex*>(vertexMapper.GetPointer());
|
NzMeshVertex* vertex = reinterpret_cast<NzMeshVertex*>(vertexMapper.GetPointer());
|
||||||
|
|
||||||
/// Chargement des coordonnées de texture
|
/// 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 i = 0; i < header.num_tris; ++i)
|
||||||
{
|
{
|
||||||
for (unsigned int j = 0; j < 3; ++j)
|
for (unsigned int j = 0; j < 3; ++j)
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <Nazara/Math/Basic.hpp>
|
#include <Nazara/Math/Basic.hpp>
|
||||||
#include <Nazara/Utility/BufferMapper.hpp>
|
#include <Nazara/Utility/BufferMapper.hpp>
|
||||||
#include <Nazara/Utility/Config.hpp>
|
#include <Nazara/Utility/Config.hpp>
|
||||||
|
#include <Nazara/Utility/IndexIterator.hpp>
|
||||||
#include <Nazara/Utility/IndexMapper.hpp>
|
#include <Nazara/Utility/IndexMapper.hpp>
|
||||||
#include <Nazara/Utility/Mesh.hpp>
|
#include <Nazara/Utility/Mesh.hpp>
|
||||||
#include <Nazara/Utility/SkeletalMesh.hpp>
|
#include <Nazara/Utility/SkeletalMesh.hpp>
|
||||||
|
|
@ -290,17 +291,18 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
|
||||||
bool largeIndices = (vertexCount > std::numeric_limits<nzUInt16>::max());
|
bool largeIndices = (vertexCount > std::numeric_limits<nzUInt16>::max());
|
||||||
|
|
||||||
std::unique_ptr<NzIndexBuffer> indexBuffer(new NzIndexBuffer(indexCount, largeIndices, m_parameters.storage));
|
std::unique_ptr<NzIndexBuffer> 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)
|
for (const Mesh::Triangle& triangle : md5Mesh.triangles)
|
||||||
{
|
{
|
||||||
// On les respécifie dans le bon ordre
|
// On les respécifie dans le bon ordre
|
||||||
indexMapper.Set(index++, triangle.x);
|
*index++ = triangle.x;
|
||||||
indexMapper.Set(index++, triangle.z);
|
*index++ = triangle.z;
|
||||||
indexMapper.Set(index++, triangle.y);
|
*index++ = triangle.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
indexMapper.Unmap();
|
indexMapper.Unmap();
|
||||||
|
|
||||||
// Vertex buffer
|
// Vertex buffer
|
||||||
|
|
@ -339,9 +341,10 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh)
|
||||||
vertexBuffer->SetPersistent(false);
|
vertexBuffer->SetPersistent(false);
|
||||||
vertexBuffer.release();
|
vertexBuffer.release();
|
||||||
|
|
||||||
subMesh->SetIndexBuffer(indexBuffer.get());
|
if (m_parameters.optimizeIndexBuffers)
|
||||||
|
indexBuffer->Optimize();
|
||||||
|
|
||||||
indexBuffer->SetPersistent(false);
|
subMesh->SetIndexBuffer(indexBuffer.get());
|
||||||
indexBuffer.release();
|
indexBuffer.release();
|
||||||
|
|
||||||
// Material
|
// Material
|
||||||
|
|
|
||||||
|
|
@ -287,6 +287,9 @@ void NzMesh::Build(const NzPrimitiveList& list, const NzMeshParams& params)
|
||||||
}
|
}
|
||||||
vertexBuffer.release();
|
vertexBuffer.release();
|
||||||
|
|
||||||
|
if (params.optimizeIndexBuffers)
|
||||||
|
indexBuffer->Optimize();
|
||||||
|
|
||||||
subMesh->SetIndexBuffer(indexBuffer.get());
|
subMesh->SetIndexBuffer(indexBuffer.get());
|
||||||
indexBuffer.release();
|
indexBuffer.release();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue