diff --git a/include/osgTerrain/GeometryTechnique b/include/osgTerrain/GeometryTechnique index 678785fd4..f401a7099 100644 --- a/include/osgTerrain/GeometryTechnique +++ b/include/osgTerrain/GeometryTechnique @@ -37,6 +37,9 @@ class OSGTERRAIN_EXPORT GeometryTechnique : public TerrainTechnique virtual void cull(osgUtil::CullVisitor* nv); + /** Traverse the terain subgraph.*/ + virtual void traverse(osg::NodeVisitor& nv); + virtual void cleanSceneGraph(); virtual void dirty(); diff --git a/src/osgTerrain/GeometryTechnique.cpp b/src/osgTerrain/GeometryTechnique.cpp index 15032041c..5495a1da5 100644 --- a/src/osgTerrain/GeometryTechnique.cpp +++ b/src/osgTerrain/GeometryTechnique.cpp @@ -552,6 +552,42 @@ void GeometryTechnique::cull(osgUtil::CullVisitor* cv) #endif } + +void GeometryTechnique::traverse(osg::NodeVisitor& nv) +{ + if (!_terrainNode) return; + + // if app traversal update the frame count. + if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR) + { + if (_dirty) init(); + + osgUtil::UpdateVisitor* uv = dynamic_cast(&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; + } + } + + + if (_dirty) init(); + + BufferData& buffer = getReadOnlyBuffer(); + if (buffer._transform.valid()) buffer._transform->accept(nv); +} + + void GeometryTechnique::cleanSceneGraph() { } diff --git a/src/osgTerrain/TerrainTechnique.cpp b/src/osgTerrain/TerrainTechnique.cpp index 8c0536222..ee90614b9 100644 --- a/src/osgTerrain/TerrainTechnique.cpp +++ b/src/osgTerrain/TerrainTechnique.cpp @@ -90,6 +90,8 @@ void TerrainTechnique::traverse(osg::NodeVisitor& nv) } } + if (_dirty) init(); + // otherwise fallback to the Group::traverse() _terrainNode->osg::Group::traverse(nv); }