oh yeah mr crabs
[carveJwlIkooP6JGAAIwe30JlM.git] / player_physics.h
index b3cd9d5832699d675a617c2e3e679212a3bf3f1a..6c170c6d9ae16f54272096c44c69b448c340c03c 100644 (file)
@@ -6,6 +6,7 @@
 #define PLAYER_PHYSICS_H
 
 #include "player.h"
+#include "camera.h"
 
 static void apply_gravity( v3f vel, float const timestep )
 {
@@ -135,13 +136,17 @@ static void player_physics_control(void)
    phys->reverse = -vg_signf(vel[2]);
 
    float substep = VG_TIMESTEP_FIXED * 0.2f;
-   float fwd_resistance = (vg_get_button( "break" )? 5.0f: 0.02f) * -substep;
+
+#if 0
+   float fwd_resistance = vg_get_button( "break" )? 5.0f: k_friction_resistance;
+#else
+   float fwd_resistance = k_friction_resistance;
+#endif
 
    for( int i=0; i<5; i++ )
    {
-      vel[2] = stable_force( vel[2], vg_signf( vel[2] ) * fwd_resistance );
-      vel[0] = stable_force( vel[0], 
-            vg_signf( vel[0] ) * -k_friction_lat*substep );
+      vel[2] = stable_force( vel[2],vg_signf(vel[2]) * -fwd_resistance*substep);
+      vel[0] = stable_force( vel[0],vg_signf(vel[0]) * -k_friction_lat*substep);
    }
    
    if( vg_get_button( "jump" ) )
@@ -154,14 +159,16 @@ static void player_physics_control(void)
       phys->jump_charge = 1;
    }
 
-   static int push_button_last = 0;
-   int push_button = vg_get_button( "push" );
-   push_button_last = push_button;
-
-   if( push_button && !push_button_last )
+   static int push_thresh_last = 0;
+   float push_amt = vg_get_axis( "walk/push" ) * 0.5f + 0.5f;
+   int push_thresh = push_amt>0.15f? 1: 0;
+   
+   if( push_thresh && !push_thresh_last )
       player.phys.start_push = vg.time;
 
-   if( !vg_get_button("break") && vg_get_button( "push" ) )
+   push_thresh_last = push_thresh;
+
+   if( !vg_get_button("break") && push_thresh )
    {
       player.phys.pushing = 1.0f;
       player.phys.push_time = vg.time - player.phys.start_push;
@@ -190,7 +197,7 @@ static void player_physics_control(void)
    
    m3x3_mulv( phys->rb.to_world, vel, phys->rb.v );
    
-   float steer = vg_get_axis( "horizontal" ),
+   float steer = vg_get_axis( "lookh" ),
          steer_scaled = vg_signf(steer) * powf(steer,2.0f) * k_steer_ground;
 
    phys->iY -= steer_scaled * VG_TIMESTEP_FIXED;
@@ -250,7 +257,8 @@ static void player_physics_control_air(void)
          if( angle < 0.99f )
          {
             v4f correction;
-            q_axis_angle( correction, axis, acosf(angle)*0.05f*(1.0f-limiter) );
+            q_axis_angle( correction, axis, 
+                  acosf(angle)*(1.0f-limiter)*3.0f*VG_TIMESTEP_FIXED );
             q_mul( correction, phys->rb.q, phys->rb.q );
          }
 
@@ -260,9 +268,9 @@ static void player_physics_control_air(void)
       time_to_impact += pstep;
    }
 
-   phys->iY -= vg_get_axis( "horizontal" ) * k_steer_air * VG_TIMESTEP_FIXED;
+   phys->iY -= vg_get_axis( "lookh" ) * k_steer_air * VG_TIMESTEP_FIXED;
    {
-      float iX = vg_get_axis( "vertical" ) * 
+      float iX = vg_get_axis( "lookv" ) * 
          phys->reverse * k_steer_air * limiter * VG_TIMESTEP_FIXED;
 
       static float siX = 0.0f;
@@ -274,7 +282,7 @@ static void player_physics_control_air(void)
    }
    
    v2f target = {0.0f,0.0f};
-   v2_muladds( target, (v2f){ vg_get_axis("h1"), vg_get_axis("v1") },
+   v2_muladds( target, (v2f){ vg_get_axis("grabh"), vg_get_axis("grabv") },
                phys->grab, target );
 }
 
@@ -373,13 +381,12 @@ static void player_walk_physics(void)
    v3_muladds( phys->rb.co, forward_dir, 2.0f, p1 );
    vg_line( phys->rb.co, p1, 0xff0000ff );
 
-   float move_dead = 0.1f,
-         move = vg_get_axis("grabl")*0.5f + 0.5f - move_dead;
+   player.walk = powf( vg_get_axis("walk/push")*0.5f + 0.5f, 4.0f );
 
-   if( move > 0.0f )
+   if( player.walk > 0.025f )
    {
-      float move_norm = move * (1.0f/(1.0f-move_dead)),
-            speed     = vg_lerpf( 0.1f*k_runspeed, k_runspeed, move_norm ),
+      float 
+            speed     = vg_lerpf( 0.025f*k_runspeed, k_runspeed, player.walk ),
             amt       = k_walk_accel * VG_TIMESTEP_FIXED,
             zvel      = v3_dot( phys->rb.v, forward_dir ),
             new_vel   = vg_minf( zvel + amt, speed ),
@@ -389,17 +396,6 @@ static void player_walk_physics(void)
       {
          v3_muladds( phys->rb.v, forward_dir, diff, phys->rb.v );
       }
-
-      /* TODO move */
-      float walk_norm = 30.0f/(float)player.mdl.anim_walk->length,
-            run_norm  = 30.0f/(float)player.mdl.anim_run->length,
-            walk_adv  = vg_lerpf( walk_norm,run_norm,move_norm );
-
-      player.walk_timer += walk_adv * VG_TIMESTEP_FIXED;
-   }
-   else
-   {
-      player.walk_timer = 0.0f;
    }
    
    if( !phys->in_air )
@@ -469,7 +465,9 @@ static void player_physics(void)
          player_start_air();
       }
       else
+      {
          phys->in_air = 0;
+      }
    }
 
    for( int j=0; j<5; j++ )
@@ -519,12 +517,13 @@ static void player_physics(void)
       }
    }
 
-   float grabt = vg_get_axis( "grabr" )*0.5f+0.5f;
+   float grabt = vg_get_axis( "grab" )*0.5f+0.5f;
    phys->grab = vg_lerpf( phys->grab, grabt, 0.14f );
    player.phys.pushing = 0.0f;
 
    if( !phys->in_air )
    {
+#if 0
       v3f axis;
       float angle = v3_dot( phys->rb.up, surface_avg );
       v3_cross( phys->rb.up, surface_avg, axis );
@@ -535,9 +534,37 @@ static void player_physics(void)
       if( angle < 0.999f )
       {
          v4f correction;
-         q_axis_angle( correction, axis, acosf(angle)*0.3f );
+         q_axis_angle( correction, axis, acosf(angle)*18.0f*VG_TIMESTEP_FIXED );
          q_mul( correction, phys->rb.q, phys->rb.q );
       }
+#else
+      
+      /* 20/10/22: make this only go axisways instead, may effect velocities. */
+
+      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 );
+      }
+
+
+#endif
 
       float const DOWNFORCE = -k_downforce*VG_TIMESTEP_FIXED;
       v3_muladds( phys->rb.v, phys->rb.up, DOWNFORCE, phys->rb.v );
@@ -570,7 +597,7 @@ static void player_physics(void)
          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()%4] );
+         audio_player_playclip( &audio_player_extra, &audio_jumps[rand()%2] );
          audio_unlock();
       }
    }
@@ -687,6 +714,9 @@ static void player_do_motion(void)
             player.angles[0] = atan2f( fwd_dir[2], fwd_dir[0] );
          }
          
+         player.rewind_length = 0;
+         player.rewind_total_length = 0.0f;
+         player.rewind_incrementer = 10000;
          player_save_frame();
 
          audio_lock();
@@ -722,9 +752,6 @@ static void player_mouseview(void)
       v2_muladds( view_vel, delta, 0.06f*vg.time_delta, view_vel );
    }
    
-   v2_muladds( view_vel, (v2f){ vg_get_axis("h1"), vg_get_axis("v1") }, 
-                         3.0f * vg.time_delta, view_vel );
-
    v2_muls( view_vel, 1.0f-4.2f*vg.time_delta, view_vel );
    v2_add( view_vel, player.angles, player.angles );
    player.angles[1] = vg_clampf( player.angles[1], -VG_PIf*0.5f, VG_PIf*0.5f );
@@ -738,8 +765,8 @@ static void player_freecam(void)
    v3f lookdir = { 0.0f, 0.0f, -1.0f },
        sidedir = { 1.0f, 0.0f,  0.0f };
    
-   m3x3_mulv( player.camera, lookdir, lookdir );
-   m3x3_mulv( player.camera, sidedir, sidedir );
+   m3x3_mulv( camera_mtx, lookdir, lookdir );
+   m3x3_mulv( camera_mtx, sidedir, sidedir );
    
    static v3f move_vel = { 0.0f, 0.0f, 0.0f };
    if( vg_get_button( "forward" ) )
@@ -755,20 +782,6 @@ static void player_freecam(void)
    v3_add( move_vel, player.camera_pos, player.camera_pos );
 }
 
-static void player_camera_update(void)
-{
-   /* Update camera matrices */
-   v4f qyaw, qpitch, qcam;
-   q_axis_angle( qyaw, (v3f){ 0.0f, 1.0f, 0.0f }, -player.angles[0] ); 
-   q_axis_angle( qpitch, (v3f){ 1.0f, 0.0f, 0.0f }, -player.angles[1] ); 
-
-   q_mul( qyaw, qpitch, qcam );
-   q_m3x3( qcam, player.camera );
-
-   v3_copy( player.camera_pos, player.camera[3] );
-   m4x3_invert_affine( player.camera, player.camera_inverse );
-}
-
 static int reset_player( int argc, char const *argv[] )
 {
    struct player_phys *phys = &player.phys;