]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Reset: model placement can drop OSG nodes.
[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 "placement.hxx"
11
12 #include <simgear/compiler.h>
13 #include <simgear/scene/util/OsgMath.hxx>
14 #include <simgear/scene/util/SGSceneUserData.hxx>
15
16 \f
17 ////////////////////////////////////////////////////////////////////////
18 // Implementation of SGModelPlacement.
19 ////////////////////////////////////////////////////////////////////////
20
21 SGModelPlacement::SGModelPlacement () :
22     _position(SGGeod::fromRad(0, 0)),
23     _roll_deg(0),
24     _pitch_deg(0),
25     _heading_deg(0),
26     _selector(new osg::Switch),
27     _transform(new osg::PositionAttitudeTransform)
28 {
29     _selector->addChild(_transform.get());
30 }
31
32 SGModelPlacement::~SGModelPlacement ()
33 {
34 }
35
36 void
37 SGModelPlacement::init( osg::Node * model )
38 {
39   // remove previous model (in case of reinit)
40   _transform->removeChild(0,1);
41   if (model != 0) {
42       _transform->addChild(model);
43   }
44   _selector->setValue(0, 1);
45 }
46
47 void SGModelPlacement::clear()
48 {
49     _selector = NULL;
50     _transform = NULL;
51 }
52
53 void
54 SGModelPlacement::update()
55 {
56   // The cartesian position
57   SGVec3d position = SGVec3d::fromGeod(_position);
58   _transform->setPosition(toOsg(position));
59
60   // The orientation, composed from the horizontal local orientation and the
61   // orientation wrt the horizontal local frame
62   SGQuatd orient = SGQuatd::fromLonLat(_position);
63   orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
64   // Convert to the scenegraph orientation where we just rotate around
65   // the y axis 180 degrees.
66   orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
67
68   _transform->setAttitude(toOsg(orient));
69 }
70
71 bool
72 SGModelPlacement::getVisible () const
73 {
74   return _selector->getValue(0);
75 }
76
77 void
78 SGModelPlacement::setVisible (bool visible)
79 {
80   _selector->setValue(0, visible);
81 }
82
83 void
84 SGModelPlacement::setLongitudeDeg (double lon_deg)
85 {
86   _position.setLongitudeDeg(lon_deg);
87 }
88
89 void
90 SGModelPlacement::setLatitudeDeg (double lat_deg)
91 {
92   _position.setLatitudeDeg(lat_deg);
93 }
94
95 void
96 SGModelPlacement::setElevationFt (double elev_ft)
97 {
98   _position.setElevationFt(elev_ft);
99 }
100
101 void
102 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
103 {
104   _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
105 }
106
107 void
108 SGModelPlacement::setPosition(const SGGeod& position)
109 {
110   _position = position;
111 }
112
113 void
114 SGModelPlacement::setRollDeg (double roll_deg)
115 {
116   _roll_deg = roll_deg;
117 }
118
119 void
120 SGModelPlacement::setPitchDeg (double pitch_deg)
121 {
122   _pitch_deg = pitch_deg;
123 }
124
125 void
126 SGModelPlacement::setHeadingDeg (double heading_deg)
127 {
128   _heading_deg = heading_deg;
129 }
130
131 void
132 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
133                                   double heading_deg)
134 {
135   _roll_deg = roll_deg;
136   _pitch_deg = pitch_deg;
137   _heading_deg = heading_deg;
138 }
139
140 void
141 SGModelPlacement::setOrientation (const SGQuatd& orientation)
142 {
143   orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
144 }
145
146 void
147 SGModelPlacement::setReferenceTime(const double& referenceTime)
148 {
149   SGSceneUserData* userData;
150   userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
151   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
152   vel->referenceTime = referenceTime;
153 }
154
155 void
156 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
157 {
158   SGSceneUserData* userData;
159   userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
160   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
161   vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
162 }
163
164 void
165 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
166 {
167   SGSceneUserData* userData;
168   userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
169   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
170   vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);
171 }
172
173 // end of model.cxx