mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-06-17 16:17:02 +08:00
63 lines
1.9 KiB
C++
63 lines
1.9 KiB
C++
#include "Cubed/gameplay/vertex_data.hpp"
|
|
|
|
#include "Cubed/gameplay/world.hpp"
|
|
|
|
namespace Cubed {
|
|
VertexData::VertexData(World& world) : m_world(world) {}
|
|
VertexData::~VertexData() {
|
|
if (m_vbo != 0) {
|
|
m_world.push_delete_vbo(m_vbo);
|
|
}
|
|
if (m_vao != 0) {
|
|
m_world.push_delete_vao(m_vao);
|
|
}
|
|
}
|
|
VertexData::VertexData(VertexData&& o) noexcept
|
|
: m_vertices(std::move(o.m_vertices)), m_vbo(o.m_vbo), m_vao(o.m_vao),
|
|
m_sum(o.m_sum.load()), m_world(o.m_world) {
|
|
o.m_vbo = 0;
|
|
o.m_sum = 0;
|
|
o.m_vao = 0;
|
|
}
|
|
VertexData& VertexData::operator=(VertexData&& o) noexcept {
|
|
m_vbo = o.m_vbo;
|
|
o.m_vbo = 0;
|
|
m_sum = o.m_sum.load();
|
|
o.m_sum = 0;
|
|
m_vertices = std::move(o.m_vertices);
|
|
m_vao = o.m_vao;
|
|
o.m_vao = 0;
|
|
return *this;
|
|
}
|
|
void VertexData::upload() {
|
|
if (m_vertices.size() == 0) {
|
|
return;
|
|
}
|
|
if (m_vao == 0) {
|
|
glGenVertexArrays(1, &m_vao);
|
|
}
|
|
if (m_vbo == 0) {
|
|
glGenBuffers(1, &m_vbo);
|
|
}
|
|
glBindVertexArray(m_vao);
|
|
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
|
|
glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(Vertex3D),
|
|
m_vertices.data(), GL_DYNAMIC_DRAW);
|
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D), (void*)0);
|
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
|
|
(void*)offsetof(Vertex3D, s));
|
|
glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
|
|
(void*)offsetof(Vertex3D, layer));
|
|
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex3D),
|
|
(void*)offsetof(Vertex3D, nx));
|
|
glEnableVertexAttribArray(0);
|
|
glEnableVertexAttribArray(1);
|
|
glEnableVertexAttribArray(2);
|
|
glEnableVertexAttribArray(3);
|
|
|
|
glBindVertexArray(0);
|
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
}
|
|
void VertexData::update_sum() { m_sum = m_vertices.size(); }
|
|
} // namespace Cubed
|