From: hgn Date: Tue, 4 Jan 2022 21:23:48 +0000 (+0000) Subject: refactor world button code X-Git-Url: https://harrygodden.com/git/?p=fishladder.git;a=commitdiff_plain;h=7d33b1d4576c1e35cd03ee3034840b8053914ae1 refactor world button code --- diff --git a/fishladder.c b/fishladder.c index c9f2eb6..e671208 100644 --- a/fishladder.c +++ b/fishladder.c @@ -4,6 +4,30 @@ //#define VG_STEAM #define VG_STEAM_APPID 1218140U #include "vg/vg.h" + +enum world_button_mode +{ + k_world_button_mode_once, + k_world_button_mode_toggle +}; + +struct world_button +{ + v2i position; + v3f colour; + + float light_target, light; + int state, click_grab; + + enum world_button_mode mode; +}; + +enum world_button_status +{ + k_world_button_on_enable, + k_world_button_on_disable +}; + #include "fishladder_resources.h" // #define STEAM_LEADERBOARDS @@ -161,6 +185,31 @@ struct } text_buffers; +struct world_static +{ + struct world_button buttons[4]; +} +world_static = +{ + .buttons = { + { + .colour = { 0.204f, 0.345f, 0.553f }, + .mode = k_world_button_mode_toggle + }, + { + .colour = { 0.204f, 0.345f, 0.553f }, + .mode = k_world_button_mode_toggle + }, + { + .colour = { 0.553f, 0.345f, 0.204f }, + .mode = k_world_button_mode_toggle + }, + { + // TODO: Settings button and menu + } + } +}; + struct world { #pragma pack(push,1) @@ -202,14 +251,7 @@ struct world v2i pos; //int id; } - *io; - - struct cell_button - { - float light_target, light; - int pressed; - } - buttons[4]; + *io; int w, h; @@ -273,9 +315,6 @@ static void draw_mesh( int const start, int const count ); // World buttons // ------------- -static struct cell_button *get_wbutton( enum e_world_button btn ); -static void wbutton_run( enum e_world_button btn_name, v2f btn_tex ); -static void wbutton_draw( v2i pos, v2f tex, v4f colour ); static void level_selection_buttons(void); // Map/world interface @@ -459,11 +498,6 @@ static void use_mesh( struct mesh *m ) glBindVertexArray( m->vao ); } -static struct cell_button *get_wbutton( enum e_world_button btn ) -{ - return &world.buttons[ btn ]; -} - void leaderboard_set_score( struct cmp_level *cmp_level, u32 score ); // WORLD/MAP @@ -1021,6 +1055,15 @@ static int map_load( const char *str, const char *name ) strncpy( world.map_name, name, vg_list_size( world.map_name )-1 ); world.initialzed = 1; + + // Setup world button locations + for( int i = 0; i < vg_list_size( world_static.buttons ); i ++ ) + { + struct world_button *btn = &world_static.buttons[i]; + btn->position[0] = world.w -1; + btn->position[1] = world.h -i -2; + } + return 1; IL_REG_ERROR: @@ -1242,6 +1285,8 @@ static void career_load(void) // Header information // ================================= + struct cmp_level *lvl_to_load = &career_packs[0].pack[0]; + // Decode everything from dstate for( int i = 0; i < vg_list_size( career_packs ); i ++ ) { @@ -1255,18 +1300,17 @@ static void career_load(void) if( src->unlocked ) career_unlock_level( lvl ); if( src->score ) lvl->completed_score = src->score; - // ... if( lvl->serial_id == encoded.in_map ) - { - if( console_changelevel( 1, &lvl->map_name ) ) - { - world.pCmpLevel = lvl; - gen_level_text( world.pCmpLevel ); - } - } + lvl_to_load = lvl; } } + if( console_changelevel( 1, &lvl_to_load->map_name ) ) + { + world.pCmpLevel = lvl_to_load; + gen_level_text( world.pCmpLevel ); + } + career_load_success = 1; } @@ -1274,7 +1318,7 @@ static void career_load(void) // =========================================================================================================== static int is_simulation_running(void) { - return world.buttons[ k_world_button_sim ].pressed; + return world_static.buttons[ k_world_button_sim ].state; } static void clear_animation_flags(void) @@ -1285,8 +1329,8 @@ static void clear_animation_flags(void) static void simulation_stop(void) { - world.buttons[ k_world_button_sim ].pressed = 0; - world.buttons[ k_world_button_pause ].pressed = 0; + world_static.buttons[ k_world_button_sim ].state = 0; + world_static.buttons[ k_world_button_pause ].state = 0; world.num_fishes = 0; world.sim_frame = 0; @@ -1312,7 +1356,7 @@ static void simulation_start(void) world.sim_frame = 0; world.sim_run = 0; - world.sim_delta_speed = world.buttons[ k_world_button_speedy ].pressed? 10.0f: 2.5f; + world.sim_delta_speed = world_static.buttons[ k_world_button_speedy ].state? 10.0f: 2.5f; world.sim_delta_ref = vg_time; world.sim_internal_ref = 0.0f; world.sim_internal_time = 0.0f; @@ -1590,7 +1634,7 @@ void vg_update(void) { float old_time = world.sim_internal_time; - if( !world.buttons[ k_world_button_pause ].pressed ) + if( !world_static.buttons[ k_world_button_pause ].state ) world.sim_internal_time = world.sim_internal_ref + (vg_time-world.sim_delta_ref) * world.sim_delta_speed; else world.sim_internal_time = vg_lerpf( world.sim_internal_time, world.sim_internal_ref + world.pause_offset_target, vg_time_delta*15.0f ); @@ -1961,7 +2005,7 @@ void vg_update(void) world.sim_delta_ref = vg_time; world.sim_internal_ref = 0.0f; - if( world.buttons[ k_world_button_pause ].pressed ) + if( world_static.buttons[ k_world_button_pause ].state ) world.pause_offset_target = 0.5f; else world.pause_offset_target = 0.0f; @@ -2162,6 +2206,63 @@ static void render_tiles( v2i start, v2i end, v4f const regular_colour, v4f cons } } +static int world_button_exec( struct world_button *btn, v2f texture, enum world_button_status *status ) +{ + int triggered = 0; + int is_hovering = v2i_eq( (v2i){ world.tile_x, world.tile_y }, btn->position ); + + // Set up light targets before logic runs + if( btn->state ) + btn->light_target = is_hovering? 0.9f: 0.8f; + else + btn->light_target = is_hovering? 0.2f: 0.0f; + + if( vg_get_button( "primary" ) && is_hovering ) + btn->light_target = 1.0f; + + // Process click action + if( is_hovering ) + { + if( vg_get_button_down( "primary" ) && is_hovering ) + { + btn->click_grab = 1; + } + else if( btn->click_grab && vg_get_button_up( "primary" ) ) + { + // Click event + *status = btn->state? k_world_button_on_disable: k_world_button_on_enable; + + if( btn->mode == k_world_button_mode_toggle ) + btn->state ^= 0x1; + + sfx_set_play( &audio_clicks, &audio_system_ui, btn->state? 1:0 ); + triggered = 1; + } + } + if( vg_get_button_up( "primary" ) ) + btn->click_grab = 0; + + // Drawing stage + v4f final_colour; + + btn->light = vg_lerpf( btn->light, btn->light_target, vg_time_delta*26.0f ); + + v3_copy( btn->colour, final_colour ); + final_colour[3] = btn->light; + + glUniform4f( SHADER_UNIFORM( shader_buttons, "uOffset" ), + btn->position[0], + btn->position[1], + texture[0], + texture[1] + ); + glUniform4fv( SHADER_UNIFORM( shader_buttons, "uColour" ), 1, final_colour ); + draw_mesh( 0, 2 ); + + return triggered; +} + +/* static void wbutton_run( enum e_world_button btn_name, v2f btn_tex ) { static v3f button_colours[] = { @@ -2295,13 +2396,13 @@ static void wbutton_draw( v2i pos, v2f tex, v4f colour ) glUniform4fv( SHADER_UNIFORM( shader_buttons, "uColour" ), 1, colour ); draw_mesh( 0, 2 ); } +*/ static void level_selection_buttons(void) { v3f tutorial_colour = { 0.204f, 0.345f, 0.553f }; v3f locked_colour = { 0.2f, 0.2f, 0.2f }; - v2f tex_coord = { 0.0f, 0.0f }; v4f final_colour = { 0.0f, 0.0f, 0.0f, 0.2f }; v2i button_pos; static struct cmp_level *select_from = NULL; @@ -2374,7 +2475,7 @@ static void level_selection_buttons(void) final_colour[3] += 0.1f; } - wbutton_draw( (v2i){ grid->origin[0] + x, grid->origin[1] + y }, tex_coord, final_colour ); + //wbutton_draw( (v2i){ grid->origin[0] + x, grid->origin[1] + y }, tex_coord, final_colour ); } else break; @@ -2430,7 +2531,8 @@ void vg_render(void) glActiveTexture( GL_TEXTURE1 ); glBindTexture( GL_TEXTURE_2D, world.random_samples ); glUniform1i( SHADER_UNIFORM( shader_background, "uSamplerNoise" ), 1 ); - + glUniform1f( SHADER_UNIFORM( shader_background, "uVisibility" ), 1.0f ); // (sinf( vg_time ) + 1.0f) * 0.5f ); + draw_mesh( 0, 2 ); // TILESET BACKGROUND LAYER @@ -2444,7 +2546,7 @@ void vg_render(void) glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_main, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); glUniform1f( SHADER_UNIFORM( shader_tile_main, "uGhost" ), 0.0f ); glUniform1f( SHADER_UNIFORM( shader_tile_main, "uForeground" ), 0.0f ); - //glUniform1f( SHADER_UNIFORM( shader_tile_main, "uVisibility" ), sinf( vg_time ) + 1.0f ); + glUniform1f( SHADER_UNIFORM( shader_tile_main, "uVisibility" ), 2.0f ); // sinf( vg_time ) + 1.0f ); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -2467,7 +2569,7 @@ void vg_render(void) vg_tex2d_bind( &tex_ball_noise, 0 ); glUniform1i( SHADER_UNIFORM( shader_ball, "uTexMain" ), 0 ); - if( get_wbutton( k_world_button_sim )->pressed ) + if( world_static.buttons[ k_world_button_sim ].state ) { for( int i = 0; i < world.num_fishes; i ++ ) { @@ -2594,10 +2696,61 @@ void vg_render(void) vg_tex2d_bind( &tex_buttons, 0 ); glUniform1i( SHADER_UNIFORM( shader_buttons, "uTexMain" ), 0 ); - wbutton_run( k_world_button_sim, (v2f){ 0.0f, 3.0f } ); - wbutton_run( k_world_button_pause, (v2f){ 1.0f, 3.0f } ); - wbutton_run( k_world_button_speedy, (v2f){ 0.0f, 2.0f } ); + enum world_button_status stat; + int world_paused = world_static.buttons[k_world_button_pause].state; + int world_running = world_static.buttons[k_world_button_sim].state; + + float sim_icon_x = world_paused? 3.0f: (world_running? 2.0f: 0.0f); + + if( world_button_exec( &world_static.buttons[k_world_button_sim], (v2f){ sim_icon_x, 3.0f }, &stat )) + { + if( stat == k_world_button_on_enable ) + { + simulation_start(); + + if( world_paused ) + world.pause_offset_target = 0.5f; + } + else + { + if( world_paused ) + { + // Trigger single step + world.pause_offset_target += 1.0f; + world_static.buttons[k_world_button_sim].state = 1; + } + else + { + simulation_stop(); + } + } + } + if( world_button_exec( &world_static.buttons[k_world_button_pause], (v2f){ 1.0f, 3.0f }, &stat )) + { + world.sim_internal_ref = world.sim_internal_time; + world.sim_delta_ref = vg_time; + + if( stat == k_world_button_on_enable ) + { + float time_frac = world.sim_internal_time-floorf(world.sim_internal_time); + world.pause_offset_target = 0.5f - time_frac; + } + else + world.pause_offset_target = 0.0f; + } + + if( world_button_exec( &world_static.buttons[k_world_button_speedy], (v2f){ 0.0f, 2.0f }, &stat )) + { + world.sim_delta_speed = stat == k_world_button_on_enable? 10.0f: 2.5f; + + if( !world_paused ) + { + world.sim_delta_ref = vg_time; + world.sim_internal_ref = world.sim_internal_time; + } + } + level_selection_buttons(); // TEXT ELEMENTS diff --git a/fishladder_resources.h b/fishladder_resources.h index d5a9a6e..ddc1f00 100644 --- a/fishladder_resources.h +++ b/fishladder_resources.h @@ -361,7 +361,7 @@ SHADER_DEFINE( shader_tile_main, "uniform vec4 uOffset;" // Tile x/y, uv x/y "uniform mat3 uPv;" "uniform mat2 uSubTransform;" - //"uniform float uVisibility;" + "uniform float uVisibility;" "" "out vec4 aTexCoords;" "out vec2 aWorldCoords;" @@ -376,10 +376,10 @@ SHADER_DEFINE( shader_tile_main, "void main()" "{" "vec2 hash_val = hash22(uOffset.xy);" - //"float scaling_factor = smoothstep( hash_val.x, hash_val.x+1.0, uVisibility );" + "float scaling_factor = smoothstep( hash_val.x, hash_val.x+1.0, uVisibility );" // Vertex transform - "vec2 subtransform = uSubTransform * (a_co-0.5) + 0.5;" + "vec2 subtransform = uSubTransform * (a_co-0.5) * scaling_factor + 0.5;" "vec3 worldpos = vec3( subtransform + uOffset.xy, 1.0 );" "gl_Position = vec4( uPv * worldpos, 1.0 );" @@ -445,6 +445,7 @@ SHADER_DEFINE( shader_background, "uniform sampler2D uTexMain;" "uniform sampler2D uSamplerNoise;" "uniform float uVariance;" + "uniform float uVisibility;" "" "in vec2 aTexCoords;" "" @@ -463,7 +464,7 @@ SHADER_DEFINE( shader_background, "ao_accum -= data_this_tile.r;" - "vec3 colour_main = mix( vec3( 0.369768, 0.3654, 0.42 ),vec3( 0.275, 0.388, 0.553 ), data_this_tile.g );" + "vec3 colour_main = mix( vec3( 0.369768, 0.3654, 0.42 ), vec3( 0.275, 0.388, 0.553 ), data_this_tile.g * uVisibility );" "vec2 square_coords = fract( aTexCoords * 64.0 );" "vec2 grid_coords = abs( square_coords - 0.5 );" @@ -475,7 +476,7 @@ SHADER_DEFINE( shader_background, "FragColor = vec4( colour_main * edge_contrast + gridline * 0.02 * gridline_fadeout, 1.0 );" "}" , - UNIFORMS({ "uPv", "uOffset", "uTexMain", "uVariance", "uSamplerNoise" }) + UNIFORMS({ "uPv", "uOffset", "uTexMain", "uVariance", "uSamplerNoise", "uVisibility" }) ) SHADER_DEFINE( shader_wire, @@ -656,7 +657,7 @@ struct cmp_level int serial_id; int is_tutorial; - v2i world_pos; + struct world_button btn; #ifdef VG_STEAM SteamLeaderboard_t steam_leaderboard; diff --git a/maps/cmp_add3b.map b/maps/cmp_add3b.map new file mode 100644 index 0000000..59d190a --- /dev/null +++ b/maps/cmp_add3b.map @@ -0,0 +1,28 @@ +########################; +###-#-#-#-##############;: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/maps/cmp_binary.map b/maps/cmp_binary.map new file mode 100644 index 0000000..a474378 --- /dev/null +++ b/maps/cmp_binary.map @@ -0,0 +1,23 @@ +#####################; +########-#-#-########;a:a::,:a:a:a,:::a +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +## ##; +##########+##########;a:aaa:aa:aaaaaa +#####################; diff --git a/vg/vg_input.h b/vg/vg_input.h index 6bae274..62d4690 100644 --- a/vg/vg_input.h +++ b/vg/vg_input.h @@ -5,6 +5,14 @@ static inline int vg_get_button( const char *button ) __attribute__((unused)); static inline int vg_get_button_down( const char *button ) __attribute__((unused)); static inline int vg_get_button_up( const char *button ) __attribute__((unused)); +enum vg_button_state +{ + k_button_state_down = 1, + k_button_state_up = 3, + k_button_state_pressed = 2, + k_button_state_none = 0 +}; + // Input // =========================================================================================================== GLFWgamepadstate vg_gamepad; @@ -89,12 +97,12 @@ static inline int vg_get_button_up( const char *button ) return bind->prev & (bind->value ^ bind->prev) && !vg_console_enabled(); } -static inline int vg_get_button_state( const char *button ) +static inline enum vg_button_state vg_get_button_state( const char *button ) { - if( vg_get_button_down( button ) ) return 1; - if( vg_get_button_up( button ) ) return 3; - if( vg_get_button( button ) ) return 2; - return 0; + if( vg_get_button_down( button ) ) return k_button_state_down; + if( vg_get_button_up( button ) ) return k_button_state_up; + if( vg_get_button( button ) ) return k_button_state_pressed; + return k_button_state_none; } static inline int key_is_keyboard( int const id )