]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
e7d4d384eace32440b6b52f1a5f87ac24d54f880
[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
14 #include "location.hxx"
15 #include "placementtrans.hxx"
16
17 #include "placement.hxx"
18
19
20 \f
21 ////////////////////////////////////////////////////////////////////////
22 // Implementation of SGModelPlacement.
23 ////////////////////////////////////////////////////////////////////////
24
25 SGModelPlacement::SGModelPlacement () :
26     _position(SGGeod::fromRad(0, 0)),
27     _roll_deg(0),
28     _pitch_deg(0),
29     _heading_deg(0),
30     _selector(new osg::Switch),
31     _transform(new SGPlacementTransform),
32     _location(new SGLocation)
33 {
34 }
35
36 SGModelPlacement::~SGModelPlacement ()
37 {
38   delete _location;
39 }
40
41 void
42 SGModelPlacement::init( osg::Node * model )
43 {
44   if (model != 0) {
45       _transform->addChild(model);
46   }
47   _selector->addChild(_transform.get());
48   _selector->setValue(0, 1);
49 }
50
51 void
52 SGModelPlacement::update()
53 {
54   _location->setPosition( _position.getLongitudeDeg(),
55                           _position.getLatitudeDeg(),
56                           _position.getElevationFt() );
57   _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
58
59   const sgVec4 *t = _location->getTransformMatrix();
60   SGMatrixd rotation;
61   for (unsigned i = 0; i < 4; ++i)
62     for (unsigned j = 0; j < 4; ++j)
63       rotation(i, j) = t[j][i];
64   SGVec3d pos(_location->get_absolute_view_pos());
65   _transform->setTransform(pos, rotation);
66 }
67
68 bool
69 SGModelPlacement::getVisible () const
70 {
71   return _selector->getValue(0);
72 }
73
74 void
75 SGModelPlacement::setVisible (bool visible)
76 {
77   _selector->setValue(0, visible);
78 }
79
80 void
81 SGModelPlacement::setLongitudeDeg (double lon_deg)
82 {
83   _position.setLongitudeDeg(lon_deg);
84 }
85
86 void
87 SGModelPlacement::setLatitudeDeg (double lat_deg)
88 {
89   _position.setLatitudeDeg(lat_deg);
90 }
91
92 void
93 SGModelPlacement::setElevationFt (double elev_ft)
94 {
95   _position.setElevationFt(elev_ft);
96 }
97
98 void
99 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
100 {
101   _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
102 }
103
104 void
105 SGModelPlacement::setPosition(const SGGeod& position)
106 {
107   _position = position;
108 }
109
110 void
111 SGModelPlacement::setRollDeg (double roll_deg)
112 {
113   _roll_deg = roll_deg;
114 }
115
116 void
117 SGModelPlacement::setPitchDeg (double pitch_deg)
118 {
119   _pitch_deg = pitch_deg;
120 }
121
122 void
123 SGModelPlacement::setHeadingDeg (double heading_deg)
124 {
125   _heading_deg = heading_deg;
126 }
127
128 void
129 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
130                                   double heading_deg)
131 {
132   _roll_deg = roll_deg;
133   _pitch_deg = pitch_deg;
134   _heading_deg = heading_deg;
135 }
136
137 void
138 SGModelPlacement::setOrientation (const SGQuatd& orientation)
139 {
140   orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
141 }
142
143 void
144 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
145 {
146   SGSceneUserData* userData;
147   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
148   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
149   SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
150   vel->linear = orientation.backTransform(linear);
151 }
152
153 void
154 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
155 {
156   SGSceneUserData* userData;
157   userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
158   SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
159   SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
160   vel->angular = orientation.backTransform(angular);
161 }
162
163 // end of model.cxx