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