X-Git-Url: https://harrygodden.com/git/?p=fishladder.git;a=blobdiff_plain;f=fishladder.c;fp=fishladder.c;h=493b70401eabe3fec2ad0d5dd8efa1decf3b78d9;hp=aca4e406459415dd19ea0edba5a49d063a8807de;hb=a69a9e27e7de338a3116ed345ff2d9d19f084329;hpb=7756287016b03ba7eb76b0a57cebe28952a4ce41 diff --git a/fishladder.c b/fishladder.c index aca4e40..493b704 100644 --- a/fishladder.c +++ b/fishladder.c @@ -166,35 +166,6 @@ struct mesh u32 elements; }; -struct -{ - GLuint vao; - GLuint vbo; - GLuint ebo; - - u32 - title_start, title_count, - desc_start, desc_count, - score_start, score_count, - time_start, time_count, - grid_start, grid_count - ; - - #pragma pack(push,1) - struct vector_glyph_vert - { - v2f co; - v2f uv; - - u32 colour; - } - *buffer; - #pragma pack(pop) - - u16 *indices; -} -text_buffers; - static struct world { // Things that are 'static', aka, initialized once @@ -339,7 +310,6 @@ static void io_reset(void); static struct cell *pcell( v2i pos ); static void lcell( int id, v2i pos ); static void map_reclassify( v2i start, v2i end, int update_texbuffer ); -static u32 gen_text_buffer( const char *str, struct sdf_font *font, v2f origin, float size, u32 start ); static void gen_level_text( struct cmp_level *pLevel ); static int map_load( const char *str, const char *name ); static void map_serialize( FILE *stream ); @@ -673,94 +643,8 @@ static void map_reclassify( v2i start, v2i end, int update_texbuffer ) } } -static u32 gen_text_buffer( const char *str, struct sdf_font *font, v2f origin, float size, u32 start ) -{ - u32 count = 0; - - v2f cursor; - v2f invUv; - v2_copy( origin, cursor ); - - float invScale = (size / (float)font->size); - invUv[0] = 1.0f / (float)font->width; - invUv[1] = 1.0f / (float)font->height; - - u16 base_idx = start * 4; - - const char *_c = str; - char c; - while( (c = *(_c ++)) ) - { - if( c == '\n' ) - { - cursor[1] -= size * 1.25f; - cursor[0] = origin[0]; - } - else if( c >= 32 && c <= 126 ) - { - struct sdf_char *pch = &font->characters[ c - ' ' ]; - struct vector_glyph_vert *vt = &text_buffers.buffer[ count * 4 ]; - u16 *ind = &text_buffers.indices[ count * 6 ]; - - // Emit quad - v2f p0; v2f uv0; - v2f p1; v2f uv1; - - v2_muladds( cursor, (v2f){ pch->originX, -pch->originY }, -invScale, p0 ); - v2_muladds( p0, (v2f){ pch->w, -pch->h }, invScale, p1 ); - - v2_mul( (v2f){ pch->uvx, pch->uvy }, invUv, uv0 ); - v2_muladd( uv0, (v2f){ pch->w, pch->h }, invUv, uv1 ); - - v2_copy( p0, vt[0].co ); - v2_copy( uv0, vt[0].uv ); - vt[0].colour = 0xffffffff; - - v2_copy( (v2f){ p0[0], p1[1] }, vt[1].co ); - v2_copy( (v2f){ uv0[0], uv1[1] }, vt[1].uv ); - vt[1].colour = 0xffffffff; - - v2_copy( p1, vt[2].co ); - v2_copy( uv1, vt[2].uv ); - vt[2].colour = 0xffffffff; - - v2_copy( (v2f){ p1[0], p0[1] }, vt[3].co ); - v2_copy( (v2f){ uv1[0], uv0[1] }, vt[3].uv ); - vt[3].colour = 0xffffffff; - - // Emit indices - ind[0] = base_idx+count*4; - ind[1] = base_idx+count*4+1; - ind[2] = base_idx+count*4+2; - ind[3] = base_idx+count*4; - ind[4] = base_idx+count*4+2; - ind[5] = base_idx+count*4+3; - - cursor[0] += (float)pch->advance * invScale; - count ++; - } - } - - glBindVertexArray( text_buffers.vao ); - - glBindBuffer( GL_ARRAY_BUFFER, text_buffers.vbo ); - glBufferSubData( GL_ARRAY_BUFFER, - start*4*sizeof( struct vector_glyph_vert ), - count*4*sizeof( struct vector_glyph_vert ), - text_buffers.buffer - ); - - glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, text_buffers.ebo ); - glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, start*6*sizeof(u16), count*6*sizeof(u16), text_buffers.indices ); - - return count; -} - static void gen_level_text( struct cmp_level *pLevel ) { - text_buffers.title_count = gen_text_buffer( pLevel->title, &font_Ubuntu, (v2f){ -5.0f, -0.6f }, 0.6f, text_buffers.title_start ); - text_buffers.desc_count = gen_text_buffer( pLevel->description, &font_Ubuntu, (v2f){ -5.0, -0.9f }, 0.25f, text_buffers.desc_start ); - // Old style UI. ui_px const unit_scale_px = 4*UI_GLYPH_SPACING_X; // 4 char per unit ui_begin( &world.st.world_text, world.w*unit_scale_px, world.h*unit_scale_px ); @@ -3071,20 +2955,6 @@ void vg_render(void) // TEXT ELEMENTS // ======================================================================================================== - SHADER_USE( shader_sdf ); - glBindVertexArray( text_buffers.vao ); - glUniformMatrix3fv( SHADER_UNIFORM( shader_sdf, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); - - vg_tex2d_bind( &tex_ubuntu, 0 ); - glUniform1i( SHADER_UNIFORM( shader_sdf, "uTexGlyphs" ), 0 ); - - glUniform4f( SHADER_UNIFORM( shader_sdf, "uColour" ), 1.0f, 1.0f, 1.0f, 1.0f ); - glDrawElements( GL_TRIANGLES, text_buffers.title_count*6, GL_UNSIGNED_SHORT, (void*)( text_buffers.title_start*6*sizeof(u16) ) ); - glDrawElements( GL_TRIANGLES, text_buffers.desc_count*6, GL_UNSIGNED_SHORT, (void*)( text_buffers.desc_start*6*sizeof(u16) ) ); - - glUniform4f( SHADER_UNIFORM( shader_sdf, "uColour" ), 1.0f, 1.0f, 1.0f, 0.17f ); - glDrawElements( GL_TRIANGLES, text_buffers.grid_count*6, GL_UNSIGNED_SHORT, (void*)( text_buffers.grid_start*6*sizeof(u16) ) ); - // Old style m3x3f mvp_text; m3x3_identity( mvp_text ); @@ -3307,8 +3177,11 @@ void vg_render(void) void vg_ui(void) { // Drawing world name - gui_text( (ui_px [2]){ vg_window_x / 2, 4 }, "THIS IS A WORLD NAME", 2, k_text_align_center ); - gui_text( (ui_px [2]){ vg_window_x / 2, 28 }, "And here is its cool description yo", 1, k_text_align_center ); + if( world.pCmpLevel ) + { + gui_text( (ui_px [2]){ vg_window_x / 2, 4 }, world.pCmpLevel->title, 2, k_text_align_center ); + gui_text( (ui_px [2]){ vg_window_x / 2, 28 }, world.pCmpLevel->description, 1, k_text_align_center ); + } if( world.st.state == k_game_state_settings ) { @@ -3828,120 +3701,6 @@ void vg_start(void) ui_init_context( &world.st.world_text, 15000 ); } - // Create text buffers - { - // Work out the counts for each 'segment' - u32 desc_max_size = 0, title_max_size = 0, - score_max_size = 10, - time_max_size = 10, - - size_level_texts = 6*9*7 - ; - - for( int i = 0; i < vg_list_size( career_packs ); i ++ ) - { - struct career_level_pack *set = &career_packs[i]; - for( int j = 0; j < set->count; j ++ ) - { - struct cmp_level *lvl = &set->pack[j]; - - desc_max_size = VG_MAX( desc_max_size, strlen( lvl->description ) ); - title_max_size = VG_MAX( title_max_size, strlen( lvl->title ) ); - } - } - - // Full buffer - u32 total_characters = - title_max_size + - desc_max_size + - score_max_size + - time_max_size + - size_level_texts; - - u32 total_faces = total_characters * 2, - total_vertices = total_characters * 4, - total_indices = total_faces * 3; - - // Working buffer - u32 work_buffer_total_chars = - VG_MAX( 7, VG_MAX( VG_MAX( desc_max_size, title_max_size ), VG_MAX( score_max_size, time_max_size ) ) ); - - u32 total_work_faces = work_buffer_total_chars * 2, - total_work_vertices = work_buffer_total_chars * 4, - total_work_indices = total_work_faces * 3; - - text_buffers.title_count = 0; - text_buffers.desc_count = 0; - text_buffers.score_count = 0; - text_buffers.time_count = 0; - text_buffers.grid_count = size_level_texts; - - // Calculate offsets - text_buffers.title_start = 0; - text_buffers.desc_start = text_buffers.title_start + title_max_size; - text_buffers.score_start = text_buffers.desc_start + desc_max_size; - text_buffers.time_start = text_buffers.score_start + score_max_size; - text_buffers.grid_start = text_buffers.time_start + time_max_size; - - // Opengl - glGenVertexArrays(1, &text_buffers.vao); - glGenBuffers( 1, &text_buffers.vbo ); - glGenBuffers( 1, &text_buffers.ebo ); - glBindVertexArray( text_buffers.vao ); - - glBindBuffer( GL_ARRAY_BUFFER, text_buffers.vbo ); - glBufferData( GL_ARRAY_BUFFER, total_vertices * sizeof( struct vector_glyph_vert ), NULL, GL_DYNAMIC_DRAW ); - - glBindVertexArray( text_buffers.vao ); - - glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, text_buffers.ebo ); - glBufferData( GL_ELEMENT_ARRAY_BUFFER, total_indices * sizeof( u16 ), NULL, GL_DYNAMIC_DRAW ); - - u32 const stride = sizeof( struct vector_glyph_vert ); - - // XY - glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, stride, (void *)offsetof( struct vector_glyph_vert, co ) ); - glEnableVertexAttribArray( 0 ); - - // UV - glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, stride, (void *)offsetof( struct vector_glyph_vert, uv ) ); - glEnableVertexAttribArray( 1 ); - - // COLOUR - glVertexAttribPointer( 2, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, (void *)offsetof( struct vector_glyph_vert, colour ) ); - glEnableVertexAttribArray( 2 ); - - // Offline memory - text_buffers.buffer = (struct vector_glyph_vert *)malloc( total_work_vertices * sizeof(struct vector_glyph_vert) ); - text_buffers.indices = (u16*)malloc( total_work_indices * sizeof(u16) ); - - char label[8]; - for( int i = 1; i < 7; i ++ ) - label[i] = ' '; - label[7] = 0x00; - - // Reset grid - for( int x = 0; x < 6; x ++ ) - { - for( int y = 0; y < 9; y ++ ) - { - label[0] = ' '; - - if( x == 0 ) - { - if( y != 8 ) - label[0] = 'A' + y; - } - else if( y == 8 ) - { - label[0] = '0' + x; - } - - gen_text_buffer( label, &font_Ubuntu, (v2f){ -6.0f + x + (x == 0? 0.6f: 0.2f), y + 0.2f }, 0.35f, text_buffers.grid_start+(y*6+x)*7 ); - } - } - } - // Restore gamestate career_local_data_init(); career_load(); @@ -3956,13 +3715,6 @@ void vg_free(void) console_save_map( 0, NULL ); career_serialize(); - glDeleteVertexArrays( 1, &text_buffers.vao ); - glDeleteBuffers( 1, &text_buffers.vbo ); - glDeleteBuffers( 1, &text_buffers.ebo ); - - free( text_buffers.buffer ); - free( text_buffers.indices ); - resource_free_main(); glDeleteTextures( 1, &world.background_data );