]> git.mxchange.org Git - simgear.git/commitdiff
Modified Files:
authorfrohlich <frohlich>
Sun, 7 Jan 2007 11:52:19 +0000 (11:52 +0000)
committerfrohlich <frohlich>
Sun, 7 Jan 2007 11:52:19 +0000 (11:52 +0000)
SGSceneUserData.hxx SGPickCallback.hxx Makefile.am
Added Files:
SGSceneUserData.cxx: Cleanup and replace the pick callback with
such a list.

simgear/scene/util/Makefile.am
simgear/scene/util/SGPickCallback.hxx
simgear/scene/util/SGSceneUserData.cxx [new file with mode: 0644]
simgear/scene/util/SGSceneUserData.hxx

index cc3edcccf13d671d7b8fd0da05f523645ed0b38f..df8c4c80a429e0525609b5c00ddbaceb6d57d967 100644 (file)
@@ -14,6 +14,7 @@ include_HEADERS = \
        SGTextureStateAttributeVisitor.hxx
 
 libsgutil_a_SOURCES = \
+       SGSceneUserData.cxx \
        SGStateAttributeVisitor.cxx \
        SGTextureStateAttributeVisitor.cxx
 
index baaef4366bb652877afb3ab22ad6f6cc1b55edda..a8bf82cbe80de676371f2d9b403f0c3b299f9c23 100644 (file)
@@ -23,6 +23,7 @@
 #define SG_SCENE_PICKCALLBACK_HXX
 
 #include <simgear/structure/SGReferenced.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
 #include <simgear/math/SGMath.hxx>
 
 // Used to implement scenery interaction.
diff --git a/simgear/scene/util/SGSceneUserData.cxx b/simgear/scene/util/SGSceneUserData.cxx
new file mode 100644 (file)
index 0000000..037cd47
--- /dev/null
@@ -0,0 +1,84 @@
+/* -*-c++-*-
+ *
+ * Copyright (C) 2006-2007 Mathias Froehlich 
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ */
+
+#include "SGSceneUserData.hxx"
+
+SGSceneUserData*
+SGSceneUserData::getSceneUserData(osg::Node* node)
+{
+  if (!node)
+    return 0;
+  osg::Referenced* referenced = node->getUserData();
+  if (!referenced)
+    return 0;
+  return dynamic_cast<SGSceneUserData*>(referenced);
+}
+
+const SGSceneUserData*
+SGSceneUserData::getSceneUserData(const osg::Node* node)
+{
+  if (!node)
+    return 0;
+  const osg::Referenced* referenced = node->getUserData();
+  if (!referenced)
+    return 0;
+  return dynamic_cast<const SGSceneUserData*>(referenced);
+}
+
+SGSceneUserData*
+SGSceneUserData::getOrCreateSceneUserData(osg::Node* node)
+{
+  SGSceneUserData* userData = getSceneUserData(node);
+  if (userData)
+    return userData;
+  userData = new SGSceneUserData;
+  node->setUserData(userData);
+  return userData;
+}
+
+unsigned
+SGSceneUserData::getNumPickCallbacks() const
+{
+  return _pickCallbacks.size();
+}
+
+SGPickCallback*
+SGSceneUserData::getPickCallback(unsigned i = 0) const
+{
+  if (_pickCallbacks.size() <= i)
+    return 0;
+  return _pickCallbacks[i];
+}
+
+void
+SGSceneUserData::setPickCallback(SGPickCallback* pickCallback)
+{
+  _pickCallbacks.clear();
+  addPickCallback(pickCallback);
+}
+
+void
+SGSceneUserData::addPickCallback(SGPickCallback* pickCallback)
+{
+  if (!pickCallback)
+    return;
+  _pickCallbacks.push_back(pickCallback);
+}
index e8acbe9e9d567d28d6992afd899bb7a2668047b9..42657e55b653644b678c096c53b3027bf20898f6 100644 (file)
 #ifndef SG_SCENE_USERDATA_HXX
 #define SG_SCENE_USERDATA_HXX
 
+#include <vector>
 #include <osg/Referenced>
 #include <osg/Node>
 #include "SGPickCallback.hxx"
 
 class SGSceneUserData : public osg::Referenced {
 public:
-  static SGSceneUserData* getSceneUserData(osg::Node* node)
-  {
-    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);
 
-  SGPickCallback* getPickCallback() const
-  { return _pickCallback; }
-  void setPickCallback(SGPickCallback* pickCallback)
-  { _pickCallback = pickCallback; }
+  /// Access to the pick callbacks of a node.
+  unsigned getNumPickCallbacks() const;
+  SGPickCallback* getPickCallback(unsigned i = 0) const;
+  void setPickCallback(SGPickCallback* pickCallback);
+  void addPickCallback(SGPickCallback* pickCallback);
   
 private:
-  SGSharedPtr<SGPickCallback> _pickCallback;
+  /// Scene interaction callbacks
+  std::vector<SGSharedPtr<SGPickCallback> > _pickCallbacks;
 };
 
 #endif