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

View File

@@ -14,6 +14,7 @@ include_HEADERS = \
SGTextureStateAttributeVisitor.hxx
libsgutil_a_SOURCES = \
SGSceneUserData.cxx \
SGStateAttributeVisitor.cxx \
SGTextureStateAttributeVisitor.cxx

View 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.

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);
}

View File

@@ -22,38 +22,26 @@
#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