Added handling of large shapes
This commit is contained in:
parent
9a786fd8be
commit
eb59590d77
@ -33,7 +33,7 @@
|
|||||||
// for the grid data..
|
// for the grid data..
|
||||||
#include "../osghangglide/terrain_coords.h"
|
#include "../osghangglide/terrain_coords.h"
|
||||||
|
|
||||||
osg::Geode* createShapes()
|
osg::Geode* createShapes(osg::ArgumentParser& arguments)
|
||||||
{
|
{
|
||||||
osg::Geode* geode = new osg::Geode();
|
osg::Geode* geode = new osg::Geode();
|
||||||
|
|
||||||
@ -70,6 +70,29 @@ osg::Geode* createShapes()
|
|||||||
geode->addDrawable(new osg::ShapeDrawable(new osg::Capsule(osg::Vec3(8.0f,0.0f,0.0f),radius,height),hints));
|
geode->addDrawable(new osg::ShapeDrawable(new osg::Capsule(osg::Vec3(8.0f,0.0f,0.0f),radius,height),hints));
|
||||||
|
|
||||||
osg::HeightField* grid = new osg::HeightField;
|
osg::HeightField* grid = new osg::HeightField;
|
||||||
|
if (arguments.read("--large"))
|
||||||
|
{
|
||||||
|
unsigned int numX = 512;
|
||||||
|
unsigned int numY = 512;
|
||||||
|
double sizeX = 10.0;
|
||||||
|
double sizeY = 10.0;
|
||||||
|
grid->allocate(numX,numY);
|
||||||
|
grid->setXInterval(sizeX/float(numX));
|
||||||
|
grid->setYInterval(sizeY/float(numY));
|
||||||
|
|
||||||
|
for(unsigned int r=0;r<numY;++r)
|
||||||
|
{
|
||||||
|
for(unsigned int c=0;c<numX;++c)
|
||||||
|
{
|
||||||
|
double rx = double(c)/double(numX-1);
|
||||||
|
double ry = double(r)/double(numY-1);
|
||||||
|
|
||||||
|
grid->setHeight(c, r, 2.0*sin(rx*ry*4.0*osg::PI));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
grid->allocate(38,39);
|
grid->allocate(38,39);
|
||||||
grid->setXInterval(0.28f);
|
grid->setXInterval(0.28f);
|
||||||
grid->setYInterval(0.28f);
|
grid->setYInterval(0.28f);
|
||||||
@ -81,6 +104,9 @@ osg::Geode* createShapes()
|
|||||||
grid->setHeight(c,r,vertex[r+c*39][2]);
|
grid->setHeight(c,r,vertex[r+c*39][2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
geode->addDrawable(new osg::ShapeDrawable(grid));
|
geode->addDrawable(new osg::ShapeDrawable(grid));
|
||||||
|
|
||||||
osg::ConvexHull* mesh = new osg::ConvexHull;
|
osg::ConvexHull* mesh = new osg::ConvexHull;
|
||||||
@ -109,13 +135,15 @@ osg::Geode* createShapes()
|
|||||||
return geode;
|
return geode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int, char **)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer(arguments);
|
||||||
|
|
||||||
// add model to viewer.
|
// add model to viewer.
|
||||||
viewer.setSceneData( createShapes() );
|
viewer.setSceneData( createShapes(arguments) );
|
||||||
|
|
||||||
// add the state manipulator
|
// add the state manipulator
|
||||||
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
||||||
|
@ -243,10 +243,15 @@ void BuildShapeGeometryVisitor::End()
|
|||||||
{
|
{
|
||||||
if (_start_index>=_vertices->size()) return;
|
if (_start_index>=_vertices->size()) return;
|
||||||
|
|
||||||
|
bool smallPrimitiveSet = _vertices->size() < 65536;
|
||||||
|
|
||||||
|
// OSG_NOTICE<<"BuildShapeGeometryVisitor::End() smallPrimitiveSet = "<<smallPrimitiveSet<<std::endl;
|
||||||
if (_mode==GL_QUADS)
|
if (_mode==GL_QUADS)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osg::DrawElementsUShort> primitives = new osg::DrawElementsUShort(GL_TRIANGLES);
|
osg::ref_ptr<osg::DrawElements> primitives = smallPrimitiveSet ?
|
||||||
|
static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_TRIANGLES)) :
|
||||||
|
static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_TRIANGLES));
|
||||||
|
|
||||||
_geometry->addPrimitiveSet(primitives.get());
|
_geometry->addPrimitiveSet(primitives.get());
|
||||||
|
|
||||||
for(unsigned int i=_start_index; i<_vertices->size(); i+=4)
|
for(unsigned int i=_start_index; i<_vertices->size(); i+=4)
|
||||||
@ -256,18 +261,21 @@ void BuildShapeGeometryVisitor::End()
|
|||||||
unsigned int p2 = i+2;
|
unsigned int p2 = i+2;
|
||||||
unsigned int p3 = i+3;
|
unsigned int p3 = i+3;
|
||||||
|
|
||||||
primitives->push_back(p0);
|
primitives->addElement(p0);
|
||||||
primitives->push_back(p3);
|
primitives->addElement(p3);
|
||||||
primitives->push_back(p1);
|
primitives->addElement(p1);
|
||||||
|
|
||||||
primitives->push_back(p1);
|
primitives->addElement(p1);
|
||||||
primitives->push_back(p3);
|
primitives->addElement(p3);
|
||||||
primitives->push_back(p2);
|
primitives->addElement(p2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (_mode==GL_QUAD_STRIP)
|
else if (_mode==GL_QUAD_STRIP)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osg::DrawElementsUShort> primitives = new osg::DrawElementsUShort(GL_TRIANGLES);
|
osg::ref_ptr<osg::DrawElements> primitives = smallPrimitiveSet ?
|
||||||
|
static_cast<osg::DrawElements*>(new osg::DrawElementsUShort(GL_TRIANGLES)) :
|
||||||
|
static_cast<osg::DrawElements*>(new osg::DrawElementsUInt(GL_TRIANGLES));
|
||||||
|
|
||||||
_geometry->addPrimitiveSet(primitives.get());
|
_geometry->addPrimitiveSet(primitives.get());
|
||||||
|
|
||||||
for(unsigned int i=_start_index; i<_vertices->size()-2; i+=2)
|
for(unsigned int i=_start_index; i<_vertices->size()-2; i+=2)
|
||||||
@ -277,13 +285,13 @@ void BuildShapeGeometryVisitor::End()
|
|||||||
unsigned int p2 = i+2;
|
unsigned int p2 = i+2;
|
||||||
unsigned int p3 = i+3;
|
unsigned int p3 = i+3;
|
||||||
|
|
||||||
primitives->push_back(p0);
|
primitives->addElement(p0);
|
||||||
primitives->push_back(p2);
|
primitives->addElement(p2);
|
||||||
primitives->push_back(p1);
|
primitives->addElement(p1);
|
||||||
|
|
||||||
primitives->push_back(p1);
|
primitives->addElement(p1);
|
||||||
primitives->push_back(p2);
|
primitives->addElement(p2);
|
||||||
primitives->push_back(p3);
|
primitives->addElement(p3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user