Files
NazaraEngine/src/Nazara/Utility/IndexMapper.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

151 lines
3.2 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/IndexMapper.hpp>
#include <Nazara/Utility/IndexBuffer.hpp>
#include <Nazara/Utility/IndexIterator.hpp>
#include <Nazara/Utility/SubMesh.hpp>
#include <Nazara/Utility/Debug.hpp>
namespace
{
nzUInt32 Getter16(const void* buffer, unsigned int i)
{
const nzUInt16* ptr = reinterpret_cast<const nzUInt16*>(buffer);
return ptr[i];
}
nzUInt32 Getter32(const void* buffer, unsigned int i)
{
const nzUInt32* ptr = reinterpret_cast<const nzUInt32*>(buffer);
return ptr[i];
}
void Setter16(void* buffer, unsigned int i, nzUInt32 value)
{
nzUInt16* ptr = reinterpret_cast<nzUInt16*>(buffer);
ptr[i] = static_cast<nzUInt16>(value);
}
void Setter32(void* buffer, unsigned int i, nzUInt32 value)
{
nzUInt32* ptr = reinterpret_cast<nzUInt32*>(buffer);
ptr[i] = value;
}
void SetterError(void*, unsigned int, nzUInt32)
{
NazaraError("Index buffer opened with read-only access");
}
}
NzIndexMapper::NzIndexMapper(NzIndexBuffer* indexBuffer, nzBufferAccess access) :
m_indexCount(indexBuffer->GetIndexCount())
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
}
#endif
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
{
m_getter = Getter32;
if (access != nzBufferAccess_ReadOnly)
m_setter = Setter32;
else
m_setter = SetterError;
}
else
{
m_getter = Getter16;
if (access != nzBufferAccess_ReadOnly)
m_setter = Setter16;
else
m_setter = SetterError;
}
}
NzIndexMapper::NzIndexMapper(const NzIndexBuffer* indexBuffer, nzBufferAccess access) :
m_setter(SetterError),
m_indexCount(indexBuffer->GetIndexCount())
{
#if NAZARA_UTILITY_SAFE
if (!indexBuffer)
{
NazaraError("Index buffer must be valid");
return;
}
#endif
if (!m_mapper.Map(indexBuffer, access))
NazaraError("Failed to map buffer"); ///TODO: Unexcepted
if (indexBuffer->HasLargeIndices())
m_getter = Getter32;
else
m_getter = Getter16;
}
NzIndexMapper::NzIndexMapper(const NzSubMesh* subMesh) :
NzIndexMapper(subMesh->GetIndexBuffer())
{
}
nzUInt32 NzIndexMapper::Get(unsigned int i) const
{
#if NAZARA_UTILITY_SAFE
if (i >= m_indexCount)
{
NazaraError("Index out of range (" + NzString::Number(i) + " >= " + NzString::Number(m_indexCount) + ')');
return 0;
}
#endif
return m_getter(m_mapper.GetPointer(), i);
}
const NzIndexBuffer* NzIndexMapper::GetBuffer() const
{
return m_mapper.GetBuffer();
}
unsigned int NzIndexMapper::GetIndexCount() const
{
return m_indexCount;
}
void NzIndexMapper::Set(unsigned int i, nzUInt32 value)
{
#if NAZARA_UTILITY_SAFE
if (i >= m_indexCount)
{
NazaraError("Index out of range (" + NzString::Number(i) + " >= " + NzString::Number(m_indexCount) + ')');
return;
}
#endif
m_setter(m_mapper.GetPointer(), i, value);
}
void NzIndexMapper::Unmap()
{
m_mapper.Unmap();
}
NzIndexIterator NzIndexMapper::begin()
{
return NzIndexIterator(this, 0);
}
NzIndexIterator NzIndexMapper::end()
{
return NzIndexIterator(this, m_indexCount); // Post-end
}