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);
}
示例#2
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;
}
示例#3
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;
}