bugs
[carveJwlIkooP6JGAAIwe30JlM.git] / player_physics.h
index 553e5d7abb8df868a8556272eee1fc59211e6f0f..5d1843305adec22610548dbf833d714aa8ea9ce4 100644 (file)
@@ -135,13 +135,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 +158,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 +196,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 +256,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 +267,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 +281,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 );
 }
 
@@ -352,6 +359,17 @@ static void player_walk_physics(void)
    }
 
    phys->in_air = len==0?1:0;
+
+   if( !phys->in_air )
+   {
+      float const DOWNFORCE = -k_walk_downforce*VG_TIMESTEP_FIXED;
+      v3_muladds( phys->rb.v, (v3f){0.0f,-1.0f,0.0f}, DOWNFORCE, phys->rb.v );
+
+      if( vg_get_button("jump") )
+      {
+         phys->rb.v[1] = 5.0f;
+      }
+   }
    
    v3_zero( phys->rb.w );
    q_axis_angle( phys->rb.q, (v3f){0.0f,1.0f,0.0f}, -player.angles[0] );
@@ -362,34 +380,28 @@ 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("grabr")*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 ),
             diff      = new_vel - vg_minf( zvel, speed );
 
-      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;
+      if( !phys->in_air )
+      {
+         v3_muladds( phys->rb.v, forward_dir, diff, phys->rb.v );
+      }
    }
-   else
+   
+   if( !phys->in_air )
    {
-      player.walk_timer = 0.0f;
+      phys->rb.v[0] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
+      phys->rb.v[2] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
    }
-
-   phys->rb.v[0] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
-   phys->rb.v[2] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
 }
 
 /*
@@ -502,7 +514,7 @@ 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;
 
@@ -518,7 +530,7 @@ 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 );
       }