diff --git a/indra/llinventory/llsettingsbase.h b/indra/llinventory/llsettingsbase.h index 9e030528926825dba459f060e44add5a2a8b422c..45d2fa002743fb70eddfe5961ce7e08e8b2f251a 100644 --- a/indra/llinventory/llsettingsbase.h +++ b/indra/llinventory/llsettingsbase.h @@ -519,6 +519,7 @@ class LLSettingsBlenderTimeDelta : public LLSettingsBlender inline void setIgnoreTimeDeltaThreshold(bool val) { mIgnoreTimeDelta = val; } inline bool getIgnoreTimeDeltaThreshold() const { return mIgnoreTimeDelta; } + inline void setTimeSpent(LLSettingsBase::Seconds time) { mTimeSpent = time; } protected: LLSettingsBase::BlendFactor calculateBlend(const LLSettingsBase::TrackPosition& spanpos, const LLSettingsBase::TrackPosition& spanlen) const; diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index bf8cf4b552b96a9a12f143e29d3107ab24ef237b..fa583bdc9c893097bc0c34975884210811730335 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -170,6 +170,20 @@ namespace return llclamp(position, 0.0f, 1.0f); } + inline LLSettingsBase::BlendFactor convert_time_to_blend_factor(const LLSettingsBase::Seconds& time, const LLSettingsBase::Seconds& len, LLSettingsDay::CycleTrack_t &track) + { + LLSettingsBase::TrackPosition position = convert_time_to_position(time, len); + LLSettingsDay::TrackBound_t bounds(get_bounding_entries(track, position)); + + LLSettingsBase::TrackPosition spanlength(get_wrapping_distance((*bounds.first).first, (*bounds.second).first)); + if (position < (*bounds.first).first) + position += 1.0; + + LLSettingsBase::TrackPosition start = position - (*bounds.first).first; + + return static_cast<LLSettingsBase::BlendFactor>(start / spanlength); + } + //--------------------------------------------------------------------- class LLTrackBlenderLoopingTime : public LLSettingsBlenderTimeDelta { @@ -186,12 +200,14 @@ namespace // must happen prior to getBoundingEntries call... mTrackNo = selectTrackNumber(trackno); - LLSettingsDay::TrackBound_t initial = getBoundingEntries(getAdjustedNow()); + LLSettingsBase::Seconds now(getAdjustedNow()); + LLSettingsDay::TrackBound_t initial = getBoundingEntries(now); mInitial = (*initial.first).second; mFinal = (*initial.second).second; mBlendSpan = getSpanTime(initial); + initializeTarget(now); setOnFinished([this](const LLSettingsBlender::ptr_t &){ onFinishedSpan(); }); } @@ -248,6 +264,16 @@ namespace return bounds; } + void initializeTarget(LLSettingsBase::Seconds time) + { + LLSettingsBase::BlendFactor blendf(convert_time_to_blend_factor(time, mCycleLength, mDay->getCycleTrack(mTrackNo))); + + blendf = llclamp(blendf, 0.0, 0.999); + setTimeSpent(LLSettingsBase::Seconds(blendf * mBlendSpan)); + + setBlendFactor(blendf); + } + LLSettingsBase::Seconds getAdjustedNow() const { LLSettingsBase::Seconds now(LLDate::now().secondsSinceEpoch());