double rudder; // used by ship objects
double strength; // used by thermal objects
double diameter; // used by thermal objects
+ double height_msl; // used by thermal objects
double eda; // used by ballistic objects
double life; // life span in seconds
double buoyancy; // acceleration in ft per sec2
en->rudder = entry_node->getDoubleValue("rudder", 0.0);
en->strength = entry_node->getDoubleValue("strength-fps", 0.0);
en->diameter = entry_node->getDoubleValue("diameter-ft", 0.0);
+ en->height_msl = entry_node->getDoubleValue("height-msl", 5000.0);
en->eda = entry_node->getDoubleValue("eda", 0.007);
en->life = entry_node->getDoubleValue("life", 900.0);
en->buoyancy = entry_node->getDoubleValue("buoyancy", 0);
// 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_altitude = manager->get_user_altitude();
// calculate range to target in feet and nautical miles
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
} else {
strength = 0.0;
}
+
+ // Stop lift at the top of the thermal (smoothly)
+ if (user_altitude > (height + 100.0)) {
+ strength = 0.0;
+ }
+ else if (user_altitude < height) {
+ // do nothing
+ }
+ else {
+ strength -= (strength * (user_altitude - height) * 0.01);
+ }
}
inline void setMaxStrength( double s ) { max_strength = s; };
inline void setDiameter( double d ) { diameter = d; };
+ inline void setHeight( double h ) { height = h; };
inline double getStrength() const { return strength; };
inline double getDiameter() const { return diameter; };
+ inline double getHeight() const { return height; };
private:
double max_strength;
double strength;
double diameter;
+ double height;
double factor;
};
out[0] = out[1] = out[2] = 0;
in[3] = out[3] = 1;
string contents_node;
+ contrail_altitude = 30000.0;
}
FGSubmodelMgr::~FGSubmodelMgr ()
_user_speed_east_fps_node = fgGetNode("/velocities/speed-east-fps",true);
_user_speed_north_fps_node = fgGetNode("/velocities/speed-north-fps",true);
- ai = (FGAIManager*)globals->get_subsystem("ai_model");
+ _contrail_altitude_node = fgGetNode("/environment/params/contrail-altitude", true);
+ contrail_altitude = _contrail_altitude_node->getDoubleValue();
+ _contrail_trigger = fgGetNode("ai/submodels/contrails", true);
+ _contrail_trigger->setBoolValue(false);
+ ai = (FGAIManager*)globals->get_subsystem("ai_model");
}
{
if (!(_serviceable_node->getBoolValue())) return;
int i=-1;
+
+ if (_user_alt_node->getDoubleValue() > contrail_altitude) {
+ _contrail_trigger->setBoolValue(true);
+ }
+
submodel_iterator = submodels.begin();
while(submodel_iterator != submodels.end()) {
i++;
static const double lbs_to_slugs; //conversion factor
+ double contrail_altitude;
+
SGPropertyNode* _serviceable_node;
SGPropertyNode* _user_lat_node;
SGPropertyNode* _user_lon_node;
SGPropertyNode* _user_speed_down_fps_node;
SGPropertyNode* _user_speed_east_fps_node;
SGPropertyNode* _user_speed_north_fps_node;
+ SGPropertyNode* _contrail_altitude_node;
+ SGPropertyNode* _contrail_trigger;
FGAIManager* ai;
IC_struct IC;