2013-06-27 06:22:04 +08:00
|
|
|
//========= 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"
|
2014-03-01 03:08:09 +08:00
|
|
|
#include "view_shared.h"
|
2013-06-27 06:22:04 +08:00
|
|
|
|
|
|
|
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();
|
|
|
|
|
2014-03-01 03:08:09 +08:00
|
|
|
// Called when startup is complete
|
|
|
|
void StartupComplete();
|
2013-06-27 06:22:04 +08:00
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// 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( ) ;
|
2014-03-01 03:08:09 +08:00
|
|
|
bool CanOverlayHudQuad();
|
2013-06-27 06:22:04 +08:00
|
|
|
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();
|
2014-03-01 03:08:09 +08:00
|
|
|
void PostProcessFrame( StereoEye_t eEye );
|
|
|
|
void OverlayHUDQuadWithUndistort( const CViewSetup &view, bool bDoUndistort, bool bBlackout, bool bTranslucent );
|
2013-06-27 06:22:04 +08:00
|
|
|
|
|
|
|
//---------------------------------------------------------
|
2014-03-01 03:08:09 +08:00
|
|
|
// Enter/leave VR mode
|
2013-06-27 06:22:04 +08:00
|
|
|
//---------------------------------------------------------
|
2014-03-01 03:08:09 +08:00
|
|
|
void Activate();
|
|
|
|
void Deactivate();
|
2013-06-27 06:22:04 +08:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2014-03-01 03:08:09 +08:00
|
|
|
// 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;
|
2013-06-27 06:22:04 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
extern CClientVirtualReality g_ClientVirtualReality;
|
|
|
|
|
|
|
|
#endif // CLIENTVIRTUALREALITY_H
|