X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.h;h=0e92f3aae5d6f5038bcd7703adb0c046c731844a;hb=2a238d32da833812e837cf38e16a7685c98db5c3;hp=cb36975a266bec614e2ccd53b99b7f377f3f53cd;hpb=1a46c04c21370ae5f81795f7fe05b1743355668e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.h b/player.h index cb36975..0e92f3a 100644 --- 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; /* * ----------------------------------------------------------------------------- @@ -69,7 +70,7 @@ VG_STATIC struct gplayer /* Utility */ float vswitch, slip, slip_last, reverse; - float grab, jump, pushing, push_time; + float grab, jump, pushing, push_time, rise; v2f grab_mouse_delta; int lift_frames; @@ -88,16 +89,25 @@ VG_STATIC struct gplayer int is_dead, death_tick_allowance, rewinding; int rewind_sound_wait; - v3f land_target; - - struct land_log + struct land_prediction { - v3f positions[50]; - u32 colour; - int count; - } - land_log[22]; - int land_log_count; + v3f log[50]; + v3f n; + u32 log_length; + float score; + + enum prediction_type + { + k_prediction_none, + k_prediction_land, + k_prediction_grind + } + type; + + u32 colour; + } + predictions[22]; + u32 prediction_count; v3f handl_target, handr_target, handl, handr; @@ -184,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; @@ -231,8 +252,10 @@ 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 */ +VG_STATIC void player_init(void) /* 1 */ { player.input_js1h = vg_create_named_input( "steer-h", k_input_type_axis ); player.input_js1v = vg_create_named_input( "steer-v", k_input_type_axis ); @@ -338,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, @@ -346,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, @@ -436,6 +507,34 @@ VG_STATIC void player_update_pre(void) { struct player_phys *phys = &player.phys; + + { + v3f ra, rb, rx; + v3_copy( main_camera.pos, ra ); + v3_muladds( ra, main_camera.transform[2], -10.0f, rb ); + + float t; + if( spherecast_world( ra, rb, 0.4f, &t, rx ) != -1 ) + { + m4x3f mtx; + m3x3_identity( mtx ); + v3_lerp( ra, rb, t, mtx[3] ); + + debug_sphere( mtx, 0.4f, 0xff00ff00 ); + + v3f x1; + v3_muladds( mtx[3], rx, 0.4f, x1 ); + vg_line( mtx[3], x1, 0xffffffff ); + } + } + + + + + + + + if( player.rewinding ) return; @@ -551,14 +650,18 @@ VG_STATIC void player_update_fixed(void) /* 2 */ VG_STATIC void player_update_post(void) { - for( int i=0; icount - 1; j ++ ) - vg_line( log->positions[j], log->positions[j+1], log->colour ); + for( int j=0; jlog_length - 1; j ++ ) + vg_line( p->log[j], p->log[j+1], p->colour ); + + vg_line_cross( p->log[p->log_length-1], p->colour, 0.25f ); - vg_line_cross( log->positions[log->count-1], log->colour, 0.25f ); + v3f p1; + v3_add( p->log[p->log_length-1], p->n, p1 ); + vg_line( p->log[p->log_length-1], p1, 0xffffffff ); } if( player.is_dead ) @@ -573,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 )