p->score = -v3_dot( ve, p->n );
p->land_dist = t + k_trace_delta * t1;
+ u32 vert_index = world.scene_geo->arrindices[ idx*3 ];
+ struct world_material *mat = world_tri_index_material( vert_index );
+
+ /* Bias prediction towords ramps */
+ if( !(mat->info.flags & k_material_flag_skate_surface) )
+ p->score *= 10.0f;
+
break;
}
struct player_skate *s = &player->_skate;
/* Steering */
- float input = player->input_js1h->axis.value,
- grab = player->input_grab->axis.value,
- steer = input * (1.0f-(s->state.jump_charge+grab)*0.4f),
- steer_scaled = vg_signf(steer) * powf(steer,2.0f) * k_steer_ground;
+ float steer = player->input_js1h->axis.value,
+ grab = player->input_grab->axis.value;
+
+ steer = vg_signf( steer ) * steer*steer * k_steer_ground;
v3f steer_axis;
- v3_muls( player->rb.to_world[1], -vg_signf( steer_scaled ), steer_axis );
+ v3_muls( player->rb.to_world[1], -vg_signf( steer ), steer_axis );
float rate = 26.0f,
top = 1.0f;
if( s->state.activity == k_skate_activity_air )
{
- rate = 6.0f * fabsf(steer_scaled);
+ rate = 6.0f * fabsf(steer);
top = 1.5f;
}
- else if( s->state.activity == k_skate_activity_grind_5050 )
+ else
{
- rate = 0.0f;
- top = 0.0f;
- }
+ /* rotate slower when grabbing on ground */
+ steer *= (1.0f-(s->state.jump_charge+grab)*0.4f);
- else if( s->state.activity >= k_skate_activity_grind_any )
- {
- rate *= fabsf(steer_scaled);
+ if( s->state.activity == k_skate_activity_grind_5050 )
+ {
+ rate = 0.0f;
+ top = 0.0f;
+ }
- float a = 0.8f * -steer_scaled * k_rb_delta;
+ else if( s->state.activity >= k_skate_activity_grind_any )
+ {
+ rate *= fabsf(steer);
- v4f q;
- q_axis_angle( q, player->rb.to_world[1], a );
- q_mulv( q, s->grind_vec, s->grind_vec );
+ float a = 0.8f * -steer * k_rb_delta;
- v3_normalize( s->grind_vec );
- }
+ v4f q;
+ q_axis_angle( q, player->rb.to_world[1], a );
+ q_mulv( q, s->grind_vec, s->grind_vec );
- else if( s->state.manual_direction )
- {
- rate = 35.0f;
- top = 1.5f;
+ v3_normalize( s->grind_vec );
+ }
+
+ else if( s->state.manual_direction )
+ {
+ rate = 35.0f;
+ top = 1.5f;
+ }
}
float current = v3_dot( player->rb.to_world[1], player->rb.w ),
- addspeed = (steer_scaled * -top) - current,
+ addspeed = (steer * -top) - current,
maxaccel = rate * k_rb_delta,
accel = vg_clampf( addspeed, -maxaccel, maxaccel );
}
VG_STATIC void player_walk_generic_to_skate( player_instance *player,
- enum skate_activity init )
+ enum skate_activity init,
+ float yaw )
{
player->subsystem = k_player_subsystem_skate;
xy_speed[1] = 0.0f;
if( v3_length2( xy_speed ) < 0.1f * 0.1f )
- q_mulv( player->rb.q, (v3f){0.0f,0.0f,-1.6f}, v );
+ q_mulv( player->rb.q, (v3f){0.0f,0.0f,1.6f}, v );
else
v3_copy( player->rb.v, v );
player__skate_reset_animator( player );
player__skate_clear_mechanics( player );
rb_update_transform( &player->rb );
- v3_copy( (v3f){0.0f,0.0f,0.0f}, s->state.trick_euler );
+ v3_copy( (v3f){yaw,0.0f,0.0f}, s->state.trick_euler );
if( init == k_skate_activity_air )
player__approximate_best_trajectory( player );
{
player_walk_drop_in_to_skate( player );
}
+ else if( w->state.outro_type == k_walk_outro_jump_to_air )
+ {
+ player_walk_generic_to_skate( player, k_skate_activity_air, 0.0f );
+ }
else
{
- player_walk_generic_to_skate( player, k_skate_activity_air );
+ player_walk_generic_to_skate( player,
+ k_skate_activity_ground, 1.0f );
}
+
return;
}
}
av->sk.bones[ av->id_ik_foot_r ].co,
w->state.drop_in_foot_anchor );
}
- return;
+ else
+ {
+ w->state.outro_type = k_walk_outro_regular;
+ w->state.outro_anim = w->anim_intro;
+ w->state.outro_start_time = vg.time;
+ w->state.activity = k_walk_activity_lockedmove;
+
+ v3f xy_speed;
+ v3_copy( player->rb.v, xy_speed );
+ xy_speed[1] = 0.0f;
+
+ if( v3_length2( xy_speed ) < 0.1f * 0.1f )
+ q_mulv( player->rb.q, (v3f){0.0f,0.0f,1.6f}, player->rb.v );
+ }
}
else
{
len = rb_manifold_apply_filtered( manifold, len );
v3f surface_avg = { 0.0f, 0.0f, 0.0f };
- w->state.activity = k_walk_activity_air;
+
+ if( w->state.activity != k_walk_activity_lockedmove )
+ w->state.activity = k_walk_activity_air;
for( int i=0; i<len; i++ )
{
if( player_walk_normal_standable( ct->n ) )
{
- w->state.activity = k_walk_activity_ground;
+ if( w->state.activity != k_walk_activity_lockedmove )
+ w->state.activity = k_walk_activity_ground;
+
v3_add( surface_avg, ct->n, surface_avg );
}
*/
float accel_speed = 0.0f, nominal_speed = 0.0f;
v3f movedir;
- v3_muls( right_dir, walk[0], movedir );
+ v3_muls( right_dir, walk[0], movedir );
v3_muladds( movedir, forward_dir, walk[1], movedir );
if( w->state.activity == k_walk_activity_ground )
(const char *[]){ "k_walk_activity_air",
"k_walk_activity_ground",
"k_walk_activity_sleep",
- "k_walk_activity_immobile" }
+ "k_walk_activity_immobile",
+ "k_walk_activity_lockedmove" }
[w->state.activity] );
if( w->state.outro_anim )
w->anim_jump = skeleton_get_anim( sk, "jump+y" );
w->anim_jump_to_air = skeleton_get_anim( sk, "jump_to_air" );
w->anim_drop_in = skeleton_get_anim( sk, "drop_in" );
+ w->anim_intro = skeleton_get_anim( sk, "into_skate" );
}
VG_STATIC void player__walk_transition( player_instance *player, v3f angles )