29 static constexpr GLenum buffer_usage_lut[] =
50 if (data.size() <
size)
52 throw std::out_of_range(
"Vertex buffer construct operation exceeded data bounds.");
56 const GLenum gl_usage = buffer_usage_lut[std::to_underlying(m_usage)];
57 glCreateBuffers(1, &m_gl_named_buffer);
58 glNamedBufferData(m_gl_named_buffer,
static_cast<GLsizeiptr
>(m_size), data.empty() ?
nullptr : data.data(), gl_usage);
68 m_gl_named_buffer{std::exchange(buffer.m_gl_named_buffer, 0)},
69 m_usage{std::move(buffer.m_usage)},
70 m_size{std::exchange(buffer.m_size, 0)}
75 if (m_gl_named_buffer)
77 glDeleteBuffers(1, &m_gl_named_buffer);
91 if (m_gl_named_buffer)
93 glDeleteBuffers(1, &m_gl_named_buffer);
96 m_gl_named_buffer = std::exchange(buffer.m_gl_named_buffer, 0);
97 m_usage = std::move(buffer.m_usage);
98 m_size = std::exchange(buffer.m_size, 0);
108 if (data.size() <
size)
110 throw std::out_of_range(
"Vertex buffer resize operation exceeded data bounds.");
117 const auto gl_usage = buffer_usage_lut[std::to_underlying(m_usage)];
118 glNamedBufferData(m_gl_named_buffer,
static_cast<GLsizeiptr
>(m_size), data.empty() ?
nullptr : data.data(), gl_usage);
130 if (
offset + data.size() > m_size)
132 throw std::out_of_range(
"Vertex buffer write operation exceeded buffer bounds.");
135 glNamedBufferSubData(m_gl_named_buffer,
static_cast<GLintptr
>(
offset),
static_cast<GLsizeiptr
>(data.size()), data.data());
147 if (
offset + data.size() > m_size)
149 throw std::out_of_range(
"Vertex buffer read operation exceeded buffer bounds.");
152 glGetNamedBufferSubData(m_gl_named_buffer,
static_cast<GLintptr
>(
offset),
static_cast<GLsizeiptr
>(data.size()), data.data());
158 if (read_offset + copy_size > read_buffer.m_size)
160 throw std::out_of_range(
"Vertex buffer copy operation exceeded read buffer bounds.");
162 if (write_offset + copy_size > m_size)
164 throw std::out_of_range(
"Vertex buffer copy operation exceeded write buffer bounds.");
167 glCopyNamedBufferSubData(read_buffer.m_gl_named_buffer, m_gl_named_buffer,
static_cast<GLintptr
>(read_offset),
static_cast<GLintptr
>(write_offset),
static_cast<GLsizeiptr
>(copy_size));
Vertex buffer object (VBO).
void repurpose(buffer_usage usage, std::size_t size, std::span< const std::byte > data={})
Repurposes the vertex buffer, changing its usage hint, size, and updating its data.
vertex_buffer()
Constructs a vertex buffer.
void copy(const vertex_buffer &read_buffer, std::size_t copy_size, std::size_t read_offset=0, std::size_t write_offset=0)
Copies a subset of another vertex buffer's data into this vertex buffer.
vertex_buffer & operator=(const vertex_buffer &buffer)
Copies another vertex buffer.
void write(std::size_t offset, std::span< const std::byte > data)
Writes data into the vertex buffer.
constexpr std::size_t size() const noexcept
Returns the size of the buffer's data, in bytes.
void read(std::size_t offset, std::span< std::byte > data) const
Reads a subset of the buffer's data from the GL and returns it to the application.
~vertex_buffer()
Destroys a vertex buffer.
constexpr buffer_usage usage() const noexcept
Return's the buffer's usage hint.
Graphics library interface.
buffer_usage
Usage hints for vertex buffers.
T offset(T longitude)
Calculates the UTC offset at a given longitude.