]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/placement.cxx
Zap SGLocation.
[simgear.git] / simgear / scene / model / placement.cxx
index 37d715f4338ce48fdc183bdaf729135de4127c2a..f781ab3e2b343922e2cd8c1f8d4c9a81ddec9dac 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <simgear/scene/util/SGSceneUserData.hxx>
 
-#include "location.hxx"
 #include "placementtrans.hxx"
 
 #include "placement.hxx"
 // Implementation of SGModelPlacement.
 ////////////////////////////////////////////////////////////////////////
 
-SGModelPlacement::SGModelPlacement ()
-  : _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 osg::Switch),
-    _position(new SGPlacementTransform),
-    _location(new SGLocation)
+    _transform(new SGPlacementTransform)
 {
 }
 
 SGModelPlacement::~SGModelPlacement ()
 {
-  delete _location;
 }
 
 void
 SGModelPlacement::init( osg::Node * model )
 {
   if (model != 0) {
-      _position->addChild(model);
+      _transform->addChild(model);
   }
-  _selector->addChild(_position.get());
+  _selector->addChild(_transform.get());
   _selector->setValue(0, 1);
 }
 
 void
 SGModelPlacement::update()
 {
-  _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
-  _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
+  // The cartesian position
+  SGVec3d position = SGVec3d::fromGeod(_position);
 
-  const sgVec4 *t = _location->getTransformMatrix();
-  SGMatrixd rotation;
-  for (unsigned i = 0; i < 4; ++i)
-    for (unsigned j = 0; j < 4; ++j)
-      rotation(i, j) = t[j][i];
-  SGVec3d pos(_location->get_absolute_view_pos());
-  _position->setTransform(pos, rotation);
+  // The orientation, composed from the horizontal local orientation and the
+  // orientation wrt the horizontal local frame
+  SGQuatd orient = SGQuatd::fromLonLat(_position);
+  orient *= SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
+  orient *= SGQuatd::fromYawPitchRollDeg(-_heading_deg, _pitch_deg, -_roll_deg);
+  SGMatrixd rotation(inverse(orient));
+  _transform->setTransform(position, rotation);
 }
 
 bool
@@ -80,35 +75,31 @@ SGModelPlacement::setVisible (bool visible)
 void
 SGModelPlacement::setLongitudeDeg (double lon_deg)
 {
-  _lon_deg = lon_deg;
+  _position.setLongitudeDeg(lon_deg);
 }
 
 void
 SGModelPlacement::setLatitudeDeg (double lat_deg)
 {
-  _lat_deg = lat_deg;
+  _position.setLatitudeDeg(lat_deg);
 }
 
 void
 SGModelPlacement::setElevationFt (double elev_ft)
 {
-  _elev_ft = elev_ft;
+  _position.setElevationFt(elev_ft);
 }
 
 void
 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
 {
-  _lon_deg = lon_deg;
-  _lat_deg = lat_deg;
-  _elev_ft = elev_ft;
+  _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
 }
 
 void
 SGModelPlacement::setPosition(const SGGeod& position)
 {
-  _lon_deg = position.getLongitudeDeg();
-  _lat_deg = position.getLatitudeDeg();
-  _elev_ft = position.getElevationFt();
+  _position = position;
 }
 
 void
@@ -148,7 +139,7 @@ void
 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
 {
   SGSceneUserData* userData;
-  userData = SGSceneUserData::getOrCreateSceneUserData(_position);
+  userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
   SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
   vel->linear = orientation.backTransform(linear);
@@ -158,7 +149,7 @@ void
 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
 {
   SGSceneUserData* userData;
-  userData = SGSceneUserData::getOrCreateSceneUserData(_position);
+  userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
   SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
   vel->angular = orientation.backTransform(angular);