From d4030f666b5871cc7437772659e070573cdbcf5b Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 4 Jan 2013 16:27:22 +0100 Subject: [PATCH] Added TriangleIterator (experimental) Former-commit-id: b94f4d4a26a92f4acecf4c53291db80756feb289 --- include/Nazara/Utility/TriangleIterator.hpp | 46 ++++++ src/Nazara/Utility/TriangleIterator.cpp | 166 ++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 include/Nazara/Utility/TriangleIterator.hpp create mode 100644 src/Nazara/Utility/TriangleIterator.cpp diff --git a/include/Nazara/Utility/TriangleIterator.hpp b/include/Nazara/Utility/TriangleIterator.hpp new file mode 100644 index 000000000..32467660a --- /dev/null +++ b/include/Nazara/Utility/TriangleIterator.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2012 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_TRIANGLEITERATOR_HPP +#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() = default; + + bool Advance(); + + NzVector3f GetNormal(unsigned int i) const; + NzVector3f GetPosition(unsigned int i) const; + NzVector3f GetTangent(unsigned int i) const; + NzVector2f GetTexCoords(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 SetTexCoords(unsigned int i, const NzVector2f& texCoords); + + private: + nzPrimitiveType m_primitiveType; + nzUInt32 m_triangleIndices[3]; + NzIndexMapper m_indexMapper; + NzVertexMapper m_vertexMapper; + unsigned int m_currentIndex; + unsigned int m_indexCount; +}; + +#endif // NAZARA_TRIANGLEITERATOR_HPP diff --git a/src/Nazara/Utility/TriangleIterator.cpp b/src/Nazara/Utility/TriangleIterator.cpp new file mode 100644 index 000000000..88cad52c7 --- /dev/null +++ b/src/Nazara/Utility/TriangleIterator.cpp @@ -0,0 +1,166 @@ +// Copyright (C) 2012 Jérôme Leclercq +// This file is part of the "Nazara Engine - Utility module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +NzTriangleIterator::NzTriangleIterator(NzSubMesh* subMesh, nzBufferAccess access) : +m_primitiveType(subMesh->GetPrimitiveType()), +m_indexMapper(subMesh->GetIndexBuffer(), nzBufferAccess_ReadOnly), +m_vertexMapper(subMesh) +{ + 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->GetVertexBuffer()->GetVertexCount(); +} + +bool NzTriangleIterator::Advance() +{ + if (m_currentIndex >= m_indexCount) + { + ///FIXME: Que faire si Advance() est appelé deux fois + m_indexMapper.Unmap(); + m_vertexMapper.Unmap(); + return false; + } + + switch (m_primitiveType) + { + case nzPrimitiveType_TriangleFan: + m_triangleIndices[1] = m_indexMapper.Get(m_currentIndex++); + m_triangleIndices[2] = m_indexMapper.Get(m_currentIndex++); + break; + + case nzPrimitiveType_TriangleList: + m_triangleIndices[0] = m_indexMapper.Get(m_currentIndex++); + m_triangleIndices[1] = m_indexMapper.Get(m_currentIndex++); + m_triangleIndices[2] = m_indexMapper.Get(m_currentIndex++); + break; + + case nzPrimitiveType_TriangleStrip: + m_triangleIndices[2] = m_indexMapper.Get(m_currentIndex++); + m_triangleIndices[1] = m_triangleIndices[2]; + m_triangleIndices[0] = m_triangleIndices[1]; + break; + + default: + return false; + } + + return true; +} + +NzVector3f NzTriangleIterator::GetNormal(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.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::GetTexCoords(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.GetTexCoords(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::SetTexCoords(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.SetTexCoords(m_triangleIndices[i], texCoords); +}