From d6f64f9773bc8a45cf2182c5c509e6ca5108cc4b Mon Sep 17 00:00:00 2001 From: frohlich Date: Sun, 7 Jan 2007 11:52:19 +0000 Subject: [PATCH] Modified Files: 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 | 1 + simgear/scene/util/SGPickCallback.hxx | 1 + simgear/scene/util/SGSceneUserData.cxx | 84 ++++++++++++++++++++++++++ simgear/scene/util/SGSceneUserData.hxx | 34 ++++------- 4 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 simgear/scene/util/SGSceneUserData.cxx diff --git a/simgear/scene/util/Makefile.am b/simgear/scene/util/Makefile.am index cc3edccc..df8c4c80 100644 --- a/simgear/scene/util/Makefile.am +++ b/simgear/scene/util/Makefile.am @@ -14,6 +14,7 @@ include_HEADERS = \ SGTextureStateAttributeVisitor.hxx libsgutil_a_SOURCES = \ + SGSceneUserData.cxx \ SGStateAttributeVisitor.cxx \ SGTextureStateAttributeVisitor.cxx diff --git a/simgear/scene/util/SGPickCallback.hxx b/simgear/scene/util/SGPickCallback.hxx index baaef436..a8bf82cb 100644 --- a/simgear/scene/util/SGPickCallback.hxx +++ b/simgear/scene/util/SGPickCallback.hxx @@ -23,6 +23,7 @@ #define SG_SCENE_PICKCALLBACK_HXX #include +#include #include // Used to implement scenery interaction. diff --git a/simgear/scene/util/SGSceneUserData.cxx b/simgear/scene/util/SGSceneUserData.cxx new file mode 100644 index 00000000..037cd470 --- /dev/null +++ b/simgear/scene/util/SGSceneUserData.cxx @@ -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(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(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); +} diff --git a/simgear/scene/util/SGSceneUserData.hxx b/simgear/scene/util/SGSceneUserData.hxx index e8acbe9e..42657e55 100644 --- a/simgear/scene/util/SGSceneUserData.hxx +++ b/simgear/scene/util/SGSceneUserData.hxx @@ -22,38 +22,26 @@ #ifndef SG_SCENE_USERDATA_HXX #define SG_SCENE_USERDATA_HXX +#include #include #include #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(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 _pickCallback; + /// Scene interaction callbacks + std::vector > _pickCallbacks; }; #endif -- 2.39.5