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 <num>

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."
This commit is contained in:
Robert Osfield
2006-03-13 21:29:17 +00:00
parent d50f2e3add
commit 2b61cf0a1e
4 changed files with 36 additions and 10 deletions

View File

@@ -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;
};

View File

@@ -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 <num>","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());
}
}

View File

@@ -23,6 +23,11 @@
#include <osgProducer/OsgCameraGroup>
#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
}
}
}

View File

@@ -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);