]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Various code massaging.
[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 <vector>
15
16 #include <plib/sg.h>
17 #include <plib/ssg.h>
18 #include <plib/ul.h>
19
20 #include "location.hxx"
21
22 #include "placement.hxx"
23
24 SG_USING_STD(vector);
25
26
27 \f
28 ////////////////////////////////////////////////////////////////////////
29 // Implementation of SGModelPlacement.
30 ////////////////////////////////////////////////////////////////////////
31
32 SGModelPlacement::SGModelPlacement ()
33   : _lon_deg(0),
34     _lat_deg(0),
35     _elev_ft(0),
36     _roll_deg(0),
37     _pitch_deg(0),
38     _heading_deg(0),
39     _selector(new ssgSelector),
40     _position(new ssgTransform),
41     _location(new SGLocation)
42 {
43 }
44
45 SGModelPlacement::~SGModelPlacement ()
46 {
47 }
48
49 void
50 SGModelPlacement::init( ssgBranch * model )
51 {
52   if (model != 0) {
53       _position->addKid(model);
54   }
55   _selector->addKid(_position);
56   _selector->clrTraversalMaskBits(SSGTRAV_HOT);
57 }
58
59 void
60 SGModelPlacement::update( const Point3D scenery_center )
61 {
62   _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
63   _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
64
65   sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) );
66
67   sgVec3 trans;
68   sgCopyVec3(trans, _location->get_view_pos());
69
70   for(int i = 0; i < 4; i++) {
71     float tmp = POS[i][3];
72     for( int j=0; j<3; j++ ) {
73       POS[i][j] += (tmp * trans[j]);
74     }
75   }
76   _position->setTransform(POS);
77 }
78
79 bool
80 SGModelPlacement::getVisible () const
81 {
82   return (_selector->getSelect() != 0);
83 }
84
85 void
86 SGModelPlacement::setVisible (bool visible)
87 {
88   _selector->select(visible);
89 }
90
91 void
92 SGModelPlacement::setLongitudeDeg (double lon_deg)
93 {
94   _lon_deg = lon_deg;
95 }
96
97 void
98 SGModelPlacement::setLatitudeDeg (double lat_deg)
99 {
100   _lat_deg = lat_deg;
101 }
102
103 void
104 SGModelPlacement::setElevationFt (double elev_ft)
105 {
106   _elev_ft = elev_ft;
107 }
108
109 void
110 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
111 {
112   _lon_deg = lon_deg;
113   _lat_deg = lat_deg;
114   _elev_ft = elev_ft;
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 // end of model.cxx