Fixed AABBs being larger than mesh/skeleton

When mesh/skeleton was not centered


Former-commit-id: 595b234c20ae0447fe0c2263d4e000d87fea7300
This commit is contained in:
Lynix 2013-06-09 16:14:51 +02:00
parent 542ce665c2
commit 346415e860
3 changed files with 20 additions and 18 deletions

View File

@ -401,10 +401,15 @@ const NzBoxf& NzMesh::GetAABB() const
if (!m_impl->aabbUpdated) if (!m_impl->aabbUpdated)
{ {
m_impl->aabb.MakeZero(); unsigned int subMeshCount = m_impl->subMeshes.size();
if (subMeshCount > 0)
for (NzSubMesh* subMesh : m_impl->subMeshes) {
m_impl->aabb.ExtendTo(subMesh->GetAABB()); m_impl->aabb.Set(m_impl->subMeshes[0]->GetAABB());
for (unsigned int i = 1; i < subMeshCount; ++i)
m_impl->aabb.ExtendTo(m_impl->subMeshes[i]->GetAABB());
}
else
m_impl->aabb.MakeZero();
m_impl->aabbUpdated = true; m_impl->aabbUpdated = true;
} }

View File

@ -65,10 +65,15 @@ const NzBoxf& NzSkeleton::GetAABB() const
if (!m_impl->aabbUpdated) if (!m_impl->aabbUpdated)
{ {
m_impl->aabb.MakeZero(); unsigned int jointCount = m_impl->joints.size();
if (jointCount > 0)
for (unsigned int i = 0; i < m_impl->joints.size(); ++i) {
m_impl->aabb.ExtendTo(m_impl->joints[i].GetPosition()); m_impl->aabb.Set(m_impl->joints[0].GetPosition());
for (unsigned int i = 1; i < jointCount; ++i)
m_impl->aabb.ExtendTo(m_impl->joints[i].GetPosition());
}
else
m_impl->aabb.MakeZero();
m_impl->aabbUpdated = true; m_impl->aabbUpdated = true;
} }

View File

@ -4,6 +4,7 @@
#include <Nazara/Utility/StaticMesh.hpp> #include <Nazara/Utility/StaticMesh.hpp>
#include <Nazara/Core/Error.hpp> #include <Nazara/Core/Error.hpp>
#include <Nazara/Utility/Algorithm.hpp>
#include <Nazara/Utility/BufferMapper.hpp> #include <Nazara/Utility/BufferMapper.hpp>
#include <Nazara/Utility/Mesh.hpp> #include <Nazara/Utility/Mesh.hpp>
#include <stdexcept> #include <stdexcept>
@ -56,16 +57,7 @@ bool NzStaticMesh::GenerateAABB()
{ {
// On lock le buffer pour itérer sur toutes les positions et composer notre AABB // On lock le buffer pour itérer sur toutes les positions et composer notre AABB
NzBufferMapper<NzVertexBuffer> mapper(m_vertexBuffer, nzBufferAccess_ReadOnly); NzBufferMapper<NzVertexBuffer> mapper(m_vertexBuffer, nzBufferAccess_ReadOnly);
m_aabb = NzComputeVerticesAABB(static_cast<const NzMeshVertex*>(mapper.GetPointer()), m_vertexBuffer->GetVertexCount());
m_aabb.MakeZero();
NzMeshVertex* vertex = reinterpret_cast<NzMeshVertex*>(mapper.GetPointer());
unsigned int vertexCount = m_vertexBuffer->GetVertexCount();
for (unsigned int i = 0; i < vertexCount; ++i)
{
m_aabb.ExtendTo(vertex->position);
vertex++;
}
return true; return true;
} }