]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/placement.hxx
Work around apparent OSG 3.2.0 normal binding bug.
[simgear.git] / simgear / scene / model / placement.hxx
1 // placement.hxx - 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
7 #ifndef _SG_PLACEMENT_HXX
8 #define _SG_PLACEMENT_HXX 1
9
10 #ifndef __cplusplus
11 # error This library requires C++
12 #endif
13
14 #include <osg/ref_ptr>
15 #include <osg/Node>
16 #include <osg/Switch>
17 #include <osg/PositionAttitudeTransform>
18
19 #include <simgear/math/SGMath.hxx>
20
21 // Has anyone done anything *really* stupid, like making min and max macros?
22 #ifdef min
23 #undef min
24 #endif
25 #ifdef max
26 #undef max
27 #endif
28
29
30 ////////////////////////////////////////////////////////////////////////
31 // Model placement.
32 ////////////////////////////////////////////////////////////////////////
33
34 /**
35  * A wrapper for a model with a definite placement.
36  */
37 class SGModelPlacement
38 {
39 public:
40
41   SGModelPlacement ();
42   virtual ~SGModelPlacement ();
43
44   virtual void init( osg::Node* model );
45   void clear();
46   void add( osg::Node* model );
47   
48   virtual void update();
49
50   virtual osg::Node* getSceneGraph () { return _selector.get(); }
51
52   virtual bool getVisible () const;
53   virtual void setVisible (bool visible);
54
55   void setPosition(const SGGeod& position);
56   const SGGeod& getPosition() const { return _position; }
57
58   virtual double getRollDeg () const { return _roll_deg; }
59   virtual double getPitchDeg () const { return _pitch_deg; }
60   virtual double getHeadingDeg () const { return _heading_deg; }
61
62   virtual void setRollDeg (double roll_deg);
63   virtual void setPitchDeg (double pitch_deg);
64   virtual void setHeadingDeg (double heading_deg);
65   virtual void setOrientation (double roll_deg, double pitch_deg,
66                                double heading_deg);
67   void setOrientation(const SGQuatd& orientation);
68
69   void setReferenceTime(const double& referenceTime);
70   void setBodyLinearVelocity(const SGVec3d& velocity);
71   void setBodyAngularVelocity(const SGVec3d& velocity);
72   
73 private:
74                                 // Geodetic position
75   SGGeod _position;
76
77                                 // Orientation
78   double _roll_deg;
79   double _pitch_deg;
80   double _heading_deg;
81
82   osg::ref_ptr<osg::Switch> _selector;
83   osg::ref_ptr<osg::PositionAttitudeTransform> _transform;
84 };
85
86 #endif // _SG_PLACEMENT_HXX