Ejemplo n.º 1
0
	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);
	}
Ejemplo n.º 2
0
	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;
	}
Ejemplo n.º 3
0
	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;
	}