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

Former-commit-id: 594f3f2c31f30122889e8b3f2dd214b09455b640 [formerly 085c770b3effaa2faf9b61fa32280a7957f71258]
Former-commit-id: a54711d1cfb80f2792a80174a5808bb44d2095f3
This commit is contained in:
Lynix 2016-07-08 08:35:36 +02:00
parent b3e888563b
commit a1108ed955
2 changed files with 55 additions and 41 deletions

View File

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

View File

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