X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIMultiplayer.cxx;h=0b73c9ba4d7eb1874fd1972d877a9d3acd6c27ca;hb=afcdbd3158503773644aa07dd86cd92d67946bd4;hp=0652dfef73751daf52f67997d72028ef2e6ad916;hpb=8962477cfa10850cb459d7de754c9a435cc91293;p=flightgear.git diff --git a/src/AIModel/AIMultiplayer.cxx b/src/AIModel/AIMultiplayer.cxx index 0652dfef7..0b73c9ba4 100644 --- a/src/AIModel/AIMultiplayer.cxx +++ b/src/AIModel/AIMultiplayer.cxx @@ -29,21 +29,21 @@ #include "AIMultiplayer.hxx" -#include // #define SG_DEBUG SG_ALERT -FGAIMultiplayer::FGAIMultiplayer() : FGAIBase(otMultiplayer) { +FGAIMultiplayer::FGAIMultiplayer() : + FGAIBase(otMultiplayer, false) +{ no_roll = false; mTimeOffsetSet = false; mAllowExtrapolation = true; mLagAdjustSystemSpeed = 10; + mLastTimestamp = 0; + lastUpdateTime = 0; - aip.getSceneGraph()->setNodeMask(~SG_NODEMASK_TERRAIN_BIT); - -} - +} FGAIMultiplayer::~FGAIMultiplayer() { } @@ -74,10 +74,10 @@ bool FGAIMultiplayer::init(bool search_in_AI_path) { void FGAIMultiplayer::bind() { FGAIBase::bind(); - props->tie("refuel/contact", SGRawValuePointer(&contact)); - props->tie("tanker", SGRawValuePointer(&isTanker)); + tie("refuel/contact", SGRawValuePointer(&contact)); + tie("tanker", SGRawValuePointer(&isTanker)); - props->tie("controls/invisible", + tie("controls/invisible", SGRawValuePointer(&invisible)); #define AIMPROProp(type, name) \ @@ -87,30 +87,18 @@ SGRawValueMethods(*this, &FGAIMultiplayer::get##name) SGRawValueMethods(*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; @@ -151,7 +139,7 @@ void FGAIMultiplayer::update(double dt) if ((!mAllowExtrapolation && offset + lag < mTimeOffset) || (offset - 10 > mTimeOffset)) { mTimeOffset = offset; - SG_LOG(SG_GENERAL, SG_DEBUG, "Resetting time offset adjust system to " + SG_LOG(SG_AI, SG_DEBUG, "Resetting time offset adjust system to " "avoid extrapolation: time offset = " << mTimeOffset); } else { // the error of the offset, respectively the negative error to avoid @@ -178,7 +166,7 @@ void FGAIMultiplayer::update(double dt) systemIncrement = err; mTimeOffset += systemIncrement; - SG_LOG(SG_GENERAL, SG_DEBUG, "Offset adjust system: time offset = " + SG_LOG(SG_AI, SG_DEBUG, "Offset adjust system: time offset = " << mTimeOffset << ", expected longitudinal position error due to " " current adjustment of the offset: " << fabs(norm(it->second.linearVel)*systemIncrement)); @@ -200,7 +188,7 @@ void FGAIMultiplayer::update(double dt) // Find the first packet before the target time MotionInfo::iterator nextIt = mMotionInfo.upper_bound(tInterp); if (nextIt == mMotionInfo.begin()) { - SG_LOG(SG_GENERAL, SG_DEBUG, "Taking oldest packet!"); + SG_LOG(SG_AI, SG_DEBUG, "Taking oldest packet!"); // We have no packet before the target time, just use the first one MotionInfo::iterator firstIt = mMotionInfo.begin(); ecPos = firstIt->second.position; @@ -243,7 +231,7 @@ void FGAIMultiplayer::update(double dt) } else { - SG_LOG(SG_GENERAL, SG_DEBUG, "Unable to find property: " << (*firstPropIt)->id << "\n"); + SG_LOG(SG_AI, SG_DEBUG, "Unable to find property: " << (*firstPropIt)->id << "\n"); } ++firstPropIt; } @@ -260,7 +248,7 @@ void FGAIMultiplayer::update(double dt) double intervalLen = intervalEnd - intervalStart; double tau = (tInterp - intervalStart)/intervalLen; - SG_LOG(SG_GENERAL, SG_DEBUG, "Multiplayer vehicle interpolation: [" + SG_LOG(SG_AI, SG_DEBUG, "Multiplayer vehicle interpolation: [" << intervalStart << ", " << intervalEnd << "], intervalLen = " << intervalLen << ", interpolation parameter = " << tau); @@ -323,7 +311,7 @@ void FGAIMultiplayer::update(double dt) } else { - SG_LOG(SG_GENERAL, SG_DEBUG, "Unable to find property: " << (*prevPropIt)->id << "\n"); + SG_LOG(SG_AI, SG_DEBUG, "Unable to find property: " << (*prevPropIt)->id << "\n"); } ++prevPropIt; @@ -347,7 +335,7 @@ void FGAIMultiplayer::update(double dt) double t = tInterp - motionInfo.time; t = SGMisc::min(t, 5); - SG_LOG(SG_GENERAL, SG_DEBUG, "Multiplayer vehicle extrapolation: " + SG_LOG(SG_AI, SG_DEBUG, "Multiplayer vehicle extrapolation: " "extrapolation time = " << t); // Do a few explicit euler steps with the constant acceleration's @@ -408,7 +396,7 @@ void FGAIMultiplayer::update(double dt) } else { - SG_LOG(SG_GENERAL, SG_DEBUG, "Unable to find property: " << (*firstPropIt)->id << "\n"); + SG_LOG(SG_AI, SG_DEBUG, "Unable to find property: " << (*firstPropIt)->id << "\n"); } ++firstPropIt; @@ -417,8 +405,21 @@ void FGAIMultiplayer::update(double dt) // extract the position pos = SGGeod::fromCart(ecPos); + double recent_alt_ft = altitude_ft; altitude_ft = pos.getElevationFt(); + // expose a valid vertical speed + if (lastUpdateTime != 0) + { + double dT = curtime - lastUpdateTime; + double Weighting=1; + if (dt < 1.0) + Weighting = dt; + // simple smoothing over 1 second + vs = (1.0-Weighting)*vs + Weighting * (altitude_ft - recent_alt_ft) / dT * 60; + } + lastUpdateTime = curtime; + // The quaternion rotating from the earth centered frame to the // horizontal local frame SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)pos.getLongitudeRad(), @@ -431,7 +432,7 @@ void FGAIMultiplayer::update(double dt) roll = rDeg; pitch = pDeg; - SG_LOG(SG_GENERAL, SG_DEBUG, "Multiplayer position and orientation: " + SG_LOG(SG_AI, SG_DEBUG, "Multiplayer position and orientation: " << ecPos << ", " << hlOr); //###########################//