Use a quad composition layer object from osgXR 0.3.9 to make the splash screen VR friendly. This allows the OpenXR compositor to redraw the quad without any updates from flightgear, which is particularly helpful as flightgear makes no attempt at a reasonable VR frame rate during initialisation. The quad is positioned 2 meters from the user, with an aspect ratio matching the desktop window. The quad is blended using an unpremultiplied alpha channel which is forced to a given alpha value by osgXR. The splash is effectively already rendered to an FBO as non-linear SRGB, so this is made explicit in the internal texture format, with the rendering to the desktop window using GL_FRAMEBUFFER_SRGB to ensure it is properly re-encoded.
147 lines
4.3 KiB
C++
147 lines
4.3 KiB
C++
// splash.hxx -- draws the initial splash screen
|
|
//
|
|
// Written by Curtis Olson, started July 1998. (With a little looking
|
|
// at Freidemann's panel code.) :-)
|
|
//
|
|
// Copyright (C) 1997 Michele F. America - nomimarketing@mail.telepac.pt
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public License as
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful, but
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
//
|
|
// $Id$
|
|
|
|
|
|
#ifndef _SPLASH_HXX
|
|
#define _SPLASH_HXX
|
|
|
|
#include <config.h>
|
|
|
|
#include <osg/Group>
|
|
#include <osgText/Text>
|
|
|
|
#ifdef ENABLE_OSGXR
|
|
#include <osgXR/CompositionLayerQuad>
|
|
#include <osgXR/Swapchain>
|
|
#endif
|
|
|
|
#include <simgear/props/props.hxx>
|
|
#include <simgear/timing/timestamp.hxx>
|
|
|
|
#include <vector>
|
|
|
|
namespace osg
|
|
{
|
|
class Texture2D;
|
|
class Image;
|
|
class Camera;
|
|
}
|
|
|
|
class SplashScreen : public osg::Group
|
|
{
|
|
public:
|
|
SplashScreen();
|
|
~SplashScreen();
|
|
|
|
void resize(int width, int height);
|
|
|
|
private:
|
|
// model-content or content
|
|
struct TextItem
|
|
{
|
|
osg::ref_ptr<osgText::Text> textNode;
|
|
SGPropertyNode_ptr dynamicContent;
|
|
osg::Vec2 fractionalPosition; // position in the 0.0 .. 1.0 range
|
|
double fractionalCharSize;
|
|
double maxWidthFraction = -1.0;
|
|
unsigned int maxLineCount = 0;
|
|
double maxHeightFraction = -1.0;
|
|
SGCondition* condition;
|
|
unsigned int drawMode;
|
|
void recomputeSize(int height) const;
|
|
void reposition(int width, int height) const;
|
|
|
|
};
|
|
// used to manage the displayed images on the splash screen
|
|
struct ImageItem
|
|
{
|
|
std::string name;
|
|
double x;
|
|
double y;
|
|
double width;
|
|
double height;
|
|
bool isBackground;
|
|
double aspectRatio;
|
|
int imageWidth;
|
|
int imageHeight;
|
|
osg::ref_ptr<osg::Vec3Array> vertexArray = nullptr;
|
|
osg::ref_ptr<osg::Image> Image = nullptr;
|
|
SGCondition* condition;
|
|
osg::Node::NodeMask nodeMask;
|
|
osg::Geode* geode;
|
|
};
|
|
|
|
friend class SplashScreenUpdateCallback;
|
|
|
|
void createNodes();
|
|
void CreateTextFromNode(const SGPropertyNode_ptr& content, osg::Geode* geode, bool modelContent);
|
|
|
|
void doUpdate();
|
|
void updateSplashSpinner();
|
|
void updateTipText();
|
|
|
|
std::string selectSplashImage();
|
|
|
|
TextItem* addText(osg::Geode* geode, const osg::Vec2& pos, double size, const std::string& text,
|
|
const osgText::Text::AlignmentType alignment,
|
|
SGPropertyNode* dynamicValue = nullptr,
|
|
double maxWidthFraction = -1.0,
|
|
const osg::Vec4& textColor = osg::Vec4(1, 1, 1, 1),
|
|
const std::string &fontFace = "Fonts/LiberationFonts/LiberationSans-BoldItalic.ttf");
|
|
|
|
osg::ref_ptr<osg::Camera> createFBOCamera();
|
|
void manuallyResizeFBO(int width, int height);
|
|
|
|
bool _legacySplashScreenMode = false;
|
|
SGPropertyNode_ptr _splashAlphaNode;
|
|
osg::ref_ptr<osg::Camera> _splashFBOCamera;
|
|
osg::Vec3Array* _splashSpinnerVertexArray = nullptr;
|
|
|
|
int _width, _height;
|
|
|
|
osg::Texture2D* _splashFBOTexture;
|
|
osg::Vec4Array* _splashFSQuadColor;
|
|
osg::ref_ptr<osg::Camera> _splashQuadCamera;
|
|
|
|
std::vector<ImageItem> _imageItems;
|
|
|
|
#ifdef ENABLE_OSGXR
|
|
// Splash as OpenXR composition layer
|
|
osg::ref_ptr<osgXR::Swapchain> _splashSwapchain;
|
|
osg::ref_ptr<osgXR::CompositionLayerQuad> _splashLayer;
|
|
#endif
|
|
|
|
std::vector<TextItem> _items;
|
|
|
|
SGTimeStamp _splashStartTime;
|
|
bool _haveSetStartupTip = false;
|
|
const ImageItem* addImage(const std::string& path, bool isAbsolutePath, double x, double y, double width, double height, SGPropertyNode* condition, bool isSplash);
|
|
};
|
|
|
|
/** Set progress information.
|
|
* "identifier" references an element of the language resource. */
|
|
void fgSplashProgress ( const char *identifier, unsigned int percent = 0 );
|
|
|
|
#endif // _SPLASH_HXX
|
|
|
|
|