Modified Files:

SGSceneUserData.hxx SGPickCallback.hxx Makefile.am
Added Files:
	SGSceneUserData.cxx: Cleanup and replace the pick callback with
	such a list.
This commit is contained in:
frohlich
2007-01-07 11:52:19 +00:00
parent db99a4cb90
commit d6f64f9773
4 changed files with 97 additions and 23 deletions
+1
View File
@@ -14,6 +14,7 @@ include_HEADERS = \
SGTextureStateAttributeVisitor.hxx SGTextureStateAttributeVisitor.hxx
libsgutil_a_SOURCES = \ libsgutil_a_SOURCES = \
SGSceneUserData.cxx \
SGStateAttributeVisitor.cxx \ SGStateAttributeVisitor.cxx \
SGTextureStateAttributeVisitor.cxx SGTextureStateAttributeVisitor.cxx
+1
View File
@@ -23,6 +23,7 @@
#define SG_SCENE_PICKCALLBACK_HXX #define SG_SCENE_PICKCALLBACK_HXX
#include <simgear/structure/SGReferenced.hxx> #include <simgear/structure/SGReferenced.hxx>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/math/SGMath.hxx> #include <simgear/math/SGMath.hxx>
// Used to implement scenery interaction. // Used to implement scenery interaction.
+84
View File
@@ -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);
}
+11 -23
View File
@@ -22,38 +22,26 @@
#ifndef SG_SCENE_USERDATA_HXX #ifndef SG_SCENE_USERDATA_HXX
#define SG_SCENE_USERDATA_HXX #define SG_SCENE_USERDATA_HXX
#include <vector>
#include <osg/Referenced> #include <osg/Referenced>
#include <osg/Node> #include <osg/Node>
#include "SGPickCallback.hxx" #include "SGPickCallback.hxx"
class SGSceneUserData : public osg::Referenced { class SGSceneUserData : public osg::Referenced {
public: public:
static SGSceneUserData* getSceneUserData(osg::Node* node) static SGSceneUserData* getSceneUserData(osg::Node* node);
{ static const SGSceneUserData* getSceneUserData(const osg::Node* node);
if (!node) static SGSceneUserData* getOrCreateSceneUserData(osg::Node* 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;
}
SGPickCallback* getPickCallback() const /// Access to the pick callbacks of a node.
{ return _pickCallback; } unsigned getNumPickCallbacks() const;
void setPickCallback(SGPickCallback* pickCallback) SGPickCallback* getPickCallback(unsigned i = 0) const;
{ _pickCallback = pickCallback; } void setPickCallback(SGPickCallback* pickCallback);
void addPickCallback(SGPickCallback* pickCallback);
private: private:
SGSharedPtr<SGPickCallback> _pickCallback; /// Scene interaction callbacks
std::vector<SGSharedPtr<SGPickCallback> > _pickCallbacks;
}; };
#endif #endif