123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447 |
- /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
- *
- * This library is open source and may be redistributed and/or modified under
- * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
- * (at your option) any later version. The full license is in LICENSE file
- * included with this distribution, and on the openscenegraph.org website.
- *
- * This library 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
- * OpenSceneGraph Public License for more details.
- */
- #ifndef OSG_DisplaySettings
- #define OSG_DisplaySettings 1
- #include <osg/Referenced>
- #include <osg/Matrixd>
- #include <osg/ref_ptr>
- #include <string>
- #include <vector>
- #include <map>
- namespace osg {
- // forward declare
- class ArgumentParser;
- class ApplicationUsage;
- /** DisplaySettings class for encapsulating what visuals are required and
- * have been set up, and the status of stereo viewing.*/
- class OSG_EXPORT DisplaySettings : public osg::Referenced
- {
- public:
- /** Maintain a DisplaySettings singleton for objects to query at runtime.*/
- static ref_ptr<DisplaySettings>& instance();
- DisplaySettings():
- Referenced(true)
- {
- setDefaults();
- readEnvironmentalVariables();
- }
- DisplaySettings(ArgumentParser& arguments):
- Referenced(true)
- {
- setDefaults();
- readEnvironmentalVariables();
- readCommandLine(arguments);
- }
- DisplaySettings(const DisplaySettings& vs);
- DisplaySettings& operator = (const DisplaySettings& vs);
- void setDisplaySettings(const DisplaySettings& vs);
- void merge(const DisplaySettings& vs);
- void setDefaults();
- /** read the environmental variables.*/
- void readEnvironmentalVariables();
- /** read the commandline arguments.*/
- void readCommandLine(ArgumentParser& arguments);
- enum DisplayType
- {
- MONITOR,
- POWERWALL,
- REALITY_CENTER,
- HEAD_MOUNTED_DISPLAY
- };
- void setDisplayType(DisplayType type) { _displayType = type; }
- DisplayType getDisplayType() const { return _displayType; }
- void setStereo(bool on) { _stereo = on; }
- bool getStereo() const { return _stereo; }
- enum StereoMode
- {
- QUAD_BUFFER,
- ANAGLYPHIC,
- HORIZONTAL_SPLIT,
- VERTICAL_SPLIT,
- LEFT_EYE,
- RIGHT_EYE,
- HORIZONTAL_INTERLACE,
- VERTICAL_INTERLACE,
- CHECKERBOARD
- };
- void setStereoMode(StereoMode mode) { _stereoMode = mode; }
- StereoMode getStereoMode() const { return _stereoMode; }
- void setEyeSeparation(float eyeSeparation) { _eyeSeparation = eyeSeparation; }
- float getEyeSeparation() const { return _eyeSeparation; }
- enum SplitStereoHorizontalEyeMapping
- {
- LEFT_EYE_LEFT_VIEWPORT,
- LEFT_EYE_RIGHT_VIEWPORT
- };
- void setSplitStereoHorizontalEyeMapping(SplitStereoHorizontalEyeMapping m) { _splitStereoHorizontalEyeMapping = m; }
- SplitStereoHorizontalEyeMapping getSplitStereoHorizontalEyeMapping() const { return _splitStereoHorizontalEyeMapping; }
- void setSplitStereoHorizontalSeparation(int s) { _splitStereoHorizontalSeparation = s; }
- int getSplitStereoHorizontalSeparation() const { return _splitStereoHorizontalSeparation; }
- enum SplitStereoVerticalEyeMapping
- {
- LEFT_EYE_TOP_VIEWPORT,
- LEFT_EYE_BOTTOM_VIEWPORT
- };
- void setSplitStereoVerticalEyeMapping(SplitStereoVerticalEyeMapping m) { _splitStereoVerticalEyeMapping = m; }
- SplitStereoVerticalEyeMapping getSplitStereoVerticalEyeMapping() const { return _splitStereoVerticalEyeMapping; }
- void setSplitStereoVerticalSeparation(int s) { _splitStereoVerticalSeparation = s; }
- int getSplitStereoVerticalSeparation() const { return _splitStereoVerticalSeparation; }
- void setSplitStereoAutoAdjustAspectRatio(bool flag) { _splitStereoAutoAdjustAspectRatio=flag; }
- bool getSplitStereoAutoAdjustAspectRatio() const { return _splitStereoAutoAdjustAspectRatio; }
- void setScreenWidth(float width) { _screenWidth = width; }
- float getScreenWidth() const { return _screenWidth; }
- void setScreenHeight(float height) { _screenHeight = height; }
- float getScreenHeight() const { return _screenHeight; }
- void setScreenDistance(float distance) { _screenDistance = distance; }
- float getScreenDistance() const { return _screenDistance; }
- void setDoubleBuffer(bool flag) { _doubleBuffer = flag; }
- bool getDoubleBuffer() const { return _doubleBuffer; }
- void setRGB(bool flag) { _RGB = flag; }
- bool getRGB() const { return _RGB; }
- void setDepthBuffer(bool flag) { _depthBuffer = flag; }
- bool getDepthBuffer() const { return _depthBuffer; }
- void setMinimumNumAlphaBits(unsigned int bits) { _minimumNumberAlphaBits = bits; }
- unsigned int getMinimumNumAlphaBits() const { return _minimumNumberAlphaBits; }
- bool getAlphaBuffer() const { return _minimumNumberAlphaBits!=0; }
- void setMinimumNumStencilBits(unsigned int bits) { _minimumNumberStencilBits = bits; }
- unsigned int getMinimumNumStencilBits() const { return _minimumNumberStencilBits; }
- bool getStencilBuffer() const { return _minimumNumberStencilBits!=0; }
- void setMinimumNumAccumBits(unsigned int red, unsigned int green, unsigned int blue, unsigned int alpha);
- unsigned int getMinimumNumAccumRedBits() const { return _minimumNumberAccumRedBits; }
- unsigned int getMinimumNumAccumGreenBits() const { return _minimumNumberAccumGreenBits; }
- unsigned int getMinimumNumAccumBlueBits() const { return _minimumNumberAccumBlueBits; }
- unsigned int getMinimumNumAccumAlphaBits() const { return _minimumNumberAccumAlphaBits; }
- bool getAccumBuffer() const { return (_minimumNumberAccumRedBits+_minimumNumberAccumGreenBits+_minimumNumberAccumBlueBits+_minimumNumberAccumAlphaBits)!=0; }
- void setMaxNumberOfGraphicsContexts(unsigned int num);
- unsigned int getMaxNumberOfGraphicsContexts() const;
- void setNumMultiSamples(unsigned int samples) { _numMultiSamples = samples; }
- unsigned int getNumMultiSamples() const { return _numMultiSamples; }
- bool getMultiSamples() const { return _numMultiSamples!=0; }
- void setCompileContextsHint(bool useCompileContexts) { _compileContextsHint = useCompileContexts; }
- bool getCompileContextsHint() const { return _compileContextsHint; }
- void setSerializeDrawDispatch(bool serializeDrawDispatch) { _serializeDrawDispatch = serializeDrawDispatch; }
- bool getSerializeDrawDispatch() const { return _serializeDrawDispatch; }
- void setUseSceneViewForStereoHint(bool hint) { _useSceneViewForStereoHint = hint; }
- bool getUseSceneViewForStereoHint() const { return _useSceneViewForStereoHint; }
- /** Set the hint for the total number of threads in the DatbasePager set up, inclusive of the number of http dedicated threads.*/
- void setNumOfDatabaseThreadsHint(unsigned int numThreads) { _numDatabaseThreadsHint = numThreads; }
- /** Get the hint for total number of threads in the DatbasePager set up, inclusive of the number of http dedicated threads.*/
- unsigned int getNumOfDatabaseThreadsHint() const { return _numDatabaseThreadsHint; }
- /** Set the hint for number of threads in the DatbasePager to dedicate to reading http requests.*/
- void setNumOfHttpDatabaseThreadsHint(unsigned int numThreads) { _numHttpDatabaseThreadsHint = numThreads; }
- /** Get the hint for number of threads in the DatbasePager dedicated to reading http requests.*/
- unsigned int getNumOfHttpDatabaseThreadsHint() const { return _numHttpDatabaseThreadsHint; }
- void setApplication(const std::string& application) { _application = application; }
- const std::string& getApplication() { return _application; }
- void setMaxTexturePoolSize(unsigned int size) { _maxTexturePoolSize = size; }
- unsigned int getMaxTexturePoolSize() const { return _maxTexturePoolSize; }
- void setMaxBufferObjectPoolSize(unsigned int size) { _maxBufferObjectPoolSize = size; }
- unsigned int getMaxBufferObjectPoolSize() const { return _maxBufferObjectPoolSize; }
- /**
- Methods used to set and get defaults for Cameras implicit buffer attachments.
- For more info: See description of Camera::setImplicitBufferAttachment method
- DisplaySettings implicit buffer attachment selection defaults to: DEPTH and COLOR
- for both primary (Render) FBO and secondary Multisample (Resolve) FBO
- ie: IMPLICIT_DEPTH_BUFFER_ATTACHMENT | IMPLICIT_COLOR_BUFFER_ATTACHMENT
- **/
- enum ImplicitBufferAttachment
- {
- IMPLICIT_DEPTH_BUFFER_ATTACHMENT = (1 << 0),
- IMPLICIT_STENCIL_BUFFER_ATTACHMENT = (1 << 1),
- IMPLICIT_COLOR_BUFFER_ATTACHMENT = (1 << 2),
- DEFAULT_IMPLICIT_BUFFER_ATTACHMENT = IMPLICIT_COLOR_BUFFER_ATTACHMENT | IMPLICIT_DEPTH_BUFFER_ATTACHMENT
- };
- typedef int ImplicitBufferAttachmentMask;
- void setImplicitBufferAttachmentMask(ImplicitBufferAttachmentMask renderMask = DisplaySettings::DEFAULT_IMPLICIT_BUFFER_ATTACHMENT, ImplicitBufferAttachmentMask resolveMask = DisplaySettings::DEFAULT_IMPLICIT_BUFFER_ATTACHMENT )
- {
- _implicitBufferAttachmentRenderMask = renderMask;
- _implicitBufferAttachmentResolveMask = resolveMask;
- }
- void setImplicitBufferAttachmentRenderMask(ImplicitBufferAttachmentMask implicitBufferAttachmentRenderMask)
- {
- _implicitBufferAttachmentRenderMask = implicitBufferAttachmentRenderMask;
- }
- void setImplicitBufferAttachmentResolveMask(ImplicitBufferAttachmentMask implicitBufferAttachmentResolveMask)
- {
- _implicitBufferAttachmentResolveMask = implicitBufferAttachmentResolveMask;
- }
- /** Get mask selecting default implicit buffer attachments for Cameras primary FBOs. */
- ImplicitBufferAttachmentMask getImplicitBufferAttachmentRenderMask() const { return _implicitBufferAttachmentRenderMask; }
- /** Get mask selecting default implicit buffer attachments for Cameras secondary MULTISAMPLE FBOs. */
- ImplicitBufferAttachmentMask getImplicitBufferAttachmentResolveMask() const { return _implicitBufferAttachmentResolveMask;}
- enum SwapMethod
- {
- SWAP_DEFAULT, // Leave swap method at default returned by choose Pixel Format.
- SWAP_EXCHANGE, // Flip front / back buffer.
- SWAP_COPY, // Copy back to front buffer.
- SWAP_UNDEFINED // Move back to front buffer leaving contents of back buffer undefined.
- };
- /** Select preferred swap method */
- void setSwapMethod( SwapMethod swapMethod ) { _swapMethod = swapMethod; }
- /** Get preferred swap method */
- SwapMethod getSwapMethod( void ) { return _swapMethod; }
- /** Set whether Arb Sync should be used to manage the swaps buffers, 0 disables the use of the sync, greater than zero enables sync based on number of frames specified.*/
- void setSyncSwapBuffers(unsigned int numFrames=0) { _syncSwapBuffers = numFrames; }
- /** Set whether Arb Sync should be used to manage the swaps buffers.*/
- unsigned int getSyncSwapBuffers() const { return _syncSwapBuffers; }
- /** Set the hint of which OpenGL version to attempt to create a graphics context for.*/
- void setGLContextVersion(const std::string& version) { _glContextVersion = version; }
- /** Get the hint of which OpenGL version to attempt to create a graphics context for.*/
- const std::string getGLContextVersion() const { return _glContextVersion; }
- /** Set the hint of the flags to use in when creating graphic contexts.*/
- void setGLContextFlags(unsigned int flags) { _glContextFlags = flags; }
- /** Get the hint of the flags to use in when creating graphic contexts.*/
- unsigned int getGLContextFlags() const { return _glContextFlags; }
- /** Set the hint of the profile mask to use in when creating graphic contexts.*/
- void setGLContextProfileMask(unsigned int mask) { _glContextProfileMask = mask; }
- /** Get the hint of the profile mask to use in when creating graphic contexts.*/
- unsigned int getGLContextProfileMask() const { return _glContextProfileMask; }
- /** Set the NvOptimusEnablement value. Default can be set using OSG_NvOptimusEnablement env var.*/
- void setNvOptimusEnablement(int value);
- /** Get the NvOptimusEnablement value. */
- int getNvOptimusEnablement() const;
- enum VertexBufferHint
- {
- NO_PREFERENCE,
- VERTEX_BUFFER_OBJECT,
- VERTEX_ARRAY_OBJECT
- };
- void setVertexBufferHint(VertexBufferHint gi) { _vertexBufferHint = gi; }
- VertexBufferHint getVertexBufferHint() const { return _vertexBufferHint; }
- enum ShaderHint
- {
- SHADER_NONE,
- SHADER_GL2,
- SHADER_GLES2,
- SHADER_GL3,
- SHADER_GLES3
- };
- /** set the ShaderHint to tells shader generating cdoes version to create.
- * By default also OSG_GLSL_VERSION and OSG_PRECISION_FLOAT values that can get use directly in shaders using $OSG_GLSL_VERSION and $OSG_PRECISION_FLOAT respectively.*/
- void setShaderHint(ShaderHint hint, bool setShaderValues=true);
- ShaderHint getShaderHint() const { return _shaderHint; }
- /** Set the TextShaderTechnique that is used in the Text default constructor to choose which osgText::ShaderTechnique to use.*/
- void setTextShaderTechnique(const std::string& str) { _textShaderTechnique = str; }
- const std::string& getTextShaderTechnique() const { return _textShaderTechnique; }
- void setKeystoneHint(bool enabled) { _keystoneHint = enabled; }
- bool getKeystoneHint() const { return _keystoneHint; }
- typedef std::vector<std::string> FileNames;
- void setKeystoneFileNames(const FileNames& filenames) { _keystoneFileNames = filenames; }
- FileNames& getKeystoneFileNames() { return _keystoneFileNames; }
- const FileNames& getKeystoneFileNames() const { return _keystoneFileNames; }
- typedef std::vector< osg::ref_ptr<osg::Object> > Objects;
- void setKeystones(const Objects& objects) { _keystones = objects; }
- Objects& getKeystones() { return _keystones; }
- const Objects& getKeystones() const { return _keystones; }
- enum OSXMenubarBehavior
- {
- MENUBAR_AUTO_HIDE,
- MENUBAR_FORCE_HIDE,
- MENUBAR_FORCE_SHOW
- };
- OSXMenubarBehavior getOSXMenubarBehavior() const { return _OSXMenubarBehavior; }
- void setOSXMenubarBehavior(OSXMenubarBehavior hint) { _OSXMenubarBehavior = hint; }
- /** helper function for computing the left eye projection matrix.*/
- virtual osg::Matrixd computeLeftEyeProjectionImplementation(const osg::Matrixd& projection) const;
- /** helper function for computing the left eye view matrix.*/
- virtual osg::Matrixd computeLeftEyeViewImplementation(const osg::Matrixd& view, double eyeSeperationScale=1.0) const;
- /** helper function for computing the right eye view matrix.*/
- virtual osg::Matrixd computeRightEyeProjectionImplementation(const osg::Matrixd& projection) const;
- /** helper function for computing the right eye view matrix.*/
- virtual osg::Matrixd computeRightEyeViewImplementation(const osg::Matrixd& view, double eyeSeperationScale=1.0) const;
- void setValue(const std::string& name, const std::string& value);
- bool getValue(const std::string& name, std::string& value, bool use_getenv_fallback=true) const;
- protected:
- virtual ~DisplaySettings();
- DisplayType _displayType;
- bool _stereo;
- StereoMode _stereoMode;
- float _eyeSeparation;
- float _screenWidth;
- float _screenHeight;
- float _screenDistance;
- SplitStereoHorizontalEyeMapping _splitStereoHorizontalEyeMapping;
- int _splitStereoHorizontalSeparation;
- SplitStereoVerticalEyeMapping _splitStereoVerticalEyeMapping;
- int _splitStereoVerticalSeparation;
- bool _splitStereoAutoAdjustAspectRatio;
- bool _doubleBuffer;
- bool _RGB;
- bool _depthBuffer;
- unsigned int _minimumNumberAlphaBits;
- unsigned int _minimumNumberStencilBits;
- unsigned int _minimumNumberAccumRedBits;
- unsigned int _minimumNumberAccumGreenBits;
- unsigned int _minimumNumberAccumBlueBits;
- unsigned int _minimumNumberAccumAlphaBits;
- unsigned int _maxNumOfGraphicsContexts;
- unsigned int _numMultiSamples;
- bool _compileContextsHint;
- bool _serializeDrawDispatch;
- bool _useSceneViewForStereoHint;
- unsigned int _numDatabaseThreadsHint;
- unsigned int _numHttpDatabaseThreadsHint;
- std::string _application;
- unsigned int _maxTexturePoolSize;
- unsigned int _maxBufferObjectPoolSize;
- ImplicitBufferAttachmentMask _implicitBufferAttachmentRenderMask;
- ImplicitBufferAttachmentMask _implicitBufferAttachmentResolveMask;
- std::string _glContextVersion;
- unsigned int _glContextFlags;
- unsigned int _glContextProfileMask;
- SwapMethod _swapMethod;
- unsigned int _syncSwapBuffers;
- VertexBufferHint _vertexBufferHint;
- ShaderHint _shaderHint;
- std::string _textShaderTechnique;
- bool _keystoneHint;
- FileNames _keystoneFileNames;
- Objects _keystones;
- OSXMenubarBehavior _OSXMenubarBehavior;
- typedef std::map<std::string, std::string> ValueMap;
- mutable OpenThreads::Mutex _valueMapMutex;
- mutable ValueMap _valueMap;
- };
- }
- # endif
|