]> 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 86ceb019fbfc2dd8ad03a5d60ac54fb0744fda4e..623d529f68121c9fe9847d340b7353e3e28fc452 100644 (file)
 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.
 class ssgBranch;
+class ssgCutout;
 class ssgEntity;
 class ssgRangeSelector;
 class ssgSelector;
 class ssgTransform;
 
-class SGPropertyNode;
 class SGInterpTable;
 class FGCondition;
 class FGLocation;
@@ -38,15 +41,214 @@ class FGLocation;
 #undef max
 #endif
 
-class FG3DModel
+
+/**
+ * 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);
+
+
+\f
+//////////////////////////////////////////////////////////////////////
+// Animation classes
+//////////////////////////////////////////////////////////////////////
+
+/**
+ * Abstract base class for all animations.
+ */
+class Animation :  public ssgBase
+{
+public:
+
+  Animation (SGPropertyNode_ptr props, ssgBranch * branch);
+
+  virtual ~Animation ();
+
+  /**
+   * Get the SSG branch holding the animation.
+   */
+  virtual ssgBranch * getBranch () { return _branch; }
+
+  /**
+   * Initialize the animation, after children have been added.
+   */
+  virtual void init ();
+
+  /**
+   * Update the animation.
+   */
+  virtual void update ();
+
+protected:
+
+  ssgBranch * _branch;
+
+};
+
+
+/**
+ * A no-op animation.
+ */
+class NullAnimation : public Animation
+{
+public:
+  NullAnimation (SGPropertyNode_ptr props);
+  virtual ~NullAnimation ();
+};
+
+
+/**
+ * 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 (SGPropertyNode_ptr props);
+  virtual ~BillboardAnimation ();
+};
+
+
+/**
+ * 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 (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 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 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;
+};
+
 
-  FG3DModel ();
-  virtual ~FG3DModel ();
+\f
+////////////////////////////////////////////////////////////////////////
+// Model placement.
+////////////////////////////////////////////////////////////////////////
+
+/**
+ * A wrapper for a model with a definite placement.
+ */
+class FGModelPlacement
+{
+public:
+
+  FGModelPlacement ();
+  virtual ~FGModelPlacement ();
 
   virtual void init (const string &path);
-  virtual void update (int dt);
+  virtual void update ();
+
+  virtual ssgEntity * getSceneGraph () { return (ssgEntity *)_selector; }
+
+  virtual FGLocation * getFGLocation () { return _location; }
 
   virtual bool getVisible () const;
   virtual void setVisible (bool visible);
@@ -68,200 +270,26 @@ 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);
-
-  virtual ssgEntity * getSceneGraph () const { return (ssgEntity *)_selector; }
-
-  virtual FGLocation * getFGLocation () const { return _location; }
+                               double heading_deg);
 
 private:
-
-  class Animation;
-  Animation * make_animation (const char * object_name, SGPropertyNode * node);
-
-                               // Geodetic position
+  
+                                // Geodetic position
   double _lon_deg;
   double _lat_deg;
   double _elev_ft;
 
-                               // Orientation
+                                // Orientation
   double _roll_deg;
   double _pitch_deg;
   double _heading_deg;
 
-                               // Animations
-  vector <Animation *> _animations;
-
-                               // Scene graph
-  ssgBranch * _model;
   ssgSelector * _selector;
   ssgTransform * _position;
 
-                               // Location
+                                // Location
   FGLocation * _location;
 
-
-  \f
-  //////////////////////////////////////////////////////////////////////
-  // Internal classes for individual animations.
-  //////////////////////////////////////////////////////////////////////
-
-  /**
-   * Abstract base class for all animations.
-   */
-  class Animation
-  {
-  public:
-
-    Animation ();
-
-    virtual ~Animation ();
-
-    /**
-     * 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;
-
-
-    /**
-     * Update the animation.
-     *
-     * @param dt The elapsed time in milliseconds since the last call.
-     */
-    virtual void update (int dt) = 0;
-
-  };
-
-
-  /**
-   * A no-op animation.
-   */
-  class NullAnimation : public Animation
-  {
-  public:
-    NullAnimation ();
-    virtual ~NullAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int 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 (int dt);
-  private:
-    ssgRangeSelector * _branch;
-  };
-
-
-  /**
-   * 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 (int dt);
-  private:
-    FGCondition * _condition;
-    ssgSelector * _selector;
-  };
-
-
-  /**
-   * 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 (int dt);
-  private:
-    SGPropertyNode * _prop;
-    double _factor;
-    double _position_deg;
-    sgMat4 _matrix;
-    sgVec3 _center;
-    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 ();
-    virtual ~RotateAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int 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 slide along an axis.
-   */
-  class TranslateAnimation : public Animation
-  {
-  public:
-    TranslateAnimation ();
-    virtual ~TranslateAnimation ();
-    virtual void init (ssgEntity * object, SGPropertyNode * props);
-    virtual void update (int 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;
-  };
-
 };
 
 #endif // __MODEL_HXX
-
-
-