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

