From ecd0a53412ec756aa26f74a0cb279676b2ae2d13 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Tue, 28 Jul 2009 06:39:55 +0200 Subject: [PATCH] Add writeLocalData functions for internal scenegraph classes This makes the scenegraph dump more complete and therefore more useful. --- simgear/scene/model/SGPagedLOD.cxx | 18 +++++ simgear/scene/model/animation.cxx | 97 +++++++++++++++++++++++++- simgear/scene/model/animation.hxx | 4 +- simgear/scene/util/SGSceneUserData.cxx | 39 +++++++++++ simgear/scene/util/SGSceneUserData.hxx | 12 +++- 5 files changed, 164 insertions(+), 6 deletions(-) diff --git a/simgear/scene/model/SGPagedLOD.cxx b/simgear/scene/model/SGPagedLOD.cxx index ddd6dabd..faaf42bb 100644 --- a/simgear/scene/model/SGPagedLOD.cxx +++ b/simgear/scene/model/SGPagedLOD.cxx @@ -19,6 +19,8 @@ #endif #include +#include +#include #include #include @@ -70,3 +72,19 @@ void SGPagedLOD::forceLoad(osgDB::DatabasePager *dbp) _readerWriterOptions.get()); } +bool SGPagedLOD_writeLocalData(const Object& obj, osgDB::Output& fw) +{ + return true; +} + +namespace +{ +osgDB::RegisterDotOsgWrapperProxy sgPagedLODProxy +( + new SGPagedLOD, + "simgear::SGPagedLOD", + "Object Node LOD PagedLOD SGPagedLOD Group", + 0, + &SGPagedLOD_writeLocalData + ); +} diff --git a/simgear/scene/model/animation.cxx b/simgear/scene/model/animation.cxx index 22ba2825..80c08be2 100644 --- a/simgear/scene/model/animation.cxx +++ b/simgear/scene/model/animation.cxx @@ -30,6 +30,10 @@ #include #include #include +#include +#include +#include + #include #include @@ -971,6 +975,15 @@ osg::StateSet* getNormalizeStateSet() class SGDistScaleAnimation::Transform : public osg::Transform { public: + Transform() : _min_v(0.0), _max_v(0.0), _factor(0.0), _offset(0.0) {} + Transform(const Transform& rhs, + const osg::CopyOp& copyOp = osg::CopyOp::SHALLOW_COPY) + : osg::Transform(rhs, copyOp), _table(rhs._table), _center(rhs._center), + _min_v(rhs._min_v), _max_v(rhs._max_v), _factor(rhs._factor), + _offset(rhs._offset) + { + } + META_Node(simgear, SGDistScaleAnimation::Transform); Transform(const SGPropertyNode* configNode) { setName(configNode->getStringValue("name", "dist scale animation")); @@ -1018,6 +1031,16 @@ public: return true; } + static bool writeLocalData(const osg::Object& obj, osgDB::Output& fw) + { + const Transform& trans = static_cast(obj); + fw.indent() << "center " << trans._center << "\n"; + fw.indent() << "min_v " << trans._min_v << "\n"; + fw.indent() << "max_v " << trans._max_v << "\n"; + fw.indent() << "factor " << trans._factor << "\n"; + fw.indent() << "offset " << trans._offset << "\n"; + return true; + } private: double computeScaleFactor(osg::NodeVisitor* nv) const { @@ -1061,6 +1084,17 @@ SGDistScaleAnimation::createAnimationGroup(osg::Group& parent) return transform; } +namespace +{ + osgDB::RegisterDotOsgWrapperProxy distScaleAnimationTransformProxy + ( + new SGDistScaleAnimation::Transform, + "SGDistScaleAnimation::Transform", + "Object Node Transform SGDistScaleAnimation::Transform Group", + 0, + &SGDistScaleAnimation::Transform::writeLocalData + ); +} //////////////////////////////////////////////////////////////////////// // Implementation of flash animation @@ -1068,6 +1102,19 @@ SGDistScaleAnimation::createAnimationGroup(osg::Group& parent) class SGFlashAnimation::Transform : public osg::Transform { public: + Transform() : _power(0.0), _factor(0.0), _offset(0.0), _min_v(0.0), + _max_v(0.0), _two_sides(false) + {} + + Transform(const Transform& rhs, + const osg::CopyOp& copyOp = osg::CopyOp::SHALLOW_COPY) + : osg::Transform(rhs, copyOp), _center(rhs._center), _axis(rhs._axis), + _power(rhs._power), _factor(rhs._factor), _offset(rhs._offset), + _min_v(rhs._min_v), _max_v(rhs._max_v), _two_sides(rhs._two_sides) + { + } + META_Node(simgear, SGFlashAnimation::Transform); + Transform(const SGPropertyNode* configNode) { setReferenceFrame(RELATIVE_RF); @@ -1124,6 +1171,21 @@ public: return true; } + static bool writeLocalData(const osg::Object& obj, osgDB::Output& fw) + { + const Transform& trans = static_cast(obj); + fw.indent() << "center " << trans._center[0] << " " + << trans._center[1] << " " << trans._center[2] << " " << "\n"; + fw.indent() << "axis " << trans._axis[0] << " " + << trans._axis[1] << " " << trans._axis[2] << " " << "\n"; + fw.indent() << "power " << trans._power << " \n"; + fw.indent() << "min_v " << trans._min_v << "\n"; + fw.indent() << "max_v " << trans._max_v << "\n"; + fw.indent() << "factor " << trans._factor << "\n"; + fw.indent() << "offset " << trans._offset << "\n"; + fw.indent() << "twosides " << (trans._two_sides ? "true" : "false") << "\n"; + return true; + } private: double computeScaleFactor(osg::NodeVisitor* nv) const { @@ -1178,13 +1240,29 @@ SGFlashAnimation::createAnimationGroup(osg::Group& parent) return transform; } +namespace +{ + osgDB::RegisterDotOsgWrapperProxy flashAnimationTransformProxy + ( + new SGFlashAnimation::Transform, + "SGFlashAnimation::Transform", + "Object Node Transform SGFlashAnimation::Transform Group", + 0, + &SGFlashAnimation::Transform::writeLocalData + ); +} //////////////////////////////////////////////////////////////////////// -// Implementation of flash animation +// Implementation of billboard animation //////////////////////////////////////////////////////////////////////// class SGBillboardAnimation::Transform : public osg::Transform { public: + Transform() : _spherical(true) {} + Transform(const Transform& rhs, + const osg::CopyOp& copyOp = osg::CopyOp::SHALLOW_COPY) + : osg::Transform(rhs, copyOp), _spherical(rhs._spherical) {} + META_Node(simgear, SGBillboardAnimation::Transform); Transform(const SGPropertyNode* configNode) : _spherical(configNode->getBoolValue("spherical", true)) { @@ -1221,7 +1299,13 @@ public: // Hmm, don't yet know how to get that back ... return false; } + static bool writeLocalData(const osg::Object& obj, osgDB::Output& fw) + { + const Transform& trans = static_cast(obj); + fw.indent() << (trans._spherical ? "true" : "false") << "\n"; + return true; + } private: bool _spherical; }; @@ -1241,6 +1325,17 @@ SGBillboardAnimation::createAnimationGroup(osg::Group& parent) return transform; } +namespace +{ + osgDB::RegisterDotOsgWrapperProxy billboardAnimationTransformProxy + ( + new SGBillboardAnimation::Transform, + "SGBillboardAnimation::Transform", + "Object Node Transform SGBillboardAnimation::Transform Group", + 0, + &SGBillboardAnimation::Transform::writeLocalData + ); +} //////////////////////////////////////////////////////////////////////// // Implementation of a range animation diff --git a/simgear/scene/model/animation.hxx b/simgear/scene/model/animation.hxx index eec16bc4..4ea07fd2 100644 --- a/simgear/scene/model/animation.hxx +++ b/simgear/scene/model/animation.hxx @@ -174,7 +174,6 @@ public: SGDistScaleAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot); virtual osg::Group* createAnimationGroup(osg::Group& parent); -private: class Transform; }; @@ -188,7 +187,7 @@ public: SGFlashAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot); virtual osg::Group* createAnimationGroup(osg::Group& parent); -private: +public: class Transform; }; @@ -202,7 +201,6 @@ public: SGBillboardAnimation(const SGPropertyNode* configNode, SGPropertyNode* modelRoot); virtual osg::Group* createAnimationGroup(osg::Group& parent); -private: class Transform; }; diff --git a/simgear/scene/util/SGSceneUserData.cxx b/simgear/scene/util/SGSceneUserData.cxx index c08fce0e..2388f09d 100644 --- a/simgear/scene/util/SGSceneUserData.cxx +++ b/simgear/scene/util/SGSceneUserData.cxx @@ -23,6 +23,10 @@ # include #endif +#include +#include +#include + #include "SGSceneUserData.hxx" SGSceneUserData* @@ -86,3 +90,38 @@ SGSceneUserData::addPickCallback(SGPickCallback* pickCallback) return; _pickCallbacks.push_back(pickCallback); } + +bool SGSceneUserData_writeLocalData(const osg::Object& obj, osgDB::Output& fw) +{ + const SGSceneUserData& data = static_cast(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(vel->id) << "\n"; + fw.moveOut(); + fw.indent() << "}\n"; + } + return true; +} + +namespace +{ +osgDB::RegisterDotOsgWrapperProxy SGSceneUserDataProxy +( + new SGSceneUserData, + "simgear::SGSceneUserData", + "Object simgear::SGSceneUserData", + 0, + &SGSceneUserData_writeLocalData + ); +} diff --git a/simgear/scene/util/SGSceneUserData.hxx b/simgear/scene/util/SGSceneUserData.hxx index 4f3f38fc..1296e9c3 100644 --- a/simgear/scene/util/SGSceneUserData.hxx +++ b/simgear/scene/util/SGSceneUserData.hxx @@ -23,13 +23,21 @@ #define SG_SCENE_USERDATA_HXX #include -#include #include +#include #include #include "SGPickCallback.hxx" -class SGSceneUserData : public osg::Referenced { +class SGSceneUserData : public osg::Object { public: + META_Object(simgear, SGSceneUserData); + SGSceneUserData() {} + SGSceneUserData(const SGSceneUserData& rhs, + const osg::CopyOp& copyOp = osg::CopyOp::SHALLOW_COPY) + : _bvhNode(rhs._bvhNode), _velocity(rhs._velocity), + _pickCallbacks(rhs._pickCallbacks) + { + } static SGSceneUserData* getSceneUserData(osg::Node* node); static const SGSceneUserData* getSceneUserData(const osg::Node* node); static SGSceneUserData* getOrCreateSceneUserData(osg::Node* node); -- 2.39.5