]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Memory leak fix.
[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/sg.h>
15 #include <plib/ssg.h>
16 #include <plib/ul.h>
17
18 #include "location.hxx"
19 #include "placementtrans.hxx"
20
21 #include "placement.hxx"
22
23
24 \f
25 ////////////////////////////////////////////////////////////////////////
26 // Implementation of SGModelPlacement.
27 ////////////////////////////////////////////////////////////////////////
28
29 SGModelPlacement::SGModelPlacement ()
30   : _lon_deg(0),
31     _lat_deg(0),
32     _elev_ft(0),
33     _roll_deg(0),
34     _pitch_deg(0),
35     _heading_deg(0),
36     _selector(new ssgSelector),
37     _position(new ssgPlacementTransform),
38     _location(new SGLocation)
39 {
40 }
41
42 SGModelPlacement::~SGModelPlacement ()
43 {
44   delete _location;
45 }
46
47 void
48 SGModelPlacement::init( ssgBranch * model )
49 {
50   if (model != 0) {
51       _position->addKid(model);
52   }
53   _selector->addKid(_position);
54   _selector->clrTraversalMaskBits(SSGTRAV_HOT);
55 }
56
57 void
58 SGModelPlacement::update()
59 {
60   _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
61   _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
62
63   sgMat4 rotation;
64   sgCopyMat4( rotation, _location->getTransformMatrix() );
65   _position->setTransform(_location->get_absolute_view_pos(), rotation);
66 }
67
68 bool
69 SGModelPlacement::getVisible () const
70 {
71   return (_selector->getSelect() != 0);
72 }
73
74 void
75 SGModelPlacement::setVisible (bool visible)
76 {
77   _selector->select(visible);
78 }
79
80 void
81 SGModelPlacement::setLongitudeDeg (double lon_deg)
82 {
83   _lon_deg = lon_deg;
84 }
85
86 void
87 SGModelPlacement::setLatitudeDeg (double lat_deg)
88 {
89   _lat_deg = lat_deg;
90 }
91
92 void
93 SGModelPlacement::setElevationFt (double elev_ft)
94 {
95   _elev_ft = elev_ft;
96 }
97
98 void
99 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
100 {
101   _lon_deg = lon_deg;
102   _lat_deg = lat_deg;
103   _elev_ft = elev_ft;
104 }
105
106 void
107 SGModelPlacement::setPosition(const SGGeod& position)
108 {
109   _lon_deg = position.getLongitudeDeg();
110   _lat_deg = position.getLatitudeDeg();
111   _elev_ft = position.getElevationFt();
112 }
113
114 void
115 SGModelPlacement::setRollDeg (double roll_deg)
116 {
117   _roll_deg = roll_deg;
118 }
119
120 void
121 SGModelPlacement::setPitchDeg (double pitch_deg)
122 {
123   _pitch_deg = pitch_deg;
124 }
125
126 void
127 SGModelPlacement::setHeadingDeg (double heading_deg)
128 {
129   _heading_deg = heading_deg;
130 }
131
132 void
133 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
134                                   double heading_deg)
135 {
136   _roll_deg = roll_deg;
137   _pitch_deg = pitch_deg;
138   _heading_deg = heading_deg;
139 }
140
141 void
142 SGModelPlacement::setOrientation (const SGQuatd& orientation)
143 {
144   orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
145 }
146
147 // end of model.cxx