OpenSceneGraph/include/osg/PrimitiveRestartIndex

94 lines
3.1 KiB
Plaintext
Raw Normal View History

From Aurelien Albert, Added support for glPrimitiveRestartIndex. "The idea of this new OpenGL feature is : - set RestartIndex = "n" - draw elements strip -> when the index is "n", the strip is "stopped" and restarted It's very usefull for drawing tiles with a single strip and a "restart" at the end of each row. The idea a an OSG StateAttribute is : Usually we use to build geometry from code, because software modelers rarely support it (and 3d file formats doesn't support it) : -RootNode <= "PrimitiveRestartIndex=0" // So now, we know that our restart index is 0 for all drawables under this node | - Drawable 1 : triangles => as usual | - Drawable 2 : triangles strip => as usual | - Drawable 3 : triangles strip + "GL_PRIMITIVE_RESTART" mode = ON => use the restart index | - Drawable 4 : triangles strip + "GL_PRIMITIVE_RESTART" mode = ON => use the restart index | - Drawable 5 : triangles strip => as usual With a StateAttribute, it's easy for the developper to say "0 will be my restart index for all this object" and then activate the mode only on some nodes. The main problem is if you set and restart index value which is not included in the vertex array (for exemple set restart index = 100 but you have only 50 vertex). There is no problem with OpenGL, but some OSG algorithms will try to access the vertex[100] and will segfault. To solve this, I think there is two ways : 1/ add restart index in osg::PrimitiveSet and use this value in all algorithms. It's a lot of work, maybe dangerous, and it concern only a few situations : developpers who use this extension should be aware of advanced OpenGL (and OSG) data management 2/ use a StateAttribute, and choose a "correct" restart index. In my applications, I always use "0" as a restart index and duplicate the first vertex (vertex[0] = vertex[1]). So there is no difference for OpenGL and all OSG algorithms works properly. "
2013-06-28 21:43:46 +08:00
/* -*-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_PRIMITIVERESTARTINDEX
#define OSG_PRIMITIVERESTARTINDEX 1
#include <osg/StateAttribute>
namespace osg {
/**
* osg::PrimitiveRestartIndex does nothing if OpenGL 3.1 is not available.
*/
class OSG_EXPORT PrimitiveRestartIndex : public StateAttribute
{
public :
PrimitiveRestartIndex();
PrimitiveRestartIndex(unsigned int restartIndex);
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
PrimitiveRestartIndex(const PrimitiveRestartIndex& primitiveRestartIndex,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
META_StateAttribute(osg, PrimitiveRestartIndex, PRIMITIVERESTARTINDEX)
/** return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs.*/
virtual int compare(const StateAttribute& sa) const;
inline void setRestartIndex(unsigned int restartIndex ) { _restartIndex = restartIndex; }
inline unsigned int getRestartIndex() const { return _restartIndex; }
virtual void apply(State& state) const;
public:
/** Extensions class which encapsulates the querying of extensions and
* associated function pointers, and provide convenience wrappers to
* check for the extensions or use the associated functions.
*/
class OSG_EXPORT Extensions : public osg::Referenced
{
public:
Extensions(unsigned int contextID);
Extensions(const Extensions& rhs);
void lowestCommonDenominator(const Extensions& rhs);
void setupGLExtensions(unsigned int contextID);
bool isOpenGL31Supported() const { return _isOpenGL31Supported; }
bool isPrimitiveRestartIndexNVSupported() const { return _isPrimitiveRestartIndexNVSupported; }
void glPrimitiveRestartIndex( GLuint index ) const;
protected:
~Extensions() {}
bool _isOpenGL31Supported;
bool _isPrimitiveRestartIndexNVSupported;
typedef void (GL_APIENTRY * PrimitiveRestartIndex)( GLuint index );
PrimitiveRestartIndex _glPrimitiveRestartIndex;
};
static Extensions* getExtensions(unsigned int contextID,bool createIfNotInitalized);
static void setExtensions(unsigned int contextID,Extensions* extensions);
protected:
virtual ~PrimitiveRestartIndex();
unsigned int _restartIndex;
};
}
#endif