]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/model/placement.cxx
Memory leak fix.
[simgear.git] / simgear / scene / model / placement.cxx
index cbee20f560d7ff7bc45f8c6be5c84af5a6d8b910..75f3fb842cd2d8757b0b6e0220201fdc32ccc531 100644 (file)
 
 #include <string.h>             // for strcmp()
 
-#include <vector>
-
 #include <plib/sg.h>
 #include <plib/ssg.h>
 #include <plib/ul.h>
 
 #include "location.hxx"
+#include "placementtrans.hxx"
 
 #include "placement.hxx"
 
-SG_USING_STD(vector);
-
 
 \f
 ////////////////////////////////////////////////////////////////////////
@@ -37,13 +34,14 @@ SGModelPlacement::SGModelPlacement ()
     _pitch_deg(0),
     _heading_deg(0),
     _selector(new ssgSelector),
-    _position(new ssgTransform),
+    _position(new ssgPlacementTransform),
     _location(new SGLocation)
 {
 }
 
 SGModelPlacement::~SGModelPlacement ()
 {
+  delete _location;
 }
 
 void
@@ -57,23 +55,14 @@ SGModelPlacement::init( ssgBranch * model )
 }
 
 void
-SGModelPlacement::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);
+  sgMat4 rotation;
+  sgCopyMat4( rotation, _location->getTransformMatrix() );
+  _position->setTransform(_location->get_absolute_view_pos(), rotation);
 }
 
 bool
@@ -114,6 +103,14 @@ SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
   _elev_ft = elev_ft;
 }
 
+void
+SGModelPlacement::setPosition(const SGGeod& position)
+{
+  _lon_deg = position.getLongitudeDeg();
+  _lat_deg = position.getLatitudeDeg();
+  _elev_ft = position.getElevationFt();
+}
+
 void
 SGModelPlacement::setRollDeg (double roll_deg)
 {
@@ -141,4 +138,10 @@ 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);
+}
+
 // end of model.cxx