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()
18 #include "location.hxx"
19 #include "placementtrans.hxx"
21 #include "placement.hxx"
25 ////////////////////////////////////////////////////////////////////////
26 // Implementation of SGModelPlacement.
27 ////////////////////////////////////////////////////////////////////////
29 SGModelPlacement::SGModelPlacement ()
36 _selector(new ssgSelector),
37 _position(new ssgPlacementTransform),
38 _location(new SGLocation)
42 SGModelPlacement::~SGModelPlacement ()
47 SGModelPlacement::init( ssgBranch * model )
50 _position->addKid(model);
52 _selector->addKid(_position);
53 _selector->clrTraversalMaskBits(SSGTRAV_HOT);
57 SGModelPlacement::update( const Point3D scenery_center )
59 _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
60 _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
62 sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) );
65 sgCopyVec3(trans, _location->get_view_pos());
67 for(int i = 0; i < 4; i++) {
68 float tmp = POS[i][3];
69 for( int j=0; j<3; j++ ) {
70 POS[i][j] += (tmp * trans[j]);
73 // _position->setTransform(POS);
74 _position->setTransform(_location->get_absolute_view_pos(scenery_center), POS);
77 scenery_center.x(), scenery_center.y(), scenery_center.z());
78 _position->setSceneryCenter(center);
82 SGModelPlacement::getVisible () const
84 return (_selector->getSelect() != 0);
88 SGModelPlacement::setVisible (bool visible)
90 _selector->select(visible);
94 SGModelPlacement::setLongitudeDeg (double lon_deg)
100 SGModelPlacement::setLatitudeDeg (double lat_deg)
106 SGModelPlacement::setElevationFt (double elev_ft)
112 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
120 SGModelPlacement::setRollDeg (double roll_deg)
122 _roll_deg = roll_deg;
126 SGModelPlacement::setPitchDeg (double pitch_deg)
128 _pitch_deg = pitch_deg;
132 SGModelPlacement::setHeadingDeg (double heading_deg)
134 _heading_deg = heading_deg;
138 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
141 _roll_deg = roll_deg;
142 _pitch_deg = pitch_deg;
143 _heading_deg = heading_deg;