Added asUpdate/Cull/EventVisitor and asCamera/asDrawable to osg::Object and usage of these within the code base to avoid dynamic_cast<> usage.

This commit is contained in:
Robert Osfield
2016-01-20 17:49:10 +00:00
parent 2e7cfe7efa
commit 8fc287c1b7
37 changed files with 118 additions and 63 deletions

View File

@@ -18,6 +18,10 @@
#include <osg/Matrix>
#include <osg/FrameStamp>
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<const NodeVisitor*>(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<osgUtil::UpdateVisitor*>(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<const osgUtil::UpdateVisitor*>(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<osgUtil::CullVisitor*>(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<const osgUtil::CullVisitor*>(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<osgGA::EventVisitor*>(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<const osgGA::EventVisitor*>(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<osgUtil::IntersectionVisitor*>(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<const osgUtil::IntersectionVisitor*>(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.

View File

@@ -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<const Uniform*>(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<Camera*>(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<const Camera*>(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<Drawable*>(this).*/
virtual Drawable* asDrawable() { return 0; }

View File

@@ -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<StateAttribute*>(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<StateAttribute*>(attribute->cloneType());
if (!as.global_default_attribute.valid()) as.global_default_attribute = attribute->cloneType()->asStateAttribute();
as.last_applied_attribute = attribute;
attribute->apply(*this);