2001-12-01 06:22:24 +00:00
|
|
|
#include "Jet.hpp"
|
|
|
|
#include "Thruster.hpp"
|
2001-12-06 18:13:24 +00:00
|
|
|
#include "PropEngine.hpp"
|
2001-12-24 13:54:03 +00:00
|
|
|
#include "PistonEngine.hpp"
|
2001-12-01 06:22:24 +00:00
|
|
|
#include "Gear.hpp"
|
|
|
|
#include "Wing.hpp"
|
|
|
|
#include "Math.hpp"
|
|
|
|
|
|
|
|
#include "ControlMap.hpp"
|
|
|
|
namespace yasim {
|
|
|
|
|
|
|
|
ControlMap::~ControlMap()
|
|
|
|
{
|
2001-12-07 20:00:59 +00:00
|
|
|
int i;
|
|
|
|
for(i=0; i<_inputs.size(); i++) {
|
2001-12-01 06:22:24 +00:00
|
|
|
Vector* v = (Vector*)_inputs.get(i);
|
2001-12-07 20:00:59 +00:00
|
|
|
int j;
|
|
|
|
for(j=0; j<v->size(); j++)
|
2001-12-01 06:22:24 +00:00
|
|
|
delete (MapRec*)v->get(j);
|
|
|
|
delete v;
|
|
|
|
}
|
|
|
|
|
2001-12-24 13:54:03 +00:00
|
|
|
for(i=0; i<_outputs.size(); i++)
|
|
|
|
delete (OutRec*)_outputs.get(i);
|
2001-12-01 06:22:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int ControlMap::newInput()
|
|
|
|
{
|
|
|
|
Vector* v = new Vector();
|
|
|
|
return _inputs.add(v);
|
|
|
|
}
|
|
|
|
|
2001-12-24 13:54:03 +00:00
|
|
|
void ControlMap::addMapping(int input, int type, void* object, int options,
|
|
|
|
float src0, float src1, float dst0, float dst1)
|
|
|
|
{
|
|
|
|
addMapping(input, type, object, options);
|
|
|
|
|
|
|
|
// The one we just added is last in the list (ugly, awful hack!)
|
|
|
|
Vector* maps = (Vector*)_inputs.get(input);
|
|
|
|
MapRec* m = (MapRec*)maps->get(maps->size() - 1);
|
|
|
|
|
|
|
|
m->src0 = src0;
|
|
|
|
m->src1 = src1;
|
|
|
|
m->dst0 = dst0;
|
|
|
|
m->dst1 = dst1;
|
|
|
|
}
|
|
|
|
|
2001-12-01 06:22:24 +00:00
|
|
|
void ControlMap::addMapping(int input, int type, void* object, int options)
|
|
|
|
{
|
|
|
|
// See if the output object already exists
|
|
|
|
OutRec* out = 0;
|
2001-12-07 20:00:59 +00:00
|
|
|
int i;
|
|
|
|
for(i=0; i<_outputs.size(); i++) {
|
2001-12-01 06:22:24 +00:00
|
|
|
OutRec* o = (OutRec*)_outputs.get(i);
|
|
|
|
if(o->object == object && o->type == type) {
|
|
|
|
out = o;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create one if it doesn't
|
|
|
|
if(out == 0) {
|
|
|
|
out = new OutRec();
|
|
|
|
out->type = type;
|
|
|
|
out->object = object;
|
|
|
|
_outputs.add(out);
|
|
|
|
}
|
2001-12-24 13:54:03 +00:00
|
|
|
|
2001-12-01 06:22:24 +00:00
|
|
|
// Make a new input record
|
|
|
|
MapRec* map = new MapRec();
|
|
|
|
map->out = out;
|
2001-12-24 13:54:03 +00:00
|
|
|
map->opt = options;
|
|
|
|
map->idx = out->maps.add(map);
|
|
|
|
|
|
|
|
// The default ranges differ depending on type!
|
|
|
|
map->src1 = map->dst1 = 1;
|
|
|
|
map->src0 = map->dst0 = 0;
|
|
|
|
if(type==FLAP0 || type==FLAP1 || type==STEER)
|
|
|
|
map->src0 = map->dst0 = -1;
|
2001-12-01 06:22:24 +00:00
|
|
|
|
2001-12-24 13:54:03 +00:00
|
|
|
// And add it to the approproate vectors.
|
2001-12-01 06:22:24 +00:00
|
|
|
Vector* maps = (Vector*)_inputs.get(input);
|
|
|
|
maps->add(map);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ControlMap::reset()
|
|
|
|
{
|
|
|
|
// Set all the values to zero
|
2001-12-24 13:54:03 +00:00
|
|
|
for(int i=0; i<_outputs.size(); i++) {
|
2001-12-01 06:22:24 +00:00
|
|
|
OutRec* o = (OutRec*)_outputs.get(i);
|
2001-12-24 13:54:03 +00:00
|
|
|
for(int j=0; j<o->maps.size(); j++)
|
|
|
|
((MapRec*)o->maps.get(j))->val = 0;
|
2001-12-01 06:22:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-12-24 13:54:03 +00:00
|
|
|
void ControlMap::setInput(int input, float val)
|
2001-12-01 06:22:24 +00:00
|
|
|
{
|
|
|
|
Vector* maps = (Vector*)_inputs.get(input);
|
2001-12-24 13:54:03 +00:00
|
|
|
for(int i=0; i<maps->size(); i++) {
|
|
|
|
MapRec* m = (MapRec*)maps->get(i);
|
|
|
|
|
|
|
|
float val2 = val;
|
|
|
|
|
|
|
|
// Do the scaling operation. Clamp to [src0:src1], rescale to
|
|
|
|
// [0:1] within that range, then map to [dst0:dst1].
|
|
|
|
if(val2 < m->src0) val2 = m->src0;
|
|
|
|
if(val2 > m->src1) val2 = m->src1;
|
|
|
|
val2 = (val2 - m->src0) / (m->src1 - m->src0);
|
|
|
|
val2 = m->dst0 + val2 * (m->dst1 - m->dst0);
|
|
|
|
|
|
|
|
m->val = val2;
|
2001-12-01 06:22:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ControlMap::applyControls()
|
|
|
|
{
|
2001-12-07 20:00:59 +00:00
|
|
|
int outrec;
|
|
|
|
for(outrec=0; outrec<_outputs.size(); outrec++) {
|
2001-12-01 06:22:24 +00:00
|
|
|
OutRec* o = (OutRec*)_outputs.get(outrec);
|
|
|
|
|
|
|
|
// Generate a summed value. Note the check for "split"
|
|
|
|
// control axes like ailerons.
|
|
|
|
float lval = 0, rval = 0;
|
2001-12-07 20:00:59 +00:00
|
|
|
int i;
|
2001-12-24 13:54:03 +00:00
|
|
|
for(i=0; i<o->maps.size(); i++) {
|
|
|
|
MapRec* m = (MapRec*)o->maps.get(i);
|
|
|
|
float val = m->val;
|
|
|
|
|
|
|
|
if(m->opt & OPT_SQUARE)
|
2001-12-01 06:22:24 +00:00
|
|
|
val = val * Math::abs(val);
|
2001-12-24 13:54:03 +00:00
|
|
|
if(m->opt & OPT_INVERT)
|
2001-12-01 06:22:24 +00:00
|
|
|
val = -val;
|
|
|
|
lval += val;
|
2001-12-24 13:54:03 +00:00
|
|
|
if(m->opt & OPT_SPLIT)
|
2001-12-01 06:22:24 +00:00
|
|
|
rval -= val;
|
|
|
|
else
|
|
|
|
rval += val;
|
|
|
|
}
|
|
|
|
|
|
|
|
void* obj = o->object;
|
|
|
|
switch(o->type) {
|
|
|
|
case THROTTLE: ((Thruster*)obj)->setThrottle(lval); break;
|
|
|
|
case MIXTURE: ((Thruster*)obj)->setMixture(lval); break;
|
2001-12-06 18:13:24 +00:00
|
|
|
case ADVANCE: ((PropEngine*)obj)->setAdvance(lval); break;
|
2001-12-01 06:22:24 +00:00
|
|
|
case REHEAT: ((Jet*)obj)->setReheat(lval); break;
|
2001-12-24 13:54:03 +00:00
|
|
|
case VECTOR: ((Jet*)obj)->setRotation(lval); break;
|
2001-12-01 06:22:24 +00:00
|
|
|
case BRAKE: ((Gear*)obj)->setBrake(lval); break;
|
|
|
|
case STEER: ((Gear*)obj)->setRotation(lval); break;
|
|
|
|
case EXTEND: ((Gear*)obj)->setExtension(lval); break;
|
|
|
|
case SLAT: ((Wing*)obj)->setSlat(lval); break;
|
|
|
|
case FLAP0: ((Wing*)obj)->setFlap0(lval, rval); break;
|
|
|
|
case FLAP1: ((Wing*)obj)->setFlap1(lval, rval); break;
|
|
|
|
case SPOILER: ((Wing*)obj)->setSpoiler(lval, rval); break;
|
2001-12-24 13:54:03 +00:00
|
|
|
case BOOST:
|
|
|
|
((Thruster*)obj)->getPistonEngine()->setBoost(lval);
|
|
|
|
break;
|
2001-12-01 06:22:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}; // namespace yasim
|