2003-11-28 15:48:05 +00:00
|
|
|
// FGAIBase - abstract base class for AI objects
|
|
|
|
// Written by David Culp, started Nov 2003, based on
|
|
|
|
// David Luff's FGAIEntity class.
|
|
|
|
// - davidculp2@comcast.net
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
|
|
#include STL_STRING
|
|
|
|
|
2003-11-28 15:48:05 +00:00
|
|
|
#include <plib/sg.h>
|
|
|
|
#include <plib/ssg.h>
|
2003-12-21 20:12:55 +00:00
|
|
|
|
2003-11-28 15:48:05 +00:00
|
|
|
#include <simgear/math/point3d.hxx>
|
|
|
|
#include <simgear/misc/sg_path.hxx>
|
|
|
|
#include <simgear/scene/model/location.hxx>
|
|
|
|
#include <simgear/scene/model/model.hxx>
|
|
|
|
#include <simgear/debug/logstream.hxx>
|
2003-12-21 20:12:55 +00:00
|
|
|
#include <simgear/props/props.hxx>
|
|
|
|
|
|
|
|
#include <Main/globals.hxx>
|
|
|
|
#include <Scenery/scenery.hxx>
|
|
|
|
|
2003-11-28 15:48:05 +00:00
|
|
|
|
|
|
|
#include "AIBase.hxx"
|
|
|
|
|
2003-12-21 22:16:57 +00:00
|
|
|
FGAIBase *FGAIBase::_self = NULL;
|
|
|
|
|
|
|
|
FGAIBase::FGAIBase() {
|
|
|
|
_self = this;
|
|
|
|
}
|
|
|
|
|
2003-11-28 15:48:05 +00:00
|
|
|
FGAIBase::~FGAIBase() {
|
2003-12-21 22:16:57 +00:00
|
|
|
_self = NULL;
|
2003-11-28 15:48:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void FGAIBase::update(double dt) {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FGAIBase::Transform() {
|
|
|
|
aip.setPosition(pos.lon(), pos.lat(), pos.elev() * SG_METER_TO_FEET);
|
|
|
|
aip.setOrientation(roll, pitch, hdg);
|
|
|
|
aip.update( globals->get_scenery()->get_center() );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool FGAIBase::init() {
|
2003-12-21 20:12:55 +00:00
|
|
|
|
|
|
|
props = globals->get_props()->getNode("ai/model", true);
|
|
|
|
|
2003-11-28 15:48:05 +00:00
|
|
|
ssgBranch *model = sgLoad3DModel( globals->get_fg_root(),
|
|
|
|
model_path.c_str(),
|
2003-12-21 20:12:55 +00:00
|
|
|
props,
|
2003-11-28 15:48:05 +00:00
|
|
|
globals->get_sim_time_sec() );
|
|
|
|
if (model) {
|
|
|
|
aip.init( model );
|
|
|
|
aip.setVisible(true);
|
|
|
|
globals->get_scenery()->get_scene_graph()->addKid(aip.getSceneGraph());
|
|
|
|
} else {
|
|
|
|
SG_LOG(SG_INPUT, SG_WARN, "AIBase: Could not load aircraft model.");
|
|
|
|
}
|
|
|
|
|
|
|
|
tgt_roll = tgt_pitch = tgt_yaw = tgt_vs = vs = roll = pitch = 0.0;
|
2003-11-28 20:05:32 +00:00
|
|
|
setDie(false);
|
2003-11-28 15:48:05 +00:00
|
|
|
}
|
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
void FGAIBase::bind() {
|
|
|
|
props->tie("velocities/airspeed-kt", SGRawValuePointer<double>(&speed));
|
|
|
|
props->tie("velocities/vertical-speed-fps", SGRawValuePointer<double>(&vs));
|
2003-11-28 15:48:05 +00:00
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
props->tie("position/altitude-ft", SGRawValuePointer<double>(&altitude));
|
2003-12-21 22:16:57 +00:00
|
|
|
props->tie("position/latitude-deg",
|
|
|
|
SGRawValueFunctions<double>(FGAIBase::_getLatitude,
|
|
|
|
FGAIBase::_setLatitude));
|
|
|
|
props->tie("position/longitude-deg",
|
|
|
|
SGRawValueFunctions<double>(FGAIBase::_getLongitude,
|
|
|
|
FGAIBase::_setLongitude));
|
2003-11-28 15:48:05 +00:00
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
props->tie("orientation/pitch-deg", SGRawValuePointer<double>(&pitch));
|
|
|
|
props->tie("orientation/roll-deg", SGRawValuePointer<double>(&roll));
|
|
|
|
props->tie("orientation/heading-deg", SGRawValuePointer<double>(&hdg));
|
2003-11-28 15:48:05 +00:00
|
|
|
}
|
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
void FGAIBase::unbind() {
|
|
|
|
props->untie("velocities/airspeed-kt");
|
|
|
|
props->untie("velocities/vertical-speed-fps");
|
2003-11-28 15:48:05 +00:00
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
props->untie("position/altitude-ft");
|
|
|
|
props->untie("position/latitude-deg");
|
|
|
|
props->untie("position/longitude-deg");
|
2003-11-28 15:48:05 +00:00
|
|
|
|
2003-12-21 20:12:55 +00:00
|
|
|
props->untie("orientation/pitch-deg");
|
|
|
|
props->untie("orientation/roll-deg");
|
|
|
|
props->untie("orientation/heading-deg");
|
2003-11-28 15:48:05 +00:00
|
|
|
}
|
2003-12-21 22:16:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
void FGAIBase::_setLongitude( double longitude ) {
|
|
|
|
_self->pos.setlon(longitude);
|
|
|
|
}
|
|
|
|
|
|
|
|
void FGAIBase::_setLatitude ( double latitude ) {
|
|
|
|
_self->pos.setlat(latitude);
|
|
|
|
}
|
|
|
|
|
|
|
|
double FGAIBase::_getLongitude() { return _self->pos.lon(); }
|
|
|
|
|
|
|
|
double FGAIBase::_getLatitude () { return _self->pos.lat(); }
|