small animation to ball dying
authorhgn <hgodden00@gmail.com>
Sun, 12 Dec 2021 00:07:12 +0000 (00:07 +0000)
committerhgn <hgodden00@gmail.com>
Sun, 12 Dec 2021 00:07:12 +0000 (00:07 +0000)
fishladder.c
fishladder_resources.h

index 808a58890a66e521de9e00e5eb9af6a068932d04..8c433fb46966e9652da8a9b607b24e78069d908b 100644 (file)
@@ -178,6 +178,7 @@ struct world
 
        int sim_frame, sim_target;
        float sim_internal_time,                // current tick-time 
+               sim_internal_delta,                     // time delta
                sim_internal_ref,                               // Reference point of internal time
                sim_delta_ref,                          // Reference point of vg_time when we started at current sim_speed
                sim_delta_speed,                                // Rate to apply time delta
@@ -1317,14 +1318,13 @@ void vg_update(void)
        // ========================================================================================================
        if( is_simulation_running() )
        {       
+               float old_time = world.sim_internal_time;
+       
                if( !world.buttons[ k_world_button_pause ].pressed )
-               {
                        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 );
-               }
+               world.sim_internal_delta = world.sim_internal_time-old_time;
                
                world.sim_target = (int)floorf(world.sim_internal_time);
                
@@ -1382,6 +1382,7 @@ void vg_update(void)
                                                }
                                                
                                                fish->state = k_fish_state_dead;
+                                               fish->death_time = -1000.0f;
                                                continue;
                                        }
                                        
@@ -1424,7 +1425,10 @@ void vg_update(void)
                                                        if( cell_next->config == k_cell_type_merge )
                                                        {
                                                                if( fish->dir[0] == 0 )
+                                                               {
                                                                        fish->state = k_fish_state_dead;
+                                                                       fish->death_time = world.sim_internal_time;
+                                                               }
                                                                else
                                                                        fish->flow_reversed = 0;
                                                        }
@@ -1440,7 +1444,10 @@ void vg_update(void)
                                                                                fish->flow_reversed = 0;
                                                                        }
                                                                        else
+                                                                       {
                                                                                fish->state = k_fish_state_dead;
+                                                                               fish->death_time = world.sim_internal_time;
+                                                                       }
                                                                }
                                                                else
                                                                        fish->flow_reversed = ( fish->dir[0] != -desc->start[0] || 
@@ -1448,7 +1455,15 @@ void vg_update(void)
                                                        }
                                                }
                                                else
-                                                       fish->state = world_check_pos_ok( fish->pos )? k_fish_state_bg: k_fish_state_dead;
+                                               {
+                                                       if( world_check_pos_ok( fish->pos ) )
+                                                               fish->state = k_fish_state_bg;
+                                                       else
+                                                       {
+                                                               fish->state = k_fish_state_dead;
+                                                               fish->death_time = world.sim_internal_time;     
+                                                       }
+                                               }
                                        }
                                        
                                        //v2i_add( fish->pos, fish->dir, fish->pos );
@@ -1458,7 +1473,10 @@ void vg_update(void)
                                        v2i_add( fish->pos, fish->dir, fish->pos );
                                        
                                        if( !world_check_pos_ok( fish->pos ) )
+                                       {
                                                fish->state = k_fish_state_dead;
+                                               fish->death_time = -1000.0f;
+                                       }
                                        else
                                        {
                                                struct cell *cell_entry = pcell( fish->pos );
@@ -1563,7 +1581,7 @@ void vg_update(void)
                                                                sw_set_achievement( "BANG" );
                                                        
                                                                // Shatter death (+0.5s)
-                                                               float death_time = collide_this_frame? 0.0f: 0.5f;
+                                                               float death_time = world.sim_internal_time + ( collide_this_frame? 0.0f: 0.5f );
                                                                
                                                                fi->state = k_fish_state_soon_dead;
                                                                fj->state = k_fish_state_soon_dead;
@@ -1716,7 +1734,7 @@ void vg_update(void)
                        if( fish->state == k_fish_state_dead )
                                continue;
                        
-                       if( fish->state == k_fish_state_soon_dead && (world.frame_lerp > fish->death_time) )
+                       if( fish->state == k_fish_state_soon_dead && (world.sim_internal_time > fish->death_time) )
                                continue; // Todo: particle thing?
                                
                        struct cell *cell = pcell(fish->pos);
@@ -1782,6 +1800,9 @@ void vg_update(void)
                                fish->physics_co[0] = origin[0] + (float)fish->dir[0]*t;
                                fish->physics_co[1] = origin[1] + (float)fish->dir[1]*t;
                        }
+                       
+                       v2_sub( fish->physics_co, fish->physics_v, fish->physics_v );
+                       v2_divs( fish->physics_v, world.sim_internal_delta, fish->physics_v );
                }
        }
 }
@@ -1998,6 +2019,11 @@ void vg_render(void)
        v4f const colour_default = {1.0f, 1.0f, 1.0f, 1.0f};
        v4f const colour_selected = {0.90f, 0.92f, 1.0f, 1.0f};
 
+       int const circle_base = 4;
+       int const filled_start = circle_base+0;
+       int const filled_count = circle_base+32;
+       int const empty_start = circle_base+32;
+       int const empty_count = circle_base+32*2;
        
        // BACKGROUND
        // ========================================================================================================
@@ -2057,18 +2083,35 @@ void vg_render(void)
                for( int i = 0; i < world.num_fishes; i ++ )
                {
                        struct fish *fish = &world.fishes[i];
+                       v3f render_pos;
+                       render_pos[2] = 1.0f;
                        
-                       if( fish->state == k_fish_state_dead || fish->state == k_fish_state_bg )
+                       if( fish->state == k_fish_state_dead || fish->state == k_fish_state_soon_dead )
+                       {
+                               float death_anim_time = world.sim_internal_time - fish->death_time;
+                               
+                               if( death_anim_time > 0.0f && death_anim_time < 1.0f )
+                               {
+                                       // Death animation
+                                       v2_muladds( fish->physics_co, fish->physics_v, -1.0f * world.sim_internal_delta, fish->physics_co );
+                                       render_pos[2] = 1.0f - death_anim_time;
+                                       
+                                       //fish->physics_co[0] = fish->pos[0] + 0.5f + sinf( vg_time * 40.0f );
+                                       //fish->physics_co[1] = fish->pos[1] + 0.5f + cosf( vg_time * 45.0f );
+                               }
+                               else if( world.sim_internal_time > fish->death_time )
+                                       continue;
+                       }
+                       else if( fish->state == k_fish_state_bg )
                                continue;
                        
-                       if( fish->state == k_fish_state_soon_dead && (world.frame_lerp > fish->death_time) )
-                               continue;
+                       v2_copy( fish->physics_co, render_pos );
                        
                        v4f dot_colour = { 0.0f, 0.0f, 0.0f, 1.0f };
                        colour_code_v3( fish->payload, dot_colour );
                        
                        glUniform3fv( SHADER_UNIFORM( shader_ball, "uColour" ), 1, dot_colour );
-                       glUniform2fv( SHADER_UNIFORM( shader_ball, "uOffset" ), 1, fish->physics_co );
+                       glUniform3fv( SHADER_UNIFORM( shader_ball, "uOffset" ), 1, render_pos );
                        glUniform2f( SHADER_UNIFORM( shader_ball, "uTexOffset" ), (float)i * 1.2334, (float)i * -0.3579f );
                        draw_mesh( 0, 2 );
                }
@@ -2232,12 +2275,6 @@ void vg_render(void)
        SHADER_USE( shader_tile_colour );
        glUniformMatrix3fv( SHADER_UNIFORM( shader_tile_colour, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
        use_mesh( &world.shapes );
-
-       int const circle_base = 4;
-       int const filled_start = circle_base+0;
-       int const filled_count = circle_base+32;
-       int const empty_start = circle_base+32;
-       int const empty_count = circle_base+32*2;
        
        glEnable(GL_BLEND);
        
index f5b392a898648b6fd43eac60af963ce490decbd8..1a56f549739cf6512013423898378cc2b32533e5 100644 (file)
@@ -161,7 +161,7 @@ SHADER_DEFINE( shader_tile_colour,
 SHADER_DEFINE( shader_ball,
        // VERTEX
        "layout (location=0) in vec2 a_co;"
-       "uniform vec2 uOffset;"
+       "uniform vec3 uOffset;"
        "uniform mat3 uPv;"
        ""
        "out vec4 aTexCoords;"
@@ -169,7 +169,7 @@ SHADER_DEFINE( shader_ball,
        "void main()"
        "{"
                // Vertex transform
-               "vec3 worldpos = vec3( a_co * 0.5 - 0.25 + uOffset, 1.0 );"
+               "vec3 worldpos = vec3( (a_co * 0.5 - 0.25) * uOffset.z + uOffset.xy, 1.0 );"
                "gl_Position = vec4( uPv * worldpos, 1.0 );"
 
                // Create texture coords