#include "AIGroundVehicle.hxx"
#include "AIEscort.hxx"
-FGAIManager::FGAIManager() {
+FGAIManager::FGAIManager() :
+ cb_ai_bare(SGPropertyChangeCallback<FGAIManager>(this,&FGAIManager::updateLOD,
+ fgGetNode("/sim/rendering/static-lod/ai-bare", true))),
+ cb_ai_detailed(SGPropertyChangeCallback<FGAIManager>(this,&FGAIManager::updateLOD,
+ fgGetNode("/sim/rendering/static-lod/ai-detailed", true)))
+{
_dt = 0.0;
mNumAiModels = 0;
FGAIManager::init() {
root = fgGetNode("sim/ai", true);
- enabled = root->getNode("enabled", true)->getBoolValue();
-
- if (!enabled)
- return;
+ enabled = root->getNode("enabled", true);
thermal_lift_node = fgGetNode("/environment/thermal-lift-fps", true);
wind_from_east_node = fgGetNode("/environment/wind-from-east-fps",true);
user_latitude_node = fgGetNode("/position/latitude-deg", true);
user_longitude_node = fgGetNode("/position/longitude-deg", true);
user_altitude_node = fgGetNode("/position/altitude-ft", true);
+ user_altitude_agl_node = fgGetNode("/position/altitude-agl-ft", true);
user_heading_node = fgGetNode("/orientation/heading-deg", true);
user_pitch_node = fgGetNode("/orientation/pitch-deg", true);
user_yaw_node = fgGetNode("/orientation/side-slip-deg", true);
void
FGAIManager::postinit() {
// postinit, so that it can access the Nasal subsystem
+
+ if (!root->getBoolValue("scenarios-enabled", true))
+ return;
+
+ // scenarios enabled, AI subsystem required
+ if (!enabled->getBoolValue())
+ enabled->setBoolValue(true);
+
+ // process all scenarios
map<string, bool> scenarios;
for (int i = 0 ; i < root->nChildren() ; i++) {
SGPropertyNode *n = root->getChild(i);
continue;
if (scenarios.find(name) != scenarios.end()) {
- SG_LOG(SG_GENERAL, SG_DEBUG, "won't load scenario '" << name << "' twice");
+ SG_LOG(SG_AI, SG_DEBUG, "won't load scenario '" << name << "' twice");
continue;
}
- SG_LOG(SG_GENERAL, SG_ALERT, "loading scenario '" << name << '\'');
+ SG_LOG(SG_AI, SG_ALERT, "loading scenario '" << name << '\'');
processScenario(name);
scenarios[name] = true;
}
range_nearest = 10000.0;
strength = 0.0;
- if (!enabled)
+ if (!enabled->getBoolValue())
return;
- FGTrafficManager *tmgr = (FGTrafficManager*) globals->get_subsystem("Traffic Manager");
+ FGTrafficManager *tmgr = (FGTrafficManager*) globals->get_subsystem("traffic-manager");
_dt = dt;
ai_list_iterator ai_list_itr = ai_list.begin();
thermal_lift_node->setDoubleValue( strength ); // for thermals
}
+/** update LOD settings of all AI/MP models */
+void
+FGAIManager::updateLOD(SGPropertyNode* node)
+{
+ ai_list_iterator ai_list_itr = ai_list.begin();
+ while(ai_list_itr != ai_list.end())
+ {
+ (*ai_list_itr)->updateLOD();
+ ++ai_list_itr;
+ }
+}
+
void
FGAIManager::attach(FGAIBase *model)
{
void
FGAIManager::fetchUserState( void ) {
+
user_latitude = user_latitude_node->getDoubleValue();
user_longitude = user_longitude_node->getDoubleValue();
user_altitude = user_altitude_node->getDoubleValue();
user_speed = user_speed_node->getDoubleValue() * 0.592484;
user_roll = user_roll_node->getDoubleValue();
wind_from_east = wind_from_east_node->getDoubleValue();
- wind_from_north = wind_from_north_node->getDoubleValue();
+ wind_from_north = wind_from_north_node->getDoubleValue();
+ user_altitude_agl = user_altitude_agl_node->getDoubleValue();
+
}
// only keep the results from the nearest thermal
SGPropertyNode_ptr root = new SGPropertyNode;
readProperties(path.str(), root);
return root;
- } catch (const sg_exception &) {
- SG_LOG(SG_GENERAL, SG_DEBUG, "Incorrect path specified for AI "
- "scenario: \"" << path.str() << "\"");
+ } catch (const sg_exception &t) {
+ SG_LOG(SG_AI, SG_ALERT, "Failed to load scenario '"
+ << path.str() << "': " << t.getFormattedMessage());
return 0;
}
}
if (fabs(tgt_alt - alt) > tgt_ht[type] || type == FGAIBase::otBallistic
|| type == FGAIBase::otStorm || type == FGAIBase::otThermal ) {
- //SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager: skipping "
+ //SG_LOG(SG_AI, SG_DEBUG, "AIManager: skipping "
// << fabs(tgt_alt - alt)
// << " "
// << type
double range = calcRange(lat, lon, tgt_lat, tgt_lon);
- //SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager: AI list size "
+ //SG_LOG(SG_AI, SG_DEBUG, "AIManager: AI list size "
// << ai_list.size()
// << " type " << type
// << " ID " << id
tgt_length[type] += fuse_range;
if (range < tgt_length[type]){
- SG_LOG(SG_GENERAL, SG_DEBUG, "AIManager: HIT! "
+ SG_LOG(SG_AI, SG_DEBUG, "AIManager: HIT! "
<< " type " << type
<< " ID " << id
<< " range " << range