+ v3_add( impulse, phys->rb.v, phys->rb.v );
+
+ /* friction */
+ for( int j=0; j<2; j++ )
+ {
+ float f = k_friction * ct->norm_impulse,
+ vt = v3_dot( phys->rb.v, ct->t[j] ),
+ lambda = -vt;
+
+ float temp = ct->tangent_impulse[j];
+ ct->tangent_impulse[j] = vg_clampf( temp + lambda, -f, f );
+ lambda = ct->tangent_impulse[j] - temp;
+
+ v3_muladds( phys->rb.v, ct->t[j], lambda, phys->rb.v );
+ }
+ }
+ }
+
+ player_integrate();
+ }
+ else
+ {
+ player.walk = v2_length( walk );
+
+ if( player.input_walk->button.value )
+ v2_muls( walk, 0.5f, walk );
+
+ v2_muls( walk, k_walkspeed * VG_TIMESTEP_FIXED, walk );
+
+ v3f walk_apply;
+ v3_zero( walk_apply );
+
+ /* Do XY translation */
+ v3_muladds( walk_apply, right_dir, walk[0], walk_apply );
+ v3_muladds( walk_apply, forward_dir, walk[1], walk_apply );
+ v3_add( walk_apply, phys->rb.co, phys->rb.co );
+ v3_divs( walk_apply, VG_TIMESTEP_FIXED, phys->rb.v );
+
+ /* Directly resolve collisions */
+ player_walk_update_collision();
+ rb_debug( rbf, 0xffffff00 );
+ rb_debug( rbb, 0xffffff00 );
+
+ len = 0;
+ len += rb_sphere_scene( rbf, &world.rb_geo, manifold+len );
+ len += rb_sphere_scene( rbb, &world.rb_geo, manifold+len );
+
+ v3f dt;
+ v3_zero( dt );
+ for( int j=0; j<3; j++ )
+ {
+ for( int i=0; i<len; i++ )