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
// ========================================================================================================
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);
}
fish->state = k_fish_state_dead;
+ fish->death_time = -1000.0f;
continue;
}
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;
}
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] ||
}
}
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 );
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 );
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;
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);
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 );
}
}
}
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
// ========================================================================================================
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 );
}
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);