Files
flightgear/src/Viewer/splash.hxx
T
2022-10-20 20:29:11 +08:00

148 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