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:
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user