diff --git a/include/Nazara/Utility/IndexBuffer.hpp b/include/Nazara/Utility/IndexBuffer.hpp index 8dcb10a0b..998eefdc2 100644 --- a/include/Nazara/Utility/IndexBuffer.hpp +++ b/include/Nazara/Utility/IndexBuffer.hpp @@ -15,19 +15,20 @@ class NAZARA_API NzIndexBuffer : public NzResource { public: NzIndexBuffer(NzBuffer* buffer, unsigned int startIndex, unsigned int indexCount); - NzIndexBuffer(unsigned int length, nzUInt8 indexSize, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); + NzIndexBuffer(unsigned int length, bool largeIndices = false, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); NzIndexBuffer(const NzIndexBuffer& indexBuffer); ~NzIndexBuffer(); bool Fill(const void* data, unsigned int offset, unsigned int length); NzBuffer* GetBuffer() const; - nzUInt8 GetIndexSize() const; unsigned int GetIndexCount() const; void* GetPointer(); const void* GetPointer() const; unsigned int GetStartIndex() const; + bool HasLargeIndices() const; + bool IsHardware() const; bool IsSequential() const; diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 12fd72678..870f3d514 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -187,29 +187,20 @@ void NzRenderer::DrawIndexedPrimitives(nzPrimitiveType primitive, unsigned int f glDrawArrays(NzOpenGL::PrimitiveType[primitive], s_indexBuffer->GetStartIndex(), s_indexBuffer->GetIndexCount()); else { - nzUInt8 indexSize = s_indexBuffer->GetIndexSize(); - GLenum type; - switch (indexSize) + const nzUInt8* ptr = reinterpret_cast(s_indexBuffer->GetPointer()); + if (s_indexBuffer->HasLargeIndices()) { - case 1: - type = GL_UNSIGNED_BYTE; - break; - - case 2: - type = GL_UNSIGNED_SHORT; - break; - - case 4: - type = GL_UNSIGNED_INT; - break; - - default: - NazaraError("Invalid index size (" + NzString::Number(indexSize) + ')'); - return; + ptr += firstIndex*sizeof(nzUInt32); + type = GL_UNSIGNED_INT; + } + else + { + ptr += firstIndex*sizeof(nzUInt16); + type = GL_UNSIGNED_SHORT; } - glDrawElements(NzOpenGL::PrimitiveType[primitive], indexCount, type, reinterpret_cast(s_indexBuffer->GetPointer()) + firstIndex*indexSize); + glDrawElements(NzOpenGL::PrimitiveType[primitive], indexCount, type, ptr); } } diff --git a/src/Nazara/Utility/IndexBuffer.cpp b/src/Nazara/Utility/IndexBuffer.cpp index 42c1f00b5..2255e81ca 100644 --- a/src/Nazara/Utility/IndexBuffer.cpp +++ b/src/Nazara/Utility/IndexBuffer.cpp @@ -20,7 +20,7 @@ m_startIndex(startIndex) { #ifdef NAZARA_DEBUG nzUInt8 indexSize = m_buffer->GetSize(); - if (indexSize != 1 && indexSize != 2 && indexSize != 4) + if (indexSize != 2 && indexSize != 4) { NazaraError("Invalid index size (" + NzString::Number(indexSize) + ')'); m_buffer = nullptr; @@ -33,22 +33,12 @@ m_startIndex(startIndex) } } -NzIndexBuffer::NzIndexBuffer(unsigned int length, nzUInt8 indexSize, nzBufferStorage storage, nzBufferUsage usage) : +NzIndexBuffer::NzIndexBuffer(unsigned int length, bool largeIndices, nzBufferStorage storage, nzBufferUsage usage) : m_ownsBuffer(true), m_indexCount(length), m_startIndex(0) { - #ifdef NAZARA_DEBUG - if (indexSize != 1 && indexSize != 2 && indexSize != 4) - { - NazaraError("Invalid index size"); - m_buffer = nullptr; - - throw std::runtime_error("Constructor failed"); - } - #endif - - m_buffer = new NzBuffer(nzBufferType_Index, length, indexSize, storage, usage); + m_buffer = new NzBuffer(nzBufferType_Index, length, (largeIndices) ? 4 : 2, storage, usage); m_buffer->AddResourceReference(); m_buffer->SetPersistent(false); } @@ -109,19 +99,6 @@ NzBuffer* NzIndexBuffer::GetBuffer() const return m_buffer; } -nzUInt8 NzIndexBuffer::GetIndexSize() const -{ - #if NAZARA_UTILITY_SAFE - if (!m_buffer) - { - NazaraError("Sequential buffers have no index size"); - return 0; - } - #endif - - return m_buffer->GetTypeSize(); -} - void* NzIndexBuffer::GetPointer() { #if NAZARA_UTILITY_SAFE @@ -158,6 +135,19 @@ unsigned int NzIndexBuffer::GetStartIndex() const return m_startIndex; } +bool NzIndexBuffer::HasLargeIndices() const +{ + #if NAZARA_UTILITY_SAFE + if (!m_buffer) + { + NazaraError("Sequential buffers have no index size"); + return 0; + } + #endif + + return (m_buffer->GetTypeSize() == 4); +} + bool NzIndexBuffer::IsHardware() const { #if NAZARA_UTILITY_SAFE diff --git a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp index fe3bcb68f..fc106000c 100644 --- a/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp +++ b/src/Nazara/Utility/Loaders/MD5Mesh/Parser.cpp @@ -186,15 +186,9 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) unsigned int weightCount = md5Mesh.weights.size(); // Index buffer - nzUInt8 indexSize; - if (vertexCount > std::numeric_limits::max()) - indexSize = 4; - else if (vertexCount > std::numeric_limits::max()) - indexSize = 2; - else - indexSize = 1; + bool largeIndices = (vertexCount > std::numeric_limits::max()); - std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, indexSize, m_parameters.storage)); + std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, largeIndices, m_parameters.storage)); if (!indexBuffer->GetBuffer()->IsValid()) { NazaraError("Failed to create index buffer"); @@ -208,48 +202,28 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) continue; } - switch (indexSize) + if (largeIndices) { - case 1: - { - nzUInt8* index = reinterpret_cast(ptr); + nzUInt32* index = reinterpret_cast(ptr); - for (const Mesh::Triangle& triangle : md5Mesh.triangles) - { - // On les respécifie dans le bon ordre - *index++ = triangle.x; - *index++ = triangle.z; - *index++ = triangle.y; - } - break; + for (const Mesh::Triangle& triangle : md5Mesh.triangles) + { + // On les respécifie dans le bon ordre + *index++ = triangle.x; + *index++ = triangle.z; + *index++ = triangle.y; } + } + else + { + nzUInt16* index = reinterpret_cast(ptr); - case 2: + for (const Mesh::Triangle& triangle : md5Mesh.triangles) { - nzUInt16* index = reinterpret_cast(ptr); - - for (const Mesh::Triangle& triangle : md5Mesh.triangles) - { - // On les respécifie dans le bon ordre - *index++ = triangle.x; - *index++ = triangle.z; - *index++ = triangle.y; - } - break; - } - - case 4: - { - nzUInt32* index = reinterpret_cast(ptr); - - for (const Mesh::Triangle& triangle : md5Mesh.triangles) - { - // On les respécifie dans le bon ordre - *index++ = triangle.x; - *index++ = triangle.z; - *index++ = triangle.y; - } - break; + // On les respécifie dans le bon ordre + *index++ = triangle.x; + *index++ = triangle.z; + *index++ = triangle.y; } } @@ -342,15 +316,9 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) unsigned int vertexCount = md5Mesh.vertices.size(); // Index buffer - nzUInt8 indexSize; - if (vertexCount > std::numeric_limits::max()) - indexSize = 4; - else if (vertexCount > std::numeric_limits::max()) - indexSize = 2; - else - indexSize = 1; + bool largeIndices = (vertexCount > std::numeric_limits::max()); - std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, indexSize, m_parameters.storage)); + std::unique_ptr indexBuffer(new NzIndexBuffer(indexCount, largeIndices, m_parameters.storage)); if (!indexBuffer->GetBuffer()->IsValid()) { NazaraError("Failed to create index buffer"); @@ -364,49 +332,30 @@ bool NzMD5MeshParser::Parse(NzMesh* mesh) continue; } - switch (indexSize) + if (largeIndices) { - case 1: + nzUInt32* index = reinterpret_cast(ptr); + + for (const Mesh::Triangle& triangle : md5Mesh.triangles) { - nzUInt8* index = reinterpret_cast(ptr); - - for (const Mesh::Triangle& triangle : md5Mesh.triangles) - { - // On les respécifie dans le bon ordre - *index++ = triangle.x; - *index++ = triangle.z; - *index++ = triangle.y; - } - break; + // On les respécifie dans le bon ordre + *index++ = triangle.x; + *index++ = triangle.z; + *index++ = triangle.y; } + } + else + { + nzUInt16* index = reinterpret_cast(ptr); - case 2: + for (const Mesh::Triangle& triangle : md5Mesh.triangles) { - nzUInt16* index = reinterpret_cast(ptr); - - for (const Mesh::Triangle& triangle : md5Mesh.triangles) - { - // On les respécifie dans le bon ordre - *index++ = triangle.x; - *index++ = triangle.z; - *index++ = triangle.y; - } - break; - } - - case 4: - { - nzUInt32* index = reinterpret_cast(ptr); - - for (const Mesh::Triangle& triangle : md5Mesh.triangles) - { - // On les respécifie dans le bon ordre - *index++ = triangle.x; - *index++ = triangle.z; - *index++ = triangle.y; - } - break; + // On les respécifie dans le bon ordre + *index++ = triangle.x; + *index++ = triangle.z; + *index++ = triangle.y; } + break; } if (!indexBuffer->Unmap())