Updated buffers interface

Former-commit-id: 8c8d60b6b22cc844740dbc3320af65575cec4feb
This commit is contained in:
Lynix 2013-08-07 01:10:26 +02:00
parent 6de41bb9cf
commit 6507e1ed2d
7 changed files with 306 additions and 160 deletions

View File

@ -20,15 +20,17 @@ using NzIndexBufferRef = NzResourceRef<NzIndexBuffer>;
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;

View File

@ -21,13 +21,15 @@ using NzVertexBufferRef = NzResourceRef<NzVertexBuffer>;
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;

View File

@ -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;

View File

@ -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();

View File

@ -9,6 +9,7 @@
#include <Nazara/Utility/Config.hpp>
#include <Nazara/Utility/SoftwareBuffer.hpp>
#include <cstring>
#include <memory>
#include <stdexcept>
#include <Nazara/Utility/Debug.hpp>
@ -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<NzAbstractBuffer> 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

View File

@ -11,53 +11,14 @@
#include <stdexcept>
#include <Nazara/Utility/Debug.hpp>
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;
}

View File

@ -7,65 +7,14 @@
#include <stdexcept>
#include <Nazara/Utility/Debug.hpp>
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;
}