Added NodeVisitor::g/setValueMap and g/setValueStack, and osg::PushPopObject and osg::PushPopValue helper classes for pushing/popping values to the NodeVisitor's ValueStack.
This commit is contained in:
parent
b4eb8d4597
commit
f8306f145a
@ -18,6 +18,9 @@
|
|||||||
#include <osg/Matrix>
|
#include <osg/Matrix>
|
||||||
#include <osg/FrameStamp>
|
#include <osg/FrameStamp>
|
||||||
|
|
||||||
|
#include <osg/ValueMap>
|
||||||
|
#include <osg/ValueStack>
|
||||||
|
|
||||||
|
|
||||||
namespace osgUtil { class UpdateVisitor; class CullVisitor; class IntersectionVisitor; }
|
namespace osgUtil { class UpdateVisitor; class CullVisitor; class IntersectionVisitor; }
|
||||||
namespace osgGA { class EventVisitor; }
|
namespace osgGA { class EventVisitor; }
|
||||||
@ -220,6 +223,40 @@ class OSG_EXPORT NodeVisitor : public virtual Object
|
|||||||
/** Get the traversal mode.*/
|
/** Get the traversal mode.*/
|
||||||
inline TraversalMode getTraversalMode() const { return _traversalMode; }
|
inline TraversalMode getTraversalMode() const { return _traversalMode; }
|
||||||
|
|
||||||
|
|
||||||
|
/** Set the ValueMap used to store Values that can be reused over a series of traversals. */
|
||||||
|
inline void setValueMap(ValueMap* ps) { _valueMap = ps; }
|
||||||
|
|
||||||
|
/** Get the ValueMap. */
|
||||||
|
inline ValueMap* getValueMap() { return _valueMap.get(); }
|
||||||
|
|
||||||
|
/** Get the ValueMap. */
|
||||||
|
inline const ValueMap* getValueMap() const { return _valueMap.get(); }
|
||||||
|
|
||||||
|
/** Get the ValueMap. */
|
||||||
|
inline ValueMap* getOrCreateValueMap()
|
||||||
|
{
|
||||||
|
if (!_valueMap) _valueMap = new ValueMap;
|
||||||
|
return _valueMap.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set the ValueStack used to stack Values during traversal. */
|
||||||
|
inline void setValueStack(ValueStack* ps) { _valueStack = ps; }
|
||||||
|
|
||||||
|
/** Get the ValueStack. */
|
||||||
|
inline ValueStack* getValueStack() { return _valueStack.get(); }
|
||||||
|
|
||||||
|
/** Get the const ValueStack. */
|
||||||
|
inline const ValueStack* getValueStack() const { return _valueStack.get(); }
|
||||||
|
|
||||||
|
/** Get the ValueStack. */
|
||||||
|
inline ValueStack* getOrCreateValueStack()
|
||||||
|
{
|
||||||
|
if (!_valueStack) _valueStack = new ValueStack;
|
||||||
|
return _valueStack.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Method for handling traversal of a nodes.
|
/** Method for handling traversal of a nodes.
|
||||||
If you intend to use the visitor for actively traversing
|
If you intend to use the visitor for actively traversing
|
||||||
the scene graph then make sure the accept() methods call
|
the scene graph then make sure the accept() methods call
|
||||||
@ -380,6 +417,8 @@ class OSG_EXPORT NodeVisitor : public virtual Object
|
|||||||
ref_ptr<DatabaseRequestHandler> _databaseRequestHandler;
|
ref_ptr<DatabaseRequestHandler> _databaseRequestHandler;
|
||||||
ref_ptr<ImageRequestHandler> _imageRequestHandler;
|
ref_ptr<ImageRequestHandler> _imageRequestHandler;
|
||||||
|
|
||||||
|
osg::ref_ptr<ValueMap> _valueMap;
|
||||||
|
osg::ref_ptr<ValueStack> _valueStack;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -401,6 +440,98 @@ class NodeAcceptOp
|
|||||||
NodeVisitor& _nv;
|
NodeVisitor& _nv;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class PushPopObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
PushPopObject(NodeVisitor* nv, const Referenced* key, Object* value):
|
||||||
|
_valueStack(0),
|
||||||
|
_key(0)
|
||||||
|
{
|
||||||
|
if (key)
|
||||||
|
{
|
||||||
|
_valueStack = nv->getOrCreateValueStack();
|
||||||
|
_key = key;
|
||||||
|
_valueStack->push(_key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PushPopObject(ValueStack* valueStack, const Referenced* key, Object* value):
|
||||||
|
_valueStack(valueStack),
|
||||||
|
_key(0)
|
||||||
|
{
|
||||||
|
if (_valueStack && key)
|
||||||
|
{
|
||||||
|
_key = key;
|
||||||
|
_valueStack->push(_key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ~PushPopObject()
|
||||||
|
{
|
||||||
|
if (_valueStack) _valueStack->pop(_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ValueStack* _valueStack;
|
||||||
|
const Referenced* _key;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PushPopValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
PushPopValue(NodeVisitor* nv, const Referenced* key, const T& value):
|
||||||
|
_valueStack(0),
|
||||||
|
_key(0)
|
||||||
|
{
|
||||||
|
if (key)
|
||||||
|
{
|
||||||
|
_valueStack = nv->getOrCreateValueStack();
|
||||||
|
_key = key;
|
||||||
|
_valueStack->push(_key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
PushPopValue(ValueStack* valueStack, const Referenced* key, const T& value):
|
||||||
|
_valueStack(valueStack),
|
||||||
|
_key(0)
|
||||||
|
{
|
||||||
|
if (_valueStack && key)
|
||||||
|
{
|
||||||
|
_key = key;
|
||||||
|
_valueStack->push(_key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ~PushPopValue()
|
||||||
|
{
|
||||||
|
if (_valueStack) _valueStack->pop(_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ValueStack* _valueStack;
|
||||||
|
const Referenced* _key;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline ValueStack* getOrCreateUserObjectOfType<NodeVisitor,ValueStack>(NodeVisitor* nv)
|
||||||
|
{
|
||||||
|
return nv->getOrCreateValueStack();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline ValueMap* getOrCreateUserObjectOfType<NodeVisitor,ValueMap>(NodeVisitor* nv)
|
||||||
|
{
|
||||||
|
return nv->getOrCreateValueMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user