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 "location.hxx"
22 #include "placement.hxx"
28 ////////////////////////////////////////////////////////////////////////
29 // Implementation of SGModelPlacement.
30 ////////////////////////////////////////////////////////////////////////
32 SGModelPlacement::SGModelPlacement ()
39 _selector(new ssgSelector),
40 _position(new ssgTransform),
41 _location(new SGLocation)
45 SGModelPlacement::~SGModelPlacement ()
50 SGModelPlacement::init( ssgBranch * model )
53 _position->addKid(model);
55 _selector->addKid(_position);
56 _selector->clrTraversalMaskBits(SSGTRAV_HOT);
60 SGModelPlacement::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 SGModelPlacement::getVisible () const
82 return (_selector->getSelect() != 0);
86 SGModelPlacement::setVisible (bool visible)
88 _selector->select(visible);
92 SGModelPlacement::setLongitudeDeg (double lon_deg)
98 SGModelPlacement::setLatitudeDeg (double lat_deg)
104 SGModelPlacement::setElevationFt (double elev_ft)
110 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
118 SGModelPlacement::setRollDeg (double roll_deg)
120 _roll_deg = roll_deg;
124 SGModelPlacement::setPitchDeg (double pitch_deg)
126 _pitch_deg = pitch_deg;
130 SGModelPlacement::setHeadingDeg (double heading_deg)
132 _heading_deg = heading_deg;
136 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
139 _roll_deg = roll_deg;
140 _pitch_deg = pitch_deg;
141 _heading_deg = heading_deg;