Hi Robert I have gotten a bit further with this, and there are some indications it might be a viable solution.
But I have run into a problem, it seams that Im not removing patches from my physics engine when higher resolutions patches replaces them. Can You confirm that If a given osgTerrain::TerrainTile is replaced by its four higher resolution children the acociated heightfields are not deleted, and as a result the observer callback is not called? And if this is the case do you have any good ideas on how to figure out when to disable these patches in the physics engine, so that I dont have multiple patches loaded for the same area? Brgs. Ralf Stokholm 2009/4/3 Robert Osfield <[email protected]>: > Hi Ralf, > > Use the osg::Observer mechanism for watching when objects get deleted. Just > register your observer with the TerrainTile/HeightField you've set up your > physics for then you'll be able to get your observer called when it goes out > of scope. osg::observert_ptr<> uses osg::Observer, as does osg::State so > have a look at these for usage of Observer. > > Robert. > > On Fri, Apr 3, 2009 at 11:44 AM, Ralf Stokholm <[email protected]> > wrote: >> >> Hi Robert >> >> Its not that I need to keep the memmory around. >> >> I need to know when a terrain tile is unloaded from the scene and use >> that event to unload the physics heightfield as well. >> >> Im guessing the life of a TerrainTile is similar to this: >> >> 1. Loaded/created by the database pager >> 2. Added to the scenegraph by the databasepager. >> 3. Disabled/hidden by the CullVisitor. >> 4. Enabled/Shown by the CullVisitor. (possibly if it is only culled >> out for a short time OSG 2.6.1) >> 5. Unloaded/Destroyed. >> >> I need a way to catch at least event 1 and 5. Could this be done using >> reference counting or is there a better way? >> >> Brgs. >> >> Ralf Stokholm >> >> 2009/4/3 Robert Osfield <[email protected]>: >> > Hi Ralf, >> > >> > If you need to keep the memory around then use a ref_ptr<> to the >> > HeightField, but... this will keep the memory around so if you do no >> > longer >> > need it you might want to implement a scheme to free it, such as >> > watching >> > when the ref count goes to one. >> > >> > The other approach is to use an observer_ptr<> that doesn't change the >> > ref >> > count of the HeightFiled, and gets reset to 0 when the HeightField get >> > deleted. You can also use a custom osg::Observer to watch for object >> > deletions as well. >> > >> > Robert >> > >> > On Fri, Apr 3, 2009 at 11:22 AM, Ralf Stokholm <[email protected]> >> > wrote: >> >> >> >> Hi Robert (list) >> >> >> >> Im trying to use the ReadFileCallback to load the heightfield int my >> >> physics engine. >> >> >> >> So far I have been using a CullVisitor to grap the triangles from the >> >> finished scene, but it has major drawback in that it forces me to load >> >> the data as meshes which is terrible for memmory and takes a long time >> >> to load. >> >> >> >> It seams im able to load the data as heightfields from the >> >> ReadFileCallback, but this leads to my next problem. I need a way to >> >> reference the data later, to be able to remove it when tiles are >> >> deletet and disable it when tiles are disabled by the scene >> >> cullvisitor. >> >> >> >> Is there a way to relate the nodes i visit in my ReadFileCallback to >> >> nodes i visit in a special cullvisitor for the final scenegraph? >> >> >> >> Basically do you have any hints on how to syncronise the state of my >> >> physics engine with the state of my Paged VPB terrain? >> >> >> >> Brgs. >> >> >> >> Ralf Stokholm >> >> >> >> >> >> 2009/4/2 Ralf Stokholm <[email protected]>: >> >> > Hi Robert >> >> > >> >> > Thanks a lot, was starting to get at this but using a more primitive >> >> > approach of running through all the children of the node that I did >> >> > get. >> >> > >> >> > Will try to implement your method. >> >> > >> >> > Brgs. >> >> > >> >> > Ralf Stokholm >> >> > >> >> > 2009/4/2 Robert Osfield <[email protected]>: >> >> >> Hi Ralf, >> >> >> >> >> >> You'll need to write a custom NodeVisitor that traverses through the >> >> >> loaded >> >> >> scene graph and picks out the TerrainTile using dyanmic cast. It >> >> >> just >> >> >> so >> >> >> happens that I'm actually working on a ReadFileCallback/custom >> >> >> Visitor >> >> >> that >> >> >> does pick out all the TerrainTile's in a subgraph (there will >> >> >> typically >> >> >> be >> >> >> one, two or four due to the quad tree structure generated by VPB.) >> >> >> >> >> >> The visitor looks like: >> >> >> >> >> >> class FindTerrainTileVisitor : public osg::NodeVisitor >> >> >> { >> >> >> public: >> >> >> FindTerrainTileVisitor(): >> >> >> osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) >> >> >> { >> >> >> } >> >> >> >> >> >> void reset() >> >> >> { >> >> >> _terrainTiles.clear(); >> >> >> } >> >> >> >> >> >> void apply(osg::Group& group) >> >> >> { >> >> >> osgTerrain::TerrainTile* terrainTile = >> >> >> dynamic_cast<osgTerrain::TerrainTile*>(&group); >> >> >> if (terrainTile) >> >> >> { >> >> >> _terrainTiles.push_back(terrainTile); >> >> >> } >> >> >> else >> >> >> { >> >> >> traverse(group); >> >> >> } >> >> >> } >> >> >> >> >> >> typedef std::list< osg::ref_ptr<osgTerrain::TerrainTile> > >> >> >> TerrainTiles; >> >> >> TerrainTiles _terrainTiles; >> >> >> }; >> >> >> >> >> >> The custom ReadFileCallback's readNode method looks like: >> >> >> >> >> >> virtual osgDB::ReaderWriter::ReadResult readNode(const >> >> >> std::string& >> >> >> filename, const osgDB::ReaderWriter::Options* options) >> >> >> { >> >> >> osg::notify(osg::NOTICE)<<"Loading tile >> >> >> "<<filename<<std::endl; >> >> >> osgDB::ReaderWriter::ReadResult result = >> >> >> >> >> >> osgDB::Registry::instance()->readNodeImplementation(filename,options); >> >> >> if (result.validNode()) >> >> >> { >> >> >> FindTerrainTileVisitor fttv; >> >> >> result.getNode()->accept(fttv); >> >> >> for(FindTerrainTileVisitor::TerrainTiles::iterator itr = >> >> >> fttv._terrainTiles.begin(); >> >> >> itr != fttv._terrainTiles.end(); >> >> >> ++itr) >> >> >> { >> >> >> osgTerrain::TerrainTile* terrainTile = itr->get(); >> >> >> ///.... my stuff omitted, put your stuff here >> >> >> } >> >> >> } >> >> >> } >> >> >> >> >> >> >> >> >> Robert. >> >> >> >> >> >> On Thu, Apr 2, 2009 at 1:05 PM, Ralf Stokholm >> >> >> <[email protected]> >> >> >> wrote: >> >> >>> >> >> >>> Hi List >> >> >>> >> >> >>> Im trying to get the heightfiled data from a VPB terrain using >> >> >>> ReadFileCallback. >> >> >>> >> >> >>> I use the code from readfile callback like this. >> >> >>> >> >> >>> class MyReadFileCallback : public >> >> >>> osgDB::Registry::ReadFileCallback >> >> >>> { >> >> >>> public: >> >> >>> virtual osgDB::ReaderWriter::ReadResult readNode(const >> >> >>> std::string& fileName, const osgDB::ReaderWriter::Options* options) >> >> >>> { >> >> >>> // note when calling the Registry to do the read you have >> >> >>> to >> >> >>> call readNodeImplementation NOT readNode, as this will >> >> >>> // cause on infinite recusive loop. >> >> >>> osgDB::ReaderWriter::ReadResult result = >> >> >>> >> >> >>> osgDB::Registry::instance()->readNodeImplementation(fileName,options); >> >> >>> if (result.validHeightField()) >> >> >>> { >> >> >>> LOG_ERROR("Found a valid HeightField"); >> >> >>> } >> >> >>> return result; >> >> >>> } >> >> >>> }; >> >> >>> >> >> >>> The idea was simply to see if I had the heightfield available, but >> >> >>> even though I have verified that it gets called it is never a valid >> >> >>> heightfield. >> >> >>> >> >> >>> This is on a terrain build using VPB with the --TERRAIN option. >> >> >>> >> >> >>> Shouldent I be able to get the heightfieldnodes? >> >> >>> >> >> >>> Brgs. >> >> >>> >> >> >>> Ralf Stokholm >> >> >>> _______________________________________________ >> >> >>> osg-users mailing list >> >> >>> [email protected] >> >> >>> >> >> >>> >> >> >>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> >> >> >> >> >> >> >> _______________________________________________ >> >> >> osg-users mailing list >> >> >> [email protected] >> >> >> >> >> >> >> >> >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> >> >> >> >> >> >> > >> >> _______________________________________________ >> >> osg-users mailing list >> >> [email protected] >> >> >> >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> > >> > >> > _______________________________________________ >> > osg-users mailing list >> > [email protected] >> > >> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> > >> > >> _______________________________________________ >> osg-users mailing list >> [email protected] >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > _______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

