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)
{
m_impl->aabb.MakeZero();
for (NzSubMesh* subMesh : m_impl->subMeshes)
m_impl->aabb.ExtendTo(subMesh->GetAABB());
unsigned int subMeshCount = m_impl->subMeshes.size();
if (subMeshCount > 0)
{
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;
}

View File

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

View File

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