Files
NazaraEngine/src/Nazara/Utility/TriangleIterator.cpp
Lynix c096756dab Happy thousandth commit Nazara
Updated copyright year (Yay, 515 file updated)
Regenerated global headers
Fixed some typo
Improved some shaders
-Blah blah blah-

Thank you all for supporting my project !
-Lynix


Former-commit-id: e4e741b318ba4f203da5ffd265bd5e516e7ffd7d
2014-01-12 20:16:21 +01:00

172 lines
4.0 KiB
C++

// Copyright (C) 2014 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 <Nazara/Utility/TriangleIterator.hpp>
#include <Nazara/Utility/SubMesh.hpp>
#include <Nazara/Utility/Debug.hpp>
NzTriangleIterator::NzTriangleIterator(NzSubMesh* subMesh, nzBufferAccess access) :
m_primitiveMode(subMesh->GetPrimitiveMode()),
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->GetVertexCount();
}
bool NzTriangleIterator::Advance()
{
if (m_currentIndex >= m_indexCount)
{
Unmap();
return false;
}
switch (m_primitiveMode)
{
case nzPrimitiveMode_TriangleFan:
m_triangleIndices[1] = m_indexMapper.Get(m_currentIndex++);
m_triangleIndices[2] = m_indexMapper.Get(m_currentIndex++);
break;
case nzPrimitiveMode_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 nzPrimitiveMode_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::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);
}
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();
}