]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIStorm.cxx
Initialize class member in AIFlightPlan
[flightgear.git] / src / AIModel / AIStorm.cxx
index 8879216f4eb97880774991aa21eb8491e1abb157..fded8012d9ef85e4ed623c4bd0adb2cda146d860 100644 (file)
 //
 // 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 <config.h>
 #endif
 
-#include <simgear/math/point3d.hxx>
 #include <Main/fg_props.hxx>
 #include <Main/globals.hxx>
 #include <Scenery/scenery.hxx>
 #include <string>
 #include <math.h>
+#include <cstdlib>
+#include <time.h>
 
-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);
+   } 
+     
 }