a fairly major physics update
[carveJwlIkooP6JGAAIwe30JlM.git] / player.h
index 8e4ae82b99d0ff547c8aa61d874359d395e9b7e9..0e92f3aae5d6f5038bcd7703adb0c046c731844a 100644 (file)
--- a/player.h
+++ b/player.h
@@ -48,6 +48,7 @@ VG_STATIC float
 VG_STATIC int freecam = 0;
 VG_STATIC int walk_grid_iterations = 1;
 VG_STATIC float fc_speed = 10.0f;
+VG_STATIC int cl_thirdperson = 0;
 
 /* 
  * -----------------------------------------------------------------------------
@@ -193,17 +194,28 @@ VG_STATIC struct gplayer
       struct ragdoll_part
       {
          u32 bone_id;
-         v3f offset;
+         //v3f offset;
+         
+         /* Collider transform relative to bone */
+         m4x3f collider_mtx,
+               inv_collider_mtx;
 
          u32 use_limits;
          v3f limits[2];
 
          rigidbody  rb;
          u32 parent;
+         u32 colour;
       }
       ragdoll[32];
       u32 ragdoll_count;
 
+      rb_constr_pos  position_constraints[32];
+      u32            position_constraints_count;
+
+      rb_constr_swingtwist cone_constraints[32];
+      u32                  cone_constraints_count;
+
       int shoes[2];
    }
    mdl;
@@ -240,6 +252,8 @@ VG_STATIC void player_mouseview(void);
  *                                    Events
  * -----------------------------------------------------------------------------
  */
+VG_STATIC int kill_player( int argc, char const *argv[] );
+VG_STATIC int reset_player( int argc, char const *argv[] );
 
 VG_STATIC void player_init(void)                                         /* 1 */
 {
@@ -347,6 +361,14 @@ VG_STATIC void player_init(void)                                         /* 1 */
       .persistent = 1
    });
 
+   vg_convar_push( (struct vg_convar){
+      .name = "cl_thirdperson",
+      .data = &cl_thirdperson,
+      .data_type = k_convar_dtype_i32,
+      .opt_i32 = { .min=0, .max=1, .clamp=1 },
+      .persistent = 1
+   });
+
    vg_convar_push( (struct vg_convar){
       .name = "fcs",
       .data = &fc_speed,
@@ -355,11 +377,51 @@ VG_STATIC void player_init(void)                                         /* 1 */
       .persistent = 1
    });
 
+   vg_convar_push( (struct vg_convar){
+      .name = "k_ragdoll_limit_scale",
+      .data = &k_ragdoll_limit_scale,
+      .data_type = k_convar_dtype_f32,
+      .opt_f32 = { .clamp = 0 },
+      .persistent = 1
+   });
+
+   vg_convar_push( (struct vg_convar){
+      .name = "k_ragdoll_div",
+      .data = &k_ragdoll_div,
+      .data_type = k_convar_dtype_i32,
+      .opt_i32 = { .clamp=0 },
+      .persistent = 1
+   });
+
+   vg_convar_push( (struct vg_convar){
+      .name = "k_ragdoll_debug_collider",
+      .data = &k_ragdoll_debug_collider,
+      .data_type = k_convar_dtype_i32,
+      .opt_i32 = { .clamp=0 },
+      .persistent = 1
+   });
+
+   vg_convar_push( (struct vg_convar){
+      .name = "k_ragdoll_debug_constraints",
+      .data = &k_ragdoll_debug_constraints,
+      .data_type = k_convar_dtype_i32,
+      .opt_i32 = { .clamp=0 },
+      .persistent = 1
+   });
+
        vg_function_push( (struct vg_cmd){
                .name = "reset",
                .function = reset_player
        });
 
+       vg_function_push( (struct vg_cmd){
+               .name = "kill",
+               .function = kill_player
+       });
+
+   /* HACK */
+   rb_register_cvar();
+
    player.rewind_length = 0;
    player.rewind_buffer = 
       vg_linear_alloc( vg_mem.rtmemory, 
@@ -614,7 +676,12 @@ VG_STATIC void player_update_post(void)
       player_animate();
 
       if( !freecam )
-         player_animate_camera();
+      {
+         if( cl_thirdperson )
+            player_animate_camera_thirdperson();
+         else
+            player_animate_camera();
+      }
    }
 
    if( freecam )