#define _FG_AIBASE_HXX
#include <string>
-#include <list>
+#include <osg/ref_ptr>
#include <simgear/constants.h>
-#include <simgear/math/SGMath.hxx>
#include <simgear/scene/model/placement.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>
+namespace osg { class PagedLOD; }
-using std::string;
-using std::list;
-
-class SGMaterial;
+namespace simgear {
+class BVHMaterial;
+}
class FGAIManager;
class FGAIFlightPlan;
+class FGFX;
+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);
+ FGAIBase(object_type ot, bool enableHot);
virtual ~FGAIBase();
virtual void readFromScenario(SGPropertyNode* scFileNode);
virtual bool init(bool search_in_AI_path=false);
- virtual void initModel(osg::Node *node);
+ virtual void initModel();
virtual void update(double dt);
virtual void bind();
virtual void unbind();
virtual void reinit() {}
+ void updateLOD();
void setManager(FGAIManager* mgr, SGPropertyNode* p);
void setPath( const char* model );
- void setSMPath( const string& p );
- void setCallSign(const string& );
+ void setSMPath( const std::string& p );
+ void setCallSign(const std::string& );
void setSpeed( double speed_KTAS );
void setAltitude( double altitude_ft );
void setAltitudeAGL( double altitude_agl_ft );
void setImpactLat( double lat );
void setImpactLon( double lon );
void setImpactElev( double e );
- void setParentName(const string& p);
- void setName(const string& n);
+ void setParentName(const std::string& p);
+ void setName(const std::string& n);
void setMaxSpeed(double kts);
void calcRangeBearing(double lat, double lon, double lat2, double lon2,
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;
double _getCartPosZ() const;
+
+protected:
+ double _elevation_m;
+
double _x_offset;
double _y_offset;
double _z_offset;
-
+
double _pitch_offset;
double _roll_offset;
double _yaw_offset;
-
+
double _max_speed;
-
- string _path;
- string _callsign;
- string _submodel;
- string _name;
- string _parent;
-
- SGGeod userpos;
-
-
-protected:
-
+
+ std::string _path;
+ std::string _callsign;
+ std::string _submodel;
+ std::string _name;
+ std::string _parent;
+
+ /**
+ * 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
- osg::ref_ptr<osg::Node> model; //The 3D model object
+ std::string model_path; //Path to the 3D model
SGModelPlacement aip;
bool delete_me;
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::PagedLOD> _model;
+
+ osg::ref_ptr<FGAIModelData> _modeldata;
+
+ SGSharedPtr<FGFX> _fx;
public:
object_type getType();
void _setLongitude( double longitude );
void _setLatitude ( double latitude );
void _setSubID( int s );
- void _setUserPos();
double _getAltitudeAGL(SGGeod inpos, double start);
inline double _getRange() { return range; };
inline double _getBearing() { return bearing; };
- virtual osg::Node* load3DModel(const string &path,
- SGPropertyNode *prop_root);
-
static bool _isNight();
+
+ std::string & getCallSign();
};
inline void FGAIBase::setManager(FGAIManager* mgr, SGPropertyNode* p) {
model_path.append(model);
}
-inline void FGAIBase::setSMPath(const string& p) {
+inline void FGAIBase::setSMPath(const std::string& p) {
_path = p;
}
pos.setLatitudeDeg( latitude );
}
-inline void FGAIBase::setCallSign(const string& s) {
+inline void FGAIBase::setCallSign(const std::string& s) {
_callsign = s;
}
+inline std::string& FGAIBase::getCallSign() {
+ return _callsign;
+}
+
inline void FGAIBase::setXoffset(double x) {
_x_offset = x;
}
_yaw_offset = y;
}
-inline void FGAIBase::setParentName(const string& p) {
+inline void FGAIBase::setParentName(const std::string& p) {
_parent = p;
}
-inline void FGAIBase::setName(const string& n) {
+inline void FGAIBase::setName(const std::string& n) {
_name = n;
}
_max_speed = m;
}
-#endif // _FG_AIBASE_HXX
+
+#endif // _FG_AIBASE_HXX