X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player.h;h=0e92f3aae5d6f5038bcd7703adb0c046c731844a;hb=2a238d32da833812e837cf38e16a7685c98db5c3;hp=d3038915c0b09b6393c66c0f0dbcdf39bc18f2de;hpb=2a6a779a1ad3f1a781e2437732bc62055096439e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player.h b/player.h index d303891..0e92f3a 100644 --- a/player.h +++ b/player.h @@ -2,11 +2,16 @@ * 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 + */ + #ifndef PLAYER_H #define PLAYER_H #define PLAYER_REWIND_FRAMES 60*4 +#include "conf.h" #include "audio.h" #include "common.h" #include "world.h" @@ -31,7 +36,7 @@ VG_STATIC float k_steer_air = 3.6f, k_steer_air_lerp = 0.3f, k_pump_force = 0.0f, - k_downforce = 5.0f, + k_downforce = 8.0f, k_walk_downforce = 8.0f, k_jump_charge_speed = (1.0f/1.0f), k_jump_force = 5.0f, @@ -40,10 +45,10 @@ VG_STATIC float k_walk_accel = 150.0f, k_walk_friction = 8.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; /* * ----------------------------------------------------------------------------- @@ -64,14 +69,14 @@ VG_STATIC struct gplayer v3f a, v_last, m, bob, vl; /* Utility */ - float vswitch, slip, slip_last, - reverse; - - float grab, jump, pushing, push_time; + float vswitch, slip, slip_last, reverse; + float grab, jump, pushing, push_time, rise; v2f grab_mouse_delta; + int lift_frames; + double start_push; - int in_air, on_board, jump_charge, jump_dir; + int in_air, on_board, jump_charge, jump_dir, grind; m3x3f vr,vr_pstep; } @@ -84,10 +89,25 @@ VG_STATIC struct gplayer int is_dead, death_tick_allowance, rewinding; int rewind_sound_wait; - v3f land_target; - v3f land_target_log[22]; - u32 land_target_colours[22]; - int land_log_count; + struct land_prediction + { + 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; @@ -138,7 +158,8 @@ VG_STATIC struct gplayer walk_timer, fjump, fonboard, - frun; + frun, + fgrind; float walk; int step_phase; @@ -173,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; @@ -220,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 ); @@ -281,20 +315,12 @@ VG_STATIC void player_init(void) /* 1 }; for( int i=0; ion_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 { @@ -553,9 +650,19 @@ VG_STATIC void player_update_fixed(void) /* 2 */ VG_STATIC void player_update_post(void) { - for( int i=0; ilog_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 ); + + 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 ) { @@ -569,16 +676,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 ) { @@ -669,8 +780,6 @@ VG_STATIC void player_update_post(void) player.rewind_sound_wait = 0; } } - - } int i0 = floorf( player.rewind_time ), @@ -689,17 +798,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(); @@ -707,8 +818,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, @@ -736,7 +847,6 @@ VG_STATIC void player_kill(void) { player.is_dead = 1; player_ragdoll_copy_model( player.phys.rb.v ); - world_routes_clear(); } }