X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.c;h=3cefc295068cf8ff5b4cd666663ee2e4b7ad5ba4;hb=8a31c1ffcb632b9b6d1702332f0d75d609c0a87b;hp=077dfd9a823d2cffa59acb10abd16323bc14cb7a;hpb=3e59ac7081ea3005060b56449bc77c8f73cdc6b6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.c b/player_walk.c index 077dfd9..3cefc29 100644 --- a/player_walk.c +++ b/player_walk.c @@ -370,6 +370,43 @@ VG_STATIC void player_friction( v3f v ){ v3_muls( v, newspeed, v ); } +VG_STATIC void player_walk_custom_filter( world_instance *world, + rb_ct *man, int len, f32 w ){ + for( int i=0; itype == k_contact_type_disabled || + ci->type == k_contact_type_edge ) + continue; + + + float d1 = v3_dot( ci->co, ci->n ); + + for( int j=0; jtype == k_contact_type_disabled ) + continue; + + struct world_surface *si = world_contact_surface( world, ci ), + *sj = world_contact_surface( world, cj ); + + if( (sj->info.flags & k_material_flag_walking) && + !(si->info.flags & k_material_flag_walking)){ + continue; + } + + float d2 = v3_dot( cj->co, ci->n ), + d = d2-d1; + + if( fabsf( d ) <= w ){ + cj->type = k_contact_type_disabled; + } + } + } +} + VG_STATIC void player__walk_update( player_instance *player ){ struct player_walk *w = &player->_walk; v3_copy( player->rb.co, w->state.prev_pos ); @@ -421,7 +458,7 @@ VG_STATIC void player__walk_update( player_instance *player ){ len = rb_capsule__scene( mtx, &w->collider, NULL, &world->rb_geo.inf.scene, manifold ); - rb_manifold_filter_coplanar( manifold, len, 0.01f ); + player_walk_custom_filter( world, manifold, len, 0.01f ); len = rb_manifold_apply_filtered( manifold, len ); v3f surface_avg = { 0.0f, 0.0f, 0.0f }; @@ -660,12 +697,12 @@ VG_STATIC void player__walk_post_update( player_instance *player ){ int walk_phase = 0; - if( vg_fractf(w->walk_timer) > 0.5f ) + if( vg_fractf(w->state.walk_timer) > 0.5f ) walk_phase = 1; else walk_phase = 0; - if( (w->step_phase != walk_phase) && + if( (w->state.step_phase != walk_phase) && (w->state.activity == k_walk_activity_ground ) ) { audio_lock(); @@ -692,7 +729,7 @@ VG_STATIC void player__walk_post_update( player_instance *player ){ audio_unlock(); } - w->step_phase = walk_phase; + w->state.step_phase = walk_phase; } VG_STATIC void player__walk_animate( player_instance *player ){ @@ -720,11 +757,11 @@ VG_STATIC void player__walk_animate( player_instance *player ){ run_norm = 30.0f/(float)w->anim_run->length, walk_adv = vg_lerpf( walk_norm, run_norm, w->move_speed ); - w->walk_timer += walk_adv * vg.time_delta; - } - else{ - w->walk_timer = 0.0f; + w->state.walk_timer += walk_adv * vg.time_delta; } + else + w->state.walk_timer = 0.0f; + animator->walk_timer = w->state.walk_timer; if( !player->immobile ) rb_extrapolate( &player->rb, animator->root_co, animator->root_q ); @@ -796,10 +833,11 @@ VG_STATIC void player__walk_pose( player_instance *player, player_pose *pose ){ v3_copy( animator->root_co, pose->root_co ); v4_copy( animator->root_q, pose->root_q ); pose->board.lean = 0.0f; + pose->type = k_player_pose_type_ik; float walk_norm = (float)w->anim_walk->length/30.0f, run_norm = (float)w->anim_run->length/30.0f, - t = w->walk_timer, + t = animator->walk_timer, l = vg_clampf( animator->run*15.0f, 0.0f, 1.0f ), idle_walk = vg_clampf( (animator->run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f ); @@ -917,6 +955,12 @@ VG_STATIC void player__walk_bind( player_instance *player ){ VG_STATIC void player__walk_transition( player_instance *player ){ struct player_walk *w = &player->_walk; w->state.activity = k_walk_activity_air; + w->state.outro_type = k_walk_outro_none; + w->state.outro_start_time = 0.0; + w->state.jump_queued = 0; + w->state.jump_input_time = 0.0; + w->state.walk_timer = 0.0f; + w->state.step_phase = 0; v3f fwd = { 0.0f, 0.0f, 1.0f }; q_mulv( player->rb.q, fwd, fwd );