diff --git a/include/Nazara/Utility/TriangleIterator.hpp b/include/Nazara/Utility/TriangleIterator.hpp index 3e7886ed1..48c68e86b 100644 --- a/include/Nazara/Utility/TriangleIterator.hpp +++ b/include/Nazara/Utility/TriangleIterator.hpp @@ -8,31 +8,21 @@ #define NAZARA_TRIANGLEITERATOR_HPP #include -#include -#include #include #include -#include class NzSubMesh; class NAZARA_API NzTriangleIterator { public: - NzTriangleIterator(NzSubMesh* subMesh, nzBufferAccess access = nzBufferAccess_ReadWrite); + NzTriangleIterator(nzPrimitiveMode primitiveMode, const NzIndexBuffer* indexBuffer); + NzTriangleIterator(NzSubMesh* subMesh); ~NzTriangleIterator() = default; bool Advance(); - NzVector3f GetNormal(unsigned int i) const; - NzVector3f GetPosition(unsigned int i) const; - NzVector3f GetTangent(unsigned int i) const; - NzVector2f GetTexCoord(unsigned int i) const; - - void SetNormal(unsigned int i, const NzVector3f& normal); - void SetPosition(unsigned int i, const NzVector3f& position); - void SetTangent(unsigned int i, const NzVector3f& tangent); - void SetTexCoord(unsigned int i, const NzVector2f& texCoords); + nzUInt32 operator[](unsigned int i) const; void Unmap(); @@ -40,7 +30,6 @@ class NAZARA_API NzTriangleIterator nzPrimitiveMode m_primitiveMode; nzUInt32 m_triangleIndices[3]; NzIndexMapper m_indexMapper; - NzVertexMapper m_vertexMapper; unsigned int m_currentIndex; unsigned int m_indexCount; }; diff --git a/src/Nazara/Utility/TriangleIterator.cpp b/src/Nazara/Utility/TriangleIterator.cpp index 9a62c838d..72003cf8b 100644 --- a/src/Nazara/Utility/TriangleIterator.cpp +++ b/src/Nazara/Utility/TriangleIterator.cpp @@ -6,23 +6,21 @@ #include #include -NzTriangleIterator::NzTriangleIterator(NzSubMesh* subMesh, nzBufferAccess access) : -m_primitiveMode(subMesh->GetPrimitiveMode()), -m_indexMapper(subMesh->GetIndexBuffer(), nzBufferAccess_ReadOnly), -m_vertexMapper(subMesh) +NzTriangleIterator::NzTriangleIterator(nzPrimitiveMode primitiveMode, const NzIndexBuffer* indexBuffer) : +m_primitiveMode(primitiveMode), +m_indexMapper(indexBuffer, nzBufferAccess_ReadOnly) { - NazaraUnused(access); - m_currentIndex = 3; m_triangleIndices[0] = m_indexMapper.Get(0); m_triangleIndices[1] = m_indexMapper.Get(1); m_triangleIndices[2] = m_indexMapper.Get(2); - const NzIndexBuffer* indexBuffer = m_indexMapper.GetBuffer(); - if (indexBuffer) - m_indexCount = indexBuffer->GetIndexCount(); - else - m_indexCount = subMesh->GetVertexCount(); + m_indexCount = indexBuffer->GetIndexCount(); +} + +NzTriangleIterator::NzTriangleIterator(NzSubMesh* subMesh) : +NzTriangleIterator(subMesh->GetPrimitiveMode(), subMesh->GetIndexBuffer()) +{ } bool NzTriangleIterator::Advance() @@ -59,113 +57,24 @@ bool NzTriangleIterator::Advance() return true; } -NzVector3f NzTriangleIterator::GetNormal(unsigned int i) const +nzUInt32 NzTriangleIterator::operator[](unsigned int i) const { #if NAZARA_UTILITY_SAFE - if (i > 2) + if (i >= 3) { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return NzVector3f(); + NzStringStream ss; + ss << "Index out of range: (" << i << " >= 3)"; + + NazaraError(ss); + throw std::domain_error(ss.ToString()); } #endif - return m_vertexMapper.GetNormal(m_triangleIndices[i]); -} - -NzVector3f NzTriangleIterator::GetPosition(unsigned int i) const -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return NzVector3f(); - } - #endif - - return m_vertexMapper.GetPosition(m_triangleIndices[i]); -} - -NzVector3f NzTriangleIterator::GetTangent(unsigned int i) const -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return NzVector3f(); - } - #endif - - return m_vertexMapper.GetTangent(m_triangleIndices[i]); -} - -NzVector2f NzTriangleIterator::GetTexCoord(unsigned int i) const -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return NzVector2f(); - } - #endif - - return m_vertexMapper.GetTexCoord(m_triangleIndices[i]); -} - -void NzTriangleIterator::SetNormal(unsigned int i, const NzVector3f& normal) -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return; - } - #endif - - m_vertexMapper.SetNormal(m_triangleIndices[i], normal); -} - -void NzTriangleIterator::SetPosition(unsigned int i, const NzVector3f& position) -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return; - } - #endif - - m_vertexMapper.SetPosition(m_triangleIndices[i], position); -} - -void NzTriangleIterator::SetTangent(unsigned int i, const NzVector3f& tangent) -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return; - } - #endif - - m_vertexMapper.SetTangent(m_triangleIndices[i], tangent); -} - -void NzTriangleIterator::SetTexCoord(unsigned int i, const NzVector2f& texCoords) -{ - #if NAZARA_UTILITY_SAFE - if (i > 2) - { - NazaraError("Index out of range: (" + NzString::Number(i) + " > 2)"); - return; - } - #endif - - m_vertexMapper.SetTexCoord(m_triangleIndices[i], texCoords); + return m_triangleIndices[i]; } void NzTriangleIterator::Unmap() { // Peut très bien être appellé plusieurs fois de suite, seul le premier appel sera pris en compte m_indexMapper.Unmap(); - m_vertexMapper.Unmap(); }