-
- float grabt = player.input_grab->axis.value;
-
- if( grabt > 0.5f )
- {
- v2_muladds( phys->grab_mouse_delta, vg.mouse_delta, 0.02f,
- phys->grab_mouse_delta );
- v2_normalize_clamp( phys->grab_mouse_delta );
- }
- else
- v2_zero( phys->grab_mouse_delta );
-
- phys->grab = vg_lerpf( phys->grab, grabt, 0.14f );
- player.phys.pushing = 0.0f;
-
- if( !phys->in_air )
- {
- v3f projected, axis;
-
- float d = v3_dot( phys->rb.forward, surface_avg );
- v3_muladds( surface_avg, phys->rb.forward, -d, projected );
- v3_normalize( projected );
-
- float angle = v3_dot( phys->rb.up, projected );
- v3_cross( phys->rb.up, projected, axis );
-
- v3f p0, p1;
- v3_add( phys->rb.co, projected, p0 );
- v3_add( phys->rb.co, phys->rb.up, p1 );
- vg_line( phys->rb.co, p0, 0xff00ff00 );
- vg_line( phys->rb.co, p1, 0xff000fff );
-
- if( fabsf(angle) < 0.999f )
- {
- v4f correction;
- q_axis_angle( correction, axis, acosf(angle)*4.0f*VG_TIMESTEP_FIXED );
- q_mul( correction, phys->rb.q, phys->rb.q );
- }
-
- float const DOWNFORCE = -k_downforce*VG_TIMESTEP_FIXED;
- v3_muladds( phys->rb.v, phys->rb.up, DOWNFORCE, phys->rb.v );
-
- player_physics_control();
-
- if( !phys->jump_charge && phys->jump > 0.2f )
- {
- v3f jumpdir;
-
- /* Launch more up if alignment is up else improve velocity */
- float aup = fabsf(v3_dot( (v3f){0.0f,1.0f,0.0f}, phys->rb.up )),
- mod = 0.5f,
- dir = mod + aup*(1.0f-mod);
-
- v3_copy( phys->rb.v, jumpdir );
- v3_normalize( jumpdir );
- v3_muls( jumpdir, 1.0f-dir, jumpdir );
- v3_muladds( jumpdir, phys->rb.up, dir, jumpdir );
- v3_normalize( jumpdir );
-
- float force = k_jump_force*phys->jump;
- v3_muladds( phys->rb.v, jumpdir, force, phys->rb.v );
- phys->jump = 0.0f;
-
- player.jump_time = vg.time;
-
- /* TODO: Move to audio file */
- audio_lock();
- audio_player_set_flags( &audio_player_extra, AUDIO_FLAG_SPACIAL_3D );
- audio_player_set_position( &audio_player_extra, phys->rb.co );
- audio_player_set_vol( &audio_player_extra, 20.0f );
- audio_player_playclip( &audio_player_extra, &audio_jumps[rand()%2] );
- audio_unlock();
- }
- }
- else
- {
- player_physics_control_air();
- }
-
- if( !phys->jump_charge )
- {
- phys->jump -= k_jump_charge_speed * VG_TIMESTEP_FIXED;
- }
-
- phys->jump_charge = 0;
- phys->jump = vg_clampf( phys->jump, 0.0f, 1.0f );