Updated buffers interface
Former-commit-id: 8c8d60b6b22cc844740dbc3320af65575cec4feb
This commit is contained in:
parent
6de41bb9cf
commit
6507e1ed2d
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue