From 4688d5ae8ee2c4557eb2345d156a267914a2c6a5 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 27 Mar 2007 16:01:01 +0000 Subject: [PATCH] Rearranged the traversal and initialization of TerrainTechnique --- examples/osgterrain/osgterrain.cpp | 2 +- include/osgTerrain/GeometryTechnique | 8 ++--- include/osgTerrain/TerrainTechnique | 8 +++-- src/osgTerrain/GeometryTechnique.cpp | 17 +++++++++-- src/osgTerrain/TerrainNode.cpp | 23 +++----------- src/osgTerrain/TerrainTechnique.cpp | 45 +++++++++++++++++++++++++--- 6 files changed, 69 insertions(+), 34 deletions(-) diff --git a/examples/osgterrain/osgterrain.cpp b/examples/osgterrain/osgterrain.cpp index 487c5bef3..b65f58fbe 100644 --- a/examples/osgterrain/osgterrain.cpp +++ b/examples/osgterrain/osgterrain.cpp @@ -131,7 +131,7 @@ int main(int argc, char** argv) if (!terrain) return 0; - return 0; + // return 0; // add a viewport to the viewer and attach the scene graph. viewer.setSceneData(terrain.get()); diff --git a/include/osgTerrain/GeometryTechnique b/include/osgTerrain/GeometryTechnique index 6b75767c7..5ad198f00 100644 --- a/include/osgTerrain/GeometryTechnique +++ b/include/osgTerrain/GeometryTechnique @@ -30,16 +30,15 @@ class OSGTERRAIN_EXPORT GeometryTechnique : public TerrainTechnique /** Copy constructor using CopyOp to manage deep vs shallow copy.*/ GeometryTechnique(const GeometryTechnique&,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); - virtual void initialize(); + virtual void init(); virtual void update(osgUtil::UpdateVisitor* nv); virtual void cull(osgUtil::CullVisitor* nv); - virtual void cleanSceneGraph() {} + virtual void cleanSceneGraph(); - /** Dirty so that cached data structurese are updated.*/ - virtual void dirty() { _dirty = true; } + virtual void dirty(); protected: @@ -47,7 +46,6 @@ class OSGTERRAIN_EXPORT GeometryTechnique : public TerrainTechnique osg::ref_ptr _geode; osg::ref_ptr _geometry; - bool _dirty; }; diff --git a/include/osgTerrain/TerrainTechnique b/include/osgTerrain/TerrainTechnique index 3155b0c33..4b3a709b5 100644 --- a/include/osgTerrain/TerrainTechnique +++ b/include/osgTerrain/TerrainTechnique @@ -39,7 +39,7 @@ class OSGTERRAIN_EXPORT TerrainTechnique : public osg::Object TerrainNode* getTerrainNode() { return _terrainNode; } const TerrainNode* getTerrainNode() const { return _terrainNode; } - virtual void initialize(); + virtual void init(); virtual void update(osgUtil::UpdateVisitor* nv); @@ -48,6 +48,9 @@ class OSGTERRAIN_EXPORT TerrainTechnique : public osg::Object /** Clean scene graph from any terrain technique specific nodes.*/ virtual void cleanSceneGraph(); + /** Traverse the terain subgraph.*/ + virtual void traverse(osg::NodeVisitor& nv); + /** Dirty so that cached data structurese are updated.*/ virtual void dirty(); @@ -57,7 +60,8 @@ class OSGTERRAIN_EXPORT TerrainTechnique : public osg::Object friend class osgTerrain::TerrainNode; - TerrainNode* _terrainNode; + TerrainNode* _terrainNode; + bool _dirty; }; diff --git a/src/osgTerrain/GeometryTechnique.cpp b/src/osgTerrain/GeometryTechnique.cpp index 70070ef8d..629efdf63 100644 --- a/src/osgTerrain/GeometryTechnique.cpp +++ b/src/osgTerrain/GeometryTechnique.cpp @@ -28,14 +28,15 @@ GeometryTechnique::~GeometryTechnique() { } -void GeometryTechnique::initialize() +void GeometryTechnique::init() { - osg::notify(osg::NOTICE)<<"Doing initalize"<addDrawable(_geometry.get()); - + + _dirty = false; } @@ -54,3 +55,13 @@ void GeometryTechnique::cull(osgUtil::CullVisitor* nv) _geode->accept(*nv); } } + +void GeometryTechnique::cleanSceneGraph() +{ + osg::notify(osg::NOTICE)<<"Cleaning scene graph"<(&nv); - if (getTerrainTechnique() && uv) - { - getTerrainTechnique()->update(uv); - return; - } - + _terrainTechnique->traverse(nv); } - else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) + else { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); - if (getTerrainTechnique() && cv) - { - getTerrainTechnique()->cull(cv); - return; - } + osg::Group::traverse(nv); } - - // otherwise fallback to the Group::traverse() - Group::traverse(nv); } void TerrainNode::setTerrainTechnique(osgTerrain::TerrainTechnique* terrainTechnique) diff --git a/src/osgTerrain/TerrainTechnique.cpp b/src/osgTerrain/TerrainTechnique.cpp index ba2f1e77c..bc3481540 100644 --- a/src/osgTerrain/TerrainTechnique.cpp +++ b/src/osgTerrain/TerrainTechnique.cpp @@ -12,17 +12,20 @@ */ #include +#include using namespace osgTerrain; TerrainTechnique::TerrainTechnique(): - _terrainNode(0) + _terrainNode(0), + _dirty(true) { } TerrainTechnique::TerrainTechnique(const TerrainTechnique& TerrainTechnique,const osg::CopyOp& copyop): osg::Object(TerrainTechnique,copyop), - _terrainNode(0) + _terrainNode(0), + _dirty(true) { } @@ -30,9 +33,11 @@ TerrainTechnique::~TerrainTechnique() { } -void TerrainTechnique::initialize() +void TerrainTechnique::init() { osg::notify(osg::NOTICE)<(&nv); + if (uv) + { + update(uv); + return; + } + + } + else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) + { + osgUtil::CullVisitor* cv = dynamic_cast(&nv); + if (cv) + { + cull(cv); + return; + } + } + + // otherwise fallback to the Group::traverse() + _terrainNode->osg::Group::traverse(nv); }