]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Modified Files:
[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 <string.h>             // for strcmp()
13
14 #include <plib/ul.h>
15
16 #include "location.hxx"
17 #include "placementtrans.hxx"
18
19 #include "placement.hxx"
20
21
22 \f
23 ////////////////////////////////////////////////////////////////////////
24 // Implementation of SGModelPlacement.
25 ////////////////////////////////////////////////////////////////////////
26
27 SGModelPlacement::SGModelPlacement ()
28   : _lon_deg(0),
29     _lat_deg(0),
30     _elev_ft(0),
31     _roll_deg(0),
32     _pitch_deg(0),
33     _heading_deg(0),
34     _selector(new osg::Switch),
35     _position(new SGPlacementTransform),
36     _location(new SGLocation)
37 {
38 }
39
40 SGModelPlacement::~SGModelPlacement ()
41 {
42   delete _location;
43 }
44
45 void
46 SGModelPlacement::init( osg::Node * model )
47 {
48   if (model != 0) {
49       _position->addChild(model);
50   }
51   _selector->addChild(_position.get());
52 //   _selector->setNodeMask(_selector->getNodeMask() & ~SG_HOT_TRAVERSAL_BIT);
53   _selector->setValue(0, 1);
54 }
55
56 void
57 SGModelPlacement::update()
58 {
59   _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
60   _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
61
62   const sgVec4 *t = _location->getTransformMatrix();
63   SGMatrixd rotation;
64   for (unsigned i = 0; i < 4; ++i)
65     for (unsigned j = 0; j < 4; ++j)
66       rotation(i, j) = t[j][i];
67   SGVec3d pos(_location->get_absolute_view_pos());
68   _position->setTransform(pos, rotation);
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   _lon_deg = lon_deg;
87 }
88
89 void
90 SGModelPlacement::setLatitudeDeg (double lat_deg)
91 {
92   _lat_deg = lat_deg;
93 }
94
95 void
96 SGModelPlacement::setElevationFt (double elev_ft)
97 {
98   _elev_ft = elev_ft;
99 }
100
101 void
102 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
103 {
104   _lon_deg = lon_deg;
105   _lat_deg = lat_deg;
106   _elev_ft = elev_ft;
107 }
108
109 void
110 SGModelPlacement::setPosition(const SGGeod& position)
111 {
112   _lon_deg = position.getLongitudeDeg();
113   _lat_deg = position.getLatitudeDeg();
114   _elev_ft = position.getElevationFt();
115 }
116
117 void
118 SGModelPlacement::setRollDeg (double roll_deg)
119 {
120   _roll_deg = roll_deg;
121 }
122
123 void
124 SGModelPlacement::setPitchDeg (double pitch_deg)
125 {
126   _pitch_deg = pitch_deg;
127 }
128
129 void
130 SGModelPlacement::setHeadingDeg (double heading_deg)
131 {
132   _heading_deg = heading_deg;
133 }
134
135 void
136 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
137                                   double heading_deg)
138 {
139   _roll_deg = roll_deg;
140   _pitch_deg = pitch_deg;
141   _heading_deg = heading_deg;
142 }
143
144 void
145 SGModelPlacement::setOrientation (const SGQuatd& orientation)
146 {
147   orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
148 }
149
150 // end of model.cxx