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