// - a global management type for AI objects
//
// Written by David Culp, started October 2003.
-// - davidculp2@comcast.net
+// - davidculp2@comcast.net
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#include <cstring>
+
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/props/props_io.hxx>
#include <simgear/structure/exception.hxx>
#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;
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);
continue;
if (scenarios.find(name) != scenarios.end()) {
- SG_LOG(SG_GENERAL, SG_WARN, "won't load scenario '" << name << "' twice");
+ SG_LOG(SG_GENERAL, SG_DEBUG, "won't load scenario '" << name << "' twice");
continue;
}
void
FGAIManager::reinit() {
update(0.0);
+
ai_list_iterator ai_list_itr = ai_list.begin();
while(ai_list_itr != ai_list.end()) {
if (!enabled)
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_GENERAL, SG_ALERT, "Failed to load scenario '"
+ << path.str() << "': " << t.getFormattedMessage());
return 0;
}
}
std::string pnumber = scEntry->getStringValue("pennant-number");
std::string name = scEntry->getStringValue("name");
if (type == "carrier" && (pnumber == id || name == id)) {
- osg::ref_ptr<FGAICarrier> carrier = new FGAICarrier;
+ SGSharedPtr<FGAICarrier> carrier = new FGAICarrier;
carrier->readFromScenario(scEntry);
if (carrier->getParkPosition(pid, geodPos, hdng, uvw)) {