]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIBase.hxx
Don't duplicate userpos in in AIObjects.
[flightgear.git] / src / AIModel / AIBase.hxx
index fa68074012da14be211c01c6e64caf0b17414cc6..70e7c97184c834ab0ebbea4ad8349cbf52661647 100644 (file)
 #define _FG_AIBASE_HXX
 
 #include <string>
-#include <list>
 
 #include <simgear/constants.h>
-#include <simgear/math/SGMath.hxx>
 #include <simgear/scene/model/placement.hxx>
+#include <simgear/scene/model/modellib.hxx>
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/structure/SGSharedPtr.hxx>
 #include <simgear/structure/SGReferenced.hxx>
+#include <simgear/props/tiedpropertylist.hxx>
 #include <simgear/sg_inlines.h>
 
 #include <simgear/math/sg_geodesy.hxx>
 
-
 #include <Main/fg_props.hxx>
 
 
 using std::string;
-using std::list;
 
-class SGMaterial;
+namespace simgear {
+class BVHMaterial;
+}
 class FGAIManager;
 class FGAIFlightPlan;
+class FGFX;
+class FGNasalModelDataProxy;
+class FGAIModelData;    // defined below
+
 
 class FGAIBase : public SGReferenced {
 
@@ -50,9 +54,9 @@ public:
     enum object_type { otNull = 0, otAircraft, otShip, otCarrier, otBallistic,
         otRocket, otStorm, otThermal, otStatic, otWingman, otGroundVehicle,
         otEscort, otMultiplayer,
-        MAX_OBJECTS }; // Needs to be last!!!
+        MAX_OBJECTS };  // Needs to be last!!!
 
-    FGAIBase(object_type ot);
+    FGAIBase(object_type ot, bool enableHot);
     virtual ~FGAIBase();
 
     virtual void readFromScenario(SGPropertyNode* scFileNode);
@@ -64,6 +68,7 @@ public:
     virtual void unbind();
     virtual void reinit() {}
 
+    void updateLOD();
     void setManager(FGAIManager* mgr, SGPropertyNode* p);
     void setPath( const char* model );
     void setSMPath( const string& p );
@@ -111,10 +116,9 @@ public:
     SGVec3d getCartPos() const;
 
     bool getGroundElevationM(const SGGeod& pos, double& elev,
-        const SGMaterial** material) const;
+                             const simgear::BVHMaterial** material) const;
 
     double _elevation_m;
-    const SGMaterial* _material;
 
     double _getCartPosX() const;
     double _getCartPosY() const;
@@ -133,14 +137,20 @@ public:
     string _path;
     string _callsign;
     string _submodel;
-    string _name;
+    std::string _name;
     string _parent;
 
-    SGGeod userpos;
-
-
 protected:
-
+    /**
+     * Tied-properties helper, record nodes which are tied for easy un-tie-ing
+     */
+    template <typename T>
+    void tie(const char* aRelPath, const SGRawValue<T>& aRawValue)
+    {
+        _tiedProperties.Tie(props->getNode(aRelPath, true), aRawValue);
+    }
+
+    simgear::TiedPropertyList _tiedProperties;
     SGPropertyNode_ptr _selected_ac;
     SGPropertyNode_ptr props;
     SGPropertyNode_ptr trigger_node;
@@ -148,10 +158,10 @@ protected:
     FGAIManager* manager;
 
     // these describe the model's actual state
-    SGGeod pos;        // WGS84 lat & lon in degrees, elev above sea-level in meters
-    double hdg;                // True heading in degrees
-    double roll;       // degrees, left is negative
-    double pitch;      // degrees, nose-down is negative
+    SGGeod pos;         // WGS84 lat & lon in degrees, elev above sea-level in meters
+    double hdg;         // True heading in degrees
+    double roll;        // degrees, left is negative
+    double pitch;       // degrees, nose-down is negative
     double speed;       // knots true airspeed
     double altitude_ft; // feet above sea level
     double vs;          // vertical speed, feet per minute
@@ -183,10 +193,9 @@ protected:
     double x_shift;      // value used by radar display instrument
     double y_shift;      // value used by radar display instrument
     double rotation;     // value used by radar display instrument
-    double ht_diff;             // value used by radar display instrument
+    double ht_diff;      // value used by radar display instrument
 
-    string model_path;    //Path to the 3D model
-    osg::ref_ptr<osg::Node> model; //The 3D model object
+    string model_path;   //Path to the 3D model
     SGModelPlacement aip;
 
     bool delete_me;
@@ -216,12 +225,20 @@ protected:
     void CalculateMach();
     double UpdateRadar(FGAIManager* manager);
 
+    void removeModel();
+    void removeSoundFx();
+
     static int _newAIModelID();
 
 private:
     int _refID;
     object_type _otype;
     bool _initialized;
+    osg::ref_ptr<osg::LOD> _model; //The 3D model LOD object
+
+    osg::ref_ptr<FGAIModelData> _modeldata;
+
+    SGSharedPtr<FGFX>  _fx;
 
 public:
     object_type getType();
@@ -235,7 +252,6 @@ public:
     void _setLongitude( double longitude );
     void _setLatitude ( double latitude );
     void _setSubID( int s );
-    void _setUserPos();
 
     double _getAltitudeAGL(SGGeod inpos, double start);
 
@@ -300,9 +316,6 @@ public:
     inline double _getRange() { return range; };
     inline double _getBearing() { return bearing; };
 
-    virtual osg::Node* load3DModel(const string &path,
-        SGPropertyNode *prop_root);
-
     static bool _isNight();
 
      string & getCallSign();
@@ -439,4 +452,28 @@ inline void FGAIBase::setMaxSpeed(double m) {
     _max_speed = m;
 }
 
-#endif // _FG_AIBASE_HXX
+
+class FGAIModelData : public simgear::SGModelData {
+public:
+    FGAIModelData(SGPropertyNode *root = 0);
+    ~FGAIModelData();
+
+    /** osg callback, thread-safe */
+    void modelLoaded(const string& path, SGPropertyNode *prop, osg::Node *n);
+
+    /** init hook to be called after model is loaded.
+     * Not thread-safe. Call from main thread only. */
+    void init(void) { _initialized = true; }
+
+    bool needInitilization(void) { return _ready && !_initialized;}
+    bool isInitialized(void) { return _initialized;}
+    inline std::string& get_sound_path() { return _fxpath;}
+
+private:
+    FGNasalModelDataProxy *_nasal;
+    std::string _fxpath;
+    bool _ready;
+    bool _initialized;
+};
+
+#endif // _FG_AIBASE_HXX