X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIMultiplayer.cxx;h=a9635c5f7b5541902035b8ee508cd6fbda54f294;hb=e16f772e54216b0088ca9cb3f3b0fb062be8bfdb;hp=d2fb505c0dfa1a696d26a26e9ea2c7ec80e1bc97;hpb=a060fe3acf041f31979e587bd85c87dad9599df0;p=flightgear.git diff --git a/src/AIModel/AIMultiplayer.cxx b/src/AIModel/AIMultiplayer.cxx index d2fb505c0..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() { } @@ -63,14 +63,19 @@ bool FGAIMultiplayer::init(bool search_in_AI_path) { isTanker = true; // cout << "isTanker " << isTanker << " " << mCallSign <setBoolValue("model-installed", _installed); + return result; } void FGAIMultiplayer::bind() { FGAIBase::bind(); props->tie("refuel/contact", SGRawValuePointer(&contact)); - props->setBoolValue("tanker",isTanker); + props->tie("tanker", SGRawValuePointer(&isTanker)); props->tie("controls/invisible", SGRawValuePointer(&invisible)); @@ -102,6 +107,8 @@ void FGAIMultiplayer::unbind() { props->untie("controls/lag-adjust-system-speed"); props->untie("controls/invisible"); props->untie("refuel/contact"); + props->untie("tanker"); + } void FGAIMultiplayer::update(double dt) @@ -328,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; @@ -432,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(), @@ -460,16 +458,20 @@ void FGAIMultiplayer::update(double dt) if ( isTanker) { + //cout << "IS tanker "; if ( (range_ft2 < 250.0 * 250.0) && (y_shift > 0.0) && (elevation > 0.0) ){ // refuel_node->setBoolValue(true); + //cout << "in contact" << endl; contact = true; } else { // refuel_node->setBoolValue(false); + //cout << "not in contact" << endl; contact = false; } } else { + //cout << "NOT tanker " << endl; contact = false; } @@ -477,7 +479,7 @@ void FGAIMultiplayer::update(double dt) } void -FGAIMultiplayer::addMotionInfo(const FGExternalMotionData& motionInfo, +FGAIMultiplayer::addMotionInfo(FGExternalMotionData& motionInfo, long stamp) { mLastTimestamp = stamp; @@ -494,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