[osg-users] [Any feedback welcome] possible lack of robustness of the VAO path
Julien Valentin
julienvalentin51 at gmail.com
Fri Jan 18 17:04:52 PST 2019
The following code exibits crashes with VAO path
Code:
#include <osgUtil/MeshOptimizers>
#include <osgGA/TrackballManipulator>
#include <osgGA/FirstPersonManipulator>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
class GeomLoaderCB : public osg::Camera::DrawCallback// osg::NodeCallback
{
public:
int _thresremoval;int _nbaddedatatime;
GeomLoaderCB(int thresremoval=1,int nbaddedatatime=1):_nbaddedatatime(nbaddedatatime),_thresremoval(thresremoval) {}
mutable std::list<osg::ref_ptr<osg::Geometry> > _geoms;
void setGeometryList(osgUtil::GeometryCollector::GeometryList c) {
for(auto f : c)
_geoms.push_back(f);
}
virtual void operator () (const osg::Camera& camera ) const {
osg::Node * node=const_cast<osg::Camera*>(&camera)->getChild(0);
if(_geoms.empty())return;
osg::ref_ptr<osg::Group> gr = node->asGroup();
if(gr->getNumChildren()>_thresremoval)
{
OSG_WARN<<"removing "<< gr->getChild(0)<<std::endl;
gr->removeChildren(0,1);
return;
}
std::list<osg::ref_ptr<osg::Geometry> > ::iterator it= _geoms.begin();
int cpt=0;
while(it!=_geoms.end()&&cpt++<_nbaddedatatime ) {
gr->addChild((osg::Drawable*) (*it)->clone(osg::CopyOp::DEEP_COPY_ALL));
OSG_WARN<<"add "<< (*it ) ->getVertexArray()->getNumElements()<<std::endl;
it=_geoms.erase(it);
}
return;
}
};
/// This demo reproduce a bug with OSG_VERTEX_BUFFER_HINT=VAO
/// it collecte drawables given in arg then add and remove them at runtime
int main(int argc, char **argv)
{
osg::ArgumentParser args(&argc,argv);
unsigned int geomcountaddedatatime=1,geomcountabovewichweremove=1;
while(args.read("--add",geomcountaddedatatime) ) { }
while(args.read("--remove",geomcountabovewichweremove) ) { }
osgUtil::GeometryCollector geomcollector(0,osgUtil::Optimizer::ALL_OPTIMIZATIONS);
args.getApplicationUsage()->setApplicationName(args.getApplicationName());
osg::ref_ptr<osg::Node > loaded=osgDB::readNodeFiles(args);
if(loaded.valid())
{
loaded->accept(geomcollector);
osg::Group * root=new osg::Group;
//osg::Camera * root=new osg::Camera;
GeomLoaderCB * loader=new GeomLoaderCB(geomcountabovewichweremove,geomcountaddedatatime);
loader->setGeometryList( geomcollector.getGeometryList() );
osgViewer::Viewer viewer;
viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
viewer.addEventHandler(new osgViewer::ThreadingHandler);
viewer.realize();
viewer.setSceneData( root);
viewer.getCamera()->setFinalDrawCallback(loader);
loaded=0;
viewer.run();
}
}
if you want my test sample:
https://drive.google.com/file/d/0BxIH-jcsgYDdTG5ha21HZE1jX1E/view?usp=sharing
for ex It fails with args :
BIGCITY.ive --remove 150 --add 100
I believe there's a bug....so I'd be glad if someone validate it...
note: toggling statshandler prevent crash
Thanks in advance
Cheers
mp3butcher wrote:
> Hi all,
> I wrote a sample code exibiting crash with my scene
> https://github.com/openscenegraph/OpenSceneGraph/issues/692
>
> If you'd have 5 min to waste, i would be glad you confirm with your own scene...
>
> Thank you!
>
> Cheers,
> Julien
------------------------
Twirling twirling twirling toward freedom
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75508#75508
More information about the osg-users
mailing list