some hacking to try to make immersive cutscenes better

not great so far
This commit is contained in:
Simon 2023-01-23 22:49:03 +00:00
parent 2538e8df30
commit 93f18988d4
4 changed files with 57 additions and 24 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.drbeef.jkquest"
android:versionCode="33"
android:versionName="0.5.2" android:installLocation="auto" >
android:versionCode="34"
android:versionName="0.5.3" android:installLocation="auto" >
<!-- Tell the system this app requires OpenGL ES 3.1. -->
<uses-feature android:glEsVersion="0x00030002" android:required="true"/>

View file

@ -173,13 +173,16 @@ void VR_SetHMDPosition(float x, float y, float z )
VectorSet(vr.hmdposition, x, y, z);
if (s_useScreen != VR_UseScreenLayer())
//Can be set elsewhere
vr.take_snap |= s_useScreen != VR_UseScreenLayer();
if (vr.take_snap)
{
s_useScreen = VR_UseScreenLayer();
//Record player position on transition
VectorSet(vr.hmdposition_snap, x, y, z);
VectorCopy(vr.hmdorientation, vr.hmdorientation_snap);
vr.take_snap = false;
}
VectorSubtract(vr.hmdposition, vr.hmdposition_snap, vr.hmdposition_offset);
@ -360,6 +363,12 @@ void VR_FrameSetup()
bool VR_GetVRProjection(int eye, float zNear, float zFar, float* projection)
{
//Don't use our projection if playing a cinematic and we are not immersive
if (vr.cin_camera && !vr.immersive_cinematics)
{
return false;
}
if (!vr.cgzoommode)
{
#ifdef PICO_XR
@ -385,7 +394,6 @@ bool VR_GetVRProjection(int eye, float zNear, float zFar, float* projection)
return true;
}
return false;
}

View file

@ -34,6 +34,8 @@ typedef struct {
vec3_t hmdposition_snap; // The position the HMD was in last time the menu was up (snapshot position)
vec3_t hmdposition_offset; // offset from the position the HMD was in last time the menu was up
bool take_snap;
vec3_t hmdorientation;
vec3_t hmdorientation_last; // Don't use this, it is just for calculating delta!
vec3_t hmdorientation_delta;

View file

@ -562,6 +562,7 @@ void CGCam_Track( const char *trackName, float speed, float initLerp )
else
{
client_camera.trackInitLerp = qfalse;
vr->take_snap = true;
}
/*
if ( client_camera.info_state & CAMERA_FOLLOWING )
@ -801,6 +802,12 @@ void CGCam_FollowUpdate ( void )
//So tracker doesn't move right away thinking the first angle change
//is the subject moving... FIXME: shouldn't set this until lerp done OR snapped?
client_camera.subjectSpeed = 0;
//Store initial point, let player do the follow from here themselves
if (vr->immersive_cinematics)
{
vr->take_snap = true;
}
}
//Point camera to lerp angles
@ -1078,7 +1085,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 );
}
CG_CalcFOVFromX( actualFOV_X );
float fov = vr && vr->immersive_cinematics ? vr->fov_x : actualFOV_X;
CG_CalcFOVFromX( fov );
}
else
{
@ -1089,31 +1097,45 @@ void CGCam_Update( void )
//Check for roffing angles
if ( (client_camera.info_state & CAMERA_ROFFING) && !(client_camera.info_state & CAMERA_FOLLOWING) )
{
for ( i = 0; i < 3; i++ )
if (!vr->immersive_cinematics)
{
cg.refdefViewAngles[i] = client_camera.angles[i] + ( client_camera.angles2[i] / client_camera.pan_duration ) * ( cg.time - client_camera.pan_time );
for ( i = 0; i < 3; i++ )
{
cg.refdefViewAngles[i] = client_camera.angles[i] + ( client_camera.angles2[i] / client_camera.pan_duration ) * ( cg.time - client_camera.pan_time );
}
}
else
{
VectorCopy(client_camera.angles, cg.refdefViewAngles);
}
}
else if ( client_camera.info_state & CAMERA_PANNING )
{
//Note: does not actually change the camera's angles until the pan time is done!
if ( client_camera.pan_time + client_camera.pan_duration < cg.time )
{//finished panning
for ( i = 0; i < 3; i++ )
{
client_camera.angles[i] = AngleNormalize360( ( client_camera.angles[i] + client_camera.angles2[i] ) );
}
if (!vr->immersive_cinematics)
{
//Note: does not actually change the camera's angles until the pan time is done!
if ( client_camera.pan_time + client_camera.pan_duration < cg.time )
{//finished panning
for ( i = 0; i < 3; i++ )
{
client_camera.angles[i] = AngleNormalize360( ( client_camera.angles[i] + client_camera.angles2[i] ) );
}
client_camera.info_state &= ~CAMERA_PANNING;
VectorCopy(client_camera.angles, cg.refdefViewAngles );
client_camera.info_state &= ~CAMERA_PANNING;
VectorCopy(client_camera.angles, cg.refdefViewAngles );
}
else
{//still panning
for ( i = 0; i < 3; i++ )
{
//NOTE: does not store the resultant angle in client_camera.angles until pan is done
cg.refdefViewAngles[i] = client_camera.angles[i] + ( client_camera.angles2[i] / client_camera.pan_duration ) * ( cg.time - client_camera.pan_time );
}
}
}
else
{//still panning
for ( i = 0; i < 3; i++ )
{
//NOTE: does not store the resultant angle in client_camera.angles until pan is done
cg.refdefViewAngles[i] = client_camera.angles[i] + ( client_camera.angles2[i] / client_camera.pan_duration ) * ( cg.time - client_camera.pan_time );
}
{
VectorCopy(client_camera.angles, cg.refdefViewAngles);
}
}
else
@ -1148,7 +1170,8 @@ void CGCam_Update( void )
if ( checkFollow )
{
if ( client_camera.info_state & CAMERA_FOLLOWING )
//Don't follow if immersive
if (( client_camera.info_state & CAMERA_FOLLOWING ) && !vr->immersive_cinematics )
{//This needs to be done after camera movement
CGCam_FollowUpdate();
}
@ -1176,7 +1199,7 @@ void CGCam_Update( void )
if (vr->immersive_cinematics)
{
float yaw = cg.refdefViewAngles[YAW] + vr->hmdorientation[YAW];
float yaw = cg.refdefViewAngles[YAW] + (vr->hmdorientation[YAW] - vr->hmdorientation_snap[YAW]) + vr->snapTurn;
VectorCopy(vr->hmdorientation, cg.refdefViewAngles);
cg.refdefViewAngles[YAW] = yaw;
}