From 4cf24cde7d55066a26a8f7e556429ed24043c9dd Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 8 Mar 2020 18:10:23 +0100 Subject: [PATCH] VertexDeclaration: Add check for duplicates --- include/Nazara/Utility/VertexDeclaration.inl | 2 +- src/Nazara/Utility/VertexDeclaration.cpp | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Utility/VertexDeclaration.inl b/include/Nazara/Utility/VertexDeclaration.inl index 07a82ba7b..1722e3936 100644 --- a/include/Nazara/Utility/VertexDeclaration.inl +++ b/include/Nazara/Utility/VertexDeclaration.inl @@ -10,7 +10,7 @@ namespace Nz { - inline auto Nz::VertexDeclaration::FindComponent(VertexComponent vertexComponent, std::size_t componentIndex) const -> const Component* + inline auto VertexDeclaration::FindComponent(VertexComponent vertexComponent, std::size_t componentIndex) const -> const Component* { assert(componentIndex == 0 || vertexComponent == VertexComponent_Userdata); diff --git a/src/Nazara/Utility/VertexDeclaration.cpp b/src/Nazara/Utility/VertexDeclaration.cpp index 6b4ecfd8c..99059aef5 100644 --- a/src/Nazara/Utility/VertexDeclaration.cpp +++ b/src/Nazara/Utility/VertexDeclaration.cpp @@ -17,20 +17,31 @@ namespace Nz VertexDeclaration::VertexDeclaration(VertexInputRate inputRate, std::initializer_list components) : m_inputRate(inputRate) { + ErrorFlags errFlags(ErrorFlag_ThrowException); std::size_t offset = 0; m_components.reserve(components.size()); for (const ComponentEntry& entry : components) { + NazaraAssert(IsTypeSupported(entry.type), "Component type 0x" + String::Number(entry.type, 16) + " is not supported by vertex declarations"); + NazaraAssert(entry.componentIndex == 0 || entry.component == VertexComponent_Userdata, "Only userdata components can have non-zero component indexes"); + + if (entry.component != VertexComponent_Unused) + { + // Check for duplicates + for (const Component& component : m_components) + { + if (component.component == entry.component && component.componentIndex == entry.componentIndex) + NazaraError("Duplicate component type found"); + } + } + auto& component = m_components.emplace_back(); component.component = entry.component; component.componentIndex = entry.componentIndex; component.offset = offset; component.type = entry.type; - NazaraAssert(IsTypeSupported(component.type), "Component type 0x" + String::Number(component.type, 16) + " is not supported by vertex declarations"); - NazaraAssert(component.componentIndex == 0 || component.component == VertexComponent_Userdata, "Only userdata components can have non-zero component indexes"); - offset += Utility::ComponentStride[component.type]; }