diff --git a/src/FDM/YASim/FGFDM.cpp b/src/FDM/YASim/FGFDM.cpp index 7fe64908b..bd689d9e2 100644 --- a/src/FDM/YASim/FGFDM.cpp +++ b/src/FDM/YASim/FGFDM.cpp @@ -308,7 +308,8 @@ void FGFDM::startElement(const char* name, const XMLAttributes &atts) #undef p2 r->setInUse(); } else if(eq(name, "wing")) { - _airplane.setWing(parseWing(a, name, &_airplane)); + Wing *wing = parseWing(a, name, &_airplane); + _airplane.setWing(wing); } else if(eq(name, "hstab")) { _airplane.setTail(parseWing(a, name, &_airplane)); } else if(eq(name, "vstab") || eq(name, "mstab")) { @@ -537,23 +538,30 @@ void FGFDM::startElement(const char* name, const XMLAttributes &atts) w->setStall(attrf(a, "aoa") * DEG2RAD); w->setStallWidth(attrf(a, "width", 2) * DEG2RAD); w->setStallPeak(attrf(a, "peak", 1.5)); - } else if(eq(name, "flap0")) { - ((Wing*)_currObj)->setFlap0Params(attrf(a, "start"), attrf(a, "end"), - attrf(a, "lift"), attrf(a, "drag")); - } else if(eq(name, "flap1")) { - ((Wing*)_currObj)->setFlap1Params(attrf(a, "start"), attrf(a, "end"), - attrf(a, "lift"), attrf(a, "drag")); - } else if(eq(name, "slat")) { - ((Wing*)_currObj)->setSlatParams(attrf(a, "start"), attrf(a, "end"), - attrf(a, "aoa"), attrf(a, "drag")); - } else if(eq(name, "spoiler")) { - ((Wing*)_currObj)->setSpoilerParams(attrf(a, "start"), attrf(a, "end"), - attrf(a, "lift"), attrf(a, "drag")); - /* } else if(eq(name, "collective")) { - ((Rotor*)_currObj)->setcollective(attrf(a, "min"), attrf(a, "max")); - } else if(eq(name, "cyclic")) { - ((Rotor*)_currObj)->setcyclic(attrf(a, "ail"), attrf(a, "ele")); - */ + } else if(eq(name, "flap0") || eq(name, "flap1") || eq(name, "spoiler") || eq(name, "slat")) { + FlapParams fp; + fp.start = attrf(a, "start"); + fp.end = attrf(a, "end"); + if (eq(name, "slat")) { + fp.aoa = attrf(a, "aoa"); + } + else { + fp.lift = attrf(a, "lift"); + } + fp.drag = attrf(a, "drag"); + + if (eq(name, "flap0")) { + ((Wing*)_currObj)->setFlapParams(WING_FLAP0, fp); + } + if (eq(name, "flap1")) { + ((Wing*)_currObj)->setFlapParams(WING_FLAP1, fp); + } + if (eq(name, "spoiler")) { + ((Wing*)_currObj)->setFlapParams(WING_SPOILER, fp); + } + if (eq(name, "slat")) { + ((Wing*)_currObj)->setFlapParams(WING_SLAT, fp); + } } else if(eq(name, "actionpt")) { v[0] = attrf(a, "x"); v[1] = attrf(a, "y"); @@ -807,14 +815,19 @@ Wing* FGFDM::parseWing(XMLAttributes* a, const char* type, Version * version) defDihed = 90; mirror = false; } - - float base[3]; - base[0] = attrf(a, "x"); - base[1] = attrf(a, "y"); - base[2] = attrf(a, "z"); - + + float isSection = attrb(a, "section"); + float base[3] {0,0,0}; + float chord {0}; + if (!isSection) { + base[0] = attrf(a, "x"); + base[1] = attrf(a, "y"); + base[2] = attrf(a, "z"); + chord = attrf(a, "chord"); + } float length = attrf(a, "length"); - float chord = attrf(a, "chord"); + + // optional attributes (with defaults) float sweep = attrf(a, "sweep", 0) * DEG2RAD; float taper = attrf(a, "taper", 1); float dihedral = attrf(a, "dihedral", defDihed) * DEG2RAD; @@ -831,7 +844,7 @@ Wing* FGFDM::parseWing(XMLAttributes* a, const char* type, Version * version) } Wing* w = new Wing(version, mirror, base, chord, length, - taper, sweep, dihedral, twist); + taper, sweep, dihedral, twist); w->setIncidence(incidence); w->setCamber(camber); diff --git a/src/FDM/YASim/Wing.cpp b/src/FDM/YASim/Wing.cpp index e8c77be07..e39bb4d85 100644 --- a/src/FDM/YASim/Wing.cpp +++ b/src/FDM/YASim/Wing.cpp @@ -39,36 +39,9 @@ void Wing::setIncidence(float incidence) ((SurfRec*)_surfs.get(i))->surface->setIncidence(incidence); } -void Wing::setFlap0Params(float start, float end, float lift, float drag) +void Wing::setFlapParams(WingFlaps i, FlapParams fp) { - _flap0Start = start; - _flap0End = end; - _flap0Lift = lift; - _flap0Drag = drag; -} - -void Wing::setFlap1Params(float start, float end, float lift, float drag) -{ - _flap1Start = start; - _flap1End = end; - _flap1Lift = lift; - _flap1Drag = drag; -} - -void Wing::setSlatParams(float start, float end, float aoa, float drag) -{ - _slatStart = start; - _slatEnd = end; - _slatAoA = aoa; - _slatDrag = drag; -} - -void Wing::setSpoilerParams(float start, float end, float lift, float drag) -{ - _spoilerStart = start; - _spoilerEnd = end; - _spoilerLift = lift; - _spoilerDrag = drag; + _flapParams[i] = fp; } void Wing::setFlap0Pos(float lval, float rval) @@ -201,10 +174,14 @@ void Wing::compile() // segments. const int NUM_BOUNDS {10}; float bounds[NUM_BOUNDS]; - bounds[0] = _flap0Start; bounds[1] = _flap0End; - bounds[2] = _flap1Start; bounds[3] = _flap1End; - bounds[4] = _spoilerStart; bounds[5] = _spoilerEnd; - bounds[6] = _slatStart; bounds[7] = _slatEnd; + bounds[0] = _flapParams[WING_FLAP0].start; + bounds[1] = _flapParams[WING_FLAP0].end; + bounds[2] = _flapParams[WING_FLAP1].start; + bounds[3] = _flapParams[WING_FLAP1].end; + bounds[4] = _flapParams[WING_SPOILER].start; + bounds[5] = _flapParams[WING_SPOILER].end; + bounds[6] = _flapParams[WING_SLAT].start; + bounds[7] = _flapParams[WING_SLAT].end; //and don't forget the root and the tip of the wing itself bounds[8] = 0; bounds[9] = 1; @@ -243,10 +220,10 @@ void Wing::compile() float mid = (start+end)/2; bool hasFlap0=0, hasFlap1=0, hasSlat=0, hasSpoiler=0; - if(_flap0Start < mid && mid < _flap0End) hasFlap0 = 1; - if(_flap1Start < mid && mid < _flap1End) hasFlap1 = 1; - if(_slatStart < mid && mid < _slatEnd) hasSlat = 1; - if(_spoilerStart < mid && mid < _spoilerEnd) hasSpoiler = 1; + if(_flapParams[WING_FLAP0].start < mid && mid < _flapParams[WING_FLAP0].end) hasFlap0 = 1; + if(_flapParams[WING_FLAP1].start < mid && mid < _flapParams[WING_FLAP1].end) hasFlap1 = 1; + if(_flapParams[WING_SLAT].start < mid && mid < _flapParams[WING_SLAT].end) hasSlat = 1; + if(_flapParams[WING_SPOILER].start < mid && mid < _flapParams[WING_SPOILER].end) hasSpoiler = 1; // FIXME: Should probably detect an error here if both flap0 // and flap1 are set. Right now flap1 overrides. @@ -353,10 +330,10 @@ Surface* Wing::newSurface(float* pos, float* orient, float chord, s->setStallWidth(i, 0.01); } - if(hasFlap0) s->setFlapParams(_flap0Lift, _flap0Drag); - if(hasFlap1) s->setFlapParams(_flap1Lift, _flap1Drag); - if(hasSlat) s->setSlatParams(_slatAoA, _slatDrag); - if(hasSpoiler) s->setSpoilerParams(_spoilerLift, _spoilerDrag); + if(hasFlap0) s->setFlapParams(_flapParams[WING_FLAP0].lift, _flapParams[WING_FLAP0].drag); + if(hasFlap1) s->setFlapParams(_flapParams[WING_FLAP1].lift, _flapParams[WING_FLAP1].drag); + if(hasSlat) s->setSlatParams(_flapParams[WING_SLAT].aoa, _flapParams[WING_SLAT].drag); + if(hasSpoiler) s->setSpoilerParams(_flapParams[WING_SPOILER].lift, _flapParams[WING_SPOILER].drag); if(hasFlap0) _flap0Surfs.add(s); if(hasFlap1) _flap1Surfs.add(s); diff --git a/src/FDM/YASim/Wing.hpp b/src/FDM/YASim/Wing.hpp index ac206bd4e..3e913d43b 100644 --- a/src/FDM/YASim/Wing.hpp +++ b/src/FDM/YASim/Wing.hpp @@ -9,8 +9,24 @@ namespace yasim { class Surface; +struct FlapParams { + float start {0}; + float end {0}; + float lift {0}; + float drag {0}; + float aoa {0}; +}; + +enum WingFlaps { + WING_FLAP0, + WING_FLAP1, + WING_SLAT, + WING_SPOILER +}; + // FIXME: need to handle "inverted" controls for mirrored wings. class Wing { + public: Wing(Version *ver, bool mirror, float* base, float chord, float length, float taper = 1, float sweep = 0, float dihedral = 0, float twist = 0); @@ -47,10 +63,7 @@ public: void setInducedDrag(float drag) { _inducedDrag = drag; } - void setFlap0Params(float start, float end, float lift, float drag); - void setFlap1Params(float start, float end, float lift, float drag); - void setSpoilerParams(float start, float end, float lift, float drag); - void setSlatParams(float start, float end, float aoa, float drag); + void setFlapParams(WingFlaps i, FlapParams fp); // Set the control axes for the sub-surfaces void setFlap0Pos(float lval, float rval); @@ -88,6 +101,7 @@ public: void setLiftRatio(float ratio); float getLiftRatio() const { return _liftRatio; } + private: void interp(const float* v1, const float* v2, const float frac, float* out); Surface* newSurface(float* pos, float* orient, float chord, @@ -97,6 +111,7 @@ private: void calculateSpan(); void calculateMAC(); float calculateSweepAngleLeadingEdge(); + void addSurface(Surface* s, float weight, float twist); struct SurfRec { Surface * surface; float weight; }; @@ -141,25 +156,8 @@ private: float _dragScale {1}; float _liftRatio {1}; - float _flap0Start {0}; - float _flap0End {0}; - float _flap0Lift {0}; - float _flap0Drag {0}; + FlapParams _flapParams[sizeof(WingFlaps)]; - float _flap1Start {0}; - float _flap1End {0}; - float _flap1Lift {0}; - float _flap1Drag {0}; - - float _spoilerStart {0}; - float _spoilerEnd {0}; - float _spoilerLift {0}; - float _spoilerDrag {0}; - - float _slatStart {0}; - float _slatEnd {0}; - float _slatAoA {0}; - float _slatDrag {0}; }; }; // namespace yasim