summaryrefslogtreecommitdiff
path: root/game/client/client_virtualreality.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/client_virtualreality.h')
-rw-r--r--game/client/client_virtualreality.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/game/client/client_virtualreality.h b/game/client/client_virtualreality.h
new file mode 100644
index 0000000..9aadfeb
--- /dev/null
+++ b/game/client/client_virtualreality.h
@@ -0,0 +1,165 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: The implementation of ISourceVirtualReality, which provides utility
+// functions for VR including head tracking, window/viewport information,
+// rendering information, and distortion
+//
+//=============================================================================
+
+#ifndef CLIENTVIRTUALREALITY_H
+#define CLIENTVIRTUALREALITY_H
+#if defined( _WIN32 )
+#pragma once
+#endif
+
+#include "tier3/tier3.h"
+#include "iclientvirtualreality.h"
+#include "view_shared.h"
+
+enum HeadtrackMovementMode_t
+{
+ HMM_SHOOTFACE_MOVEFACE = 0, // Shoot from your face, move along your face.
+ HMM_SHOOTFACE_MOVETORSO, // Shoot from your face, move the direction your torso is facing.
+ HMM_SHOOTMOUSE_MOVEFACE, // Shoot from the mouse cursor which moves within the HUD, move along your face.
+ HMM_SHOOTBOUNDEDMOUSE_LOOKFACE_MOVEFACE, // Shoot from the mouse cursor which moves, bounded within the HUD, move along your face.
+ HMM_SHOOTBOUNDEDMOUSE_LOOKFACE_MOVEMOUSE, // Shoot from the mouse cursor which moves, bounded within the HUD, move along your weapon (the "mouse")
+
+ // The following are not intended to be user-selectable modes, they are used by e.g. followcam stuff.
+ HMM_SHOOTMOVELOOKMOUSEFACE, // Shoot & move & look along the mouse cursor (i.e. original unchanged gameplay), face just looks on top of that.
+ HMM_SHOOTMOVEMOUSE_LOOKFACE, // Shoot & move along the mouse cursor (i.e. original unchanged gameplay), face just looks.
+ HMM_SHOOTMOVELOOKMOUSE, // Shoot, move and look along the mouse cursor - HMD orientation is completely ignored!
+
+ HMM_LAST,
+
+ HMM_NOOVERRIDE = HMM_LAST // Used as a retrun from ShouldOverrideHeadtrackControl(), not an actual mode.
+};
+
+
+//-----------------------------------------------------------------------------
+// The implementation
+//-----------------------------------------------------------------------------
+
+
+class CClientVirtualReality: public CTier3AppSystem< IClientVirtualReality >
+{
+ typedef CTier3AppSystem< IClientVirtualReality > BaseClass;
+
+public:
+
+ CClientVirtualReality();
+ ~CClientVirtualReality();
+
+ //---------------------------------------------------------
+ // Initialization and shutdown
+ //---------------------------------------------------------
+
+ //
+ // IAppSystem
+ //
+ virtual bool Connect( CreateInterfaceFn factory );
+ virtual void Disconnect();
+ virtual void * QueryInterface( const char *pInterfaceName );
+
+ // these will come from the engine
+ virtual InitReturnVal_t Init();
+ virtual void Shutdown();
+
+ // Called when startup is complete
+ void StartupComplete();
+
+ //---------------------------------------------------------
+ // IClientVirtualReality implementation
+ //---------------------------------------------------------
+ virtual void DrawMainMenu() OVERRIDE;
+
+
+ //---------------------------------------------------------
+ // VR utilities for use in the client
+ //---------------------------------------------------------
+ bool OverrideView ( CViewSetup *pViewMiddle, Vector *pViewModelOrigin, QAngle *pViewModelAngles, HeadtrackMovementMode_t hmmMovementOverride );
+ bool OverrideStereoView( CViewSetup *pViewMiddle, CViewSetup *pViewLeft, CViewSetup *pViewRight );
+ bool OverridePlayerMotion( float flInputSampleFrametime, const QAngle &oldAngles, const QAngle &curAngles, const Vector &curMotion, QAngle *pNewAngles, Vector *pNewMotion );
+ bool OverrideWeaponHudAimVectors ( Vector *pAimOrigin, Vector *pAimDirection );
+ bool CurrentlyZoomed();
+ void OverrideTorsoTransform( const Vector & position, const QAngle & angles ) ;
+ void CancelTorsoTransformOverride( ) ;
+ bool CanOverlayHudQuad();
+ void GetHUDBounds( Vector *pViewer, Vector *pUL, Vector *pUR, Vector *pLL, Vector *pLR );
+ void RenderHUDQuad( bool bBlackout, bool bTranslucent );
+ float GetZoomedModeMagnification();
+ bool ProcessCurrentTrackingState( float fGameFOV );
+ const VMatrix &GetHudProjectionFromWorld();
+ void GetTorsoRelativeAim( Vector *pPosition, QAngle *pAngles );
+ float GetHUDDistance();
+ bool ShouldRenderHUDInWorld();
+ const VMatrix & GetWorldFromMidEye() const { return m_WorldFromMidEyeNoDebugCam; }
+ void OverrideViewModelTransform( Vector & vmorigin, QAngle & vmangles, bool bUseLargeOverride );
+ void AlignTorsoAndViewToWeapon();
+ void PostProcessFrame( StereoEye_t eEye );
+ void OverlayHUDQuadWithUndistort( const CViewSetup &view, bool bDoUndistort, bool bBlackout, bool bTranslucent );
+
+ //---------------------------------------------------------
+ // Enter/leave VR mode
+ //---------------------------------------------------------
+ void Activate();
+ void Deactivate();
+
+private:
+ HeadtrackMovementMode_t m_hmmMovementActual;
+
+ // Where the current mideye is relative to the (game)world.
+ VMatrix m_WorldFromMidEye;
+
+ // used for drawing the HUD
+ float m_fHudHorizontalFov;
+ VMatrix m_WorldFromHud;
+ VMatrix m_HudProjectionFromWorld;
+ float m_fHudHalfWidth;
+ float m_fHudHalfHeight;
+
+ // Where the current mideye is relative to the zero (torso) (currently always the same as m_MideyeZeroFromMideyeCurrent!)
+ VMatrix m_TorsoFromMideye;
+
+ // The debug cam will play with the above, but some things want the non-debug view.
+ VMatrix m_WorldFromMidEyeNoDebugCam;
+
+ // Where the weapon is currently pointing (note the translation will be zero - this is just orientation)
+ VMatrix m_WorldFromWeapon;
+
+ // The player's current torso angles/pos in the world.
+ QAngle m_PlayerTorsoAngle;
+ Vector m_PlayerTorsoOrigin;
+ Vector m_PlayerLastMovement;
+
+ // The player's current view angles/pos in the world.
+ QAngle m_PlayerViewAngle;
+ Vector m_PlayerViewOrigin;
+
+ // The amount of zoom to apply to the view of the world (but NOT to the HUD!). Used for sniper weapons, etc.
+ float m_WorldZoomScale;
+
+ // for overriding torso position in vehicles
+ QAngle m_OverrideTorsoAngle;
+ QAngle m_OverrideTorsoOffset;
+ bool m_bOverrideTorsoAngle;
+
+ // While this is >0, we keep forcing the torso (and maybe view) to the weapon.
+ int m_iAlignTorsoAndViewToWeaponCountdown;
+
+ bool m_bMotionUpdated;
+
+ RTime32 m_rtLastMotionSample;
+
+ // video mode we had before we entered VR mode
+ bool m_bNonVRWindowed;
+ int m_nNonVRWidth;
+ int m_nNonVRHeight;
+#if defined( USE_SDL )
+ int m_nNonVRSDLDisplayIndex;
+#endif
+ bool m_bNonVRRawInput;
+};
+
+extern CClientVirtualReality g_ClientVirtualReality;
+
+#endif // CLIENTVIRTUALREALITY_H