#ifndef SG_SCENE_USERDATA_HXX
#define SG_SCENE_USERDATA_HXX
-#include <osg/Referenced>
+#include <vector>
#include <osg/Node>
+#include <osg/Object>
+#include <simgear/scene/bvh/BVHNode.hxx>
#include "SGPickCallback.hxx"
-class SGSceneUserData : public osg::Referenced {
+class SGSceneUserData : public osg::Object {
public:
- static SGSceneUserData* getSceneUserData(osg::Node* node)
+ META_Object(simgear, SGSceneUserData);
+ SGSceneUserData() {}
+ SGSceneUserData(const SGSceneUserData& rhs,
+ const osg::CopyOp& copyOp = osg::CopyOp::SHALLOW_COPY)
+ : _bvhNode(rhs._bvhNode), _velocity(rhs._velocity),
+ _pickCallbacks(rhs._pickCallbacks)
{
- if (!node)
- return 0;
- osg::Referenced* referenced = node->getUserData();
- if (!referenced)
- return 0;
- return dynamic_cast<SGSceneUserData*>(referenced);
- }
- static SGSceneUserData* getOrCreateSceneUserData(osg::Node* node)
- {
- SGSceneUserData* userData = getSceneUserData(node);
- if (userData)
- return userData;
- userData = new SGSceneUserData;
- node->setUserData(userData);
- return userData;
}
+ static SGSceneUserData* getSceneUserData(osg::Node* node);
+ static const SGSceneUserData* getSceneUserData(const osg::Node* node);
+ static SGSceneUserData* getOrCreateSceneUserData(osg::Node* node);
+
+ /// Access to the pick callbacks of a node.
+ unsigned getNumPickCallbacks() const;
+ SGPickCallback* getPickCallback(unsigned i) const;
+ void setPickCallback(SGPickCallback* pickCallback);
+ void addPickCallback(SGPickCallback* pickCallback);
- SGPickCallback* getPickCallback() const
- { return _pickCallback; }
- void setPickCallback(SGPickCallback* pickCallback)
- { _pickCallback = pickCallback; }
+ const simgear::BVHNode* getBVHNode() const
+ { return _bvhNode; }
+ simgear::BVHNode* getBVHNode()
+ { return _bvhNode; }
+ void setBVHNode(simgear::BVHNode* bvhNode)
+ { _bvhNode = bvhNode; }
+
+ struct Velocity : public SGReferenced {
+ Velocity() :
+ linear(SGVec3d::zeros()),
+ angular(SGVec3d::zeros()),
+ referenceTime(0),
+ id(simgear::BVHNode::getNewId())
+ {}
+ SGVec3d linear;
+ SGVec3d angular;
+ double referenceTime;
+ simgear::BVHNode::Id id;
+ };
+ const Velocity* getVelocity() const
+ { return _velocity; }
+ Velocity* getOrCreateVelocity()
+ { if (!_velocity) _velocity = new Velocity; return _velocity; }
+ void setVelocity(Velocity* velocity)
+ { _velocity = velocity; }
private:
- SGSharedPtr<SGPickCallback> _pickCallback;
+ // If this node has a collision tree attached, it is stored here
+ SGSharedPtr<simgear::BVHNode> _bvhNode;
+
+ // Velocity in the childs local coordinate system
+ SGSharedPtr<Velocity> _velocity;
+
+ /// Scene interaction callbacks
+ std::vector<SGSharedPtr<SGPickCallback> > _pickCallbacks;
};
#endif