#include "RigidBody.hpp"
#include "Surface.hpp"
#include "Rotorpart.hpp"
-#include "Rotorblade.hpp"
#include "Thruster.hpp"
#include "Airplane.hpp"
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)
return _model.getLaunchbar();
}
+Rotorgear* Airplane::getRotorgear()
+{
+ return _model.getRotorgear();
+}
+
void Airplane::updateGearState()
{
for(int i=0; i<_gears.size(); i++) {
_vstabs.add(vstab);
}
-void Airplane::addRotor(Rotor* rotor)
-{
- _rotors.add(rotor);
-}
-
void Airplane::addFuselage(float* front, float* back, float width,
float taper, float mid)
{
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)
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)
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);
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));
}
// 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();
{
_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