struct ui_vert *vertex_buffer;
u16 *indice_buffer;
- u32 num_verts, num_indices;
+ u32 max_verts, max_indices, cur_vert, cur_indice;
ui_rect clipping;
ui_rect cursor;
* Vertex buffer
* ----------------------------------------
*/
- u32 index_buffer_size = 20000,
- vertex_buffer_size = (index_buffer_size+(index_buffer_size/2));
+
+ vg_uictx.max_indices = 20000;
+ vg_uictx.max_verts = 30000;
/* Generate the buffer we are gonna be drawing to */
glGenVertexArrays( 1, &vg_uictx.vao );
glBindBuffer( GL_ARRAY_BUFFER, vg_uictx.vbo );
glBufferData( GL_ARRAY_BUFFER,
- vertex_buffer_size * sizeof( struct ui_vert ),
+ vg_uictx.max_verts * sizeof( struct ui_vert ),
NULL, GL_DYNAMIC_DRAW );
glBindVertexArray( vg_uictx.vao );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vg_uictx.ebo );
glBufferData( GL_ELEMENT_ARRAY_BUFFER,
- index_buffer_size * sizeof( u16 ), NULL, GL_DYNAMIC_DRAW );
+ vg_uictx.max_indices * sizeof( u16 ), NULL, GL_DYNAMIC_DRAW );
VG_CHECK_GL_ERR();
VG_CHECK_GL_ERR();
/* Alloc RAM default context */
- u32 vert_size = vertex_buffer_size*sizeof(struct ui_vert),
- inds_size = index_buffer_size *sizeof(u16);
+ u32 vert_size = vg_uictx.max_verts*sizeof(struct ui_vert),
+ inds_size = vg_uictx.max_indices*sizeof(u16);
vg_uictx.vertex_buffer = vg_linear_alloc( vg_mem.rtmemory, vert_size );
vg_uictx.indice_buffer = vg_linear_alloc( vg_mem.rtmemory, inds_size );
VG_STATIC void ui_draw( m3x3f view_override )
{
- u32 num_indices_normal = vg_uictx.num_indices;
+ u32 num_indices_normal = vg_uictx.cur_indice;
/* Append images to back of buffer */
for( int i = 0; i < vg_uictx.image_count; i ++ )
glBindBuffer( GL_ARRAY_BUFFER, vg_uictx.vbo );
glBufferSubData( GL_ARRAY_BUFFER, 0,
- vg_uictx.num_verts * sizeof( struct ui_vert ),
+ vg_uictx.cur_vert * sizeof( struct ui_vert ),
vg_uictx.vertex_buffer );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vg_uictx.ebo );
glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, 0,
- vg_uictx.num_indices * sizeof( u16 ),
+ vg_uictx.cur_indice * sizeof( u16 ),
vg_uictx.indice_buffer );
glEnable(GL_BLEND);
static struct ui_vert *ui_fill_rect_uv( ui_rect rect, u32 colour, ui_px uv[4] )
{
- struct ui_vert *vertices = &vg_uictx.vertex_buffer[ vg_uictx.num_verts ];
- u16 *indices = &vg_uictx.indice_buffer[ vg_uictx.num_indices ];
+ /* this if far from ideal but stops us from crashing */
+ if( (vg_uictx.cur_vert + 6 > vg_uictx.max_verts) ||
+ (vg_uictx.cur_indice + 4 > vg_uictx.max_indices))
+ return vg_uictx.vertex_buffer;
+
+ struct ui_vert *vertices = &vg_uictx.vertex_buffer[ vg_uictx.cur_vert ];
+ u16 *indices = &vg_uictx.indice_buffer[ vg_uictx.cur_indice ];
vertices[0].co[0] = rect[0];
vertices[0].co[1] = rect[1];
vertices[3].uv[0] = uv[0];
vertices[3].uv[1] = uv[3];
vertices[3].colour = colour;
- u16 ind_start = vg_uictx.num_verts;
+ u16 ind_start = vg_uictx.cur_vert;
ui_rect_copy( vg_uictx.clipping, vertices[0].clip );
ui_rect_copy( vg_uictx.clipping, vertices[1].clip );
indices[4] = ind_start+3;
indices[5] = ind_start+2;
- vg_uictx.num_indices += 6;
- vg_uictx.num_verts += 4;
+ vg_uictx.cur_indice += 6;
+ vg_uictx.cur_vert += 4;
return vertices;
}
vg_uictx.stack_count = 1;
- vg_uictx.num_verts = 0;
- vg_uictx.num_indices = 0;
+ vg_uictx.cur_vert = 0;
+ vg_uictx.cur_indice = 0;
ui_release_clip();