diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index 78d94f709..dae845835 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -76,6 +76,7 @@ class NAZARA_API NzMesh : public NzResource, NzResourceListener const NzSubMesh* GetSubMesh(unsigned int index) const; unsigned int GetSubMeshCount() const; int GetSubMeshIndex(const NzString& identifier) const; + unsigned int GetTriangleCount() const; unsigned int GetVertexCount() const; bool HasSubMesh(const NzString& identifier) const; diff --git a/include/Nazara/Utility/SubMesh.hpp b/include/Nazara/Utility/SubMesh.hpp index c19c59d1a..112ef5b91 100644 --- a/include/Nazara/Utility/SubMesh.hpp +++ b/include/Nazara/Utility/SubMesh.hpp @@ -40,6 +40,7 @@ class NAZARA_API NzSubMesh : public NzResource unsigned int GetMaterialIndex() const; const NzMesh* GetParent() const; nzPrimitiveType GetPrimitiveType() const; + unsigned int GetTriangleCount() const; virtual unsigned int GetVertexCount() const = 0; virtual bool IsAnimated() const = 0; diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index 6448a3b0a..af2f5617f 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -472,6 +472,23 @@ int NzMesh::GetSubMeshIndex(const NzString& identifier) const return it->second; } +unsigned int NzMesh::GetTriangleCount() const +{ + #if NAZARA_UTILITY_SAFE + if (!m_impl) + { + NazaraError("Mesh not created"); + return 0; + } + #endif + + unsigned int triangleCount = 0; + for (NzSubMesh* subMesh : m_impl->subMeshes) + triangleCount += subMesh->GetTriangleCount(); + + return triangleCount; +} + unsigned int NzMesh::GetVertexCount() const { #if NAZARA_UTILITY_SAFE diff --git a/src/Nazara/Utility/SubMesh.cpp b/src/Nazara/Utility/SubMesh.cpp index 50aef377b..99dc1c082 100644 --- a/src/Nazara/Utility/SubMesh.cpp +++ b/src/Nazara/Utility/SubMesh.cpp @@ -151,6 +151,36 @@ nzPrimitiveType NzSubMesh::GetPrimitiveType() const return m_primitiveType; } +unsigned int NzSubMesh::GetTriangleCount() const +{ + const NzIndexBuffer* indexBuffer = GetIndexBuffer(); + unsigned int indexCount; + if (indexBuffer) + indexCount = indexBuffer->GetIndexCount(); + else + indexCount = GetVertexCount(); + + switch (m_primitiveType) + { + case nzPrimitiveType_LineList: + case nzPrimitiveType_LineStrip: + case nzPrimitiveType_PointList: + return 0; + + case nzPrimitiveType_TriangleFan: + return (indexCount - 1) / 2; + + case nzPrimitiveType_TriangleList: + return indexCount / 3; + + case nzPrimitiveType_TriangleStrip: + return indexCount - 2; + } + + NazaraError("Primitive type not handled (0x" + NzString::Number(m_primitiveType, 16) + ')'); + return 0; +} + unsigned int NzSubMesh::GetMaterialIndex() const { return m_matIndex;