Refactored TriangleIterator/VertexMapper
Former-commit-id: b8d4fc79142b36519ebe1879276415fe30970d3e
This commit is contained in:
parent
5048705702
commit
b86332a51b
|
|
@ -27,12 +27,12 @@ class NAZARA_API NzTriangleIterator
|
||||||
NzVector3f GetNormal(unsigned int i) const;
|
NzVector3f GetNormal(unsigned int i) const;
|
||||||
NzVector3f GetPosition(unsigned int i) const;
|
NzVector3f GetPosition(unsigned int i) const;
|
||||||
NzVector3f GetTangent(unsigned int i) const;
|
NzVector3f GetTangent(unsigned int i) const;
|
||||||
NzVector2f GetTexCoords(unsigned int i) const;
|
NzVector2f GetTexCoord(unsigned int i) const;
|
||||||
|
|
||||||
void SetNormal(unsigned int i, const NzVector3f& normal);
|
void SetNormal(unsigned int i, const NzVector3f& normal);
|
||||||
void SetPosition(unsigned int i, const NzVector3f& position);
|
void SetPosition(unsigned int i, const NzVector3f& position);
|
||||||
void SetTangent(unsigned int i, const NzVector3f& tangent);
|
void SetTangent(unsigned int i, const NzVector3f& tangent);
|
||||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords);
|
void SetTexCoord(unsigned int i, const NzVector2f& texCoords);
|
||||||
|
|
||||||
void Unmap();
|
void Unmap();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,12 @@
|
||||||
#include <Nazara/Prerequesites.hpp>
|
#include <Nazara/Prerequesites.hpp>
|
||||||
#include <Nazara/Math/Vector2.hpp>
|
#include <Nazara/Math/Vector2.hpp>
|
||||||
#include <Nazara/Math/Vector3.hpp>
|
#include <Nazara/Math/Vector3.hpp>
|
||||||
|
#include <Nazara/Utility/BufferMapper.hpp>
|
||||||
#include <Nazara/Utility/Enums.hpp>
|
#include <Nazara/Utility/Enums.hpp>
|
||||||
|
#include <Nazara/Utility/Mesh.hpp>
|
||||||
|
|
||||||
class NzSubMesh;
|
class NzSubMesh;
|
||||||
|
|
||||||
class NzVertexMapperImpl;
|
|
||||||
|
|
||||||
class NAZARA_API NzVertexMapper
|
class NAZARA_API NzVertexMapper
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -25,18 +25,20 @@ class NAZARA_API NzVertexMapper
|
||||||
NzVector3f GetNormal(unsigned int i) const;
|
NzVector3f GetNormal(unsigned int i) const;
|
||||||
NzVector3f GetPosition(unsigned int i) const;
|
NzVector3f GetPosition(unsigned int i) const;
|
||||||
NzVector3f GetTangent(unsigned int i) const;
|
NzVector3f GetTangent(unsigned int i) const;
|
||||||
NzVector2f GetTexCoords(unsigned int i) const;
|
NzVector2f GetTexCoord(unsigned int i) const;
|
||||||
unsigned int GetVertexCount();
|
unsigned int GetVertexCount();
|
||||||
|
|
||||||
void SetNormal(unsigned int i, const NzVector3f& normal);
|
void SetNormal(unsigned int i, const NzVector3f& normal);
|
||||||
void SetPosition(unsigned int i, const NzVector3f& position);
|
void SetPosition(unsigned int i, const NzVector3f& position);
|
||||||
void SetTangent(unsigned int i, const NzVector3f& tangent);
|
void SetTangent(unsigned int i, const NzVector3f& tangent);
|
||||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords);
|
void SetTexCoord(unsigned int i, const NzVector2f& texCoord);
|
||||||
|
|
||||||
void Unmap();
|
void Unmap();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NzVertexMapperImpl* m_impl;
|
NzBufferMapper<NzVertexBuffer> m_mapper;
|
||||||
|
NzMeshVertex* m_vertices;
|
||||||
|
unsigned int m_vertexCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NAZARA_VERTEXMAPPER_HPP
|
#endif // NAZARA_VERTEXMAPPER_HPP
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ NzVector3f NzTriangleIterator::GetTangent(unsigned int i) const
|
||||||
return m_vertexMapper.GetTangent(m_triangleIndices[i]);
|
return m_vertexMapper.GetTangent(m_triangleIndices[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
NzVector2f NzTriangleIterator::GetTexCoords(unsigned int i) const
|
NzVector2f NzTriangleIterator::GetTexCoord(unsigned int i) const
|
||||||
{
|
{
|
||||||
#if NAZARA_UTILITY_SAFE
|
#if NAZARA_UTILITY_SAFE
|
||||||
if (i > 2)
|
if (i > 2)
|
||||||
|
|
@ -108,7 +108,7 @@ NzVector2f NzTriangleIterator::GetTexCoords(unsigned int i) const
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return m_vertexMapper.GetTexCoords(m_triangleIndices[i]);
|
return m_vertexMapper.GetTexCoord(m_triangleIndices[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzTriangleIterator::SetNormal(unsigned int i, const NzVector3f& normal)
|
void NzTriangleIterator::SetNormal(unsigned int i, const NzVector3f& normal)
|
||||||
|
|
@ -150,7 +150,7 @@ void NzTriangleIterator::SetTangent(unsigned int i, const NzVector3f& tangent)
|
||||||
m_vertexMapper.SetTangent(m_triangleIndices[i], tangent);
|
m_vertexMapper.SetTangent(m_triangleIndices[i], tangent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzTriangleIterator::SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
void NzTriangleIterator::SetTexCoord(unsigned int i, const NzVector2f& texCoords)
|
||||||
{
|
{
|
||||||
#if NAZARA_UTILITY_SAFE
|
#if NAZARA_UTILITY_SAFE
|
||||||
if (i > 2)
|
if (i > 2)
|
||||||
|
|
@ -160,7 +160,7 @@ void NzTriangleIterator::SetTexCoords(unsigned int i, const NzVector2f& texCoord
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_vertexMapper.SetTexCoords(m_triangleIndices[i], texCoords);
|
m_vertexMapper.SetTexCoord(m_triangleIndices[i], texCoords);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzTriangleIterator::Unmap()
|
void NzTriangleIterator::Unmap()
|
||||||
|
|
|
||||||
|
|
@ -5,259 +5,94 @@
|
||||||
#include <Nazara/Utility/VertexMapper.hpp>
|
#include <Nazara/Utility/VertexMapper.hpp>
|
||||||
#include <Nazara/Utility/BufferMapper.hpp>
|
#include <Nazara/Utility/BufferMapper.hpp>
|
||||||
#include <Nazara/Utility/Config.hpp>
|
#include <Nazara/Utility/Config.hpp>
|
||||||
#include <Nazara/Utility/Mesh.hpp> // NzMeshVertex
|
|
||||||
#include <Nazara/Utility/SkeletalMesh.hpp>
|
#include <Nazara/Utility/SkeletalMesh.hpp>
|
||||||
#include <Nazara/Utility/StaticMesh.hpp>
|
#include <Nazara/Utility/StaticMesh.hpp>
|
||||||
#include <Nazara/Utility/SubMesh.hpp>
|
#include <Nazara/Utility/SubMesh.hpp>
|
||||||
#include <Nazara/Utility/Debug.hpp>
|
#include <Nazara/Utility/Debug.hpp>
|
||||||
|
|
||||||
class NzVertexMapperImpl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
NzVertexMapperImpl() = default;
|
|
||||||
virtual ~NzVertexMapperImpl() = default;
|
|
||||||
|
|
||||||
virtual NzVector3f GetNormal(unsigned int i) const = 0;
|
|
||||||
virtual NzVector3f GetPosition(unsigned int i) const = 0;
|
|
||||||
virtual NzVector3f GetTangent(unsigned int i) const = 0;
|
|
||||||
virtual NzVector2f GetTexCoords(unsigned int i) const = 0;
|
|
||||||
virtual unsigned int GetVertexCount() const = 0;
|
|
||||||
|
|
||||||
virtual void SetNormal(unsigned int i, const NzVector3f& normal) = 0;
|
|
||||||
virtual void SetPosition(unsigned int i, const NzVector3f& position) = 0;
|
|
||||||
virtual void SetTangent(unsigned int i, const NzVector3f& tangent) = 0;
|
|
||||||
virtual void SetTexCoords(unsigned int i, const NzVector2f& texCoords) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
class SubMeshVertexMapper : public NzVertexMapperImpl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SubMeshVertexMapper(NzSubMesh* subMesh) :
|
|
||||||
m_subMesh(subMesh)
|
|
||||||
{
|
|
||||||
#if NAZARA_UTILITY_SAFE
|
|
||||||
if (!m_subMesh)
|
|
||||||
{
|
|
||||||
NazaraError("Invalid subMesh"); ///TODO: Unexpected
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~SubMeshVertexMapper() noexcept
|
|
||||||
{
|
|
||||||
m_subMesh->Finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
NzSubMeshRef m_subMesh;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SkeletalMeshVertexMapper : public SubMeshVertexMapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SkeletalMeshVertexMapper(NzSkeletalMesh* subMesh) :
|
|
||||||
SubMeshVertexMapper(subMesh),
|
|
||||||
m_mesh(subMesh)
|
|
||||||
{
|
|
||||||
m_vertices = reinterpret_cast<NzMeshVertex*>(m_mesh->GetBindPoseBuffer());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~SkeletalMeshVertexMapper() noexcept
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f GetNormal(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f GetPosition(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].position;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f GetTangent(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].tangent;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector2f GetTexCoords(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].uv;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetVertexCount() const
|
|
||||||
{
|
|
||||||
return m_mesh->GetVertexCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetNormal(unsigned int i, const NzVector3f& normal)
|
|
||||||
{
|
|
||||||
m_vertices[i].normal = normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetPosition(unsigned int i, const NzVector3f& position)
|
|
||||||
{
|
|
||||||
m_vertices[i].position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetTangent(unsigned int i, const NzVector3f& tangent)
|
|
||||||
{
|
|
||||||
m_vertices[i].tangent = tangent;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
|
||||||
{
|
|
||||||
m_vertices[i].uv = texCoords;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
NzMeshVertex* m_vertices;
|
|
||||||
NzSkeletalMesh* m_mesh;
|
|
||||||
};
|
|
||||||
|
|
||||||
class StaticMeshVertexMapper : public SubMeshVertexMapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
StaticMeshVertexMapper(NzStaticMesh* subMesh) :
|
|
||||||
SubMeshVertexMapper(subMesh),
|
|
||||||
m_vertexMapper(subMesh->GetVertexBuffer(), nzBufferAccess_ReadWrite)
|
|
||||||
{
|
|
||||||
m_vertices = reinterpret_cast<NzMeshVertex*>(m_vertexMapper.GetPointer());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~StaticMeshVertexMapper() noexcept
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f GetNormal(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f GetPosition(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].position;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f GetTangent(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].tangent;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector2f GetTexCoords(unsigned int i) const
|
|
||||||
{
|
|
||||||
return m_vertices[i].uv;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int GetVertexCount() const
|
|
||||||
{
|
|
||||||
return m_vertexMapper.GetBuffer()->GetVertexCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetNormal(unsigned int i, const NzVector3f& normal)
|
|
||||||
{
|
|
||||||
m_vertices[i].normal = normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetPosition(unsigned int i, const NzVector3f& position)
|
|
||||||
{
|
|
||||||
m_vertices[i].position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetTangent(unsigned int i, const NzVector3f& tangent)
|
|
||||||
{
|
|
||||||
m_vertices[i].tangent = tangent;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
|
||||||
{
|
|
||||||
m_vertices[i].uv = texCoords;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
NzBufferMapper<NzVertexBuffer> m_vertexMapper;
|
|
||||||
NzMeshVertex* m_vertices;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVertexMapper::NzVertexMapper(NzSubMesh* subMesh)
|
NzVertexMapper::NzVertexMapper(NzSubMesh* subMesh)
|
||||||
{
|
{
|
||||||
|
#ifdef NAZARA_DEBUG
|
||||||
|
m_vertices = nullptr; // Pour détecter les erreurs
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (subMesh->GetAnimationType())
|
switch (subMesh->GetAnimationType())
|
||||||
{
|
{
|
||||||
case nzAnimationType_Skeletal:
|
case nzAnimationType_Skeletal:
|
||||||
m_impl = new SkeletalMeshVertexMapper(static_cast<NzSkeletalMesh*>(subMesh));
|
m_vertices = reinterpret_cast<NzMeshVertex*>(static_cast<NzSkeletalMesh*>(subMesh)->GetBindPoseBuffer());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case nzAnimationType_Static:
|
case nzAnimationType_Static:
|
||||||
m_impl = new StaticMeshVertexMapper(static_cast<NzStaticMesh*>(subMesh));
|
if (!m_mapper.Map(static_cast<NzStaticMesh*>(subMesh)->GetVertexBuffer(), nzBufferAccess_ReadWrite))
|
||||||
|
NazaraError("Failed to map buffer"); ///TODO: Unexpected
|
||||||
|
|
||||||
|
m_vertices = reinterpret_cast<NzMeshVertex*>(m_mapper.GetPointer());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NAZARA_DEBUG
|
#ifdef NAZARA_DEBUG
|
||||||
if (!m_impl)
|
if (!m_vertices)
|
||||||
NazaraInternalError("No impl"); ///TODO: Internal, Unexpected
|
NazaraInternalError("No vertices"); ///TODO: Internal, Unexpected
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
m_vertexCount = subMesh->GetVertexCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
NzVertexMapper::~NzVertexMapper()
|
NzVertexMapper::~NzVertexMapper() = default;
|
||||||
{
|
|
||||||
delete m_impl;
|
|
||||||
}
|
|
||||||
|
|
||||||
NzVector3f NzVertexMapper::GetNormal(unsigned int i) const
|
NzVector3f NzVertexMapper::GetNormal(unsigned int i) const
|
||||||
{
|
{
|
||||||
return m_impl->GetNormal(i);
|
#if NAZARA_UTILITY_SAFE
|
||||||
|
if (i >= m_vertexCount)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return m_vertices[i].normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
NzVector3f NzVertexMapper::GetPosition(unsigned int i) const
|
NzVector3f NzVertexMapper::GetPosition(unsigned int i) const
|
||||||
{
|
{
|
||||||
return m_impl->GetPosition(i);
|
return m_vertices[i].position;
|
||||||
}
|
}
|
||||||
|
|
||||||
NzVector3f NzVertexMapper::GetTangent(unsigned int i) const
|
NzVector3f NzVertexMapper::GetTangent(unsigned int i) const
|
||||||
{
|
{
|
||||||
return m_impl->GetTangent(i);
|
return m_vertices[i].tangent;
|
||||||
}
|
}
|
||||||
|
|
||||||
NzVector2f NzVertexMapper::GetTexCoords(unsigned int i) const
|
NzVector2f NzVertexMapper::GetTexCoord(unsigned int i) const
|
||||||
{
|
{
|
||||||
return m_impl->GetTexCoords(i);
|
return m_vertices[i].uv;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int NzVertexMapper::GetVertexCount()
|
unsigned int NzVertexMapper::GetVertexCount()
|
||||||
{
|
{
|
||||||
return m_impl->GetVertexCount();
|
return m_vertexCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzVertexMapper::SetNormal(unsigned int i, const NzVector3f& normal)
|
void NzVertexMapper::SetNormal(unsigned int i, const NzVector3f& normal)
|
||||||
{
|
{
|
||||||
m_impl->SetNormal(i, normal);
|
m_vertices[i].normal = normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzVertexMapper::SetPosition(unsigned int i, const NzVector3f& position)
|
void NzVertexMapper::SetPosition(unsigned int i, const NzVector3f& position)
|
||||||
{
|
{
|
||||||
m_impl->SetPosition(i, position);
|
m_vertices[i].position = position;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzVertexMapper::SetTangent(unsigned int i, const NzVector3f& tangent)
|
void NzVertexMapper::SetTangent(unsigned int i, const NzVector3f& tangent)
|
||||||
{
|
{
|
||||||
m_impl->SetTangent(i, tangent);
|
m_vertices[i].tangent = tangent;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzVertexMapper::SetTexCoords(unsigned int i, const NzVector2f& texCoords)
|
void NzVertexMapper::SetTexCoord(unsigned int i, const NzVector2f& texCoord)
|
||||||
{
|
{
|
||||||
m_impl->SetTexCoords(i, texCoords);
|
m_vertices[i].uv = texCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzVertexMapper::Unmap()
|
void NzVertexMapper::Unmap()
|
||||||
{
|
{
|
||||||
if (m_impl)
|
m_mapper.Unmap();
|
||||||
{
|
|
||||||
delete m_impl;
|
|
||||||
m_impl = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue