X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FAIModel%2FAIAircraft.cxx;h=4dc084bcc935ac607a4f8a27f840f5c1e5081762;hb=7a58ef58e710aa20f2c3b21a2f6102fc522865ff;hp=3a7f74db33af77e2fde3fabfb4c7db12799f7638;hpb=dda15ac4888ec7e99b68060760ee35f202d2cae0;p=flightgear.git diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index 3a7f74db3..4dc084bcc 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -28,6 +28,7 @@ #include #include #include +#include SG_USING_STD(string); @@ -51,7 +52,8 @@ const FGAIAircraft::PERF_STRUCT FGAIAircraft::settings[] = { }; -FGAIAircraft::FGAIAircraft(FGAIManager* mgr) { +FGAIAircraft::FGAIAircraft(FGAIManager* mgr, FGAISchedule *ref) { + trafficRef = ref; manager = mgr; _type_str = "aircraft"; _otype = otAircraft; @@ -78,28 +80,30 @@ bool FGAIAircraft::init() { void FGAIAircraft::bind() { FGAIBase::bind(); -/* props->tie("controls/gear/gear-down", - SGRawValueFunctions(FGAIAircraft::_getGearDown)); - + SGRawValueMethods(*this, + &FGAIAircraft::_getGearDown)); +#if 0 props->getNode("controls/lighting/landing-lights", true) ->alias("controls/gear/gear-down"); -*/ +#endif } void FGAIAircraft::unbind() { FGAIBase::unbind(); -// props->untie("controls/gear/gear-down"); -// props->getNode("controls/lighting/landing-lights")->unalias(); + props->untie("controls/gear/gear-down"); +#if 0 + props->getNode("controls/lighting/landing-lights")->unalias(); +#endif } void FGAIAircraft::update(double dt) { + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); } void FGAIAircraft::SetPerformance(const PERF_STRUCT *ps) { @@ -112,21 +116,22 @@ void FGAIAircraft::Run(double dt) { FGAIAircraft::dt = dt; - if (fp) ProcessFlightPlan(dt); + if (fp) + { + ProcessFlightPlan(dt); + time_t now = time(NULL) + fgGetLong("/sim/time/warp"); + if (now < fp->getStartTime()) + return; + //ProcessFlightPlan(dt); + } double turn_radius_ft; double turn_circum_ft; double speed_north_deg_sec; double speed_east_deg_sec; - double ft_per_deg_lon; - double ft_per_deg_lat; double dist_covered_ft; double alpha; - // get size of a degree at this latitude - ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES); - ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES); - // adjust speed double speed_diff = tgt_speed - speed; if (fabs(speed_diff) > 0.2) { @@ -237,77 +242,14 @@ void FGAIAircraft::Run(double dt) { //###########################// // do calculations for radar // //###########################// - - // copy values from the AIManager - double user_latitude = manager->get_user_latitude(); - double user_longitude = manager->get_user_longitude(); - double user_altitude = manager->get_user_altitude(); - double user_heading = manager->get_user_heading(); - double user_pitch = manager->get_user_pitch(); - double user_yaw = manager->get_user_yaw(); - double user_speed = manager->get_user_speed(); - - // calculate range to target in feet and nautical miles - double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat; - double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon; - double range_ft = sqrt( lat_range*lat_range + lon_range*lon_range ); - range = range_ft / 6076.11549; - - // calculate bearing to target - if (pos.lat() >= user_latitude) { - bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES; - if (pos.lon() >= user_longitude) { - bearing = 90.0 - bearing; - } else { - bearing = 270.0 + bearing; - } - } else { - bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES; - if (pos.lon() >= user_longitude) { - bearing = 180.0 - bearing; - } else { - bearing = 180.0 + bearing; - } - } - - // calculate look left/right to target, without yaw correction - horiz_offset = bearing - user_heading; - if (horiz_offset > 180.0) horiz_offset -= 360.0; - if (horiz_offset < -180.0) horiz_offset += 360.0; - - // calculate elevation to target - elevation = atan2( altitude_ft - user_altitude, range_ft ) - * SG_RADIANS_TO_DEGREES; - - // calculate look up/down to target - vert_offset = elevation + user_pitch; - -/* this calculation needs to be fixed, but it isn't important anyway - // calculate range rate - double recip_bearing = bearing + 180.0; - if (recip_bearing > 360.0) recip_bearing -= 360.0; - double my_horiz_offset = recip_bearing - hdg; - if (my_horiz_offset > 180.0) my_horiz_offset -= 360.0; - if (my_horiz_offset < -180.0) my_horiz_offset += 360.0; - rdot = (-user_speed * cos( horiz_offset * SG_DEGREES_TO_RADIANS )) - + (-speed * 1.686 * cos( my_horiz_offset * SG_DEGREES_TO_RADIANS )); -*/ - - // now correct look left/right for yaw - horiz_offset += user_yaw; - - // calculate values for radar display - y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS); - x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS); - rotation = hdg - user_heading; - if (rotation < 0.0) rotation += 360.0; + double range_ft2 = UpdateRadar(manager); //************************************// // Tanker code // //************************************// if ( isTanker) { - if ( (range_ft < 250.0) && + if ( (range_ft2 < 250.0 * 250.0) && (y_shift > 0.0) && (elevation > 0.0) ) { refuel_node->setBoolValue(true); @@ -362,6 +304,8 @@ void FGAIAircraft::SetFlightPlan(FGAIFlightPlan *f) { } void FGAIAircraft::ProcessFlightPlan( double dt ) { + + FGAIFlightPlan::waypoint* prev = 0; // the one behind you FGAIFlightPlan::waypoint* curr = 0; // the one ahead FGAIFlightPlan::waypoint* next = 0; // the next plus 1 @@ -415,10 +359,35 @@ void FGAIAircraft::ProcessFlightPlan( double dt ) { if ( dist_to_go < lead_dist ) { if (curr->finished) { //end of the flight plan, so terminate - setDie(true); - return; + if (trafficRef) + { + delete fp; + //time_t now = time(NULL) + fgGetLong("/sim/time/warp"); + trafficRef->next(); + + FGAIModelEntity entity; + entity.m_class = "jet_transport"; + //entity.path = modelPath.c_str(); + entity.flightplan = "none"; + entity.latitude = _getLatitude(); + entity.longitude = _getLongitude(); + entity.altitude = trafficRef->getCruiseAlt() * 100; // convert from FL to feet + entity.speed = 450; + //entity.fp = new FGAIFlightPlan(&entity, courseToDest, i->getDepartureTime(), dep, arr); + entity.fp = new FGAIFlightPlan(&entity, + 999, // A hack + trafficRef->getDepartureTime(), + trafficRef->getDepartureAirport(), + trafficRef->getArrivalAirport()); + SetFlightPlan(entity.fp); + } + else + { + setDie(true); + return; + } } - // we've reached the lead-point for the waypoint ahead + // we've reached the lead-point for the waypoint ahead if (next) tgt_heading = fp->getBearing(curr, next); fp->IncrementWaypoint(); prev = fp->getPreviousWaypoint(); @@ -454,3 +423,8 @@ void FGAIAircraft::ProcessFlightPlan( double dt ) { } +bool FGAIAircraft::_getGearDown() const { + return ((props->getFloatValue("position/altitude-agl-ft") < 900.0) + && (props->getFloatValue("velocities/airspeed-kt") + < performance->land_speed*1.25)); +}