Introduce osg::Object::asNode(), asNodeVisitor(), asStateAttribute() and asUniform() to replace dynamic_cast<> usage in Callback.cpp.

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14902 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield
2015-06-09 10:49:34 +00:00
parent 37d051af5e
commit 7e05d2fd54
6 changed files with 78 additions and 12 deletions

View File

@@ -25,13 +25,8 @@ bool Callback::traverse(Object* object, Object* data)
if (_nestedCallback.valid()) return _nestedCallback->run(object, data);
else
{
#if 1
osg::Node* node = dynamic_cast<osg::Node*>(object);
osg::NodeVisitor* nv = dynamic_cast<osg::NodeVisitor*>(data);
#else
osg::Node* node = object ? data->asNode() : 0;
osg::Node* node = object ? object->asNode() : 0;
osg::NodeVisitor* nv = data ? data->asNodeVisitor() : 0;
#endif
if (node && nv)
{
nv->traverse(*node);
@@ -69,8 +64,9 @@ bool CallbackObject::run(osg::Object* object, osg::Parameters& inputParameters,
//
bool NodeCallback::run(osg::Object* object, osg::Object* data)
{
osg::Node* node = dynamic_cast<osg::Node*>(object);
osg::NodeVisitor* nv = dynamic_cast<osg::NodeVisitor*>(data);
osg::Node* node = object ? object->asNode() : 0;
osg::NodeVisitor* nv = data ? data->asNodeVisitor() : 0;
if (node && nv)
{
operator()(node, nv);
@@ -95,8 +91,8 @@ void NodeCallback::operator()(Node* node, NodeVisitor* nv)
//
bool StateAttributeCallback::run(osg::Object* object, osg::Object* data)
{
osg::StateAttribute* sa = dynamic_cast<osg::StateAttribute*>(object);
osg::NodeVisitor* nv = dynamic_cast<osg::NodeVisitor*>(data);
osg::StateAttribute* sa = object ? object->asStateAttribute() : 0;
osg::NodeVisitor* nv = data ? data->asNodeVisitor() : 0;
if (sa && nv)
{
operator()(sa, nv);
@@ -114,8 +110,8 @@ bool StateAttributeCallback::run(osg::Object* object, osg::Object* data)
//
bool UniformCallback::run(osg::Object* object, osg::Object* data)
{
osg::Uniform* uniform = dynamic_cast<osg::Uniform*>(object);
osg::NodeVisitor* nv = dynamic_cast<osg::NodeVisitor*>(data);
osg::Uniform* uniform = object ? object->asUniform() : 0;
osg::NodeVisitor* nv = data ? data->asNodeVisitor() : 0;
if (uniform && nv)
{
operator()(uniform, nv);