From 9c76c78c0c2b0de42191a602e48c97c679ad200e Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 3 Jan 2013 21:26:51 +0100 Subject: [PATCH] Added IndexMapper Former-commit-id: 994b30f41161855827d920b6c128a5bbd480929b --- include/Nazara/Utility/IndexMapper.hpp | 39 +++++++++++ src/Nazara/Utility/IndexMapper.cpp | 96 ++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 include/Nazara/Utility/IndexMapper.hpp create mode 100644 src/Nazara/Utility/IndexMapper.cpp diff --git a/include/Nazara/Utility/IndexMapper.hpp b/include/Nazara/Utility/IndexMapper.hpp new file mode 100644 index 000000000..b681a49b1 --- /dev/null +++ b/include/Nazara/Utility/IndexMapper.hpp @@ -0,0 +1,39 @@ +// 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_VERTEXITERATOR_HPP +#define NAZARA_VERTEXITERATOR_HPP + +#include +#include + +class NzIndexBuffer; +class NzSubMesh; + +using NzIndexMapperGetter = nzUInt32 (*)(const void* buffer, unsigned int i); +using NzIndexMapperSetter = void (*)(void* buffer, unsigned int i, nzUInt32 value); + +class NAZARA_API NzIndexMapper +{ + public: + NzIndexMapper(NzIndexBuffer* indexBuffer, nzBufferAccess access = nzBufferAccess_ReadWrite); + NzIndexMapper(const NzIndexBuffer* indexBuffer); + NzIndexMapper(const NzSubMesh* subMesh); + ~NzIndexMapper() = default; + + nzUInt32 Get(unsigned int i) const; + + void Set(unsigned int i, nzUInt32 value); + + void Unmap(); + + private: + NzBufferMapper m_mapper; + NzIndexMapperGetter m_getter; + NzIndexMapperSetter m_setter; +}; + +#endif // NAZARA_VERTEXITERATOR_HPP diff --git a/src/Nazara/Utility/IndexMapper.cpp b/src/Nazara/Utility/IndexMapper.cpp new file mode 100644 index 000000000..cb389e3ba --- /dev/null +++ b/src/Nazara/Utility/IndexMapper.cpp @@ -0,0 +1,96 @@ +// 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 +#include + +namespace +{ + nzUInt32 Getter16(const void* buffer, unsigned int i) + { + const nzUInt16* ptr = reinterpret_cast(buffer); + return ptr[i]; + } + + nzUInt32 Getter32(const void* buffer, unsigned int i) + { + const nzUInt32* ptr = reinterpret_cast(buffer); + return ptr[i]; + } + + void Setter16(void* buffer, unsigned int i, nzUInt32 value) + { + nzUInt16* ptr = reinterpret_cast(buffer); + ptr[i] = static_cast(value); + } + + void Setter32(void* buffer, unsigned int i, nzUInt32 value) + { + nzUInt32* ptr = reinterpret_cast(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_mapper(indexBuffer, access) +{ + 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) : +m_mapper(indexBuffer, nzBufferAccess_ReadOnly) +{ + if (indexBuffer->HasLargeIndices()) + { + m_getter = Getter32; + m_setter = SetterError; + } + else + { + m_getter = Getter16; + m_setter = SetterError; + } +} + +NzIndexMapper::NzIndexMapper(const NzSubMesh* subMesh) : +NzIndexMapper(subMesh->GetIndexBuffer()) +{ +} + +nzUInt32 NzIndexMapper::Get(unsigned int i) const +{ + return m_getter(m_mapper.GetPointer(), i); +} + +void NzIndexMapper::Set(unsigned int i, nzUInt32 value) +{ + m_setter(m_mapper.GetPointer(), i, value); +} + +void NzIndexMapper::Unmap() +{ + m_mapper.Unmap(); +}