VertexMapper::VertexMapper(SubMesh* subMesh, BufferAccess access) { ErrorFlags flags(ErrorFlag_ThrowException, true); VertexBuffer* buffer = nullptr; switch (subMesh->GetAnimationType()) { case AnimationType_Skeletal: { SkeletalMesh* skeletalMesh = static_cast<SkeletalMesh*>(subMesh); buffer = skeletalMesh->GetVertexBuffer(); break; } case AnimationType_Static: { StaticMesh* staticMesh = static_cast<StaticMesh*>(subMesh); buffer = staticMesh->GetVertexBuffer(); break; } } if (!buffer) { NazaraInternalError("Animation type not handled (0x" + String::Number(subMesh->GetAnimationType(), 16) + ')'); } m_mapper.Map(buffer, access); }
void Mesh::Transform(const Matrix4f& matrix) { #if NAZARA_UTILITY_SAFE if (!m_impl) { NazaraError("Mesh not created"); return; } if (m_impl->animationType != AnimationType_Static) { NazaraError("Mesh must be static"); return; } #endif if (matrix.IsIdentity()) return; for (SubMesh* subMesh : m_impl->subMeshes) { StaticMesh* staticMesh = static_cast<StaticMesh*>(subMesh); BufferMapper<VertexBuffer> mapper(staticMesh->GetVertexBuffer(), BufferAccess_ReadWrite); MeshVertex* vertices = static_cast<MeshVertex*>(mapper.GetPointer()); Boxf 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 Mesh::Recenter() { #if NAZARA_UTILITY_SAFE if (!m_impl) { NazaraError("Mesh not created"); return; } if (m_impl->animationType != AnimationType_Static) { NazaraError("Mesh must be static"); return; } #endif // Le centre de notre mesh est le centre de l'AABB *globale* Vector3f center = GetAABB().GetCenter(); for (SubMesh* subMesh : m_impl->subMeshes) { StaticMesh* staticMesh = static_cast<StaticMesh*>(subMesh); BufferMapper<VertexBuffer> mapper(staticMesh->GetVertexBuffer(), BufferAccess_ReadWrite); MeshVertex* vertices = static_cast<MeshVertex*>(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é Boxf aabb = staticMesh->GetAABB(); aabb.Translate(-center); staticMesh->SetAABB(aabb); } // Il ne faut pas oublier d'invalider notre AABB m_impl->aabbUpdated = false; }