X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIStorm.cxx;h=fded8012d9ef85e4ed623c4bd0adb2cda146d860;hb=6bb8e69b92ce593aede6cf8ecb466c6407579d11;hp=8879216f4eb97880774991aa21eb8491e1abb157;hpb=2acdd02879a56d8b25eaef7dca4f90b96075df10;p=flightgear.git diff --git a/src/AIModel/AIStorm.cxx b/src/AIModel/AIStorm.cxx index 8879216f4..fded8012d 100644 --- a/src/AIModel/AIStorm.cxx +++ b/src/AIModel/AIStorm.cxx @@ -16,41 +16,65 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifdef HAVE_CONFIG_H # include #endif -#include #include
#include
#include #include #include +#include +#include -SG_USING_STD(string); +using std::string; #include "AIStorm.hxx" -FGAIStorm *FGAIStorm::_self = NULL; - -FGAIStorm::FGAIStorm(FGAIManager* mgr) { - manager = mgr; - _self = this; - _type_str = "thunderstorm"; - _otype = otStorm; +FGAIStorm::FGAIStorm() : FGAIBase(otStorm) { + delay = 3.6; + subflashes = 1; + timer = 0.0; + random_delay = 3.6; + flash_node = fgGetNode("/environment/lightning/flash", true); + flash_node->setBoolValue(false); + flashed = 0; + flashing = false; + subflash_index = -1; + subflash_array[0] = 1; + subflash_array[1] = 2; + subflash_array[2] = 1; + subflash_array[3] = 3; + subflash_array[4] = 2; + subflash_array[5] = 1; + subflash_array[6] = 1; + subflash_array[7] = 2; + + turb_mag_node = fgGetNode("/environment/turbulence/magnitude-norm", true); + turb_rate_node = fgGetNode("/environment/turbulence/rate-hz", true); } FGAIStorm::~FGAIStorm() { - _self = NULL; } +void FGAIStorm::readFromScenario(SGPropertyNode* scFileNode) { + if (!scFileNode) + return; + + FGAIBase::readFromScenario(scFileNode); + + setDiameter(scFileNode->getDoubleValue("diameter-ft", 0.0)/6076.11549); + setHeight(scFileNode->getDoubleValue("height-msl", 5000.0)); + setStrengthNorm(scFileNode->getDoubleValue("strength-norm", 1.0)); +} -bool FGAIStorm::init() { - return FGAIBase::init(); +bool FGAIStorm::init(bool search_in_AI_path) { + return FGAIBase::init(search_in_AI_path); } void FGAIStorm::bind() { @@ -63,24 +87,16 @@ void FGAIStorm::unbind() { void FGAIStorm::update(double dt) { + FGAIBase::update(dt); Run(dt); Transform(); - FGAIBase::update(dt); } void FGAIStorm::Run(double dt) { - FGAIStorm::dt = dt; - double speed_north_deg_sec; double speed_east_deg_sec; - double ft_per_deg_lon; - double ft_per_deg_lat; - - // 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); // convert speed to degrees per second speed_north_deg_sec = cos( hdg / SG_RADIANS_TO_DEGREES ) @@ -89,67 +105,70 @@ void FGAIStorm::Run(double dt) { * speed * 1.686 / ft_per_deg_lon; // set new position - pos.setlat( pos.lat() + speed_north_deg_sec * dt); - pos.setlon( pos.lon() + speed_east_deg_sec * dt); + pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt); + pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt); + + // do calculations for weather radar display + UpdateRadar(manager); + + // ************************************************** + // * do lightning * + // ************************************************** + + if (timer > random_delay) { + srand((unsigned)time(0)); + random_delay = delay + (rand()%3) - 1.0; + //cout << "random_delay = " << random_delay << endl; + timer = 0.0; + flashing = true; + subflash_index++; + if (subflash_index == 8) subflash_index = 0; + subflashes = subflash_array[subflash_index]; + } - double altitude_ft = altitude * SG_METER_TO_FEET; + if (flashing) { + if (flashed < subflashes) { + timer += dt; + if (timer < 0.1) { + flash_node->setBoolValue(true); + } else { + flash_node->setBoolValue(false); + if (timer > 0.2) { + timer = 0.0; + flashed++; + } + } + } else { + flashing = false; + timer = 0.0; + flashed = 0; + } + } + else { + timer += dt; + } - //###########################// - // do calculations for radar // - //###########################// + // *************************************************** + // * do turbulence * + // *************************************************** - // copy values from the AIManager + // copy user's position 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 ); + double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat; + double lon_range = fabs(pos.getLongitudeDeg() - 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; - - // 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; - + if (range < (diameter * 0.5) && + user_altitude > (altitude_ft - 1000.0) && + user_altitude < height) { + turb_mag_node->setDoubleValue(strength_norm); + turb_rate_node->setDoubleValue(0.5); + } + }