]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.cxx
Moved to SimGear from FlightGear/src/Model/
[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 #include <simgear/compiler.h>
7
8 #include <string.h>             // for strcmp()
9
10 #include <vector>
11
12 #include <plib/sg.h>
13 #include <plib/ssg.h>
14 #include <plib/ul.h>
15
16 #include <simgear/scene/model/location.hxx>
17
18 #include "placement.hxx"
19
20 SG_USING_STD(vector);
21
22
23 \f
24 ////////////////////////////////////////////////////////////////////////
25 // Implementation of FGModelPlacement.
26 ////////////////////////////////////////////////////////////////////////
27
28 FGModelPlacement::FGModelPlacement ()
29   : _lon_deg(0),
30     _lat_deg(0),
31     _elev_ft(0),
32     _roll_deg(0),
33     _pitch_deg(0),
34     _heading_deg(0),
35     _selector(new ssgSelector),
36     _position(new ssgTransform),
37     _location(new FGLocation)
38 {
39 }
40
41 FGModelPlacement::~FGModelPlacement ()
42 {
43 }
44
45 void
46 FGModelPlacement::init( ssgBranch * model )
47 {
48   if (model != 0) {
49       _position->addKid(model);
50   }
51   _selector->addKid(_position);
52   _selector->clrTraversalMaskBits(SSGTRAV_HOT);
53 }
54
55 void
56 FGModelPlacement::update( const Point3D scenery_center )
57 {
58   _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
59   _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
60
61   sgCopyMat4( POS, _location->getTransformMatrix(scenery_center) );
62
63   sgVec3 trans;
64   sgCopyVec3(trans, _location->get_view_pos());
65
66   for(int i = 0; i < 4; i++) {
67     float tmp = POS[i][3];
68     for( int j=0; j<3; j++ ) {
69       POS[i][j] += (tmp * trans[j]);
70     }
71   }
72   _position->setTransform(POS);
73 }
74
75 bool
76 FGModelPlacement::getVisible () const
77 {
78   return (_selector->getSelect() != 0);
79 }
80
81 void
82 FGModelPlacement::setVisible (bool visible)
83 {
84   _selector->select(visible);
85 }
86
87 void
88 FGModelPlacement::setLongitudeDeg (double lon_deg)
89 {
90   _lon_deg = lon_deg;
91 }
92
93 void
94 FGModelPlacement::setLatitudeDeg (double lat_deg)
95 {
96   _lat_deg = lat_deg;
97 }
98
99 void
100 FGModelPlacement::setElevationFt (double elev_ft)
101 {
102   _elev_ft = elev_ft;
103 }
104
105 void
106 FGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
107 {
108   _lon_deg = lon_deg;
109   _lat_deg = lat_deg;
110   _elev_ft = elev_ft;
111 }
112
113 void
114 FGModelPlacement::setRollDeg (double roll_deg)
115 {
116   _roll_deg = roll_deg;
117 }
118
119 void
120 FGModelPlacement::setPitchDeg (double pitch_deg)
121 {
122   _pitch_deg = pitch_deg;
123 }
124
125 void
126 FGModelPlacement::setHeadingDeg (double heading_deg)
127 {
128   _heading_deg = heading_deg;
129 }
130
131 void
132 FGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
133                                   double heading_deg)
134 {
135   _roll_deg = roll_deg;
136   _pitch_deg = pitch_deg;
137   _heading_deg = heading_deg;
138 }
139
140 // end of model.cxx