Added --geometry, --geometry-vbo and --geometry-va command line options and associated geometry test codes
This commit is contained in:
parent
4dd8ad2f16
commit
3754dc4230
@ -21,6 +21,7 @@
|
|||||||
#include <osg/Texture1D>
|
#include <osg/Texture1D>
|
||||||
#include <osg/Texture2D>
|
#include <osg/Texture2D>
|
||||||
#include <osg/Texture3D>
|
#include <osg/Texture3D>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
|
||||||
#include <osgViewer/Viewer>
|
#include <osgViewer/Viewer>
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ class MemoryTest : public osg::Referenced
|
|||||||
class GLObject : public osg::Referenced
|
class GLObject : public osg::Referenced
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual void apply(osg::State& state) = 0;
|
virtual void apply(osg::RenderInfo& renderInfo) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLMemoryTest : public MemoryTest
|
class GLMemoryTest : public MemoryTest
|
||||||
@ -100,11 +101,11 @@ class StateAttributeObject : public GLObject
|
|||||||
|
|
||||||
StateAttributeObject(osg::StateAttribute* sa): _attribute(sa) {}
|
StateAttributeObject(osg::StateAttribute* sa): _attribute(sa) {}
|
||||||
|
|
||||||
void apply(osg::State& state)
|
void apply(osg::RenderInfo& renderInfo)
|
||||||
{
|
{
|
||||||
_attribute->apply(state);
|
_attribute->apply(*renderInfo.getState());
|
||||||
|
|
||||||
if (state.checkGLErrors(_attribute.get()))
|
if (renderInfo.getState()->checkGLErrors(_attribute.get()))
|
||||||
{
|
{
|
||||||
throw "OpenGL error";
|
throw "OpenGL error";
|
||||||
}
|
}
|
||||||
@ -120,7 +121,7 @@ class TextureTest : public GLMemoryTest
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TextureTest(int width=1, int height=1, int depth=1):
|
TextureTest(int width=256, int height=256, int depth=1):
|
||||||
_width(width),
|
_width(width),
|
||||||
_height(height),
|
_height(height),
|
||||||
_depth(depth) {}
|
_depth(depth) {}
|
||||||
@ -175,9 +176,10 @@ class TextureTest : public GLMemoryTest
|
|||||||
int _depth;
|
int _depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Texture test
|
// FrameBufferObject test
|
||||||
class FboTest : public GLMemoryTest
|
class FboTest : public GLMemoryTest
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -205,6 +207,107 @@ class FboTest : public GLMemoryTest
|
|||||||
int _depth;
|
int _depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Wrap Drawable
|
||||||
|
class DrawableObject : public GLObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DrawableObject(osg::Drawable* drawable): _drawable(drawable) {}
|
||||||
|
|
||||||
|
void apply(osg::RenderInfo& renderInfo)
|
||||||
|
{
|
||||||
|
_drawable->draw(renderInfo);
|
||||||
|
|
||||||
|
if (renderInfo.getState()->checkGLErrors("Drawable"))
|
||||||
|
{
|
||||||
|
throw "OpenGL error";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Drawable> _drawable;
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Geometry test
|
||||||
|
class GeometryTest : public GLMemoryTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum GLObjectType
|
||||||
|
{
|
||||||
|
VERTEX_ARRAY,
|
||||||
|
DISPLAY_LIST,
|
||||||
|
VERTEX_BUFFER_OBJECT
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
GeometryTest(GLObjectType type, int width=64, int height=64):
|
||||||
|
_glObjectType(type),
|
||||||
|
_width(width),
|
||||||
|
_height(height) {}
|
||||||
|
|
||||||
|
virtual GLObject* allocate()
|
||||||
|
{
|
||||||
|
unsigned int numVertices = _width * _height;
|
||||||
|
osg::Vec3Array* vertices = new osg::Vec3Array(numVertices);
|
||||||
|
for(unsigned int j=0; j<_height; ++j)
|
||||||
|
{
|
||||||
|
for(unsigned i=0; i<_width; ++i)
|
||||||
|
{
|
||||||
|
(*vertices)[i+j*_width].set(float(i),float(j),0.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int numIndices = (_width-1) * (_height-1) * 4;
|
||||||
|
osg::DrawElementsUShort* quads = new osg::DrawElementsUShort(GL_QUADS);
|
||||||
|
quads->reserve(numIndices);
|
||||||
|
for(unsigned int j=0; j<_height-1; ++j)
|
||||||
|
{
|
||||||
|
for(unsigned i=0; i<_width-1; ++i)
|
||||||
|
{
|
||||||
|
quads->push_back(i + j*_width);
|
||||||
|
quads->push_back(i+1 + j*_width);
|
||||||
|
quads->push_back(i+1 + (j+1)*_width);
|
||||||
|
quads->push_back(i + (j+1)*_width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Geometry* geometry = new osg::Geometry;
|
||||||
|
geometry->setVertexArray(vertices);
|
||||||
|
geometry->addPrimitiveSet(quads);
|
||||||
|
|
||||||
|
switch(_glObjectType)
|
||||||
|
{
|
||||||
|
case(VERTEX_ARRAY):
|
||||||
|
geometry->setUseDisplayList(false);
|
||||||
|
geometry->setUseVertexBufferObjects(false);
|
||||||
|
break;
|
||||||
|
case(DISPLAY_LIST):
|
||||||
|
geometry->setUseDisplayList(true);
|
||||||
|
geometry->setUseVertexBufferObjects(false);
|
||||||
|
break;
|
||||||
|
case(VERTEX_BUFFER_OBJECT):
|
||||||
|
geometry->setUseDisplayList(false);
|
||||||
|
geometry->setUseVertexBufferObjects(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new DrawableObject(geometry);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
GLObjectType _glObjectType;
|
||||||
|
int _width;
|
||||||
|
int _height;
|
||||||
|
};
|
||||||
|
|
||||||
int main( int argc, char **argv )
|
int main( int argc, char **argv )
|
||||||
{
|
{
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
@ -227,6 +330,15 @@ int main( int argc, char **argv )
|
|||||||
while(arguments.read("--fbo",width,height)) { tests.push_back(new FboTest(width,height,2)); }
|
while(arguments.read("--fbo",width,height)) { tests.push_back(new FboTest(width,height,2)); }
|
||||||
while(arguments.read("--fbo")) { tests.push_back(new FboTest(1024,1024,2)); }
|
while(arguments.read("--fbo")) { tests.push_back(new FboTest(1024,1024,2)); }
|
||||||
|
|
||||||
|
while(arguments.read("--geometry",width,height)) { tests.push_back(new GeometryTest(GeometryTest::DISPLAY_LIST,width,height)); }
|
||||||
|
while(arguments.read("--geometry")) { tests.push_back(new GeometryTest(GeometryTest::DISPLAY_LIST,64,64)); }
|
||||||
|
|
||||||
|
while(arguments.read("--geometry-vbo",width,height)) { tests.push_back(new GeometryTest(GeometryTest::VERTEX_BUFFER_OBJECT,width,height)); }
|
||||||
|
while(arguments.read("--geometry-vbo")) { tests.push_back(new GeometryTest(GeometryTest::VERTEX_BUFFER_OBJECT,64,64)); }
|
||||||
|
|
||||||
|
while(arguments.read("--geometry-va",width,height)) { tests.push_back(new GeometryTest(GeometryTest::VERTEX_ARRAY,width,height)); }
|
||||||
|
while(arguments.read("--geometry-va")) { tests.push_back(new GeometryTest(GeometryTest::VERTEX_ARRAY,64,64)); }
|
||||||
|
|
||||||
unsigned int sleepTime = 0;
|
unsigned int sleepTime = 0;
|
||||||
while(arguments.read("--delay",sleepTime)) {}
|
while(arguments.read("--delay",sleepTime)) {}
|
||||||
|
|
||||||
@ -293,6 +405,9 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
context->makeCurrent();
|
context->makeCurrent();
|
||||||
|
|
||||||
|
osg::RenderInfo renderInfo;
|
||||||
|
renderInfo.setState(context->getState());
|
||||||
|
|
||||||
for(GLObjects::iterator gitr = glObjects.begin();
|
for(GLObjects::iterator gitr = glObjects.begin();
|
||||||
gitr != glObjects.end();
|
gitr != glObjects.end();
|
||||||
++gitr)
|
++gitr)
|
||||||
@ -301,7 +416,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
printf("%i ",numGLObjectsApplied);fflush(stdout);
|
printf("%i ",numGLObjectsApplied);fflush(stdout);
|
||||||
|
|
||||||
(*gitr)->apply(*(context->getState()));
|
(*gitr)->apply(renderInfo);
|
||||||
++numGLObjectsApplied;
|
++numGLObjectsApplied;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user