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

Former-commit-id: 93f33efed85f0f3464fa7db604dbaaa488679fcd [formerly 77614134455dd70c2bebdb611aa1043da078da9b]
Former-commit-id: 635b19330864dbbba3a15deb7cb1a70742e65cd5
This commit is contained in:
Lynix 2016-07-08 08:35:36 +02:00
parent 26289139a3
commit b9051067e0
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,61 +49,67 @@ 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 (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
if (indexBuffer)
{
m_getter = Getter32;
if (access != BufferAccess_ReadOnly)
m_setter = Setter32;
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
{
m_getter = Getter32;
if (access != BufferAccess_ReadOnly)
m_setter = Setter32;
else
m_setter = SetterError;
}
else
m_setter = SetterError;
{
m_getter = Getter16;
if (access != BufferAccess_ReadOnly)
m_setter = Setter16;
else
m_setter = SetterError;
}
}
else
{
m_getter = Getter16;
if (access != BufferAccess_ReadOnly)
m_setter = Setter16;
else
m_setter = SetterError;
m_getter = GetterSequential;
m_setter = SetterError;
}
}
IndexMapper::IndexMapper(const IndexBuffer* indexBuffer, BufferAccess access) :
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(indexBuffer->GetIndexCount())
m_indexCount((indexCount != 0) ? indexCount : indexBuffer->GetIndexCount())
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
NazaraAssert(indexCount != 0 || indexBuffer, "Invalid index count with invalid index buffer");
if (indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
m_getter = Getter32;
else
m_getter = Getter16;
}
#endif
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
m_getter = Getter32;
else
m_getter = Getter16;
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())
{
}