diff --git a/include/Nazara/Utility/SkeletalMesh.hpp b/include/Nazara/Utility/SkeletalMesh.hpp index cfc4f1a91..5a315a288 100644 --- a/include/Nazara/Utility/SkeletalMesh.hpp +++ b/include/Nazara/Utility/SkeletalMesh.hpp @@ -40,8 +40,6 @@ class NAZARA_API NzSkeletalMesh final : public NzSubMesh bool Create(unsigned int vertexCount, unsigned int weightCount); void Destroy(); - void Finish(); - const NzCubef& GetAABB() const; nzAnimationType GetAnimationType() const final; void* GetBindPoseBuffer(); diff --git a/include/Nazara/Utility/StaticMesh.hpp b/include/Nazara/Utility/StaticMesh.hpp index 8e75eacf6..231f6e05b 100644 --- a/include/Nazara/Utility/StaticMesh.hpp +++ b/include/Nazara/Utility/StaticMesh.hpp @@ -25,8 +25,6 @@ class NAZARA_API NzStaticMesh final : public NzSubMesh, NzResourceListener bool Create(NzVertexBuffer* vertexBuffer); void Destroy(); - void Finish(); - bool GenerateAABB(); const NzCubef& GetAABB() const override; diff --git a/include/Nazara/Utility/SubMesh.hpp b/include/Nazara/Utility/SubMesh.hpp index a7a530ba3..c19c59d1a 100644 --- a/include/Nazara/Utility/SubMesh.hpp +++ b/include/Nazara/Utility/SubMesh.hpp @@ -30,7 +30,9 @@ class NAZARA_API NzSubMesh : public NzResource NzSubMesh(const NzMesh* parent); virtual ~NzSubMesh(); - virtual void Finish() = 0; ///DOC: Mets le mesh dans sa position d'origine et calcule son AABB + void GenerateNormals(); + void GenerateNormalsAndTangents(); + void GenerateTangents(); virtual const NzCubef& GetAABB() const = 0; virtual nzAnimationType GetAnimationType() const = 0; diff --git a/src/Nazara/Utility/Loaders/MD2/Loader.cpp b/src/Nazara/Utility/Loaders/MD2/Loader.cpp index da2e022b1..7a09d98e8 100644 --- a/src/Nazara/Utility/Loaders/MD2/Loader.cpp +++ b/src/Nazara/Utility/Loaders/MD2/Loader.cpp @@ -214,11 +214,11 @@ namespace vertexBuffer->SetPersistent(false); vertexBuffer.release(); + subMesh->GenerateAABB(); + subMesh->GenerateTangents(); subMesh->SetMaterialIndex(0); mesh->AddSubMesh(subMesh.release()); - mesh->GenerateTangents(); - return true; } } diff --git a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp index 5fc08e9f7..ddff32ae0 100644 --- a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp +++ b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp @@ -343,6 +343,7 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) // Material mesh->SetMaterial(i, baseDir + md5Mesh.shader); + subMesh->GenerateNormalsAndTangents(); subMesh->SetMaterialIndex(i); if (!mesh->AddSubMesh(subMesh.get())) @@ -355,8 +356,6 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) } } - mesh->GenerateNormalsAndTangents(); - return true; } diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index 97a2c636e..6448a3b0a 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -10,8 +10,6 @@ #include #include #include -#include -#include #include #include #include @@ -75,7 +73,6 @@ bool NzMesh::AddSubMesh(NzSubMesh* subMesh) #endif subMesh->AddResourceListener(this, m_impl->subMeshes.size()); - subMesh->Finish(); m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->subMeshes.push_back(subMesh); @@ -121,7 +118,6 @@ bool NzMesh::AddSubMesh(const NzString& identifier, NzSubMesh* subMesh) int index = m_impl->subMeshes.size(); subMesh->AddResourceListener(this, index); - subMesh->Finish(); m_impl->aabbUpdated = false; // On invalide l'AABB m_impl->subMeshes.push_back(subMesh); @@ -185,34 +181,7 @@ void NzMesh::GenerateNormals() #endif for (NzSubMesh* subMesh : m_impl->subMeshes) - { - NzVertexMapper mapper1(subMesh); - unsigned int vertexCount = mapper1.GetVertexCount(); - for (unsigned int i = 0; i < vertexCount; ++i) - mapper1.SetNormal(i, NzVector3f::Zero()); - - mapper1.Unmap(); - - NzTriangleIterator iterator(subMesh); - do - { - NzVector3f pos0 = iterator.GetPosition(0); - - NzVector3f dv[2]; - dv[0] = iterator.GetPosition(1) - pos0; - dv[1] = iterator.GetPosition(2) - pos0; - - NzVector3f normal = dv[0].CrossProduct(dv[1]); - - for (unsigned int i = 0; i < 3; ++i) - iterator.SetNormal(i, iterator.GetNormal(i) + normal); - } - while (iterator.Advance()); - - NzVertexMapper mapper2(subMesh); - for (unsigned int i = 0; i < vertexCount; ++i) - mapper2.SetNormal(i, NzVector3f::Normalize(mapper2.GetNormal(i))); - } + subMesh->GenerateNormals(); } void NzMesh::GenerateNormalsAndTangents() @@ -226,55 +195,7 @@ void NzMesh::GenerateNormalsAndTangents() #endif for (NzSubMesh* subMesh : m_impl->subMeshes) - { - NzVertexMapper mapper1(subMesh); - unsigned int vertexCount = mapper1.GetVertexCount(); - for (unsigned int i = 0; i < vertexCount; ++i) - { - mapper1.SetNormal(i, NzVector3f::Zero()); - mapper1.SetTangent(i, NzVector3f::Zero()); - } - - mapper1.Unmap(); - - NzTriangleIterator iterator(subMesh); - do - { - NzVector3f pos0 = iterator.GetPosition(0); - NzVector2f uv0 = iterator.GetTexCoords(0); - - NzVector3f dv[2]; - dv[0] = iterator.GetPosition(1) - pos0; - dv[1] = iterator.GetPosition(2) - pos0; - - NzVector3f normal = dv[0].CrossProduct(dv[1]); - - NzVector2f duv[2]; - duv[0] = iterator.GetTexCoords(1) - uv0; - duv[1] = iterator.GetTexCoords(2) - uv0; - - float coef = 1.f / (duv[0].x*duv[1].y - duv[1].x*duv[0].y); - - NzVector3f tangent; - tangent.x = coef * (dv[0].x*duv[1].y + dv[1].x*(-duv[0].y)); - tangent.y = coef * (dv[0].y*duv[1].y + dv[1].y*(-duv[0].y)); - tangent.z = coef * (dv[0].z*duv[1].y + dv[1].z*(-duv[0].y)); - - for (unsigned int i = 0; i < 3; ++i) - { - iterator.SetNormal(i, iterator.GetNormal(i) + normal); - iterator.SetTangent(i, iterator.GetTangent(i) + tangent); - } - } - while (iterator.Advance()); - - NzVertexMapper mapper2(subMesh); - for (unsigned int i = 0; i < vertexCount; ++i) - { - mapper2.SetNormal(i, NzVector3f::Normalize(mapper2.GetNormal(i))); - mapper2.SetTangent(i, NzVector3f::Normalize(mapper2.GetTangent(i))); - } - } + subMesh->GenerateNormalsAndTangents(); } void NzMesh::GenerateTangents() @@ -288,43 +209,7 @@ void NzMesh::GenerateTangents() #endif for (NzSubMesh* subMesh : m_impl->subMeshes) - { - NzTriangleIterator iterator(subMesh); - do - { - NzVector3f pos0 = iterator.GetPosition(0); - NzVector2f uv0 = iterator.GetTexCoords(0); - - NzVector3f dv[2]; - dv[0] = iterator.GetPosition(1) - pos0; - dv[1] = iterator.GetPosition(2) - pos0; - - NzVector2f duv[2]; - duv[0] = iterator.GetTexCoords(1) - uv0; - duv[1] = iterator.GetTexCoords(2) - uv0; - - float ds[2]; - ds[0] = iterator.GetTexCoords(1).x - uv0.x; - ds[1] = iterator.GetTexCoords(2).x - uv0.x; - - NzVector3f ppt; - ppt.x = ds[0]*dv[1].x - dv[0].x*ds[1]; - ppt.y = ds[0]*dv[1].y - dv[0].y*ds[1]; - ppt.z = ds[0]*dv[1].z - dv[0].z*ds[1]; - ppt.Normalize(); - - for (unsigned int i = 0; i < 3; ++i) - { - NzVector3f normal = iterator.GetNormal(i); - float d = ppt.DotProduct(normal); - - NzVector3f tangent = ppt - (d * normal); - - iterator.SetTangent(i, tangent); - } - } - while (iterator.Advance()); - } + subMesh->GenerateTangents(); } const NzCubef& NzMesh::GetAABB() const diff --git a/src/Nazara/Utility/SkeletalMesh.cpp b/src/Nazara/Utility/SkeletalMesh.cpp index 8251f733e..fe434de2d 100644 --- a/src/Nazara/Utility/SkeletalMesh.cpp +++ b/src/Nazara/Utility/SkeletalMesh.cpp @@ -187,19 +187,6 @@ void NzSkeletalMesh::Destroy() } } -void NzSkeletalMesh::Finish() -{ - #if NAZARA_UTILITY_SAFE - if (!m_impl) - { - NazaraError("Skeletal mesh not created"); - return; - } - #endif - - // Rien à faire de particulier -} - const NzCubef& NzSkeletalMesh::GetAABB() const { #if NAZARA_UTILITY_SAFE diff --git a/src/Nazara/Utility/StaticMesh.cpp b/src/Nazara/Utility/StaticMesh.cpp index a2b818c8a..79605f383 100644 --- a/src/Nazara/Utility/StaticMesh.cpp +++ b/src/Nazara/Utility/StaticMesh.cpp @@ -52,12 +52,6 @@ void NzStaticMesh::Destroy() } } -void NzStaticMesh::Finish() -{ - // La seule chose à faire ici est de calculer l'AABB - GenerateAABB(); -} - bool NzStaticMesh::GenerateAABB() { // On lock le buffer pour itérer sur toutes les positions et composer notre AABB diff --git a/src/Nazara/Utility/SubMesh.cpp b/src/Nazara/Utility/SubMesh.cpp index 7d4374eaf..50aef377b 100644 --- a/src/Nazara/Utility/SubMesh.cpp +++ b/src/Nazara/Utility/SubMesh.cpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include #include @@ -19,6 +21,126 @@ m_matIndex(0) NzSubMesh::~NzSubMesh() = default; +void NzSubMesh::GenerateNormals() +{ + NzVertexMapper mapper1(this); + unsigned int vertexCount = mapper1.GetVertexCount(); + for (unsigned int i = 0; i < vertexCount; ++i) + mapper1.SetNormal(i, NzVector3f::Zero()); + + mapper1.Unmap(); + + NzTriangleIterator iterator(this); + do + { + NzVector3f pos0 = iterator.GetPosition(0); + + NzVector3f dv[2]; + dv[0] = iterator.GetPosition(1) - pos0; + dv[1] = iterator.GetPosition(2) - pos0; + + NzVector3f normal = dv[0].CrossProduct(dv[1]); + + for (unsigned int i = 0; i < 3; ++i) + iterator.SetNormal(i, iterator.GetNormal(i) + normal); + } + while (iterator.Advance()); + + NzVertexMapper mapper2(this); + for (unsigned int i = 0; i < vertexCount; ++i) + mapper2.SetNormal(i, NzVector3f::Normalize(mapper2.GetNormal(i))); +} + +void NzSubMesh::GenerateNormalsAndTangents() +{ + NzVertexMapper mapper1(this); + unsigned int vertexCount = mapper1.GetVertexCount(); + for (unsigned int i = 0; i < vertexCount; ++i) + { + mapper1.SetNormal(i, NzVector3f::Zero()); + mapper1.SetTangent(i, NzVector3f::Zero()); + } + + mapper1.Unmap(); + + NzTriangleIterator iterator(this); + do + { + NzVector3f pos0 = iterator.GetPosition(0); + NzVector2f uv0 = iterator.GetTexCoord(0); + + NzVector3f dv[2]; + dv[0] = iterator.GetPosition(1) - pos0; + dv[1] = iterator.GetPosition(2) - pos0; + + NzVector3f normal = dv[0].CrossProduct(dv[1]); + + NzVector2f duv[2]; + duv[0] = iterator.GetTexCoord(1) - uv0; + duv[1] = iterator.GetTexCoord(2) - uv0; + + float coef = 1.f / (duv[0].x*duv[1].y - duv[1].x*duv[0].y); + + NzVector3f tangent; + tangent.x = coef * (dv[0].x*duv[1].y + dv[1].x*(-duv[0].y)); + tangent.y = coef * (dv[0].y*duv[1].y + dv[1].y*(-duv[0].y)); + tangent.z = coef * (dv[0].z*duv[1].y + dv[1].z*(-duv[0].y)); + + for (unsigned int i = 0; i < 3; ++i) + { + iterator.SetNormal(i, iterator.GetNormal(i) + normal); + iterator.SetTangent(i, iterator.GetTangent(i) + tangent); + } + } + while (iterator.Advance()); + + NzVertexMapper mapper2(this); + for (unsigned int i = 0; i < vertexCount; ++i) + { + mapper2.SetNormal(i, NzVector3f::Normalize(mapper2.GetNormal(i))); + mapper2.SetTangent(i, NzVector3f::Normalize(mapper2.GetTangent(i))); + } +} + +void NzSubMesh::GenerateTangents() +{ + NzTriangleIterator iterator(this); + do + { + NzVector3f pos0 = iterator.GetPosition(0); + NzVector2f uv0 = iterator.GetTexCoord(0); + + NzVector3f dv[2]; + dv[0] = iterator.GetPosition(1) - pos0; + dv[1] = iterator.GetPosition(2) - pos0; + + NzVector2f duv[2]; + duv[0] = iterator.GetTexCoord(1) - uv0; + duv[1] = iterator.GetTexCoord(2) - uv0; + + float ds[2]; + ds[0] = iterator.GetTexCoord(1).x - uv0.x; + ds[1] = iterator.GetTexCoord(2).x - uv0.x; + + NzVector3f ppt; + ppt.x = ds[0]*dv[1].x - dv[0].x*ds[1]; + ppt.y = ds[0]*dv[1].y - dv[0].y*ds[1]; + ppt.z = ds[0]*dv[1].z - dv[0].z*ds[1]; + ppt.Normalize(); + + for (unsigned int i = 0; i < 3; ++i) + { + NzVector3f normal = iterator.GetNormal(i); + float d = ppt.DotProduct(normal); + + NzVector3f tangent = ppt - (d * normal); + + iterator.SetTangent(i, tangent); + } + } + while (iterator.Advance()); +} + const NzMesh* NzSubMesh::GetParent() const { return m_parent;