1 // placement.cxx - manage the placment of a 3D model.
2 // Written by David Megginson, started 2002.
4 // This file is in the Public Domain, and comes with no warranty.
6 #include <simgear/compiler.h>
8 #include <string.h> // for strcmp()
16 #include <simgear/scene/model/location.hxx>
18 #include "placement.hxx"
24 ////////////////////////////////////////////////////////////////////////
25 // Implementation of FGModelPlacement.
26 ////////////////////////////////////////////////////////////////////////
28 FGModelPlacement::FGModelPlacement ()
35 _selector(new ssgSelector),
36 _position(new ssgTransform),
37 _location(new FGLocation)
41 FGModelPlacement::~FGModelPlacement ()
46 FGModelPlacement::init( ssgBranch * model )
49 _position->addKid(model);
51 _selector->addKid(_position);
52 _selector->clrTraversalMaskBits(SSGTRAV_HOT);
56 FGModelPlacement::update( const Point3D scenery_center )
58 _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
59 _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
61 sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) );
64 sgCopyVec3(trans, _location->get_view_pos());
66 for(int i = 0; i < 4; i++) {
67 float tmp = POS[i][3];
68 for( int j=0; j<3; j++ ) {
69 POS[i][j] += (tmp * trans[j]);
72 _position->setTransform(POS);
76 FGModelPlacement::getVisible () const
78 return (_selector->getSelect() != 0);
82 FGModelPlacement::setVisible (bool visible)
84 _selector->select(visible);
88 FGModelPlacement::setLongitudeDeg (double lon_deg)
94 FGModelPlacement::setLatitudeDeg (double lat_deg)
100 FGModelPlacement::setElevationFt (double elev_ft)
106 FGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
114 FGModelPlacement::setRollDeg (double roll_deg)
116 _roll_deg = roll_deg;
120 FGModelPlacement::setPitchDeg (double pitch_deg)
122 _pitch_deg = pitch_deg;
126 FGModelPlacement::setHeadingDeg (double heading_deg)
128 _heading_deg = heading_deg;
132 FGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
135 _roll_deg = roll_deg;
136 _pitch_deg = pitch_deg;
137 _heading_deg = heading_deg;