]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Mathias:
[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 }
45
46 void
47 SGModelPlacement::init( ssgBranch * model )
48 {
49   if (model != 0) {
50       _position->addKid(model);
51   }
52   _selector->addKid(_position);
53   _selector->clrTraversalMaskBits(SSGTRAV_HOT);
54 }
55
56 void
57 SGModelPlacement::update( const Point3D scenery_center )
58 {
59   _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
60   _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
61
62   sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) );
63
64   sgVec3 trans;
65   sgCopyVec3(trans, _location->get_view_pos());
66
67   for(int i = 0; i < 4; i++) {
68     float tmp = POS[i][3];
69     for( int j=0; j<3; j++ ) {
70       POS[i][j] += (tmp * trans[j]);
71     }
72   }
73 //   _position->setTransform(POS);
74   _position->setTransform(_location->get_absolute_view_pos(scenery_center), POS);
75   sgdVec3 center;
76   sgdSetVec3(center,
77              scenery_center.x(), scenery_center.y(), scenery_center.z());
78   _position->setSceneryCenter(center);
79 }
80
81 bool
82 SGModelPlacement::getVisible () const
83 {
84   return (_selector->getSelect() != 0);
85 }
86
87 void
88 SGModelPlacement::setVisible (bool visible)
89 {
90   _selector->select(visible);
91 }
92
93 void
94 SGModelPlacement::setLongitudeDeg (double lon_deg)
95 {
96   _lon_deg = lon_deg;
97 }
98
99 void
100 SGModelPlacement::setLatitudeDeg (double lat_deg)
101 {
102   _lat_deg = lat_deg;
103 }
104
105 void
106 SGModelPlacement::setElevationFt (double elev_ft)
107 {
108   _elev_ft = elev_ft;
109 }
110
111 void
112 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
113 {
114   _lon_deg = lon_deg;
115   _lat_deg = lat_deg;
116   _elev_ft = elev_ft;
117 }
118
119 void
120 SGModelPlacement::setRollDeg (double roll_deg)
121 {
122   _roll_deg = roll_deg;
123 }
124
125 void
126 SGModelPlacement::setPitchDeg (double pitch_deg)
127 {
128   _pitch_deg = pitch_deg;
129 }
130
131 void
132 SGModelPlacement::setHeadingDeg (double heading_deg)
133 {
134   _heading_deg = heading_deg;
135 }
136
137 void
138 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
139                                   double heading_deg)
140 {
141   _roll_deg = roll_deg;
142   _pitch_deg = pitch_deg;
143   _heading_deg = heading_deg;
144 }
145
146 // end of model.cxx