Utility/IndexMapper: Makes it work without index buffers (sequential mode)

Former-commit-id: 805f95b42ef40b122074eb0b8305d5d52cc019fd [formerly bdc844eb63e4f0fe94c42c714a8d5ec8d0032da4]
Former-commit-id: 0eb451037196a079228def2549e9ca7c194fd3f1
This commit is contained in:
Lynix 2016-07-08 08:35:36 +02:00
parent 77b2badcbc
commit 7460131cdb
2 changed files with 55 additions and 41 deletions

View File

@ -23,9 +23,10 @@ namespace Nz
class NAZARA_UTILITY_API IndexMapper
{
public:
IndexMapper(IndexBuffer* indexBuffer, BufferAccess access = BufferAccess_ReadWrite);
IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access = BufferAccess_ReadOnly);
IndexMapper(const SubMesh* subMesh);
IndexMapper(IndexBuffer* indexBuffer, BufferAccess access = BufferAccess_ReadWrite, std::size_t indexCount = 0);
IndexMapper(SubMesh* subMesh, BufferAccess access = BufferAccess_ReadWrite);
IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access = BufferAccess_ReadOnly, std::size_t indexCount = 0);
IndexMapper(const SubMesh* subMesh, BufferAccess access = BufferAccess_ReadOnly);
~IndexMapper() = default;
UInt32 Get(unsigned int i) const;

View File

@ -12,6 +12,13 @@ namespace Nz
{
namespace
{
UInt32 GetterSequential(const void* buffer, unsigned int i)
{
NazaraUnused(buffer);
return i;
}
UInt32 Getter16(const void* buffer, unsigned int i)
{
const UInt16* ptr = static_cast<const UInt16*>(buffer);
@ -42,17 +49,13 @@ namespace Nz
}
}
IndexMapper::IndexMapper(IndexBuffer* indexBuffer, BufferAccess access) :
m_indexCount(indexBuffer->GetIndexCount())
IndexMapper::IndexMapper(IndexBuffer* indexBuffer, BufferAccess access, std::size_t indexCount) :
m_indexCount((indexCount != 0) ? indexCount : indexBuffer->GetIndexCount())
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
}
#endif
NazaraAssert(indexCount != 0 || indexBuffer, "Invalid index count with invalid index buffer");
if (indexBuffer)
{
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
@ -73,19 +76,26 @@ namespace Nz
m_setter = SetterError;
}
}
IndexMapper::IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access) :
m_setter(SetterError),
m_indexCount(indexBuffer->GetIndexCount())
else
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
m_getter = GetterSequential;
m_setter = SetterError;
}
}
#endif
IndexMapper::IndexMapper(SubMesh* subMesh, BufferAccess access) :
IndexMapper(subMesh->GetIndexBuffer(), access, (subMesh->GetIndexBuffer()) ? 0 : subMesh->GetVertexCount())
{
}
IndexMapper::IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access, std::size_t indexCount) :
m_setter(SetterError),
m_indexCount((indexCount != 0) ? indexCount : indexBuffer->GetIndexCount())
{
NazaraAssert(indexCount != 0 || indexBuffer, "Invalid index count with invalid index buffer");
if (indexBuffer)
{
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
@ -94,9 +104,12 @@ namespace Nz
else
m_getter = Getter16;
}
else
m_getter = GetterSequential;
}
IndexMapper::IndexMapper(const SubMesh* subMesh) :
IndexMapper(subMesh->GetIndexBuffer())
IndexMapper::IndexMapper(const SubMesh* subMesh, BufferAccess access) :
IndexMapper(subMesh->GetIndexBuffer(), access, (subMesh->GetIndexBuffer()) ? 0 : subMesh->GetVertexCount())
{
}