X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIBase.cxx;h=0945a13e6f7308a5cb9e716709402ffe041b9164;hb=89b41395d861a49ad543af166c0bd41c14dd0d2b;hp=a9d64e341683d619fa4cc78132faf1cb9c0720c3;hpb=246feef85fedd548f2c198831d7d6e7e3be53e12;p=flightgear.git diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index a9d64e341..0945a13e6 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -175,7 +175,7 @@ FGAIBase::removeModel() aip.init( 0 ); _model = 0; // pass it on to the pager, to be be deleted in the pager thread - pSceneryManager->getPagerSingleton()->queueDeleteRequest(temp); + pSceneryManager->getPager()->queueDeleteRequest(temp); } else { @@ -394,61 +394,62 @@ bool FGAIBase::isa( object_type otype ) { void FGAIBase::bind() { - props->tie("id", SGRawValueMethods(*this, + _tiedProperties.setRoot(props); + tie("id", SGRawValueMethods(*this, &FGAIBase::getID)); - props->tie("velocities/true-airspeed-kt", SGRawValuePointer(&speed)); - props->tie("velocities/vertical-speed-fps", + tie("velocities/true-airspeed-kt", SGRawValuePointer(&speed)); + tie("velocities/vertical-speed-fps", SGRawValueMethods(*this, &FGAIBase::_getVS_fps, &FGAIBase::_setVS_fps)); - props->tie("position/altitude-ft", + tie("position/altitude-ft", SGRawValueMethods(*this, &FGAIBase::_getAltitude, &FGAIBase::_setAltitude)); - props->tie("position/latitude-deg", + tie("position/latitude-deg", SGRawValueMethods(*this, &FGAIBase::_getLatitude, &FGAIBase::_setLatitude)); - props->tie("position/longitude-deg", + tie("position/longitude-deg", SGRawValueMethods(*this, &FGAIBase::_getLongitude, &FGAIBase::_setLongitude)); - props->tie("position/global-x", + tie("position/global-x", SGRawValueMethods(*this, &FGAIBase::_getCartPosX, 0)); - props->tie("position/global-y", + tie("position/global-y", SGRawValueMethods(*this, &FGAIBase::_getCartPosY, 0)); - props->tie("position/global-z", + tie("position/global-z", SGRawValueMethods(*this, &FGAIBase::_getCartPosZ, 0)); - props->tie("callsign", + tie("callsign", SGRawValueMethods(*this, &FGAIBase::_getCallsign, 0)); - props->tie("orientation/pitch-deg", SGRawValuePointer(&pitch)); - props->tie("orientation/roll-deg", SGRawValuePointer(&roll)); - props->tie("orientation/true-heading-deg", SGRawValuePointer(&hdg)); - - props->tie("radar/in-range", SGRawValuePointer(&in_range)); - props->tie("radar/bearing-deg", SGRawValuePointer(&bearing)); - props->tie("radar/elevation-deg", SGRawValuePointer(&elevation)); - props->tie("radar/range-nm", SGRawValuePointer(&range)); - props->tie("radar/h-offset", SGRawValuePointer(&horiz_offset)); - props->tie("radar/v-offset", SGRawValuePointer(&vert_offset)); - props->tie("radar/x-shift", SGRawValuePointer(&x_shift)); - props->tie("radar/y-shift", SGRawValuePointer(&y_shift)); - props->tie("radar/rotation", SGRawValuePointer(&rotation)); - props->tie("radar/ht-diff-ft", SGRawValuePointer(&ht_diff)); - props->tie("subID", SGRawValuePointer(&_subID)); - props->tie("controls/lighting/nav-lights", - SGRawValueFunctions(_isNight)); + tie("orientation/pitch-deg", SGRawValuePointer(&pitch)); + tie("orientation/roll-deg", SGRawValuePointer(&roll)); + tie("orientation/true-heading-deg", SGRawValuePointer(&hdg)); + + tie("radar/in-range", SGRawValuePointer(&in_range)); + tie("radar/bearing-deg", SGRawValuePointer(&bearing)); + tie("radar/elevation-deg", SGRawValuePointer(&elevation)); + tie("radar/range-nm", SGRawValuePointer(&range)); + tie("radar/h-offset", SGRawValuePointer(&horiz_offset)); + tie("radar/v-offset", SGRawValuePointer(&vert_offset)); + tie("radar/x-shift", SGRawValuePointer(&x_shift)); + tie("radar/y-shift", SGRawValuePointer(&y_shift)); + tie("radar/rotation", SGRawValuePointer(&rotation)); + tie("radar/ht-diff-ft", SGRawValuePointer(&ht_diff)); + tie("subID", SGRawValuePointer(&_subID)); + tie("controls/lighting/nav-lights", SGRawValueFunctions(_isNight)); + props->setBoolValue("controls/lighting/beacon", true); props->setBoolValue("controls/lighting/strobe", true); props->setBoolValue("controls/glide-path", true); @@ -467,40 +468,12 @@ void FGAIBase::bind() { props->setDoubleValue("sim/sound/avionics/volume", 0.0); props->setBoolValue("sim/sound/avionics/external-view", false); props->setBoolValue("sim/current-view/internal", false); - } void FGAIBase::unbind() { - props->untie("id"); - props->untie("velocities/true-airspeed-kt"); - props->untie("velocities/vertical-speed-fps"); - - props->untie("position/altitude-ft"); - props->untie("position/latitude-deg"); - props->untie("position/longitude-deg"); - props->untie("position/global-x"); - props->untie("position/global-y"); - props->untie("position/global-z"); - props->untie("callsign"); - - props->untie("orientation/pitch-deg"); - props->untie("orientation/roll-deg"); - props->untie("orientation/true-heading-deg"); - - props->untie("radar/in-range"); - props->untie("radar/bearing-deg"); - props->untie("radar/elevation-deg"); - props->untie("radar/range-nm"); - props->untie("radar/h-offset"); - props->untie("radar/v-offset"); - props->untie("radar/x-shift"); - props->untie("radar/y-shift"); - props->untie("radar/rotation"); - props->untie("radar/ht-diff-ft"); - - props->untie("controls/lighting/nav-lights"); - - props->setBoolValue("/sim/controls/radar/", true); + _tiedProperties.Untie(); + + props->setBoolValue("/sim/controls/radar", true); // drop reference to sound effects now _fx = 0; @@ -917,7 +890,7 @@ int FGAIBase::_newAIModelID() { FGAIModelData::FGAIModelData(SGPropertyNode *root) - : _nasal( new FGNasalModelData(root) ), + : _nasal( new FGNasalModelDataProxy(root) ), _ready(false), _initialized(false) { @@ -926,25 +899,17 @@ FGAIModelData::FGAIModelData(SGPropertyNode *root) FGAIModelData::~FGAIModelData() { delete _nasal; + _nasal = NULL; } void FGAIModelData::modelLoaded(const string& path, SGPropertyNode *prop, osg::Node *n) { - // WARNING: All this is called in a separate OSG thread! Only use thread-safe stuff - // here that is fine to be run concurrently with stuff in the main loop! + // WARNING: Called in a separate OSG thread! Only use thread-safe stuff here... if (_ready) return; - _fxpath = _prop->getStringValue("sound/path"); - _prop = prop; - _path = path; - _ready = true; -} -// do Nasal initialization (must be called in the main loop) -void FGAIModelData::init() -{ - // call FGNasalSys to create context and run hooks (not-thread safe!) - _nasal->modelLoaded(_path, _prop, 0); - _prop = 0; - _initialized = true; + _fxpath = prop->getStringValue("sound/path"); + _nasal->modelLoaded(path, prop, n); + + _ready = true; }