From 1219a6d3bfc721751527e6ecf21b5e9f57e860a8 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 20 Jan 2016 15:13:19 +0000 Subject: [PATCH] Added more osg::Object::as*() methods and usage of these through the code base to avoid use of dynamic_cast<> when using UpdateVisitor/CullVisitor/EventVIisitor etc. --- include/osg/Drawable | 5 +++ include/osg/Node | 14 +++---- include/osg/NodeVisitor | 42 +++++++++++++++++++ include/osg/Object | 10 +++++ include/osgGA/EventVisitor | 8 ++++ include/osgUtil/CullVisitor | 8 ++++ include/osgUtil/IntersectionVisitor | 11 ++++- include/osgUtil/UpdateVisitor | 8 ++++ src/osgFX/Technique.cpp | 2 +- src/osgGA/EventHandler.cpp | 4 +- src/osgGA/GUIEventHandler.cpp | 2 +- src/osgGA/Widget.cpp | 4 +- src/osgManipulator/Dragger.cpp | 2 +- src/osgParticle/ParticleProcessor.cpp | 2 +- src/osgParticle/ParticleSystem.cpp | 2 +- src/osgParticle/ParticleSystemUpdater.cpp | 2 +- src/osgParticle/PrecipitationEffect.cpp | 2 +- src/osgPlugins/logo/ReaderWriterLOGO.cpp | 2 +- src/osgPlugins/txp/TXPNode.cpp | 2 +- src/osgPresentation/Cursor.cpp | 4 +- src/osgPresentation/Timeout.cpp | 4 +- src/osgShadow/ShadowTechnique.cpp | 2 +- src/osgShadow/ViewDependentShadowMap.cpp | 4 +- src/osgSim/Impostor.cpp | 2 +- src/osgSim/LightPointNode.cpp | 2 +- src/osgSim/OverlayNode.cpp | 4 +- .../DisplacementMappingTechnique.cpp | 4 +- src/osgTerrain/GeometryTechnique.cpp | 4 +- src/osgTerrain/Terrain.cpp | 4 +- src/osgTerrain/TerrainTechnique.cpp | 4 +- src/osgUI/Callbacks.cpp | 2 +- src/osgUI/Widget.cpp | 8 ++-- src/osgUtil/SceneView.cpp | 4 +- src/osgVolume/FixedFunctionTechnique.cpp | 4 +- src/osgVolume/MultipassTechnique.cpp | 8 ++-- src/osgVolume/RayTracedTechnique.cpp | 4 +- src/osgVolume/VolumeScene.cpp | 4 +- src/osgVolume/VolumeTechnique.cpp | 4 +- 38 files changed, 148 insertions(+), 60 deletions(-) diff --git a/include/osg/Drawable b/include/osg/Drawable index 7f6bbbc8b..935ae0e78 100644 --- a/include/osg/Drawable +++ b/include/osg/Drawable @@ -102,7 +102,12 @@ class OSG_EXPORT Drawable : public Node META_Node(osg, Drawable); + /** Convert 'this' into a Drawable pointer if Object is a Drawable, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ virtual Drawable* asDrawable() { return this; } + + /** convert 'const this' into a const Drawable pointer if Object is a Drawable, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ virtual const Drawable* asDrawable() const { return this; } /** Compute the DataVariance based on an assessment of callback etc.*/ diff --git a/include/osg/Node b/include/osg/Node index c0f94771b..4476dde39 100644 --- a/include/osg/Node +++ b/include/osg/Node @@ -103,6 +103,13 @@ class OSG_EXPORT Node : public Object * Equivalent to dynamic_cast(this).*/ virtual const Node* asNode() const { return this; } + /** convert 'this' into a Drawable pointer if Node is a Drawable, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual Drawable* asDrawable() { return 0; } + /** convert 'const this' into a const Drawable pointer if Node is a Drawable, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const Drawable* asDrawable() const { return 0; } + /** convert 'this' into a Geometry pointer if Node is a Geometry, otherwise return 0. * Equivalent to dynamic_cast(this).*/ virtual Geometry* asGeometry() { return 0; } @@ -126,13 +133,6 @@ class OSG_EXPORT Node : public Object virtual const Transform* asTransform() const { return 0; } - /** Convert 'this' into a Camera pointer if Node is a Camera, otherwise return 0. - * Equivalent to dynamic_cast(this).*/ - virtual Camera* asCamera() { return 0; } - /** convert 'const this' into a const Camera pointer if Node is a Camera, otherwise return 0. - * Equivalent to dynamic_cast(this).*/ - virtual const Camera* asCamera() const { return 0; } - /** Convert 'this' into a Switch pointer if Node is a Switch, otherwise return 0. * Equivalent to dynamic_cast(this).*/ diff --git a/include/osg/NodeVisitor b/include/osg/NodeVisitor index 77147e2c6..886d25cd2 100644 --- a/include/osg/NodeVisitor +++ b/include/osg/NodeVisitor @@ -18,6 +18,10 @@ #include #include + +namespace osgUtil { class UpdateVisitor; class CullVisitor; class IntersectionVisitor; } +namespace osgGA { class EventVisitor; } + namespace osg { class Billboard; @@ -44,6 +48,10 @@ class CameraView; class Drawable; class Geometry; + + + + const unsigned int UNINITIALIZED_FRAME_NUMBER=0xffffffff; #define META_NodeVisitor(library, name) \ @@ -104,6 +112,40 @@ class OSG_EXPORT NodeVisitor : public virtual Object * Equivalent to dynamic_cast(this).*/ virtual const NodeVisitor* asNodeVisitor() const { return this; } + /** Convert 'this' into a osgUtil::UpdateVisitor pointer if Object is a osgUtil::UpdateVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgUtil::UpdateVisitor* asUpdateVisitor() { return 0; } + + /** convert 'const this' into a const osgUtil::UpdateVisitor pointer if Object is a osgUtil::UpdateVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgUtil::UpdateVisitor* asUpdateVisitor() const { return 0; } + + /** Convert 'this' into a osgUtil::CullVisitor pointer if Object is a osgUtil::CullVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgUtil::CullVisitor* asCullVisitor() { return 0; } + + /** convert 'const this' into a const osgUtil::CullVisitor pointer if Object is a osgUtil::CullVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgUtil::CullVisitor* asCullVisitor() const { return 0; } + + /** Convert 'this' into a osgGA::EventVisitor pointer if Object is a osgGA::EventVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgGA::EventVisitor* asEventVisitor() { return 0; } + + /** convert 'const this' into a const osgGA::EventVisitor pointer if Object is a osgGA::EventVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgGA::EventVisitor* asEventVisitor() const { return 0; } + + /** Convert 'this' into a osgUtil::IntersectionVisitor pointer if Object is a IntersectionVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgUtil::IntersectionVisitor* asIntersectionVisitor() { return 0; } + + /** convert 'const this' into a const osgUtil::IntersectionVisitor pointer if Object is a IntersectionVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgUtil::IntersectionVisitor* asIntersectionVisitor() const { return 0; } + + + /** Method to call to reset visitor. Useful if your visitor accumulates state during a traversal, and you plan to reuse the visitor. diff --git a/include/osg/Object b/include/osg/Object index 32bcc8b8f..4f8597c83 100644 --- a/include/osg/Object +++ b/include/osg/Object @@ -31,6 +31,8 @@ class Node; class NodeVisitor; class StateAttribute; class Uniform; +class Drawable; +class Camera; class Callback; class CallbackObject; @@ -136,6 +138,14 @@ class OSG_EXPORT Object : public Referenced * Equivalent to dynamic_cast(this).*/ virtual const Uniform* asUniform() const { return 0; } + /** Convert 'this' into a Camera pointer if Node is a Camera, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual Camera* asCamera() { return 0; } + + /** convert 'const this' into a const Camera pointer if Node is a Camera, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const Camera* asCamera() const { return 0; } + /** Convert 'this' into a Drawable pointer if Object is a Drawable, otherwise return 0. * Equivalent to dynamic_cast(this).*/ virtual Drawable* asDrawable() { return 0; } diff --git a/include/osgGA/EventVisitor b/include/osgGA/EventVisitor index b57871812..f6f29839a 100644 --- a/include/osgGA/EventVisitor +++ b/include/osgGA/EventVisitor @@ -46,6 +46,14 @@ class OSGGA_EXPORT EventVisitor : public osg::NodeVisitor META_NodeVisitor(osgGA, EventVisitor) + /** Convert 'this' into a osgGA::EventVisitor pointer if Object is a osgGA::EventVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgGA::EventVisitor* asEventVisitor() { return this; } + + /** convert 'const this' into a const osgGA::EventVisitor pointer if Object is a osgGA::EventVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgGA::EventVisitor* asEventVisitor() const { return this; } + void setActionAdapter(osgGA::GUIActionAdapter* actionAdapter) { _actionAdapter=actionAdapter; } osgGA::GUIActionAdapter* getActionAdapter() { return _actionAdapter; } diff --git a/include/osgUtil/CullVisitor b/include/osgUtil/CullVisitor index 774b8b678..48b641f51 100644 --- a/include/osgUtil/CullVisitor +++ b/include/osgUtil/CullVisitor @@ -59,6 +59,14 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac META_NodeVisitor(osgUtil, CullVisitor) + /** Convert 'this' into a osgUtil::CullVisitor pointer if Object is a osgUtil::CullVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgUtil::CullVisitor* asCullVisitor() { return this; } + + /** convert 'const this' into a const osgUtil::CullVisitor pointer if Object is a osgUtil::CullVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgUtil::CullVisitor* asCullVisitor() const { return this; } + /** Create a shallow copy of the CullVisitor, used by CullVisitor::create() to clone the prototype. */ virtual CullVisitor* clone() const { return new CullVisitor(*this); } diff --git a/include/osgUtil/IntersectionVisitor b/include/osgUtil/IntersectionVisitor index 71b57a199..d2a5760b6 100644 --- a/include/osgUtil/IntersectionVisitor +++ b/include/osgUtil/IntersectionVisitor @@ -56,7 +56,6 @@ class Intersector : public osg::Referenced _disabledCount(0), _precisionHint(USE_DOUBLE_CALCULATIONS) {} - void setCoordinateFrame(CoordinateFrame cf) { _coordinateFrame = cf; } CoordinateFrame getCoordinateFrame() const { return _coordinateFrame; } @@ -168,8 +167,16 @@ class OSGUTIL_EXPORT IntersectionVisitor : public osg::NodeVisitor META_NodeVisitor(osgUtil, IntersectionVisitor) - virtual void reset(); + /** Convert 'this' into a osgUtil::IntersectionVisitor pointer if Object is a IntersectionVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgUtil::IntersectionVisitor* asIntersectionVisitor() { return this; } + /** convert 'const this' into a const osgUtil::IntersectionVisitor pointer if Object is a IntersectionVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgUtil::IntersectionVisitor* asIntersectionVisitor() const { return this; } + + + virtual void reset(); /** Set the intersector that will be used to intersect with the scene, and to store any hits that occur.*/ void setIntersector(Intersector* intersector); diff --git a/include/osgUtil/UpdateVisitor b/include/osgUtil/UpdateVisitor index 9e9aff7bb..bc809ad6f 100644 --- a/include/osgUtil/UpdateVisitor +++ b/include/osgUtil/UpdateVisitor @@ -43,6 +43,14 @@ class OSGUTIL_EXPORT UpdateVisitor : public osg::NodeVisitor META_NodeVisitor(osgUtil, UpdateVisitor) + /** Convert 'this' into a osgUtil::UpdateVisitor pointer if Object is a osgUtil::UpdateVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual osgUtil::UpdateVisitor* asUpdateVisitor() { return this; } + + /** convert 'const this' into a const osgUtil::UpdateVisitor pointer if Object is a osgUtil::UpdateVisitor, otherwise return 0. + * Equivalent to dynamic_cast(this).*/ + virtual const osgUtil::UpdateVisitor* asUpdateVisitor() const { return this; } + virtual void reset(); /** During traversal each type of node calls its callbacks and its children traversed. */ diff --git a/src/osgFX/Technique.cpp b/src/osgFX/Technique.cpp index 9ec1a2cf8..0ca7cc85f 100644 --- a/src/osgFX/Technique.cpp +++ b/src/osgFX/Technique.cpp @@ -42,7 +42,7 @@ void Technique::traverse_implementation(osg::NodeVisitor& nv, Effect* fx) } // special actions must be taken if the node visitor is actually a CullVisitor - osgUtil::CullVisitor *cv = dynamic_cast(&nv); + osgUtil::CullVisitor *cv = nv.asCullVisitor(); // traverse all passes for (int i=0; i(nv); + osgGA::EventVisitor* ev = nv->asEventVisitor(); if (ev && ev->getActionAdapter() && !ev->getEvents().empty()) { for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin(); @@ -33,7 +33,7 @@ void EventHandler::operator()(osg::Node* node, osg::NodeVisitor* nv) void EventHandler::event(osg::NodeVisitor* nv, osg::Drawable* drawable) { - osgGA::EventVisitor* ev = dynamic_cast(nv); + osgGA::EventVisitor* ev = nv->asEventVisitor(); if (ev && ev->getActionAdapter() && !ev->getEvents().empty()) { for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin(); diff --git a/src/osgGA/GUIEventHandler.cpp b/src/osgGA/GUIEventHandler.cpp index b518100ca..a46672732 100644 --- a/src/osgGA/GUIEventHandler.cpp +++ b/src/osgGA/GUIEventHandler.cpp @@ -26,7 +26,7 @@ GUIEventHandler::~GUIEventHandler() // adapt EventHandler usage to old style GUIEventHandler usage bool GUIEventHandler::handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv) { - osgGA::EventVisitor* ev = dynamic_cast(nv); + osgGA::EventVisitor* ev = nv->asEventVisitor(); osgGA::GUIEventAdapter* ea = event->asGUIEventAdapter(); if (ea && ev && ev->getActionAdapter()) { diff --git a/src/osgGA/Widget.cpp b/src/osgGA/Widget.cpp index 7756b482e..8d5594ce3 100644 --- a/src/osgGA/Widget.cpp +++ b/src/osgGA/Widget.cpp @@ -50,7 +50,7 @@ void Widget::setExtents(const osg::BoundingBoxf& bb) void Widget::updateFocus(osg::NodeVisitor& nv) { - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); osgGA::GUIActionAdapter* aa = ev ? ev->getActionAdapter() : 0; if (ev && aa) { @@ -214,7 +214,7 @@ void Widget::traverseImplementation(osg::NodeVisitor& nv) if (!_graphicsInitialized && nv.getVisitorType()!=osg::NodeVisitor::CULL_VISITOR) createGraphics(); - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); if (ev) { updateFocus(nv); diff --git a/src/osgManipulator/Dragger.cpp b/src/osgManipulator/Dragger.cpp index 9a9a9b97c..5779697b2 100644 --- a/src/osgManipulator/Dragger.cpp +++ b/src/osgManipulator/Dragger.cpp @@ -298,7 +298,7 @@ void Dragger::traverse(osg::NodeVisitor& nv) { if (_handleEvents && nv.getVisitorType()==osg::NodeVisitor::EVENT_VISITOR) { - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); if (ev) { for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin(); diff --git a/src/osgParticle/ParticleProcessor.cpp b/src/osgParticle/ParticleProcessor.cpp index 0f2a8622b..c8ba61b9a 100644 --- a/src/osgParticle/ParticleProcessor.cpp +++ b/src/osgParticle/ParticleProcessor.cpp @@ -55,7 +55,7 @@ osgParticle::ParticleProcessor::ParticleProcessor(const ParticleProcessor& copy, void osgParticle::ParticleProcessor::traverse(osg::NodeVisitor& nv) { // typecast the NodeVisitor to CullVisitor - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); // continue only if the visitor actually is a cull visitor if (cv) { diff --git a/src/osgParticle/ParticleSystem.cpp b/src/osgParticle/ParticleSystem.cpp index 0b05952ea..5effdb702 100644 --- a/src/osgParticle/ParticleSystem.cpp +++ b/src/osgParticle/ParticleSystem.cpp @@ -135,7 +135,7 @@ void osgParticle::ParticleSystem::update(double dt, osg::NodeVisitor& nv) if (_sortMode != NO_SORT) { // sort particles - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { osg::Matrixd modelview = *(cv->getModelViewMatrix()); diff --git a/src/osgParticle/ParticleSystemUpdater.cpp b/src/osgParticle/ParticleSystemUpdater.cpp index 1c826e870..e2aeef75b 100644 --- a/src/osgParticle/ParticleSystemUpdater.cpp +++ b/src/osgParticle/ParticleSystemUpdater.cpp @@ -22,7 +22,7 @@ osgParticle::ParticleSystemUpdater::ParticleSystemUpdater(const ParticleSystemUp void osgParticle::ParticleSystemUpdater::traverse(osg::NodeVisitor& nv) { - osgUtil::CullVisitor *cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { if (nv.getFrameStamp()) diff --git a/src/osgParticle/PrecipitationEffect.cpp b/src/osgParticle/PrecipitationEffect.cpp index 08c295d1d..d710c2e12 100644 --- a/src/osgParticle/PrecipitationEffect.cpp +++ b/src/osgParticle/PrecipitationEffect.cpp @@ -182,7 +182,7 @@ void PrecipitationEffect::traverse(osg::NodeVisitor& nv) return; } - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (!cv) { return; diff --git a/src/osgPlugins/logo/ReaderWriterLOGO.cpp b/src/osgPlugins/logo/ReaderWriterLOGO.cpp index 68e1a7f83..4082e4235 100644 --- a/src/osgPlugins/logo/ReaderWriterLOGO.cpp +++ b/src/osgPlugins/logo/ReaderWriterLOGO.cpp @@ -38,7 +38,7 @@ class Logos: public osg::Drawable virtual bool cull(osg::NodeVisitor *visitor, osg::Drawable* drawable, osg::State*) const { Logos *logos = dynamic_cast (drawable); - osgUtil::CullVisitor *cv = dynamic_cast(visitor); + osgUtil::CullVisitor *cv = visitor->asCullVisitor(); if (!cv) return true; unsigned int contextID = cv->getState()!=0 ? cv->getState()->getContextID() : 0; diff --git a/src/osgPlugins/txp/TXPNode.cpp b/src/osgPlugins/txp/TXPNode.cpp index 8e914a035..165aaad64 100644 --- a/src/osgPlugins/txp/TXPNode.cpp +++ b/src/osgPlugins/txp/TXPNode.cpp @@ -107,7 +107,7 @@ void TXPNode::traverse(osg::NodeVisitor& nv) OpenThreads::ScopedLock lock(_mutex); - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { //#define PRINT_TILEMAPP_TIMEINFO diff --git a/src/osgPresentation/Cursor.cpp b/src/osgPresentation/Cursor.cpp index e0f605c9a..044f69f29 100644 --- a/src/osgPresentation/Cursor.cpp +++ b/src/osgPresentation/Cursor.cpp @@ -179,7 +179,7 @@ void Cursor::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::EVENT_VISITOR) { - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); if (!ev) return; osgGA::EventQueue::Events& events = ev->getEvents(); @@ -239,7 +239,7 @@ void Cursor::traverse(osg::NodeVisitor& nv) #if 0 if (!_camera) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { _camera = cv->getCurrentCamera(); diff --git a/src/osgPresentation/Timeout.cpp b/src/osgPresentation/Timeout.cpp index 5718441ef..04d226372 100644 --- a/src/osgPresentation/Timeout.cpp +++ b/src/osgPresentation/Timeout.cpp @@ -196,7 +196,7 @@ void Timeout::traverse(osg::NodeVisitor& nv) { if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (_displayTimeout && cv) { osgUtil::RenderStage* previous_stage = cv->getCurrentRenderBin()->getStage(); @@ -248,7 +248,7 @@ void Timeout::traverse(osg::NodeVisitor& nv) bool previous_displayTimeout = _displayTimeout; bool needToDismiss = false; - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); osgViewer::Viewer* viewer = ev ? dynamic_cast(ev->getActionAdapter()) : 0; if (ev) { diff --git a/src/osgShadow/ShadowTechnique.cpp b/src/osgShadow/ShadowTechnique.cpp index 809f07ad8..aa5002117 100644 --- a/src/osgShadow/ShadowTechnique.cpp +++ b/src/osgShadow/ShadowTechnique.cpp @@ -84,7 +84,7 @@ void ShadowTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType() == osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) cull(*cv); else _shadowedScene->osg::Group::traverse(nv); } diff --git a/src/osgShadow/ViewDependentShadowMap.cpp b/src/osgShadow/ViewDependentShadowMap.cpp index 8d0ff9160..3ae43ef6f 100644 --- a/src/osgShadow/ViewDependentShadowMap.cpp +++ b/src/osgShadow/ViewDependentShadowMap.cpp @@ -168,8 +168,8 @@ VDSMCameraCullCallback::VDSMCameraCullCallback(ViewDependentShadowMap* vdsm, osg void VDSMCameraCullCallback::operator()(osg::Node* node, osg::NodeVisitor* nv) { - osgUtil::CullVisitor* cv = dynamic_cast(nv); - osg::Camera* camera = dynamic_cast(node); + osgUtil::CullVisitor* cv = nv->asCullVisitor(); + osg::Camera* camera = node->asCamera(); OSG_INFO<<"VDSMCameraCullCallback::operator()(osg::Node* "<(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (!cv) { LOD::traverse(nv); diff --git a/src/osgSim/LightPointNode.cpp b/src/osgSim/LightPointNode.cpp index 1c03170b4..15909c0a0 100644 --- a/src/osgSim/LightPointNode.cpp +++ b/src/osgSim/LightPointNode.cpp @@ -141,7 +141,7 @@ void LightPointNode::traverse(osg::NodeVisitor& nv) t1 = timer.tick(); #endif - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); #ifdef USE_TIMER t2 = timer.tick(); diff --git a/src/osgSim/OverlayNode.cpp b/src/osgSim/OverlayNode.cpp index 1f59f308b..bce459373 100644 --- a/src/osgSim/OverlayNode.cpp +++ b/src/osgSim/OverlayNode.cpp @@ -1330,7 +1330,7 @@ void OverlayNode::traverse_OBJECT_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeV return; } - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (!cv) { Group::traverse(nv); @@ -1384,7 +1384,7 @@ void OverlayNode::traverse_VIEW_DEPENDENT_WITH_ORTHOGRAPHIC_OVERLAY(osg::NodeVis return; } - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (!cv) { Group::traverse(nv); diff --git a/src/osgTerrain/DisplacementMappingTechnique.cpp b/src/osgTerrain/DisplacementMappingTechnique.cpp index 0e434c853..a037bbbee 100644 --- a/src/osgTerrain/DisplacementMappingTechnique.cpp +++ b/src/osgTerrain/DisplacementMappingTechnique.cpp @@ -72,7 +72,7 @@ void DisplacementMappingTechnique::traverse(osg::NodeVisitor& nv) { // if (_terrainTile->getDirty()) _terrainTile->init(_terrainTile->getDirtyMask(), false); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -81,7 +81,7 @@ void DisplacementMappingTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv); diff --git a/src/osgTerrain/GeometryTechnique.cpp b/src/osgTerrain/GeometryTechnique.cpp index 53044979a..b363f4a52 100644 --- a/src/osgTerrain/GeometryTechnique.cpp +++ b/src/osgTerrain/GeometryTechnique.cpp @@ -1456,7 +1456,7 @@ void GeometryTechnique::traverse(osg::NodeVisitor& nv) { if (_terrainTile->getDirty()) _terrainTile->init(_terrainTile->getDirtyMask(), false); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -1465,7 +1465,7 @@ void GeometryTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv); diff --git a/src/osgTerrain/Terrain.cpp b/src/osgTerrain/Terrain.cpp index 3b6d87b16..09c2cb56e 100644 --- a/src/osgTerrain/Terrain.cpp +++ b/src/osgTerrain/Terrain.cpp @@ -92,7 +92,7 @@ void Terrain::traverse(osg::NodeVisitor& nv) if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR) { // need to check if any TerrainTechniques need to have their update called on them. - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { typedef std::list< osg::ref_ptr > TerrainTileList; @@ -125,7 +125,7 @@ void Terrain::traverse(osg::NodeVisitor& nv) if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); osg::StateSet* ss = _geometryPool.valid() ? _geometryPool->getRootStateSetForTerrain(this) : 0; if (cv && ss) { diff --git a/src/osgTerrain/TerrainTechnique.cpp b/src/osgTerrain/TerrainTechnique.cpp index 1d9b027ae..b0efe8b17 100644 --- a/src/osgTerrain/TerrainTechnique.cpp +++ b/src/osgTerrain/TerrainTechnique.cpp @@ -114,7 +114,7 @@ void TerrainTechnique::traverse(osg::NodeVisitor& nv) { if (_terrainTile->getDirty()) _terrainTile->init(_terrainTile->getDirtyMask(), false); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -124,7 +124,7 @@ void TerrainTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv); diff --git a/src/osgUI/Callbacks.cpp b/src/osgUI/Callbacks.cpp index 9821b5afc..bf14e19dc 100644 --- a/src/osgUI/Callbacks.cpp +++ b/src/osgUI/Callbacks.cpp @@ -38,7 +38,7 @@ bool CloseCallback::run(osg::Object* object, osg::Parameters&, osg::Parameters&) _closeWidget->setVisible(false); } - osg::Node* node = dynamic_cast(object); + osg::Node* node = object->asNode(); if (node) { osg::NodePathList nodePathList = node->getParentalNodePaths(); diff --git a/src/osgUI/Widget.cpp b/src/osgUI/Widget.cpp index d586ca8e8..d7a261031 100644 --- a/src/osgUI/Widget.cpp +++ b/src/osgUI/Widget.cpp @@ -61,7 +61,7 @@ void Widget::setExtents(const osg::BoundingBoxf& bb) void Widget::updateFocus(osg::NodeVisitor& nv) { - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); osgGA::GUIActionAdapter* aa = ev ? ev->getActionAdapter() : 0; if (ev && aa) { @@ -209,7 +209,7 @@ void Widget::traverseImplementation(osg::NodeVisitor& nv) { if (!_graphicsInitialized && nv.getVisitorType()!=osg::NodeVisitor::CULL_VISITOR) createGraphics(); - osgGA::EventVisitor* ev = dynamic_cast(&nv); + osgGA::EventVisitor* ev = nv.asEventVisitor(); if (ev) { if (_visible && _enabled) @@ -255,7 +255,7 @@ void Widget::traverseImplementation(osg::NodeVisitor& nv) else if (_visible || (nv.getVisitorType()!=osg::NodeVisitor::UPDATE_VISITOR && nv.getVisitorType()!=osg::NodeVisitor::CULL_VISITOR && nv.getVisitorType()!=osg::NodeVisitor::INTERSECTION_VISITOR) ) { - osgUtil::CullVisitor* cv = (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) ? dynamic_cast(&nv) : 0; + osgUtil::CullVisitor* cv = (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) ? nv.asCullVisitor() : 0; if (cv && _widgetStateSet.valid()) cv->pushStateSet(_widgetStateSet.get()); GraphicsSubgraphMap::iterator itr = _graphicsSubgraphMap.begin(); @@ -476,7 +476,7 @@ bool Widget::computeExtentsPositionInLocalCoordinates(osgGA::EventVisitor* ev, o if (event->getNumPointerData()>=1) { const osgGA::PointerData* pd = event->getPointerData(event->getNumPointerData()-1); - camera = dynamic_cast(pd->object.get()); + camera = pd->object->asCamera(); if (camera) { x = pd->getXnormalized(); diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index fa195c450..e08783a2e 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -719,11 +719,11 @@ void SceneView::cull() else { - if (!_cullVisitorLeft.valid()) _cullVisitorLeft = dynamic_cast(_cullVisitor->clone()); + if (!_cullVisitorLeft.valid()) _cullVisitorLeft = _cullVisitor->clone(); if (!_stateGraphLeft.valid()) _stateGraphLeft = dynamic_cast(_stateGraph->cloneType()); if (!_renderStageLeft.valid()) _renderStageLeft = dynamic_cast(_renderStage->clone(osg::CopyOp::DEEP_COPY_ALL)); - if (!_cullVisitorRight.valid()) _cullVisitorRight = dynamic_cast(_cullVisitor->clone()); + if (!_cullVisitorRight.valid()) _cullVisitorRight = _cullVisitor->clone(); if (!_stateGraphRight.valid()) _stateGraphRight = dynamic_cast(_stateGraph->cloneType()); if (!_renderStageRight.valid()) _renderStageRight = dynamic_cast(_renderStage->clone(osg::CopyOp::DEEP_COPY_ALL)); diff --git a/src/osgVolume/FixedFunctionTechnique.cpp b/src/osgVolume/FixedFunctionTechnique.cpp index ba97c43dc..19e94315c 100644 --- a/src/osgVolume/FixedFunctionTechnique.cpp +++ b/src/osgVolume/FixedFunctionTechnique.cpp @@ -276,7 +276,7 @@ void FixedFunctionTechnique::traverse(osg::NodeVisitor& nv) { if (_volumeTile->getDirty()) _volumeTile->init(); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -286,7 +286,7 @@ void FixedFunctionTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv); diff --git a/src/osgVolume/MultipassTechnique.cpp b/src/osgVolume/MultipassTechnique.cpp index 450847bd0..e2f97da37 100644 --- a/src/osgVolume/MultipassTechnique.cpp +++ b/src/osgVolume/MultipassTechnique.cpp @@ -163,7 +163,7 @@ class RTTCameraCullCallback : public osg::NodeCallback virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { - osgUtil::CullVisitor* cv = dynamic_cast(nv); + osgUtil::CullVisitor* cv = nv->asCullVisitor(); cv->pushProjectionMatrix(_tileData->projectionMatrix.get()); @@ -937,7 +937,7 @@ class RTTBackfaceCameraCullCallback : public osg::NodeCallback virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { - osgUtil::CullVisitor* cv = dynamic_cast(nv); + osgUtil::CullVisitor* cv = nv->asCullVisitor(); cv->pushProjectionMatrix(_tileData->projectionMatrix.get()); @@ -1157,7 +1157,7 @@ void MultipassTechnique::traverse(osg::NodeVisitor& nv) { if (_volumeTile->getDirty()) _volumeTile->init(); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -1167,7 +1167,7 @@ void MultipassTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv); diff --git a/src/osgVolume/RayTracedTechnique.cpp b/src/osgVolume/RayTracedTechnique.cpp index f014f3ab9..787e10291 100644 --- a/src/osgVolume/RayTracedTechnique.cpp +++ b/src/osgVolume/RayTracedTechnique.cpp @@ -525,7 +525,7 @@ void RayTracedTechnique::traverse(osg::NodeVisitor& nv) { if (_volumeTile->getDirty()) _volumeTile->init(); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -535,7 +535,7 @@ void RayTracedTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv); diff --git a/src/osgVolume/VolumeScene.cpp b/src/osgVolume/VolumeScene.cpp index 78a43748b..56133b798 100644 --- a/src/osgVolume/VolumeScene.cpp +++ b/src/osgVolume/VolumeScene.cpp @@ -33,7 +33,7 @@ class RTTCameraCullCallback : public osg::NodeCallback virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { - osgUtil::CullVisitor* cv = dynamic_cast(nv); + osgUtil::CullVisitor* cv = nv->asCullVisitor(); _volumeScene->osg::Group::traverse(*nv); @@ -135,7 +135,7 @@ TileData* VolumeScene::getTileData(osgUtil::CullVisitor* cv, osgVolume::VolumeTi void VolumeScene::traverse(osg::NodeVisitor& nv) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (!cv) { Group::traverse(nv); diff --git a/src/osgVolume/VolumeTechnique.cpp b/src/osgVolume/VolumeTechnique.cpp index bda2983a9..21da95973 100644 --- a/src/osgVolume/VolumeTechnique.cpp +++ b/src/osgVolume/VolumeTechnique.cpp @@ -63,7 +63,7 @@ void VolumeTechnique::traverse(osg::NodeVisitor& nv) { if (_volumeTile->getDirty()) _volumeTile->init(); - osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); + osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor(); if (uv) { update(uv); @@ -73,7 +73,7 @@ void VolumeTechnique::traverse(osg::NodeVisitor& nv) } else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { - osgUtil::CullVisitor* cv = dynamic_cast(&nv); + osgUtil::CullVisitor* cv = nv.asCullVisitor(); if (cv) { cull(cv);