#include "AIMultiplayer.hxx"
+using std::string;
// #define SG_DEBUG SG_ALERT
isTanker = false; // do this until this property is
// passed over the net
- string str1 = _getCallsign();
- string str2 = "MOBIL";
+ const string& str1 = _getCallsign();
+ const string str2 = "MOBIL";
string::size_type loc1= str1.find( str2, 0 );
if ( (loc1 != string::npos && str2 != "") ){
void FGAIMultiplayer::bind() {
FGAIBase::bind();
- props->tie("refuel/contact", SGRawValuePointer<bool>(&contact));
- props->tie("tanker", SGRawValuePointer<bool>(&isTanker));
+ tie("refuel/contact", SGRawValuePointer<bool>(&contact));
+ tie("tanker", SGRawValuePointer<bool>(&isTanker));
- props->tie("controls/invisible",
+ tie("controls/invisible",
SGRawValuePointer<bool>(&invisible));
-
+ _uBodyNode = props->getNode("velocities/uBody-fps", true);
+ _vBodyNode = props->getNode("velocities/vBody-fps", true);
+ _wBodyNode = props->getNode("velocities/wBody-fps", true);
+
#define AIMPROProp(type, name) \
SGRawValueMethods<FGAIMultiplayer, type>(*this, &FGAIMultiplayer::get##name)
SGRawValueMethods<FGAIMultiplayer, type>(*this, \
&FGAIMultiplayer::get##name, &FGAIMultiplayer::set##name)
- //props->tie("callsign", AIMPROProp(const char *, CallSign));
+ //tie("callsign", AIMPROProp(const char *, CallSign));
- props->tie("controls/allow-extrapolation",
- AIMPRWProp(bool, AllowExtrapolation));
- props->tie("controls/lag-adjust-system-speed",
- AIMPRWProp(double, LagAdjustSystemSpeed));
+ tie("controls/allow-extrapolation",
+ AIMPRWProp(bool, AllowExtrapolation));
+ tie("controls/lag-adjust-system-speed",
+ AIMPRWProp(double, LagAdjustSystemSpeed));
#undef AIMPROProp
#undef AIMPRWProp
}
-void FGAIMultiplayer::unbind() {
- FGAIBase::unbind();
-
- //props->untie("callsign");
- props->untie("controls/allow-extrapolation");
- props->untie("controls/lag-adjust-system-speed");
- props->untie("controls/invisible");
- props->untie("refuel/contact");
- props->untie("tanker");
-
-}
-
void FGAIMultiplayer::update(double dt)
{
using namespace simgear;
SGVec3d ecPos;
SGQuatf ecOrient;
+ SGVec3f ecLinearVel;
if (tInterp <= curentPkgTime) {
// Ok, we need a time prevous to the last available packet,
MotionInfo::iterator firstIt = mMotionInfo.begin();
ecPos = firstIt->second.position;
ecOrient = firstIt->second.orientation;
- speed = norm(firstIt->second.linearVel) * SG_METER_TO_NM * 3600.0;
+ ecLinearVel = firstIt->second.linearVel;
+ speed = norm(ecLinearVel) * SG_METER_TO_NM * 3600.0;
std::vector<FGPropertyData*>::const_iterator firstPropIt;
std::vector<FGPropertyData*>::const_iterator firstPropItEnd;
ecPos = ((1-tau)*prevIt->second.position + tau*nextIt->second.position);
ecOrient = interpolate((float)tau, prevIt->second.orientation,
nextIt->second.orientation);
- speed = norm((1-tau)*prevIt->second.linearVel
- + tau*nextIt->second.linearVel) * SG_METER_TO_NM * 3600.0;
+ ecLinearVel = ((1-tau)*prevIt->second.linearVel + tau*nextIt->second.linearVel);
+ speed = norm(ecLinearVel) * SG_METER_TO_NM * 3600.0;
if (prevIt->second.properties.size()
== nextIt->second.properties.size()) {
// This must be sufficient ...
ecPos = motionInfo.position;
ecOrient = motionInfo.orientation;
- SGVec3f linearVel = motionInfo.linearVel;
+ ecLinearVel = motionInfo.linearVel;
SGVec3f angularVel = motionInfo.angularVel;
while (0 < t) {
double h = 1e-1;
if (t < h)
h = t;
- SGVec3d ecVel = toVec3d(ecOrient.backTransform(linearVel));
+ SGVec3d ecVel = toVec3d(ecOrient.backTransform(ecLinearVel));
ecPos += h*ecVel;
ecOrient += h*ecOrient.derivative(angularVel);
- linearVel += h*(cross(linearVel, angularVel) + motionInfo.linearAccel);
+ ecLinearVel += h*(cross(ecLinearVel, angularVel) + motionInfo.linearAccel);
angularVel += h*motionInfo.angularAccel;
t -= h;
std::vector<FGPropertyData*>::const_iterator firstPropIt;
std::vector<FGPropertyData*>::const_iterator firstPropItEnd;
- speed = norm(linearVel) * SG_METER_TO_NM * 3600.0;
+ speed = norm(ecLinearVel) * SG_METER_TO_NM * 3600.0;
firstPropIt = it->second.properties.begin();
firstPropItEnd = it->second.properties.end();
while (firstPropIt != firstPropItEnd) {
roll = rDeg;
pitch = pDeg;
+ // expose velocities/u,v,wbody-fps in the mp tree
+ _uBodyNode->setValue(ecLinearVel[0] * SG_METER_TO_FEET);
+ _vBodyNode->setValue(ecLinearVel[1] * SG_METER_TO_FEET);
+ _wBodyNode->setValue(ecLinearVel[2] * SG_METER_TO_FEET);
+
SG_LOG(SG_AI, SG_DEBUG, "Multiplayer position and orientation: "
<< ecPos << ", " << hlOr);