test: single vertex array object

This commit is contained in:
Zack Buhman 2026-03-07 00:05:34 -06:00
parent 75bafe50af
commit 9d97d6448e

View File

@ -41,9 +41,8 @@ static const char_tpl vertex_paths[region_count] = {
{ "minecraft/region.-1.-1.instance.vtx", "minecraft/region.-1.-1.instance.cfg" },
};
static unsigned int vertex_array_objects[region_count];
static unsigned int vertex_buffers[region_count];
static unsigned int vertex_count[region_count];
static unsigned int vertex_array_object;
static unsigned int per_instance_vertex_buffers[region_count];
static unsigned int index_buffer;
static unsigned int per_vertex_buffer;
@ -87,16 +86,17 @@ void load_program()
test_program = program;
}
void load_vertex_buffer(int i)
void load_per_instance_vertex_buffer(int i)
{
int vertex_buffer_data_size;
void * vertex_buffer_data = read_file(vertex_paths[i].vtx, &vertex_buffer_data_size);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffers[i]);
glBindBuffer(GL_ARRAY_BUFFER, per_instance_vertex_buffers[i]);
glBufferData(GL_ARRAY_BUFFER, vertex_buffer_data_size, vertex_buffer_data, GL_STATIC_DRAW);
vertex_count[i] = vertex_buffer_data_size / vertex_size;
free(vertex_buffer_data);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void load_per_vertex_buffer()
@ -108,6 +108,8 @@ void load_per_vertex_buffer()
glBufferData(GL_ARRAY_BUFFER, vertex_buffer_data_size, vertex_buffer_data, GL_STATIC_DRAW);
free(vertex_buffer_data);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void load_index_buffer()
@ -119,12 +121,14 @@ void load_index_buffer()
glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_buffer_data_size, index_buffer_data, GL_STATIC_DRAW);
free(index_buffer_data);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void load_vertex_attributes(int i)
void load_vertex_attributes()
{
glBindVertexBuffer(0, per_vertex_buffer, 0, per_vertex_size);
glBindVertexBuffer(1, vertex_buffers[i], 0, vertex_size);
glGenVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);
glVertexBindingDivisor(0, 0);
glVertexBindingDivisor(1, 1);
@ -148,6 +152,8 @@ void load_vertex_attributes(int i)
glEnableVertexAttribArray(location.attrib.block_id);
glVertexAttribFormat(location.attrib.block_id, 1, GL_UNSIGNED_BYTE, GL_FALSE, 6);
glVertexAttribBinding(location.attrib.block_id, 1);
glBindVertexArray(0);
}
void load_instance_cfg(int i)
@ -161,22 +167,18 @@ void load_instance_cfg(int i)
void load_buffers()
{
load_vertex_attributes();
// per-vertex buffer
glGenBuffers(1, &per_vertex_buffer);
load_per_vertex_buffer();
// per-instance buffer
glGenVertexArrays(region_count, vertex_array_objects);
glGenBuffers(region_count, vertex_buffers);
glGenBuffers(region_count, per_instance_vertex_buffers);
for (int i = 0; i < region_count; i++) {
glBindVertexArray(vertex_array_objects[i]);
load_vertex_buffer(i);
load_vertex_attributes(i);
load_per_instance_vertex_buffer(i);
load_instance_cfg(i);
glBindVertexArray(0);
}
// index buffer
@ -206,6 +208,8 @@ void load_textures()
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data);
free(texture_data);
glBindTexture(GL_TEXTURE_2D, 0);
}
static unsigned int textures_ubo;
@ -297,10 +301,13 @@ void draw()
//glCullFace(GL_FRONT);
//glFrontFace(GL_CCW);
for (int region_index = 0; region_index < region_count; region_index++) {
glBindVertexArray(vertex_array_objects[region_index]);
glBindVertexArray(vertex_array_object);
glBindVertexBuffer(0, per_vertex_buffer, 0, per_vertex_size);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer);
for (int region_index = 0; region_index < region_count; region_index++) {
glBindVertexBuffer(1, per_instance_vertex_buffers[region_index], 0, vertex_size);
for (int configuration = 1; configuration < 64; configuration++) {
int element_count = 6 * popcount(configuration);
const void * indices = (void *)((ptrdiff_t)index_buffer_configuration_offsets[configuration]); // index into configuration.idx