X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_common.c;h=6ab378d6039d8317ea3cbdc774a7c9bb168f4155;hb=8d336ea2cde7c596296dbaf0d3ce27a82c6c6cf0;hp=8ea57a4380021585af39ea05e0ad3868ed421f20;hpb=874c9d7e6ee2d826f9eb34518e8163283439c38e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_common.c b/player_common.c index 8ea57a4..6ab378d 100644 --- a/player_common.c +++ b/player_common.c @@ -1,19 +1,18 @@ -#ifndef PLAYER_COMMON_C -#define PLAYER_COMMON_C - #include "ent_skateshop.h" #include "player.h" #include "input.h" #include "menu.h" #include "vg/vg_perlin.h" -static float player_get_heading_yaw(void){ +float player_get_heading_yaw(void) +{ v3f xz; q_mulv( localplayer.rb.q, (v3f){ 0.0f,0.0f,1.0f }, xz ); return atan2f( xz[0], xz[2] ); } -static void player_camera_portal_correction(void){ +static void player_camera_portal_correction(void) +{ if( localplayer.gate_waiting ){ /* construct plane equation for reciever gate */ v4f plane; @@ -22,37 +21,60 @@ static void player_camera_portal_correction(void){ f32 pol = v3_dot( localplayer.cam.pos, plane ) - plane[3]; - /* check camera polarity */ - if( (pol < 0.0f) || (pol > 5.0f) ) { + int cleared = (pol < 0.0f) || (pol > 5.0f); + + if( cleared ){ vg_success( "Plane cleared\n" ); - player_apply_transport_to_cam( localplayer.gate_waiting->transport ); - localplayer.gate_waiting = NULL; - localplayer.viewable_world = world_current_instance(); } - else{ - /* de-transform camera and player back */ - m4x3f inverse; - m4x3_invert_affine( localplayer.gate_waiting->transport, inverse ); - m4x3_mulv( inverse, localplayer.cam.pos, localplayer.cam.pos ); - v3f v0; - v3_angles_vector( localplayer.cam.angles, v0 ); - m3x3_mulv( inverse, v0, v0 ); - v3_angles( v0, localplayer.cam.angles ); + m4x3f inverse; + m4x3_invert_affine( localplayer.gate_waiting->transport, inverse ); + + /* de-transform camera and player back */ + v3f v0; + m4x3_mulv( inverse, localplayer.cam.pos, localplayer.cam.pos ); + v3_angles_vector( localplayer.cam.angles, v0 ); + m3x3_mulv( inverse, v0, v0 ); + v3_angles( v0, localplayer.cam.angles ); + + skeleton_apply_transform( &localplayer.skeleton, inverse, + localplayer.final_mtx ); + + /* record and re-put things again */ + if( cleared ) + { + skaterift_record_frame( &player_replay.local, 1 ); + localplayer.deferred_frame_record = 1; - skeleton_apply_transform( &localplayer.skeleton, inverse, + skeleton_apply_transform( &localplayer.skeleton, + localplayer.gate_waiting->transport, localplayer.final_mtx ); + + m4x3_mulv( localplayer.gate_waiting->transport, + localplayer.cam.pos, localplayer.cam.pos ); + v3_angles_vector( localplayer.cam.angles, v0 ); + m3x3_mulv( localplayer.gate_waiting->transport, v0, v0 ); + v3_angles( v0, localplayer.cam.angles ); + player_apply_transport_to_cam( localplayer.gate_waiting->transport ); + localplayer.gate_waiting = NULL; } } } -static void player__cam_iterate(void){ +void player__cam_iterate(void) +{ struct player_cam_controller *cc = &localplayer.cam_control; if( localplayer.subsystem == k_player_subsystem_walk ){ v3_copy( (v3f){-0.1f,1.8f,0.0f}, cc->fpv_viewpoint ); v3_copy( (v3f){0.0f,0.0f,0.0f}, cc->fpv_offset ); - v3_copy( (v3f){0.0f,1.4f,0.0f}, cc->tpv_offset ); + v3_copy( (v3f){0.0f,1.8f,0.0f}, cc->tpv_offset ); + } + else if( localplayer.subsystem == k_player_subsystem_glide ){ + v3_copy( (v3f){-0.15f,1.75f,0.0f}, cc->fpv_viewpoint ); + v3_copy( (v3f){0.0f,0.0f,0.0f}, cc->fpv_offset ); + v3_copy( (v3f){0.0f,-1.0f,0.0f}, cc->tpv_offset ); + v3_add( cc->tpv_offset_extra, cc->tpv_offset, cc->tpv_offset ); } else{ v3_copy( (v3f){-0.15f,1.75f,0.0f}, cc->fpv_viewpoint ); @@ -68,6 +90,16 @@ static void player__cam_iterate(void){ /* lerping */ + if( localplayer.cam_dist_smooth == 0.0f ){ + localplayer.cam_dist_smooth = localplayer.cam_dist; + } + else { + localplayer.cam_dist_smooth = vg_lerpf( + localplayer.cam_dist_smooth, + localplayer.cam_dist, + vg.time_frame_delta * 8.0f ); + } + localplayer.cam_velocity_influence_smooth = vg_lerpf( localplayer.cam_velocity_influence_smooth, localplayer.cam_velocity_influence, @@ -133,7 +165,7 @@ static void player__cam_iterate(void){ inf_tpv = localplayer.cam_velocity_influence_smooth * (1.0f-cc->camera_type_blend); - camera_lerp_angles( localplayer.angles, velocity_angles, + vg_camera_lerp_angles( localplayer.angles, velocity_angles, inf_fpv, localplayer.angles ); @@ -165,7 +197,7 @@ static void player__cam_iterate(void){ float ya = atan2f( -cc->cam_velocity_smooth[1], 30.0f ); follow_angles[1] = 0.3f + ya; - camera_lerp_angles( localplayer.angles, follow_angles, + vg_camera_lerp_angles( localplayer.angles, follow_angles, inf_tpv, localplayer.angles ); @@ -179,16 +211,31 @@ static void player__cam_iterate(void){ /* now move into world */ v3f tpv_pos, tpv_offset, tpv_origin; + /* TODO: whats up with CC and not CC but both sets of variables are doing + * the same ideas just saved in different places? + */ /* origin */ q_mulv( pq, cc->tpv_offset_smooth, tpv_origin ); v3_add( tpv_origin, cc->tpv_lpf, tpv_origin ); /* offset */ - v3_muls( camera_follow_dir, 1.8f, tpv_offset ); + v3_muls( camera_follow_dir, localplayer.cam_dist_smooth, tpv_offset ); v3_muladds( tpv_offset, cc->cam_velocity_smooth, -0.025f, tpv_offset ); v3_add( tpv_origin, tpv_offset, tpv_pos ); +#if 0 + if( localplayer.subsystem == k_player_subsystem_walk ) + { + v3f fwd, right; + v3_angles_vector( localplayer.angles, fwd ); + v3_cross( fwd, (v3f){0,1.001f,0}, right ); + right[1] = 0.0f; + v3_normalize( right ); + v3_muladds( tpv_pos, right, 0.5f, tpv_pos ); + } +#endif + /* * Blend cameras */ @@ -201,8 +248,8 @@ static void player__cam_iterate(void){ localplayer.cam_trackshake += speed*k_cam_shake_trackspeed*vg.time_frame_delta; - v2f rnd = {perlin1d( localplayer.cam_trackshake, 1.0f, 4, 20 ), - perlin1d( localplayer.cam_trackshake, 1.0f, 4, 63 ) }; + v2f rnd = {vg_perlin_fract_1d( localplayer.cam_trackshake, 1.0f, 4, 20 ), + vg_perlin_fract_1d( localplayer.cam_trackshake, 1.0f, 4, 63 ) }; v2_muladds( localplayer.cam.angles, rnd, strength, localplayer.cam.angles ); v3f Fd, Fs, F; @@ -216,40 +263,12 @@ static void player__cam_iterate(void){ v3_add( localplayer.cam_land_punch, localplayer.cam.pos, localplayer.cam.pos ); - if( k_cinema >= 0.0001f ){ - ent_camera *cam = NULL; - f32 min_dist = k_cinema; - - world_instance *world = localplayer.viewable_world; - for( u32 i=0; ient_camera); i++ ){ - ent_camera *c = mdl_arritm(&world->ent_camera,i); - - f32 dist = v3_dist( c->transform.co, localplayer.rb.co ); - - if( dist < min_dist ){ - min_dist = dist; - cam = c; - } - } - - if( cam ){ - localplayer.cam.fov = cam->fov; - v3_copy( cam->transform.co, localplayer.cam.pos ); - v3f v0; - if( k_cinema_fixed ) - mdl_transform_vector( &cam->transform, (v3f){0.0f,-1.0f,0.0f}, v0 ); - else - v3_sub( localplayer.rb.co, cam->transform.co, v0 ); - - v3_angles( v0, localplayer.cam.angles ); - } - } - /* portal transitions */ player_camera_portal_correction(); } -static void player_look( v3f angles, float speed ){ +void player_look( v3f angles, float speed ) +{ if( vg_ui.wants_mouse ) return; angles[2] = 0.0f; @@ -269,5 +288,3 @@ static void player_look( v3f angles, float speed ){ angles[1] += input_y * speed; angles[1] = vg_clampf( angles[1], -VG_PIf*0.5f, VG_PIf*0.5f ); } - -#endif /* PLAYER_COMMON_C */