]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/util/SGSceneUserData.hxx
Use of copy-constructors
[simgear.git] / simgear / scene / util / SGSceneUserData.hxx
index e8acbe9e9d567d28d6992afd899bb7a2668047b9..d0c69d030275ccdc3f15e6a815d1d989e8d2247a 100644 (file)
 #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)
+    : osg::Object(rhs,copyOp),
+      _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