From e689f6f09f7fb3a19f8a5a1686e8799f716c4622 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 9 Jun 2013 16:15:13 +0200 Subject: [PATCH] Added Mesh::Recenter() Former-commit-id: 07ef8b3296b835e207bfa904af29546f724e6dc3 --- include/Nazara/Utility/Mesh.hpp | 2 ++ src/Nazara/Utility/Mesh.cpp | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/Nazara/Utility/Mesh.hpp b/include/Nazara/Utility/Mesh.hpp index 6c51cb13c..311bfc11a 100644 --- a/include/Nazara/Utility/Mesh.hpp +++ b/include/Nazara/Utility/Mesh.hpp @@ -99,6 +99,8 @@ class NAZARA_API NzMesh : public NzResource, NzResourceListener bool LoadFromMemory(const void* data, std::size_t size, const NzMeshParams& params = NzMeshParams()); bool LoadFromStream(NzInputStream& stream, const NzMeshParams& params = NzMeshParams()); + void Recenter(); + void RemoveSubMesh(const NzString& identifier); void RemoveSubMesh(unsigned int index); diff --git a/src/Nazara/Utility/Mesh.cpp b/src/Nazara/Utility/Mesh.cpp index bbc06881f..f4cc6df3d 100644 --- a/src/Nazara/Utility/Mesh.cpp +++ b/src/Nazara/Utility/Mesh.cpp @@ -758,6 +758,47 @@ bool NzMesh::LoadFromStream(NzInputStream& stream, const NzMeshParams& params) return NzMeshLoader::LoadFromStream(this, stream, params); } +void NzMesh::Recenter() +{ + #if NAZARA_UTILITY_SAFE + if (!m_impl) + { + NazaraError("Mesh not created"); + return; + } + + if (m_impl->animationType != nzAnimationType_Static) + { + NazaraError("Mesh must be static"); + return; + } + #endif + + NzVector3f center = GetAABB().GetCenter(); + + for (NzSubMesh* subMesh : m_impl->subMeshes) + { + NzStaticMesh* staticMesh = static_cast(subMesh); + + NzBufferMapper mapper(staticMesh->GetVertexBuffer(), nzBufferAccess_ReadWrite); + NzMeshVertex* vertices = static_cast(mapper.GetPointer()); + + unsigned int vertexCount = staticMesh->GetVertexCount(); + for (unsigned int i = 0; i < vertexCount; ++i) + { + vertices->position -= center; + vertices++; + } + + NzBoxf aabb = staticMesh->GetAABB(); + aabb.Translate(-center); + + staticMesh->SetAABB(aabb); + } + + m_impl->aabbUpdated = false; // Notre AABB a changée +} + void NzMesh::RemoveSubMesh(const NzString& identifier) { #if NAZARA_UTILITY_SAFE