From 469722649507c5df7547afa6feccce04ed5c716f Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 17 Apr 2023 00:04:06 +0100 Subject: [PATCH] interpolation problems --- maps_src/mp_spawn.mdl | Bin 130216 -> 132064 bytes player_dead.c | 10 +++++++--- player_ragdoll.h | 27 +++++++++++++++++++++++---- player_skate.c | 11 ++++++++--- skaterift.c | 7 +++---- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/maps_src/mp_spawn.mdl b/maps_src/mp_spawn.mdl index 0d6f093ceadcd99075497dcd27e32e0f19e19e69..2d9a7d2ba76f3652905afdd5a433b1fb677f9e46 100644 GIT binary patch delta 1602 zcmb7EziU%b6h5z9Y}9BIZLN7R?MqXnn{g2oBqo!Jir`?EVxa9%PzRCdBCp_J1`*-T zg6I-D2^AbfY_jR(=%R>=gMWd8#P56ezTPIjr0Ih%=R5a&=bZa9tv};Go}}I^dS|qV zlz}@dw{JC8@7)KDzAv*Plb(oz$JpB4m9^zn6AR|`Gw=K9y78nG*_Z8aGS?OfI!~|9 z)J!N-Lj|b=Z-LV0i?P>U;nn+66&}7;`&a!`W%1Fu3Y_)lzt#DMUQ*LJQ)oamjNA0* zJ}6wPbn!){?T_mfbo%v;q54dX`kOoFX7qYlWhcxWwl(^ODqb>U&1!$%@Ok~OkM_V; zldb-0!)KkK*B?|Nlr6I%>u#qLR==_F+3NPHZ{gti4XCd_sq9#*t*@y0tL{ifYvS|? zO`^p$?R6T^+{{ee;zrZEzPsqTIDJ{23|)tez5l~!Hap%*pgb6Rr#2xw-Uv)ti${sL#ihiXRfL%Yve#FRF!9+>K5;c0`(0 z%4|;1;T7AKZhlo4rgYg)pXI;UK49E}JY_lUehYH`WznY#0|3X40L&q$W$Y+032=;@mU$eT0+>Ti%h(|ReL^{A9olI#7)|21<+P0D03XO( sPJ03<05ia><+K4nEn_jKWlj-bE#?-vX(V&{Z!Z71?7u7f-ou~&01qi)N&o-= delta 175 zcmaFR&avVr`-TWcvl0dd1_L0@P05KbODzI%AwY_OVHc3a0>mJ>%)FG$B diff --git a/player_dead.c b/player_dead.c index b7e6bce..acb434a 100644 --- a/player_dead.c +++ b/player_dead.c @@ -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 ) diff --git a/player_ragdoll.h b/player_ragdoll.h index d6607ae..40ee451 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -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; ipart_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; isk.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; ipart_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(); diff --git a/player_skate.c b/player_skate.c index c300b3f..fc10b73 100644 --- a/player_skate.c +++ b/player_skate.c @@ -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 ) diff --git a/skaterift.c b/skaterift.c index c3dec8c..aa53601 100644 --- a/skaterift.c +++ b/skaterift.c @@ -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(); -- 2.25.1