]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/YASim/Airplane.cpp
simplify name/number handling
[flightgear.git] / src / FDM / YASim / Airplane.cpp
index df9dfbe604e3e4125a2cbaef9bc794571402a2b0..30bdf59f34490893e4e9a8d90d4c2bf0f154627f 100644 (file)
@@ -6,7 +6,6 @@
 #include "RigidBody.hpp"
 #include "Surface.hpp"
 #include "Rotorpart.hpp"
-#include "Rotorblade.hpp"
 #include "Thruster.hpp"
 #include "Airplane.hpp"
 
@@ -60,14 +59,33 @@ Airplane::~Airplane()
        delete (Tank*)_tanks.get(i);
     for(i=0; i<_thrusters.size(); i++)
        delete (ThrustRec*)_thrusters.get(i);
-    for(i=0; i<_gears.size(); i++)
-       delete (GearRec*)_gears.get(i);
+    for(i=0; i<_gears.size(); i++) {
+       GearRec* g = (GearRec*)_gears.get(i);
+        delete g->gear;
+        delete g;
+    }
     for(i=0; i<_surfs.size(); i++)
        delete (Surface*)_surfs.get(i);    
-    for(i=0; i<_contacts.size(); i++)
-        delete[] (float*)_contacts.get(i);
+    for(i=0; i<_contacts.size(); i++) {
+        ContactRec* c = (ContactRec*)_contacts.get(i);
+        delete c->gear;
+        delete c;
+    }
     for(i=0; i<_solveWeights.size(); i++)
-        delete[] (SolveWeight*)_solveWeights.get(i);
+        delete (SolveWeight*)_solveWeights.get(i);
+    for(i=0; i<_cruiseControls.size(); i++)
+        delete (Control*)_cruiseControls.get(i);
+    for(i=0; i<_approachControls.size(); i++) {
+        Control* c = (Control*)_approachControls.get(i);
+        if(c != &_approachElevator)
+            delete c;
+    }
+    delete _wing;
+    delete _tail;
+    for(i=0; i<_vstabs.size(); i++)
+        delete (Wing*)_vstabs.get(i);
+    for(i=0; i<_weights.size(); i++)
+        delete (WeightRec*)_weights.get(i);
 }
 
 void Airplane::iterate(float dt)
@@ -147,6 +165,11 @@ Launchbar* Airplane::getLaunchbar()
     return _model.getLaunchbar();
 }
 
+Rotorgear* Airplane::getRotorgear()
+{
+    return _model.getRotorgear();
+}
+
 void Airplane::updateGearState()
 {
     for(int i=0; i<_gears.size(); i++) {
@@ -255,11 +278,6 @@ void Airplane::addVStab(Wing* vstab)
     _vstabs.add(vstab);
 }
 
-void Airplane::addRotor(Rotor* rotor)
-{
-    _rotors.add(rotor);
-}
-
 void Airplane::addFuselage(float* front, float* back, float width,
                            float taper, float mid)
 {
@@ -415,11 +433,12 @@ void Airplane::setupState(float aoa, float speed, State* s)
 
 void Airplane::addContactPoint(float* pos)
 {
-    float* cp = new float[3];
-    cp[0] = pos[0];
-    cp[1] = pos[1];
-    cp[2] = pos[2];
-    _contacts.add(cp);
+    ContactRec* c = new ContactRec;
+    c->gear = 0;
+    c->p[0] = pos[0];
+    c->p[1] = pos[1];
+    c->p[2] = pos[2];
+    _contacts.add(c);
 }
 
 float Airplane::compileWing(Wing* w)
@@ -458,41 +477,9 @@ float Airplane::compileWing(Wing* w)
     return wgt;
 }
 
-float Airplane::compileRotor(Rotor* r)
+float Airplane::compileRotorgear()
 {
-    // Todo: add rotor to model!!!
-    // Todo: calc and add mass!!!
-    r->compile();
-    _model.addRotor(r);
-
-    float wgt = 0;
-    int i;
-    for(i=0; i<r->numRotorparts(); i++) {
-        Rotorpart* s = (Rotorpart*)r->getRotorpart(i);
-
-        _model.addRotorpart(s);
-        
-        float mass = s->getWeight();
-        mass = mass * Math::sqrt(mass);
-        float pos[3];
-        s->getPosition(pos);
-        _model.getBody()->addMass(mass, pos);
-        wgt += mass;
-    }
-    
-    for(i=0; i<r->numRotorblades(); i++) {
-        Rotorblade* b = (Rotorblade*)r->getRotorblade(i);
-
-        _model.addRotorblade(b);
-        
-        float mass = b->getWeight();
-        mass = mass * Math::sqrt(mass);
-        float pos[3];
-        b->getPosition(pos);
-        _model.getBody()->addMass(mass, pos);
-        wgt += mass;
-    }
-    return wgt;
+    return getRotorgear()->compile(_model.getBody());
 }
 
 float Airplane::compileFuselage(Fuselage* f)
@@ -595,10 +582,11 @@ void Airplane::compileContactPoints()
 
     int i;
     for(i=0; i<_contacts.size(); i++) {
-        float *cp = (float*)_contacts.get(i);
+        ContactRec* c = (ContactRec*)_contacts.get(i);
 
         Gear* g = new Gear();
-        g->setPosition(cp);
+        c->gear = g;
+        g->setPosition(c->p);
         
         g->setCompression(comp);
         g->setSpring(spring);
@@ -631,9 +619,10 @@ void Airplane::compile()
     int i;
     for(i=0; i<_vstabs.size(); i++)
         aeroWgt += compileWing((Wing*)_vstabs.get(i)); 
-    for(i=0; i<_rotors.size(); i++)
-        aeroWgt += compileRotor((Rotor*)_rotors.get(i)); 
-    
+
+    // The rotor(s)
+    aeroWgt += compileRotorgear(); 
+
     // The fuselage(s)
     for(i=0; i<_fuselages.size(); i++)
         aeroWgt += compileFuselage((Fuselage*)_fuselages.get(i));
@@ -677,11 +666,12 @@ void Airplane::compile()
     }
 
     // Ground effect
-    float gepos[3];
-    float gespan = 0;
-    if(_wing)
-      gespan = _wing->getGroundEffect(gepos);
-    _model.setGroundEffect(gepos, gespan, 0.15f);
+    if(_wing) {
+        float gepos[3];
+        float gespan = 0;
+        gespan = _wing->getGroundEffect(gepos);
+        _model.setGroundEffect(gepos, gespan, 0.15f);
+    }
 
     solveGear();
     if(_wing && _tail) solve();
@@ -1053,13 +1043,29 @@ void Airplane::solveHelicopter()
 {
     _solutionIterations = 0;
     _failureMsg = 0;
-
-    applyDragFactor(Math::pow(15.7/1000, 1/SOLVE_TWEAK));
-    applyLiftRatio(Math::pow(104, 1/SOLVE_TWEAK));
+    if (getRotorgear()!=0)
+    {
+        Rotorgear* rg = getRotorgear();
+        applyDragFactor(Math::pow(rg->getYasimDragFactor()/1000,
+            1/SOLVE_TWEAK));
+        applyLiftRatio(Math::pow(rg->getYasimLiftFactor(),
+            1/SOLVE_TWEAK));
+    }
+    else
+    //huh, no wing and no rotor? (_rotorgear is constructed, 
+    //if a rotor is defined
+    {
+        applyDragFactor(Math::pow(15.7/1000, 1/SOLVE_TWEAK));
+        applyLiftRatio(Math::pow(104, 1/SOLVE_TWEAK));
+    }
     setupState(0,0, &_cruiseState);
     _model.setState(&_cruiseState);
+    setupWeights(true);
     _controls.reset();
     _model.getBody()->reset();
+    _model.setAir(_cruiseP, _cruiseT,
+                  Atmosphere::calcStdDensity(_cruiseP, _cruiseT));
+    
 }
 
 }; // namespace yasim