You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.7 KiB
134 lines
4.7 KiB
//========= 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; |
|
|
|
bool m_bHaveValidPose; |
|
VMatrix m_ZeroFromHeadPose; |
|
|
|
}; |
|
|
|
|
|
#endif // SOURCEVIRTUALREALITY_H
|
|
|