diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index 60f5a12e1..90122038c 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -216,8 +216,12 @@ namespace MWGui getWidget(mControllerSwitch, "ControllerButton"); getWidget(mWaterTextureSize, "WaterTextureSize"); getWidget(mWaterReflectionDetail, "WaterReflectionDetail"); - getWidget(mVRMirrorTextureEye, "VRMirrorTextureEye"); - getWidget(mVRLeftHudPosition, "VRLeftHudPosition"); + + if (MWBase::Environment::get().getVrMode()) + { + getWidget(mVRMirrorTextureEye, "VRMirrorTextureEye"); + getWidget(mVRLeftHudPosition, "VRLeftHudPosition"); + } #ifndef WIN32 // hide gamma controls since it currently does not work under Linux @@ -246,8 +250,11 @@ namespace MWGui mKeyboardSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onKeyboardSwitchClicked); mControllerSwitch->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onControllerSwitchClicked); - mVRMirrorTextureEye->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onVRMirrorTextureEyeChanged); - mVRLeftHudPosition->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onVRLeftHudPositionChanged); + if (MWBase::Environment::get().getVrMode()) + { + mVRMirrorTextureEye->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onVRMirrorTextureEyeChanged); + mVRLeftHudPosition->eventComboChangePosition += MyGUI::newDelegate(this, &SettingsWindow::onVRLeftHudPositionChanged); + } center(); @@ -277,15 +284,18 @@ namespace MWGui std::string tmip = Settings::Manager::getString("texture mipmap", "General"); mTextureFilteringButton->setCaption(textureMipmappingToStr(tmip)); - std::string mirrorTextureEye = Settings::Manager::getString("mirror texture eye", "VR"); - for (unsigned i = 0; i < mVRMirrorTextureEye->getItemCount(); i++) - if (Misc::StringUtils::ciEqual(mirrorTextureEye, mVRMirrorTextureEye->getItem(i))) - mVRMirrorTextureEye->setIndexSelected(i); + if (MWBase::Environment::get().getVrMode()) + { + std::string mirrorTextureEye = Settings::Manager::getString("mirror texture eye", "VR"); + for (unsigned i = 0; i < mVRMirrorTextureEye->getItemCount(); i++) + if (Misc::StringUtils::ciEqual(mirrorTextureEye, mVRMirrorTextureEye->getItem(i))) + mVRMirrorTextureEye->setIndexSelected(i); - std::string leftHandHudPosition = Settings::Manager::getString("left hand hud position", "VR"); - for (unsigned i = 0; i < mVRLeftHudPosition->getItemCount(); i++) - if (Misc::StringUtils::ciEqual(leftHandHudPosition, mVRLeftHudPosition->getItem(i))) - mVRLeftHudPosition->setIndexSelected(i); + std::string leftHandHudPosition = Settings::Manager::getString("left hand hud position", "VR"); + for (unsigned i = 0; i < mVRLeftHudPosition->getItemCount(); i++) + if (Misc::StringUtils::ciEqual(leftHandHudPosition, mVRLeftHudPosition->getItem(i))) + mVRLeftHudPosition->setIndexSelected(i); + } int waterTextureSize = Settings::Manager::getInt("rtt size", "Water"); if (waterTextureSize >= 512) @@ -524,9 +534,12 @@ namespace MWGui MWBase::Environment::get().getInputManager()->processChangedSettings(changed); MWBase::Environment::get().getMechanicsManager()->processChangedSettings(changed); #ifdef USE_OPENXR - MWVR::Environment::get().getSession()->processChangedSettings(changed); - MWVR::Environment::get().getViewer()->processChangedSettings(changed); - MWVR::Environment::get().getGUIManager()->processChangedSettings(changed); + if (MWBase::Environment::get().getVrMode()) + { + MWVR::Environment::get().getSession()->processChangedSettings(changed); + MWVR::Environment::get().getViewer()->processChangedSettings(changed); + MWVR::Environment::get().getGUIManager()->processChangedSettings(changed); + } #endif Settings::Manager::resetPendingChanges(); } diff --git a/apps/openmw/mwvr/openxrswapchainimage.cpp b/apps/openmw/mwvr/openxrswapchainimage.cpp index 002a3bb5f..e7a309808 100644 --- a/apps/openmw/mwvr/openxrswapchainimage.cpp +++ b/apps/openmw/mwvr/openxrswapchainimage.cpp @@ -66,7 +66,6 @@ namespace MWVR { { mFramebuffer->bindFramebuffer(gc, GL_FRAMEBUFFER_EXT); readBuffer.blit(gc, offset_x, offset_y, offset_x + mFramebuffer->width(), offset_y + mFramebuffer->height(), 0, 0, mFramebuffer->width(), mFramebuffer->height(), mBufferBits, GL_NEAREST); - readBuffer.bindFramebuffer(gc, GL_FRAMEBUFFER_EXT); } XrSwapchainImageOpenGLKHR mXrImage; @@ -148,7 +147,6 @@ namespace MWVR { mFramebuffer->bindFramebuffer(gc, GL_FRAMEBUFFER_EXT); readBuffer.blit(gc, offset_x, offset_y, offset_x + mFramebuffer->width(), offset_y + mFramebuffer->height(), 0, mFramebuffer->height(), mFramebuffer->width(), 0, mBufferBits, GL_NEAREST); xr->impl().platform().DXUnlockObject(mDxResourceShareHandle); - readBuffer.bindFramebuffer(gc, GL_FRAMEBUFFER_EXT); // If the d3d11 texture couldn't be shared directly, blit it again. diff --git a/apps/openmw/mwvr/vrframebuffer.cpp b/apps/openmw/mwvr/vrframebuffer.cpp index c889922a6..d8af935fb 100644 --- a/apps/openmw/mwvr/vrframebuffer.cpp +++ b/apps/openmw/mwvr/vrframebuffer.cpp @@ -96,7 +96,6 @@ namespace MWVR void VRFramebuffer::blit(osg::GraphicsContext* gc, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, uint32_t bits, uint32_t filter) { -#define GLERR if(auto err = glGetError() != GL_NO_ERROR) Log(Debug::Verbose) << __FILE__ << "." << __LINE__ << ": " << glGetError() auto* state = gc->getState(); auto* gl = osg::GLExtensions::Get(state->getContextID(), false); gl->glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT, mFBO); @@ -111,13 +110,16 @@ namespace MWVR glGenTextures(1, &image); glBindTexture(mTextureTarget, image); if (mSamples <= 1) + { glTexImage2D(mTextureTarget, 0, formatInternal, mWidth, mHeight, 0, format, GL_UNSIGNED_INT, nullptr); + glTexParameteri(mTextureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB); + glTexParameteri(mTextureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB); + glTexParameteri(mTextureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(mTextureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else gl->glTexImage2DMultisample(mTextureTarget, mSamples, format, mWidth, mHeight, false); - glTexParameteri(mTextureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB); - glTexParameteri(mTextureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB); - glTexParameteri(mTextureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(mTextureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(mTextureTarget, GL_TEXTURE_MAX_LEVEL, 0); return image; diff --git a/apps/openmw/mwvr/vrviewer.cpp b/apps/openmw/mwvr/vrviewer.cpp index b97d7046b..fe00b021a 100644 --- a/apps/openmw/mwvr/vrviewer.cpp +++ b/apps/openmw/mwvr/vrviewer.cpp @@ -11,6 +11,8 @@ #include +#include + #include #include @@ -18,6 +20,8 @@ #include +#include + namespace MWVR { @@ -270,14 +274,18 @@ namespace MWVR //mSwapchain->framebuffer()->blit(gc, 0, 0, mMsaaResolveMirrorTexture->width(), mMsaaResolveMirrorTexture->height(), GL_COLOR_BUFFER_BIT, GL_LINEAR); mFramebuffer->blit(gc, 0, 0, mFramebuffer->width(), mFramebuffer->height(), 0, 0, mMsaaResolveTexture->width(), mMsaaResolveTexture->height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); mFramebuffer->blit(gc, 0, 0, mFramebuffer->width(), mFramebuffer->height(), 0, 0, mMsaaResolveTexture->width(), mMsaaResolveTexture->height(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); - //mMirrorTexture->bindFramebuffer(gc, GL_FRAMEBUFFER_EXT); - gl->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); - mMsaaResolveTexture->blit(gc, 0, 0, mMsaaResolveTexture->width(), mMsaaResolveTexture->height(), 0, 0, screenWidth, screenHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); - //mMirrorTexture->blit(gc, 0, 0, screenWidth, screenHeight, GL_COLOR_BUFFER_BIT); + if (mMirrorTexture) + { + mMirrorTexture->bindFramebuffer(gc, GL_FRAMEBUFFER_EXT); + mMsaaResolveTexture->blit(gc, 0, 0, mMsaaResolveTexture->width(), mMsaaResolveTexture->height(), 0, 0, screenWidth, screenHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); + gl->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); + mMirrorTexture->blit(gc, 0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); + } mSwapchain[0]->endFrame(gc, *mMsaaResolveTexture); mSwapchain[1]->endFrame(gc, *mMsaaResolveTexture); + gl->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); } void @@ -291,7 +299,10 @@ namespace MWVR RealizeOperation::operator()( osg::GraphicsContext* gc) { - return Environment::get().getViewer()->configureXR(gc); + if (Debug::shouldDebugOpenGL()) + Debug::EnableGLDebugOperation()(gc); + + Environment::get().getViewer()->configureXR(gc); } bool