a simple CCD algortihm for walking
authorhgn <hgodden00@gmail.com>
Sat, 28 Jan 2023 10:13:38 +0000 (10:13 +0000)
committerhgn <hgodden00@gmail.com>
Sat, 28 Jan 2023 10:13:38 +0000 (10:13 +0000)
maps_src/mp_gridmap.mdl
player_device_walk.h
skaterift.c

index 810f659590d16edcf44b9483b4aa760d445df82c..7c4cb3f459191d20d81835297ab027a4d70f8b15 100644 (file)
Binary files a/maps_src/mp_gridmap.mdl and b/maps_src/mp_gridmap.mdl differ
index fbbe895286e756ef6fbb7f9e5a8540e7e1dee182..94f436821cdbad67bf3e9f328b5dd15d3dc3eef8 100644 (file)
@@ -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,
index 518ac439995c8dd39c42764e4217b9ae4161ebd6..e032cccc08295e878127c8ccc7da0a4112cda4eb 100644 (file)
@@ -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 );
 
    /* --------------------- */