mirror of
https://github.com/DrBeef/Doom3Quest.git
synced 2025-02-24 12:51:18 +00:00
Bringing all the changes done (mostly by baggyg) in the OVRPassToVR branch bringing over the major FP related changes to master. Please refer to that branch for the individual changes that have all been brought over in this single commit. Co-Authored-By: Grant Bagwell <general@grantbagwell.co.uk>
605 lines
15 KiB
C++
605 lines
15 KiB
C++
/*
|
|
===========================================================================
|
|
|
|
Doom 3 BFG Edition GPL Source Code
|
|
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
|
|
|
|
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
===========================================================================
|
|
*/
|
|
|
|
//#include "precompiled.h"
|
|
//#pragma hdrstop
|
|
|
|
//#include "..\LibOVR\Include\OVR_CAPI.h"
|
|
//#include "..\LibOVR\Include\OVR_CAPI_GL.h"
|
|
|
|
|
|
#include "vr_hmd.h"
|
|
#include "../renderer/Image.h"
|
|
#include "../idlib/math/Quat.h"
|
|
#include "../idlib/math/Matrix.h"
|
|
#include "../idlib/Str.h"
|
|
#include "../idlib/math/Angles.h"
|
|
#include "../framework/CVarSystem.h"
|
|
#include "../../../Doom3Quest/VrClientInfo.h"
|
|
//#include "Voice.h"
|
|
//#include "FlickSync.h"
|
|
//#include "../renderer/Framebuffer.h"
|
|
//#include "..\LibOVR\Include\OVR_CAPI_Audio.h"
|
|
|
|
//#include "../libs/openvr/headers/openvr.h"
|
|
|
|
|
|
#ifndef __VR_H__
|
|
#define __VR_H__
|
|
|
|
// hand == 0 == right, 1 == left
|
|
#define HAND_RIGHT 0
|
|
#define HAND_LEFT 1
|
|
|
|
#define POSE_FINGER 8
|
|
#define POSE_INDEX 1
|
|
#define POSE_THUMB 2
|
|
#define POSE_GRIP 4
|
|
|
|
typedef enum
|
|
{
|
|
MOTION_NONE,
|
|
MOTION_STEAMVR,
|
|
MOTION_OCULUS
|
|
} vr_motionControl_t;
|
|
|
|
typedef enum
|
|
{
|
|
VR_AA_NONE,
|
|
VR_AA_MSAA,
|
|
VR_AA_FXAA,
|
|
NUM_VR_AA
|
|
} vr_aa_t;
|
|
|
|
typedef enum
|
|
{
|
|
VR_HUD_NONE,
|
|
VR_HUD_FULL,
|
|
VR_HUD_LOOK_DOWN,
|
|
} vr_hud_t;
|
|
|
|
typedef enum
|
|
{
|
|
RENDERING_NORMAL,
|
|
RENDERING_PDA,
|
|
RENDERING_HUD
|
|
} vr_swf_render_t;
|
|
|
|
typedef enum
|
|
{
|
|
FLASHLIGHT_BODY,
|
|
FLASHLIGHT_HEAD,
|
|
FLASHLIGHT_GUN,
|
|
FLASHLIGHT_HAND,
|
|
FLASHLIGHT_PISTOL, // like in RoE for XBox, except you can turn the light on and off
|
|
FLASHLIGHT_INVENTORY, // flashlight is put away (or holstered)
|
|
FLASHLIGHT_NONE, // not carrying a flashlight
|
|
FLASHLIGHT_MAX,
|
|
} vr_flashlight_mode_t;
|
|
|
|
/// Position and orientation together.
|
|
typedef struct idPosef_ {
|
|
idQuat Orientation;
|
|
idVec3 Position;
|
|
} idPosef;
|
|
|
|
typedef struct idPoseStatef_ {
|
|
idPosef ThePose; ///< Position and orientation.
|
|
idVec3 AngularVelocity; ///< Angular velocity in radians per second.
|
|
idVec3 LinearVelocity; ///< Velocity in meters per second.
|
|
idVec3 AngularAcceleration; ///< Angular acceleration in radians per second per second.
|
|
idVec3 LinearAcceleration; ///< Acceleration in meters per second per second.
|
|
double TimeInSeconds; ///< Absolute time that this pose refers to. \see ovr_GetTimeInSeconds
|
|
} idPoseStatef;
|
|
|
|
void SwapWeaponHand();
|
|
|
|
class idClipModel;
|
|
|
|
class iVr
|
|
{
|
|
public:
|
|
|
|
iVr();
|
|
bool initialResetPerformed;
|
|
|
|
int lastFrame;
|
|
|
|
int curtime;
|
|
int sys_timeBase;
|
|
int Sys_Milliseconds();
|
|
|
|
vrClientInfo * pVRClientInfo;
|
|
bool OculusInit( void );
|
|
bool OpenVRInit( void );
|
|
void HMDInit( void );
|
|
void HMDShutdown( void );
|
|
void HMDInitializeDistortion( void );
|
|
void HMDGetOrientation( idAngles &hmdAngles, idVec3 &headPositionDelta, idVec3 &bodyPositionDelta, idVec3 &absolutePosition, bool resetTrackingOffset );
|
|
void HMDGetOrientationAbsolute( idAngles &hmdAngles, idVec3 &positoin );
|
|
void HMDRender( idImage *leftCurrent, idImage *rightCurrent );
|
|
bool HMDRenderQuad( idImage *leftCurrent, idImage *rightCurrent );
|
|
void HMDTrackStatic( bool is3D );
|
|
void HUDRender( idImage *image0, idImage *image1 );
|
|
void HMDResetTrackingOriginOffset();
|
|
|
|
void FrameStart( void );
|
|
|
|
void OpenVrGetRight( idVec3 &position, idQuat &rotation );
|
|
void OpenVrGetLeft( idVec3 &position, idQuat &rotation );
|
|
|
|
void MotionControlSetRotationOffset();
|
|
void MotionControlSetOffset();
|
|
void MotionControlGetHand( int hand, idVec3 &position, idQuat &rotation );
|
|
void MotionControlGetLeftHand( idVec3 &position, idQuat &rotation );
|
|
void MotionControlGetRightHand( idVec3 &position, idQuat &rotation );
|
|
//void MotionControlGetOpenVrController( vr::TrackedDeviceIndex_t deviceNum, idVec3 &position, idQuat &rotation );
|
|
void MotionControlGetTouchController( int hand, idVec3 &position, idQuat &rotation );
|
|
void MotionControllerSetHapticOculus( float low, float hi );
|
|
void MotionControllerSetHapticOpenVR( int hand, unsigned short value );
|
|
|
|
//void MSAAResolve( void );
|
|
//void FXAAResolve( idImage * leftCurrent, idImage * rightCurrent );
|
|
//void FXAASetUniforms( Framebuffer FBO );
|
|
|
|
void CalcAimMove( float &yawDelta, float &pitchDelta );
|
|
|
|
int GetCurrentFlashlightMode();
|
|
void NextFlashlightMode();
|
|
|
|
bool ShouldQuit();
|
|
void ForceChaperone(int which, bool force);
|
|
|
|
|
|
//------------------
|
|
int lastComfortTime;
|
|
int currentFlashlightMode;
|
|
|
|
bool VR_GAME_PAUSED;
|
|
|
|
bool PDAforcetoggle;
|
|
bool PDAforced;
|
|
bool PDArising;
|
|
bool gameSavingLoading;
|
|
bool showingIntroVideo;
|
|
|
|
int swfRenderMode;
|
|
bool PDAclipModelSet;
|
|
int pdaToggleTime;
|
|
int lastSaveTime;
|
|
bool wasSaved;
|
|
bool wasLoaded;
|
|
|
|
bool forceRun;
|
|
|
|
bool forceLeftStick;
|
|
|
|
int currentFlashlightPosition;
|
|
|
|
bool handInGui;
|
|
|
|
bool vrIsBackgroundSaving;
|
|
|
|
bool shouldRecenter;
|
|
|
|
int vrFrameNumber;
|
|
int lastPostFrame;
|
|
|
|
int frameCount;
|
|
|
|
double sensorSampleTime;
|
|
|
|
int fingerPose[2];
|
|
|
|
idVec3 lastViewOrigin;
|
|
idMat3 lastViewAxis;
|
|
|
|
idVec3 lastCenterEyeOrigin;
|
|
idMat3 lastCenterEyeAxis;
|
|
|
|
float handRoll[2];
|
|
|
|
|
|
float bodyYawOffset;
|
|
float lastHMDYaw;
|
|
float lastHMDPitch;
|
|
float lastHMDRoll;
|
|
idVec3 lastHMDViewOrigin;
|
|
idMat3 lastHMDViewAxis;
|
|
idVec3 uncrouchedHMDViewOrigin;
|
|
float headHeightDiff;
|
|
|
|
bool isWalking;
|
|
bool thirdPersonMovement;
|
|
float thirdPersonDelta;
|
|
idVec3 thirdPersonHudPos;
|
|
idMat3 thirdPersonHudAxis;
|
|
|
|
|
|
float angles[3];
|
|
|
|
//uint32_t hmdWidth;
|
|
//uint32_t hmdHeight;
|
|
//GBCHANGE
|
|
int hmdWidth;
|
|
int hmdHeight;
|
|
int hmdHz;
|
|
|
|
bool useFBO;
|
|
int primaryFBOWidth;
|
|
int primaryFBOHeight;
|
|
|
|
int VR_AAmode;
|
|
|
|
int VR_USE_MOTION_CONTROLS;
|
|
int weaponHand;
|
|
|
|
bool hasHMD;
|
|
bool hasOculusRift;
|
|
|
|
bool m_bDebugOpenGL;
|
|
bool m_bVerbose;
|
|
bool m_bPerf;
|
|
bool m_bVblank;
|
|
bool m_bGlFinishHack;
|
|
|
|
idStr m_strDriver;
|
|
idStr m_strDisplay;
|
|
|
|
//char m_rDevClassChar[vr::k_unMaxTrackedDeviceCount];
|
|
//idMat4 m_rmat4DevicePose[vr::k_unMaxTrackedDeviceCount];
|
|
//bool m_rbShowTrackedDevice[vr::k_unMaxTrackedDeviceCount];
|
|
|
|
|
|
idMat4 m_mat4ProjectionLeft;
|
|
idMat4 m_mat4ProjectionRight;
|
|
idMat4 m_mat4eyePosLeft;
|
|
idMat4 m_mat4eyePosRight;
|
|
|
|
float singleEyeIPD;
|
|
float hmdForwardOffset;
|
|
|
|
float hmdFovX;
|
|
float hmdFovY;
|
|
float hmdPixelScale;
|
|
float hmdAspect;
|
|
hmdEye_t hmdEye[2];
|
|
|
|
float VRScreenSeparation; // for Reduce FOV motion sickness fix
|
|
|
|
float officialIPD;
|
|
float officialHeight;
|
|
|
|
float manualIPD;
|
|
float manualHeight;
|
|
|
|
idImage* hmdEyeImage[2];
|
|
idImage* hmdCurrentRender[2];
|
|
|
|
|
|
idPosef EyeRenderPose[2];
|
|
|
|
idPosef handPose[2];
|
|
|
|
int mirrorW;
|
|
int mirrorH;
|
|
|
|
|
|
idImage* primaryFBOimage;
|
|
idImage* resolveFBOimage;
|
|
idImage* fullscreenFBOimage;
|
|
|
|
double hmdFrameTime;
|
|
bool hmdPositionTracked;
|
|
int currentEye;
|
|
|
|
idVec3 trackingOriginOffset;
|
|
float trackingOriginYawOffset;
|
|
float trackingOriginHeight;
|
|
bool chestDefaultDefined;
|
|
idVec3 hmdBodyTranslation;
|
|
|
|
idVec3 motionMoveDelta;
|
|
idVec3 motionMoveVelocity;
|
|
bool isLeaning;
|
|
idVec3 leanOffset;
|
|
idVec3 leanBlankOffset;
|
|
float leanBlankOffsetLengthSqr;
|
|
bool leanBlank;
|
|
|
|
idVec3 fixedPDAMoveDelta;
|
|
|
|
int teleportButtonCount;
|
|
idVec2 leftMapped;
|
|
int oldTeleportButtonState;
|
|
|
|
float independentWeaponYaw;
|
|
float independentWeaponPitch;
|
|
|
|
bool playerDead;
|
|
|
|
bool isLoading;
|
|
|
|
int lastRead;
|
|
int currentRead;
|
|
bool updateScreen;
|
|
|
|
bool scanningPDA;
|
|
|
|
float bodyMoveAng;
|
|
|
|
bool privateCamera;
|
|
|
|
vr_motionControl_t motionControlType;
|
|
|
|
// wip stuff
|
|
int wipNumSteps;
|
|
int wipStepState;
|
|
int wipLastPeriod;
|
|
float wipCurrentDelta;
|
|
float wipCurrentVelocity;
|
|
float wipPeriodVel;
|
|
float wipTotalDelta;
|
|
float wipLastAcces;
|
|
float wipAvgPeriod;
|
|
float wipTotalDeltaAvg;
|
|
|
|
bool renderingSplash;
|
|
|
|
idAngles poseHmdAngles;
|
|
idVec3 poseHmdHeadPositionDelta;
|
|
idVec3 poseHmdBodyPositionDelta;
|
|
idVec3 remainingMoveHmdBodyPositionDelta;
|
|
idVec3 poseHmdAbsolutePosition;
|
|
float userDuckingAmount; // how many game units the user has physically ducked in real life from their calibrated position
|
|
|
|
idVec3 poseHandPos[2];
|
|
idQuat poseHandRotationQuat[2];
|
|
idMat3 poseHandRotationMat3[2];
|
|
idAngles poseHandRotationAngles[2];
|
|
|
|
idAngles poseLastHmdAngles;
|
|
idVec3 poseLastHmdHeadPositionDelta;
|
|
idVec3 poseLastHmdBodyPositionDelta;
|
|
idVec3 poseLastHmdAbsolutePosition;
|
|
float lastBodyYawOffset;
|
|
|
|
idStr currentBindingDisplay;
|
|
|
|
float cinematicStartViewYaw;
|
|
idVec3 cinematicStartPosition;
|
|
|
|
bool didTeleport;
|
|
float teleportDir;
|
|
|
|
idVec3 currentHandWorldPosition[2];
|
|
|
|
|
|
|
|
// clip stuff
|
|
idClipModel* bodyClip;
|
|
idClipModel* headClip;
|
|
|
|
//---------------------------
|
|
private:
|
|
|
|
|
|
|
|
};
|
|
|
|
extern idCVar vr_scale;
|
|
extern idCVar vr_normalViewHeight;
|
|
extern idCVar vr_useFloorHeight;
|
|
|
|
extern idCVar vr_wristStatMon;
|
|
extern idCVar vr_disableWeaponAnimation;
|
|
extern idCVar vr_headKick;
|
|
|
|
extern idCVar vr_weaponHand;
|
|
|
|
extern idCVar vr_flashlightMode;
|
|
extern idCVar vr_flashlightStrict; // Carl
|
|
|
|
extern idCVar vr_flashlightBodyPosX;
|
|
extern idCVar vr_flashlightBodyPosY;
|
|
extern idCVar vr_flashlightBodyPosZ;
|
|
|
|
extern idCVar vr_flashlightHelmetPosX;
|
|
extern idCVar vr_flashlightHelmetPosY;
|
|
extern idCVar vr_flashlightHelmetPosZ;
|
|
|
|
extern idCVar vr_forward_keyhole;
|
|
|
|
extern idCVar vr_PDAfixLocation;
|
|
|
|
extern idCVar vr_weaponPivotOffsetForward;
|
|
extern idCVar vr_weaponPivotOffsetHorizontal;
|
|
extern idCVar vr_weaponPivotOffsetVertical;
|
|
extern idCVar vr_weaponPivotForearmLength;
|
|
|
|
|
|
extern idCVar vr_guiScale;
|
|
extern idCVar vr_guiSeparation;
|
|
|
|
extern idCVar vr_guiMode;
|
|
|
|
extern idCVar vr_hudScale;
|
|
extern idCVar vr_hudPosHor;
|
|
extern idCVar vr_hudPosVer;
|
|
extern idCVar vr_hudPosDis;
|
|
extern idCVar vr_hudPosLock;
|
|
extern idCVar vr_hudType;
|
|
extern idCVar vr_hudPosAngle;
|
|
extern idCVar vr_hudRevealAngle;
|
|
extern idCVar vr_hudTransparency;
|
|
extern idCVar vr_hudOcclusion;
|
|
|
|
extern idCVar vr_hudLowHealth;
|
|
|
|
extern idCVar vr_listMonitorName;
|
|
|
|
extern idCVar vr_joystickMenuMapping;
|
|
|
|
extern idCVar vr_trackingPredictionUserDefined;
|
|
|
|
extern idCVar vr_deadzonePitch;
|
|
extern idCVar vr_deadzoneYaw;
|
|
extern idCVar vr_comfortDelta;
|
|
|
|
extern idCVar vr_headingBeamMode;
|
|
|
|
extern idCVar vr_weaponSight;
|
|
extern idCVar vr_weaponSightToSurface;
|
|
|
|
extern idCVar vr_motionFlashPitchAdj; // flashlight pitch adjust
|
|
extern idCVar vr_motionWeaponPitchAdj;
|
|
|
|
extern idCVar vr_3dgui;
|
|
extern idCVar vr_shakeAmplitude;
|
|
|
|
extern idCVar vr_padDeadzone;
|
|
extern idCVar vr_jsDeadzone;
|
|
extern idCVar vr_padToButtonThreshold;
|
|
extern idCVar vr_knockBack;
|
|
extern idCVar vr_jumpBounce;
|
|
extern idCVar vr_stepSmooth;
|
|
|
|
extern idCVar vr_mountedWeaponController;
|
|
extern idCVar vr_walkSpeedAdjust;
|
|
|
|
|
|
extern idCVar vr_movePoint;
|
|
|
|
extern idCVar vr_crouchTriggerDist;
|
|
extern idCVar vr_crouchMode;
|
|
extern idCVar vr_crouchHideBody;
|
|
|
|
extern idCVar vr_wipPeriodMin;
|
|
extern idCVar vr_wipPeriodMax;
|
|
|
|
extern idCVar vr_wipVelocityMin;
|
|
extern idCVar vr_wipVelocityMax;
|
|
|
|
extern idCVar vr_headbbox;
|
|
|
|
extern idCVar vr_pdaPosX;
|
|
extern idCVar vr_pdaPosY;
|
|
extern idCVar vr_pdaPosZ;
|
|
|
|
extern idCVar vr_pdaPitch;
|
|
|
|
extern idCVar vr_movePoint;
|
|
extern idCVar vr_moveClick;
|
|
extern idCVar vr_playerBodyMode;
|
|
extern idCVar vr_bodyToMove;
|
|
extern idCVar vr_moveThirdPerson;
|
|
|
|
extern idCVar vr_teleportSkipHandrails;
|
|
extern idCVar vr_teleportShowAimAssist;
|
|
extern idCVar vr_teleportButtonMode;
|
|
extern idCVar vr_teleportHint;
|
|
|
|
extern idCVar vr_teleport;
|
|
extern idCVar vr_teleportMode;
|
|
extern idCVar vr_teleportMaxTravel;
|
|
extern idCVar vr_teleportThroughDoors;
|
|
extern idCVar vr_motionSickness;
|
|
extern idCVar vr_strobeTime;
|
|
extern idCVar vr_chaperone;
|
|
extern idCVar vr_chaperoneColor;
|
|
|
|
extern idCVar vr_slotDebug;
|
|
extern idCVar vr_slotMag;
|
|
extern idCVar vr_slotDur;
|
|
extern idCVar vr_slotDisable;
|
|
|
|
extern idCVar vr_handSwapsAnalogs;
|
|
extern idCVar vr_autoSwitchControllers;
|
|
|
|
extern idCVar vr_useHandPoses;
|
|
extern idCVar vr_cinematics;
|
|
|
|
extern idCVar vr_instantAccel;
|
|
extern idCVar vr_shotgunChoke;
|
|
|
|
extern idCVar vr_headshotMultiplier;
|
|
|
|
extern idCVar vr_weaponCycleMode;
|
|
extern idCVar vr_gripMode;
|
|
extern idCVar vr_doubleClickGrip;
|
|
extern idCVar vr_pickUpMode;
|
|
extern idCVar vr_reloadMode;
|
|
extern idCVar vr_mustEmptyHands;
|
|
extern idCVar vr_contextSensitive;
|
|
extern idCVar vr_dualWield;
|
|
extern idCVar vr_voiceMicLocation;
|
|
extern idCVar vr_debugHands;
|
|
extern idCVar vr_rumbleChainsaw;
|
|
|
|
extern idCVar vr_comfortRepeat;
|
|
|
|
extern iVr* commonVr;
|
|
//extern iVoice* commonVoice;
|
|
|
|
typedef enum
|
|
{
|
|
VR_GRIP_CONTEXT_TOGGLE = 0,
|
|
VR_GRIP_CONTEXT_TOGGLE_NO_SURFACE = 1,
|
|
VR_GRIP_TOGGLE_WEAPONS_HOLD_PHYSICS = 2,
|
|
VR_GRIP_TOGGLE_WEAPONS_HOLD_ITEMS = 3,
|
|
VR_GRIP_TOGGLE_WITH_DROP = 4,
|
|
VR_GRIP_DEAD_AND_BURIED = 5,
|
|
VR_GRIP_HOLD = 6,
|
|
VR_GRIP_HOLD_AND_SQUEEZE = 7,
|
|
} vr_gripMode_t;
|
|
|
|
//Carl: Can you use two weapons at once?
|
|
typedef enum
|
|
{
|
|
VR_DUALWIELD_NOT_EVEN_FISTS = 0,
|
|
VR_DUALWIELD_NOTHING = 1,
|
|
VR_DUALWIELD_ONLY_FLASHLIGHT = 2,
|
|
VR_DUALWIELD_ONLY_GRENADES = 3,
|
|
VR_DUALWIELD_ONLY_GRENADES_FLASHLIGHT = 4,
|
|
VR_DUALWIELD_ONLY_PISTOLS = 5,
|
|
VR_DUALWIELD_ONLY_PISTOLS_FLASHLIGHT = 6,
|
|
VR_DUALWIELD_ONLY_PISTOLS_GRENADES_FLASHLIGHT = 7,
|
|
VR_DUALWIELD_YES = 8
|
|
} vr_dualwield_t;
|
|
|
|
//Carl: Can you use two weapons at once?
|
|
typedef enum
|
|
{
|
|
VR_WEAPONCYCLE_SKIP_HOLSTERED = 0,
|
|
VR_WEAPONCYCLE_INCLUDE_HOLSTERED = 1,
|
|
VR_WEAPONCYCLE_INCLUDE_FLASHLIGHT = 2,
|
|
VR_WEAPONCYCLE_HOLSTERED_AND_FLASHLIGHT = 3,
|
|
VR_WEAPONCYCLE_HOLSTERED_AND_FLASHLIGHT_AND_PDA = 4
|
|
} vr_weaponcycle_t;
|
|
|
|
#endif
|