Added wrappers for VBO and EBO

This commit is contained in:
korenkonder
2023-12-01 16:27:26 +03:00
parent c503aa89d8
commit 7b1866e63d
14 changed files with 464 additions and 526 deletions
+141
View File
@@ -0,0 +1,141 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#pragma once
#include <glad/glad.h>
#include "../gl_state.hpp"
namespace GL {
struct ArrayBuffer {
private:
GLuint buffer;
public:
inline ArrayBuffer() : buffer() {
}
inline ~ArrayBuffer() {
}
inline void Bind(bool force = false) {
gl_state_bind_array_buffer(buffer, force);
}
inline void Create(size_t size) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
}
else {
glGenBuffers(1, &buffer);
gl_state_bind_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size,
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
}
}
inline void Create(size_t size, const void* data, bool dynamic = false) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
}
else {
glGenBuffers(1, &buffer);
gl_state_bind_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
}
}
inline void Destroy() {
if (buffer) {
glDeleteBuffers(1, &buffer);
buffer = 0;
}
}
inline bool IsNull() {
return !buffer;
}
inline void* MapMemory() {
if (!buffer)
return 0;
void* data;
if (GLAD_GL_VERSION_4_5)
data = glMapNamedBuffer(buffer, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(buffer);
data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (data)
return data;
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
return 0;
}
inline bool NotNull() {
return !!buffer;
}
inline void UnmapMemory() {
if (!buffer)
return;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(buffer);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
}
inline void WriteMemory(size_t offset, size_t size, const void* data) {
if (!buffer)
return;
if (GLAD_GL_VERSION_4_5)
glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data);
else {
gl_state_bind_array_buffer(buffer);
glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data);
}
}
template<typename T>
inline void WriteMemory(T& data) {
if (!buffer)
return;
if (GLAD_GL_VERSION_4_5)
glNamedBufferSubData(buffer, 0, sizeof(T), &data);
else {
gl_state_bind_array_buffer(buffer);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(T), &data);
}
}
};
}
+141
View File
@@ -0,0 +1,141 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#pragma once
#include <glad/glad.h>
#include "../gl_state.hpp"
namespace GL {
struct ElementArrayBuffer {
private:
GLuint buffer;
public:
inline ElementArrayBuffer() : buffer() {
}
inline ~ElementArrayBuffer() {
}
inline void Bind(bool force = false) {
gl_state_bind_element_array_buffer(buffer, force);
}
inline void Create(size_t size) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
}
else {
glGenBuffers(1, &buffer);
gl_state_bind_element_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size,
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
}
}
inline void Create(size_t size, const void* data, bool dynamic = false) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
}
else {
glGenBuffers(1, &buffer);
gl_state_bind_element_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
}
}
inline void Destroy() {
if (buffer) {
glDeleteBuffers(1, &buffer);
buffer = 0;
}
}
inline bool IsNull() {
return !buffer;
}
inline void* MapMemory() {
if (!buffer)
return 0;
void* data;
if (GLAD_GL_VERSION_4_5)
data = glMapNamedBuffer(buffer, GL_WRITE_ONLY);
else {
gl_state_bind_element_array_buffer(buffer);
data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (data)
return data;
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_element_array_buffer(0);
return 0;
}
inline bool NotNull() {
return !!buffer;
}
inline void UnmapMemory() {
if (!buffer)
return;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(buffer);
else {
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
gl_state_bind_element_array_buffer(0);
}
}
inline void WriteMemory(size_t offset, size_t size, const void* data) {
if (!buffer)
return;
if (GLAD_GL_VERSION_4_5)
glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data);
else {
gl_state_bind_element_array_buffer(buffer);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data);
}
}
template<typename T>
inline void WriteMemory(T& data) {
if (!buffer)
return;
if (GLAD_GL_VERSION_4_5)
glNamedBufferSubData(buffer, 0, sizeof(T), &data);
else {
gl_state_bind_element_array_buffer(buffer);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(T), &data);
}
}
};
}
+20 -9
View File
@@ -21,13 +21,17 @@ namespace GL {
}
inline void Bind(int32_t index, bool force = false) {
gl_state_bind_shader_storage_buffer_base(index, buffer, force);
}
inline void Create(size_t size) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
}
else {
glGenBuffers(1, &buffer);
@@ -41,28 +45,27 @@ namespace GL {
}
inline void Create(size_t size, const void* data) {
inline void Create(size_t size, const void* data, bool dynamic = false) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data, 0);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
}
else {
glGenBuffers(1, &buffer);
gl_state_bind_shader_storage_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, 0);
glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, GL_STATIC_DRAW);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
}
}
inline void Bind(int32_t index) {
gl_state_bind_shader_storage_buffer_base(index, buffer);
}
inline void Destroy() {
if (buffer) {
glDeleteBuffers(1, &buffer);
@@ -70,6 +73,10 @@ namespace GL {
}
}
inline bool IsNull() {
return !buffer;
}
inline void* MapMemory() {
if (!buffer)
return 0;
@@ -90,6 +97,10 @@ namespace GL {
return 0;
}
inline bool NotNull() {
return !!buffer;
}
inline void UnmapMemory() {
if (!buffer)
return;
+20 -9
View File
@@ -21,13 +21,17 @@ namespace GL {
}
inline void Bind(int32_t index, bool force = false) {
gl_state_bind_uniform_buffer_base(index, buffer, force);
}
inline void Create(size_t size) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
}
else {
glGenBuffers(1, &buffer);
@@ -41,28 +45,27 @@ namespace GL {
}
inline void Create(size_t size, const void* data) {
inline void Create(size_t size, const void* data, bool dynamic = false) {
if (buffer)
return;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data, 0);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
}
else {
glGenBuffers(1, &buffer);
gl_state_bind_uniform_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, 0);
glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, GL_STATIC_DRAW);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
}
}
inline void Bind(int32_t index) {
gl_state_bind_uniform_buffer_base(index, buffer);
}
inline void Destroy() {
if (buffer) {
glDeleteBuffers(1, &buffer);
@@ -70,6 +73,10 @@ namespace GL {
}
}
inline bool IsNull() {
return !buffer;
}
inline void* MapMemory() {
if (!buffer)
return 0;
@@ -90,6 +97,10 @@ namespace GL {
return 0;
}
inline bool NotNull() {
return !!buffer;
}
inline void UnmapMemory() {
if (!buffer)
return;
+4 -2
View File
@@ -16,6 +16,8 @@
#include "../../KKdLib/mat.hpp"
#include "../../KKdLib/txp.hpp"
#include "../../KKdLib/vec.hpp"
#include "../GL/array_buffer.hpp"
#include "../GL/element_array_buffer.hpp"
#include "../GL/uniform_buffer.hpp"
#include "../color.hpp"
#include "../file_handler.hpp"
@@ -759,8 +761,8 @@ namespace Glitter {
DispType disp_type;
FogType fog_type;
GLuint vao;
GLuint vbo;
GLuint ebo;
GL::ArrayBuffer vbo;
GL::ElementArrayBuffer ebo;
float_t emission;
prj::vector_pair<GLint, GLsizei> draw_list;
+12 -52
View File
@@ -82,17 +82,10 @@ namespace Glitter {
glGenVertexArrays(1, &vao);
gl_state_bind_vertex_array(vao, true);
glGenBuffers(1, &vbo);
gl_state_bind_array_buffer(vbo, true);
static const GLsizei buffer_size = sizeof(Buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_DRAW);
vbo.Create(buffer_size * max_count);
vbo.Bind();
if (is_quad) {
size_t count = max_count / 4 * 5;
@@ -105,14 +98,8 @@ namespace Glitter {
ebo_data[i + 4] = (uint16_t)0xFFFFFFFF;
}
glGenBuffers(1, &ebo);
gl_state_bind_element_array_buffer(ebo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, 0);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, GL_STATIC_DRAW);
ebo.Create(sizeof(uint16_t) * count, ebo_data);
ebo.Bind();
free_def(ebo_data);
}
@@ -267,15 +254,8 @@ namespace Glitter {
particle = 0;
}
if (ebo) {
glDeleteBuffers(1, &ebo);
ebo = 0;
}
if (vbo) {
glDeleteBuffers(1, &vbo);
vbo = 0;
}
ebo.Destroy();
vbo.Destroy();
if (vao) {
glDeleteVertexArrays(1, &vao);
@@ -426,17 +406,10 @@ namespace Glitter {
glGenVertexArrays(1, &vao);
gl_state_bind_vertex_array(vao, true);
glGenBuffers(1, &vbo);
gl_state_bind_array_buffer(vbo, true);
static const GLsizei buffer_size = sizeof(Buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_DRAW);
vbo.Create(buffer_size * max_count);
vbo.Bind();
if (is_quad) {
size_t count = max_count / 4 * 5;
@@ -449,14 +422,8 @@ namespace Glitter {
ebo_data[i + 4] = (uint16_t)0xFFFFFFFF;
}
glGenBuffers(1, &ebo);
gl_state_bind_element_array_buffer(ebo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, 0);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, GL_STATIC_DRAW);
ebo.Create(sizeof(uint16_t) * count, ebo_data);
ebo.Bind();
free_def(ebo_data);
}
@@ -630,15 +597,8 @@ namespace Glitter {
particle = 0;
}
if (ebo) {
glDeleteBuffers(1, &ebo);
ebo = 0;
}
if (vbo) {
glDeleteBuffers(1, &vbo);
vbo = 0;
}
ebo.Destroy();
vbo.Destroy();
if (vao) {
glDeleteVertexArrays(1, &vao);
+30 -151
View File
@@ -232,7 +232,7 @@ namespace Glitter {
}
void F2RenderScene::CalcDispLine(F2RenderGroup* rend_group) {
if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1)
if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1)
return;
size_t count = 0;
@@ -267,19 +267,9 @@ namespace Glitter {
else
rend_group->mat_draw = mat4_identity;
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
elem = rend_group->elements;
size_t disp = 0;
@@ -322,16 +312,11 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void F2RenderScene::CalcDispLocus(GPM, F2RenderGroup* rend_group) {
if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1)
if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1)
return;
size_t count = 0;
@@ -385,19 +370,9 @@ namespace Glitter {
mat3_transform_vector(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec);
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
elem = rend_group->elements;
vec2 split_uv = rend_group->split_uv;
@@ -481,16 +456,11 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void F2RenderScene::CalcDispQuad(GPM, F2RenderGroup* rend_group) {
if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1)
if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1)
return;
mat4 model_mat;
@@ -589,19 +559,9 @@ namespace Glitter {
vec3 scale;
mat4_get_scale(model_mat, &scale);
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
bool use_scale = rend_group->flags & PARTICLE_SCALE ? true : false;
RenderElement* elem = rend_group->elements;
@@ -683,12 +643,7 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void F2RenderScene::CalcDispQuadNormal(GPM,
@@ -753,19 +708,9 @@ namespace Glitter {
mat4_transform_vector(&inv_model_mat, &x_vec, &x_vec);
mat4_transform_vector(&inv_model_mat, &y_vec, &y_vec);
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
RenderElement* elem = rend_group->elements;
vec2 split_uv = rend_group->split_uv;
@@ -919,12 +864,7 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void F2RenderScene::Ctrl(GLT, float_t delta_frame) {
@@ -1256,7 +1196,7 @@ namespace Glitter {
}
void XRenderScene::CalcDispLine(XRenderGroup* rend_group) {
if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1)
if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1)
return;
size_t count = 0;
@@ -1290,19 +1230,9 @@ namespace Glitter {
else
rend_group->mat_draw = mat4_identity;
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
elem = rend_group->elements;
size_t disp = 0;
@@ -1344,17 +1274,11 @@ namespace Glitter {
}
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void XRenderScene::CalcDispLocus(GPM, XRenderGroup* rend_group) {
if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1)
if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1)
return;
size_t count = 0;
@@ -1406,19 +1330,9 @@ namespace Glitter {
mat3_transform_vector(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec);
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
elem = rend_group->elements;
vec2 split_uv = rend_group->split_uv;
@@ -1502,12 +1416,7 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void XRenderScene::CalcDispMesh(GPM, XRenderGroup* rend_group) {
@@ -1701,7 +1610,7 @@ namespace Glitter {
}
void XRenderScene::CalcDispQuad(GPM, XRenderGroup* rend_group) {
if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1)
if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1)
return;
mat4 model_mat;
@@ -1796,19 +1705,9 @@ namespace Glitter {
y_vec_base.y *= scale.y;
}
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
RenderElement* elem = rend_group->elements;
vec2 split_uv = rend_group->split_uv;
@@ -1888,12 +1787,7 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
void XRenderScene::CalcDispQuadNormal(XRenderGroup* rend_group, mat4* model_mat, mat4* dir_mat) {
@@ -1955,19 +1849,9 @@ namespace Glitter {
mat4_transform_vector(&inv_model_mat, &x_vec, &x_vec);
mat4_transform_vector(&inv_model_mat, &y_vec, &y_vec);
Buffer* buf;
if (GLAD_GL_VERSION_4_5)
buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY);
else {
gl_state_bind_array_buffer(rend_group->vbo);
buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
}
if (!buf) {
if (!GLAD_GL_VERSION_4_5)
gl_state_bind_array_buffer(0);
Buffer* buf = (Buffer*)rend_group->vbo.MapMemory();
if (!buf)
return;
}
RenderElement* elem = rend_group->elements;
vec2 split_uv = rend_group->split_uv;
@@ -2115,12 +1999,7 @@ namespace Glitter {
}
rend_group->disp = disp;
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(rend_group->vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
rend_group->vbo.UnmapMemory();
}
bool XRenderScene::CanDisp(DispType disp_type, bool a3) {
+7 -34
View File
@@ -83,13 +83,8 @@ screen_x_offset(), screen_y_offset(), screen_width(), screen_height(), mag_filte
glGenVertexArrays(1, &lens_ghost_vao);
gl_state_bind_vertex_array(lens_ghost_vao);
glGenBuffers(1, &lens_ghost_vbo);
gl_state_bind_array_buffer(lens_ghost_vbo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, sizeof(float_t) * 5 * (6 * 16),
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER, sizeof(float_t) * 5 * (6 * 16), 0, GL_DYNAMIC_DRAW);
lens_ghost_vbo.Create(sizeof(float_t) * 5 * (6 * 16));
lens_ghost_vbo.Bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float_t) * 5, (void*)0);
@@ -166,10 +161,7 @@ post_process::~post_process() {
lens_ghost_vao = 0;
}
if (lens_ghost_vbo) {
glDeleteBuffers(1, &lens_ghost_vbo);
lens_ghost_vbo = 0;
}
lens_ghost_vbo.Destroy();
if (lens_shaft_query[0]) {
glDeleteQueries(3, lens_shaft_query);
@@ -618,23 +610,9 @@ void post_process::draw_lens_ghost(RenderTexture* rt) {
const float_t angle_sin = sinf(angle);
const float_t angle_cos = cosf(angle);
float_t* data;
if (GLAD_GL_VERSION_4_5) {
data = (float_t*)glMapNamedBuffer(lens_ghost_vbo, GL_WRITE_ONLY);
if (!data) {
glUnmapNamedBuffer(lens_ghost_vbo);
return;
}
}
else {
gl_state_bind_array_buffer(lens_ghost_vbo);
data = (float_t*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (!data) {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
return;
}
}
float_t* data = (float_t*)lens_ghost_vbo.MapMemory();
if (!data)
return;
const float_t lens_ghost = tone_map->lens_ghost;
const int32_t lens_ghost_count = this->lens_ghost_count;
@@ -650,12 +628,7 @@ void post_process::draw_lens_ghost(RenderTexture* rt) {
make_ghost_quad((uint8_t)(i & 0x03), opacity, &mat, data);
}
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(lens_ghost_vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
lens_ghost_vbo.UnmapMemory();
rt->Bind();
rt->SetViewport();
+2 -1
View File
@@ -7,6 +7,7 @@
#include "../KKdLib/default.hpp"
#include "../KKdLib/vec.hpp"
#include "GL/array_buffer.hpp"
#include "GL/uniform_buffer.hpp"
#include "post_process/blur.hpp"
#include "post_process/dof.hpp"
@@ -78,7 +79,7 @@ struct post_process {
GLuint samplers[3];
GLuint query_vao;
GLuint lens_ghost_vao;
GLuint lens_ghost_vbo;
GL::ArrayBuffer lens_ghost_vbo;
RenderTexture mlaa_buffer;
RenderTexture temp_buffer;
GLuint mlaa_area_texture;
+20 -50
View File
@@ -479,15 +479,8 @@ namespace mdl {
for (DispManager::etc_vertex_array& i : etc_vertex_array_cache) {
glDeleteVertexArrays(1, &i.vertex_array);
if (i.vertex_buffer) {
glDeleteBuffers(1, &i.vertex_buffer);
i.vertex_buffer = 0;
}
if (i.index_buffer) {
glDeleteBuffers(1, &i.index_buffer);
i.index_buffer = 0;
}
i.vertex_buffer.Destroy();
i.index_buffer.Destroy();
}
etc_vertex_array_cache.clear();
@@ -1799,7 +1792,7 @@ namespace mdl {
DispManager::etc_vertex_array* etc_vertex_array = 0;
for (DispManager::etc_vertex_array& i : etc_vertex_array_cache) {
if (i.alive_time <= 0 || i.type != type || !i.vertex_buffer)
if (i.alive_time <= 0 || i.type != type || i.vertex_buffer.IsNull())
continue;
if (type == mdl::ETC_OBJ_TEAPOT
@@ -1996,57 +1989,34 @@ namespace mdl {
if (etc_vertex_array->max_vtx < vtx_data.size()) {
etc_vertex_array->max_vtx = vtx_data.size();
if (etc_vertex_array->vertex_buffer) {
glDeleteBuffers(1, &etc_vertex_array->vertex_buffer);
etc_vertex_array->vertex_buffer = 0;
}
etc_vertex_array->vertex_buffer.Destroy();
}
if (etc_vertex_array->max_idx < vtx_indices.size()) {
etc_vertex_array->max_idx = vtx_indices.size();
if (etc_vertex_array->index_buffer) {
glDeleteBuffers(1, &etc_vertex_array->index_buffer);
etc_vertex_array->index_buffer = 0;
}
etc_vertex_array->index_buffer.Destroy();
}
GLsizei size_vertex = sizeof(vec3) * 2;
gl_state_bind_vertex_array(etc_vertex_array->vertex_array);
if (!etc_vertex_array->vertex_buffer) {
glGenBuffers(1, &etc_vertex_array->vertex_buffer);
gl_state_bind_array_buffer(etc_vertex_array->vertex_buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, sizeof(float_t)
* vtx_data.size(), vtx_data.data(), GL_DYNAMIC_STORAGE_BIT);
else
glBufferData(GL_ARRAY_BUFFER, sizeof(float_t)
* vtx_data.size(), vtx_data.data(), GL_DYNAMIC_DRAW);
}
else {
gl_state_bind_array_buffer(etc_vertex_array->vertex_buffer);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float_t)
* vtx_data.size(), vtx_data.data());
}
if (etc_vertex_array->vertex_buffer.IsNull())
etc_vertex_array->vertex_buffer.Create(sizeof(float_t) * vtx_data.size());
if (indexed)
if (!etc_vertex_array->index_buffer) {
glGenBuffers(1, &etc_vertex_array->index_buffer);
gl_state_bind_element_array_buffer(etc_vertex_array->index_buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t)
* vtx_indices.size(), vtx_indices.data(), GL_DYNAMIC_STORAGE_BIT);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t)
* vtx_indices.size(), vtx_indices.data(), GL_DYNAMIC_DRAW);
}
else {
gl_state_bind_element_array_buffer(etc_vertex_array->index_buffer);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint32_t)
* vtx_indices.size(), vtx_indices.data());
}
etc_vertex_array->vertex_buffer.Bind();
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float_t)
* vtx_data.size(), vtx_data.data());
if (indexed) {
if (etc_vertex_array->index_buffer.IsNull())
etc_vertex_array->index_buffer.Create(sizeof(uint32_t) * vtx_indices.size());
etc_vertex_array->index_buffer.Bind();
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint32_t)
* vtx_indices.size(), vtx_indices.data());
}
glEnableVertexAttribArray(POSITION_INDEX);
glVertexAttribPointer(POSITION_INDEX,
@@ -3840,8 +3810,8 @@ render_context::~render_context() {
contour_params_ubo.Destroy();
contour_coef_ubo.Destroy();
glDeleteVertexArrays(1, &box_vao);
glDeleteBuffers(1, &box_vbo);
glDeleteVertexArrays(1, &box_vao);
if (camera) {
delete camera;
+4 -2
View File
@@ -8,6 +8,8 @@
#include "../KKdLib/default.hpp"
#include "../KKdLib/time.hpp"
#include "../KKdLib/vec.hpp"
#include "GL/array_buffer.hpp"
#include "GL/element_array_buffer.hpp"
#include "GL/uniform_buffer.hpp"
#include "light_param/face.hpp"
#include "light_param/fog.hpp"
@@ -521,8 +523,8 @@ namespace mdl {
};
struct etc_vertex_array {
GLuint vertex_buffer;
GLuint index_buffer;
GL::ArrayBuffer vertex_buffer;
GL::ElementArrayBuffer index_buffer;
int32_t alive_time;
GLuint vertex_array;
EtcObj::Data data;
+23 -70
View File
@@ -7,6 +7,8 @@
#include "../KKdLib/prj/shared_ptr.hpp"
#include "../KKdLib/prj/stack_allocator.hpp"
#include "../KKdLib/txp.hpp"
#include "GL/array_buffer.hpp"
#include "GL/element_array_buffer.hpp"
#include "data.hpp"
#include "file_handler.hpp"
#include "shader_ft.hpp"
@@ -122,9 +124,9 @@ namespace spr {
std::vector<sprite_draw_vertex> vertex_buffer;
std::vector<uint32_t> index_buffer;
GLuint vao;
GLuint vbo;
GL::ArrayBuffer vbo;
size_t vbo_vertex_count;
GLuint ebo;
GL::ElementArrayBuffer ebo;
size_t ebo_index_count;
RenderData();
@@ -590,23 +592,16 @@ void sprite_manager_free() {
}
namespace spr {
SpriteManager::RenderData::RenderData() {
SpriteManager::RenderData::RenderData() : vao() {
glGenVertexArrays(1, &vao);
gl_state_bind_vertex_array(vao, true);
glGenBuffers(1, &vbo);
gl_state_bind_array_buffer(vbo, true);
vbo_vertex_count = 4096;
static const GLsizei buffer_size = sizeof(sprite_draw_vertex);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_STORAGE_BIT);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_DRAW);
vbo.Create(buffer_size * vbo_vertex_count);
vbo.Bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size,
@@ -621,17 +616,10 @@ namespace spr {
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, buffer_size,
(void*)offsetof(sprite_draw_vertex, uv[1]));
glGenBuffers(1, &ebo);
gl_state_bind_element_array_buffer(ebo, true);
ebo_index_count = 4096;
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_STORAGE_BIT);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_DRAW);
ebo.Create(sizeof(uint32_t) * ebo_index_count);
ebo.Bind();
gl_state_bind_array_buffer(0);
gl_state_bind_vertex_array(0);
@@ -639,15 +627,8 @@ namespace spr {
}
SpriteManager::RenderData::~RenderData() {
if (ebo) {
glDeleteBuffers(1, &ebo);
ebo = 0;
}
if (vbo) {
glDeleteBuffers(1, &vbo);
vbo = 0;
}
ebo.Destroy();
vbo.Destroy();
if (vao) {
glDeleteVertexArrays(1, &vao);
@@ -668,18 +649,13 @@ namespace spr {
while (vbo_vertex_count < vertex_buffer.size())
vbo_vertex_count *= 2;
glDeleteBuffers(1, &vbo);
glGenBuffers(1, &vbo);
vbo.Destroy();
gl_state_bind_vertex_array(vao, true);
gl_state_bind_array_buffer(vbo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_STORAGE_BIT);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_DRAW);
vbo.Create(buffer_size * vbo_vertex_count);
vbo.Bind();
glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size
* vertex_buffer.size()), vertex_buffer.data());
@@ -699,51 +675,28 @@ namespace spr {
gl_state_bind_array_buffer(0);
gl_state_bind_vertex_array(0);
}
else {
if (GLAD_GL_VERSION_4_5)
glNamedBufferSubData(vbo, 0, (GLsizeiptr)(buffer_size
* vertex_buffer.size()), vertex_buffer.data());
else {
gl_state_bind_array_buffer(vbo);
glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size
* vertex_buffer.size()), vertex_buffer.data());
gl_state_bind_array_buffer(0);
}
}
else
vbo.WriteMemory(0, buffer_size * vertex_buffer.size(), vertex_buffer.data());
if (ebo_index_count < index_buffer.size()) {
while (ebo_index_count < index_buffer.size())
ebo_index_count *= 2;
glDeleteBuffers(1, &ebo);
glGenBuffers(1, &ebo);
ebo.Destroy();
gl_state_bind_vertex_array(vao, true);
gl_state_bind_element_array_buffer(ebo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_STORAGE_BIT);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_DRAW);
ebo.Create(sizeof(uint32_t) * ebo_index_count);
ebo.Bind();
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t)
* index_buffer.size()), index_buffer.data());
gl_state_bind_vertex_array(0);
gl_state_bind_element_array_buffer(0);
}
else {
if (GLAD_GL_VERSION_4_5)
glNamedBufferSubData(ebo, 0, (GLsizeiptr)(sizeof(uint32_t)
* index_buffer.size()), index_buffer.data());
else {
gl_state_bind_array_buffer(ebo);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t)
* index_buffer.size()), index_buffer.data());
gl_state_bind_array_buffer(0);
}
}
else
ebo.WriteMemory(0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data());
}
SpriteManager::SpriteManager() : aspect(), index(), set_counter() {
+35 -132
View File
@@ -6,6 +6,7 @@
#include "task_effect.hpp"
#include "../KKdLib/prj/algorithm.hpp"
#include "../KKdLib/hash.hpp"
#include "GL/element_array_buffer.hpp"
#include "auth_3d.hpp"
#include "data.hpp"
#include "gl_state.hpp"
@@ -154,8 +155,8 @@ struct star_catalog_batch_shader_data {
};
struct star_catalog_milky_way {
GLuint vbo;
GLuint ebo;
GL::ArrayBuffer vbo;
GL::ElementArrayBuffer ebo;
GLuint vao;
GLuint sampler;
uint16_t restart_index;
@@ -352,8 +353,8 @@ static int32_t leaf_particle_num_ptcls;
static uint32_t leaf_particle_tex_id;
static leaf_particle_data* leaf_ptcl_data;
static GLuint leaf_ptcl_vao;
static GLuint leaf_ptcl_vbo;
static GLuint leaf_ptcl_ebo;
static GL::ArrayBuffer leaf_ptcl_vbo;
static GL::ElementArrayBuffer leaf_ptcl_ebo;
static GL::UniformBuffer leaf_particle_scene_ubo;
static const size_t leaf_ptcl_count = 0x800;
@@ -371,7 +372,7 @@ static int32_t particle_count;
static vec3 particle_wind;
static particle_rot_data* ptcl_data;
static GLuint ptcl_vao;
static GLuint ptcl_vbo;
static GL::ElementArrayBuffer ptcl_vbo;
static GL::UniformBuffer particle_scene_ubo;
static const size_t ptcl_count = 0x400;
@@ -2848,31 +2849,13 @@ void particle_draw() {
if (!ptcl_data)
return;
particle_vertex_data* vtx_data;
if (GLAD_GL_VERSION_4_5) {
vtx_data = (particle_vertex_data*)glMapNamedBuffer(ptcl_vbo, GL_WRITE_ONLY);
if (!vtx_data) {
glUnmapNamedBuffer(ptcl_vbo);
return;
}
}
else {
gl_state_bind_array_buffer(ptcl_vbo);
vtx_data = (particle_vertex_data*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (!vtx_data) {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
return;
}
}
particle_vertex_data* vtx_data = (particle_vertex_data*)ptcl_vbo.MapMemory();
if (!vtx_data)
return;
int32_t count = particle_disp(vtx_data, ptcl_data, ptcl_count);
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(ptcl_vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
ptcl_vbo.UnmapMemory();
if (!count)
return;
@@ -3324,8 +3307,8 @@ particle_data::particle_data() : size(), alpha(), life_time() {
}
star_catalog_milky_way::star_catalog_milky_way() : vbo(), ebo(), vao(), sampler(),
restart_index(), idx_count(), longitude_degs_10(), latitude_degs_10(), longitude_offset_degs_10(),
star_catalog_milky_way::star_catalog_milky_way() : vao(), sampler(), restart_index(),
idx_count(), longitude_degs_10(), latitude_degs_10(), longitude_offset_degs_10(),
latitude_offset_degs_10(), latitude(), longitude(), uv_rec_scale_u(), uv_rec_scale_v() {
reset();
}
@@ -3347,12 +3330,6 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal
gl_state_bind_array_buffer(0);
gl_state_bind_element_array_buffer(0);
if (!vao)
glGenVertexArrays(1, &vao);
if (!vbo)
glGenBuffers(1, &vbo);
const float_t rec_longitude_degs_10 = 1.0f / (float_t)longitude_degs_10;
const float_t rec_latitude_degs_10 = 1.0f / (float_t)latitude_degs_10;
@@ -3385,13 +3362,11 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal
vtx_data[vtx].texcoord.x = 1.0f;
vtx_data[vtx].texcoord.y = (latitude_offset_degs_10 - (1.0f / uv_rec_scale_v) * 90.0f) * rec_latitude_degs_10;
gl_state_bind_array_buffer(vbo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(star_catalog_vertex) * vtx_count), vtx_data, 0);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(star_catalog_vertex) * vtx_count), vtx_data, GL_STATIC_DRAW);
if (!vao)
glGenVertexArrays(1, &vao);
vbo.Create(sizeof(star_catalog_vertex) * vtx_count, vtx_data);
vbo.Bind();
free_def(vtx_data);
static const GLsizei buffer_size = sizeof(star_catalog_vertex);
@@ -3435,16 +3410,8 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal
ebo_data[idx + 3] = restart_index;
}
if (!ebo)
glGenBuffers(1, &ebo);
gl_state_bind_element_array_buffer(ebo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint16_t) * ebo_count), ebo_data, 0);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint16_t) * ebo_count), ebo_data, GL_STATIC_DRAW);
ebo.Create(sizeof(uint16_t) * ebo_count, ebo_data);
ebo.Bind();
free_def(ebo_data);
if (!sampler)
@@ -3470,15 +3437,8 @@ void star_catalog_milky_way::delete_buffers() {
sampler = 0;
}
if (vbo) {
glDeleteBuffers(1, &vbo);
vbo = 0;
}
if (ebo) {
glDeleteBuffers(1, &ebo);
ebo = 0;
}
vbo.Destroy();
ebo.Destroy();
if (vao) {
glDeleteVertexArrays(1, &vao);
@@ -4178,20 +4138,10 @@ static void leaf_particle_init(bool change_stage) {
if (!leaf_ptcl_vao)
glGenVertexArrays(1, &leaf_ptcl_vao);
if (!leaf_ptcl_vbo)
glGenBuffers(1, &leaf_ptcl_vbo);
static const GLsizei buffer_size = sizeof(leaf_particle_vertex_data);
gl_state_bind_array_buffer(leaf_ptcl_vbo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * leaf_ptcl_vtx_count),
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * leaf_ptcl_vtx_count),
0, GL_DYNAMIC_DRAW);
leaf_ptcl_vbo.Create(buffer_size * leaf_ptcl_vtx_count);
leaf_ptcl_vbo.Bind();
gl_state_bind_vertex_array(leaf_ptcl_vao);
glEnableVertexAttribArray(0);
@@ -4215,16 +4165,8 @@ static void leaf_particle_init(bool change_stage) {
ebo_data[i + 5] = (uint32_t)(j + 3);
}
if (!leaf_ptcl_ebo)
glGenBuffers(1, &leaf_ptcl_ebo);
gl_state_bind_element_array_buffer(leaf_ptcl_ebo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint32_t) * ebo_count), ebo_data, 0);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(GLsizeiptr)(sizeof(uint32_t) * ebo_count), ebo_data, GL_STATIC_DRAW);
leaf_ptcl_ebo.Create(sizeof(uint32_t) * ebo_count, ebo_data);
leaf_ptcl_ebo.Bind();
free_def(ebo_data);
gl_state_bind_vertex_array(0);
@@ -4319,23 +4261,9 @@ static int32_t leaf_particle_disp() {
normal[2] = sub_1406427A0(vec3(-0.2f, -0.2f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first;
normal[3] = sub_1406427A0(vec3( 0.4f, -0.4f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first;
leaf_particle_vertex_data* vtx_data;
if (GLAD_GL_VERSION_4_5) {
vtx_data = (leaf_particle_vertex_data*)glMapNamedBuffer(leaf_ptcl_vbo, GL_WRITE_ONLY);
if (!vtx_data) {
glUnmapNamedBuffer(leaf_ptcl_vbo);
return 0;
}
}
else {
gl_state_bind_array_buffer(leaf_ptcl_vbo);
vtx_data = (leaf_particle_vertex_data*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
if (!vtx_data) {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
return 0;
}
}
leaf_particle_vertex_data* vtx_data = (leaf_particle_vertex_data*)leaf_ptcl_vbo.MapMemory();
if (!vtx_data)
return 0;
int32_t vtx_count = 0;
leaf_particle_data* data = leaf_ptcl_data;
@@ -4411,12 +4339,7 @@ static int32_t leaf_particle_disp() {
}
}
if (GLAD_GL_VERSION_4_5)
glUnmapNamedBuffer(leaf_ptcl_vbo);
else {
glUnmapBuffer(GL_ARRAY_BUFFER);
gl_state_bind_array_buffer(0);
}
leaf_ptcl_vbo.UnmapMemory();
return vtx_count;
}
@@ -4431,15 +4354,8 @@ static void leaf_particle_free() {
leaf_ptcl_vao = 0;
}
if (leaf_ptcl_vbo) {
glDeleteBuffers(1, &leaf_ptcl_vbo);
leaf_ptcl_vbo = 0;
}
if (leaf_ptcl_ebo) {
glDeleteBuffers(1, &leaf_ptcl_ebo);
leaf_ptcl_ebo = 0;
}
leaf_ptcl_vbo.Destroy();
leaf_ptcl_ebo.Destroy();
leaf_particle_scene_ubo.Destroy();
}
@@ -4466,20 +4382,10 @@ static void particle_init(vec3* offset) {
if (!ptcl_vao)
glGenVertexArrays(1, &ptcl_vao);
if (!ptcl_vbo)
glGenBuffers(1, &ptcl_vbo);
static const GLsizei buffer_size = sizeof(particle_vertex_data);
gl_state_bind_array_buffer(ptcl_vbo, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * ptcl_vtx_count),
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER,
(GLsizeiptr)(buffer_size * ptcl_vtx_count),
0, GL_DYNAMIC_DRAW);
ptcl_vbo.Create(buffer_size * ptcl_vtx_count);
ptcl_vbo.Bind();
gl_state_bind_vertex_array(ptcl_vao);
glEnableVertexAttribArray(0);
@@ -4694,10 +4600,7 @@ static void particle_free() {
ptcl_vao = 0;
}
if (ptcl_vbo) {
glDeleteBuffers(1, &ptcl_vbo);
ptcl_vbo = 0;
}
ptcl_vbo.Destroy();
particle_scene_ubo.Destroy();
}
+5 -14
View File
@@ -101,7 +101,7 @@ struct common_data_struct {
struct render_data {
GLuint grid_vao;
GLuint grid_vbo;
GL::ArrayBuffer grid_vbo;
render_data();
~render_data();
@@ -355,7 +355,7 @@ void draw_pass_3d_grid(render_context* rctx) {
float_t rob_frame = 0.0f;
render_data::render_data() : grid_vao(), grid_vbo() {
render_data::render_data() : grid_vao() {
}
@@ -433,14 +433,8 @@ void render_data::load_common_data() {
glGenVertexArrays(1, &grid_vao);
gl_state_bind_vertex_array(grid_vao);
glGenBuffers(1, &grid_vbo);
gl_state_bind_array_buffer(grid_vbo);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, sizeof(float_t) * 3
* grid_vertex_count, grid_verts, 0);
else
glBufferData(GL_ARRAY_BUFFER, sizeof(float_t) * 3
* grid_vertex_count, grid_verts, GL_STATIC_DRAW);
grid_vbo.Create(sizeof(float_t) * 3 * grid_vertex_count, grid_verts);
grid_vbo.Bind();
glVertexAttrib4f(0, 0.0f, 0.0f, 0.0f, 1.0f);
glVertexAttribI1i(1, 2);
@@ -459,10 +453,7 @@ void render_data::load_common_data() {
}
void render_data::unload_common_data() {
if (grid_vbo) {
glDeleteBuffers(1, &grid_vbo);
grid_vbo = 0;
}
grid_vbo.Destroy();
if (grid_vao) {
glDeleteVertexArrays(1, &grid_vao);