////////////////////////////////////////////////////////////////////////////////////////////////
		/*--------------------------------------------------------------------------------------------*/
		public virtual void Build(ArcState pArcState, SegmentSettings pSettings, 
																		float pAngle0, float pAngle1) {
			vArcState = pArcState;
			vSettings = pSettings;
			vAngle0 = pAngle0;
			vAngle1 = pAngle1;
			vMeshSteps = (int)Math.Round(Math.Max(2, (vAngle1-vAngle0)/Math.PI*60));

			vInnerRadius = 0.17f;
			vDiameter = UiSelectRenderer.ArcCanvasThickness;

			////

			vBackground = new GameObject("Background");
			vBackground.transform.SetParent(gameObject.transform, false);
			vBackground.AddComponent<MeshFilter>();
			vBackground.AddComponent<MeshRenderer>();
			vBackground.renderer.sharedMaterial = new Material(Shader.Find("Unlit/AlphaSelfIllum"));
			vBackground.renderer.sharedMaterial.renderQueue -= 100;
			vBackground.renderer.sharedMaterial.color = Color.clear;

			BuildMesh(vBackground.GetComponent<MeshFilter>().mesh);

			////

			var labelObj = new GameObject("Label");
			labelObj.transform.SetParent(gameObject.transform, false);
			labelObj.transform.localPosition = new Vector3(0, 0, vInnerRadius);
			labelObj.transform.localScale = new Vector3(1, 1, (vArcState.IsLeft ? 1 : -1));

			vLabel = labelObj.AddComponent<UiLabel>();
			vLabel.IsLeft = vArcState.IsLeft;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////
		/*--------------------------------------------------------------------------------------------*/
		public void Awake() {
			vRootSettings = GameObject.Find("DemoEnvironment/MenuData")
				.GetComponent<HovercastCustomizationProvider>()
				.GetSegmentSettings(null);

			vHueSettings = new SegmentSettings();
			
			vHueSlider = (NavItemSlider)gameObject.GetComponent<HovercastNavItem>().GetItem();
			vHueSlider.OnValueChanged += HandleValueChanged;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////
		/*--------------------------------------------------------------------------------------------*/
		public override void Build(ArcState pArcState, SegmentState pSegState,
														float pArcAngle, SegmentSettings pSettings) {
			base.Build(pArcState, pSegState, pArcAngle, pSettings);

			vIcon = GameObject.CreatePrimitive(PrimitiveType.Quad);
			vIcon.name = "Icon";
			vIcon.transform.SetParent(gameObject.transform, false);
			vIcon.renderer.sharedMaterial = new Material(Shader.Find("Unlit/AlphaSelfIllum"));
			vIcon.renderer.sharedMaterial.color = Color.clear;
			vIcon.renderer.sharedMaterial.mainTexture = GetIconTexture();
			vIcon.transform.localRotation = vLabel.CanvasLocalRotation;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////
		/*--------------------------------------------------------------------------------------------*/
		public static SegmentSettings Fill(SegmentSettings pSrc, SegmentSettings pDest) {
			pDest.TextSize = pSrc.TextSize;
			pDest.TextColor = pSrc.TextColor;
			pDest.TextFont = pSrc.TextFont;
			pDest.ArrowIconColor = pSrc.ArrowIconColor;
			pDest.ToggleIconColor = pSrc.ToggleIconColor;
			pDest.BackgroundColor = pSrc.BackgroundColor;
			pDest.EdgeColor = pSrc.EdgeColor;
			pDest.HighlightColor = pSrc.HighlightColor;
			pDest.SelectionColor = pSrc.SelectionColor;
			pDest.SliderTrackColor = pSrc.SliderTrackColor;
			pDest.SliderFillColor = pSrc.SliderFillColor;
			pDest.SliderTickColor = pSrc.SliderTickColor;
			return pDest;
		}
 ////////////////////////////////////////////////////////////////////////////////////////////////
 /*--------------------------------------------------------------------------------------------*/
 public static SegmentSettings Fill(SegmentSettings pSrc, SegmentSettings pDest)
 {
     pDest.TextSize         = pSrc.TextSize;
     pDest.TextColor        = pSrc.TextColor;
     pDest.TextFont         = pSrc.TextFont;
     pDest.ArrowIconColor   = pSrc.ArrowIconColor;
     pDest.ToggleIconColor  = pSrc.ToggleIconColor;
     pDest.BackgroundColor  = pSrc.BackgroundColor;
     pDest.EdgeColor        = pSrc.EdgeColor;
     pDest.HighlightColor   = pSrc.HighlightColor;
     pDest.SelectionColor   = pSrc.SelectionColor;
     pDest.SliderTrackColor = pSrc.SliderTrackColor;
     pDest.SliderFillColor  = pSrc.SliderFillColor;
     pDest.SliderTickColor  = pSrc.SliderTickColor;
     return(pDest);
 }
        /*--------------------------------------------------------------------------------------------*/
        public override SegmentSettings GetSettings()
        {
            if (InheritSettings)
            {
                return(null);
            }

            if (vSettings == null)
            {
                vSettings                 = new SegmentSettings();
                vSettings.TextSize        = TextSize;
                vSettings.TextColor       = TextColor;
                vSettings.TextFont        = TextFont;
                vSettings.BackgroundColor = BackgroundColor;
            }

            return(vSettings);
        }
		/*--------------------------------------------------------------------------------------------*/
		public override SegmentSettings GetSettings() {
			if ( vSettings == null ) {
				vSettings = new SegmentSettings();
				vSettings.TextSize = TextSize;
				vSettings.TextColor = TextColor;
				vSettings.TextFont = TextFont;
				vSettings.ArrowIconColor = ArrowIconColor;
				vSettings.ToggleIconColor = ToggleIconColor;
				vSettings.BackgroundColor = BackgroundColor;
				vSettings.EdgeColor = EdgeColor;
				vSettings.HighlightColor = HighlightColor;
				vSettings.SelectionColor = SelectionColor;
				vSettings.SliderTrackColor = SliderTrackColor;
				vSettings.SliderFillColor = SliderFillColor;
				vSettings.SliderTickColor = SliderTickColor;
			}

			return vSettings;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////
		/*--------------------------------------------------------------------------------------------*/
		public virtual void Build(ArcState pArcState, SegmentState pSegState,
														float pArcAngle, SegmentSettings pSettings) {
			vArcState = pArcState;
			vSegState = pSegState;
			vSettings = pSettings;

			////

			vSlice = new UiSlice(gameObject);
			vSlice.Resize(pArcAngle);

			////

			var labelObj = new GameObject("Label");
			labelObj.transform.SetParent(gameObject.transform, false);
			labelObj.transform.localPosition = new Vector3(0, 0, 1);
			labelObj.transform.localScale = new Vector3(1, 1, (vArcState.IsLeft ? 1 : -1));
			
			vLabel = labelObj.AddComponent<UiLabel>();
			vLabel.IsLeft = vArcState.IsLeft;
		}
        /*--------------------------------------------------------------------------------------------*/
        public override SegmentSettings GetSettings()
        {
            if (vSettings == null)
            {
                vSettings                  = new SegmentSettings();
                vSettings.TextSize         = TextSize;
                vSettings.TextColor        = TextColor;
                vSettings.TextFont         = TextFont;
                vSettings.ArrowIconColor   = ArrowIconColor;
                vSettings.ToggleIconColor  = ToggleIconColor;
                vSettings.BackgroundColor  = BackgroundColor;
                vSettings.EdgeColor        = EdgeColor;
                vSettings.HighlightColor   = HighlightColor;
                vSettings.SelectionColor   = SelectionColor;
                vSettings.SliderTrackColor = SliderTrackColor;
                vSettings.SliderFillColor  = SliderFillColor;
                vSettings.SliderTickColor  = SliderTickColor;
            }

            return(vSettings);
        }
		////////////////////////////////////////////////////////////////////////////////////////////////
		/*--------------------------------------------------------------------------------------------*/
		public virtual void Build(ArcState pArcState, SegmentState pSegState,
														float pArcAngle, SegmentSettings pSettings) {
			vArcState = pArcState;
			vSegState = pSegState;
			vAngle0 = -pArcAngle/2f+UiSlice.AngleInset;
			vAngle1 = pArcAngle/2f-UiSlice.AngleInset;
			vSettings = pSettings;
			vNavSlider = (NavItemSlider)vSegState.NavItem;

			const float pi = (float)Math.PI;
			const float radInner = 1.04f;
			const float radOuter = 1.46f;

			vGrabArcHalf = pi/80f;
			vSlideDegree0 = (vAngle0+vGrabArcHalf)/pi*180;
			vSlideDegrees = (vAngle1-vAngle0-vGrabArcHalf*2)/pi*180;

			////

			vHiddenSlice = new UiSlice(gameObject, true);
			vHiddenSlice.Resize(pArcAngle);
			vHiddenSlice.UpdateBackground(Color.clear);

			vTrackA = new UiSlice(gameObject, true, "TrackA", radInner, radOuter);
			vTrackB = new UiSlice(gameObject, true, "TrackB", radInner, radOuter);
			vFillA = new UiSlice(gameObject, true, "FillA", radInner, radOuter);
			vFillB = new UiSlice(gameObject, true, "FillB", radInner, radOuter);

			////

			vTickMat = new Material(Shader.Find("Unlit/AlphaSelfIllum"));
			vTickMat.renderQueue -= 400;
			vTickMat.color = Color.clear;

			if ( vNavSlider.Ticks > 1 ) {
				Vector3 quadScale = new Vector3(UiSlice.AngleInset*2, 0.36f, 0.1f);
				float percPerTick = 1/(float)(vNavSlider.Ticks-1);

				vTicks = new GameObject[vNavSlider.Ticks];

				for ( int i = 0 ; i < vNavSlider.Ticks ; ++i ) {
					var tick = new GameObject("Tick"+i);
					tick.transform.SetParent(gameObject.transform, false);
					tick.transform.localRotation = Quaternion.AngleAxis(
						vSlideDegree0+vSlideDegrees*i*percPerTick, Vector3.up);
					vTicks[i] = tick;

					var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
					quad.renderer.sharedMaterial = vTickMat;
					quad.transform.SetParent(tick.transform, false);
					quad.transform.localPosition = new Vector3(0, 0, 1.25f);
					quad.transform.localRotation = 
						Quaternion.FromToRotation(Vector3.back, Vector3.down);
					quad.transform.localScale = quadScale;
				}
			}

			////

			vGrabHold = new GameObject("GrabHold");
			vGrabHold.transform.SetParent(gameObject.transform, false);

			var grabObj = new GameObject("Grab");
			grabObj.transform.SetParent(vGrabHold.transform, false);

			vGrab = grabObj.AddComponent<UiSliderGrabRenderer>();
			vGrab.Build(vArcState, vSegState, vGrabArcHalf*2, pSettings);

			////

			vHoverHold = new GameObject("HoverHold");
			vHoverHold.transform.SetParent(gameObject.transform, false);

			var hoverObj = new GameObject("Hover");
			hoverObj.transform.SetParent(vHoverHold.transform, false);

			vHover = new UiSlice(hoverObj, false, "Hover");
		}