Splash : restore macOS compatibility
Change to sRGB frame-buffer unfortunately broke macOS compatibility; restore it by reverting to the internal format there.
This commit is contained in:
parent
8b036f9353
commit
745aef04ea
1 changed files with 39 additions and 8 deletions
|
@ -50,14 +50,16 @@
|
||||||
#include <simgear/structure/OSGUtils.hxx>
|
#include <simgear/structure/OSGUtils.hxx>
|
||||||
#include <simgear/props/condition.hxx>
|
#include <simgear/props/condition.hxx>
|
||||||
|
|
||||||
#include <Main/globals.hxx>
|
#include "VRManager.hxx"
|
||||||
#include <Main/fg_props.hxx>
|
#include "renderer.hxx"
|
||||||
|
#include "splash.hxx"
|
||||||
|
#include <GUI/gui.h>
|
||||||
#include <Main/fg_os.hxx>
|
#include <Main/fg_os.hxx>
|
||||||
|
#include <Main/fg_props.hxx>
|
||||||
|
#include <Main/globals.hxx>
|
||||||
#include <Main/locale.hxx>
|
#include <Main/locale.hxx>
|
||||||
#include <Main/util.hxx>
|
#include <Main/util.hxx>
|
||||||
#include "splash.hxx"
|
#include <Viewer/CameraGroup.hxx>
|
||||||
#include "renderer.hxx"
|
|
||||||
#include "VRManager.hxx"
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
@ -103,9 +105,30 @@ SplashScreen::~SplashScreen()
|
||||||
|
|
||||||
void SplashScreen::createNodes()
|
void SplashScreen::createNodes()
|
||||||
{
|
{
|
||||||
|
// The splash FBO is rendered as sRGB, but for VR it needs to be in an sRGB
|
||||||
|
// pixel format for it to be handled as such by OpenXR.
|
||||||
|
bool useSRGB = false;
|
||||||
|
#if !defined(SG_MAC)
|
||||||
|
// SRGB does detect on macOS, but doesn't actually work, so we
|
||||||
|
// disable the check there.
|
||||||
|
osg::Camera* guiCamera = flightgear::getGUICamera(flightgear::CameraGroup::getDefault());
|
||||||
|
if (guiCamera) {
|
||||||
|
osg::GraphicsContext* gc = guiCamera->getGraphicsContext();
|
||||||
|
osg::GLExtensions* glext = gc->getState()->get<osg::GLExtensions>();
|
||||||
|
if (glext) {
|
||||||
|
SG_LOG(SG_VIEW, SG_WARN, "GL version " << glext->glVersion);
|
||||||
|
SG_LOG(SG_VIEW, SG_WARN, "GL_EXT_texture_sRGB " << osg::isGLExtensionSupported(glext->contextID, "GL_EXT_texture_sRGB"));
|
||||||
|
SG_LOG(SG_VIEW, SG_WARN, "GL_EXT_framebuffer_sRGB " << osg::isGLExtensionSupported(glext->contextID, "GL_EXT_framebuffer_sRGB"));
|
||||||
|
useSRGB = osg::isGLExtensionOrVersionSupported(glext->contextID, "GL_EXT_texture_sRGB", 2.1f) &&
|
||||||
|
osg::isGLExtensionOrVersionSupported(glext->contextID, "GL_EXT_framebuffer_sRGB", 3.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SG_LOG(SG_VIEW, SG_INFO, "Splash: useSRGB " << useSRGB);
|
||||||
|
#endif
|
||||||
// setup the base geometry
|
// setup the base geometry
|
||||||
_splashFBOTexture = new osg::Texture2D;
|
_splashFBOTexture = new osg::Texture2D;
|
||||||
_splashFBOTexture->setInternalFormat(GL_SRGB8);
|
_splashFBOTexture->setInternalFormat(useSRGB ? GL_SRGB8 : GL_RGB);
|
||||||
|
|
||||||
_splashFBOTexture->setResizeNonPowerOfTwoHint(false);
|
_splashFBOTexture->setResizeNonPowerOfTwoHint(false);
|
||||||
_splashFBOTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
|
_splashFBOTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
|
||||||
_splashFBOTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
_splashFBOTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
||||||
|
@ -240,8 +263,11 @@ void SplashScreen::createNodes()
|
||||||
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
stateSet->setRenderBinDetails(1000, "RenderBin");
|
stateSet->setRenderBinDetails(1000, "RenderBin");
|
||||||
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
||||||
stateSet->setMode(GL_FRAMEBUFFER_SRGB, osg::StateAttribute::ON);
|
|
||||||
|
if (useSRGB) {
|
||||||
|
stateSet->setMode(GL_FRAMEBUFFER_SRGB, osg::StateAttribute::ON);
|
||||||
|
}
|
||||||
|
|
||||||
geometry = osg::createTexturedQuadGeometry(osg::Vec3(0.0, 0.0, 0.0),
|
geometry = osg::createTexturedQuadGeometry(osg::Vec3(0.0, 0.0, 0.0),
|
||||||
osg::Vec3(1.0, 0.0, 0.0),
|
osg::Vec3(1.0, 0.0, 0.0),
|
||||||
osg::Vec3(0.0, 1.0, 0.0));
|
osg::Vec3(0.0, 1.0, 0.0));
|
||||||
|
@ -585,6 +611,11 @@ std::string SplashScreen::selectSplashImage()
|
||||||
|
|
||||||
void SplashScreen::doUpdate()
|
void SplashScreen::doUpdate()
|
||||||
{
|
{
|
||||||
|
if (!guiInit()) {
|
||||||
|
// don't createNodes until OSG init operations have completed
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
double alpha = _splashAlphaNode->getDoubleValue();
|
double alpha = _splashAlphaNode->getDoubleValue();
|
||||||
|
|
||||||
if (alpha <= 0 || !fgGetBool("/sim/startup/splash-screen")) {
|
if (alpha <= 0 || !fgGetBool("/sim/startup/splash-screen")) {
|
||||||
|
|
Loading…
Reference in a new issue