if( w->state.activity != k_walk_activity_lockedmove )
w->state.activity = k_walk_activity_air;
+ w->surface = k_surface_prop_concrete;
+
for( int i=0; i<len; i++ )
{
struct contact *ct = &manifold[i];
w->state.activity = k_walk_activity_ground;
v3_add( surface_avg, ct->n, surface_avg );
+
+ struct world_surface *surf = world_contact_surface( world, ct );
+ if( surf->info.surface_prop > w->surface )
+ w->surface = surf->info.surface_prop;
}
rb_prepare_contact( ct, k_rb_delta );
v3_muls( right_dir, walk[0], movedir );
v3_muladds( movedir, forward_dir, walk[1], movedir );
- if( w->state.activity == k_walk_activity_ground )
- {
+ if( w->state.activity == k_walk_activity_ground ){
v3_normalize( surface_avg );
v3f tx, ty;
rb_tangent_basis( surface_avg, tx, ty );
- if( v2_length2(walk) > 0.001f )
- {
+ if( v2_length2(walk) > 0.001f ){
/* clip movement to the surface */
float d = v3_dot(surface_avg,movedir);
v3_muladds( movedir, surface_avg, -d, movedir );
nominal_speed = k_walkspeed;
/* jump */
- if( player->input_jump->button.value )
- {
+ if( player->input_jump->button.value ){
v3_muladds( player->rb.v, player->basis[1], 5.0f, player->rb.v );
w->state.activity = k_walk_activity_air;
accel_speed = k_walk_air_accel;
nominal_speed = k_airspeed;
}
- else
- {
+ else{
player_friction( player->rb.v );
-
- struct world_material *surface_mat =
- world_contact_material( world, manifold);
- w->surface = surface_mat->info.surface_prop;
}
}
- else
- {
+ else{
accel_speed = k_walk_air_accel;
nominal_speed = k_airspeed;
}
- if( v2_length2(walk) > 0.001f )
- {
+ if( v2_length2(walk) > 0.001f ){
player_accelerate( player->rb.v, movedir, nominal_speed, accel_speed );
v3_normalize( movedir );
}
/*
* Resolve velocity constraints
*/
- for( int j=0; j<5; j++ )
- {
- for( int i=0; i<len; i++ )
- {
+ for( int j=0; j<5; j++ ){
+ for( int i=0; i<len; i++ ){
struct contact *ct = &manifold[i];
/*normal */
}
}
- teleport_gate *gate;
- if( (gate = world_intersect_gates(world, player->rb.co, w->state.prev_pos)) )
- {
+ ent_gate *gate =
+ world_intersect_gates( world, player->rb.co, w->state.prev_pos );
+ if( gate ){
m4x3_mulv( gate->transport, player->rb.co, player->rb.co );
m3x3_mulv( gate->transport, player->rb.v, player->rb.v );
v3_add( player->rb.co, p1, p1 );
vg_line( player->rb.co, p1, VG__PINK );
+
+
+ int walk_phase = 0;
+ if( vg_fractf(w->walk_timer) > 0.5f )
+ walk_phase = 1;
+ else
+ walk_phase = 0;
+
+ if( (w->step_phase != walk_phase) &&
+ (w->state.activity == k_walk_activity_ground ) )
+ {
+ audio_lock();
+ if( w->surface == k_surface_prop_concrete ){
+ audio_oneshot_3d(
+ &audio_footsteps[rand()%vg_list_size(audio_footsteps)],
+ player->rb.co, 40.0f, 1.0f
+ );
+ }
+ else if( w->surface == k_surface_prop_grass ){
+ audio_oneshot_3d(
+ &audio_footsteps_grass[rand()%vg_list_size(audio_footsteps_grass)],
+ player->rb.co, 40.0f, 1.0f
+ );
+ }
+ else if( w->surface == k_surface_prop_wood ){
+ audio_oneshot_3d(
+ &audio_footsteps_wood[rand()%vg_list_size(audio_footsteps_wood)],
+ player->rb.co, 40.0f, 1.0f
+ );
+ }
+ audio_unlock();
+ }
+
+ w->step_phase = walk_phase;
}
VG_STATIC void player__walk_animate( player_instance *player,
player_pose apose, bpose;
- if( w->move_speed > 0.025f )
- {
+ if( w->move_speed > 0.025f ){
/* TODO move */
float walk_norm = 30.0f/(float)w->anim_walk->length,
run_norm = 30.0f/(float)w->anim_run->length,
w->walk_timer += walk_adv * vg.time_delta;
}
- else
- {
+ else{
w->walk_timer = 0.0f;
}
float walk_yaw = player_get_heading_yaw( player );
- if( w->state.outro_anim )
- {
+ if( w->state.outro_anim ){
struct player_avatar *av = player->playeravatar;
float outro_length = (float)w->state.outro_anim->length /
w->state.outro_anim->rate,
outro_time, bpose );
skeleton_lerp_pose( sk, apose, bpose, outro_t * 10.0f, dest->pose );
- if( w->state.outro_type == k_walk_outro_drop_in )
- {
+ if( w->state.outro_type == k_walk_outro_drop_in ){
float inv_rate = 1.0f / w->state.outro_anim->rate,
anim_frames = w->state.outro_anim->length * inv_rate,
step_frames = 12.0f * inv_rate,
/* the drop in bit */
- if( step_t >= 1.0f )
- {
+ if( step_t >= 1.0f ){
v4f final_q;
player_walk_drop_in_overhang_transform( player, dop_t,
player->rb.co, final_q );
}
return;
}
- else
- {
+ else{
v3_muladds( dest->root_co, player->rb.to_world[1],
-0.1f * outro_t, dest->root_co );
player->holdout_time = 1.0f;
}
}
- else
- {
+ else{
skeleton_copy_pose( sk, apose, dest->pose );
}
"k_walk_activity_immobile",
"k_walk_activity_lockedmove" }
[w->state.activity] );
+ player__debugtext( 1, "surface: %s\n",
+ (const char *[]){ "concrete",
+ "wood",
+ "grass",
+ "tiles",
+ "metal" }
+ [w->surface] );
if( w->state.outro_anim )
{