Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DefaultBorderRenderer.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 
4 
5 using SiliconStudio.Core;
6 using SiliconStudio.Core.Mathematics;
7 using SiliconStudio.Paradox.UI.Controls;
8 
9 namespace SiliconStudio.Paradox.UI.Renderers
10 {
11  /// <summary>
12  /// The default renderer for <see cref="Border"/>.
13  /// </summary>
15  {
17  : base(services)
18  {
19  }
20 
21  public override void RenderColor(UIElement element, UIRenderingContext context)
22  {
23  base.RenderColor(element, context);
24 
25  Vector3 offsets;
26  Vector3 borderSize;
27 
28  var border = (Border)element;
29 
30  var borderThickness = border.BorderThickness;
31  var elementHalfBorders = borderThickness / 2;
32  var elementSize = element.RenderSizeInternal;
33  var elementHalfSize = elementSize / 2;
34 
35  // left/front
36  offsets = new Vector3(-elementHalfSize.X + elementHalfBorders.Left, 0, -elementHalfSize.Z + elementHalfBorders.Back);
37  borderSize = new Vector3(borderThickness.Left, elementSize.Y, borderThickness.Back);
38  DrawBorder(border, ref offsets, ref borderSize, context);
39 
40  // right/front
41  offsets = new Vector3(elementHalfSize.X - elementHalfBorders.Right, 0, -elementHalfSize.Z + elementHalfBorders.Back);
42  borderSize = new Vector3(borderThickness.Right, elementSize.Y, borderThickness.Back);
43  DrawBorder(border, ref offsets, ref borderSize, context);
44 
45  // top/front
46  offsets = new Vector3(0, -elementHalfSize.Y + elementHalfBorders.Top, -elementHalfSize.Z + elementHalfBorders.Back);
47  borderSize = new Vector3(elementSize.X, borderThickness.Top, borderThickness.Back);
48  DrawBorder(border, ref offsets, ref borderSize, context);
49 
50  // bottom/front
51  offsets = new Vector3(0, elementHalfSize.Y - elementHalfBorders.Bottom, -elementHalfSize.Z + elementHalfBorders.Back);
52  borderSize = new Vector3(elementSize.X, borderThickness.Bottom, borderThickness.Back);
53  DrawBorder(border, ref offsets, ref borderSize, context);
54 
55  // if the element is 3D draw the extra borders
56  if (element.ActualDepth > MathUtil.ZeroTolerance)
57  {
58  // left/back
59  offsets = new Vector3(-elementHalfSize.X + elementHalfBorders.Left, 0, elementHalfSize.Z - elementHalfBorders.Front);
60  borderSize = new Vector3(borderThickness.Left, elementSize.Y, borderThickness.Front);
61  DrawBorder(border, ref offsets, ref borderSize, context);
62 
63  // right/back
64  offsets = new Vector3(elementHalfSize.X - elementHalfBorders.Right, 0, elementHalfSize.Z - elementHalfBorders.Front);
65  borderSize = new Vector3(borderThickness.Right, elementSize.Y, borderThickness.Front);
66  DrawBorder(border, ref offsets, ref borderSize, context);
67 
68  // top/back
69  offsets = new Vector3(0, -elementHalfSize.Y + elementHalfBorders.Top, elementHalfSize.Z - elementHalfBorders.Front);
70  borderSize = new Vector3(elementSize.X, borderThickness.Top, borderThickness.Front);
71  DrawBorder(border, ref offsets, ref borderSize, context);
72 
73  // bottom/back
74  offsets = new Vector3(0, elementHalfSize.Y - elementHalfBorders.Bottom, elementHalfSize.Z - elementHalfBorders.Front);
75  borderSize = new Vector3(elementSize.X, borderThickness.Bottom, borderThickness.Front);
76  DrawBorder(border, ref offsets, ref borderSize, context);
77 
78  // left/top
79  offsets = new Vector3(-elementHalfSize.X + elementHalfBorders.Left, -elementHalfSize.Y + elementHalfBorders.Top, 0);
80  borderSize = new Vector3(borderThickness.Left, borderThickness.Top, elementSize.Z);
81  DrawBorder(border, ref offsets, ref borderSize, context);
82 
83  // right/top
84  offsets = new Vector3(elementHalfSize.X - elementHalfBorders.Right, -elementHalfSize.Y + elementHalfBorders.Top, 0);
85  borderSize = new Vector3(borderThickness.Right, borderThickness.Top, elementSize.Z);
86  DrawBorder(border, ref offsets, ref borderSize, context);
87 
88  // left/bottom
89  offsets = new Vector3(-elementHalfSize.X + elementHalfBorders.Left, elementHalfSize.Y - elementHalfBorders.Bottom, 0);
90  borderSize = new Vector3(borderThickness.Left, borderThickness.Bottom, elementSize.Z);
91  DrawBorder(border, ref offsets, ref borderSize, context);
92 
93  // right/bottom
94  offsets = new Vector3(elementHalfSize.X - elementHalfBorders.Right, elementHalfSize.Y - elementHalfBorders.Bottom, 0);
95  borderSize = new Vector3(borderThickness.Right, borderThickness.Bottom, elementSize.Z);
96  DrawBorder(border, ref offsets, ref borderSize, context);
97  }
98  }
99 
100  private void DrawBorder(Border border, ref Vector3 offsets, ref Vector3 borderSize, UIRenderingContext context)
101  {
102  var worldMatrix = border.WorldMatrixInternal;
103  worldMatrix.M41 += worldMatrix.M11 * offsets.X + worldMatrix.M21 * offsets.Y + worldMatrix.M31 * offsets.Z;
104  worldMatrix.M42 += worldMatrix.M12 * offsets.X + worldMatrix.M22 * offsets.Y + worldMatrix.M32 * offsets.Z;
105  worldMatrix.M43 += worldMatrix.M13 * offsets.X + worldMatrix.M23 * offsets.Y + worldMatrix.M33 * offsets.Z;
106  Batch.DrawCube(ref worldMatrix, ref borderSize, ref border.BorderColorInternal, context.DepthBias);
107  }
108  }
109 }
Provides a base class for all the User Interface elements in Paradox applications.
Definition: UIElement.cs:21
A border element adds an uniform color border around its content.
Definition: Border.cs:10
const float ZeroTolerance
The value for which all absolute numbers smaller than are considered equal to zero.
Definition: MathUtil.cs:38
Represents a three dimensional mathematical vector.
Definition: Vector3.cs:42
A service registry is a IServiceProvider that provides methods to register and unregister services...
Base class for UI element renderers
SiliconStudio.Core.Mathematics.Vector3 Vector3
The UI drawing context. It provides information about how to render UIElements for drawing...
override void RenderColor(UIElement element, UIRenderingContext context)
Render the provided UIElement.