From 4694f19706f5176135b06329773ecd7e23aa2c5b Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 12 Dec 2021 00:07:12 +0000 Subject: [PATCH] small animation to ball dying --- fishladder.c | 71 ++++++++++++++++++++++++++++++++---------- fishladder_resources.h | 4 +-- 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/fishladder.c b/fishladder.c index 808a588..8c433fb 100644 --- a/fishladder.c +++ b/fishladder.c @@ -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); diff --git a/fishladder_resources.h b/fishladder_resources.h index f5b392a..1a56f54 100644 --- a/fishladder_resources.h +++ b/fishladder_resources.h @@ -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 -- 2.25.1