]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/placement.cxx
Compile even if OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION is not set.
[simgear.git] / simgear / scene / model / placement.cxx
index f5c483fc6d583c815dec812c6190e2f1856930aa..852844921f5424ede40e8297cf8c54a5a74dd926 100644 (file)
@@ -7,35 +7,23 @@
 #include <simgear_config.h>
 #endif
 
-#include <simgear/compiler.h>
-
-#include <string.h>             // for strcmp()
-
-#include <plib/sg.h>
-#include <plib/ssg.h>
-#include <plib/ul.h>
-
-#include "location.hxx"
-#include "placementtrans.hxx"
-
 #include "placement.hxx"
 
+#include <simgear/compiler.h>
+#include <simgear/scene/util/SGSceneUserData.hxx>
 
 \f
 ////////////////////////////////////////////////////////////////////////
 // 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 ssgSelector),
-    _position(new ssgPlacementTransform),
-    _location(new SGLocation)
+    _selector(new osg::Switch),
+    _transform(new osg::PositionAttitudeTransform)
 {
 }
 
@@ -44,62 +32,73 @@ SGModelPlacement::~SGModelPlacement ()
 }
 
 void
-SGModelPlacement::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
 SGModelPlacement::update()
 {
-  _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
-  _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
-
-  sgMat4 rotation;
-  sgCopyMat4( rotation, _location->getTransformMatrix() );
-  _position->setTransform(_location->get_absolute_view_pos(), rotation);
+  // 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
 SGModelPlacement::getVisible () const
 {
-  return (_selector->getSelect() != 0);
+  return _selector->getValue(0);
 }
 
 void
 SGModelPlacement::setVisible (bool visible)
 {
-  _selector->select(visible);
+  _selector->setValue(0, 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)
+{
+  _position = position;
 }
 
 void
@@ -129,4 +128,37 @@ SGModelPlacement::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