3 using SiliconStudio.Core;
4 using SiliconStudio.Core.Mathematics;
5 using SiliconStudio.Paradox.Graphics;
6 using SiliconStudio.Paradox.UI.Controls;
8 namespace SiliconStudio.
Paradox.UI.Renderers
13 internal class DefaultSliderRenderer : ElementRenderer
20 public override void RenderColor(UIElement element, UIRenderingContext context)
22 base.RenderColor(element, context);
24 var slider = (
Slider)element;
28 var axis = (int)slider.Orientation;
29 var axisPrime = (axis + 1) % 2;
30 var color = slider.RenderOpacity * Color.White;
31 var isGaugeReverted = axis == 1 ? !slider.IsDirectionReversed : slider.IsDirectionReversed;
32 var sliderRatio = slider.Value / (slider.Maximum - slider.Minimum);
33 var trackOffsets =
new Vector2(slider.TrackStartingOffsets[axis], slider.TrackStartingOffsets[axisPrime]);
34 var fullGaugeSize = slider.RenderSizeInternal[axis] - trackOffsets.X - trackOffsets.Y;
35 var trackIdealSize = slider.TrackBackgroundImage != null ?
new Vector2?(slider.TrackBackgroundImage.ImageIdealSize) : null;
38 var image = slider.TrackBackgroundImage;
41 var imageAxis = (int)image.Orientation;
43 var worldMatrix = GetAdjustedWorldMatrix(ref slider.WorldMatrixInternal, (axis & imageAxis) == 1);
45 Batch.DrawImage(image.Texture, image.TextureAlpha, ref worldMatrix, ref image.RegionInternal, ref slider.RenderSizeInternal, ref image.BordersInternal, ref color, context.DepthBias, imageOrientation);
46 context.DepthBias += 1;
50 image = slider.TrackForegroundImage;
53 var imageAxis = (int)image.Orientation;
55 var shouldRotate180Degrees = (axis & imageAxis) == 1;
58 size[axis] = sliderRatio * fullGaugeSize;
59 size[axisPrime] = image.ImageIdealSize.Y;
60 if (trackIdealSize.HasValue)
61 size[axisPrime] *= slider.RenderSizeInternal[axisPrime] / trackIdealSize.Value.Y;
63 var worldMatrix = GetAdjustedWorldMatrix(ref slider.WorldMatrixInternal, shouldRotate180Degrees);
64 var halfSizeLeft = (slider.RenderSizeInternal[axis] - size[axis]) / 2;
65 var worldTranslation = GetAdjustedTranslation(isGaugeReverted ? halfSizeLeft - trackOffsets.Y : trackOffsets.X - halfSizeLeft, shouldRotate180Degrees);
66 worldMatrix.M41 += worldTranslation * worldMatrix[(axis << 2) + 0];
67 worldMatrix.M42 += worldTranslation * worldMatrix[(axis << 2) + 1];
68 worldMatrix.M43 += worldTranslation * worldMatrix[(axis << 2) + 2];
70 var borders = image.BordersInternal;
71 var borderStartIndex = (imageAxis <<1 ) + (slider.IsDirectionReversed? 1 : 0);
72 var borderStopIndex = (imageAxis << 1) + (slider.IsDirectionReversed ? 0 : 1);
73 borders[borderStartIndex] = Math.Min(borders[borderStartIndex], size[axis]);
74 borders[borderStopIndex] = Math.Max(0, size[axis] - fullGaugeSize + borders[borderStopIndex]);
76 var position = image.RegionInternal.Location;
77 var oldRegionSize =
new Vector2(image.RegionInternal.Width, image.RegionInternal.Height);
78 var originalBordersSize = image.BordersInternal[borderStartIndex] + image.BordersInternal[borderStopIndex];
80 var newRegionSize = oldRegionSize;
81 newRegionSize[imageAxis] = borders[borderStartIndex] + borders[borderStopIndex] + (oldRegionSize[imageAxis] - originalBordersSize) * Math.Min(1, (size[axis] - borders[borderStartIndex]) / (fullGaugeSize - originalBordersSize));
82 if (slider.IsDirectionReversed)
84 position[imageAxis] = position[imageAxis] + oldRegionSize[imageAxis] - newRegionSize[imageAxis];
86 var region =
new RectangleF(position.X, position.Y, newRegionSize.X, newRegionSize.Y);
88 Batch.DrawImage(image.Texture, image.TextureAlpha, ref worldMatrix, ref region, ref
size, ref borders, ref color, context.DepthBias, imageOrientation);
89 context.DepthBias += 1;
93 image = slider.TickImage;
94 if (slider.AreTicksDisplayed && image != null)
96 var imageAxis = (int)image.Orientation;
98 var shouldRotate180Degrees = (axis & imageAxis) == 1;
101 size[axis] = image.ImageIdealSize.X;
102 size[axisPrime] = image.ImageIdealSize.Y;
103 if (trackIdealSize.HasValue)
104 size[axisPrime] *= slider.RenderSizeInternal[axisPrime] / trackIdealSize.Value.Y;
106 var startOffset =
new Vector2(GetAdjustedTranslation(slider.TickOffset, shouldRotate180Degrees));
107 startOffset[axis] = GetAdjustedTranslation(- fullGaugeSize / 2, shouldRotate180Degrees);
108 if (trackIdealSize.HasValue)
109 startOffset[axisPrime] *= slider.RenderSizeInternal[axisPrime] / trackIdealSize.Value.Y;
111 var stepOffset = GetAdjustedTranslation(fullGaugeSize / slider.TickFrequency, shouldRotate180Degrees);
113 var worldMatrix = GetAdjustedWorldMatrix(ref slider.WorldMatrixInternal, shouldRotate180Degrees);
114 worldMatrix.M41 += startOffset[axis] * worldMatrix[(axis << 2) + 0] + startOffset[axisPrime] * worldMatrix[(axisPrime << 2) + 0];
115 worldMatrix.M42 += startOffset[axis] * worldMatrix[(axis << 2) + 1] + startOffset[axisPrime] * worldMatrix[(axisPrime << 2) + 1];
116 worldMatrix.M43 += startOffset[axis] * worldMatrix[(axis << 2) + 2] + startOffset[axisPrime] * worldMatrix[(axisPrime << 2) + 2];
118 for (
int i = 0; i < slider.TickFrequency + 1; i++)
120 Batch.DrawImage(image.Texture, image.TextureAlpha, ref worldMatrix, ref image.RegionInternal, ref
size, ref image.BordersInternal, ref color, context.DepthBias, imageOrientation, SwizzleMode.None,
true);
122 worldMatrix.M41 += stepOffset * worldMatrix[(axis << 2) + 0];
123 worldMatrix.M42 += stepOffset * worldMatrix[(axis << 2) + 1];
124 worldMatrix.M43 += stepOffset * worldMatrix[(axis << 2) + 2];
126 context.DepthBias += 1;
130 image = slider.MouseOverState == MouseOverState.MouseOverElement ? slider.MouseOverThumbImage : slider.ThumbImage;
133 var imageAxis = (int)image.Orientation;
135 var shouldRotate180Degrees = (axis & imageAxis) == 1;
138 size[axis] = image.ImageIdealSize.X;
139 size[axisPrime] = image.ImageIdealSize.Y;
140 if (trackIdealSize.HasValue)
141 size[axisPrime] *= slider.RenderSizeInternal[axisPrime] / trackIdealSize.Value.Y;
143 var revertedRatio = isGaugeReverted ? 1 - sliderRatio : sliderRatio;
144 var offset = GetAdjustedTranslation((revertedRatio - 0.5f) * fullGaugeSize, shouldRotate180Degrees);
145 var worldMatrix = GetAdjustedWorldMatrix(ref slider.WorldMatrixInternal, shouldRotate180Degrees);
146 worldMatrix.M41 += offset * worldMatrix[(axis << 2) + 0];
147 worldMatrix.M42 += offset * worldMatrix[(axis << 2) + 1];
148 worldMatrix.M43 += offset * worldMatrix[(axis << 2) + 2];
150 Batch.DrawImage(image.Texture, image.TextureAlpha, ref worldMatrix, ref image.RegionInternal, ref
size, ref image.BordersInternal, ref color, context.DepthBias, imageOrientation);
152 context.DepthBias += 1;
156 private float GetAdjustedTranslation(
float value,
bool shouldRotate)
158 return !shouldRotate ? value : -value;
167 private static Matrix GetAdjustedWorldMatrix(ref
Matrix worldMatrix,
bool shouldRotate)
172 var rotatedMatrix = worldMatrix;
173 rotatedMatrix.M11 = -rotatedMatrix.M11;
174 rotatedMatrix.M12 = -rotatedMatrix.M12;
175 rotatedMatrix.M13 = -rotatedMatrix.M13;
176 rotatedMatrix.M14 = -rotatedMatrix.M14;
177 rotatedMatrix.M21 = -rotatedMatrix.M21;
178 rotatedMatrix.M22 = -rotatedMatrix.M22;
179 rotatedMatrix.M23 = -rotatedMatrix.M23;
180 rotatedMatrix.M24 = -rotatedMatrix.M24;
182 return rotatedMatrix;
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
Represents a two dimensional mathematical vector.
A service registry is a IServiceProvider that provides methods to register and unregister services...
Represents a slider element.
SiliconStudio.Core.Mathematics.Vector3 Vector3
Android.Widget.Orientation Orientation
_In_ size_t _In_ size_t size
SiliconStudio.Core.Mathematics.RectangleF RectangleF
ImageOrientation
Defines the possible rotations to apply on image regions.
Represents a 4x4 mathematical matrix.