00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 # include <simgear_config.h>
00024 #endif
00025
00026 #include <osgDB/Registry>
00027 #include <osgDB/Input>
00028 #include <osgDB/Output>
00029
00030 #include "SGTranslateTransform.hxx"
00031
00032 SGTranslateTransform::SGTranslateTransform() :
00033 _axis(0, 0, 0),
00034 _value(0)
00035 {
00036 setReferenceFrame(RELATIVE_RF);
00037 }
00038
00039 SGTranslateTransform::SGTranslateTransform(const SGTranslateTransform& trans,
00040 const osg::CopyOp& copyop) :
00041 osg::Transform(trans, copyop),
00042 _axis(trans._axis),
00043 _value(trans._value)
00044 {
00045 }
00046
00047 bool
00048 SGTranslateTransform::computeLocalToWorldMatrix(osg::Matrix& matrix,
00049 osg::NodeVisitor* nv) const
00050 {
00051 if (_referenceFrame == RELATIVE_RF) {
00052 matrix.preMultTranslate(toOsg(_value*_axis));
00053 } else {
00054 matrix.setTrans(toOsg(_value*_axis));
00055 }
00056 return true;
00057 }
00058
00059 bool
00060 SGTranslateTransform::computeWorldToLocalMatrix(osg::Matrix& matrix,
00061 osg::NodeVisitor* nv) const
00062 {
00063 if (_referenceFrame == RELATIVE_RF) {
00064 matrix.postMultTranslate(toOsg(-_value*_axis));
00065 } else {
00066 matrix.setTrans(toOsg(-_value*_axis));
00067 }
00068 return true;
00069 }
00070
00071 osg::BoundingSphere
00072 SGTranslateTransform::computeBound() const
00073 {
00074 osg::BoundingSphere bs = osg::Group::computeBound();
00075 bs._center += toOsg(_axis)*_value;
00076 return bs;
00077 }
00078
00079 namespace {
00080
00081 bool TranslateTransform_readLocalData(osg::Object& obj, osgDB::Input& fr)
00082 {
00083 SGTranslateTransform& trans = static_cast<SGTranslateTransform&>(obj);
00084
00085 if (fr[0].matchWord("axis")) {
00086 ++fr;
00087 osg::Vec3d axis;
00088 if (fr.readSequence(axis))
00089 fr += 3;
00090 else
00091 return false;
00092 trans.setAxis(toSG(axis));
00093 }
00094 if (fr[0].matchWord("value")) {
00095 ++fr;
00096 double value;
00097 if (fr[0].getFloat(value))
00098 ++fr;
00099 else
00100 return false;
00101 trans.setValue(value);
00102 }
00103 return true;
00104 }
00105
00106 bool TranslateTransform_writeLocalData(const osg::Object& obj,
00107 osgDB::Output& fw)
00108 {
00109 const SGTranslateTransform& trans
00110 = static_cast<const SGTranslateTransform&>(obj);
00111 const SGVec3d& axis = trans.getAxis();
00112 double value = trans.getValue();
00113
00114 fw.indent() << "axis ";
00115 for (int i = 0; i < 3; i++)
00116 fw << axis(i) << " ";
00117 fw << std::endl;
00118 fw.indent() << "value " << value << std::endl;
00119 return true;
00120 }
00121
00122 }
00123
00124 osgDB::RegisterDotOsgWrapperProxy g_SGTranslateTransformProxy
00125 (
00126 new SGTranslateTransform,
00127 "SGTranslateTransform",
00128 "Object Node Transform SGTranslateTransform Group",
00129 &TranslateTransform_readLocalData,
00130 &TranslateTransform_writeLocalData
00131 );