# include <config.h>
#endif
+#include <string.h>
+
#include <simgear/compiler.h>
#include <string>
#include <simgear/misc/sg_path.hxx>
#include <simgear/scene/model/modellib.hxx>
#include <simgear/scene/util/SGNodeMasks.hxx>
+#include <simgear/sound/soundmgr_openal.hxx>
#include <simgear/debug/logstream.hxx>
#include <simgear/props/props.hxx>
#include <Main/globals.hxx>
#include <Scenery/scenery.hxx>
#include <Scripting/NasalSys.hxx>
+#include <Sound/fg_fx.hxx>
#include "AIBase.hxx"
#include "AIManager.hxx"
_impact_speed(0),
_refID( _newAIModelID() ),
_otype(ot),
- _initialized(false)
+ _initialized(false),
+ _aimodel(0),
+ _fxpath(""),
+ _fx(0)
{
tgt_heading = hdg = tgt_altitude_ft = tgt_speed = 0.0;
if (parent)
model_removed->setStringValue(props->getPath());
}
+
+ if (_refID != 0 && _refID != 1) {
+ SGSoundMgr *smgr = globals->get_soundmgr();
+ smgr->remove("aifx:"+_refID);
+ }
+
delete fp;
fp = 0;
}
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.getLatitudeRad());
ft_per_deg_lon = 365228.16 * cos(pos.getLatitudeRad());
+
+ if ( _fx )
+ {
+ // update model's audio sample values
+ _fx->set_position_geod( pos );
+
+ SGQuatd orient = SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
+ _fx->set_orientation( orient );
+
+ SGVec3d velocity;
+ velocity = SGVec3d( speed_north_deg_sec, speed_east_deg_sec, pitch*speed );
+ _fx->set_velocity( velocity );
+ }
+ else if (_aimodel)
+ {
+ string fxpath = _aimodel->get_sound_path();
+ if (fxpath != "")
+ {
+ _fxpath = fxpath;
+ props->setStringValue("sim/sound/path", _fxpath.c_str());
+
+ // initialize the sound configuration
+ SGSoundMgr *smgr = globals->get_soundmgr();
+ _fx = new FGFX(smgr, "aifx:"+_refID, props);
+ _fx->init();
+ }
+ }
}
/** update LOD properties of the model */
else
_installed = true;
- osg::Node * mdl = SGModelLib::loadDeferredModel(f, props, new FGNasalModelData(props));
+ _aimodel = new FGAIModelData(props);
+ osg::Node * mdl = SGModelLib::loadDeferredModel(f, props, _aimodel);
if (_model.valid())
{
aip.setVisible(true);
invisible = false;
globals->get_scenery()->get_scene_graph()->addChild(aip.getSceneGraph());
+
+ // Get the sound-path tag from the configuration file and store it
+ // in the property tree.
_initialized = true;
} else if (!model_path.empty()) {
props->setDoubleValue("controls/flight/target-alt", altitude_ft);
props->setDoubleValue("controls/flight/target-pitch", pitch);
- props->setDoubleValue("controls/flight/target-spd", speed);
+ props->setDoubleValue("controls/flight/target-spd", speed);
+
+ props->setBoolValue("sim/sound/avionics/enabled", false);
+ props->setDoubleValue("sim/sound/avionics/volume", 0.0);
+ props->setBoolValue("sim/sound/avionics/external-view", false);
+ props->setBoolValue("sim/current-view/internal", false);
}
return id;
}
+
+FGAIModelData::FGAIModelData(SGPropertyNode *root)
+ : _nasal( new FGNasalModelData(root) ),
+ _path("")
+{
+}
+
+FGAIModelData::~FGAIModelData()
+{
+ delete _nasal;
+}
+
+void FGAIModelData::modelLoaded(const string& path, SGPropertyNode *prop, osg::Node *n)
+{
+ const char* fxpath = prop->getStringValue("sound/path");
+ if (fxpath) {
+ string sound_path = string(fxpath);
+ if (sound_path != "") {
+ _path = "/AI/"+sound_path;
+ }
+ }
+ _nasal->modelLoaded(path, prop, n);
+}