void NzMesh::Transform(const NzMatrix4f& matrix) { #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 if (matrix.IsIdentity()) return; for (NzSubMesh* subMesh : m_impl->subMeshes) { NzStaticMesh* staticMesh = static_cast<NzStaticMesh*>(subMesh); NzBufferMapper<NzVertexBuffer> mapper(staticMesh->GetVertexBuffer(), nzBufferAccess_ReadWrite); NzMeshVertex* vertices = static_cast<NzMeshVertex*>(mapper.GetPointer()); NzBoxf aabb(vertices->position.x, vertices->position.y, vertices->position.z, 0.f, 0.f, 0.f); unsigned int vertexCount = staticMesh->GetVertexCount(); for (unsigned int i = 0; i < vertexCount; ++i) { vertices->position = matrix.Transform(vertices->position); aabb.ExtendTo(vertices->position); vertices++; } staticMesh->SetAABB(aabb); } // Il ne faut pas oublier d'invalider notre AABB m_impl->aabbUpdated = false; }
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 // Le centre de notre mesh est le centre de l'AABB *globale* NzVector3f center = GetAABB().GetCenter(); for (NzSubMesh* subMesh : m_impl->subMeshes) { NzStaticMesh* staticMesh = static_cast<NzStaticMesh*>(subMesh); NzBufferMapper<NzVertexBuffer> mapper(staticMesh->GetVertexBuffer(), nzBufferAccess_ReadWrite); NzMeshVertex* vertices = static_cast<NzMeshVertex*>(mapper.GetPointer()); unsigned int vertexCount = staticMesh->GetVertexCount(); for (unsigned int i = 0; i < vertexCount; ++i) { vertices->position -= center; vertices++; } // l'AABB ne change pas de dimensions mais seulement de position, appliquons-lui le même procédé NzBoxf aabb = staticMesh->GetAABB(); aabb.Translate(-center); staticMesh->SetAABB(aabb); } // Il ne faut pas oublier d'invalider notre AABB m_impl->aabbUpdated = false; }