]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Clean up placementtrans a bit.
[simgear.git] / simgear / scene / model / placement.cxx
1 // placement.cxx - manage the placment of a 3D model.
2 // Written by David Megginson, started 2002.
3 //
4 // This file is in the Public Domain, and comes with no warranty.
5
6 #ifdef HAVE_CONFIG_H
7 #include <simgear_config.h>
8 #endif
9
10 #include <simgear/compiler.h>
11
12 #include <simgear/scene/util/SGSceneUserData.hxx>
13 #include <simgear/scene/util/SGUpdateVisitor.hxx>
14
15 #include "placement.hxx"
16
17
18 \f
19 ////////////////////////////////////////////////////////////////////////
20 // Implementation of SGModelPlacement.
21 ////////////////////////////////////////////////////////////////////////
22
23 SGModelPlacement::SGModelPlacement () :
24     _position(SGGeod::fromRad(0, 0)),
25     _roll_deg(0),
26     _pitch_deg(0),
27     _heading_deg(0),
28     _selector(new osg::Switch),
29     _transform(new SGPlacementTransform)
30 {
31 }
32
33 SGModelPlacement::~SGModelPlacement ()
34 {
35 }
36
37 void
38 SGModelPlacement::init( osg::Node * model )
39 {
40   if (model != 0) {
41       _transform->addChild(model);
42   }
43   _selector->addChild(_transform.get());
44   _selector->setValue(0, 1);
45 }
46
47 void
48 SGModelPlacement::update()
49 {
50   // The cartesian position
51   SGVec3d position = SGVec3d::fromGeod(_position);
52
53   // The orientation, composed from the horizontal local orientation and the
54   // orientation wrt the horizontal local frame
55   SGQuatd orient = SGQuatd::fromLonLat(_position);
56   orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
57   orient *= SGQuatd::fromYawPitchRollDeg(-_heading_deg, _pitch_deg, -_roll_deg);
58   _transform->setTransform(position, orient);
59 }
60
61 bool
62 SGModelPlacement::getVisible () const
63 {
64   return _selector->getValue(0);
65 }
66
67 void
68 SGModelPlacement::setVisible (bool visible)
69 {
70   _selector->setValue(0, visible);
71 }
72
73 void
74 SGModelPlacement::setLongitudeDeg (double lon_deg)
75 {
76   _position.setLongitudeDeg(lon_deg);
77 }
78
79 void
80 SGModelPlacement::setLatitudeDeg (double lat_deg)
81 {
82   _position.setLatitudeDeg(lat_deg);
83 }
84
85 void
86 SGModelPlacement::setElevationFt (double elev_ft)
87 {
88   _position.setElevationFt(elev_ft);
89 }
90
91 void
92 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
93 {
94   _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
95 }
96
97 void
98 SGModelPlacement::setPosition(const SGGeod& position)
99 {
100   _position = position;
101 }
102
103 void
104 SGModelPlacement::setRollDeg (double roll_deg)
105 {
106   _roll_deg = roll_deg;
107 }
108
109 void
110 SGModelPlacement::setPitchDeg (double pitch_deg)
111 {
112   _pitch_deg = pitch_deg;
113 }
114
115 void
116 SGModelPlacement::setHeadingDeg (double heading_deg)
117 {
118   _heading_deg = heading_deg;
119 }
120
121 void
122 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
123                                   double heading_deg)
124 {
125   _roll_deg = roll_deg;
126   _pitch_deg = pitch_deg;
127   _heading_deg = heading_deg;
128 }
129
130 void
131 SGModelPlacement::setOrientation (const SGQuatd& orientation)
132 {
133   orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
134 }
135
136 void
137 SGModelPlacement::setReferenceTime(const double& referenceTime)
138 {
139   SGSceneUserData* userData;
140   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
141   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
142   vel->referenceTime = referenceTime;
143 }
144
145 void
146 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
147 {
148   SGSceneUserData* userData;
149   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
150   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
151   vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
152 }
153
154 void
155 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
156 {
157   SGSceneUserData* userData;
158   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
159   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
160   vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);
161 }
162
163 // end of model.cxx