Skip to content

Commit

Permalink
Merge pull request #16437 from lvonasek/feature_openxr_hud_improvement
Browse files Browse the repository at this point in the history
OpenXR - HUD improvements
  • Loading branch information
hrydgard committed Nov 25, 2022
2 parents 612ad59 + aa66b93 commit 9c033fb
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 15 deletions.
10 changes: 5 additions & 5 deletions Common/VR/PPSSPPVR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,9 +316,9 @@ void UpdateVRInput(bool(*NativeAxis)(const AxisInput &axis), bool(*NativeKey)(co
g_Config.fCameraHeight = clampFloat(g_Config.fCameraHeight, -50.0f, 50.0f);
break;
case JOYSTICK_AXIS_Z:
if (axis.second < -0.75f) g_Config.fFieldOfViewPercentage -= 1.0f;
if (axis.second > 0.75f) g_Config.fFieldOfViewPercentage += 1.0f;
g_Config.fFieldOfViewPercentage = clampFloat(g_Config.fFieldOfViewPercentage, 100.0f, 200.0f);
if (axis.second < -0.75f) g_Config.fHeadUpDisplayScale -= 0.01f;
if (axis.second > 0.75f) g_Config.fHeadUpDisplayScale += 0.01f;
g_Config.fHeadUpDisplayScale = clampFloat(g_Config.fHeadUpDisplayScale, 0.2f, 1.0f);
break;
case JOYSTICK_AXIS_RZ:
if (axis.second > 0.75f) g_Config.fCameraDistance -= 0.1f;
Expand Down Expand Up @@ -430,7 +430,7 @@ bool UpdateVRKeys(const KeyInput &key) {
g_Config.fCameraHeight = 0;
g_Config.fCameraSide = 0;
g_Config.fCameraDistance = 0;
g_Config.fFieldOfViewPercentage = 100;
g_Config.fHeadUpDisplayScale = 0.3f;
}

//block keys by camera adjust
Expand Down Expand Up @@ -727,7 +727,7 @@ bool Is2DVRObject(float* projMatrix, bool ortho) {
if (!identity && !ortho) {
vr3DGeometryCount++;
}
return identity;
return identity || ortho;
}

void UpdateVRParams(float* projMatrix, float* viewMatrix) {
Expand Down
1 change: 1 addition & 0 deletions Core/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1214,6 +1214,7 @@ static ConfigSetting vrSettings[] = {
ConfigSetting("VRCameraSide", &g_Config.fCameraSide, 0.0f),
ConfigSetting("VRCanvasDistance", &g_Config.fCanvasDistance, 6.0f),
ConfigSetting("VRFieldOfView", &g_Config.fFieldOfViewPercentage, 100.0f),
ConfigSetting("VRHeadUpDisplayScale", &g_Config.fHeadUpDisplayScale, 0.3f),
ConfigSetting("VRMotionLength", &g_Config.fMotionLength, 0.5f),

ConfigSetting(false),
Expand Down
1 change: 1 addition & 0 deletions Core/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ struct Config {
float fCameraSide;
float fCanvasDistance;
float fFieldOfViewPercentage;
float fHeadUpDisplayScale;
float fMotionLength;

// Debugger
Expand Down
40 changes: 30 additions & 10 deletions GPU/GLES/ShaderManagerGLES.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,33 @@ static inline void FlipProjMatrix(Matrix4x4 &in, bool useBufferedRendering) {
}
}

static inline bool GuessVRDrawingHUD(bool is2D, bool flatScreen) {

bool hud = true;
//HUD cannot be rendered in flatscreen
if (flatScreen) hud = false;
//HUD has to be 2D
else if (!is2D) hud = false;
//HUD has to be blended
else if (!gstate.isAlphaBlendEnabled()) hud = false;
//HUD cannot be rendered with clear color mask
else if (gstate.isClearModeColorMask()) hud = false;
//HUD cannot be rendered with fog on
else if (gstate.isFogEnabled()) hud = false;
//HUD cannot be rendered with lights on
else if (gstate.isLightingEnabled()) hud = false;
//HUD texture has to contain alpha channel
else if (!gstate.isTextureAlphaUsed()) hud = false;
//HUD cannot have full alpha
else if (gstate_c.textureFullAlpha) hud = false;
//HUD cannot render FB screenshot
else if (gstate_c.curTextureHeight == 272) hud = false;
//HUD cannot render far plane
else if ((fabs(gstate.viewMatrix[9]) > 100) || (fabs(gstate.viewMatrix[11]) > 100)) hud = false;

return hud;
}

void LinkedShader::use(const ShaderID &VSID) {
render_->BindProgram(program);
// Note that we no longer track attr masks here - we do it for the input layouts instead.
Expand Down Expand Up @@ -385,16 +412,9 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu

// Set HUD mode
if (gstate_c.Use(GPU_USE_VIRTUAL_REALITY)) {
bool is3D = gstate.isDepthWriteEnabled();
bool hud = is2D && !is3D && !flatScreen &&
gstate.isModeThrough() && //2D content requires orthographic projection
gstate.isAlphaBlendEnabled() && //2D content has to be blended
!gstate.isLightingEnabled() && //2D content cannot be rendered with lights on
!gstate.isFogEnabled(); //2D content cannot be rendered with fog on
if (hud) {
float scale = 0.5f;
render_->SetUniformF1(&u_scaleX, scale);
render_->SetUniformF1(&u_scaleY, scale / 480.0f * 272.0f);
if (GuessVRDrawingHUD(is2D, flatScreen)) {
render_->SetUniformF1(&u_scaleX, g_Config.fHeadUpDisplayScale * 480.0f / 272.0f);
render_->SetUniformF1(&u_scaleY, g_Config.fHeadUpDisplayScale);
} else {
render_->SetUniformF1(&u_scaleX, 1.0f);
render_->SetUniformF1(&u_scaleY, 1.0f);
Expand Down
1 change: 1 addition & 0 deletions UI/GameSettingsScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1055,6 +1055,7 @@ void GameSettingsScreen::CreateViews() {
vrSettings->Add(new ItemHeader(vr->T("VR camera")));
vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fCanvasDistance, 1.0f, 15.0f, vr->T("Distance to 2D menus and scenes"), 1.0f, screenManager(), ""));
vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fFieldOfViewPercentage, 100.0f, 200.0f, vr->T("Field of view scale"), 10.0f, screenManager(), vr->T("% of native FoV")));
vrSettings->Add(new PopupSliderChoiceFloat(&g_Config.fHeadUpDisplayScale, 0.2f, 1.0f, vr->T("Heads-up display scale"), 0.1f, screenManager(), ""));

vrSettings->Add(new ItemHeader(vr->T("VR controllers")));
vrSettings->Add(new CheckBox(&g_Config.bEnableMotions, vr->T("Map controller movements to keys")));
Expand Down

0 comments on commit 9c033fb

Please sign in to comment.