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

