X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIMultiplayer.cxx;h=a9635c5f7b5541902035b8ee508cd6fbda54f294;hb=38226af24ec01e8f0a20d7fd73ef838a69f6ef25;hp=476ddf205b54e1de4f3aa71ac315dab62ff240df;hpb=2ea50c63bbb95e143662de2f136c79898236e38d;p=flightgear.git diff --git a/src/AIModel/AIMultiplayer.cxx b/src/AIModel/AIMultiplayer.cxx index 476ddf205..a9635c5f7 100644 --- a/src/AIModel/AIMultiplayer.cxx +++ b/src/AIModel/AIMultiplayer.cxx @@ -39,11 +39,11 @@ FGAIMultiplayer::FGAIMultiplayer() : FGAIBase(otMultiplayer) { mTimeOffsetSet = false; mAllowExtrapolation = true; mLagAdjustSystemSpeed = 10; - + mLastTimestamp = 0; aip.getSceneGraph()->setNodeMask(~SG_NODEMASK_TERRAIN_BIT); + lastUpdateTime = 0; -} - +} FGAIMultiplayer::~FGAIMultiplayer() { } @@ -335,35 +335,13 @@ void FGAIMultiplayer::update(double dt) if (prevIt != mMotionInfo.begin()) { --prevIt; - - MotionInfo::iterator delIt; - delIt = mMotionInfo.begin(); - - while (delIt != prevIt) - { - std::vector::const_iterator propIt; - std::vector::const_iterator propItEnd; - propIt = delIt->second.properties.begin(); - propItEnd = delIt->second.properties.end(); - - //cout << "Deleting data\n"; - - while (propIt != propItEnd) - { - delete *propIt; - propIt++; - } - - delIt++; - } - mMotionInfo.erase(mMotionInfo.begin(), prevIt); } } } else { // Ok, we need to predict the future, so, take the best data we can have // and do some eom computation to guess that for now. - FGExternalMotionData motionInfo = it->second; + FGExternalMotionData& motionInfo = it->second; // The time to predict, limit to 5 seconds double t = tInterp - motionInfo.time; @@ -439,8 +417,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(), @@ -488,7 +479,7 @@ void FGAIMultiplayer::update(double dt) } void -FGAIMultiplayer::addMotionInfo(const FGExternalMotionData& motionInfo, +FGAIMultiplayer::addMotionInfo(FGExternalMotionData& motionInfo, long stamp) { mLastTimestamp = stamp; @@ -505,6 +496,9 @@ FGAIMultiplayer::addMotionInfo(const FGExternalMotionData& motionInfo, return; } mMotionInfo[motionInfo.time] = motionInfo; + // We just copied the property (pointer) list - they are ours now. Clear the + // properties list in given/returned object, so former owner won't deallocate them. + motionInfo.properties.clear(); } void