X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=rigidbody.h;h=b9b863aad2db7c12ddbdb07ae5d15d4c95998204;hb=821f3f664586e72151e95127572677bc73bf6f02;hp=a327488972dd0a5989165c8dd550caa245a30499;hpb=d00b1df8f80e4714dc2f9aa2189d242bb4d09a2f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/rigidbody.h b/rigidbody.h index a327488..b9b863a 100644 --- a/rigidbody.h +++ b/rigidbody.h @@ -24,8 +24,8 @@ static bh_system bh_system_rigidbodies; */ static const float - k_rb_rate = 60.0f, - k_rb_delta = (1.0f/k_rb_rate), + k_rb_rate = (1.0/VG_TIMESTEP_FIXED), + k_rb_delta = (1.0/k_rb_rate), k_friction = 0.6f, k_damp_linear = 0.05f, /* scale velocity 1/(1+x) */ k_damp_angular = 0.1f, /* scale angular 1/(1+x) */ @@ -330,6 +330,40 @@ static void rb_update_transform( rigidbody *rb ) rb_update_bounds( rb ); } +/* + * Extrapolate rigidbody into a transform based on vg accumulator. + * Useful for rendering + */ +static void rb_extrapolate_transform( rigidbody *rb, m4x3f transform ) +{ + float substep = vg_clampf( vg.accumulator / k_rb_delta, 0.0f, 1.0f ); + + v3f co; + v4f q; + + v3_muladds( rb->co, rb->v, k_rb_delta*substep, co ); + + if( v3_length2( rb->w ) > 0.0f ) + { + v4f rotation; + v3f axis; + v3_copy( rb->w, axis ); + + float mag = v3_length( axis ); + v3_divs( axis, mag, axis ); + q_axis_angle( rotation, axis, mag*k_rb_delta*substep ); + q_mul( rotation, rb->q, q ); + q_normalize( q ); + } + else + { + v4_copy( rb->q, q ); + } + + q_m3x3( q, transform ); + v3_copy( co, transform[3] ); +} + /* * Initialize rigidbody and calculate masses, inertia */ @@ -1866,10 +1900,10 @@ static void rb_effect_simple_bouyency( rigidbody *ra, v4f plane, float depth = v3_dot( plane, ra->co ) - plane[3], lambda = vg_clampf( -depth, 0.0f, 1.0f ) * amt; - v3_muladds( ra->v, plane, lambda * ktimestep, ra->v ); + v3_muladds( ra->v, plane, lambda * k_rb_delta, ra->v ); if( depth < 0.0f ) - v3_muls( ra->v, 1.0f-(drag*ktimestep), ra->v ); + v3_muls( ra->v, 1.0f-(drag*k_rb_delta), ra->v ); } /*