mirror of
https://github.com/DrBeef/JKXR.git
synced 2024-11-28 15:02:13 +00:00
Patched immersive camera changes from JKO
This commit is contained in:
parent
773593c8bd
commit
b67d87fd5c
2 changed files with 66 additions and 10 deletions
|
@ -32,6 +32,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
bool in_camera = false;
|
bool in_camera = false;
|
||||||
bool in_misccamera = false; // if we are viewing a misc_camera
|
bool in_misccamera = false; // if we are viewing a misc_camera
|
||||||
camera_t client_camera={};
|
camera_t client_camera={};
|
||||||
|
camera_t previous_client_camera={};
|
||||||
extern qboolean player_locked;
|
extern qboolean player_locked;
|
||||||
|
|
||||||
extern gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match);
|
extern gentity_t *G_Find (gentity_t *from, int fieldofs, const char *match);
|
||||||
|
@ -93,10 +94,14 @@ void CGCam_Enable( void )
|
||||||
client_camera.FOV = CAMERA_DEFAULT_FOV;
|
client_camera.FOV = CAMERA_DEFAULT_FOV;
|
||||||
client_camera.FOV2 = CAMERA_DEFAULT_FOV;
|
client_camera.FOV2 = CAMERA_DEFAULT_FOV;
|
||||||
|
|
||||||
|
client_camera.has_stored_angles = false;
|
||||||
|
|
||||||
in_camera = true;
|
in_camera = true;
|
||||||
|
|
||||||
client_camera.next_roff_time = 0;
|
client_camera.next_roff_time = 0;
|
||||||
|
|
||||||
|
previous_client_camera = client_camera;
|
||||||
|
|
||||||
if ( &g_entities[0] && g_entities[0].client )
|
if ( &g_entities[0] && g_entities[0].client )
|
||||||
{
|
{
|
||||||
//Player zero not allowed to do anything
|
//Player zero not allowed to do anything
|
||||||
|
@ -163,7 +168,10 @@ void CGCam_Disable( void )
|
||||||
gi.cvar_set("skippingCinematic", "0");
|
gi.cvar_set("skippingCinematic", "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Now's a good time for a reset
|
||||||
|
vr->take_snap = true;
|
||||||
//we just came out of camera, so update cg.refdef.vieworg out of the camera's origin so the snapshot will know our new ori
|
//we just came out of camera, so update cg.refdef.vieworg out of the camera's origin so the snapshot will know our new ori
|
||||||
|
|
||||||
VectorCopy( g_entities[0].currentOrigin, cg.refdef.vieworg);
|
VectorCopy( g_entities[0].currentOrigin, cg.refdef.vieworg);
|
||||||
VectorCopy( g_entities[0].client->ps.viewangles, cg.refdefViewAngles );
|
VectorCopy( g_entities[0].client->ps.viewangles, cg.refdefViewAngles );
|
||||||
}
|
}
|
||||||
|
@ -1162,7 +1170,8 @@ void CGCam_Update( void )
|
||||||
}
|
}
|
||||||
client_camera.FOV = actualFOV_X;
|
client_camera.FOV = actualFOV_X;
|
||||||
}
|
}
|
||||||
CG_CalcFOVFromX( actualFOV_X );
|
float fov = vr && vr->immersive_cinematics ? vr->fov_x : actualFOV_X;
|
||||||
|
CG_CalcFOVFromX( fov );
|
||||||
}
|
}
|
||||||
else if ( client_camera.info_state & CAMERA_ZOOMING )
|
else if ( client_camera.info_state & CAMERA_ZOOMING )
|
||||||
{
|
{
|
||||||
|
@ -1177,7 +1186,8 @@ void CGCam_Update( void )
|
||||||
{
|
{
|
||||||
actualFOV_X = client_camera.FOV + (( ( client_camera.FOV2 - client_camera.FOV ) ) / client_camera.FOV_duration ) * ( cg.time - client_camera.FOV_time );
|
actualFOV_X = client_camera.FOV + (( ( client_camera.FOV2 - client_camera.FOV ) ) / client_camera.FOV_duration ) * ( cg.time - client_camera.FOV_time );
|
||||||
}
|
}
|
||||||
CG_CalcFOVFromX( actualFOV_X );
|
float fov = vr && vr->immersive_cinematics ? vr->fov_x : actualFOV_X;
|
||||||
|
CG_CalcFOVFromX( fov );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1278,11 +1288,16 @@ void CGCam_Update( void )
|
||||||
|
|
||||||
if ( checkFollow )
|
if ( checkFollow )
|
||||||
{
|
{
|
||||||
|
//Don't follow if immersive
|
||||||
if ( client_camera.info_state & CAMERA_FOLLOWING )
|
if ( client_camera.info_state & CAMERA_FOLLOWING )
|
||||||
{//This needs to be done after camera movement
|
{//This needs to be done after camera movement
|
||||||
CGCam_FollowUpdate();
|
CGCam_FollowUpdate();
|
||||||
}
|
}
|
||||||
VectorCopy(client_camera.angles, cg.refdefViewAngles );
|
|
||||||
|
if (!vr->immersive_cinematics)
|
||||||
|
{
|
||||||
|
VectorCopy(client_camera.angles, cg.refdefViewAngles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( checkTrack )
|
if ( checkTrack )
|
||||||
|
@ -1295,6 +1310,50 @@ void CGCam_Update( void )
|
||||||
VectorCopy( client_camera.origin, cg.refdef.vieworg );
|
VectorCopy( client_camera.origin, cg.refdef.vieworg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (vr->immersive_cinematics)
|
||||||
|
{
|
||||||
|
//If no stored angles yet, store them
|
||||||
|
if (!client_camera.has_stored_angles)
|
||||||
|
{
|
||||||
|
client_camera.has_stored_angles = true;
|
||||||
|
vr->take_snap = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if camera state has changed, store the angles and reset user's snap orientation
|
||||||
|
if (((client_camera.info_state & CAMERA_FOLLOWING) != (previous_client_camera.info_state & CAMERA_FOLLOWING)) ||
|
||||||
|
((client_camera.info_state & CAMERA_ROFFING) != (previous_client_camera.info_state & CAMERA_ROFFING)) ||
|
||||||
|
((client_camera.info_state & CAMERA_MOVING) != (previous_client_camera.info_state & CAMERA_MOVING)) ||
|
||||||
|
((client_camera.info_state & CAMERA_PANNING) != (previous_client_camera.info_state & CAMERA_PANNING)))
|
||||||
|
{
|
||||||
|
vr->take_snap = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//If the camera has changed position (by over half an in-game metre), but is not in moving mode (last frame)
|
||||||
|
//then it is a keyframe that requires a new snap
|
||||||
|
if (!(previous_client_camera.info_state & CAMERA_MOVING))
|
||||||
|
{
|
||||||
|
vec3_t delta;
|
||||||
|
VectorSubtract(client_camera.origin, previous_client_camera.origin, delta);
|
||||||
|
if (VectorLength(delta) > (0.5f * cg_worldScale.value))
|
||||||
|
{
|
||||||
|
vr->take_snap = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vr->take_snap)
|
||||||
|
{
|
||||||
|
VectorCopy(client_camera.angles, client_camera.stored_angles);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Copy stored YAW angle to refdef whether it has changed or not, use pitch/roll direct from the hmd
|
||||||
|
float yaw = client_camera.stored_angles[YAW] + (vr->hmdorientation[YAW] - vr->hmdorientation_snap[YAW]) + vr->snapTurn;
|
||||||
|
VectorCopy(vr->hmdorientation, cg.refdefViewAngles);
|
||||||
|
cg.refdefViewAngles[YAW] = yaw;
|
||||||
|
|
||||||
|
//store previous state
|
||||||
|
previous_client_camera = client_camera;
|
||||||
|
}
|
||||||
|
|
||||||
//Bar fading
|
//Bar fading
|
||||||
if ( client_camera.info_state & CAMERA_BAR_FADING )
|
if ( client_camera.info_state & CAMERA_BAR_FADING )
|
||||||
{
|
{
|
||||||
|
@ -1304,13 +1363,6 @@ void CGCam_Update( void )
|
||||||
//Normal fading - separate call because can finish after camera is disabled
|
//Normal fading - separate call because can finish after camera is disabled
|
||||||
CGCam_UpdateFade();
|
CGCam_UpdateFade();
|
||||||
|
|
||||||
if (vr->immersive_cinematics)
|
|
||||||
{
|
|
||||||
float yaw = cg.refdefViewAngles[YAW] + vr->hmdorientation[YAW];
|
|
||||||
VectorCopy(vr->hmdorientation, cg.refdefViewAngles);
|
|
||||||
cg.refdefViewAngles[YAW] = yaw;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Update shaking if there's any
|
//Update shaking if there's any
|
||||||
//CGCam_UpdateSmooth( cg.refdef.vieworg, cg.refdefViewAngles );
|
//CGCam_UpdateSmooth( cg.refdef.vieworg, cg.refdefViewAngles );
|
||||||
CGCam_UpdateShake( cg.refdef.vieworg, cg.refdefViewAngles );
|
CGCam_UpdateShake( cg.refdef.vieworg, cg.refdefViewAngles );
|
||||||
|
|
|
@ -58,6 +58,10 @@ typedef struct camera_s
|
||||||
vec3_t origin2;
|
vec3_t origin2;
|
||||||
vec3_t angles2;
|
vec3_t angles2;
|
||||||
|
|
||||||
|
//Stored angles/origin used in immersive cinematic mode
|
||||||
|
bool has_stored_angles;
|
||||||
|
vec3_t stored_angles;
|
||||||
|
|
||||||
//Movement information
|
//Movement information
|
||||||
float move_duration;
|
float move_duration;
|
||||||
float move_time;
|
float move_time;
|
||||||
|
|
Loading…
Reference in a new issue