From 6a54e0948d651963399da82cfc5672125b9442e7 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <alihatskiy@productengine.com>
Date: Wed, 8 Aug 2018 03:28:37 +0300
Subject: MAINT-8900 LLVirtualTrackball improvement: added click-to-set mode

---
 indra/llui/llvirtualtrackball.cpp                  | 73 ++++++++++++++++------
 .../default/xui/en/widgets/sun_moon_trackball.xml  |  2 +-
 2 files changed, 56 insertions(+), 19 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llvirtualtrackball.cpp b/indra/llui/llvirtualtrackball.cpp
index 0ddbe8b9c2..a24c5a420d 100644
--- a/indra/llui/llvirtualtrackball.cpp
+++ b/indra/llui/llvirtualtrackball.cpp
@@ -321,29 +321,66 @@ BOOL LLVirtualTrackball::handleHover(S32 x, S32 y, MASK mask)
 {
     if (hasMouseCapture())
     {
-        LLQuaternion delta;
-
-        F32 rotX = x - mPrevX;
-        F32 rotY = y - mPrevY;
-
-        if (abs(rotX) > 1)
-        {
-            F32 direction = (rotX < 0) ? -1 : 1;
-            delta.setAngleAxis(mIncrementMouse * abs(rotX), 0, direction, 0);  // changing X - rotate around Y axis
-            mValue *= delta;
+        if (mask == MASK_CONTROL)
+        { // trackball (move to roll) mode
+            LLQuaternion delta;
+
+            F32 rotX = x - mPrevX;
+            F32 rotY = y - mPrevY;
+
+            if (abs(rotX) > 1)
+            {
+                F32 direction = (rotX < 0) ? -1 : 1;
+                delta.setAngleAxis(mIncrementMouse * abs(rotX), 0, direction, 0);  // changing X - rotate around Y axis
+                mValue *= delta;
+            }
+
+            if (abs(rotY) > 1)
+            {
+                F32 direction = (rotY < 0) ? 1 : -1; // reverse for Y (value increases from bottom to top)
+                delta.setAngleAxis(mIncrementMouse * abs(rotY), direction, 0, 0);  // changing Y - rotate around X axis
+                mValue *= delta;
+            }
         }
-
-        if (abs(rotY) > 1)
-        {
-            F32 direction = (rotY < 0) ? 1 : -1; // reverse for Y (value increases from bottom to top)
-            delta.setAngleAxis(mIncrementMouse * abs(rotY), direction, 0, 0);  // changing Y - rotate around X axis
-            mValue *= delta;
+        else
+        { // set on click mode
+            if (!pointInTouchCircle(x, y))
+            {
+                return TRUE; // don't drag outside the circle
+            }
+
+            F32 radius = mTouchArea->getRect().getWidth() / 2;
+            F32 xx = x - mTouchArea->getRect().getCenterX();
+            F32 yy = y - mTouchArea->getRect().getCenterY();
+            F32 dist = sqrt(pow(xx, 2) + pow(yy, 2));
+
+            F32 azimuth = llclamp(acosf(xx / dist), 0.0f, F_PI);
+            F32 altitude = llclamp(acosf(dist / radius), 0.0f, F_PI_BY_TWO);
+
+            if (yy < 0)
+            {
+                azimuth = F_TWO_PI - azimuth;
+            }
+
+            LLVector3 draw_point = VectorZero * mValue;
+            if (draw_point.mV[VZ] >= 0.f)
+            {
+                if (is_approx_zero(altitude)) // don't change the hemisphere
+                {
+                    altitude = F_APPROXIMATELY_ZERO;
+                }
+                altitude *= -1;
+            }
+
+            mValue.setAngleAxis(altitude, 0, 1, 0);
+            LLQuaternion az_quat;
+            az_quat.setAngleAxis(azimuth, 0, 0, 1);
+            mValue *= az_quat;
         }
-        
-        onCommit();
 
         mPrevX = x;
         mPrevY = y;
+        onCommit();
     }
     return TRUE;
 }
diff --git a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml
index 68681b8228..3a9655b317 100644
--- a/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml
+++ b/indra/newview/skins/default/xui/en/widgets/sun_moon_trackball.xml
@@ -4,7 +4,7 @@
     width="150"
     height="150"
     user_resize="false"     
-    increment_angle_mouse="0.5f"
+    increment_angle_mouse="1.5f"
     increment_angle_btn="3.0f"    
     image_sphere="VirtualTrackball_Sphere"
     image_moon_back="VirtualTrackball_Moon_Back"
-- 
cgit v1.2.3


From 51abc168c03f80d63c85d4bb48624f440b585390 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Fri, 3 Aug 2018 21:01:43 +0300
Subject: MAINT-8902 fix encroaching 'legacy' issues

---
 indra/llinventory/llsettingsdaycycle.cpp           | 106 ++++++++++++++++++++-
 indra/llinventory/llsettingsdaycycle.h             |   4 +-
 indra/llui/llmultislider.cpp                       |  27 +++++-
 indra/llui/llmultislider.h                         |   2 +
 indra/llui/llmultisliderctrl.cpp                   |   2 +
 indra/llui/llmultisliderctrl.h                     |   1 +
 indra/newview/llfloatereditextdaycycle.cpp         |  20 ++--
 indra/newview/llfloatereditextdaycycle.h           |   2 +-
 indra/newview/llsettingsvo.cpp                     |   3 +-
 .../default/xui/en/floater_edit_ext_day_cycle.xml  |   1 +
 10 files changed, 151 insertions(+), 17 deletions(-)

(limited to 'indra')

diff --git a/indra/llinventory/llsettingsdaycycle.cpp b/indra/llinventory/llsettingsdaycycle.cpp
index ff9614fb10..320e090bfd 100644
--- a/indra/llinventory/llsettingsdaycycle.cpp
+++ b/indra/llinventory/llsettingsdaycycle.cpp
@@ -118,8 +118,12 @@ const S32 LLSettingsDay::TRACK_WATER(0);   // water track is 0
 const S32 LLSettingsDay::TRACK_MAX(5);     // 5 tracks, 4 skys, 1 water
 const S32 LLSettingsDay::FRAME_MAX(56);
 
+const F32 LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR(0.02501f);
+
 const LLUUID LLSettingsDay::DEFAULT_ASSET_ID("283a26a3-b147-47b7-8057-cfff0302ec0e");
 
+// Minimum value to prevent multislider in edit floaters from eating up frames that 'encroach' on one another's space
+static const F32 DEFAULT_MULTISLIDER_INCREMENT(0.005f);
 //=========================================================================
 LLSettingsDay::LLSettingsDay(const LLSD &data) :
     LLSettingsBase(data),
@@ -185,7 +189,7 @@ LLSD LLSettingsDay::getSettings() const
     return settings;
 }
 
-bool LLSettingsDay::initialize()
+bool LLSettingsDay::initialize(bool validate_frames)
 {
     LLSD tracks = mSettings[SETTING_TRACKS];
     LLSD frames = mSettings[SETTING_FRAMES];
@@ -263,6 +267,106 @@ bool LLSettingsDay::initialize()
                 else
                     hassky |= true;
 
+                if (validate_frames && mDayTracks[i].size() > 0)
+                {
+                    // check if we hit close to anything in the list
+                    LLSettingsDay::CycleTrack_t::value_type frame = getSettingsNearKeyframe(keyframe, i, DEFAULT_FRAME_SLOP_FACTOR);
+                    if (frame.second)
+                    {
+                        // figure out direction of search
+                        LLSettingsBase::TrackPosition found = frame.first;
+                        LLSettingsBase::TrackPosition new_frame = keyframe;
+                        F32 total_frame_shift = 0;
+                        // We consider frame DEFAULT_FRAME_SLOP_FACTOR away as still encroaching, so add minimum increment
+                        F32 move_factor = DEFAULT_FRAME_SLOP_FACTOR + DEFAULT_MULTISLIDER_INCREMENT;
+                        bool move_forward = true;
+                        if ((new_frame < found && (found - new_frame) <= DEFAULT_FRAME_SLOP_FACTOR)
+                            || (new_frame > found && (new_frame - found) > DEFAULT_FRAME_SLOP_FACTOR))
+                        {
+                            move_forward = false;
+                        }
+
+                        if (move_forward)
+                        {
+                            CycleTrack_t::iterator iter = mDayTracks[i].find(found);
+                            new_frame = found; // for total_frame_shift
+                            while (total_frame_shift < 1)
+                            {
+                                // calculate shifted position from previous found point
+                                total_frame_shift += move_factor + (found >= new_frame ? found : found + 1) - new_frame;
+                                new_frame = found + move_factor;
+                                if (new_frame > 1) new_frame--;
+
+                                // we know that current point is too close, go for next one
+                                iter++;
+                                if (iter == mDayTracks[i].end())
+                                {
+                                    iter = mDayTracks[i].begin();
+                                }
+
+                                if ((iter->first >= (new_frame - DEFAULT_MULTISLIDER_INCREMENT) && (new_frame + DEFAULT_FRAME_SLOP_FACTOR) >= iter->first)
+                                    || iter->first < new_frame && (new_frame + DEFAULT_FRAME_SLOP_FACTOR) >= (iter->first + 1))
+                                {
+                                    // we are encroaching at new point as well
+                                    found = iter->first;
+                                }
+                                else // (new_frame + DEFAULT_FRAME_SLOP_FACTOR < iter->first)
+                                {
+                                    //we found clear spot
+                                    break;
+                                }
+                            }
+                        }
+                        else
+                        {
+                            CycleTrack_t::reverse_iterator iter = mDayTracks[i].rbegin();
+                            while (iter->first != found)
+                            {
+                                iter++;
+                            }
+                            new_frame = found; // for total_frame_shift
+                            while (total_frame_shift < 1)
+                            {
+                                // calculate shifted position from current found point
+                                total_frame_shift += move_factor + new_frame - (found <= new_frame ? found : found - 1);
+                                new_frame = found - move_factor;
+                                if (new_frame < 0) new_frame++;
+
+                                // we know that current point is too close, go for next one
+                                iter++;
+                                if (iter == mDayTracks[i].rend())
+                                {
+                                    iter = mDayTracks[i].rbegin();
+                                }
+
+                                if ((iter->first <= (new_frame + DEFAULT_MULTISLIDER_INCREMENT) && (new_frame - DEFAULT_FRAME_SLOP_FACTOR) <= iter->first)
+                                    || iter->first > new_frame && (new_frame - DEFAULT_FRAME_SLOP_FACTOR) <= (iter->first - 1))
+                                {
+                                    // we are encroaching at new point as well
+                                    found = iter->first;
+                                }
+                                else // (new_frame - DEFAULT_FRAME_SLOP_FACTOR > iter->first)
+                                {
+                                    //we found clear spot
+                                    break;
+                                }
+                            }
+
+
+                        }
+
+                        if (total_frame_shift >= 1)
+                        {
+                            LL_WARNS() << "Could not fix frame position, adding as is to position: " << keyframe << LL_ENDL;
+                        }
+                        else
+                        {
+                            // Mark as new position
+                            keyframe = new_frame;
+                        }
+                    }
+                }
+
                 // Build clone since:
                 // - can use settings from "used" multiple times
                 // - settings can reuse LLSDs they were initialized from
diff --git a/indra/llinventory/llsettingsdaycycle.h b/indra/llinventory/llsettingsdaycycle.h
index 484c59e57f..974ca8660d 100644
--- a/indra/llinventory/llsettingsdaycycle.h
+++ b/indra/llinventory/llsettingsdaycycle.h
@@ -63,6 +63,8 @@ public:
     static const S32     TRACK_MAX;
     static const S32     FRAME_MAX;
 
+    static const F32     DEFAULT_FRAME_SLOP_FACTOR;
+
     static const LLUUID DEFAULT_ASSET_ID;
 
     typedef std::map<LLSettingsBase::TrackPosition, LLSettingsBase::ptr_t>  CycleTrack_t;
@@ -76,7 +78,7 @@ public:
     LLSettingsDay(const LLSD &data);
     virtual ~LLSettingsDay() { };
 
-    bool                        initialize();
+    bool                        initialize(bool validate_frames = false);
 
     virtual ptr_t               buildClone() = 0;
     virtual LLSD                getSettings() const SETTINGS_OVERRIDE;
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index cd9c77585a..725f1e8f65 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -41,6 +41,8 @@
 
 static LLDefaultChildRegistry::Register<LLMultiSlider> r("multi_slider_bar");
 
+const F32 FLOAT_THRESHOLD = 0.00001f;
+
 S32 LLMultiSlider::mNameCounter = 0;
 
 LLMultiSlider::SliderParams::SliderParams()
@@ -52,6 +54,7 @@ LLMultiSlider::SliderParams::SliderParams()
 LLMultiSlider::Params::Params()
 :	max_sliders("max_sliders", 1),
 	allow_overlap("allow_overlap", false),
+	loop_overlap("loop_overlap", false),
 	overlap_threshold("overlap_threshold", 0),
 	draw_track("draw_track", true),
 	use_triangle("use_triangle", false),
@@ -73,6 +76,7 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
 	mDragStartThumbRect( 0, getRect().getHeight(), p.thumb_width, 0 ),
 	mMaxNumSliders(p.max_sliders),
 	mAllowOverlap(p.allow_overlap),
+	mLoopOverlap(p.loop_overlap),
 	mDrawTrack(p.draw_track),
 	mUseTriangle(p.use_triangle),
 	mTrackColor(p.track_color()),
@@ -151,7 +155,14 @@ void LLMultiSlider::setSliderValue(const std::string& name, F32 value, BOOL from
 		// look at the current spot
 		// and see if anything is there
 		LLSD::map_iterator mIt = mValue.beginMap();
-		F32 threshold = mOverlapThreshold + (mIncrement / 4); // increment is our distance between points, use to eliminate round error
+
+		// increment is our distance between points, use to eliminate round error
+		F32 threshold = mOverlapThreshold + (mIncrement / 4);
+		// If loop overlap is enabled, check if we overlap with points 'after' max value (project to lower)
+		F32 loop_up_check = (mLoopOverlap && (value + threshold) > mMaxValue) ? (value + threshold - mMaxValue + mMinValue) : 0.0f;
+		// If loop overlap is enabled, check if we overlap with points 'before' min value (project to upper)
+		F32 loop_down_check = (mLoopOverlap && (value - threshold) < mMinValue) ? (value - threshold - mMinValue + mMaxValue) : 0.0f;
+
 		for(;mIt != mValue.endMap(); mIt++) {
 			
 			F32 testVal = (F32)mIt->second.asReal() - newValue;
@@ -162,6 +173,18 @@ void LLMultiSlider::setSliderValue(const std::string& name, F32 value, BOOL from
 				hit = true;
 				break;
 			}
+			if (loop_up_check != 0
+				&& testVal < loop_up_check)
+			{
+				hit = true;
+				break;
+			}
+			if (loop_down_check != 0
+				&& testVal > loop_down_check)
+			{
+				hit = true;
+				break;
+			}
 		}
 
 		// if none found, stop
@@ -311,7 +334,7 @@ bool LLMultiSlider::findUnusedValue(F32& initVal)
 
 		// look at the current spot
 		// and see if anything is there
-		F32 threshold = mOverlapThreshold + (mIncrement / 4);
+		F32 threshold = mAllowOverlap ? FLOAT_THRESHOLD : mOverlapThreshold + (mIncrement / 4);
 		LLSD::map_iterator mIt = mValue.beginMap();
 		for(;mIt != mValue.endMap(); mIt++) {
 			
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index 9281b68406..eff0c7d2d7 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -47,6 +47,7 @@ public:
 		Optional<S32>	max_sliders;
 
 		Optional<bool>	allow_overlap,
+						loop_overlap,
 						draw_track,
 						use_triangle;
 
@@ -109,6 +110,7 @@ protected:
 
 	S32				mMaxNumSliders;
 	BOOL			mAllowOverlap;
+	BOOL			mLoopOverlap;
 	F32				mOverlapThreshold;
 	BOOL			mDrawTrack;
 	BOOL			mUseTriangle;			/// hacked in toggle to use a triangle
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index d2afca19b7..4c2936eb69 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -53,6 +53,7 @@ LLMultiSliderCtrl::Params::Params()
 	can_edit_text("can_edit_text", false),
 	max_sliders("max_sliders", 1),
 	allow_overlap("allow_overlap", false),
+	loop_overlap("loop_overlap", false),
 	overlap_threshold("overlap_threshold", 0),
 	draw_track("draw_track", true),
 	use_triangle("use_triangle", false),
@@ -168,6 +169,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
 	params.increment(p.increment);
 	params.max_sliders(p.max_sliders);
 	params.allow_overlap(p.allow_overlap);
+	params.loop_overlap(p.loop_overlap);
 	if (p.overlap_threshold.isProvided())
 	{
 		params.overlap_threshold = p.overlap_threshold;
diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h
index 507115f5e1..0ce21c0612 100644
--- a/indra/llui/llmultisliderctrl.h
+++ b/indra/llui/llmultisliderctrl.h
@@ -54,6 +54,7 @@ public:
 		Optional<S32>			decimal_digits;
 		Optional<S32>			max_sliders;	
 		Optional<bool>			allow_overlap,
+								loop_overlap,
 								draw_track,
 								use_triangle;
 
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index cbdc026cfe..dc882141db 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -107,8 +107,6 @@ namespace {
     const std::string ACTION_APPLY_REGION("apply_region");
 
     const F32 DAY_CYCLE_PLAY_TIME_SECONDS = 60;
-
-    const F32 FRAME_SLOP_FACTOR = 0.0251f;
 }
 
 //=========================================================================
@@ -407,7 +405,7 @@ void LLFloaterEditExtDayCycle::onAddTrack()
 {
     LLSettingsBase::Seconds frame(mTimeSlider->getCurSliderValue());
     LLSettingsBase::ptr_t setting;
-    if ((mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, FRAME_SLOP_FACTOR)).second)
+    if ((mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
     {
         LL_WARNS("ENVIRONMENT") << "Attempt to add new frame too close to existing frame." << LL_ENDL;
         return;
@@ -512,7 +510,7 @@ void LLFloaterEditExtDayCycle::onFrameSliderCallback(const LLSD &data)
             {
                 // don't move the point/frame as long as shift is pressed and user is attempting to copy
                 // handleKeyUp will do the move if user releases key too early.
-                if (!(mEditDay->getSettingsNearKeyframe(sliderpos, mCurrentTrack, FRAME_SLOP_FACTOR)).second)
+                if (!(mEditDay->getSettingsNearKeyframe(sliderpos, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
                 {
                     LL_DEBUGS() << "Copying frame from " << it->second.mFrame << " to " << sliderpos << LL_ENDL;
                     LLSettingsBase::ptr_t new_settings;
@@ -584,7 +582,7 @@ void LLFloaterEditExtDayCycle::onFrameSliderMouseDown(S32 x, S32 y, MASK mask)
 
         LL_WARNS("LAPRAS") << "Selected vs mouse delta = " << (sliderval - sliderpos) << LL_ENDL;
 
-        if (fabs(sliderval - sliderpos) > FRAME_SLOP_FACTOR)
+        if (fabs(sliderval - sliderpos) > LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)
         {
             mFramesSlider->resetCurSlider();
         }
@@ -598,12 +596,12 @@ void LLFloaterEditExtDayCycle::onFrameSliderMouseUp(S32 x, S32 y, MASK mask)
 
     LL_WARNS("LAPRAS") << "  UP: X=" << x << "  Y=" << y << " MASK=" << mask << " Position=" << sliderpos << LL_ENDL;
     mTimeSlider->setCurSliderValue(sliderpos);
-    selectFrame(sliderpos, FRAME_SLOP_FACTOR);
+    selectFrame(sliderpos, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
 }
 
 void LLFloaterEditExtDayCycle::onTimeSliderMoved()
 {
-    selectFrame(mTimeSlider->getCurSliderValue(), FRAME_SLOP_FACTOR);
+    selectFrame(mTimeSlider->getCurSliderValue(), LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
 }
 
 void LLFloaterEditExtDayCycle::selectTrack(U32 track_index, bool force )
@@ -785,7 +783,7 @@ void LLFloaterEditExtDayCycle::updateSlider()
         mLastFrameSlider.clear();
     }
 
-    selectFrame(frame_position, FRAME_SLOP_FACTOR);
+    selectFrame(frame_position, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
 }
 
 void LLFloaterEditExtDayCycle::updateTimeAndLabel()
@@ -979,7 +977,7 @@ void LLFloaterEditExtDayCycle::synchronizeTabs()
         {
             canedit = !mIsPlaying;
             // either search mEditDay or retrieve from mSliderKeyMap
-            LLSettingsDay::CycleTrack_t::value_type found = mEditDay->getSettingsNearKeyframe(frame, LLSettingsDay::TRACK_WATER, FRAME_SLOP_FACTOR);
+            LLSettingsDay::CycleTrack_t::value_type found = mEditDay->getSettingsNearKeyframe(frame, LLSettingsDay::TRACK_WATER, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
             psettingW = std::static_pointer_cast<LLSettingsWater>(found.second);
         }
         mCurrentEdit = psettingW;
@@ -1007,7 +1005,7 @@ void LLFloaterEditExtDayCycle::synchronizeTabs()
         {
             canedit = !mIsPlaying;
             // either search mEditDay or retrieve from mSliderKeyMap
-            LLSettingsDay::CycleTrack_t::value_type found = mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, FRAME_SLOP_FACTOR);
+            LLSettingsDay::CycleTrack_t::value_type found = mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
             psettingS = std::static_pointer_cast<LLSettingsSky>(found.second);
         }
         mCurrentEdit = psettingS;
@@ -1218,7 +1216,7 @@ void LLFloaterEditExtDayCycle::stopPlay()
     gIdleCallbacks.deleteFunction(onIdlePlay, this);
     mPlayTimer.stop();
     F32 frame = mTimeSlider->getCurSliderValue();
-    selectFrame(frame, FRAME_SLOP_FACTOR);
+    selectFrame(frame, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
 
     getChild<LLView>("play_layout", true)->setVisible(TRUE);
     getChild<LLView>("pause_layout", true)->setVisible(FALSE);
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index f29d5b55ca..0607d35d4a 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -110,7 +110,7 @@ private:
 	void                        setWaterTabsEnabled(BOOL enable);
 	void                        setSkyTabsEnabled(BOOL enable);
 	void                        updateButtons();
-	void                        updateSlider(); //track to slider
+	void                        updateSlider(); //generate sliders from current track
 	void                        updateTimeAndLabel();
 	void                        addSliderFrame(const F32 frame, LLSettingsBase::ptr_t &setting, bool update_ui = true);
 	void                        removeCurrentSliderFrame();
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index e464f3f8ef..80797ae21c 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -1025,7 +1025,8 @@ LLSettingsDay::ptr_t LLSettingsVODay::buildFromLegacyMessage(const LLUUID &regio
     
     if (dayp)
     {
-        dayp->initialize();
+        // true for validation - either validate here, or when cloning for floater.
+        dayp->initialize(true);
     }
     return dayp;
 }
diff --git a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
index 50212fdf80..5e38a289c9 100644
--- a/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
+++ b/indra/newview/skins/default/xui/en/floater_edit_ext_day_cycle.xml
@@ -240,6 +240,7 @@
                                 height="10"
                                 increment="0.005"
                                 overlap_threshold="0.026"
+                                loop_overlap="true"
                                 initial_value="0"
                                 layout="topleft"
                                 left="10"
-- 
cgit v1.2.3


From 881ee670d92f13ac518a74e1bff81bf69e07ccfa Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 8 Aug 2018 15:41:28 -0700
Subject: Fix for mac build MAINT-8870, MAINT-8871: When legacy windlight fails
 load the default day cycle asset and use that.

---
 indra/llinventory/llsettingsdaycycle.cpp |  4 ++--
 indra/newview/llenvironment.cpp          | 23 ++++++++++++++++-------
 indra/newview/llenvironment.h            |  3 ++-
 indra/newview/llwlhandlers.cpp           |  7 +++++--
 4 files changed, 25 insertions(+), 12 deletions(-)

(limited to 'indra')

diff --git a/indra/llinventory/llsettingsdaycycle.cpp b/indra/llinventory/llsettingsdaycycle.cpp
index 320e090bfd..84ef145913 100644
--- a/indra/llinventory/llsettingsdaycycle.cpp
+++ b/indra/llinventory/llsettingsdaycycle.cpp
@@ -304,8 +304,8 @@ bool LLSettingsDay::initialize(bool validate_frames)
                                     iter = mDayTracks[i].begin();
                                 }
 
-                                if ((iter->first >= (new_frame - DEFAULT_MULTISLIDER_INCREMENT) && (new_frame + DEFAULT_FRAME_SLOP_FACTOR) >= iter->first)
-                                    || iter->first < new_frame && (new_frame + DEFAULT_FRAME_SLOP_FACTOR) >= (iter->first + 1))
+                                if (((iter->first >= (new_frame - DEFAULT_MULTISLIDER_INCREMENT)) && ((new_frame + DEFAULT_FRAME_SLOP_FACTOR) >= iter->first))
+                                    || ((iter->first < new_frame) && ((new_frame + DEFAULT_FRAME_SLOP_FACTOR) >= (iter->first + 1))))
                                 {
                                     // we are encroaching at new point as well
                                     found = iter->first;
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 8f6a94962f..b2bd20d809 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -423,13 +423,17 @@ void LLEnvironment::onLegacyRegionSettings(LLSD data)
     LLUUID regionId = data[0]["regionID"].asUUID();
 
     LLSettingsDay::ptr_t regionday;
-    if (data[1].isUndefined())
-        regionday = LLSettingsVODay::buildDefaultDayCycle();
-    else
+    if (!data[1].isUndefined())
         regionday = LLSettingsVODay::buildFromLegacyMessage(regionId, data[1], data[2], data[3]);
 
     clearEnvironment(ENV_PARCEL);
-    setEnvironment(ENV_REGION, regionday, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
+    if (!regionday)
+    {
+        LL_WARNS("ENVIRONMENT") << "Unable to create day from legacy.  Using default day cycle." << LL_ENDL;
+        setEnvironment(LLEnvironment::ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
+    }
+    else
+        setEnvironment(ENV_REGION, regionday, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
 
     updateEnvironment();
 }
@@ -570,12 +574,17 @@ void LLEnvironment::setEnvironment(LLEnvironment::EnvSelection_t env, const LLSe
 
 void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId)
 {
-    LLSettingsVOBase::getSettingsAsset(assetId,
-        [this, env](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onSetEnvAssetLoaded(env, asset_id, settings, status); });
+    setEnvironment(env, assetId, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET);
+}
+
 
+void LLEnvironment::setEnvironment(EnvSelection_t env, const LLUUID &assetId, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset)
+{
+    LLSettingsVOBase::getSettingsAsset(assetId,
+        [this, env, daylength, dayoffset](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onSetEnvAssetLoaded(env, asset_id, settings, daylength, dayoffset, status); });
 }
 
-void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status)
+void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 status)
 {
     if (!settings || status)
     {
diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h
index 80d186c9e6..eba1b737c8 100644
--- a/indra/newview/llenvironment.h
+++ b/indra/newview/llenvironment.h
@@ -172,6 +172,7 @@ public:
     void                        setEnvironment(EnvSelection_t env, const LLSettingsSky::ptr_t & fixed) { setEnvironment(env, fixedEnvironment_t(fixed, LLSettingsWater::ptr_t())); }
     void                        setEnvironment(EnvSelection_t env, const LLSettingsWater::ptr_t & fixed) { setEnvironment(env, fixedEnvironment_t(LLSettingsSky::ptr_t(), fixed)); }
     void                        setEnvironment(EnvSelection_t env, const LLSettingsSky::ptr_t & fixeds, const LLSettingsWater::ptr_t & fixedw) { setEnvironment(env, fixedEnvironment_t(fixeds, fixedw)); }
+    void                        setEnvironment(EnvSelection_t env, const LLUUID &assetId, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset);
     void                        setEnvironment(EnvSelection_t env, const LLUUID &assetId);
 
     void                        clearEnvironment(EnvSelection_t env);
@@ -368,7 +369,7 @@ private:
 
     void                        onAgentPositionHasChanged(const LLVector3 &localpos);
 
-    void                        onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status);
+    void                        onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, LLSettingsDay::Seconds daylength, LLSettingsDay::Seconds dayoffset, S32 status);
     void                        onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset);
 
 };
diff --git a/indra/newview/llwlhandlers.cpp b/indra/newview/llwlhandlers.cpp
index 6aa379e0de..f0453b4d6d 100644
--- a/indra/newview/llwlhandlers.cpp
+++ b/indra/newview/llwlhandlers.cpp
@@ -80,6 +80,9 @@ bool LLEnvironmentRequest::doRequest()
 	{
 		LL_INFOS("WindlightCaps") << "Skipping windlight setting request - we don't have this capability" << LL_ENDL;
 		// region is apparently not capable of this; don't respond at all
+        // (there shouldn't be any regions where this is the case... but
+        LL_INFOS("ENVIRONMENT") << "No legacy windlight caps... just set the region to be the default day." << LL_ENDL;
+        LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_REGION, LLSettingsDay::GetDefaultAssetId());
 		return false;
 	}
 
@@ -117,8 +120,8 @@ void LLEnvironmentRequest::environmentRequestCoro(std::string url)
     if (!status)
     {
         LL_WARNS("WindlightCaps") << "Got an error, not using region windlight... " << LL_ENDL;
-        LLEnvironment::instance().onLegacyRegionSettings(LLSD());
-        
+        LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_REGION, LLSettingsDay::GetDefaultAssetId());
+
         return;
     }
     result = result["content"];
-- 
cgit v1.2.3


From 133900d31a4f75621bad070043f5ef0125708a88 Mon Sep 17 00:00:00 2001
From: Rider Linden <rider@lindenlab.com>
Date: Wed, 8 Aug 2018 16:22:04 -0700
Subject: Miss an || && in an if

---
 indra/llinventory/llsettingsdaycycle.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'indra')

diff --git a/indra/llinventory/llsettingsdaycycle.cpp b/indra/llinventory/llsettingsdaycycle.cpp
index 84ef145913..ea57c8987f 100644
--- a/indra/llinventory/llsettingsdaycycle.cpp
+++ b/indra/llinventory/llsettingsdaycycle.cpp
@@ -340,7 +340,7 @@ bool LLSettingsDay::initialize(bool validate_frames)
                                 }
 
                                 if ((iter->first <= (new_frame + DEFAULT_MULTISLIDER_INCREMENT) && (new_frame - DEFAULT_FRAME_SLOP_FACTOR) <= iter->first)
-                                    || iter->first > new_frame && (new_frame - DEFAULT_FRAME_SLOP_FACTOR) <= (iter->first - 1))
+                                    || ((iter->first > new_frame) && ((new_frame - DEFAULT_FRAME_SLOP_FACTOR) <= (iter->first - 1))))
                                 {
                                     // we are encroaching at new point as well
                                     found = iter->first;
-- 
cgit v1.2.3