}
predictions[22];
u32 prediction_count;
+ float land_dist;
+ v3f land_normal;
/* animation */
struct skeleton_anim *anim_stand, *anim_highg, *anim_slide,
{
v4f correction;
q_axis_angle( correction, axis,
- acosf(angle)*(1.0f-limiter)*3.0f*VG_TIMESTEP_FIXED );
+ acosf(angle)*(1.0f-limiter)*2.0f*VG_TIMESTEP_FIXED );
q_mul( correction, player->rb.q, player->rb.q );
}
}
s->state.steery -= steer[0] * k_steer_air * VG_TIMESTEP_FIXED;
s->state.steerx += steer[1] * s->state.reverse * k_steer_air
* limiter * k_rb_delta;
+ s->land_dist = time_to_impact;
+ v3_copy( target_normal, s->land_normal );
}
VG_STATIC void skate_get_board_points( player_interface *player,
float angle = -atan2f( dy, dx );
q_axis_angle( s->board_rotation, (v3f){1.0f,0.0f,0.0f}, angle );
+ int lift_frames_limit = 1;
+
/* Surface connection */
if( len == 0 && !(spring_hit0 && spring_hit1) )
{
s->state.lift_frames ++;
- if( s->state.lift_frames >= 8 )
+ if( s->state.lift_frames >= lift_frames_limit )
s->state.activity = k_skate_activity_air;
}
else
{
s->state.lift_frames ++;
- if( s->state.lift_frames >= 8 )
+ if( s->state.lift_frames >= lift_frames_limit )
s->state.activity = k_skate_activity_air;
}
else
s->state.jump_charge = 0.0f;
s->state.jump_time = vg.time;
+
+ v2f steer = { player->input_js1h->axis.value,
+ player->input_js1v->axis.value };
+ v2_normalize_clamp( steer );
+
+ float maxspin = k_steer_air * k_rb_delta * k_spin_boost;
+ s->state.steery_s = -steer[0] * maxspin;
+ s->state.steerx_s = steer[1] * s->state.reverse * maxspin;
+ s->state.steerx = s->state.steerx_s;
+ s->state.steery = s->state.steery_s;
/* FIXME audio events */
#if 0
"k_skate_activity_ground",
"k_skate_activity_grind }" }
[s->state.activity] );
+ player_debugtext( 1, "steer_s: %5.2f %5.2f [%.2f %.2f]\n",
+ s->state.steerx_s, s->state.steery_s,
+ k_steer_ground, k_steer_air );
}
VG_STATIC void player_skate_pose( player_interface *player,
v3_zero( cam->angles );
cam->fov = 119.0f;
- /* TODO: smooth clamp lerp rate of change */
+ v3f flat_dir,
+ vel_dir,
+ look_dir;
+
+ v3_copy( player->rb.v, vel_dir );
+ v3_normalize( vel_dir );
+
+ float tti = s->land_dist;
+ v3f norm;
+ v3_copy( s->land_normal, norm );
+
+ if( s->state.activity == k_skate_activity_ground )
+ {
+ tti = 0.0f;
+ v3_copy( player->rb.to_world[1], norm );
+ }
+
+
+ v3_muladds( vel_dir, norm, -v3_dot(vel_dir,norm), flat_dir );
+ v3_normalize( flat_dir );
- v3_lerp( s->state.vl, player->rb.v, 5.0f*vg.time_delta, s->state.vl );
+ v3_lerp( flat_dir, vel_dir, vg_clampf( tti / 2.0f, 0.4f, 1.0f ), look_dir );
+ v3_lerp( s->state.vl, look_dir, 8.0f*vg.time_delta, s->state.vl );
float *v = s->state.vl,
yaw = atan2f( v[0], -v[2] ),