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 )
m4x3f collider_mtx,
inv_collider_mtx;
+ v4f prev_q;
+ v3f prev_co;
+
u32 use_limits;
v3f limits[2];
{
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++ ){
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 );
}
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();
/* 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 );
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 );
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 )
/* '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" );
VG_STATIC void vg_ui(void)
{
-#if 0
player__im_gui( &localplayer );
-#endif
world_instance *world = get_active_world();
menu_crap_ui();