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 ()
48 SGModelPlacement::init( ssgBranch * model )
51 _position->addKid(model);
53 _selector->addKid(_position);
54 _selector->clrTraversalMaskBits(SSGTRAV_HOT);
58 SGModelPlacement::update()
60 _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
61 _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
64 sgCopyMat4( rotation, _location->getTransformMatrix() );
65 _position->setTransform(_location->get_absolute_view_pos(), rotation);
69 SGModelPlacement::getVisible () const
71 return (_selector->getSelect() != 0);
75 SGModelPlacement::setVisible (bool visible)
77 _selector->select(visible);
81 SGModelPlacement::setLongitudeDeg (double lon_deg)
87 SGModelPlacement::setLatitudeDeg (double lat_deg)
93 SGModelPlacement::setElevationFt (double elev_ft)
99 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
107 SGModelPlacement::setPosition(const SGGeod& position)
109 _lon_deg = position.getLongitudeDeg();
110 _lat_deg = position.getLatitudeDeg();
111 _elev_ft = position.getElevationFt();
115 SGModelPlacement::setRollDeg (double roll_deg)
117 _roll_deg = roll_deg;
121 SGModelPlacement::setPitchDeg (double pitch_deg)
123 _pitch_deg = pitch_deg;
127 SGModelPlacement::setHeadingDeg (double heading_deg)
129 _heading_deg = heading_deg;
133 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
136 _roll_deg = roll_deg;
137 _pitch_deg = pitch_deg;
138 _heading_deg = heading_deg;
142 SGModelPlacement::setOrientation (const SGQuatd& orientation)
144 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);