NzVertexMapper::NzVertexMapper(NzSubMesh* subMesh, nzBufferAccess access) { NzErrorFlags flags(nzErrorFlag_ThrowException, true); NzVertexBuffer* buffer = nullptr; switch (subMesh->GetAnimationType()) { case nzAnimationType_Skeletal: { NzSkeletalMesh* skeletalMesh = static_cast<NzSkeletalMesh*>(subMesh); buffer = skeletalMesh->GetVertexBuffer(); break; } case nzAnimationType_Static: { NzStaticMesh* staticMesh = static_cast<NzStaticMesh*>(subMesh); buffer = staticMesh->GetVertexBuffer(); break; } } if (!buffer) { NazaraInternalError("Animation type not handled (0x" + NzString::Number(subMesh->GetAnimationType(), 16) + ')'); } m_mapper.Map(buffer, access); }
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; }