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