X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIBase.hxx;h=70e7c97184c834ab0ebbea4ad8349cbf52661647;hb=d70e26d87b5294315ca6d67b8c11fabe51abbc4b;hp=f09a96e00fee8cbe8cf68afec0a40cee8cbc1fad;hpb=c112b8b8e169a427e8cb0da871347e5c10031479;p=flightgear.git diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index f09a96e00..70e7c9718 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -21,15 +21,14 @@ #define _FG_AIBASE_HXX #include -#include #include -#include #include #include #include #include #include +#include #include #include @@ -38,14 +37,15 @@ using std::string; -using std::list; -class SGMaterial; +namespace simgear { +class BVHMaterial; +} class FGAIManager; class FGAIFlightPlan; class FGFX; -class FGNasalModelData; -class FGAIModelData; // defined below +class FGNasalModelDataProxy; +class FGAIModelData; // defined below class FGAIBase : public SGReferenced { @@ -54,7 +54,7 @@ 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, bool enableHot); virtual ~FGAIBase(); @@ -116,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; @@ -141,11 +140,17 @@ public: std::string _name; string _parent; - SGGeod userpos; - - protected: - + /** + * Tied-properties helper, record nodes which are tied for easy un-tie-ing + */ + template + void tie(const char* aRelPath, const SGRawValue& aRawValue) + { + _tiedProperties.Tie(props->getNode(aRelPath, true), aRawValue); + } + + simgear::TiedPropertyList _tiedProperties; SGPropertyNode_ptr _selected_ac; SGPropertyNode_ptr props; SGPropertyNode_ptr trigger_node; @@ -153,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 @@ -188,9 +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 + string model_path; //Path to the 3D model SGModelPlacement aip; bool delete_me; @@ -221,6 +226,7 @@ protected: double UpdateRadar(FGAIManager* manager); void removeModel(); + void removeSoundFx(); static int _newAIModelID(); @@ -230,9 +236,8 @@ private: bool _initialized; osg::ref_ptr _model; //The 3D model LOD object - FGAIModelData* _aimodel; + osg::ref_ptr _modeldata; - string _fxpath; SGSharedPtr _fx; public: @@ -247,7 +252,6 @@ public: void _setLongitude( double longitude ); void _setLatitude ( double latitude ); void _setSubID( int s ); - void _setUserPos(); double _getAltitudeAGL(SGGeod inpos, double start); @@ -453,12 +457,23 @@ 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); - inline string& get_sound_path() { return _path; }; + + /** 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: - FGNasalModelData *_nasal; - string _path; + FGNasalModelDataProxy *_nasal; + std::string _fxpath; + bool _ready; + bool _initialized; }; -#endif // _FG_AIBASE_HXX +#endif // _FG_AIBASE_HXX