#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 <Scripting/NasalSys.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 FGAIModelData; // define dblow
+class FGNasalModelDataProxy;
+class FGAIModelData; // defined below
class FGAIBase : public SGReferenced {
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();
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;
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;
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
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;
double UpdateRadar(FGAIManager* manager);
void removeModel();
+ void removeSoundFx();
static int _newAIModelID();
bool _initialized;
osg::ref_ptr<osg::LOD> _model; //The 3D model LOD object
- FGAIModelData* _aimodel;
+ osg::ref_ptr<FGAIModelData> _modeldata;
- string _fxpath;
SGSharedPtr<FGFX> _fx;
public:
void _setLongitude( double longitude );
void _setLatitude ( double latitude );
void _setSubID( int s );
- void _setUserPos();
double _getAltitudeAGL(SGGeod inpos, double start);
class FGAIModelData : public simgear::SGModelData {
public:
- FGAIModelData(SGPropertyNode *root = 0)
- : _nasal( new FGNasalModelData(root) ),
- _path("") {};
- ~FGAIModelData() {
- delete _nasal;
- };
+ 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