galaxy 1.0.0
Real-Time C++23 Game Programming Framework. Built on data-driven design principles and agile software engineering.
Loading...
Searching...
No Matches
VertexBuffer.cpp
Go to the documentation of this file.
1
7
8#include <glad/glad.h>
9
10#include "VertexBuffer.hpp"
11
12namespace galaxy
13{
15 : m_id {0}
16 , m_offset {0}
17 , m_count {0}
18 {
19 glCreateBuffers(1, &m_id);
20 }
21
23 {
24 if (this->m_id != 0)
25 {
26 glDeleteBuffers(1, &this->m_id);
27 }
28
29 this->m_id = v.m_id;
30 this->m_offset = v.m_offset;
31 this->m_count = v.m_count;
32
33 v.m_id = 0;
34 }
35
37 {
38 if (this != &v)
39 {
40 if (this->m_id != 0)
41 {
42 glDeleteBuffers(1, &this->m_id);
43 }
44
45 this->m_id = v.m_id;
46 this->m_offset = v.m_offset;
47 this->m_count = v.m_count;
48
49 v.m_id = 0;
50 }
51
52 return *this;
53 }
54
56 {
57 if (m_id != 0)
58 {
59 glDeleteBuffers(1, &m_id);
60 }
61 }
62
63 void VertexBuffer::buffer(std::span<Vertex> vertices, std::span<unsigned int> indices)
64 {
65 const auto ind_offset = indices.size_bytes();
66 m_offset = vertices.size_bytes();
67 m_count = static_cast<int>(indices.size());
68
69 glNamedBufferData(m_id, ind_offset + m_offset, nullptr, GL_DYNAMIC_DRAW);
70 glNamedBufferSubData(m_id, 0, m_offset, vertices.data());
71 glNamedBufferSubData(m_id, m_offset, ind_offset, indices.data());
72 }
73
74 void VertexBuffer::reserve(const int vertex_count, const int index_count)
75 {
76 const auto vertex_length = vertex_count * sizeof(Vertex);
77 const auto index_length = index_count * sizeof(unsigned int);
78
79 m_offset = vertex_length;
80 m_count = index_count;
81
82 glNamedBufferData(m_id, vertex_length + index_length, nullptr, GL_DYNAMIC_DRAW);
83 }
84
86 const unsigned int vi,
87 const int vertex_size,
88 const std::span<Vertex> vertices,
89 const unsigned int ei,
90 const int index_size,
91 std::span<unsigned int> indices
92 ) const
93 {
94 glNamedBufferSubData(m_id, vi * sizeof(Vertex), vertex_size * sizeof(Vertex), vertices.data());
95 glNamedBufferSubData(m_id, m_offset + (ei * sizeof(unsigned int)), index_size * sizeof(unsigned int), indices.data());
96 }
97
98 void VertexBuffer::sub_buffer_vertices(const unsigned int vi, const int vertex_size, const std::span<Vertex> vertices) const
99 {
100 glNamedBufferSubData(m_id, vi * sizeof(Vertex), vertex_size * sizeof(Vertex), vertices.data());
101 }
102
103 void VertexBuffer::sub_buffer_indices(const unsigned int ei, const int index_size, std::span<unsigned int> indices) const
104 {
105 glNamedBufferSubData(m_id, m_offset + (ei * sizeof(unsigned int)), index_size * sizeof(unsigned int), indices.data());
106 }
107
108 void VertexBuffer::erase(const unsigned int vi, const int vertex_count, const unsigned int ei, const int index_count) const
109 {
110 glNamedBufferSubData(m_id, vi * sizeof(Vertex), vertex_count * sizeof(Vertex), nullptr);
111 glNamedBufferSubData(m_id, m_offset + (ei * sizeof(unsigned int)), index_count * sizeof(unsigned int), nullptr);
112 }
113
115 {
116 auto size = 0;
117
118 glGetNamedBufferParameteriv(m_id, GL_BUFFER_SIZE, &size);
119 glNamedBufferData(m_id, size, nullptr, GL_DYNAMIC_DRAW);
120 }
121
122 int VertexBuffer::count() const noexcept
123 {
124 return m_count;
125 }
126
127 void* VertexBuffer::offset() noexcept
128 {
129 return (void*)m_offset;
130 }
131
132 unsigned int VertexBuffer::id() const noexcept
133 {
134 return m_id;
135 }
136} // namespace galaxy
thread_local const float vertices[]
Video.cpp galaxy.
Definition Video.cpp:19
thread_local const unsigned int indices[]
Definition Video.cpp:21
Abstraction for OpenGL vertex buffer objects.
unsigned int m_id
ID returned by OpenGL when generating buffer.
void buffer(std::span< Vertex > vertices, std::span< unsigned int > indices)
Create vertex buffer.
int count() const noexcept
Get the index count.
int m_count
Index buffer count.
VertexBuffer()
Constructor.
void sub_buffer_indices(const unsigned int ei, const int index_size, std::span< unsigned int > indices) const
Sub-buffer element/index buffer.
void sub_buffer_vertices(const unsigned int vi, const int vertex_size, const std::span< Vertex > vertices) const
Sub-buffer vertex buffer.
void sub_buffer(const unsigned int vi, const int vertex_size, const std::span< Vertex > vertices, const unsigned int ei, const int index_size, std::span< unsigned int > indices) const
Sub-buffer vertex buffer.
void clear() const
Clear buffer data.
void erase(const unsigned int vi, const int vertex_count, const unsigned int ei, const int index_count) const
Erase a specfic segment of data.
void * offset() noexcept
Gets index offset.
void reserve(const int vertex_count, const int index_count)
Create vertex buffer without uploading.
VertexBuffer & operator=(VertexBuffer &&) noexcept
Move assignment operator.
~VertexBuffer()
Destructor.
std::size_t m_offset
Index buffer offset.
unsigned int id() const noexcept
Get OpenGL handle.
Animated.cpp galaxy.
Definition Animated.cpp:16
Represents a single vertex point.
Definition Vertex.hpp:24