]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/submodel.hxx
Merge branches 'jmt/xmlauto', 'luff/kln89' and 'curt/radial'
[flightgear.git] / src / AIModel / submodel.hxx
index dbddf39fdb9f625d29c6527ce1070135e4b978fb..7ca046f9dc0789f8334c3a572634772d7635ea15 100644 (file)
 #include <AIModel/AIBase.hxx>
 #include <vector>
 #include <string>
-SG_USING_STD(vector);
-SG_USING_STD(string);
 
+#include <Main/fg_props.hxx>
+
+using std::vector;
+using std::string;
+using std::list;
+
+class FGAIBase;
 
 class FGSubmodelMgr : public SGSubsystem
 {
 
 public:
 
-
- typedef struct {
-  SGPropertyNode* trigger;
-  SGPropertyNode* prop;
-  SGPropertyNode* contents_node;
-  
-  string             name;
-  string             model;
-  double             speed;
-  bool               slaved;
-  bool               repeat;
-  double             delay;
-  double             timer;
-  int                count;
-  double             x_offset;
-  double             y_offset;
-  double             z_offset;
-  double             yaw_offset;
-  double             pitch_offset;
-  double             drag_area; 
-  double             life;
-  double             buoyancy;
-  bool               wind;
-  bool               first_time;
-  double             cd;
-  double             weight;
-  double             contents;
- } submodel; 
-
- typedef struct {
-  double     lat;
-  double     lon;
-  double     alt;
-  double     roll;
-  double     azimuth;
-  double     elevation;
-  double     speed;
-  double     wind_from_east;
-  double     wind_from_north;
-  double     speed_down_fps;
-  double     speed_east_fps;
-  double     speed_north_fps;
-  double     total_speed_down;
-  double     total_speed_east;
-  double     total_speed_north;
-  double     mass;
- } IC_struct;  
-
-    FGSubmodelMgr ();
-    ~FGSubmodelMgr ();
-
-    void load ();
-    void init ();
-    void bind ();
-    void unbind ();
-    void update (double dt);
-    bool release (submodel* sm, double dt);
-    void transform (submodel* sm);
-    void updatelat( double lat );
+    typedef struct {
+        SGPropertyNode_ptr trigger_node;
+        SGPropertyNode_ptr prop;
+        SGPropertyNode_ptr contents_node;
+        SGPropertyNode_ptr submodel_node;
+        SGPropertyNode_ptr speed_node;
+
+        string             name;
+        string             model;
+        double             speed;
+        bool               slaved;
+        bool               repeat;
+        double             delay;
+        double             timer;
+        int                count;
+        double             x_offset;
+        double             y_offset;
+        double             z_offset;
+        double             yaw_offset;
+        double             pitch_offset;
+        double             drag_area;
+        double             life;
+        double             buoyancy;
+        bool               wind;
+        bool               first_time;
+        double             cd;
+        double             weight;
+        double             contents;
+        bool               aero_stabilised;
+        int                id;
+        bool               no_roll;
+        bool               serviceable;
+        bool               collision;
+        bool               impact;
+        string             impact_report;
+        double             fuse_range;
+        string             submodel;
+        int                sub_id;
+        bool               force_stabilised;
+        bool               ext_force;
+        string             force_path;
+    }   submodel;
+
+    typedef struct {
+        double     lat;
+        double     lon;
+        double     alt;
+        double     roll;
+        double     azimuth;
+        double     elevation;
+        double     speed;
+        double     wind_from_east;
+        double     wind_from_north;
+        double     speed_down_fps;
+        double     speed_east_fps;
+        double     speed_north_fps;
+        double     total_speed_down;
+        double     total_speed_east;
+        double     total_speed_north;
+        double     mass;
+        int        id;
+        bool       no_roll;
+    }   IC_struct;
+
+    FGSubmodelMgr();
+    ~FGSubmodelMgr();
+
+    void load();
+    void init();
+    void postinit();
+    void bind();
+    void unbind();
+    void update(double dt);
+    void updatelat(double lat);
 
 private:
 
@@ -91,50 +111,89 @@ private:
     typedef submodel_vector_type::iterator submodel_vector_iterator;
 
     submodel_vector_type       submodels;
-    submodel_vector_iterator   submodel_iterator;
+    submodel_vector_type       subsubmodels;
+    submodel_vector_iterator   submodel_iterator, subsubmodel_iterator;
 
     float trans[3][3];
     float in[3];
     float out[3];
 
-    double Rx, Ry, Rz;
-    double Sx, Sy, Sz;
-    double Tx, Ty, Tz;
+    //double Rx, Ry, Rz;
+    //double Sx, Sy, Sz;
+    //double Tx, Ty, Tz;
 
     float cosRx, sinRx;
     float cosRy, sinRy;
     float cosRz, sinRz;
 
+    int index;
+
     double ft_per_deg_longitude;
     double ft_per_deg_latitude;
 
     double x_offset, y_offset, z_offset;
     double pitch_offset, yaw_offset;
 
+    double _parent_lat;
+    double _parent_lon;
+    double _parent_elev;
+    double _parent_hdg;
+    double _parent_pitch;
+    double _parent_roll;
+    double _parent_speed;
+
     static const double lbs_to_slugs; //conversion factor
 
-    SGPropertyNode* _serviceable_node;
-    SGPropertyNode* _user_lat_node;
-    SGPropertyNode* _user_lon_node;
-    SGPropertyNode* _user_heading_node;
-    SGPropertyNode* _user_alt_node;
-    SGPropertyNode* _user_pitch_node;
-    SGPropertyNode* _user_roll_node;
-    SGPropertyNode* _user_yaw_node;
-    SGPropertyNode* _user_alpha_node;
-    SGPropertyNode* _user_speed_node;
-    SGPropertyNode* _user_wind_from_east_node;
-    SGPropertyNode* _user_wind_from_north_node;
-    SGPropertyNode* _user_speed_down_fps_node;
-    SGPropertyNode* _user_speed_east_fps_node;
-    SGPropertyNode* _user_speed_north_fps_node;
+    double contrail_altitude;
+
+    bool _impact;
+    bool _hit;
+
+    SGPropertyNode_ptr _serviceable_node;
+    SGPropertyNode_ptr _user_lat_node;
+    SGPropertyNode_ptr _user_lon_node;
+    SGPropertyNode_ptr _user_heading_node;
+    SGPropertyNode_ptr _user_alt_node;
+    SGPropertyNode_ptr _user_pitch_node;
+    SGPropertyNode_ptr _user_roll_node;
+    SGPropertyNode_ptr _user_yaw_node;
+    SGPropertyNode_ptr _user_alpha_node;
+    SGPropertyNode_ptr _user_speed_node;
+    SGPropertyNode_ptr _user_wind_from_east_node;
+    SGPropertyNode_ptr _user_wind_from_north_node;
+    SGPropertyNode_ptr _user_speed_down_fps_node;
+    SGPropertyNode_ptr _user_speed_east_fps_node;
+    SGPropertyNode_ptr _user_speed_north_fps_node;
+    SGPropertyNode_ptr _contrail_altitude_node;
+    SGPropertyNode_ptr _contrail_trigger;
+    SGPropertyNode_ptr _count_node;
+    SGPropertyNode_ptr _trigger_node;
+    SGPropertyNode_ptr props;
 
     FGAIManager* ai;
     IC_struct  IC;
 
-};
+    // A list of pointers to AI objects
+    typedef list <osg::ref_ptr<FGAIBase> > sm_list_type;
+    typedef sm_list_type::iterator sm_list_iterator;
+    typedef sm_list_type::const_iterator sm_list_const_iterator;
 
-#endif // __SYSTEMS_SUBMODEL_HXX
+    sm_list_type sm_list;
 
 
+    void loadAI();
+    void loadSubmodels();
+    void setData(int id, string& path, bool serviceable);
+    void setSubData(int id, string& path, bool serviceable);
+    void valueChanged (SGPropertyNode *);
+    void transform(submodel *);
 
+    bool release(submodel *, double dt);
+
+    double getRange(double lat, double lon, double lat2, double lon2) const;
+
+    int _count;
+
+};
+
+#endif // __SYSTEMS_SUBMODEL_HXX