]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/util/SGSceneUserData.hxx
Work around apparent OSG 3.2.0 normal binding bug.
[simgear.git] / simgear / scene / util / SGSceneUserData.hxx
index 8234ef488269a0e35ceb3e6df2383bd0cc931fd0..c2a08352cafee73e02a9955a0fc5b979c5357f88 100644 (file)
 #define SG_SCENE_USERDATA_HXX
 
 #include <vector>
-#include <osg/Referenced>
 #include <osg/Node>
+#include <osg/Object>
+#include <simgear/bvh/BVHNode.hxx>
 #include "SGPickCallback.hxx"
 
-class SGSceneUserData : public osg::Referenced {
+class SGSceneUserData : public osg::Object {
 public:
+  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)
+  {
+  }
   static SGSceneUserData* getSceneUserData(osg::Node* node);
   static const SGSceneUserData* getSceneUserData(const osg::Node* node);
   static SGSceneUserData* getOrCreateSceneUserData(osg::Node* node);
@@ -38,8 +48,40 @@ public:
   SGPickCallback* getPickCallback(unsigned i) const;
   void setPickCallback(SGPickCallback* pickCallback);
   void addPickCallback(SGPickCallback* 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:
+  // 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;
 };