add jumping
authorhgn <hgodden00@gmail.com>
Mon, 10 Oct 2022 20:18:36 +0000 (21:18 +0100)
committerhgn <hgodden00@gmail.com>
Mon, 10 Oct 2022 20:18:36 +0000 (21:18 +0100)
main.c
models_src/ch_new.mdl
models_src/mp_dev.mdl
player.h
player_animation.h
player_model.h
player_physics.h
player_ragdoll.h

diff --git a/main.c b/main.c
index 0d4ee25781014e1026cd45c90721130aab2cbafb..3cee76a8ce99fb5ecd6e0275a3fecff3cbf5e578 100644 (file)
--- a/main.c
+++ b/main.c
@@ -139,7 +139,11 @@ static void render_main_game(void)
    m4x4f world_4x4;
    m4x3_expand( player.camera_inverse, world_4x4 );
 
-   gpipeline.fov = freecam? 60.0f: 125.0f; /* 120 */
+   static float fov = 97.0f;
+   float fov_target = player.phys.on_board? 125.0f: 108.0f;
+   fov = vg_lerpf( fov, fov_target, vg.time_delta * 2.0f );
+
+   gpipeline.fov = freecam? 60.0f: fov; /* 120 */
    m4x4_projection( vg.pv, gpipeline.fov, 
          (float)vg.window_x / (float)vg.window_y, 
          0.02f, 2100.0f );
index 0a9f1d74d7fc8a893492a33a7df546da8b07f1b6..df1e23c0aff6a4df0acbe7bd2fafbcd5d2e1bcab 100644 (file)
Binary files a/models_src/ch_new.mdl and b/models_src/ch_new.mdl differ
index c5150faaa959a09cacd1c63d73fba3837c39f49c..8b89f00a0a050cddb579d21e47ff481e4cd8529a 100644 (file)
Binary files a/models_src/mp_dev.mdl and b/models_src/mp_dev.mdl differ
index 25054e03f38db5040af9c9437364e99d9a4adc71..57a862817038bb5bf798118617d42a3ed45d2589 100644 (file)
--- a/player.h
+++ b/player.h
@@ -27,6 +27,7 @@ static float
    k_steer_air_lerp        = 0.3f,
    k_pump_force            = 0.0f,
    k_downforce             = 5.0f,
+   k_walk_downforce        = 8.0f,
    k_jump_charge_speed     = (1.0f/1.0f),
    k_jump_force            = 5.0f,
    k_pitch_limit           = 1.5f,
@@ -113,7 +114,8 @@ static struct gplayer
                            *anim_push, *anim_push_reverse,
                            *anim_ollie, *anim_ollie_reverse,
                            *anim_grabs, *anim_stop,
-                           *anim_walk, *anim_run, *anim_idle;
+                           *anim_walk, *anim_run, *anim_idle,
+                           *anim_jump;
 
       u32 id_hip,
           id_ik_hand_l,
index 6f19b83b7a34687b3cab17640b5c0eca6f828c3d..72bac778219fcb25e8aa82bdb6136b9007a1e2fb 100644 (file)
@@ -9,6 +9,18 @@
 
 static void player_animate_offboard(void)
 {
+   {
+      float fly = player.phys.in_air,
+            rate;
+
+      if( player.phys.in_air )
+         rate = 2.4f;
+      else
+         rate = 9.0f;
+
+      player.ffly  = vg_lerpf( player.ffly, fly, rate*vg.time_delta );
+   }
+
    struct player_phys *phys = &player.phys;
 
    mdl_keyframe apose[32], bpose[32];
@@ -19,16 +31,22 @@ static void player_animate_offboard(void)
          t = player.walk_timer,
          l = vg_get_axis("grabl") * 0.5f + 0.5f;
 
+   /* walk/run */
    skeleton_sample_anim( sk, player.mdl.anim_walk, t*walk_norm, apose );
    skeleton_sample_anim( sk, player.mdl.anim_run,  t*run_norm, bpose );
 
    skeleton_lerp_pose( sk, apose, bpose, l, apose );
 
+   /* idle */
    float idle_walk = vg_minf(l * 10.0f, 1.0f);
 
    skeleton_sample_anim( sk, player.mdl.anim_idle, vg.time*0.1f, bpose );
    skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose );
 
+   /* air */
+   skeleton_sample_anim( sk, player.mdl.anim_jump, vg.time*0.6f, bpose );
+   skeleton_lerp_pose( sk, apose, bpose, player.ffly, apose );
+
    skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik );
    skeleton_apply_ik_pass( &player.mdl.sk );
    skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_deffered_only );
index 20e5c0a46c4d8e0d80d35279b70f7d09ade974d6..f2b375aa19988ba7391f5042cb67880ae8aa1ddf 100644 (file)
@@ -68,7 +68,8 @@ static void player_load_model( const char *name )
       { "grabs",        &temp.anim_grabs },
       { "walk",         &temp.anim_walk  },
       { "run",          &temp.anim_run   },
-      { "idle_cycle",   &temp.anim_idle  }
+      { "idle_cycle",   &temp.anim_idle  },
+      { "jump",         &temp.anim_jump  }
    };
    
    for( int i=0; i<vg_list_size(anims); i++ )
index 7594f13a50efe078ec2dc439fe5e4b124d9b1bde..b3cd9d5832699d675a617c2e3e679212a3bf3f1a 100644 (file)
@@ -352,6 +352,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] );
@@ -374,7 +385,10 @@ static void player_walk_physics(void)
             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 );
+      if( !phys->in_air )
+      {
+         v3_muladds( phys->rb.v, forward_dir, diff, phys->rb.v );
+      }
 
       /* TODO move */
       float walk_norm = 30.0f/(float)player.mdl.anim_walk->length,
@@ -387,9 +401,12 @@ static void player_walk_physics(void)
    {
       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);
+   
+   if( !phys->in_air )
+   {
+      phys->rb.v[0] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
+      phys->rb.v[2] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
+   }
 }
 
 /*
index be7506407561c4573469ef3afa196bc908abf8aa..28776c3d683e487a4410541235315208e168f5b9 100644 (file)
@@ -3,7 +3,7 @@
 
 #include "player.h"
 
-static float k_ragdoll_floatyiness = 40.0f,
+static float k_ragdoll_floatyiness = 20.0f,
              k_ragdoll_floatydrag  = 1.0f;
 
 /*