+ float p = vg_maxf( 0.0f, ct->p - 0.00f ),
+ cur = vg_clampf( v3_dot( ct->n, dt ), 0.0f, p );
+ v3_muladds( dt, ct->n, (p - cur) * 0.333333333f, dt );
+ }
+ }
+ v3_add( dt, phys->rb.co, phys->rb.co );
+
+ /* jump */
+ if( player.input_jump->button.value )
+ {
+ phys->rb.v[1] = 5.0f;
+ phys->in_air = 1;
+ return;
+ }
+
+ /* if we've put us in the air, step down slowly */
+ phys->in_air = 1;
+ float max_dist = 0.3f,
+ start_y = phys->rb.co[1];
+
+ for( int j=0; j<8; j++ )
+ {
+ for( int i=0; i<len; i++ )
+ {
+ struct contact *ct = &manifold[i];
+ if( v3_dot( ct->n, (v3f){0.0f,1.0f,0.0f} ) > 0.5f )
+ {
+ phys->in_air = 0;
+ if( j == 0 )
+ return;
+
+ v3f dt;
+ v3_zero( dt );
+ for( int j=0; j<3; j++ )
+ {
+ for( int i=0; i<len; i++ )
+ {
+ struct contact *ct = &manifold[i];
+
+ float p = vg_maxf( 0.0f, ct->p - 0.0025f ),
+ cur = vg_clampf( v3_dot( ct->n, dt ), 0.0f, p );
+ v3_muladds( dt, ct->n, (p - cur) * 0.333333333f, dt );
+ }
+ }
+ v3_add( dt, phys->rb.co, phys->rb.co );
+ return;
+ }
+ }
+
+ phys->rb.co[1] -= max_dist * 0.125f;