]> git.mxchange.org Git - flightgear.git/blobdiff - src/Model/model.hxx
Solve for the elevator control input during approach. It turns out that
[flightgear.git] / src / Model / model.hxx
index 78417d08f967612eca31b3bd9fa78dd1a114fc0f..bc48663acd0a16c467ac508496482d5949882ece 100644 (file)
 #endif
 
 #include <vector>
-#include <plib/ssg.h>
 
 SG_USING_STD(vector);
 
-#include <Main/fg_props.hxx>
-#include <Main/location.hxx>
+#include <plib/sg.h>
+
+
+// Don't pull in the headers, since we don't need them here.
+class ssgBranch;
+class ssgCutout;
+class ssgEntity;
+class ssgRangeSelector;
+class ssgSelector;
+class ssgTransform;
+
+class SGPropertyNode;
+class SGInterpTable;
+class FGCondition;
+class FGLocation;
+
 
 // Has anyone done anything *really* stupid, like making min and max macros?
 #ifdef min
@@ -34,7 +47,7 @@ public:
   virtual ~FG3DModel ();
 
   virtual void init (const string &path);
-  virtual void update (int dt);
+  virtual void update (double dt);
 
   virtual bool getVisible () const;
   virtual void setVisible (bool visible);
@@ -43,16 +56,22 @@ public:
   virtual double getLatitudeDeg () const { return _lat_deg; }
   virtual double getElevationFt () const { return _elev_ft; }
 
+  virtual void setLongitudeDeg (double lon_deg);
+  virtual void setLatitudeDeg (double lat_deg);
+  virtual void setElevationFt (double elev_ft);
   virtual void setPosition (double lon_deg, double lat_deg, double elev_ft);
 
-  virtual double getRoll () const { return _roll_deg; }
-  virtual double getPitch () const { return _pitch_deg; }
-  virtual double getHeading () const { return _heading_deg; }
+  virtual double getRollDeg () const { return _roll_deg; }
+  virtual double getPitchDeg () const { return _pitch_deg; }
+  virtual double getHeadingDeg () const { return _heading_deg; }
 
+  virtual void setRollDeg (double roll_deg);
+  virtual void setPitchDeg (double pitch_deg);
+  virtual void setHeadingDeg (double heading_deg);
   virtual void setOrientation (double roll_deg, double pitch_deg,
                               double heading_deg);
 
-  virtual ssgEntity * getSceneGraph () const { return _selector; }
+  virtual ssgEntity * getSceneGraph () const { return (ssgEntity *)_selector; }
 
   virtual FGLocation * getFGLocation () const { return _location; }
 
@@ -72,18 +91,17 @@ private:
   double _heading_deg;
 
                                // Animations
-
   vector <Animation *> _animations;
 
-
                                // Scene graph
-  ssgEntity * _model;
+  ssgBranch * _model;
   ssgSelector * _selector;
   ssgTransform * _position;
 
                                // Location
   FGLocation * _location;
 
+
   \f
   //////////////////////////////////////////////////////////////////////
   // Internal classes for individual animations.
@@ -112,9 +130,9 @@ private:
     /**
      * Update the animation.
      *
-     * @param dt The elapsed time in milliseconds since the last call.
+     * @param dt The elapsed time in seconds since the last call.
      */
-    virtual void update (int dt) = 0;
+    virtual void update (double dt) = 0;
 
   };
 
@@ -128,11 +146,41 @@ private:
     NullAnimation ();
     virtual ~NullAnimation ();
     virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int dt);
+    virtual void update (double dt);
   private:
     ssgBranch * _branch;
   };
 
+  
+  /**
+   * A range, or level-of-detail (LOD) animation.
+   */
+  class RangeAnimation : public Animation
+  {
+  public:
+    RangeAnimation ();
+    virtual ~RangeAnimation ();
+    virtual void init (ssgEntity * object, SGPropertyNode * props);
+    virtual void update (double dt);
+  private:
+    ssgRangeSelector * _branch;
+  };
+
+
+  /**
+   * Animation to turn and face the screen.
+   */
+  class BillboardAnimation : public Animation
+  {
+  public:
+    BillboardAnimation ();
+    virtual ~BillboardAnimation ();
+    virtual void init (ssgEntity * object, SGPropertyNode * props);
+    virtual void update (double dt);
+  private:
+    ssgCutout * _branch;
+  };
+
 
   /**
    * Animation to select alternative versions of the same object.
@@ -143,7 +191,7 @@ private:
     SelectAnimation ();
     virtual ~SelectAnimation ();
     virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int dt);
+    virtual void update (double dt);
   private:
     FGCondition * _condition;
     ssgSelector * _selector;
@@ -161,7 +209,7 @@ private:
     SpinAnimation ();
     virtual ~SpinAnimation ();
     virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int dt);
+    virtual void update (double dt);
   private:
     SGPropertyNode * _prop;
     double _factor;
@@ -184,11 +232,12 @@ private:
     RotateAnimation ();
     virtual ~RotateAnimation ();
     virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int dt);
+    virtual void update (double dt);
   private:
     SGPropertyNode * _prop;
     double _offset_deg;
     double _factor;
+    SGInterpTable * _table;
     bool _has_min;
     double _min_deg;
     bool _has_max;
@@ -210,11 +259,12 @@ private:
     TranslateAnimation ();
     virtual ~TranslateAnimation ();
     virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int dt);
+    virtual void update (double dt);
   private:
     SGPropertyNode * _prop;
     double _offset_m;
     double _factor;
+    SGInterpTable * _table;
     bool _has_min;
     double _min_m;
     bool _has_max;
@@ -225,6 +275,7 @@ private:
     ssgTransform * _transform;
   };
 
+
 };
 
 #endif // __MODEL_HXX