diff --git a/include/Nazara/Utility/IndexBuffer.hpp b/include/Nazara/Utility/IndexBuffer.hpp index 24286b349..0c788049d 100644 --- a/include/Nazara/Utility/IndexBuffer.hpp +++ b/include/Nazara/Utility/IndexBuffer.hpp @@ -20,15 +20,17 @@ using NzIndexBufferRef = NzResourceRef; class NAZARA_API NzIndexBuffer : public NzResource { public: + NzIndexBuffer() = default; NzIndexBuffer(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); NzIndexBuffer(bool largeIndices, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); - NzIndexBuffer(const NzIndexBuffer& vertexBuffer); + NzIndexBuffer(const NzIndexBuffer& indexBuffer); + NzIndexBuffer(NzIndexBuffer&& indexBuffer) noexcept; ~NzIndexBuffer() = default; unsigned int ComputeCacheMissCount() const; - bool Fill(const void* data, unsigned int offset, unsigned int size, bool forceDiscard = false); - bool FillIndices(const void* data, unsigned int startIndex, unsigned int length, bool forceDiscard = false); + bool Fill(const void* data, unsigned int startIndex, unsigned int length, bool forceDiscard = false); + bool FillRaw(const void* data, unsigned int offset, unsigned int size, bool forceDiscard = false); NzBuffer* GetBuffer() const; unsigned int GetEndOffset() const; @@ -39,18 +41,28 @@ class NAZARA_API NzIndexBuffer : public NzResource bool HasLargeIndices() const; bool IsHardware() const; + bool IsValid() const; - void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0); - void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0) const; - void* MapIndices(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0); - void* MapIndices(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0) const; + void* Map(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0); + void* Map(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0) const; + void* MapRaw(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0); + void* MapRaw(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0) const; void Optimize(); + void Reset(); + void Reset(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); + void Reset(bool largeIndices, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); + void Reset(const NzIndexBuffer& indexBuffer); + void Reset(NzIndexBuffer&& indexBuffer) noexcept; + bool SetStorage(nzBufferStorage storage); void Unmap() const; + NzIndexBuffer& operator=(const NzIndexBuffer& indexBuffer); + NzIndexBuffer& operator=(NzIndexBuffer&& indexBuffer) noexcept; + private: NzBufferRef m_buffer; bool m_largeIndices; diff --git a/include/Nazara/Utility/VertexBuffer.hpp b/include/Nazara/Utility/VertexBuffer.hpp index 2f2b929e5..741504ae4 100644 --- a/include/Nazara/Utility/VertexBuffer.hpp +++ b/include/Nazara/Utility/VertexBuffer.hpp @@ -21,13 +21,15 @@ using NzVertexBufferRef = NzResourceRef; class NAZARA_API NzVertexBuffer : public NzResource { public: + NzVertexBuffer() = default; NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); NzVertexBuffer(const NzVertexBuffer& vertexBuffer); + NzVertexBuffer(NzVertexBuffer&& vertexBuffer) noexcept; ~NzVertexBuffer() = default; - bool Fill(const void* data, unsigned int offset, unsigned int size, bool forceDiscard = false); - bool FillVertices(const void* data, unsigned int startVertex, unsigned int length, bool forceDiscard = false); + bool Fill(const void* data, unsigned int startVertex, unsigned int length, bool forceDiscard = false); + bool FillRaw(const void* data, unsigned int offset, unsigned int size, bool forceDiscard = false); NzBuffer* GetBuffer() const; unsigned int GetEndOffset() const; @@ -37,17 +39,27 @@ class NAZARA_API NzVertexBuffer : public NzResource const NzVertexDeclaration* GetVertexDeclaration() const; bool IsHardware() const; + bool IsValid() const; - void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0); - void* Map(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0) const; - void* MapVertices(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0); - void* MapVertices(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0) const; + void* Map(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0); + void* Map(nzBufferAccess access, unsigned int startVertex = 0, unsigned int length = 0) const; + void* MapRaw(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0); + void* MapRaw(nzBufferAccess access, unsigned int offset = 0, unsigned int size = 0) const; + + void Reset(); + void Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset); + void Reset(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage = nzBufferStorage_Software, nzBufferUsage usage = nzBufferUsage_Static); + void Reset(const NzVertexBuffer& vertexBuffer); + void Reset(NzVertexBuffer&& vertexBuffer) noexcept; bool SetStorage(nzBufferStorage storage); void SetVertexDeclaration(const NzVertexDeclaration* vertexDeclaration); void Unmap() const; + NzVertexBuffer& operator=(const NzVertexBuffer& vertexBuffer); + NzVertexBuffer& operator=(NzVertexBuffer&& vertexBuffer) noexcept; + private: NzBufferRef m_buffer; NzVertexDeclarationConstRef m_vertexDeclaration; diff --git a/src/Nazara/Graphics/SkyboxBackground.cpp b/src/Nazara/Graphics/SkyboxBackground.cpp index 5a57dff06..625609cf7 100644 --- a/src/Nazara/Graphics/SkyboxBackground.cpp +++ b/src/Nazara/Graphics/SkyboxBackground.cpp @@ -34,9 +34,9 @@ namespace 1, 6, 2, 1, 5, 6 }; - if (!indexBuffer->FillIndices(indices, 0, 36)) + if (!indexBuffer->Fill(indices, 0, 36)) { - NazaraError("Failed to create vertex buffer"); + NazaraError("Failed to create index buffer"); return nullptr; } @@ -139,7 +139,7 @@ namespace 1.0, 1.0, -1.0, }; - if (!vertexBuffer->FillVertices(vertices, 0, 8)) + if (!vertexBuffer->Fill(vertices, 0, 8)) { NazaraError("Failed to create vertex buffer"); return nullptr; diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index 0595e2972..1de197a6f 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -588,7 +588,7 @@ bool NzRenderer::Initialize() 1.f, 1.f, }; - if (!s_fullscreenQuadBuffer->FillVertices(vertices, 0, 4)) + if (!s_fullscreenQuadBuffer->Fill(vertices, 0, 4)) { NazaraError("Failed to fill fullscreen quad buffer"); Uninitialize(); diff --git a/src/Nazara/Utility/Buffer.cpp b/src/Nazara/Utility/Buffer.cpp index cfb8a1c49..7ee82f74b 100644 --- a/src/Nazara/Utility/Buffer.cpp +++ b/src/Nazara/Utility/Buffer.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -79,16 +80,14 @@ bool NzBuffer::Create(unsigned int size, nzBufferStorage storage, nzBufferUsage return false; } - NzAbstractBuffer* impl = s_bufferFunctions[storage](this, m_type); + std::unique_ptr impl(s_bufferFunctions[storage](this, m_type)); if (!impl->Create(size, usage)) { NazaraError("Failed to create buffer"); - delete impl; - return false; } - m_impl = impl; + m_impl = impl.release(); m_size = size; m_storage = storage; m_usage = usage; @@ -120,7 +119,7 @@ bool NzBuffer::Fill(const void* data, unsigned int offset, unsigned int size, bo if (offset+size > m_size) { - NazaraError("Exceeding buffer size"); + NazaraError("Exceeding buffer size (" + NzString::Number(offset+size) + " > " + NzString::Number(m_size) + ')'); return false; } #endif diff --git a/src/Nazara/Utility/IndexBuffer.cpp b/src/Nazara/Utility/IndexBuffer.cpp index 2e1422f7f..74edd6d77 100644 --- a/src/Nazara/Utility/IndexBuffer.cpp +++ b/src/Nazara/Utility/IndexBuffer.cpp @@ -11,53 +11,14 @@ #include #include -NzIndexBuffer::NzIndexBuffer(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) : -m_buffer(buffer), -m_largeIndices(largeIndices), -m_endOffset(endOffset), -m_startOffset(startOffset) +NzIndexBuffer::NzIndexBuffer(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { - #ifdef NAZARA_DEBUG - if (!m_buffer || !m_buffer->IsValid()) - { - NazaraError("Buffer is invalid"); - throw std::invalid_argument("Buffer must be valid"); - } - - if (endOffset > startOffset) - { - NazaraError("End offset cannot be over start offset"); - throw std::invalid_argument("End offset cannot be over start offset"); - } - - unsigned int bufferSize = m_buffer->GetSize(); - if (startOffset >= bufferSize) - { - NazaraError("Start offset is over buffer size"); - throw std::invalid_argument("Start offset is over buffer size"); - } - - if (endOffset >= bufferSize) - { - NazaraError("End offset is over buffer size"); - throw std::invalid_argument("End offset is over buffer size"); - } - #endif - - unsigned int stride = (largeIndices) ? sizeof(nzUInt32) : sizeof(nzUInt16); - - m_indexCount = (endOffset - startOffset) / stride; + Reset(largeIndices, buffer, startOffset, endOffset); } -NzIndexBuffer::NzIndexBuffer(bool largeIndices, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) : -m_largeIndices(largeIndices), -m_indexCount(length), -m_startOffset(0) +NzIndexBuffer::NzIndexBuffer(bool largeIndices, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) { - m_endOffset = length * ((largeIndices) ? sizeof(nzUInt32) : sizeof(nzUInt16)); - - m_buffer = new NzBuffer(nzBufferType_Index, m_endOffset, storage, usage); - m_buffer->SetPersistent(false); + Reset(largeIndices, length, storage, usage); } NzIndexBuffer::NzIndexBuffer(const NzIndexBuffer& indexBuffer) : @@ -70,6 +31,16 @@ m_startOffset(indexBuffer.m_startOffset) { } +NzIndexBuffer::NzIndexBuffer(NzIndexBuffer&& indexBuffer) noexcept : +NzResource(), +m_buffer(std::move(indexBuffer.m_buffer)), +m_largeIndices(indexBuffer.m_largeIndices), +m_endOffset(indexBuffer.m_endOffset), +m_indexCount(indexBuffer.m_indexCount), +m_startOffset(indexBuffer.m_startOffset) +{ +} + unsigned int NzIndexBuffer::ComputeCacheMissCount() const { NzIndexMapper mapper(this); @@ -77,7 +48,13 @@ unsigned int NzIndexBuffer::ComputeCacheMissCount() const return NzComputeCacheMissCount(mapper.begin(), m_indexCount); } -bool NzIndexBuffer::Fill(const void* data, unsigned int offset, unsigned int size, bool forceDiscard) +bool NzIndexBuffer::Fill(const void* data, unsigned int startIndex, unsigned int length, bool forceDiscard) +{ + unsigned int stride = GetStride(); + return FillRaw(data, startIndex*stride, length*stride, forceDiscard); +} + +bool NzIndexBuffer::FillRaw(const void* data, unsigned int offset, unsigned int size, bool forceDiscard) { #if NAZARA_UTILITY_SAFE if (m_startOffset + offset + size > m_endOffset) @@ -90,12 +67,6 @@ bool NzIndexBuffer::Fill(const void* data, unsigned int offset, unsigned int siz return m_buffer->Fill(data, m_startOffset+offset, size, forceDiscard); } -bool NzIndexBuffer::FillIndices(const void* data, unsigned int startIndex, unsigned int length, bool forceDiscard) -{ - unsigned int stride = GetStride(); - return Fill(data, startIndex*stride, length*stride, forceDiscard); -} - NzBuffer* NzIndexBuffer::GetBuffer() const { return m_buffer; @@ -131,7 +102,24 @@ bool NzIndexBuffer::IsHardware() const return m_buffer->IsHardware(); } -void* NzIndexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned int size) +bool NzIndexBuffer::IsValid() const +{ + return m_buffer; +} + +void* NzIndexBuffer::Map(nzBufferAccess access, unsigned int startIndex, unsigned int length) +{ + unsigned int stride = GetStride(); + return MapRaw(access, startIndex*stride, length*stride); +} + +void* NzIndexBuffer::Map(nzBufferAccess access, unsigned int startIndex, unsigned int length) const +{ + unsigned int stride = GetStride(); + return MapRaw(access, startIndex*stride, length*stride); +} + +void* NzIndexBuffer::MapRaw(nzBufferAccess access, unsigned int offset, unsigned int size) { #if NAZARA_UTILITY_SAFE if (m_startOffset + offset + size > m_endOffset) @@ -144,7 +132,7 @@ void* NzIndexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned in return m_buffer->Map(access, offset, size); } -void* NzIndexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned int size) const +void* NzIndexBuffer::MapRaw(nzBufferAccess access, unsigned int offset, unsigned int size) const { #if NAZARA_UTILITY_SAFE if (m_startOffset + offset + size > m_endOffset) @@ -157,20 +145,6 @@ void* NzIndexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned in return m_buffer->Map(access, offset, size); } -void* NzIndexBuffer::MapIndices(nzBufferAccess access, unsigned int startIndex, unsigned int length) -{ - unsigned int stride = GetStride(); - - return Map(access, startIndex*stride, length*stride); -} - -void* NzIndexBuffer::MapIndices(nzBufferAccess access, unsigned int startIndex, unsigned int length) const -{ - unsigned int stride = GetStride(); - - return Map(access, startIndex*stride, length*stride); -} - void NzIndexBuffer::Optimize() { NzIndexMapper mapper(this); @@ -178,6 +152,80 @@ void NzIndexBuffer::Optimize() NzOptimizeIndices(mapper.begin(), m_indexCount); } +void NzIndexBuffer::Reset() +{ + m_buffer.Reset(); +} + +void NzIndexBuffer::Reset(bool largeIndices, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) +{ + #if NAZARA_UTILITY_SAFE + if (!buffer || !buffer->IsValid()) + { + NazaraError("Buffer is invalid"); + return; + } + + if (endOffset > startOffset) + { + NazaraError("End offset cannot be over start offset"); + return; + } + + unsigned int bufferSize = buffer->GetSize(); + if (startOffset >= bufferSize) + { + NazaraError("Start offset is over buffer size"); + return; + } + + if (endOffset >= bufferSize) + { + NazaraError("End offset is over buffer size"); + return; + } + #endif + + unsigned int stride = (largeIndices) ? sizeof(nzUInt32) : sizeof(nzUInt16); + + m_buffer = buffer; + m_endOffset = endOffset; + m_indexCount = (endOffset - startOffset) / stride; + m_largeIndices = largeIndices; + m_startOffset = startOffset; +} + +void NzIndexBuffer::Reset(bool largeIndices, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) +{ + unsigned int stride = (largeIndices) ? sizeof(nzUInt32) : sizeof(nzUInt16); + + m_endOffset = length * stride; + m_indexCount = length; + m_largeIndices = largeIndices; + m_startOffset = 0; + + m_buffer = new NzBuffer(nzBufferType_Index, m_endOffset, storage, usage); + m_buffer->SetPersistent(false); +} + +void NzIndexBuffer::Reset(const NzIndexBuffer& indexBuffer) +{ + m_buffer = indexBuffer.m_buffer; + m_endOffset = indexBuffer.m_endOffset; + m_indexCount = indexBuffer.m_indexCount; + m_largeIndices = indexBuffer.m_largeIndices; + m_startOffset = indexBuffer.m_startOffset; +} + +void NzIndexBuffer::Reset(NzIndexBuffer&& indexBuffer) noexcept +{ + m_buffer = std::move(indexBuffer.m_buffer); + m_endOffset = indexBuffer.m_endOffset; + m_indexCount = indexBuffer.m_indexCount; + m_largeIndices = indexBuffer.m_largeIndices; + m_startOffset = indexBuffer.m_startOffset; +} + bool NzIndexBuffer::SetStorage(nzBufferStorage storage) { return m_buffer->SetStorage(storage); @@ -187,3 +235,17 @@ void NzIndexBuffer::Unmap() const { m_buffer->Unmap(); } + +NzIndexBuffer& NzIndexBuffer::operator=(const NzIndexBuffer& indexBuffer) +{ + Reset(indexBuffer); + + return *this; +} + +NzIndexBuffer& NzIndexBuffer::operator=(NzIndexBuffer&& indexBuffer) noexcept +{ + Reset(indexBuffer); + + return *this; +} diff --git a/src/Nazara/Utility/VertexBuffer.cpp b/src/Nazara/Utility/VertexBuffer.cpp index b899ae33b..bb7de8296 100644 --- a/src/Nazara/Utility/VertexBuffer.cpp +++ b/src/Nazara/Utility/VertexBuffer.cpp @@ -7,65 +7,14 @@ #include #include -NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) : -m_buffer(buffer), -m_vertexDeclaration(vertexDeclaration), -m_endOffset(endOffset), -m_startOffset(startOffset) +NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { - #ifdef NAZARA_DEBUG - if (!m_vertexDeclaration) - { - NazaraError("Vertex declaration is invalid"); - throw std::invalid_argument("Invalid vertex declaration"); - } - - if (!m_buffer || !m_buffer->IsValid()) - { - NazaraError("Buffer is invalid"); - throw std::invalid_argument("Buffer must be valid"); - } - - if (endOffset > startOffset) - { - NazaraError("End offset cannot be over start offset"); - throw std::invalid_argument("End offset cannot be over start offset"); - } - - unsigned int bufferSize = m_buffer->GetSize(); - if (startOffset >= bufferSize) - { - NazaraError("Start offset is over buffer size"); - throw std::invalid_argument("Start offset is over buffer size"); - } - - if (endOffset >= bufferSize) - { - NazaraError("End offset is over buffer size"); - throw std::invalid_argument("End offset is over buffer size"); - } - #endif - - m_vertexCount = (endOffset - startOffset) / m_vertexDeclaration->GetStride(); + Reset(vertexDeclaration, buffer, startOffset, endOffset); } -NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) : -m_vertexDeclaration(vertexDeclaration), -m_startOffset(0), -m_vertexCount(length) +NzVertexBuffer::NzVertexBuffer(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) { - #ifdef NAZARA_DEBUG - if (!m_vertexDeclaration) - { - NazaraError("Vertex declaration is invalid"); - throw std::invalid_argument("Invalid vertex declaration"); - } - #endif - - m_endOffset = length*vertexDeclaration->GetStride(); - - m_buffer = new NzBuffer(nzBufferType_Vertex, m_endOffset, storage, usage); - m_buffer->SetPersistent(false); + Reset(vertexDeclaration, length, storage, usage); } NzVertexBuffer::NzVertexBuffer(const NzVertexBuffer& vertexBuffer) : @@ -78,7 +27,22 @@ m_vertexCount(vertexBuffer.m_vertexCount) { } -bool NzVertexBuffer::Fill(const void* data, unsigned int offset, unsigned int size, bool forceDiscard) +NzVertexBuffer::NzVertexBuffer(NzVertexBuffer&& vertexBuffer) noexcept : +m_buffer(std::move(vertexBuffer.m_buffer)), +m_vertexDeclaration(std::move(vertexBuffer.m_vertexDeclaration)), +m_endOffset(vertexBuffer.m_endOffset), +m_startOffset(vertexBuffer.m_startOffset), +m_vertexCount(vertexBuffer.m_vertexCount) +{ +} + +bool NzVertexBuffer::Fill(const void* data, unsigned int startVertex, unsigned int length, bool forceDiscard) +{ + unsigned int stride = m_vertexDeclaration->GetStride(); + return FillRaw(data, startVertex*stride, length*stride, forceDiscard); +} + +bool NzVertexBuffer::FillRaw(const void* data, unsigned int offset, unsigned int size, bool forceDiscard) { #if NAZARA_UTILITY_SAFE if (m_startOffset + offset + size > m_endOffset) @@ -91,13 +55,6 @@ bool NzVertexBuffer::Fill(const void* data, unsigned int offset, unsigned int si return m_buffer->Fill(data, m_startOffset+offset, size, forceDiscard); } -bool NzVertexBuffer::FillVertices(const void* data, unsigned int startVertex, unsigned int length, bool forceDiscard) -{ - unsigned int stride = m_vertexDeclaration->GetStride(); - - return Fill(data, startVertex*stride, length*stride, forceDiscard); -} - NzBuffer* NzVertexBuffer::GetBuffer() const { return m_buffer; @@ -133,7 +90,26 @@ bool NzVertexBuffer::IsHardware() const return m_buffer->IsHardware(); } -void* NzVertexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned int size) +bool NzVertexBuffer::IsValid() const +{ + return m_buffer && m_vertexDeclaration; +} + +void* NzVertexBuffer::Map(nzBufferAccess access, unsigned int startVertex, unsigned int length) +{ + unsigned int stride = m_vertexDeclaration->GetStride(); + + return MapRaw(access, startVertex*stride, length*stride); +} + +void* NzVertexBuffer::Map(nzBufferAccess access, unsigned int startVertex, unsigned int length) const +{ + unsigned int stride = m_vertexDeclaration->GetStride(); + + return MapRaw(access, startVertex*stride, length*stride); +} + +void* NzVertexBuffer::MapRaw(nzBufferAccess access, unsigned int offset, unsigned int size) { #if NAZARA_UTILITY_SAFE if (m_startOffset + offset + size > m_endOffset) @@ -146,7 +122,7 @@ void* NzVertexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned i return m_buffer->Map(access, offset, size); } -void* NzVertexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned int size) const +void* NzVertexBuffer::MapRaw(nzBufferAccess access, unsigned int offset, unsigned int size) const { #if NAZARA_UTILITY_SAFE if (m_startOffset + offset + size > m_endOffset) @@ -159,18 +135,89 @@ void* NzVertexBuffer::Map(nzBufferAccess access, unsigned int offset, unsigned i return m_buffer->Map(access, offset, size); } -void* NzVertexBuffer::MapVertices(nzBufferAccess access, unsigned int startVertex, unsigned int length) +void NzVertexBuffer::Reset() { - unsigned int stride = m_vertexDeclaration->GetStride(); - - return Map(access, startVertex*stride, length*stride); + m_buffer.Reset(); + m_vertexDeclaration.Reset(); } -void* NzVertexBuffer::MapVertices(nzBufferAccess access, unsigned int startVertex, unsigned int length) const +void NzVertexBuffer::Reset(const NzVertexDeclaration* vertexDeclaration, NzBuffer* buffer, unsigned int startOffset, unsigned int endOffset) { - unsigned int stride = m_vertexDeclaration->GetStride(); + #if NAZARA_UTILITY_SAFE + if (!vertexDeclaration) + { + NazaraError("Vertex declaration is invalid"); + return; + } - return Map(access, startVertex*stride, length*stride); + if (!buffer || !buffer->IsValid()) + { + NazaraError("Buffer is invalid"); + return; + } + + if (endOffset > startOffset) + { + NazaraError("End offset cannot be over start offset"); + return; + } + + unsigned int bufferSize = buffer->GetSize(); + if (startOffset >= bufferSize) + { + NazaraError("Start offset is over buffer size"); + return; + } + + if (endOffset >= bufferSize) + { + NazaraError("End offset is over buffer size"); + return; + } + #endif + + m_buffer = buffer; + m_endOffset = endOffset; + m_startOffset = startOffset; + m_vertexCount = (endOffset - startOffset) / vertexDeclaration->GetStride(); + m_vertexDeclaration = vertexDeclaration; +} + +void NzVertexBuffer::Reset(const NzVertexDeclaration* vertexDeclaration, unsigned int length, nzBufferStorage storage, nzBufferUsage usage) +{ + #if NAZARA_UTILITY_SAFE + if (!vertexDeclaration) + { + NazaraError("Vertex declaration is invalid"); + return; + } + #endif + + m_endOffset = length*vertexDeclaration->GetStride(); + m_startOffset = 0; + m_vertexCount = length; + + m_buffer = new NzBuffer(nzBufferType_Vertex, m_endOffset, storage, usage); + m_buffer->SetPersistent(false); + m_vertexDeclaration = vertexDeclaration; +} + +void NzVertexBuffer::Reset(const NzVertexBuffer& vertexBuffer) +{ + m_buffer = vertexBuffer.m_buffer; + m_endOffset = vertexBuffer.m_endOffset; + m_startOffset = vertexBuffer.m_startOffset; + m_vertexCount = vertexBuffer.m_vertexCount; + m_vertexDeclaration = vertexBuffer.m_vertexDeclaration; +} + +void NzVertexBuffer::Reset(NzVertexBuffer&& vertexBuffer) noexcept +{ + m_buffer = std::move(vertexBuffer.m_buffer); + m_endOffset = vertexBuffer.m_endOffset; + m_startOffset = vertexBuffer.m_startOffset; + m_vertexCount = vertexBuffer.m_vertexCount; + m_vertexDeclaration = std::move(vertexBuffer.m_vertexDeclaration); } bool NzVertexBuffer::SetStorage(nzBufferStorage storage) @@ -196,3 +243,17 @@ void NzVertexBuffer::Unmap() const { m_buffer->Unmap(); } + +NzVertexBuffer& NzVertexBuffer::operator=(const NzVertexBuffer& vertexBuffer) +{ + Reset(vertexBuffer); + + return *this; +} + +NzVertexBuffer& NzVertexBuffer::operator=(NzVertexBuffer&& vertexBuffer) noexcept +{ + Reset(vertexBuffer); + + return *this; +}