VR HUD Attached to off hand controller

Thanks again to the Fully Possesed Mod for the functionality for this one!
This commit is contained in:
Simon 2020-09-25 00:10:19 +01:00
parent 66c7052713
commit aaa37bbe69
11 changed files with 155 additions and 64 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.drbeef.doom3quest" package="com.drbeef.doom3quest"
android:versionCode="9" android:versionCode="11"
android:versionName="0.0.15" android:installLocation="auto" > android:versionName="0.0.17" android:installLocation="auto" >
<!-- Tell the system this app requires OpenGL ES 3.1. --> <!-- Tell the system this app requires OpenGL ES 3.1. -->
<uses-feature android:glEsVersion="0x00030001" android:required="true"/> <uses-feature android:glEsVersion="0x00030001" android:required="true"/>

View file

@ -26,8 +26,6 @@ extern "C" {
#define ALOGV(...) #define ALOGV(...)
#endif #endif
#define TIC_RATE 60
float screenYaw; float screenYaw;
float radians(float deg); float radians(float deg);

View file

@ -59,6 +59,7 @@ extern bool inMenu;
extern bool inGameGuiActive; extern bool inGameGuiActive;
extern bool objectiveSystemActive; extern bool objectiveSystemActive;
extern bool inCinematic; extern bool inCinematic;
const int USERCMD_HZ = 60;
void HandleInput_Default( int controlscheme, ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking, void HandleInput_Default( int controlscheme, ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, ovrInputStateTrackedRemote *pDominantTrackedRemoteOld, ovrTracking* pDominantTracking,
@ -360,6 +361,7 @@ void HandleInput_Default( int controlscheme, ovrInputStateTrackedRemote *pDomina
pVRClientInfo->offhandoffset[2] = pOff->HeadPose.Pose.Position.z - pVRClientInfo->hmdposition[2]; pVRClientInfo->offhandoffset[2] = pOff->HeadPose.Pose.Position.z - pVRClientInfo->hmdposition[2];
vec3_t rotation = {0}; vec3_t rotation = {0};
rotation[PITCH] = -45;
QuatToYawPitchRoll(pOff->HeadPose.Pose.Orientation, rotation, pVRClientInfo->offhandangles); QuatToYawPitchRoll(pOff->HeadPose.Pose.Orientation, rotation, pVRClientInfo->offhandangles);
if (vr_walkdirection == 0) { if (vr_walkdirection == 0) {
@ -375,10 +377,9 @@ void HandleInput_Default( int controlscheme, ovrInputStateTrackedRemote *pDomina
{ {
//Adjust positional factor for this sample based on how long the last frame took, it should //Adjust positional factor for this sample based on how long the last frame took, it should
//approximately even out the positional movement on a per frame basis (especially when fps is much lower than 60) //approximately even out the positional movement on a per frame basis (especially when fps is much lower than 60)
//NOTE: it'll never be above ~60fps since we use com_fixedTic of "-1"
static float lastSampleTime = 0; static float lastSampleTime = 0;
float sampleTime = Sys_Milliseconds(); float sampleTime = Sys_Milliseconds();
float vr_positional_factor = 2400.0f * ((1000.0f / TIC_RATE) / (sampleTime-lastSampleTime)); float vr_positional_factor = 2400.0f * ((1000.0f / USERCMD_HZ) / (sampleTime-lastSampleTime));
lastSampleTime = sampleTime; lastSampleTime = sampleTime;
//This section corrects for the fact that the controller actually controls direction of movement, but we want to move relative to the direction the //This section corrects for the fact that the controller actually controls direction of movement, but we want to move relative to the direction the

View file

@ -1043,6 +1043,9 @@ idPlayer::idPlayer() {
flashlightModelDefHandle = -1; flashlightModelDefHandle = -1;
hudHandle = -1;
memset( &hudEntity, 0, sizeof( hudEntity ) );
skin = NULL; skin = NULL;
powerUpSkin = NULL; powerUpSkin = NULL;
baseSkinName = ""; baseSkinName = "";
@ -1422,6 +1425,12 @@ void idPlayer::Init( void ) {
SetupFlashlightHolster(); SetupFlashlightHolster();
SetupLaserSight(); SetupLaserSight();
// re-init hud model
memset( &hudEntity, 0, sizeof( hudEntity ) );
hudEntity.hModel = renderModelManager->FindModel( "/models/mapobjects/hud.lwo" );
hudEntity.customShader = declManager->FindMaterial( "vr/hud" );
hudEntity.weaponDepthHack = true;
} }
/* /*
@ -2103,6 +2112,12 @@ void idPlayer::Restore( idRestoreGame *savefile ) {
SetupFlashlightHolster(); SetupFlashlightHolster();
SetupLaserSight(); SetupLaserSight();
// re-init hud model
memset( &hudEntity, 0, sizeof( hudEntity ) );
hudEntity.hModel = renderModelManager->FindModel( "/models/mapobjects/hud.lwo" );
hudEntity.customShader = declManager->FindMaterial( "vr/hud" );
hudEntity.weaponDepthHack = true;
} }
void idPlayer::SetupLaserSight() void idPlayer::SetupLaserSight()
@ -2688,6 +2703,94 @@ void idPlayer::DrawHUD( idUserInterface *_hud ) {
//cursor->Redraw( gameLocal.realClientTime ); //cursor->Redraw( gameLocal.realClientTime );
} }
} }
renderSystem->CaptureRenderToImage( "_hudImage" );
}
/*
==============
Koz
idPlayer::UpdateVrHud
==============
*/
void idPlayer::UpdateVrHud()
{
static idVec3 hudOrigin;
static idMat3 hudAxis;
float hudPitch;
if (pVRClientInfo != nullptr)
// update the hud model
if ( (pVRClientInfo == nullptr) || !pVRClientInfo->visible_hud || gameLocal.inCinematic)
{
// hide it
hudEntity.allowSurfaceInViewID = -1;
}
else
{
hudEntity.allowSurfaceInViewID = entityNumber + 1;
{
hudPitch = 10.0f;
float yaw;
{
// CalculateRenderView must have been called first
const idVec3 &viewOrigin = firstPersonViewOrigin;
const idMat3 &viewAxis = firstPersonViewAxis;
if (pVRClientInfo)
{
idAngles angles;
float *pAngles = pVRClientInfo->offhandangles;
angles.pitch = pVRClientInfo->offhandangles[PITCH];
angles.yaw = viewAngles.yaw +
(pVRClientInfo->offhandangles[YAW] - pVRClientInfo->hmdorientation[YAW]);
angles.roll = pVRClientInfo->offhandangles[ROLL];
hudAxis = angles.ToMat3();
idVec3 offpos( -pVRClientInfo->offhandoffset[2],
-pVRClientInfo->offhandoffset[0],
pVRClientInfo->offhandoffset[1]);
idAngles a(0, viewAngles.yaw - pVRClientInfo->hmdorientation[YAW], 0);
offpos *= a.ToMat3();
offpos *= cvarSystem->GetCVarFloat( "vr_worldscale" );
{
hudOrigin = viewOrigin + offpos;
}
}
// GetViewPos( hudOrigin, hudAxis );
// yaw = viewAngles.yaw;
}
//hudAxis = idAngles( hudPitch, yaw, 0.0f ).ToMat3();
//hudOrigin += hudAxis[0] * 24.0f;//vr_hudPosDis.GetFloat();
hudOrigin += hudAxis[1] * -8.0f;
hudOrigin += hudAxis[2] * 16.0f;
}
hudAxis *= 0.7;
hudEntity.axis = hudAxis;
hudEntity.origin = hudOrigin;
hudEntity.weaponDepthHack = true;
}
if ( hudHandle == -1 )
{
hudHandle = gameRenderWorld->AddEntityDef( &hudEntity );
}
else
{
gameRenderWorld->UpdateEntityDef( hudHandle, &hudEntity );
}
} }
/* /*
@ -6367,10 +6470,7 @@ void idPlayer::Think( void ) {
pVRClientInfo->weaponid = -1; pVRClientInfo->weaponid = -1;
} }
cvarSystem->SetCVarBool("vr_weapon_stabilised", pVRClientInfo->weapon_stabilised); cvarSystem->SetCVarBool("vr_weapon_stabilised", pVRClientInfo->weapon_stabilised);
pVRClientInfo->velocitytriggered = ( pVRClientInfo->velocitytriggered = currentWeapon == WEAPON_FLASHLIGHT;
currentWeapon == WEAPON_FISTS ||
currentWeapon == WEAPON_FLASHLIGHT);
pVRClientInfo->pistol = currentWeapon == WEAPON_PISTOL; pVRClientInfo->pistol = currentWeapon == WEAPON_PISTOL;
} }
@ -6511,6 +6611,8 @@ void idPlayer::Think( void ) {
UpdateLaserSight(); UpdateLaserSight();
UpdateVrHud();
UpdateDeathSkin( false ); UpdateDeathSkin( false );
if ( gameLocal.isMultiplayer ) { if ( gameLocal.isMultiplayer ) {

View file

@ -237,6 +237,9 @@ public:
renderEntity_t flashlightRenderEntity; // used to present a model to the renderer renderEntity_t flashlightRenderEntity; // used to present a model to the renderer
qhandle_t flashlightModelDefHandle; // handle to static renderer model qhandle_t flashlightModelDefHandle; // handle to static renderer model
renderEntity_t hudEntity;
qhandle_t hudHandle;
bool noclip; bool noclip;
bool godmode; bool godmode;
@ -416,9 +419,9 @@ public:
virtual void UpdateFlashlightHolster(); virtual void UpdateFlashlightHolster();
virtual void SetupLaserSight(); virtual void SetupLaserSight();
virtual void UpdateLaserSight( ); virtual void UpdateLaserSight( );
virtual void UpdateVrHud();
void Kill( bool delayRespawn, bool nodamage );
void Kill( bool delayRespawn, bool nodamage );
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location ); virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
void StartFxOnBone(const char *fx, const char *bone); void StartFxOnBone(const char *fx, const char *bone);

View file

@ -462,6 +462,8 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view )
return; return;
} }
player->DrawHUD(hud);
// place the sound origin for the player // place the sound origin for the player
gameSoundWorld->PlaceListener( view->vieworg, view->viewaxis, player->entityNumber + 1, gameLocal.time, hud ? hud->State().GetString( "location" ) : "Undefined" ); gameSoundWorld->PlaceListener( view->vieworg, view->viewaxis, player->entityNumber + 1, gameLocal.time, hud ? hud->State().GetString( "location" ) : "Undefined" );
@ -501,16 +503,6 @@ void idPlayerView::SingleView( idUserInterface *hud, const renderView_t *view )
} }
} }
vrClientInfo *pVRClientInfo = player->GetVRClientInfo();
if (pVRClientInfo != nullptr &&
pVRClientInfo->visible_hud) {
cvarSystem->SetCVarBool("vr_hud", true);
player->DrawHUD(hud);
cvarSystem->SetCVarBool("vr_hud", false);
}
// armor impulse feedback // armor impulse feedback
float armorPulse = ( gameLocal.time - player->lastArmorPulse ) / 250.0f; float armorPulse = ( gameLocal.time - player->lastArmorPulse ) / 250.0f;

View file

@ -406,6 +406,8 @@ public:
idImage * specular2DTableImage; // 2D intensity texture with our specular function with variable specularity idImage * specular2DTableImage; // 2D intensity texture with our specular function with variable specularity
idImage * borderClampImage; // white inside, black outside idImage * borderClampImage; // white inside, black outside
idImage* hudImage;
//-------------------------------------------------------- //--------------------------------------------------------
idImage * AllocImage( const char *name ); idImage * AllocImage( const char *name );

View file

@ -369,6 +369,18 @@ static void R_RGBA8Image( idImage *image ) {
TF_DEFAULT, false, TR_REPEAT, TD_HIGH_QUALITY ); TF_DEFAULT, false, TR_REPEAT, TD_HIGH_QUALITY );
} }
// Koz begin
// used for Hud and PDA surfaces in VR
static void R_VRSurfaceImage( idImage* image )
{
byte *data = (byte*)malloc(1024 * 1024 * 4);
memset( data, 0, sizeof( data ) );
image->GenerateImage( (byte *)data, 1024, 1024,
TF_DEFAULT, false, TR_CLAMP, TD_HIGH_QUALITY );
}
#if 0 #if 0
static void R_RGB8Image( idImage *image ) { static void R_RGB8Image( idImage *image ) {
byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; byte data[DEFAULT_SIZE][DEFAULT_SIZE][4];
@ -1782,6 +1794,9 @@ void idImageManager::Init() {
scratchCubeMapImage = ImageFromFunction("_scratchCubeMap", makeNormalizeVectorCubeMap ); scratchCubeMapImage = ImageFromFunction("_scratchCubeMap", makeNormalizeVectorCubeMap );
currentRenderImage = ImageFromFunction("_currentRender", R_RGBA8Image ); currentRenderImage = ImageFromFunction("_currentRender", R_RGBA8Image );
hudImage = ImageFromFunction( "_hudImage", R_VRSurfaceImage ); // R_RGBA8Image );
cmdSystem->AddCommand( "reloadImages", R_ReloadImages_f, CMD_FL_RENDERER, "reloads images" ); cmdSystem->AddCommand( "reloadImages", R_ReloadImages_f, CMD_FL_RENDERER, "reloads images" );
cmdSystem->AddCommand( "listImages", R_ListImages_f, CMD_FL_RENDERER, "lists images" ); cmdSystem->AddCommand( "listImages", R_ListImages_f, CMD_FL_RENDERER, "lists images" );
cmdSystem->AddCommand( "combineCubeImages", R_CombineCubeImages_f, CMD_FL_RENDERER, "combines six images for roq compression" ); cmdSystem->AddCommand( "combineCubeImages", R_CombineCubeImages_f, CMD_FL_RENDERER, "combines six images for roq compression" );

View file

@ -1197,18 +1197,9 @@ idWindow::Redraw
================ ================
*/ */
enum eScalingType {
NONE,
SCALETO43,
VRHUD
};
void idWindow::Redraw(float x, float y) { void idWindow::Redraw(float x, float y) {
idStr str; idStr str;
static int recursiveCount = 0;
recursiveCount++;
if (r_skipGuiShaders.GetInteger() == 1 || dc == NULL ) { if (r_skipGuiShaders.GetInteger() == 1 || dc == NULL ) {
return; return;
} }
@ -1223,32 +1214,19 @@ void idWindow::Redraw(float x, float y) {
return; return;
} }
eScalingType scalingType = NONE;
// DG: allow scaling menus to 4:3 // DG: allow scaling menus to 4:3
bool fixupFor43 = false;
if ( flags & WIN_DESKTOP ) { if ( flags & WIN_DESKTOP ) {
// only scale desktop windows (will automatically scale its sub-windows) // only scale desktop windows (will automatically scale its sub-windows)
// that EITHER have the scaleto43 flag set OR are fullscreen menus and r_scaleMenusTo43 is 1 // that EITHER have the scaleto43 flag set OR are fullscreen menus and r_scaleMenusTo43 is 1
if( (flags & WIN_SCALETO43) || if( (flags & WIN_SCALETO43) ||
((flags & WIN_MENUGUI) && r_scaleMenusTo43.GetBool()) ) ((flags & WIN_MENUGUI) && r_scaleMenusTo43.GetBool()) )
{ {
scalingType = SCALETO43; fixupFor43 = true;
dc->SetMenuScaleFix(true); dc->SetMenuScaleFix(true);
} }
} }
if (scalingType == NONE) {
bool scaledHUDForVR = cvarSystem->GetCVarBool("vr_hud");
if (scaledHUDForVR) {
scalingType = VRHUD;
//Only set this on the first call
if (recursiveCount == 1) {
dc->SetMenuScaleForVR(true);
}
}
}
if ( flags & WIN_SHOWTIME ) { if ( flags & WIN_SHOWTIME ) {
dc->DrawText(va(" %0.1f seconds\n%s", (float)(time - timeLine) / 1000, gui->State().GetString("name")), 0.35f, 0, dc->colorWhite, idRectangle(100, 0, 80, 80), false); dc->DrawText(va(" %0.1f seconds\n%s", (float)(time - timeLine) / 1000, gui->State().GetString("name")), 0.35f, 0, dc->colorWhite, idRectangle(100, 0, 80, 80), false);
} }
@ -1261,14 +1239,7 @@ void idWindow::Redraw(float x, float y) {
} }
if (!visible) { if (!visible) {
if (scalingType == SCALETO43) { // DG: gotta reset that before returning this function if (fixupFor43) { // DG: gotta reset that before returning this function
dc->SetMenuScaleFix(false);
}
recursiveCount--;
if (scalingType == VRHUD &&
recursiveCount == 0)
{
dc->SetMenuScaleFix(false); dc->SetMenuScaleFix(false);
} }
return; return;
@ -1278,8 +1249,8 @@ void idWindow::Redraw(float x, float y) {
SetFont(); SetFont();
//if (flags & WIN_DESKTOP) { //if (flags & WIN_DESKTOP) {
// see if this window forces a new aspect ratio // see if this window forces a new aspect ratio
dc->SetSize(forceAspectWidth, forceAspectHeight); dc->SetSize(forceAspectWidth, forceAspectHeight);
//} //}
//FIXME: go to screen coord tracking //FIXME: go to screen coord tracking
@ -1339,14 +1310,7 @@ void idWindow::Redraw(float x, float y) {
dc->EnableClipping(true); dc->EnableClipping(true);
} }
if (scalingType == SCALETO43) { // DG: gotta reset that before returning this function if (fixupFor43) { // DG: gotta reset that before returning this function
dc->SetMenuScaleFix(false);
}
recursiveCount--;
if (scalingType == VRHUD &&
recursiveCount == 0)
{
dc->SetMenuScaleFix(false); dc->SetMenuScaleFix(false);
} }

View file

@ -0,0 +1,14 @@
vr/hud
{
qer_editorimage textures/zaphod/shotgun_laser.TGA
translucent
noShadows
{
blend add
map _hudImage
}
}

Binary file not shown.