textures working on web, separation of vertex and index buffers (actually matters)

This commit is contained in:
veclavtalica
2025-02-21 23:34:01 +03:00
parent d76ea06470
commit 814269ab0c
5 changed files with 150 additions and 71 deletions

View File

@ -29,6 +29,18 @@ void delete_vertex_buffer(VertexBuffer buffer) {
}
IndexBuffer create_index_buffer(void) {
GLuint result;
glGenBuffers(1, &result);
return result;
}
void delete_index_buffer(IndexBuffer buffer) {
glDeleteBuffers(1, &buffer);
}
void specify_vertex_buffer(VertexBuffer buffer, void const *data, size_t bytes) {
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, bytes, data, GL_STREAM_DRAW);
@ -36,14 +48,21 @@ void specify_vertex_buffer(VertexBuffer buffer, void const *data, size_t bytes)
}
VertexBuffer get_quad_element_buffer(void) {
static VertexBuffer buffer = 0;
void specify_index_buffer(IndexBuffer buffer, void const *data, size_t bytes) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, bytes, data, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
IndexBuffer get_quad_element_buffer(void) {
static IndexBuffer buffer = 0;
/* it's only generated once at runtime */
/* TODO: use builder interface, not direct calls (glMapBuffer isn't portable) */
if (buffer == 0) {
buffer = create_vertex_buffer();
VertexBufferBuilder builder = build_vertex_buffer(buffer, sizeof (GLshort) * QUAD_ELEMENT_BUFFER_LENGTH * 6 );
buffer = create_index_buffer();
IndexBufferBuilder builder = build_index_buffer(buffer, sizeof (GLshort) * QUAD_ELEMENT_BUFFER_LENGTH * 6 );
for (size_t i = 0; i < QUAD_ELEMENT_BUFFER_LENGTH; ++i) {
((GLshort *)builder.base)[i * 6 + 0] = (GLshort)(i * 4 + 0);
@ -54,7 +73,7 @@ VertexBuffer get_quad_element_buffer(void) {
((GLshort *)builder.base)[i * 6 + 5] = (GLshort)(i * 4 + 0);
}
finish_vertex_builder(&builder);
finish_index_builder(&builder);
}
SDL_assert_always(buffer);
@ -63,12 +82,12 @@ VertexBuffer get_quad_element_buffer(void) {
}
VertexBuffer get_circle_element_buffer(void) {
static VertexBuffer buffer = 0;
IndexBuffer get_circle_element_buffer(void) {
static IndexBuffer buffer = 0;
if (buffer == 0) {
buffer = create_vertex_buffer();
VertexBufferBuilder builder = build_vertex_buffer(buffer, sizeof (GLshort) * (CIRCLE_VERTICES_MAX - 2) * 3);
buffer = create_index_buffer();
IndexBufferBuilder builder = build_index_buffer(buffer, sizeof (GLshort) * (CIRCLE_VERTICES_MAX - 2) * 3);
for (size_t i = 1; i < CIRCLE_VERTICES_MAX - 1; ++i) {
/* first one is center point index, always zero */
@ -79,7 +98,7 @@ VertexBuffer get_circle_element_buffer(void) {
((GLshort *)builder.base)[(i - 1) * 3 + 2] = (GLshort)i + 1;
}
finish_vertex_builder(&builder);
finish_index_builder(&builder);
}
SDL_assert_always(buffer);
@ -128,7 +147,11 @@ GPUTexture create_gpu_texture(TextureFilter filter, bool generate_mipmaps, int c
SDL_assert(width > 0 && height > 0);
SDL_assert(channels > 0 && channels <= 4);
#ifndef __EMSCRIPTEN__
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, (GLboolean)generate_mipmaps);
#else
(void)generate_mipmaps;
#endif
if (filter == TEXTURE_FILTER_NEAREAST) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);