X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.c;h=959ed4be31cef7b4271439a57804475bfe3299e5;hb=0a33f65eecb5e75cddaefa08d3a5eb1a301d0479;hp=e39c8196b1159e24ffb59dc7814fa6ca8ecfedb1;hpb=2673c575386c604fc2c0603dba2480eda05cf97a;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.c b/player_walk.c index e39c819..959ed4b 100644 --- a/player_walk.c +++ b/player_walk.c @@ -361,6 +361,8 @@ VG_STATIC void player__walk_update( player_instance *player ) struct player_walk *w = &player->_walk; v3_copy( player->rb.co, w->state.prev_pos ); + enum walk_activity prev_state = w->state.activity; + if( w->state.activity == k_walk_activity_immobile ) return; @@ -392,11 +394,11 @@ VG_STATIC void player__walk_update( player_instance *player ) v2_normalize_clamp( walk ); w->move_speed = v2_length( walk ); + world_instance *world = get_active_world(); /* * Collision detection */ - world_instance *world = get_active_world(); len = rb_capsule__scene( mtx, &w->collider, NULL, &world->rb_geo.inf.scene, manifold ); @@ -410,13 +412,11 @@ VG_STATIC void player__walk_update( player_instance *player ) w->surface = k_surface_prop_concrete; - for( int i=0; in ) ) - { + if( player_walk_normal_standable( player, ct->n ) ){ if( w->state.activity != k_walk_activity_lockedmove ) w->state.activity = k_walk_activity_ground; @@ -455,8 +455,11 @@ VG_STATIC void player__walk_update( player_instance *player ) /* jump */ if( player->input_jump->button.value ){ + float d = v3_dot( player->basis[1], player->rb.v ); + v3_muladds( player->rb.v, player->basis[1], -d, player->rb.v ); v3_muladds( player->rb.v, player->basis[1], 5.0f, player->rb.v ); w->state.activity = k_walk_activity_air; + prev_state = k_walk_activity_air; accel_speed = k_walk_air_accel; nominal_speed = k_airspeed; } @@ -492,47 +495,44 @@ VG_STATIC void player__walk_update( player_instance *player ) } } - /* - * Depenetrate - */ - v3f dt; - rb_depenetrate( manifold, len, dt ); - v3_add( dt, player->rb.co, player->rb.co ); - - /* TODO: Stepping...... - * - * ideas; walkgrid style steps - */ -#if 0 - if( w->state.activity == k_walk_activity_ground ) - { - /* step */ + /* stepping */ + if( w->state.activity == k_walk_activity_ground|| + prev_state == k_walk_activity_ground ){ float max_dist = 0.4f; v3f pa, pb; v3_copy( player->rb.co, pa ); - pa[1] += w->collider.radius + max_dist; - - v3_muladds( pa, (v3f){0.0f,1.0f,0.0f}, -max_dist * 2.0f, pb ); + v3_muladds( pa, player->basis[1], w->collider.radius + max_dist, pa ); + v3_muladds( pa, player->basis[1], -max_dist * 2.0f, pb ); vg_line( pa, pb, 0xff000000 ); v3f n; float t; - if( spherecast_world( pa, pb, w->collider.radius, &t, n ) != -1 ) - { - if( player_walk_normal_standable( n ) ) - { + if( spherecast_world( world, pa, pb, w->collider.radius, &t, n ) != -1 ){ + if( player_walk_normal_standable( player, n ) ){ v3_lerp( pa, pb, t, player->rb.co ); - player->rb.co[1] -= w->collider.radius; + v3_muladds( player->rb.co, player->basis[1], + -w->collider.radius - k_penetration_slop, + player->rb.co ); + w->state.activity = k_walk_activity_ground; + + float d = -v3_dot(n,player->rb.v), + g = -k_gravity * k_rb_delta; + v3_muladds( player->rb.v, n, d, player->rb.v ); + v3_muladds( player->rb.v, player->basis[1], g, player->rb.v ); } } } -#endif + /* + * Depenetrate + */ + v3f dt; + rb_depenetrate( manifold, len, dt ); + v3_add( dt, player->rb.co, player->rb.co ); /* integrate */ - if( w->state.activity == k_walk_activity_air ) - { + if( w->state.activity == k_walk_activity_air ){ v3_muladds( player->rb.v, player->basis[1], -k_gravity*k_rb_delta, player->rb.v ); } @@ -558,13 +558,11 @@ VG_STATIC void player__walk_update( player_instance *player ) float movedist = v3_length( movedelta ); - if( movedist > 0.3f ) - { + if( movedist > 0.3f ){ float t, sr = w->collider.radius-0.04f; v3f n; - if( spherecast_world( world, lwr_prev, lwr_now, sr, &t, n ) != -1 ) - { + if( spherecast_world( world, lwr_prev, lwr_now, sr, &t, n ) != -1 ){ v3_lerp( lwr_prev, lwr_now, vg_maxf(0.01f,t), player->rb.co ); player->rb.co[1] -= w->collider.radius; rb_update_transform( &player->rb );