refactor world button code
authorhgn <hgodden00@gmail.com>
Tue, 4 Jan 2022 21:23:48 +0000 (21:23 +0000)
committerhgn <hgodden00@gmail.com>
Tue, 4 Jan 2022 21:23:48 +0000 (21:23 +0000)
fishladder.c
fishladder_resources.h
maps/cmp_add3b.map [new file with mode: 0644]
maps/cmp_binary.map [new file with mode: 0644]
vg/vg_input.h

index c9f2eb61b5dec0b479fda5e232d4b96bbbe3f927..e671208e560f6c6558f04c061d84ee72ab7bf3b2 100644 (file)
@@ -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
index d5a9a6eaa566b86008a0ab82f171e39564988315..ddc1f00926e05f19549a32aed40f8dd6c55dc413 100644 (file)
@@ -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 (file)
index 0000000..59d190a
--- /dev/null
@@ -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 (file)
index 0000000..a474378
--- /dev/null
@@ -0,0 +1,23 @@
+#####################;
+########-#-#-########;a:a::,:a:a:a,:::a
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##                 ##;
+##########+##########;a:aaa:aa:aaaaaa
+#####################;
index 6bae274d99cff79a25e39c220a6742463578eb60..62d4690a68e2acfa2673a6af7e7992959d42ca82 100644 (file)
@@ -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 )