From: hgn Date: Sat, 28 Jan 2023 10:13:38 +0000 (+0000) Subject: a simple CCD algortihm for walking X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=68f26d6267708e76af28e7790c708948a90379b3;p=carveJwlIkooP6JGAAIwe30JlM.git a simple CCD algortihm for walking --- diff --git a/maps_src/mp_gridmap.mdl b/maps_src/mp_gridmap.mdl index 810f659..7c4cb3f 100644 Binary files a/maps_src/mp_gridmap.mdl and b/maps_src/mp_gridmap.mdl differ diff --git a/player_device_walk.h b/player_device_walk.h index fbbe895..94f4368 100644 --- a/player_device_walk.h +++ b/player_device_walk.h @@ -296,8 +296,36 @@ VG_STATIC void player_walk_post_update( player_interface *player, float substep = vg_clampf( vg.accumulator / k_rb_delta, 0.0f, 1.0f ); v3_muladds( mtx[3], player->rb.v, k_rb_delta*substep, mtx[3] ); - debug_capsule( mtx, w->collider.radius, w->collider.height, VG__YELOW ); + + + v3f lwr_prev, + lwr_now, + lwr_offs = { 0.0f, w->collider.radius, 0.0f }; + + v3_add( lwr_offs, player->prev_position, lwr_prev ); + v3_add( lwr_offs, player->rb.co, lwr_now ); + + v3f movedelta; + v3_sub( player->rb.co, player->prev_position, movedelta ); + + float movedist = v3_length( movedelta ); + + if( movedist > 0.3f ) + { + float t, sr = w->collider.radius-0.04f; + v3f n; + + if( spherecast_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 ); + + v3_add( player->rb.co, (v3f){0.0f, 1.0f, 0.0f}, mtx[3] ); + debug_capsule( mtx, w->collider.radius, w->collider.height, VG__RED ); + } + } } VG_STATIC void player_walk_ui( player_interface *player, diff --git a/skaterift.c b/skaterift.c index 518ac43..e032ccc 100644 --- a/skaterift.c +++ b/skaterift.c @@ -237,7 +237,7 @@ VG_STATIC void vg_load(void) player_use_avatar( &localplayer, &localplayer_avatar ); player_use_mesh( &localplayer, &localplayer_meshes[0] ); player_use_device( &localplayer, &player_device_walk, &localplayer_walk ); - player_use_device( &localplayer, &player_device_skate, &localplayer_skate ); + //player_use_device( &localplayer, &player_device_skate, &localplayer_skate ); /* --------------------- */