Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
Hi Robert "Lower levels of detail aren't unreferenced but kept around in any paged database, this includes a osgTerrain::TerrainTile based paged database." I was expecting this. With regards to active tiles, my problem is that going this approach I cant figure out how to extract the state information from the scenegraph. From what I understand the TerrainTiles that I process during my read file callback will not provide any information on when they are invalidated by the loading of higher resolution tiles, right? I understand that the physics part is specific to my application, but an interface or "pattern" for syncronising the active scenegraph generated when running an osgTerrain::TerrainTile based paged database with a given application is usefull in other places. As I said so far we have been using a cullvisitor that runs through the entire scenegraph looking for "terrain" nodes. It then checks if these nodes are already in our set of nodes. If its not a new physics object is generated by pulling the geometry using a trianglevisitor. This method is both slow, repeats bookkeping already performed in the Terrain/Scene graph machinery and uses way more memmory than is neccecery. Basically I end up generating 3 unique vertices and 3 indecies for each triangle rendered. This will consime roughly 28 times the amount of memmory that would be needed if I could use the heightfield data directly. Brgs. Ralf 2009/4/6 Robert Osfield : > Hi Ralf, > > Lower levels of detail aren't unreferenced but kept around in any paged > database, this includes a osgTerrain::TerrainTile based paged database. > > As how to manage the mapping of which physics tiles should be active... well > I don't know what to recommend, there a lots of different ways you could > probably tackle it. My job is the scene graph, I'll leave application dev > issues to members of the community. > > Robert. > > On Mon, Apr 6, 2009 at 3:12 PM, Ralf Stokholm > wrote: >> >> 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 : >> > 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 >> > 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 : >> >> > 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 >> >> > >> >> > 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 >> >> >
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
Hi Ralf, Lower levels of detail aren't unreferenced but kept around in any paged database, this includes a osgTerrain::TerrainTile based paged database. As how to manage the mapping of which physics tiles should be active... well I don't know what to recommend, there a lots of different ways you could probably tackle it. My job is the scene graph, I'll leave application dev issues to members of the community. Robert. On Mon, Apr 6, 2009 at 3:12 PM, Ralf Stokholm wrote: > 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 : > > 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 > > 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 : > >> > 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 < > alfma...@arenalogic.com> > >> > 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 : > >> >> > 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 : > >> >> >> 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 > >> >> >> Visi
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 : > 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 > 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 : >> > 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 >> > 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 : >> >> > 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 : >> >> >> 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(&group); >> >> >> if (terrainTi
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 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 : > > 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 > > 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 : > >> > 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 : > >> >> 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(&group); > >> >> if (terrainTile) > >> >> { > >> >> _terrainTiles.push_back(terrainTile); > >> >> } > >> >> else > >> >> { > >> >> traverse(group); > >> >> } > >> >> } > >> >> > >> >> typedef std::list< osg::ref_ptr > > >> >> 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 > "< >> >> osgDB::ReaderWriter::ReadResult result = > >> >> > osgDB::Registry::instance()->readNodeImplementation(filename,options); > >> >> if (result.validNode()) > >> >> { > >> >> FindTerrainTileV
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 : > 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 > 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 : >> > 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 : >> >> 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(&group); >> >> if (terrainTile) >> >> { >> >> _terrainTiles.push_back(terrainTile); >> >> } >> >> else >> >> { >> >> traverse(group); >> >> } >> >> } >> >> >> >> typedef std::list< osg::ref_ptr > >> >> 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 "<> >> 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 >> >> wrote: >> >>> >> >>> Hi List >> >>> >> >>> Im trying to get the heightfiled data from a VPB terrain using >> >>> ReadFileCallback. >> >>> >> >>> I us
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 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 : > > 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 : > >> 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(&group); > >> if (terrainTile) > >> { > >> _terrainTiles.push_back(terrainTile); > >> } > >> else > >> { > >> traverse(group); > >> } > >> } > >> > >> typedef std::list< osg::ref_ptr > > 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 "< >> 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 > >> 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 id
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 : > 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 : >> 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(&group); >> if (terrainTile) >> { >> _terrainTiles.push_back(terrainTile); >> } >> else >> { >> traverse(group); >> } >> } >> >> typedef std::list< osg::ref_ptr > 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 "<> 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 >> 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 >>> osg-users@lists.openscenegraph.org >>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> >> ___ >> osg-users mailing list >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org >> >> > ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 : > 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(&group); > if (terrainTile) > { > _terrainTiles.push_back(terrainTile); > } > else > { > traverse(group); > } > } > > typedef std::list< osg::ref_ptr > 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 "< 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 > 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 >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > > ___ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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(&group); if (terrainTile) { _terrainTiles.push_back(terrainTile); } else { traverse(group); } } typedef std::list< osg::ref_ptr > 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 "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 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 > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
Hi Jason Thanks for the surgestion, tried the following. osgDB::ReaderWriter::ReadResult result = osgDB::Registry::instance()->readNodeImplementation(fileName,options); if (result.validNode()) { LOG_ERROR("Found a valid Node"); if (dynamic_cast(result.getNode())) { LOG_ERROR("Found a valid TerrainTile"); } } There are plenty of valid nodes, but none of them will accept a cast to TerranTile, is there a way to verify that my generated dataset contains TerrainTiles ? Brgs. Ralf Stokholm 2009/4/2 Jason Beverage : > Hi ralf > > Try casting the node to an osgTerrain::TerrainTile. If the cast works you'll > be able to grab the elevation layer and cast it to a heightfieldlayer and > grab the hf > > Jason > > Sent from my iPhone > > On Apr 2, 2009, at 8:05 AM, Ralf Stokholm 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 >> osg-users@lists.openscenegraph.org >> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > ___ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
Re: [osg-users] How to get heightfield from ReadFileCallback VPB Terrain
Hi ralf Try casting the node to an osgTerrain::TerrainTile. If the cast works you'll be able to grab the elevation layer and cast it to a heightfieldlayer and grab the hf Jason Sent from my iPhone On Apr 2, 2009, at 8:05 AM, Ralf Stokholm 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 osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org ___ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
[osg-users] How to get heightfield from ReadFileCallback VPB Terrain
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 osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org