Files
simgear/simgear/scene/util/SGSceneUserData.cxx
T
Tim Moore ecd0a53412 Add writeLocalData functions for internal scenegraph classes
This makes the scenegraph dump more complete and therefore more useful.
2009-09-22 12:56:28 +02:00

128 lines
3.2 KiB
C++

/* -*-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.
*
*/
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <osgDB/Registry>
#include <osgDB/Input>
#include <osgDB/ParameterOutput>
#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) 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);
}
bool SGSceneUserData_writeLocalData(const osg::Object& obj, osgDB::Output& fw)
{
const SGSceneUserData& data = static_cast<const SGSceneUserData&>(obj);
unsigned numPickCallbacks = data.getNumPickCallbacks();
if (numPickCallbacks > 0)
fw.indent() << "num_pickCallbacks " << numPickCallbacks << "\n";
if (data.getBVHNode())
fw.indent() << "hasBVH true\n";
const SGSceneUserData::Velocity* vel = data.getVelocity();
if (vel) {
fw.indent() << "velocity {\n";
fw.moveIn();
fw.indent() << "linear " << vel->linear << "\n";
fw.indent() << "angular " << vel->angular << "\n";
fw.indent() << "referenceTime " << vel->referenceTime << "\n";
fw.indent() << "id " << static_cast<unsigned>(vel->id) << "\n";
fw.moveOut();
fw.indent() << "}\n";
}
return true;
}
namespace
{
osgDB::RegisterDotOsgWrapperProxy SGSceneUserDataProxy
(
new SGSceneUserData,
"simgear::SGSceneUserData",
"Object simgear::SGSceneUserData",
0,
&SGSceneUserData_writeLocalData
);
}