Added asGroup() and asTransform() methods to osg::Node to downcast nodes
to these types without requiring an expensive dynamic_cast<>. Also added asGeometry() to osg::Drawable for the same reasons.
This commit is contained in:
parent
b5870857c4
commit
f867dd81be
@ -21,6 +21,7 @@ class Vec3;
|
|||||||
class Vec4;
|
class Vec4;
|
||||||
class UByte4;
|
class UByte4;
|
||||||
class Node;
|
class Node;
|
||||||
|
class Geometry;
|
||||||
|
|
||||||
// this is define to alter the way display lists are compiled inside the
|
// this is define to alter the way display lists are compiled inside the
|
||||||
// the draw method, it has been found that the NVidia drivers fail completely
|
// the draw method, it has been found that the NVidia drivers fail completely
|
||||||
@ -49,6 +50,12 @@ class SG_EXPORT Drawable : public Object
|
|||||||
virtual const char* libraryName() const { return "osg"; }
|
virtual const char* libraryName() const { return "osg"; }
|
||||||
virtual const char* className() const { return "Drawable"; }
|
virtual const char* className() const { return "Drawable"; }
|
||||||
|
|
||||||
|
/** convert 'this' into a Geometry pointer if Drawable is a Geometry, otherwise return 0.
|
||||||
|
* Equivalent to dynamic_cast<Geometry*>(this).*/
|
||||||
|
virtual Geometry* asGeometry() { return 0; }
|
||||||
|
/** convert 'const this' into a const Geometry pointer if Drawable is a Geometry, otherwise return 0.
|
||||||
|
* Equivalent to dynamic_cast<const Geometry*>(this).*/
|
||||||
|
virtual const Geometry* asGeometry() const { return 0; }
|
||||||
|
|
||||||
/** A vector of osg::Node pointers which is used to store the parent(s) of drawable.*/
|
/** A vector of osg::Node pointers which is used to store the parent(s) of drawable.*/
|
||||||
typedef std::vector<Node*> ParentList;
|
typedef std::vector<Node*> ParentList;
|
||||||
|
@ -30,6 +30,9 @@ class SG_EXPORT Geometry : public Drawable
|
|||||||
virtual const char* libraryName() const { return "osg"; }
|
virtual const char* libraryName() const { return "osg"; }
|
||||||
virtual const char* className() const { return "Geometry"; }
|
virtual const char* className() const { return "Geometry"; }
|
||||||
|
|
||||||
|
virtual Geometry* asGeometry() { return this; }
|
||||||
|
virtual const Geometry* asGeometry() const { return this; }
|
||||||
|
|
||||||
enum AttributeBinding
|
enum AttributeBinding
|
||||||
{
|
{
|
||||||
BIND_OFF=0,
|
BIND_OFF=0,
|
||||||
|
@ -27,6 +27,9 @@ class SG_EXPORT Group : public Node
|
|||||||
|
|
||||||
META_Node(osg, Group);
|
META_Node(osg, Group);
|
||||||
|
|
||||||
|
virtual Group* asGroup() { return this; }
|
||||||
|
virtual const Group* asGroup() const { return this; }
|
||||||
|
|
||||||
virtual void traverse(NodeVisitor& nv);
|
virtual void traverse(NodeVisitor& nv);
|
||||||
|
|
||||||
/** Add Node to Group.
|
/** Add Node to Group.
|
||||||
|
@ -17,6 +17,7 @@ namespace osg {
|
|||||||
|
|
||||||
class NodeVisitor;
|
class NodeVisitor;
|
||||||
class Group;
|
class Group;
|
||||||
|
class Transform;
|
||||||
|
|
||||||
/** META_Node macro define the standard clone, isSameKindAs, className
|
/** META_Node macro define the standard clone, isSameKindAs, className
|
||||||
* and accept methods. Use when subclassing from Node to make it
|
* and accept methods. Use when subclassing from Node to make it
|
||||||
@ -60,6 +61,20 @@ class SG_EXPORT Node : public Object
|
|||||||
/** return the name of the node's class type.*/
|
/** return the name of the node's class type.*/
|
||||||
virtual const char* className() const { return "Node"; }
|
virtual const char* className() const { return "Node"; }
|
||||||
|
|
||||||
|
/** convert 'this' into a Group pointer if Node is a Group, otherwise return 0.
|
||||||
|
* Equivalent to dynamic_cast<Group*>(this).*/
|
||||||
|
virtual Group* asGroup() { return 0; }
|
||||||
|
/** convert 'const this' into a const Group pointer if Node is a Group, otherwise return 0.
|
||||||
|
* Equivalent to dynamic_cast<const Group*>(this).*/
|
||||||
|
virtual const Group* asGroup() const { return 0; }
|
||||||
|
|
||||||
|
/** convert 'this' into a Transform pointer if Node is a Transform, otherwise return 0.
|
||||||
|
* Equivalent to dynamic_cast<Transform*>(this).*/
|
||||||
|
virtual Transform* asTransform() { return 0; }
|
||||||
|
/** convert 'const this' into a const Transform pointer if Node is a Transform, otherwise return 0.
|
||||||
|
* Equivalent to dynamic_cast<const Transform*>(this).*/
|
||||||
|
virtual const Transform* asTransform() const { return 0; }
|
||||||
|
|
||||||
/** Visitor Pattern : calls the apply method of a NodeVisitor with this node's type.*/
|
/** Visitor Pattern : calls the apply method of a NodeVisitor with this node's type.*/
|
||||||
virtual void accept(NodeVisitor& nv);
|
virtual void accept(NodeVisitor& nv);
|
||||||
/** Traverse upwards : calls parents' accept method with NodeVisitor.*/
|
/** Traverse upwards : calls parents' accept method with NodeVisitor.*/
|
||||||
|
@ -45,6 +45,9 @@ class SG_EXPORT Transform : public Group
|
|||||||
|
|
||||||
META_Node(osg, Transform);
|
META_Node(osg, Transform);
|
||||||
|
|
||||||
|
virtual Transform* asTransform() { return this; }
|
||||||
|
virtual const Transform* asTransform() const { return this; }
|
||||||
|
|
||||||
enum ReferenceFrame
|
enum ReferenceFrame
|
||||||
{
|
{
|
||||||
RELATIVE_TO_PARENTS,
|
RELATIVE_TO_PARENTS,
|
||||||
|
@ -229,7 +229,7 @@ bool Group::computeBound() const
|
|||||||
itr!=_children.end();
|
itr!=_children.end();
|
||||||
++itr)
|
++itr)
|
||||||
{
|
{
|
||||||
const osg::Transform* transform = dynamic_cast<const osg::Transform*>(itr->get());
|
const osg::Transform* transform = (*itr)->asTransform();
|
||||||
if (!transform || transform->getReferenceFrame()==osg::Transform::RELATIVE_TO_PARENTS)
|
if (!transform || transform->getReferenceFrame()==osg::Transform::RELATIVE_TO_PARENTS)
|
||||||
{
|
{
|
||||||
bb.expandBy((*itr)->getBound());
|
bb.expandBy((*itr)->getBound());
|
||||||
@ -244,7 +244,7 @@ bool Group::computeBound() const
|
|||||||
itr!=_children.end();
|
itr!=_children.end();
|
||||||
++itr)
|
++itr)
|
||||||
{
|
{
|
||||||
const osg::Transform* transform = dynamic_cast<const osg::Transform*>(itr->get());
|
const osg::Transform* transform = (*itr)->asTransform();
|
||||||
if (!transform || transform->getReferenceFrame()==osg::Transform::RELATIVE_TO_PARENTS)
|
if (!transform || transform->getReferenceFrame()==osg::Transform::RELATIVE_TO_PARENTS)
|
||||||
{
|
{
|
||||||
_bsphere.expandRadiusBy((*itr)->getBound());
|
_bsphere.expandRadiusBy((*itr)->getBound());
|
||||||
|
Loading…
Reference in New Issue
Block a user