]> git.mxchange.org Git - flightgear.git/blobdiff - src/Model/model.hxx
Make sure that all elapsed time gets passed to update when a subsystem
[flightgear.git] / src / Model / model.hxx
index cc5142519d7029adcacd476a60e18d8d1c7ef7e8..623d529f68121c9fe9847d340b7353e3e28fc452 100644 (file)
@@ -15,6 +15,9 @@
 SG_USING_STD(vector);
 
 #include <plib/sg.h>
+#include <plib/ssg.h>
+
+#include <simgear/misc/props.hxx>
 
 
 // Don't pull in the headers, since we don't need them here.
@@ -25,7 +28,6 @@ class ssgRangeSelector;
 class ssgSelector;
 class ssgTransform;
 
-class SGPropertyNode;
 class SGInterpTable;
 class FGCondition;
 class FGLocation;
@@ -40,210 +42,200 @@ class FGLocation;
 #endif
 
 
-class FG3DModel
-{
-public:
-
-  FG3DModel ();
-  virtual ~FG3DModel ();
-
-  virtual void init (const string &path);
-  virtual void update (double dt);
-
-  virtual ssgEntity * getSceneGraph () const { return (ssgEntity *)_model; }
-
-private:
+/**
+ * Load a 3D model with or without XML wrapper.
+ *
+ * If the path ends in ".xml", then it will be used as a property-
+ * list wrapper to add animations to the model.
+ *
+ * Subsystems should not normally invoke this function directly;
+ * instead, they should use the FGModelLoader declared in loader.hxx.
+ */
+ssgBranch * fgLoad3DModel (const string &path);
 
-  class Animation;
-  Animation * make_animation (const char * object_name, SGPropertyNode * node);
 
-                               // Child models.
-  vector<FG3DModel *> _children;
+\f
+//////////////////////////////////////////////////////////////////////
+// Animation classes
+//////////////////////////////////////////////////////////////////////
 
-                               // Animations
-  vector <Animation *> _animations;
-
-                               // Scene graph
-  ssgBranch * _model;
+/**
+ * Abstract base class for all animations.
+ */
+class Animation :  public ssgBase
+{
+public:
 
+  Animation (SGPropertyNode_ptr props, ssgBranch * branch);
 
-  \f
-  //////////////////////////////////////////////////////////////////////
-  // Internal classes for individual animations.
-  //////////////////////////////////////////////////////////////////////
+  virtual ~Animation ();
 
   /**
-   * Abstract base class for all animations.
+   * Get the SSG branch holding the animation.
    */
-  class Animation
-  {
-  public:
+  virtual ssgBranch * getBranch () { return _branch; }
 
-    Animation ();
+  /**
+   * Initialize the animation, after children have been added.
+   */
+  virtual void init ();
 
-    virtual ~Animation ();
+  /**
+   * Update the animation.
+   */
+  virtual void update ();
 
-    /**
-     * Initialize the animation.
-     *
-     * @param object The object to animate.
-     * @param props The property node with configuration information.
-     */
-    virtual void init (ssgEntity * object, SGPropertyNode * props) = 0;
+protected:
 
+  ssgBranch * _branch;
 
-    /**
-     * Update the animation.
-     *
-     * @param dt The elapsed time in seconds since the last call.
-     */
-    virtual void update (double dt) = 0;
+};
 
-  };
 
+/**
+ * A no-op animation.
+ */
+class NullAnimation : public Animation
+{
+public:
+  NullAnimation (SGPropertyNode_ptr props);
+  virtual ~NullAnimation ();
+};
 
-  /**
-   * A no-op animation.
-   */
-  class NullAnimation : public Animation
-  {
-  public:
-    NullAnimation ();
-    virtual ~NullAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    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;
-  };
+/**
+ * A range, or level-of-detail (LOD) animation.
+ */
+class RangeAnimation : public Animation
+{
+public:
+  RangeAnimation (SGPropertyNode_ptr props);
+  virtual ~RangeAnimation ();
+};
 
 
-  /**
-   * 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 turn and face the screen.
+ */
+class BillboardAnimation : public Animation
+{
+public:
+  BillboardAnimation (SGPropertyNode_ptr props);
+  virtual ~BillboardAnimation ();
+};
 
 
-  /**
-   * Animation to select alternative versions of the same object.
-   */
-  class SelectAnimation : public Animation
-  {
-  public:
-    SelectAnimation ();
-    virtual ~SelectAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (double dt);
-  private:
-    FGCondition * _condition;
-    ssgSelector * _selector;
-  };
+/**
+ * Animation to select alternative versions of the same object.
+ */
+class SelectAnimation : public Animation
+{
+public:
+  SelectAnimation (SGPropertyNode_ptr props);
+  virtual ~SelectAnimation ();
+  virtual void update ();
+private:
+  FGCondition * _condition;
+};
 
 
-  /**
-   * Animation to spin an object around a center point.
-   *
-   * This animation rotates at a specific velocity.
-   */
-  class SpinAnimation : public Animation
-  {
-  public:
-    SpinAnimation ();
-    virtual ~SpinAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (double dt);
-  private:
-    SGPropertyNode * _prop;
-    double _factor;
-    double _position_deg;
-    sgMat4 _matrix;
-    sgVec3 _center;
-    sgVec3 _axis;
-    ssgTransform * _transform;
-  };
+/**
+ * Animation to spin an object around a center point.
+ *
+ * This animation rotates at a specific velocity.
+ */
+class SpinAnimation : public Animation
+{
+public:
+  SpinAnimation (SGPropertyNode_ptr props);
+  virtual ~SpinAnimation ();
+  virtual void update ();
+private:
+  SGPropertyNode_ptr _prop;
+  double _factor;
+  double _position_deg;
+  double _last_time_sec;
+  sgMat4 _matrix;
+  sgVec3 _center;
+  sgVec3 _axis;
+};
 
 
-  /**
-   * Animation to rotate an object around a center point.
-   *
-   * This animation rotates to a specific position.
-   */
-  class RotateAnimation : public Animation
-  {
-  public:
-    RotateAnimation ();
-    virtual ~RotateAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (double dt);
-  private:
-    SGPropertyNode * _prop;
-    double _offset_deg;
-    double _factor;
-    SGInterpTable * _table;
-    bool _has_min;
-    double _min_deg;
-    bool _has_max;
-    double _max_deg;
-    double _position_deg;
-    sgMat4 _matrix;
-    sgVec3 _center;
-    sgVec3 _axis;
-    ssgTransform * _transform;
-  };
+/**
+ * Animation to draw objects for a specific amount of time each.
+ */
+class TimedAnimation : public Animation
+{
+public:
+    TimedAnimation (SGPropertyNode_ptr props);
+    virtual ~TimedAnimation ();
+    virtual void update ();
+private:
+    double _duration_sec;
+    double _last_time_sec;
+    int _step;
+};
 
 
-  /**
-   * Animation to slide along an axis.
-   */
-  class TranslateAnimation : public Animation
-  {
-  public:
-    TranslateAnimation ();
-    virtual ~TranslateAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (double dt);
-  private:
-    SGPropertyNode * _prop;
-    double _offset_m;
-    double _factor;
-    SGInterpTable * _table;
-    bool _has_min;
-    double _min_m;
-    bool _has_max;
-    double _max_m;
-    double _position_m;
-    sgMat4 _matrix;
-    sgVec3 _axis;
-    ssgTransform * _transform;
-  };
+/**
+ * Animation to rotate an object around a center point.
+ *
+ * This animation rotates to a specific position.
+ */
+class RotateAnimation : public Animation
+{
+public:
+  RotateAnimation (SGPropertyNode_ptr props);
+  virtual ~RotateAnimation ();
+  virtual void update ();
+private:
+  SGPropertyNode_ptr _prop;
+  double _offset_deg;
+  double _factor;
+  SGInterpTable * _table;
+  bool _has_min;
+  double _min_deg;
+  bool _has_max;
+  double _max_deg;
+  double _position_deg;
+  sgMat4 _matrix;
+  sgVec3 _center;
+  sgVec3 _axis;
+};
 
 
+/**
+ * Animation to slide along an axis.
+ */
+class TranslateAnimation : public Animation
+{
+public:
+  TranslateAnimation (SGPropertyNode_ptr props);
+  virtual ~TranslateAnimation ();
+  virtual void update ();
+private:
+  SGPropertyNode_ptr _prop;
+  double _offset_m;
+  double _factor;
+  SGInterpTable * _table;
+  bool _has_min;
+  double _min_m;
+  bool _has_max;
+  double _max_m;
+  double _position_m;
+  sgMat4 _matrix;
+  sgVec3 _axis;
 };
 
 
+\f
+////////////////////////////////////////////////////////////////////////
+// Model placement.
+////////////////////////////////////////////////////////////////////////
+
+/**
+ * A wrapper for a model with a definite placement.
+ */
 class FGModelPlacement
 {
 public:
@@ -252,7 +244,7 @@ public:
   virtual ~FGModelPlacement ();
 
   virtual void init (const string &path);
-  virtual void update (double dt);
+  virtual void update ();
 
   virtual ssgEntity * getSceneGraph () { return (ssgEntity *)_selector; }
 
@@ -278,18 +270,16 @@ public:
   virtual void setPitchDeg (double pitch_deg);
   virtual void setHeadingDeg (double heading_deg);
   virtual void setOrientation (double roll_deg, double pitch_deg,
-                              double heading_deg);
+                               double heading_deg);
 
 private:
   
-  FG3DModel * _model;
-
-                               // Geodetic position
+                                // Geodetic position
   double _lon_deg;
   double _lat_deg;
   double _elev_ft;
 
-                               // Orientation
+                                // Orientation
   double _roll_deg;
   double _pitch_deg;
   double _heading_deg;
@@ -297,12 +287,9 @@ private:
   ssgSelector * _selector;
   ssgTransform * _position;
 
-                               // Location
+                                // Location
   FGLocation * _location;
 
 };
 
 #endif // __MODEL_HXX
-
-
-