//========= 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 SOURCEVIRTUALREALITY_H #define SOURCEVIRTUALREALITY_H #if defined( _WIN32 ) #pragma once #endif #include "tier3/tier3.h" #include "sourcevr/isourcevirtualreality.h" #include "materialsystem/itexture.h" #include "materialsystem/MaterialSystemUtil.h" #include "openvr/openvr.h" // this is a callback so we can regenerate the distortion texture whenever we need to class CDistortionTextureRegen : public ITextureRegenerator { public: CDistortionTextureRegen( vr::Hmd_Eye eEye ) : m_eEye( eEye ) {} virtual void RegenerateTextureBits( ITexture *pTexture, IVTFTexture *pVTFTexture, Rect_t *pSubRect ) OVERRIDE; virtual void Release() OVERRIDE {} private: vr::Hmd_Eye m_eEye; }; //----------------------------------------------------------------------------- // The implementation //----------------------------------------------------------------------------- class CSourceVirtualReality: public CTier3AppSystem< ISourceVirtualReality > { typedef CTier3AppSystem< ISourceVirtualReality > BaseClass; public: CSourceVirtualReality(); ~CSourceVirtualReality(); //--------------------------------------------------------- // 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(); //--------------------------------------------------------- // ISourceVirtualReality implementation //--------------------------------------------------------- virtual bool ShouldRunInVR() OVERRIDE; virtual bool IsHmdConnected() OVERRIDE; virtual void GetViewportBounds( VREye eEye, int *pnX, int *pnY, int *pnWidth, int *pnHeight ) OVERRIDE; virtual bool DoDistortionProcessing ( VREye eEye ) OVERRIDE; virtual bool CompositeHud ( VREye eEye, float ndcHudBounds[4], bool bDoUndistort, bool bBlackout, bool bTranslucent ) OVERRIDE; virtual VMatrix GetMideyePose() OVERRIDE; virtual bool SampleTrackingState ( float PlayerGameFov, float fPredictionSeconds ) OVERRIDE; virtual bool GetEyeProjectionMatrix ( VMatrix *pResult, VREye, float zNear, float zFar, float fovScale ) OVERRIDE; virtual bool WillDriftInYaw() OVERRIDE; virtual bool GetDisplayBounds( VRRect_t *pRect ) OVERRIDE; virtual VMatrix GetMidEyeFromEye( VREye eEye ) OVERRIDE; virtual int GetVRModeAdapter() OVERRIDE; virtual void CreateRenderTargets( IMaterialSystem *pMaterialSystem ) OVERRIDE; virtual void ShutdownRenderTargets() OVERRIDE; virtual ITexture *GetRenderTarget( VREye eEye, EWhichRenderTarget eWhich ) OVERRIDE; virtual void GetRenderTargetFrameBufferDimensions( int & nWidth, int & nHeight ) OVERRIDE; virtual bool Activate() OVERRIDE; virtual void Deactivate() OVERRIDE; virtual bool ShouldForceVRMode( ) OVERRIDE; virtual void SetShouldForceVRMode( ) OVERRIDE; void RefreshDistortionTexture(); void AcquireNewZeroPose(); bool StartTracker(); void StopTracker(); bool ResetTracking(); // Called to reset tracking // makes sure we've initialized OpenVR so we can use // m_pHmd bool EnsureOpenVRInited(); // Prefer this to the convar so that convar will stick for the entire // VR activation. We can't lazy-crate render targets and don't // want to create the "just in case" somebody turns on this experimental // mode bool UsingOffscreenRenderTarget() const { return m_bUsingOffscreenRenderTarget; } vr::IVRSystem * GetHmd() { return m_pHmd; } private: bool m_bActive; bool m_bShouldForceVRMode; bool m_bUsingOffscreenRenderTarget; CDistortionTextureRegen m_textureGeneratorLeft; CDistortionTextureRegen m_textureGeneratorRight; CTextureReference g_StereoGuiTexture; CTextureReference m_pDistortionTextureLeft; CTextureReference m_pDistortionTextureRight; CTextureReference m_pPredistortRT; CTextureReference m_pPredistortRTDepth; CMaterialReference m_warpMaterial; CMaterialReference m_DistortLeftMaterial; CMaterialReference m_DistortRightMaterial; CMaterialReference m_DistortHUDLeftMaterial; CMaterialReference m_DistortHUDRightMaterial; CMaterialReference m_InWorldUIMaterial; CMaterialReference m_InWorldUIOpaqueMaterial; CMaterialReference m_blackMaterial; vr::IVRSystem *m_pHmd; vr::IVRExtendedDisplay *m_pExtDisplay; vr::IVRChaperone *m_pChap; bool m_bHaveValidPose; VMatrix m_ZeroFromHeadPose; }; #endif // SOURCEVIRTUALREALITY_H