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.
7 #include <simgear_config.h>
10 #include <simgear/compiler.h>
12 #include <string.h> // for strcmp()
20 #include <simgear/scene/model/location.hxx>
22 #include "placement.hxx"
28 ////////////////////////////////////////////////////////////////////////
29 // Implementation of FGModelPlacement.
30 ////////////////////////////////////////////////////////////////////////
32 FGModelPlacement::FGModelPlacement ()
39 _selector(new ssgSelector),
40 _position(new ssgTransform),
41 _location(new FGLocation)
45 FGModelPlacement::~FGModelPlacement ()
50 FGModelPlacement::init( ssgBranch * model )
53 _position->addKid(model);
55 _selector->addKid(_position);
56 _selector->clrTraversalMaskBits(SSGTRAV_HOT);
60 FGModelPlacement::update( const Point3D scenery_center )
62 _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
63 _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
65 sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) );
68 sgCopyVec3(trans, _location->get_view_pos());
70 for(int i = 0; i < 4; i++) {
71 float tmp = POS[i][3];
72 for( int j=0; j<3; j++ ) {
73 POS[i][j] += (tmp * trans[j]);
76 _position->setTransform(POS);
80 FGModelPlacement::getVisible () const
82 return (_selector->getSelect() != 0);
86 FGModelPlacement::setVisible (bool visible)
88 _selector->select(visible);
92 FGModelPlacement::setLongitudeDeg (double lon_deg)
98 FGModelPlacement::setLatitudeDeg (double lat_deg)
104 FGModelPlacement::setElevationFt (double elev_ft)
110 FGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
118 FGModelPlacement::setRollDeg (double roll_deg)
120 _roll_deg = roll_deg;
124 FGModelPlacement::setPitchDeg (double pitch_deg)
126 _pitch_deg = pitch_deg;
130 FGModelPlacement::setHeadingDeg (double heading_deg)
132 _heading_deg = heading_deg;
136 FGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
139 _roll_deg = roll_deg;
140 _pitch_deg = pitch_deg;
141 _heading_deg = heading_deg;