From a69a9e27e7de338a3116ed345ff2d9d19f084329 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 23 Jan 2022 21:09:56 +0000 Subject: [PATCH] remove new-style text --- fishladder.c | 258 +---------------------------------------- fishladder_resources.h | 234 +++++-------------------------------- fonts/vg_font.png | Bin 4701 -> 4794 bytes maps/cmp_add3b.map | 4 +- vg/vg_pxfont.h | 20 ++-- 5 files changed, 49 insertions(+), 467 deletions(-) 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 ); diff --git a/fishladder_resources.h b/fishladder_resources.h index 030a050..a3a2a87 100644 --- a/fishladder_resources.h +++ b/fishladder_resources.h @@ -1,119 +1,3 @@ -// FONTS - -struct sdf_char -{ - u16 uvx, uvy, originX, originY, w, h, advance; -}; - -struct sdf_font -{ - const char *name; - int size, width, height; - struct sdf_char *characters; -}; - -static struct sdf_char characters_Ubuntu[] = { - {655, 167, 9, 9, 18, 18, 11}, - {561, 64, 6, 42, 25, 52, 13}, - {435, 167, 6, 45, 32, 30, 20}, - {797, 64, 7, 42, 46, 51, 32}, - {362, 0, 6, 46, 39, 60, 27}, - {918, 0, 7, 43, 55, 52, 41}, - {973, 0, 7, 43, 47, 52, 32}, - {467, 167, 6, 45, 23, 30, 11}, - {142, 0, 5, 46, 30, 64, 15}, - {172, 0, 9, 46, 30, 64, 15}, - {291, 167, 7, 42, 38, 37, 23}, - {171, 167, 6, 35, 40, 42, 27}, - {410, 167, 7, 14, 25, 31, 12}, - {625, 167, 8, 26, 30, 22, 14}, - {558, 167, 6, 15, 25, 24, 12}, - {0, 0, 10, 46, 39, 64, 18}, - {88, 64, 7, 43, 41, 52, 27}, - {532, 116, 5, 42, 32, 51, 27}, - {370, 64, 6, 43, 39, 52, 27}, - {409, 64, 6, 43, 39, 52, 27}, - {176, 116, 7, 42, 42, 51, 27}, - {448, 64, 6, 42, 39, 52, 27}, - {170, 64, 6, 42, 40, 52, 27}, - {343, 116, 6, 42, 40, 51, 27}, - {854, 0, 6, 43, 40, 53, 27}, - {210, 64, 7, 43, 40, 52, 27}, - {146, 167, 6, 34, 25, 43, 12}, - {564, 116, 7, 34, 26, 51, 12}, - {211, 167, 6, 34, 40, 39, 27}, - {370, 167, 6, 30, 40, 32, 27}, - {251, 167, 6, 34, 40, 39, 27}, - {525, 64, 8, 43, 36, 52, 19}, - {401, 0, 6, 43, 57, 59, 45}, - {700, 64, 9, 42, 49, 51, 32}, - {218, 116, 5, 42, 42, 51, 31}, - {769, 0, 6, 43, 44, 53, 30}, - {935, 64, 5, 42, 45, 51, 34}, - {383, 116, 5, 42, 40, 51, 27}, - {423, 116, 5, 42, 38, 51, 26}, - {724, 0, 6, 43, 45, 53, 32}, - {45, 116, 5, 42, 44, 51, 34}, - {590, 116, 5, 42, 23, 51, 13}, - {487, 64, 9, 42, 38, 52, 24}, - {89, 116, 5, 42, 44, 51, 30}, - {461, 116, 5, 42, 38, 51, 25}, - {646, 64, 6, 42, 54, 51, 42}, - {0, 116, 5, 42, 45, 51, 35}, - {674, 0, 6, 43, 50, 53, 37}, - {302, 116, 5, 42, 41, 51, 29}, - {312, 0, 6, 43, 50, 61, 37}, - {133, 116, 5, 42, 43, 51, 30}, - {813, 0, 7, 43, 41, 53, 25}, - {0, 64, 8, 42, 44, 52, 27}, - {44, 64, 5, 42, 44, 52, 33}, - {749, 64, 8, 42, 48, 51, 31}, - {586, 64, 8, 42, 60, 51, 44}, - {843, 64, 8, 42, 46, 51, 30}, - {889, 64, 9, 42, 46, 51, 28}, - {260, 116, 7, 42, 42, 51, 27}, - {202, 0, 4, 46, 29, 64, 16}, - {39, 0, 10, 46, 39, 64, 18}, - {231, 0, 9, 46, 29, 64, 16}, - {329, 167, 7, 42, 41, 36, 27}, - {583, 167, 9, 4, 42, 22, 23}, - {490, 167, 6, 46, 27, 28, 18}, - {695, 116, 7, 34, 38, 44, 25}, - {458, 0, 5, 46, 40, 56, 28}, - {733, 116, 7, 34, 37, 44, 22}, - {498, 0, 7, 46, 40, 56, 28}, - {655, 116, 7, 34, 40, 44, 27}, - {641, 0, 5, 46, 33, 55, 18}, - {250, 64, 7, 34, 40, 52, 27}, - {603, 0, 5, 46, 38, 55, 27}, - {894, 0, 6, 44, 24, 53, 12}, - {282, 0, 12, 44, 30, 62, 12}, - {564, 0, 5, 46, 39, 55, 25}, - {538, 0, 5, 46, 26, 56, 13}, - {860, 116, 5, 34, 52, 43, 41}, - {0, 167, 5, 34, 38, 43, 27}, - {613, 116, 7, 34, 42, 44, 28}, - {290, 64, 5, 34, 40, 52, 28}, - {330, 64, 7, 34, 40, 52, 28}, - {113, 167, 5, 34, 33, 43, 18}, - {770, 116, 7, 34, 36, 44, 21}, - {499, 116, 5, 42, 33, 51, 19}, - {38, 167, 5, 34, 38, 43, 27}, - {912, 116, 8, 34, 41, 43, 24}, - {806, 116, 8, 34, 54, 43, 37}, - {953, 116, 8, 34, 41, 43, 24}, - {129, 64, 9, 34, 41, 52, 24}, - {76, 167, 7, 34, 37, 43, 22}, - {78, 0, 7, 46, 32, 64, 16}, - {260, 0, 4, 46, 22, 64, 13}, - {110, 0, 9, 46, 32, 64, 16}, - {517, 167, 7, 27, 41, 26, 27}, -}; - -static struct sdf_font font_Ubuntu = {"Ubuntu", 48, 1024, 256, characters_Ubuntu}; - -vg_tex2d tex_ubuntu = { .path = "textures/ubuntu.qoi" }; - // TEXTURES // =========================================================================================================== @@ -140,7 +24,6 @@ vg_tex2d *texture_list[] = { &tex_monofur, &tex_unkown, &tex_buttons, - &tex_ubuntu, &tex_sprites }; @@ -590,38 +473,6 @@ SHADER_DEFINE( shader_buttons, UNIFORMS({ "uPv", "uOffset", "uTexMain", "uColour" }) ) -SHADER_DEFINE( shader_sdf, - - // VERTEX - "layout (location=0) in vec2 a_co;" - "layout (location=1) in vec2 a_uv;" - "uniform mat3 uPv;" - "" - "out vec2 aTexCoords;" - "" - "void main()" - "{" - "gl_Position = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );" - "aTexCoords = a_uv;" - "}", - - // FRAGMENT - "uniform sampler2D uTexGlyphs;" - "uniform vec4 uColour;" - "out vec4 FragColor;" - "" - "in vec2 aTexCoords;" - "" - "void main()" - "{" - "vec4 glyph = texture( uTexGlyphs, aTexCoords );" - "FragColor = vec4( uColour.rgb, smoothstep( 0.46, 0.54, glyph.r ) * uColour.a );" - //"FragColor = glyph;" - "}" - , - UNIFORMS({ "uPv", "uTexGlyphs", "uColour" }) -) - SHADER_DEFINE( shader_sprite, // VERTEX @@ -663,7 +514,6 @@ void vg_register(void) SHADER_INIT( shader_background ); SHADER_INIT( shader_wire ); SHADER_INIT( shader_buttons ); - SHADER_INIT( shader_sdf ); SHADER_INIT( shader_sprite ); } @@ -724,7 +574,6 @@ struct cmp_level static struct cmp_level cmp_levels_tutorials[] = { - // r1 { .serial_id = 0, .title = "PRINCIPLE 1", @@ -735,7 +584,6 @@ static struct cmp_level cmp_levels_tutorials[] = ._unlock = 1, .is_tutorial = 1 }, - // r1 { .serial_id = 1, .title = "PRINCIPLE 2", @@ -746,7 +594,6 @@ static struct cmp_level cmp_levels_tutorials[] = ._unlock = 2, .is_tutorial = 1, }, - // r1 { .serial_id = 2, .title = "PRINCIPLE 3", @@ -757,7 +604,6 @@ static struct cmp_level cmp_levels_tutorials[] = ._unlock = 12, .is_tutorial = 1 }, - // r1 { .serial_id = 12, .title = "PRINCIPLE 4", @@ -768,12 +614,31 @@ static struct cmp_level cmp_levels_tutorials[] = ._unlock = 6, .is_tutorial = 1, .achievement = "TUTORIALS" + }, + { + .serial_id = 15, + .title = "PRINCIPLE 5", + .map_name = "cmp_b10", + .description = + "", + + ._unlock = 16, + .is_tutorial = 1 + }, + { + .serial_id = 17, + .title = "PRINCIPLE 6", + .map_name = "cmp_b11", + .description = + "(Right click)", + + ._unlock = 18, + .is_tutorial = 1 } }; static struct cmp_level cmp_levels_basic[] = { - // r2 GM { .serial_id = 6, .title = "PATCH", @@ -784,7 +649,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 7, ._linked = 3 }, - // r1 GM { .serial_id = 3, .title = "SUBDIVISION 1", @@ -795,7 +659,6 @@ static struct cmp_level cmp_levels_basic[] = ._linked = 4, ._unlock = 5 }, - // r1 GM { .serial_id = 4, .title = "SUBDIVISION 2", @@ -805,7 +668,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 7 }, - // r1 GM { .serial_id = 5, .title = "RESTRUCTURE", @@ -815,7 +677,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 8 }, - // r2 GM { .serial_id = 7, .title = "PATTERNS 1", @@ -826,7 +687,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 15, ._linked = 8 }, - // r2 GM { .serial_id = 8, .title = "PATTERNS 2", @@ -836,18 +696,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 15 }, - // r2 GM - { - .serial_id = 15, - .title = "PRINCIPLE 5", - .map_name = "cmp_b10", - .description = - "", - - ._unlock = 16, - .is_tutorial = 1 - }, - // r2 GM { .serial_id = 16, .title = "ROUTING PROBLEM", @@ -857,7 +705,6 @@ static struct cmp_level cmp_levels_basic[] = ._linked = 9 }, - // r2 GM { .serial_id = 9, .title = "MIGHTY CONSUMER", @@ -878,7 +725,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 17 }, - // r2 GM { .serial_id = 11, .title = "REVERSE", @@ -888,18 +734,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 17 }, - // r2 GM - { - .serial_id = 17, - .title = "PRINCIPLE 6", - .map_name = "cmp_b11", - .description = - "(Right click)", - - ._unlock = 18, - .is_tutorial = 1 - }, - // r2 GM { .serial_id = 18, .title = "NOT GATE", @@ -909,7 +743,6 @@ static struct cmp_level cmp_levels_basic[] = ._linked = 19, ._unlock = 20 }, - // r2 GM { .serial_id = 19, .title = "AND GATE", @@ -918,7 +751,6 @@ static struct cmp_level cmp_levels_basic[] = ._unlock = 20 }, - // r2 GM { .serial_id = 20, .title = "QUALIFICATION PROJECT", @@ -950,7 +782,6 @@ static struct cmp_level cmp_levels_grad[] = ._linked = 21 }, - // r2 GM { .serial_id = 21, .title = "SIMPLE ADDITION", @@ -960,7 +791,6 @@ static struct cmp_level cmp_levels_grad[] = ._linked = 22, ._unlock = 23 }, - // r2 GM { .serial_id = 22, .title = "SECRET CODE", @@ -983,25 +813,25 @@ static struct cmp_level cmp_levels_computer[] = }, { .serial_id = 24, - .title = "3 BIT ADDITION", + .title = "3 BIT ADDER", .map_name = "cmp_add3b", - .description = "", + .description = "binary addition", .strings = { { .placement = k_placement_top, //.str ="\t\t\t\t\t\t\t\t\t| NUMBER A | | NUMBER B |\n" .str ="" -"\t\t\t\t\t\t\t\t\t\x80\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x82 \x80\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x81\x82\n" -"\t\t\t\t\t\t\t\t\t\x83 4 2 1 \x84 add \x83 4 2 1 \x84\n" +"\t\t\t\t\t\t\t\t\t\x8A 4 2 1 \x8B \x8A 4 2 1 \x8B\n" +"\t\t\t\t\t\t\t\t\t\x83 \x84 add \x83 \x84\n" "\t\t\t\t\t\t\t\t\t\x83 \x84 \x83 \x84" }, { .placement = k_placement_bottom, .str = "\t\t\t\x83 \x84\n" -"\t\t\t\x83 8 4 2 1 \x84 result a+b\n" -"\t\t\t\x85\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x86" +"\t\t\t\x83 \x84 result a+b\n" +"\t\t\t\x83 8 4 2 1 \x84" } }, @@ -1032,29 +862,29 @@ career_packs[] = .pack = cmp_levels_tutorials, .count = vg_list_size( cmp_levels_tutorials ), .primary_colour = { 0.204f, 0.345f, 0.553f }, - .origin = { -5, 0 }, - .dims = { 1, 4 } + .origin = { -5, -2 }, + .dims = { 1, 7 } }, { .pack = cmp_levels_basic, .count = vg_list_size( cmp_levels_basic ), .primary_colour = { 0.304f, 0.245f, 0.553f }, - .origin = { -3, 0 }, - .dims = { 3, 5 } + .origin = { -3, -2 }, + .dims = { 3, 7 } }, { .pack = cmp_levels_grad, .count = vg_list_size( cmp_levels_grad ), .primary_colour = { 0.553f, 0.345f, 0.204f }, .origin = { -5, 6 }, - .dims = { 4, 1 } + .dims = { 5, 1 } }, { .pack = cmp_levels_computer, .count = vg_list_size( cmp_levels_computer ), .primary_colour = { 0.75f, 0.23f, 0.39f }, .origin = { -5, 8 }, - .dims = { 5, 1 } + .dims = { 5, 2 } } }; diff --git a/fonts/vg_font.png b/fonts/vg_font.png index f669d8ca0b51084eb4994beae941c5ecccf83915..892a6dd421322a70a9a4627b25b0cd24db968d3a 100644 GIT binary patch delta 4364 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 diff --git a/maps/cmp_add3b.map b/maps/cmp_add3b.map index 59d190a..5d18ed4 100644 --- a/maps/cmp_add3b.map +++ b/maps/cmp_add3b.map @@ -1,5 +1,5 @@ ########################; -###-#-#-#-##############;:b:b:b,b:::b,::b:b,b::: +###-.-.-.-##############;:b:b:b,b:::b,::b:b,b::: ## ##; ## ##; ## ##; @@ -24,5 +24,5 @@ ## ##; ## ##; ## ##; -#########+#+#+##+#+#+###;::b:b,b::b:b,:b:b:b,:b::b,b:b:b:b,b:b:b:b +#########+.+.+##+.+.+###;::b:b,b::b:b,:b:b:b,:b::b,b:b:b:b,b:b:b:b ########################; diff --git a/vg/vg_pxfont.h b/vg/vg_pxfont.h index 0bf1cf5..a67a48d 100644 --- a/vg/vg_pxfont.h +++ b/vg/vg_pxfont.h @@ -99,7 +99,7 @@ 0,0,0,0,0,0,0,0, 0x3000000,0,0,0,0,0,0,0, 0x3000000,0,0,0,0,0,0,0, -0x1800000,0x6000000,0x600000,0,0x6000180,0x1800600,0x6000000,0, +0x1800000,0x6000000,0x600000,0,0x6000180,0x1800600,0,0, 0x800000,0x6000000,0x600000,0,0x6000180,0x1800600,0x6000000,0, 0x1c0,0x60003c0,0x6003c0,0x1e003c0,0x6000000,0x600,0x60007e0,0x3c007e0, 0x3e0,0x7c007e0,0x3e007e0,0x3e007e0,0x6000380,0x38006e0,0x6000ff0,0x7e00ff0, @@ -107,16 +107,16 @@ 0x3e0,0x6600600,0x66006e0,0x3000660,0x7e00180,0x1800780,0x6000db0,0x6600c30, 0x660,0x6600600,0x66007c0,0x3000660,0x6600180,0x18007c0,0x6000c30,0x6600c30, 0x660,0x6600600,0x6600700,0x3e007e0,0x6600180,0x18006c0,0x6000c30,0x6600e70, -0x7e0,0x7e007e0,0x7e003e0,0x3c003e0,0x6600180,0x1800660,0x7e00c30,0x6600ff0, -0x3e0,0x7c003c0,0x3e001c0,0x3000060,0x6600180,0x1800660,0x3e00c30,0x66007e0, +0x7e0,0x7e007e0,0x7e003e0,0x3c003e0,0x6600180,0x1800660,0x7c00c30,0x6600ff0, +0x3e0,0x7c003c0,0x3e001c0,0x3000060,0x6600180,0x1800660,0x3c00c30,0x66007e0, 0,0,0,0x70007e0,0,0x3800000,0,0, 0,0,0,0x60003c0,0,0x3000000,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0xc0,0x300,0, -0,0,0x3000000,0,0,0x1c0,0x1800380,0, -0,0,0x3000000,0,0,0x180,0x1800180,0x1ce0, +0,0,0,0,0,0x1c0,0x1800380,0, +0,0,0,0,0,0x180,0x1800180,0x1ce0, 0x3c003c0,0x1c001c0,0x3000660,0xc300c30,0xc300660,0x7e00180,0x1800180,0x3ff0, 0x7e007e0,0x3c003c0,0x3000660,0xc300c30,0xe700660,0x7e00380,0x18001c0,0x7303ff0, 0x6600660,0x3000300,0x3c00660,0x6600c30,0x7e00660,0xe00700,0x18000e0,0xfb03ff0, @@ -135,13 +135,13 @@ 0,0x100,0x800100,0x800000,0x8000010,0,0,0, 0,0,0,0,0x8000010,0,0,0, 0,0x100,0x800100,0x800000,0x8000010,0,0,0, -0x1b66db6,0x6d800100,0x800100,0x800000,0x68000016,0,0,0, +0x1b66db6,0x6d800100,0x800100,0x800000,0x68000016,0x1800180,0,0, 0,0,0,0,0x8000010,0,0,0, -0x1000000,0x800100,0x8001b6,0x6d806db6,0x8000010,0,0,0, -0x1000000,0x800100,0x800000,0,0x8000010,0,0,0, +0x1000000,0x800100,0x8001b6,0x6d806db6,0x8000010,0x1000080,0,0, +0x1000000,0x800100,0x800000,0,0x8000010,0x1000080,0,0, 0,0,0,0,0x8000010,0,0,0, -0x1000000,0x800100,0x800000,0,0x4000020,0,0,0, -0x1000000,0x800100,0x800000,0,0x2000040,0,0,0, +0x1000000,0x800100,0x800000,0,0x4000020,0x1000080,0,0, +0x1000000,0x800100,0x800000,0,0x2000040,0x1000080,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, -- 2.25.1