X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.h;h=119b3f71348fde480427b721ec77860be2d0b6d2;hb=d45f2b7d71311ce5ce8cd3496844b4ec7d2f46ac;hp=7b5eeaa882158316eb7c9befe4f91700679cdb8a;hpb=75703291fbf045008a3b1ebb20fc46a2617b6b3b;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.h b/player.h index 7b5eeaa..119b3f7 100644 --- a/player.h +++ b/player.h @@ -1,9 +1,5 @@ /* - * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved - */ - -/* - * TODO: Tilt camera down to face borde when its behind you or out of vision + * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved */ #ifndef PLAYER_H @@ -11,6 +7,7 @@ #define PLAYER_REWIND_FRAMES 60*4 +#include "conf.h" #include "audio.h" #include "common.h" #include "world.h" @@ -20,12 +17,10 @@ VG_STATIC float k_walkspeed = 12.0f, k_air_accelerate = 20.0f, - k_runspeed = 20.0f, k_board_radius = 0.3f, k_board_length = 0.45f, k_board_allowance = 0.04f, - //k_friction_lat = 8.8f, k_friction_lat = 12.0f, k_friction_resistance = 0.01f, k_max_push_speed = 16.0f, @@ -35,19 +30,32 @@ VG_STATIC float k_steer_air = 3.6f, k_steer_air_lerp = 0.3f, k_pump_force = 0.0f, - k_downforce = 8.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, k_look_speed = 2.0f, k_walk_accel = 150.0f, - k_walk_friction = 8.0f; + k_walk_friction = 8.0f, + + k_cog_spring = 0.2f, + k_cog_damp = 0.02f, + k_cog_mass_ratio = 0.9f, + + k_mmthrow_scale = 6.0f, + k_mmcollect_lat = 2.0f, + k_mmcollect_vert = 0.0f, + k_mmdecay = 12.0f, + k_spring_angular = 1.0f, + + k_spring_force = 15.0f, + k_spring_dampener = 5.0f; -VG_STATIC int cl_playermdl_id = 0; 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,10 +77,13 @@ 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; + v3f throw_v; + v3f cog, + cog_v; + int lift_frames; double start_push; @@ -83,22 +94,35 @@ VG_STATIC struct gplayer phys, phys_gate_frame; + float normal_pressure; + v3f debug_mmcollect_lat, + debug_mmcollect_vert; + m4x3f visual_transform, inv_visual_transform; 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; @@ -152,6 +176,9 @@ VG_STATIC struct gplayer frun, fgrind; + v3f board_offset; + v4f board_rotation; + float walk; int step_phase; enum mdl_surface_prop surface_prop; @@ -178,24 +205,38 @@ VG_STATIC struct gplayer id_ik_hand_r, id_ik_elbow_l, id_ik_elbow_r, - id_head; + id_head, + id_ik_foot_l, + id_ik_foot_r, + id_board; v3f cam_pos; 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; @@ -232,8 +273,11 @@ 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 reset_player_poll( 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 ); @@ -299,76 +343,58 @@ VG_STATIC void player_init(void) /* 1 rb_init( &player.collide_front ); rb_init( &player.collide_back ); - vg_convar_push( (struct vg_convar){ - .name = "cl_playermdl_id", - .data = &cl_playermdl_id, - .data_type = k_convar_dtype_i32, - .opt_i32 = { .min=0, .max=2, .clamp=1 }, - .persistent = 1 - }); - - vg_convar_push( (struct vg_convar){ - .name = "gwalk_speed", - .data = &k_walkspeed, - .data_type = k_convar_dtype_f32, - .opt_f32 = { .clamp = 0 }, - .persistent = 0 - }); - - vg_convar_push( (struct vg_convar){ - .name = "air_accelerate", - .data = &k_air_accelerate, - .data_type = k_convar_dtype_f32, - .opt_f32 = { .clamp = 0 }, - .persistent = 0 - }); - - vg_convar_push( (struct vg_convar){ - .name = "run_speed", - .data = &k_runspeed, - .data_type = k_convar_dtype_f32, - .opt_f32 = { .clamp = 0 }, - .persistent = 1 - }); - - vg_convar_push( (struct vg_convar){ - .name = "walk_accel", - .data = &k_walk_accel, - .data_type = k_convar_dtype_f32, - .opt_f32 = { .clamp = 0 }, - .persistent = 1 - }); - - vg_convar_push( (struct vg_convar){ - .name = "fc", - .data = &freecam, - .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, - .data_type = k_convar_dtype_f32, - .opt_f32 = { .clamp = 0 }, - .persistent = 1 - }); + VG_VAR_F32( k_walkspeed ); + VG_VAR_F32( k_air_accelerate ); + VG_VAR_F32( k_runspeed ); + VG_VAR_F32( k_walk_accel ); + + VG_VAR_I32( freecam ); + VG_VAR_I32( cl_thirdperson ); + VG_VAR_F32_PERSISTENT( fc_speed ); + + /* TODO: NOT PERSISTENT */ + VG_VAR_F32( k_ragdoll_limit_scale ); + VG_VAR_I32( k_ragdoll_div ); + VG_VAR_I32( k_ragdoll_debug_collider ); + VG_VAR_I32( k_ragdoll_debug_constraints ); + + VG_VAR_F32( k_friction_lat ); + + VG_VAR_F32( k_cog_spring ); + VG_VAR_F32( k_cog_damp ); + + VG_VAR_F32( k_cog_mass_ratio ); + VG_VAR_F32( k_downforce ); + + VG_VAR_F32( k_spring_force ); + VG_VAR_F32( k_spring_dampener ); + VG_VAR_F32( k_spring_angular ); + + VG_VAR_F32( k_mmthrow_scale ); + VG_VAR_F32( k_mmcollect_lat ); + VG_VAR_F32( k_mmcollect_vert ); + VG_VAR_F32( k_mmdecay ); vg_function_push( (struct vg_cmd){ .name = "reset", - .function = reset_player + .function = reset_player, + .poll_suggest = reset_player_poll + }); + + 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, sizeof(struct rewind_frame) * PLAYER_REWIND_FRAMES ); player_model_init(); - - /* controls */ - } VG_STATIC void player_save_rewind_frame(void) @@ -445,64 +471,96 @@ VG_STATIC void player_update_pre(void) { struct player_phys *phys = &player.phys; - if( player.rewinding ) + { - return; + 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 ); + } } + + vg_line_pt3( phys->cog, 0.10f, 0xffffffff ); + vg_line_pt3( phys->cog, 0.09f, 0xffffffff ); + vg_line_pt3( phys->cog, 0.08f, 0xffffffff ); + vg_line( phys->cog, phys->rb.co, 0xff000000 ); + + v3f spring_end; + v3f throw_end, p0, p1; + v3_muladds( phys->rb.co, phys->rb.up, 1.0f, spring_end ); + v3_muladds( spring_end, phys->throw_v, 1.0f, throw_end ); + v3_muladds( spring_end, player.debug_mmcollect_lat, 1.0f, p0 ); + v3_muladds( spring_end, player.debug_mmcollect_vert, 1.0f, p1 ); + vg_line( spring_end, throw_end, VG__RED ); + vg_line( spring_end, p0, VG__GREEN ); + vg_line( spring_end, p1, VG__BLUE ); + + if( player.rewinding ) + return; + if( vg_input_button_down( player.input_reset ) && !menu_enabled() ) { - if( player.is_dead ) + double delta = world.time - world.last_use; + + if( (delta <= RESET_MAX_TIME) && (world.last_use != 0.0) ) { - reset_player( 0, NULL ); + player.rewinding = 1; + player.rewind_sound_wait = 1; + player.rewind_time = (float)player.rewind_length - 0.0001f; + player_save_rewind_frame(); audio_lock(); - audio_play_oneshot( &audio_ui[0], 1.0f ); + audio_play_oneshot( &audio_rewind[0], 1.0f ); audio_unlock(); - } - else - { - double delta = world.time - world.last_use; - - if( (delta <= RESET_MAX_TIME) && (world.last_use != 0.0) ) - { - player.rewinding = 1; - player.rewind_sound_wait = 1; - player.rewind_time = (float)player.rewind_length - 0.0001f; - player_save_rewind_frame(); - audio_lock(); - audio_play_oneshot( &audio_rewind[0], 1.0f ); - audio_unlock(); - /* based on analytical testing. DONT CHANGE! - * - * time taken: y = (x^(4/5)) * 74.5 - * inverse : x = (2/149)^(4/5) * y^(4/5) - */ + /* based on analytical testing. DONT CHANGE! + * + * time taken: y = (x^(4/5)) * 74.5 + * inverse : x = (2/149)^(4/5) * y^(4/5) + */ - float constant = powf( 2.0f/149.0f, 4.0f/5.0f ), - curve = powf( player.rewind_total_length, 4.0f/5.0f ); - - player.rewind_predicted_time = constant * curve; - player.diag_rewind_start = vg.time; - player.diag_rewind_time = player.rewind_time; + float constant = powf( 2.0f/149.0f, 4.0f/5.0f ), + curve = powf( player.rewind_total_length, 4.0f/5.0f ); + + player.rewind_predicted_time = constant * curve; + player.diag_rewind_start = vg.time; + player.diag_rewind_time = player.rewind_time; - player.is_dead = 0; - player.death_tick_allowance = 30; - player_restore_frame(); + player.is_dead = 0; + player.death_tick_allowance = 30; + player_restore_frame(); - if( !phys->on_board ) - { - player.angles[0] = atan2f( -phys->rb.forward[2], - -phys->rb.forward[0] ); - } + if( !phys->on_board ) + { + player.angles[0] = atan2f( -phys->rb.forward[2], + -phys->rb.forward[0] ); + } - player.mdl.shoes[0] = 1; - player.mdl.shoes[1] = 1; + player.mdl.shoes[0] = 1; + player.mdl.shoes[1] = 1; - world_routes_notify_reset(); + world_routes_notify_reset(); - /* apply 1 frame of movement */ - player_do_motion(); + /* apply 1 frame of movement */ + player_do_motion(); + } + else + { + if( player.is_dead ) + { + reset_player( 0, NULL ); } else { @@ -565,14 +623,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 ) @@ -587,16 +649,20 @@ 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 ) player_freecam(); - /* CAMERA POSITIONING: LAYER 0 */ - v2_copy( player.angles, camera_angles ); - v3_copy( player.camera_pos, camera_pos ); + v2_copy( player.angles, main_camera.angles ); + v3_copy( player.camera_pos, main_camera.pos ); if( player.rewinding ) { @@ -687,8 +753,6 @@ VG_STATIC void player_update_post(void) player.rewind_sound_wait = 0; } } - - } int i0 = floorf( player.rewind_time ), @@ -707,17 +771,19 @@ VG_STATIC void player_update_post(void) float blend = (4.0f-player.rewind_time) * 0.25f, c = vg_clampf( blend, 0.0f, 1.0f ); - camera_angles[0] = vg_alerpf(override_angles[0], player.angles[0], c); - camera_angles[1] = vg_lerpf (override_angles[1], player.angles[1], c); - v3_lerp( override_pos, player.camera_pos, c, camera_pos ); + main_camera.angles[0] = + vg_alerpf(override_angles[0], player.angles[0], c); + main_camera.angles[1] = + vg_lerpf (override_angles[1], player.angles[1], c); + v3_lerp( override_pos, player.camera_pos, c, main_camera.pos ); } } - camera_update(); + camera_update_transform( &main_camera ); player_audio(); } -VG_STATIC void draw_player( m4x3f cam ) +VG_STATIC void draw_player( camera *cam ) { if( player.is_dead ) player_model_copy_ragdoll(); @@ -725,8 +791,8 @@ VG_STATIC void draw_player( m4x3f cam ) shader_viewchar_use(); vg_tex2d_bind( &tex_characters, 0 ); shader_viewchar_uTexMain( 0 ); - shader_viewchar_uCamera( cam[3] ); - shader_viewchar_uPv( vg.pv ); + shader_viewchar_uCamera( cam->transform[3] ); + shader_viewchar_uPv( cam->mtx.pv ); shader_link_standard_ub( _shader_viewchar.id, 2 ); glUniformMatrix4x3fv( _uniform_viewchar_uTransforms, player.mdl.sk.bone_count, @@ -754,7 +820,6 @@ VG_STATIC void player_kill(void) { player.is_dead = 1; player_ragdoll_copy_model( player.phys.rb.v ); - world_routes_clear(); } }