From 7238ed7ceebb781ebd757990832f55933a768b2c Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 21 Dec 2021 07:30:02 +0000 Subject: [PATCH] basic world text --- fishladder.c | 226 ++++++++++++++++++++++++++++++++++++++++- fishladder_resources.h | 38 ++++++- sound/win.ogg | Bin 0 -> 42784 bytes sound/y0.ogg | Bin 15741 -> 15741 bytes sound/y1.ogg | Bin 16234 -> 16234 bytes sound/y2.ogg | Bin 16053 -> 16053 bytes sound/y3.ogg | Bin 16026 -> 16026 bytes sound/y4.ogg | Bin 16504 -> 16504 bytes sound/y5.ogg | Bin 16326 -> 16326 bytes sound/y6.ogg | Bin 16139 -> 16139 bytes sound/y7.ogg | Bin 16698 -> 16698 bytes sound/y8.ogg | Bin 16213 -> 16213 bytes textures/ubuntu.png | Bin 77805 -> 77806 bytes vg/vg_audio.h | 21 ++-- vg/vg_m.h | 12 ++- 15 files changed, 283 insertions(+), 14 deletions(-) create mode 100644 sound/win.ogg diff --git a/fishladder.c b/fishladder.c index fcdd58d..9a567df 100644 --- a/fishladder.c +++ b/fishladder.c @@ -132,6 +132,34 @@ 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 + ; + + #pragma pack(push,1) + struct vector_glyph_vert + { + v2f co; + v2f uv; + + u32 colour; + } + *buffer; + #pragma pack(pop) + + u16 *indices; +} +text_buffers; + struct world { #pragma pack(push,1) @@ -145,7 +173,6 @@ struct world *data; #pragma pack(pop) - int initialzed; int sim_run, max_runs; @@ -479,6 +506,94 @@ 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; + + 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] = count*4; + ind[1] = count*4+1; + ind[2] = count*4+2; + ind[3] = count*4; + ind[4] = count*4+2; + ind[5] = 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){ 0.0f, 0.0f }, 1.0f, text_buffers.title_start ); + text_buffers.desc_count = gen_text_buffer( pLevel->description, &font_Ubuntu, (v2f){ 0.0f, 0.0f }, 0.5f, text_buffers.desc_start ); + text_buffers.desc_count = 0; +} + static int map_load( const char *str, const char *name ) { //TODO: It may be worthwhile, at this point, to switch to binary encoding for save data @@ -1044,7 +1159,10 @@ static void career_load(void) if( lvl->serial_id == encoded.in_map ) { if( console_changelevel( 1, &lvl->map_name ) ) + { world.pCmpLevel = lvl; + gen_level_text( world.pCmpLevel ); + } } } } @@ -1768,6 +1886,10 @@ void vg_update(void) { career_pass_level( world.pCmpLevel, world.score, 1 ); } + + sfx_set_play( &audio_tones, &audio_system_balls_extra, 9 ); + failure_this_frame = 0; + success_this_frame = 0; } } else @@ -2187,6 +2309,7 @@ static void level_selection_buttons(void) if( console_changelevel( 1, &switch_level_to->map_name ) ) { world.pCmpLevel = switch_level_to; + gen_level_text( world.pCmpLevel ); } } } @@ -2397,6 +2520,18 @@ void vg_render(void) level_selection_buttons(); + // 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 ); + + 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) ) ); + // WIRES // ======================================================================================================== //glDisable(GL_BLEND); @@ -3393,6 +3528,88 @@ void vg_start(void) resource_load_main(); + // 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 + ; + + for( int i = 0; i < vg_list_size( career_serializable ); i ++ ) + { + struct serializable_set *set = &career_serializable[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; + + 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( 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; + + // Calculate offsets + text_buffers.title_start = 0; + text_buffers.desc_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; + + // 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) ); + } + // Restore gamestate career_local_data_init(); career_load(); @@ -3404,6 +3621,13 @@ 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 4cdd894..431c8d8 100644 --- a/fishladder_resources.h +++ b/fishladder_resources.h @@ -198,7 +198,8 @@ sound/y4.ogg\0\ sound/y5.ogg\0\ sound/y6.ogg\0\ sound/y7.ogg\0\ -sound/y8.ogg\0" +sound/y8.ogg\0\ +sound/win.ogg\0" }; // One two or three layers of rolling noise @@ -572,6 +573,40 @@ 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;" + "layout (location=2) in vec4 a_colour;" + "uniform mat3 uPv;" + "" + "out vec2 aTexCoords;" + "out vec4 aColour;" + "" + "void main()" + "{" + "gl_Position = vec4( uPv * vec3( a_co, 1.0 ), 1.0 );" + "aTexCoords = a_uv;" + "aColour = a_colour;" + "}", + + // FRAGMENT + "uniform sampler2D uTexGlyphs;" + "out vec4 FragColor;" + "" + "in vec2 aTexCoords;" + "in vec4 aColour;" + "" + "void main()" + "{" + "vec4 glyph = texture( uTexGlyphs, aTexCoords );" + "FragColor = vec4( aColour.rgb, smoothstep( 0.48, 0.52, glyph.r ) * aColour.a );" + //"FragColor = glyph;" + "}" + , + UNIFORMS({ "uPv", "uTexGlyphs" }) +) void vg_register(void) { @@ -581,6 +616,7 @@ void vg_register(void) SHADER_INIT( shader_background ); SHADER_INIT( shader_wire ); SHADER_INIT( shader_buttons ); + SHADER_INIT( shader_sdf ); } /* diff --git a/sound/win.ogg b/sound/win.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b1b4a01a23b46e820f6f6176ae850f45e63ea745 GIT binary patch literal 42784 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 literal 0 HcmV?d00001 diff --git a/sound/y0.ogg b/sound/y0.ogg index f4735af0019f031279e1423c2b9d3834a137c426..bc03524ba3c49e78a8949a7a01d721b4e54230a0 100644 GIT binary patch delta 105 zcmexc^|wmOKRrE|fr$YMmPxyq5f-4xX@!ZQnqlph&_Ug_WC)6to~BEFewmbYnMX7%=ez0A#@)cK`qY delta 105 zcmaD=_o`0HKRrE|fr$YM=Jr@~f|xSXrkt86rN;x}GXnV=xLT)f44J_X767Ss3)HXJ k{DWUl04%}`6j8}PZM4})K?@?n0u*^Ok0XC`h5-{l0J}^Zg8%>k diff --git a/sound/y2.ogg b/sound/y2.ogg index 2994944de8b15a52b6a25be8435b039ecfd9c116..2c3bfdb54290c3c1e6a1edc2c4f0ec38fcdb7904 100644 GIT binary patch delta 105 zcmdm5yR}xzKRrE|fr$YMti;}NftXGVec=suWi}9&)_>R0AisWG6R0j6nXX5dD)ILuT-U1wg7z0$w|B k{=wfQ02W~eiYV3no4>hDK?fqj0u(tDw{rjHeFooo0gLb*T>t<8 diff --git a/sound/y3.ogg b/sound/y3.ogg index 740ca0a2fbd467d6e1dcc29445466063a2aa9859..62b3f861ee8c361bc3a81f5e85d6463ca8221362 100644 GIT binary patch delta 105 zcmbPLJF8a8KRrE|fr$YMzKgx%0x{(#c(0o%rN;x}GXnV^Gn2M%44J_X767T<{IdP{ m<{$i%1i&K9K#{J-taY2GDF_RKMOc6$HG72kHg7e2$^!s_wjqN6 delta 105 zcmbPLJF8a8KRrE|fr$YM*!rwFLCoxg{g)?7>G6R0j6nWj*~m>BLuT-U1wg9f4GpJk l{=q*<04%}`6p=LWi`hI)L0Awh!U7ao;%LFVd8^@59smSR7}Wp( diff --git a/sound/y4.ogg b/sound/y4.ogg index 0156c5a505c5dfcec064aa85c3688b7fc7d86a1c..cd2d7acfa1703ea0542ba578853230d678fc36b0 100644 GIT binary patch delta 107 zcmey-!1$wqQOZ9(J(z)s0SXq0zvBWi_h~wBnkc2m1L89R`85^KayEv{;0FtUR8RUP n)VKKu{}}~0KRrE|fr$YMN+jNKftdLgkCi4$>G6R0j6i;afP?79kQw}70g&pcVj6cg k|KNWs02W~eicA!%4&MAxp${U$0u;&NXPdgY+t8X10GkgS1^@s6 delta 105 zcmX?Bf2>~0KRrE|fr$YMI{K|SK}=JxtGW}V^mssgMj&7BqOjA(kQw}70g&ny-k%q5 k{=xrN04%}`6k%<@~ diff --git a/sound/y6.ogg b/sound/y6.ogg index f51a778dab22142b41b9d9c85a160cb61be82616..f5da32980167671ba05bb66cfad79aafe13bb07b 100644 GIT binary patch delta 105 zcmeCK>#mdXPfrhKU}As*SIKu=AZAd@thW=T^mssgMj)Ss%{^gb$P9k407&&x!%0&& l|KOJu1dA{OMILX+d%jsw(M13(!U7cOpCP5UxzKPHF92cb8=C+C delta 105 zcmeCK>#mdXPfrhKU}As*mkHLKAm-kzWf2pl^mssgMj*fUK+La=Av5^F0wC4y$G*gD l{=qLR2o_-miX=Au5ZSD#=pq0XVF8NV+vad(bD`lZUI30S9KQen diff --git a/sound/y7.ogg b/sound/y7.ogg index f7f1cb867838ba36f987c6807c65523fccc6b7b1..694da67236c792b9d21306847c020207b627da80 100644 GIT binary patch delta 107 zcmdnh#JH=8QOZ9(J(z)s0SZ{8-f@ALi$eOGCQ9k?fcT6+e*6;=?~Nfd_`w1o)jO}> ny|MWR|0Dsh2s2Q`I-wR&91L{KXFdTW}kb diff --git a/sound/y8.ogg b/sound/y8.ogg index 935503e6004d58aea258ae394000a5dc977856f6..d4d438b465e64da4a6736cf3751ca024441f58db 100644 GIT binary patch delta 105 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 Bgv$T` delta 3942 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 AH~;_u diff --git a/vg/vg_audio.h b/vg/vg_audio.h index 35d7756..e62d584 100644 --- a/vg/vg_audio.h +++ b/vg/vg_audio.h @@ -26,6 +26,7 @@ struct sfx_vol_control struct sfx_system { sfx_system *persisitent_source; + int in_queue; // Source buffer start float *source, *replacement; @@ -54,7 +55,7 @@ struct sfx_set float *main; char *sources; - u32 segments[20]; //from->to,from->to ... + u32 segments[32]; //from->to,from->to ... u32 numsegments; u32 ch; u32 flags; @@ -228,7 +229,7 @@ static int sfx_begin_edit( sfx_system *sys ) { MUTEX_LOCK( sfx_mux_t01 ); - if( sfx_q_len >= SFX_MAX_SYSTEMS ) + if( sfx_q_len >= SFX_MAX_SYSTEMS && !sys->in_queue ) { MUTEX_UNLOCK( sfx_mux_t01 ); vg_warn( "Warning: No free space in sound queue\n" ); @@ -246,8 +247,12 @@ static void sfx_end_edit( sfx_system *sys ) // Mark change to be uploaded to queue system static int sfx_push( sfx_system *sys ) { - // Mark change in queue - sfx_q[ sfx_q_len ++ ] = sys; + if( !sys->in_queue ) + { + // Mark change in queue + sfx_q[ sfx_q_len ++ ] = sys; + sys->in_queue = 1; + } MUTEX_UNLOCK( sfx_mux_t01 ); @@ -379,6 +384,8 @@ void audio_mixer_callback( ma_device *pDevice, void *pOutBuf, const void *pInput sfx_system *src = sfx_q[sfx_q_len]; sfx_system *clone; + src->in_queue = 0; + // Copy clone = sfx_alloc(); *clone = *src; @@ -522,8 +529,6 @@ void audio_mixer_callback( ma_device *pDevice, void *pOutBuf, const void *pInput // String layout: "sounda.ogg\0soundb.ogg\0soundc.ogg\0\0" static void sfx_set_strings( sfx_set *dest, char *strSources, u32 flags, int bAsync ) { - printf( "Init sfx set\n| start | end | length | name \n" ); - dest->ch = (flags & SFX_FLAG_STEREO)? 2: 1; dest->main = NULL; @@ -556,8 +561,6 @@ static void sfx_set_strings( sfx_set *dest, char *strSources, u32 flags, int bAs dest->segments[ dest->numsegments*2+0 ] = total-samples; dest->segments[ dest->numsegments*2+1 ] = total; - - printf( "| %09u | %09u | %09u | %s\n", total-samples, total, samples, source ); } else { @@ -569,8 +572,6 @@ static void sfx_set_strings( sfx_set *dest, char *strSources, u32 flags, int bAs source += len +1; dest->numsegments ++; } - - vg_info( "finished, numsegments: %u\n", dest->numsegments ); } static void sfx_set_init( sfx_set *dest, char *sources ) diff --git a/vg/vg_m.h b/vg/vg_m.h index a567092..577138f 100644 --- a/vg/vg_m.h +++ b/vg/vg_m.h @@ -110,7 +110,8 @@ static inline void v2_divs( v2f a, float s, v2f d ) static inline void v2_mul( v2f a, v2f b, v2f d ) { - d[0] = a[0]*b[0]; d[1] = a[1]*b[1]; + d[0] = a[0]*b[0]; + d[1] = a[1]*b[1]; } static inline void v2_div( v2f a, v2f b, v2f d ) @@ -118,9 +119,16 @@ static inline void v2_div( v2f a, v2f b, v2f d ) d[0] = a[0]/b[0]; d[1] = a[1]/b[1]; } +static inline void v2_muladd( v2f a, v2f b, v2f s, v2f d ) +{ + d[0] = a[0]+b[0]*s[0]; + d[1] = a[1]+b[1]*s[1]; +} + static inline void v2_muladds( v2f a, v2f b, float s, v2f d ) { - d[0] = a[0]+b[0]*s; d[1] = a[1]+b[1]*s; + d[0] = a[0]+b[0]*s; + d[1] = a[1]+b[1]*s; } static inline float v2_length2( v2f a ) -- 2.25.1