X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmodel%2Fplacement.cxx;h=852844921f5424ede40e8297cf8c54a5a74dd926;hb=9f9c4cf32c2cf774c7febd7fe2b4e65a7d205294;hp=1669e38bd5d9bb0375f0a6ee6bbc7e03ef08e787;hpb=78fbfa1dde8bed95ad21926ba2bb3522c3771f19;p=simgear.git diff --git a/simgear/scene/model/placement.cxx b/simgear/scene/model/placement.cxx index 1669e38b..85284492 100644 --- a/simgear/scene/model/placement.cxx +++ b/simgear/scene/model/placement.cxx @@ -7,133 +7,120 @@ #include #endif -#include - -#include // for strcmp() - -#include - -#include -#include -#include - -#include - #include "placement.hxx" -SG_USING_STD(vector); - +#include +#include //////////////////////////////////////////////////////////////////////// -// Implementation of FGModelPlacement. +// Implementation of SGModelPlacement. //////////////////////////////////////////////////////////////////////// -FGModelPlacement::FGModelPlacement () - : _lon_deg(0), - _lat_deg(0), - _elev_ft(0), +SGModelPlacement::SGModelPlacement () : + _position(SGGeod::fromRad(0, 0)), _roll_deg(0), _pitch_deg(0), _heading_deg(0), - _selector(new ssgSelector), - _position(new ssgTransform), - _location(new FGLocation) + _selector(new osg::Switch), + _transform(new osg::PositionAttitudeTransform) { } -FGModelPlacement::~FGModelPlacement () +SGModelPlacement::~SGModelPlacement () { } void -FGModelPlacement::init( ssgBranch * model ) +SGModelPlacement::init( osg::Node * model ) { if (model != 0) { - _position->addKid(model); + _transform->addChild(model); } - _selector->addKid(_position); - _selector->clrTraversalMaskBits(SSGTRAV_HOT); + _selector->addChild(_transform.get()); + _selector->setValue(0, 1); } void -FGModelPlacement::update( const Point3D scenery_center ) +SGModelPlacement::update() { - _location->setPosition( _lon_deg, _lat_deg, _elev_ft ); - _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg ); - - sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) ); - - sgVec3 trans; - sgCopyVec3(trans, _location->get_view_pos()); - - for(int i = 0; i < 4; i++) { - float tmp = POS[i][3]; - for( int j=0; j<3; j++ ) { - POS[i][j] += (tmp * trans[j]); - } - } - _position->setTransform(POS); + // The cartesian position + SGVec3d position = SGVec3d::fromGeod(_position); + _transform->setPosition(toOsg(position)); + + // The orientation, composed from the horizontal local orientation and the + // orientation wrt the horizontal local frame + SGQuatd orient = SGQuatd::fromLonLat(_position); + orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg); + // Convert to the scenegraph orientation where we just rotate around + // the y axis 180 degrees. + orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0)); + + _transform->setAttitude(toOsg(orient)); } bool -FGModelPlacement::getVisible () const +SGModelPlacement::getVisible () const +{ + return _selector->getValue(0); +} + +void +SGModelPlacement::setVisible (bool visible) { - return (_selector->getSelect() != 0); + _selector->setValue(0, visible); } void -FGModelPlacement::setVisible (bool visible) +SGModelPlacement::setLongitudeDeg (double lon_deg) { - _selector->select(visible); + _position.setLongitudeDeg(lon_deg); } void -FGModelPlacement::setLongitudeDeg (double lon_deg) +SGModelPlacement::setLatitudeDeg (double lat_deg) { - _lon_deg = lon_deg; + _position.setLatitudeDeg(lat_deg); } void -FGModelPlacement::setLatitudeDeg (double lat_deg) +SGModelPlacement::setElevationFt (double elev_ft) { - _lat_deg = lat_deg; + _position.setElevationFt(elev_ft); } void -FGModelPlacement::setElevationFt (double elev_ft) +SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft) { - _elev_ft = elev_ft; + _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft); } void -FGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft) +SGModelPlacement::setPosition(const SGGeod& position) { - _lon_deg = lon_deg; - _lat_deg = lat_deg; - _elev_ft = elev_ft; + _position = position; } void -FGModelPlacement::setRollDeg (double roll_deg) +SGModelPlacement::setRollDeg (double roll_deg) { _roll_deg = roll_deg; } void -FGModelPlacement::setPitchDeg (double pitch_deg) +SGModelPlacement::setPitchDeg (double pitch_deg) { _pitch_deg = pitch_deg; } void -FGModelPlacement::setHeadingDeg (double heading_deg) +SGModelPlacement::setHeadingDeg (double heading_deg) { _heading_deg = heading_deg; } void -FGModelPlacement::setOrientation (double roll_deg, double pitch_deg, +SGModelPlacement::setOrientation (double roll_deg, double pitch_deg, double heading_deg) { _roll_deg = roll_deg; @@ -141,4 +128,37 @@ FGModelPlacement::setOrientation (double roll_deg, double pitch_deg, _heading_deg = heading_deg; } +void +SGModelPlacement::setOrientation (const SGQuatd& orientation) +{ + orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg); +} + +void +SGModelPlacement::setReferenceTime(const double& referenceTime) +{ + SGSceneUserData* userData; + userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get()); + SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity(); + vel->referenceTime = referenceTime; +} + +void +SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear) +{ + SGSceneUserData* userData; + userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get()); + SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity(); + vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]); +} + +void +SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular) +{ + SGSceneUserData* userData; + userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get()); + SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity(); + vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]); +} + // end of model.cxx