]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Merge branch 'maint' into next
[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::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
57   // Convert to the scenegraph orientation where we just rotate around
58   // the y axis 180 degrees.
59   orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
60
61   _transform->setTransform(position, orient);
62 }
63
64 bool
65 SGModelPlacement::getVisible () const
66 {
67   return _selector->getValue(0);
68 }
69
70 void
71 SGModelPlacement::setVisible (bool visible)
72 {
73   _selector->setValue(0, visible);
74 }
75
76 void
77 SGModelPlacement::setLongitudeDeg (double lon_deg)
78 {
79   _position.setLongitudeDeg(lon_deg);
80 }
81
82 void
83 SGModelPlacement::setLatitudeDeg (double lat_deg)
84 {
85   _position.setLatitudeDeg(lat_deg);
86 }
87
88 void
89 SGModelPlacement::setElevationFt (double elev_ft)
90 {
91   _position.setElevationFt(elev_ft);
92 }
93
94 void
95 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
96 {
97   _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
98 }
99
100 void
101 SGModelPlacement::setPosition(const SGGeod& position)
102 {
103   _position = position;
104 }
105
106 void
107 SGModelPlacement::setRollDeg (double roll_deg)
108 {
109   _roll_deg = roll_deg;
110 }
111
112 void
113 SGModelPlacement::setPitchDeg (double pitch_deg)
114 {
115   _pitch_deg = pitch_deg;
116 }
117
118 void
119 SGModelPlacement::setHeadingDeg (double heading_deg)
120 {
121   _heading_deg = heading_deg;
122 }
123
124 void
125 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
126                                   double heading_deg)
127 {
128   _roll_deg = roll_deg;
129   _pitch_deg = pitch_deg;
130   _heading_deg = heading_deg;
131 }
132
133 void
134 SGModelPlacement::setOrientation (const SGQuatd& orientation)
135 {
136   orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
137 }
138
139 void
140 SGModelPlacement::setReferenceTime(const double& referenceTime)
141 {
142   SGSceneUserData* userData;
143   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
144   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
145   vel->referenceTime = referenceTime;
146 }
147
148 void
149 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
150 {
151   SGSceneUserData* userData;
152   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
153   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
154   vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
155 }
156
157 void
158 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
159 {
160   SGSceneUserData* userData;
161   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
162   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
163   vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);
164 }
165
166 // end of model.cxx