From ab7f9c0826344344193502caaaa72c4abe48248c Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 27 Sep 2021 19:25:43 +0100 Subject: [PATCH] added SANE mesh api --- fishladder.c | 110 +++++++++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/fishladder.c b/fishladder.c index c928a81..dc2d540 100644 --- a/fishladder.c +++ b/fishladder.c @@ -62,6 +62,44 @@ static void colour_code_v3( char cc, v3f target ) v3_copy( (v3f){0.0f,0.0f,0.0f}, target ); } +struct mesh +{ + GLuint vao, vbo; + u32 elements; +}; + +static void init_mesh( struct mesh *m, float *tris, u32 length ) +{ + m->elements = length/3; + glGenVertexArrays( 1, &m->vao ); + glGenBuffers( 1, &m->vbo ); + + glBindVertexArray( m->vao ); + glBindBuffer( GL_ARRAY_BUFFER, m->vbo ); + glBufferData( GL_ARRAY_BUFFER, length*sizeof(float), tris, GL_STATIC_DRAW ); + + glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0 ); + glEnableVertexAttribArray( 0 ); + + VG_CHECK_GL(); +} + +static void free_mesh( struct mesh *m ) +{ + glDeleteVertexArrays( 1, &m->vao ); + glDeleteBuffers( 1, &m->vbo ); +} + +static void draw_mesh( int const start, int const count ) +{ + glDrawArrays( GL_TRIANGLES, start*3, count*3 ); +} + +static void use_mesh( struct mesh *m ) +{ + glBindVertexArray( m->vao ); +} + struct world { struct cell @@ -89,10 +127,7 @@ struct world u32 w, h; - GLuint tile_vao; - GLuint tile_vbo; - GLuint circle_vao; - GLuint circle_vbo; + struct mesh tile, circle; int selected; @@ -261,9 +296,6 @@ void vg_start(void) { // Quad mesh { - glGenVertexArrays( 1, &world.tile_vao ); - glGenBuffers( 1, &world.tile_vbo ); - float quad_mesh[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, @@ -276,27 +308,11 @@ void vg_start(void) 0.75f, 0.375f, 0.25f, 0.5f, 0.75f, 0.625f }; - glBindVertexArray( world.tile_vao ); - glBindBuffer( GL_ARRAY_BUFFER, world.tile_vbo ); - glBufferData - ( - GL_ARRAY_BUFFER, - sizeof( quad_mesh ), - quad_mesh, - GL_STATIC_DRAW - ); - - glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0 ); - glEnableVertexAttribArray( 0 ); - - VG_CHECK_GL(); + init_mesh( &world.tile, quad_mesh, vg_list_size(quad_mesh) ); } // Circle mesh { - glGenVertexArrays( 1, &world.circle_vao ); - glGenBuffers( 1, &world.circle_vbo ); - float circle_mesh[32*6*3]; int res = vg_list_size( circle_mesh ) / (6*3); @@ -322,14 +338,7 @@ void vg_start(void) v2_copy( v1, circle_mesh+i*6+2 ); } - glBindVertexArray( world.circle_vao ); - glBindBuffer( GL_ARRAY_BUFFER, world.circle_vbo ); - glBufferData( GL_ARRAY_BUFFER, sizeof( circle_mesh ), circle_mesh, GL_STATIC_DRAW ); - - glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0 ); - glEnableVertexAttribArray( 0 ); - - VG_CHECK_GL(); + init_mesh( &world.circle, circle_mesh, vg_list_size( circle_mesh ) ); } map_load @@ -349,11 +358,8 @@ void vg_start(void) void vg_free(void) { - glDeleteVertexArrays( 1, &world.tile_vao ); - glDeleteBuffers( 1, &world.tile_vbo ); - - glDeleteVertexArrays( 1, &world.circle_vao ); - glDeleteBuffers( 1, &world.circle_vbo ); + free_mesh( &world.tile ); + free_mesh( &world.circle ); map_free(); } @@ -696,7 +702,7 @@ void vg_render(void) glClearColor( 0.8f, 0.8f, 0.8f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - glBindVertexArray( world.tile_vao ); + use_mesh( &world.tile ); SHADER_USE( shader_tile_colour ); glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); @@ -713,7 +719,7 @@ void vg_render(void) } glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)x - 0.2f, (float)y - 0.15f, 1.0f ); - glDrawArrays( GL_TRIANGLES, 0, 6 ); + draw_mesh( 0, 2 ); } for( int y = 0; y < world.h; y ++ ) @@ -749,17 +755,11 @@ void vg_render(void) glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, colour ); - glDrawArrays( GL_TRIANGLES, 0, 6 ); - - if( cell->state & FLAG_CANAL ) - { - glUniform4f( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1.0f, 1.0f, 1.0f, 1.0f ); - glDrawArrays( GL_TRIANGLES, 6, 3 ); - } + draw_mesh( 0, 2 ); } } - glBindVertexArray( world.circle_vao ); + use_mesh( &world.circle ); // Draw i/o arrays for( int i = 0; i < arrlen( world.io ); i ++ ) @@ -770,9 +770,9 @@ void vg_render(void) int is_input = world.data[ term->id ].state & FLAG_INPUT; int const filled_start = 0; - int const filled_count = 32*3; - int const empty_start = 32*3; - int const empty_count = 32*6; + int const filled_count = 32; + int const empty_start = 32; + int const empty_count = 32*2; v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f }; @@ -787,9 +787,9 @@ void vg_render(void) // Draw filled if tick not passed, draw empty if empty if( world.sim_frame > j ) - glDrawArrays( GL_TRIANGLES, empty_start, empty_count ); + draw_mesh( empty_start, empty_count ); else - glDrawArrays( GL_TRIANGLES, filled_start, filled_count ); + draw_mesh( filled_start, filled_count ); } else { @@ -799,13 +799,13 @@ void vg_render(void) v3_muls( dot_colour, 0.8f, dot_colour ); glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); - glDrawArrays( GL_TRIANGLES, filled_start, filled_count ); + draw_mesh( filled_start, filled_count ); } colour_code_v3( term->conditions[j], dot_colour ); glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); - glDrawArrays( GL_TRIANGLES, empty_start, empty_count ); + draw_mesh( empty_start, empty_count ); } } } @@ -829,7 +829,7 @@ void vg_render(void) glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour ); glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)fish->pos[0] + 0.5f - (float)fish->dir[0]*lerp, (float)fish->pos[1] + 0.25f - (float)fish->dir[1]*lerp, 0.25f ); - glDrawArrays( GL_TRIANGLES, 0, 32*3 ); + draw_mesh( 0, 32 ); } } } -- 2.25.1