示例#1
0
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;
}