]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/YASim/Surface.cpp
Show YASim config error messages.
[flightgear.git] / src / FDM / YASim / Surface.cpp
index 24d318842dea996ac412b9b83609085983274685..db977f58a943e217f2acbb7ea9d6ecf9354bf6d4 100644 (file)
@@ -25,6 +25,7 @@ Surface::Surface()
     _slatDrag = _spoilerDrag = _flapDrag = 1;
 
     _flapLift = 0;
+    _flapEffectiveness = 1;
     _slatAlpha = 0;
     _spoilerLift = 1;
     _inducedDrag = 1;
@@ -132,6 +133,17 @@ void Surface::setFlap(float pos)
     _flapPos = pos;
 }
 
+void Surface::setFlapEffectiveness(float effectiveness)
+{
+    _flapEffectiveness = effectiveness;
+}
+
+double Surface::getFlapEffectiveness()
+{
+    return _flapEffectiveness;
+}
+
+
 void Surface::setSlat(float pos)
 {
     _slatPos = pos;
@@ -158,6 +170,13 @@ void Surface::calcForce(float* v, float rho, float* out, float* torque)
        return;
     }
 
+    // special case this so the logic below doesn't produce a non-zero
+    // force; should probably have a "no force" flag instead...
+    if(_cx == 0. && _cy == 0. && _cz == 0.) {
+        for(int i=0; i<3; i++) out[i] = torque[i] = 0.;
+        return;
+    }
+
     Math::mul3(1/vel, v, out);
 
     // Convert to the surface's coordinates
@@ -287,17 +306,20 @@ float Surface::stallFunc(float* v)
 // stall alpha
 float Surface::flapLift(float alpha)
 {
-    float flapLift = _cz * _flapPos * (_flapLift-1);
+    float flapLift = _cz * _flapPos * (_flapLift-1) * _flapEffectiveness;
+
+    if(_stalls[0] == 0)
+        return 0;
 
     if(alpha < 0) alpha = -alpha;
     if(alpha < _stalls[0])
         return flapLift;
     else if(alpha > _stalls[0] + _widths[0])
-        return 1;
+        return 0;
 
     float frac = (alpha - _stalls[0]) / _widths[0];
     frac = frac*frac*(3-2*frac);
-    return flapLift * (1-frac) + frac;
+    return flapLift * (1-frac);
 }
 
 float Surface::controlDrag(float lift, float drag)