From 2b61cf0a1ea1e0c991ffb020f2de9ff3c1f888cc Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 13 Mar 2006 21:29:17 +0000 Subject: [PATCH] From Farshid Lashkari, "The following patch adds a multisample option to the osg::DisplaySettings class. OsgCameraGroup will now read the setting from the DisplaySettings instead of hardcoding the value. I added the following commandline option to be able to set the multisample value: --samples One thing to note, OsgCameraGroup would previously check if the computer is an SGI and set multisample to 4. I retained this check in DisplaySettings to be backwards compatible." --- include/osg/DisplaySettings | 5 +++++ src/osg/DisplaySettings.cpp | 14 ++++++++++++++ src/osgProducer/OsgCameraGroup.cpp | 22 ++++++++++++---------- src/osgWrappers/osg/DisplaySettings.cpp | 5 +++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/include/osg/DisplaySettings b/include/osg/DisplaySettings index 71494926d..d7baf674a 100644 --- a/include/osg/DisplaySettings +++ b/include/osg/DisplaySettings @@ -171,6 +171,9 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced void setMaxNumberOfGraphicsContexts(unsigned int num) { _maxNumOfGraphicsContexts = num; } unsigned int getMaxNumberOfGraphicsContexts() const { return _maxNumOfGraphicsContexts; } + void setNumMultiSamples(unsigned int samples) { _numMultiSamples = samples; } + unsigned int getNumMultiSamples() const { return _numMultiSamples; } + bool getMultiSamples() const { return _numMultiSamples!=0; } protected: @@ -202,6 +205,8 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced unsigned int _minimumNumberAccumAlphaBits; unsigned int _maxNumOfGraphicsContexts; + + unsigned int _numMultiSamples; }; diff --git a/src/osg/DisplaySettings.cpp b/src/osg/DisplaySettings.cpp index b26b720cb..ff75735e3 100644 --- a/src/osg/DisplaySettings.cpp +++ b/src/osg/DisplaySettings.cpp @@ -68,6 +68,7 @@ void DisplaySettings::setDisplaySettings(const DisplaySettings& vs) _minimumNumberStencilBits = vs._minimumNumberStencilBits; _maxNumOfGraphicsContexts = vs._maxNumOfGraphicsContexts; + _numMultiSamples = vs._numMultiSamples; } void DisplaySettings::merge(const DisplaySettings& vs) @@ -82,6 +83,7 @@ void DisplaySettings::merge(const DisplaySettings& vs) if (vs._minimumNumberAlphaBits>_minimumNumberAlphaBits) _minimumNumberAlphaBits = vs._minimumNumberAlphaBits; if (vs._minimumNumberStencilBits>_minimumNumberStencilBits) _minimumNumberStencilBits = vs._minimumNumberStencilBits; + if (vs._numMultiSamples>_numMultiSamples) _numMultiSamples = vs._numMultiSamples; } void DisplaySettings::setDefaults() @@ -114,6 +116,12 @@ void DisplaySettings::setDefaults() _minimumNumberAccumAlphaBits = 0; _maxNumOfGraphicsContexts = 3; + _numMultiSamples = 0; + + #ifdef __sgi + // switch on anti-aliasing by default, just in case we have an Onyx :-) + _numMultiSamples = 4; + #endif } void DisplaySettings::setMinimumNumAccumBits(unsigned int red, unsigned int green, unsigned int blue, unsigned int alpha) @@ -303,6 +311,7 @@ void DisplaySettings::readCommandLine(ArgumentParser& arguments) arguments.getApplicationUsage()->addCommandLineOption("--stencil","Request a stencil buffer visual"); arguments.getApplicationUsage()->addCommandLineOption("--accum-rgb","Request a rgb accumulator buffer visual"); arguments.getApplicationUsage()->addCommandLineOption("--accum-rgba","Request a rgb accumulator buffer visual"); + arguments.getApplicationUsage()->addCommandLineOption("--samples ","Request a multisample visual"); } std::string str; @@ -350,4 +359,9 @@ void DisplaySettings::readCommandLine(ArgumentParser& arguments) { setMinimumNumAccumBits(8,8,8,8); } + + while(arguments.read("--samples",str)) + { + _numMultiSamples = atoi(str.c_str()); + } } diff --git a/src/osgProducer/OsgCameraGroup.cpp b/src/osgProducer/OsgCameraGroup.cpp index c491fadf4..64db575e5 100644 --- a/src/osgProducer/OsgCameraGroup.cpp +++ b/src/osgProducer/OsgCameraGroup.cpp @@ -23,6 +23,11 @@ #include +#ifdef WIN32 +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 +#endif + using namespace Producer; using namespace osgProducer; @@ -430,13 +435,6 @@ bool OsgCameraGroup::realize() drv.setDisplaySettings(_ds.get()); node->accept(drv); } - - unsigned int numMultiSamples = 0; - - #ifdef __sgi - // switch on anti-aliasing by default, just in case we have an Onyx :-) - numMultiSamples = 4; - #endif // set up each render stage to clear the appropriate buffers. GLbitfield clear_mask=0; @@ -503,7 +501,7 @@ bool OsgCameraGroup::realize() rs->setRealizeCallback( new RenderSurfaceRealizeCallback(this, sh)); // set up the visual chooser. - if (_ds.valid() || numMultiSamples!=0) + if (_ds.valid()) { Producer::VisualChooser* rs_vc = rs->getVisualChooser(); @@ -550,14 +548,18 @@ bool OsgCameraGroup::realize() rs_vc->setAccumAlphaSize(_ds->getMinimumNumAccumAlphaBits()); } - if (numMultiSamples) + if (_ds->getMultiSamples()) { #if defined( GLX_SAMPLES_SGIS ) - rs_vc->addExtendedAttribute( GLX_SAMPLES_SGIS, numMultiSamples); + rs_vc->addExtendedAttribute( GLX_SAMPLES_SGIS, _ds->getNumMultiSamples()); #endif #if defined( GLX_SAMPLES_BUFFER_SGIS ) rs_vc->addExtendedAttribute( GLX_SAMPLES_BUFFER_SGIS, 1); #endif + #ifdef WIN32 + rs_vc->addExtendedAttribute(WGL_SAMPLE_BUFFERS_ARB, GL_TRUE); + rs_vc->addExtendedAttribute(WGL_SAMPLES_ARB, _ds->getNumMultiSamples()); + #endif } } } diff --git a/src/osgWrappers/osg/DisplaySettings.cpp b/src/osgWrappers/osg/DisplaySettings.cpp index 08cb45363..462d9a434 100644 --- a/src/osgWrappers/osg/DisplaySettings.cpp +++ b/src/osgWrappers/osg/DisplaySettings.cpp @@ -102,6 +102,9 @@ BEGIN_OBJECT_REFLECTOR(osg::DisplaySettings) I_Method0(bool, getAccumBuffer); I_Method1(void, setMaxNumberOfGraphicsContexts, IN, unsigned int, num); I_Method0(unsigned int, getMaxNumberOfGraphicsContexts); + I_Method1(void, setNumMultiSamples, IN, unsigned int, samples); + I_Method0(unsigned int, getNumMultiSamples); + I_Method0(bool, getMultiSamples); I_ReadOnlyProperty(bool, AccumBuffer); I_ReadOnlyProperty(bool, AlphaBuffer); I_Property(bool, DepthBuffer); @@ -116,6 +119,8 @@ BEGIN_OBJECT_REFLECTOR(osg::DisplaySettings) I_ReadOnlyProperty(unsigned int, MinimumNumAccumRedBits); I_Property(unsigned int, MinimumNumAlphaBits); I_Property(unsigned int, MinimumNumStencilBits); + I_ReadOnlyProperty(bool, MultiSamples); + I_WriteOnlyProperty(unsigned int, NumMultiSamples); I_Property(bool, RGB); I_Property(float, ScreenDistance); I_Property(float, ScreenHeight);