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/osg/State b/include/osg/State index 68ff52d5c..131bd91ca 100644 --- a/include/osg/State +++ b/include/osg/State @@ -1744,7 +1744,7 @@ class OSG_EXPORT State : public Referenced { if (as.last_applied_attribute != attribute) { - if (!as.global_default_attribute.valid()) as.global_default_attribute = dynamic_cast(attribute->cloneType()); + if (!as.global_default_attribute.valid()) as.global_default_attribute = attribute->cloneType()->asStateAttribute(); as.last_applied_attribute = attribute; attribute->apply(*this); @@ -1770,7 +1770,7 @@ class OSG_EXPORT State : public Referenced { if (setActiveTextureUnit(unit)) { - if (!as.global_default_attribute.valid()) as.global_default_attribute = dynamic_cast(attribute->cloneType()); + if (!as.global_default_attribute.valid()) as.global_default_attribute = attribute->cloneType()->asStateAttribute(); as.last_applied_attribute = attribute; attribute->apply(*this); 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..1079adbf5 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(); @@ -392,7 +392,7 @@ bool Dragger::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& ritr != nodePath.rend(); ++ritr) { - osg::Camera* camera = dynamic_cast(*ritr); + osg::Camera* camera = (*ritr)->asCamera(); if (camera && (camera->getReferenceFrame()!=osg::Transform::RELATIVE_RF || camera->getParents().empty())) { rootCamera = camera; 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/pov/ReaderWriterPOV.cpp b/src/osgPlugins/pov/ReaderWriterPOV.cpp index 4ca9129fc..ca1a2b224 100644 --- a/src/osgPlugins/pov/ReaderWriterPOV.cpp +++ b/src/osgPlugins/pov/ReaderWriterPOV.cpp @@ -30,7 +30,7 @@ writeNodeImplementation( const Node& node, ostream& fout, const osgDB::ReaderWriter::Options* options ) { // get camera on the top of scene graph - const Camera *camera = dynamic_cast< const Camera* >( &node ); + const Camera *camera = node.asCamera(); Vec3d eye, center, up, right; double fovy, aspectRatio, tmp; diff --git a/src/osgPresentation/Cursor.cpp b/src/osgPresentation/Cursor.cpp index e0f605c9a..bf71e61d9 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(); @@ -200,7 +200,7 @@ void Cursor::traverse(osg::NodeVisitor& nv) if (event->getNumPointerData()>=1) { const osgGA::PointerData* pd = event->getPointerData(event->getNumPointerData()-1); - osg::Camera* camera = dynamic_cast(pd->object.get()); + osg::Camera* camera = pd->object.valid() ? pd->object->asCamera() : 0; _cursorXY.set(pd->getXnormalized(), pd->getYnormalized()); _camera = camera; @@ -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/osgViewer/CompositeViewer.cpp b/src/osgViewer/CompositeViewer.cpp index c126ea593..c32ca443e 100644 --- a/src/osgViewer/CompositeViewer.cpp +++ b/src/osgViewer/CompositeViewer.cpp @@ -916,7 +916,8 @@ void CompositeViewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, dest_event.setMouseYOrientationAndUpdateCoords(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); - osg::Camera* camera = (source_event.getNumPointerData()>=2) ? dynamic_cast(source_event.getPointerData(1)->object.get()) : 0; + osg::Object* object = (source_event.getNumPointerData()>=2) ? source_event.getPointerData(1)->object.get() : 0; + osg::Camera* camera = object ? object->asCamera() : 0; osg::Viewport* viewport = camera ? camera->getViewport() : 0; if (!viewport) return; @@ -1030,7 +1031,8 @@ void CompositeViewer::eventTraversal() } osgGA::PointerData* pd = event->getNumPointerData()>0 ? event->getPointerData(event->getNumPointerData()-1) : 0; - osg::Camera* camera = pd ? dynamic_cast(pd->object.get()) : 0; + osg::Object* object = pd ? pd->object.get() : 0; + osg::Camera* camera = object ? object->asCamera() : 0; osgViewer::View* view = camera ? dynamic_cast(camera->getView()) : 0; if (!view) diff --git a/src/osgViewer/Keystone.cpp b/src/osgViewer/Keystone.cpp index 66bca206c..10466cf64 100644 --- a/src/osgViewer/Keystone.cpp +++ b/src/osgViewer/Keystone.cpp @@ -118,7 +118,7 @@ struct KeystoneUpdateCallback : public osg::DrawableUpdateCallback /** do customized update code.*/ virtual void update(osg::NodeVisitor*, osg::Drawable* drawable) { - update(dynamic_cast(drawable)); + update(drawable->asGeometry()); } void update(osg::Geometry* geometry) @@ -418,8 +418,8 @@ osg::Vec2d KeystoneHandler::incrementScale(const osgGA::GUIEventAdapter& ea) con bool KeystoneHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& /*aa*/, osg::Object* obj, osg::NodeVisitor* /*nv*/) { - osg::Camera* camera = dynamic_cast(obj); - osg::Viewport* viewport = camera ? camera->getViewport() : 0; + osg::Camera* camera = obj ? obj->asCamera() : 0; + osg::Viewport* viewport = camera ? camera->getViewport() : 0; if (!viewport) return false; diff --git a/src/osgViewer/Renderer.cpp b/src/osgViewer/Renderer.cpp index 25fc8e608..53c9abfcd 100644 --- a/src/osgViewer/Renderer.cpp +++ b/src/osgViewer/Renderer.cpp @@ -908,7 +908,7 @@ void Renderer::operator () (osg::Object* object) osg::GraphicsContext* context = dynamic_cast(object); if (context) operator()(context); - osg::Camera* camera = dynamic_cast(object); + osg::Camera* camera =object->asCamera(); if (camera) cull(); } diff --git a/src/osgViewer/View.cpp b/src/osgViewer/View.cpp index a3a5b8173..637dc6b90 100644 --- a/src/osgViewer/View.cpp +++ b/src/osgViewer/View.cpp @@ -1014,7 +1014,7 @@ bool View::computeIntersections(const osgGA::GUIEventAdapter& ea, osgUtil::LineS if (ea.getNumPointerData()>=1) { const osgGA::PointerData* pd = ea.getPointerData(ea.getNumPointerData()-1); - const osg::Camera* camera = dynamic_cast(pd->object.get()); + const osg::Camera* camera = pd->object.valid() ? pd->object->asCamera() : 0; if (camera) { return computeIntersections(camera, osgUtil::Intersector::PROJECTION, pd->getXnormalized(), pd->getYnormalized(), intersections, traversalMask); @@ -1030,7 +1030,7 @@ bool View::computeIntersections(const osgGA::GUIEventAdapter& ea, const osg::Nod if (ea.getNumPointerData()>=1) { const osgGA::PointerData* pd = ea.getPointerData(ea.getNumPointerData()-1); - const osg::Camera* camera = dynamic_cast(pd->object.get()); + const osg::Camera* camera = pd->object.valid() ? pd->object->asCamera() : 0; if (camera) { return computeIntersections(camera, osgUtil::Intersector::PROJECTION, pd->getXnormalized(), pd->getYnormalized(), nodePath, intersections, traversalMask); diff --git a/src/osgViewer/Viewer.cpp b/src/osgViewer/Viewer.cpp index 4c984e663..22e1744c5 100644 --- a/src/osgViewer/Viewer.cpp +++ b/src/osgViewer/Viewer.cpp @@ -849,7 +849,8 @@ void Viewer::reprojectPointerData(osgGA::GUIEventAdapter& source_event, osgGA::G dest_event.setMouseYOrientationAndUpdateCoords(osgGA::GUIEventAdapter::Y_INCREASING_UPWARDS); - osg::Camera* camera = (source_event.getNumPointerData()>=2) ? dynamic_cast(source_event.getPointerData(1)->object.get()) : 0; + osg::Object* object = (source_event.getNumPointerData()>=2) ? source_event.getPointerData(1)->object.get() : 0; + osg::Camera* camera = object ? object->asCamera() : 0; osg::Viewport* viewport = camera ? camera->getViewport() : 0; if (!viewport) return; 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);