interpolation problems
authorhgn <hgodden00@gmail.com>
Sun, 16 Apr 2023 23:04:06 +0000 (00:04 +0100)
committerhgn <hgodden00@gmail.com>
Sun, 16 Apr 2023 23:04:06 +0000 (00:04 +0100)
maps_src/mp_spawn.mdl
player_dead.c
player_ragdoll.h
player_skate.c
skaterift.c

index 0d6f093ceadcd99075497dcd27e32e0f19e19e69..2d9a7d2ba76f3652905afdd5a433b1fb677f9e46 100644 (file)
Binary files a/maps_src/mp_spawn.mdl and b/maps_src/mp_spawn.mdl differ
index b7e6bce8539f82676fb51bf9f0fe2e46e77c3a2a..acb434aba50fae7f72cce65c633bbc287dd7bfa4 100644 (file)
@@ -31,13 +31,17 @@ VG_STATIC void player__dead_post_animate( player_instance *player )
 
    struct ragdoll_part *part = &player->ragdoll.parts[ av->id_hip-1 ];
 
-   v3_lerp( d->co_lpf, part->obj.rb.co, vg.time_frame_delta*4.0f, d->co_lpf );
+   v3f ext_co;
+   v4f ext_q;
+   rb_extrapolate( &part->obj.rb, ext_co, ext_q );
+
+   v3_lerp( d->co_lpf, ext_co, vg.time_frame_delta*4.0f, d->co_lpf );
    v3_lerp( d->v_lpf,  part->obj.rb.v,  vg.time_frame_delta*4.0f, d->v_lpf );
    v3_lerp( d->w_lpf,  part->obj.rb.w,  vg.time_frame_delta*4.0f, d->w_lpf );
    
    v3_copy( d->co_lpf, player->rb.co );
-   v3_copy( d->v_lpf, player->rb.v );
-   v3_copy( d->w_lpf, player->rb.w );
+   v3_zero( player->rb.v );
+   v3_zero( player->rb.w );
 }
 
 VG_STATIC void player__dead_im_gui      ( player_instance *player )
index d6607ae89331a9ef7ec2883e37099f7665043f73..40ee45158ded5b131eff9649bba16d4691c922cc 100644 (file)
@@ -17,6 +17,9 @@ struct player_ragdoll{
       m4x3f collider_mtx,
             inv_collider_mtx;
 
+      v4f prev_q;
+      v3f prev_co;
+
       u32 use_limits;
       v3f limits[2];
 
@@ -232,10 +235,20 @@ VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
 {
    for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
-      m4x3f offset;
-      m3x3_identity(offset);
-      m4x3_mul( part->obj.rb.to_world, part->inv_collider_mtx, 
-                  av->sk.final_mtx[part->bone_id] );
+
+      m4x3f mtx;
+
+      v4f q_int;
+      v3f co_int;
+
+      float substep = vg.time_fixed_extrapolate;
+      v3_lerp( part->prev_co, part->obj.rb.co, substep, co_int );
+      q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int );
+
+      q_m3x3( q_int, mtx );
+      v3_copy( co_int, mtx[3] );
+
+      m4x3_mul( mtx, part->inv_collider_mtx, av->sk.final_mtx[part->bone_id] );
    }
 
    for( u32 i=1; i<av->sk.bone_count; i++ ){
@@ -280,6 +293,9 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
 
       v3_copy( velocity, part->obj.rb.v );
       v3_zero( part->obj.rb.w );
+
+      v3_copy( part->obj.rb.co, part->prev_co );
+      v4_copy( part->obj.rb.q, part->prev_q );
       
       rb_update_transform( &part->obj.rb );
    }
@@ -312,6 +328,9 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
    float contact_velocities[256];
 
    for( int i=0; i<rd->part_count; i ++ ){
+      v4_copy( rd->parts[i].obj.rb.q, rd->parts[i].prev_q );
+      v3_copy( rd->parts[i].obj.rb.co, rd->parts[i].prev_co );
+
       if( rb_global_has_space() ){
          rb_ct *buf = rb_global_buffer();
 
index c300b3f579a67c95a1b95663d00d5b89b461726d..fc10b7341fc0487cff6ba9b68ddde5f87efff120 100644 (file)
@@ -3029,14 +3029,17 @@ VG_STATIC void player__skate_animate( player_instance *player,
 
    /* transform */
    rb_extrapolate( &player->rb, dest->root_co, dest->root_q );
-   v3_muladds( dest->root_co, player->rb.to_world[1], -0.1f, dest->root_co );
 
-   float substep = vg.time_fixed_extrapolate;
+   v3f ext_up,ext_co;
+   q_mulv( dest->root_q, (v3f){0.0f,1.0f,0.0f}, ext_up );
+   v3_copy( dest->root_co, ext_co );
+   v3_muladds( dest->root_co, ext_up, -0.1f, dest->root_co );
 
    v4f qflip;
    if( (s->state.activity <= k_skate_activity_air_to_grind) &&
        (fabsf(s->state.flip_rate) > 0.01f) )
    {
+      float substep = vg.time_fixed_extrapolate;
       float t     = s->state.flip_time+s->state.flip_rate*substep*k_rb_delta;
             sign  = vg_signf( t );
 
@@ -3054,7 +3057,7 @@ VG_STATIC void player__skate_animate( player_instance *player,
       q_normalize( dest->root_q );
 
       v3f rotation_point, rco;
-      v3_muladds( player->rb.co, player->rb.to_world[1], 0.5f, rotation_point );
+      v3_muladds( ext_co, ext_up, 0.5f, rotation_point );
       v3_sub( dest->root_co, rotation_point, rco );
       
       q_mulv( qflip, rco, rco );
@@ -3075,6 +3078,8 @@ VG_STATIC void player__skate_post_animate( player_instance *player )
    m4x3_mulv( av->sk.final_mtx[ av->id_head ], head, s->state.head_position );
    m4x3_mulv( player->rb.to_local, s->state.head_position, 
                                    s->state.head_position );
+
+   /* TODO: Extrapolate to_local matrix? */
 }
 
 VG_STATIC void player__skate_reset_animator( player_instance *player )
index c3dec8c87d9a749cbb6a0b68173794abb8fd9694..aa536014bb8628b62237a0d412d61b0669fd88f3 100644 (file)
@@ -166,11 +166,12 @@ VG_STATIC void vg_load(void)
    /* 'systems' are completely loaded now */
 
    /* load home world */
+
 #if 0
    world_load( 0, "maps/mp_spawn.mdl" );
-#endif
-
+#else
    world_load( 0, "maps/mp_mtzero.mdl" );
+#endif
 
 #if 0
    world_load( &world_global.worlds[1], "maps/mp_gridmap.mdl" );
@@ -479,9 +480,7 @@ VG_STATIC void vg_render(void)
 
 VG_STATIC void vg_ui(void)
 {
-#if 0
    player__im_gui( &localplayer );
-#endif
    world_instance *world = get_active_world();
    menu_crap_ui();