X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_common.c;h=5236ee5b9227c0358d0966f31e394236baa2725c;hb=refs%2Fheads%2Frigidbody;hp=d1e8fc604aaa067766690eba1d6b5b59abff1bcb;hpb=d171c9ad5de05c9ac8563fcf9f23760b93fb50f8;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_common.c b/player_common.c index d1e8fc6..5236ee5 100644 --- a/player_common.c +++ b/player_common.c @@ -22,25 +22,41 @@ 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; } - 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 ); - skeleton_apply_transform( &localplayer.skeleton, 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( &skaterift.replay, 1 ); + localplayer.deferred_frame_record = 1; + + 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; } } } @@ -53,6 +69,12 @@ static void player__cam_iterate(void){ v3_copy( (v3f){0.0f,0.0f,0.0f}, cc->fpv_offset ); v3_copy( (v3f){0.0f,1.4f,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 ); v3_copy( (v3f){0.0f,0.0f,0.0f}, cc->fpv_offset ); @@ -67,6 +89,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, @@ -178,12 +210,15 @@ 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 );