Utility: Allow TriangleIterator and VertexMapper to take constant submesh

Former-commit-id: f2a4eeeecf5868a2e51289d3d25d878be9b6bf3d [formerly 028fafc2cf156502a22dd269ac8b14a9accaf80c]
Former-commit-id: 32c9bb55cb63030e67f3287d4c26ef29f1edccbf
This commit is contained in:
Lynix 2016-07-08 08:36:42 +02:00
parent 18e03246fa
commit 96dd854ec9
4 changed files with 49 additions and 4 deletions

View File

@ -19,7 +19,7 @@ namespace Nz
{ {
public: public:
TriangleIterator(PrimitiveMode primitiveMode, const IndexBuffer* indexBuffer); TriangleIterator(PrimitiveMode primitiveMode, const IndexBuffer* indexBuffer);
TriangleIterator(SubMesh* subMesh); TriangleIterator(const SubMesh* subMesh);
~TriangleIterator() = default; ~TriangleIterator() = default;
bool Advance(); bool Advance();

View File

@ -22,6 +22,8 @@ namespace Nz
public: public:
VertexMapper(SubMesh* subMesh, BufferAccess access = BufferAccess_ReadWrite); VertexMapper(SubMesh* subMesh, BufferAccess access = BufferAccess_ReadWrite);
VertexMapper(VertexBuffer* vertexBuffer, BufferAccess access = BufferAccess_ReadWrite); VertexMapper(VertexBuffer* vertexBuffer, BufferAccess access = BufferAccess_ReadWrite);
VertexMapper(const SubMesh* subMesh, BufferAccess access = BufferAccess_ReadOnly);
VertexMapper(const VertexBuffer* vertexBuffer, BufferAccess access = BufferAccess_ReadOnly);
~VertexMapper(); ~VertexMapper();
template<typename T> SparsePtr<T> GetComponentPtr(VertexComponent component); template<typename T> SparsePtr<T> GetComponentPtr(VertexComponent component);

View File

@ -17,12 +17,19 @@ namespace Nz
m_triangleIndices[1] = m_indexMapper.Get(1); m_triangleIndices[1] = m_indexMapper.Get(1);
m_triangleIndices[2] = m_indexMapper.Get(2); m_triangleIndices[2] = m_indexMapper.Get(2);
m_indexCount = indexBuffer->GetIndexCount(); m_indexCount = m_indexMapper.GetIndexCount();
} }
TriangleIterator::TriangleIterator(SubMesh* subMesh) : TriangleIterator::TriangleIterator(const SubMesh* subMesh) :
TriangleIterator(subMesh->GetPrimitiveMode(), subMesh->GetIndexBuffer()) m_primitiveMode(subMesh->GetPrimitiveMode()),
m_indexMapper(subMesh, BufferAccess_ReadOnly)
{ {
m_currentIndex = 3;
m_triangleIndices[0] = m_indexMapper.Get(0);
m_triangleIndices[1] = m_indexMapper.Get(1);
m_triangleIndices[2] = m_indexMapper.Get(2);
m_indexCount = m_indexMapper.GetIndexCount();
} }
bool TriangleIterator::Advance() bool TriangleIterator::Advance()

View File

@ -48,6 +48,42 @@ namespace Nz
m_mapper.Map(vertexBuffer, access); m_mapper.Map(vertexBuffer, access);
} }
VertexMapper::VertexMapper(const SubMesh* subMesh, BufferAccess access)
{
ErrorFlags flags(ErrorFlag_ThrowException, true);
const VertexBuffer* buffer = nullptr;
switch (subMesh->GetAnimationType())
{
case AnimationType_Skeletal:
{
const SkeletalMesh* skeletalMesh = static_cast<const SkeletalMesh*>(subMesh);
buffer = skeletalMesh->GetVertexBuffer();
break;
}
case AnimationType_Static:
{
const StaticMesh* staticMesh = static_cast<const StaticMesh*>(subMesh);
buffer = staticMesh->GetVertexBuffer();
break;
}
}
if (!buffer)
{
NazaraInternalError("Animation type not handled (0x" + String::Number(subMesh->GetAnimationType(), 16) + ')');
}
m_mapper.Map(buffer, access);
}
VertexMapper::VertexMapper(const VertexBuffer* vertexBuffer, BufferAccess access)
{
ErrorFlags flags(ErrorFlag_ThrowException, true);
m_mapper.Map(vertexBuffer, access);
}
VertexMapper::~VertexMapper() = default; VertexMapper::~VertexMapper() = default;
void VertexMapper::Unmap() void VertexMapper::Unmap()