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
u32 w, h;
- GLuint tile_vao;
- GLuint tile_vbo;
- GLuint circle_vao;
- GLuint circle_vbo;
+ struct mesh tile, circle;
int selected;
{
// 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,
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);
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
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();
}
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 );
}
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 ++ )
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 ++ )
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 };
// 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
{
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 );
}
}
}
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 );
}
}
}