/// <summary> /// Get the render mesh to draw this widget. /// </summary> /// <returns></returns> public Mesh GetRenderMesh(int Invalidation) { if (Hidden) { return(Mesh.EmptyMesh()); } if (Debugger.Switches.ABTestSwitch) { var r = new Mesh[1 + Children.Count]; r[0] = Redraw(); for (var i = 0; i < Children.Count; ++i) { r[i + 1] = Children[i].GetRenderMesh(Invalidation); } return(Mesh.Merge(r)); } if (CachedRenderMesh == null || Invalidation > RenderMeshInvalidation) { var r = new Mesh[1 + Children.Count]; r[0] = Redraw(); for (var i = 0; i < Children.Count; ++i) { r[i + 1] = Children[i].GetRenderMesh(Invalidation); } CachedRenderMesh = Mesh.Merge(r); // This is the heart of the in-place mesh generation... can't kill merge yet! RenderMeshInvalidation = Invalidation; } return(CachedRenderMesh); }
public static Mesh Quad() { var r = Mesh.EmptyMesh(); r.QuadPart(); return(r); }
/// <summary> /// Create the rendering mesh for this widget. /// </summary> /// <returns></returns> protected virtual Mesh Redraw() { if (Hidden) { throw new InvalidOperationException(); } if (Transparent || Root == null) { return(Mesh.EmptyMesh()); } var result = new List <Mesh>(); if (Background != null) { if (Rotation != 0.0) { result.Add(Mesh.Quad() .Scale(Rect.Width, Rect.Height) .Transform(Rect.X, Rect.Y, Rect.Width, Rect.Height, Rotation) .Colorize(BackgroundColor) .Texture(Root.GetTileSheet(Background.Sheet).TileMatrix(Background.Tile))); } else { result.Add(Mesh.Quad() .Scale(Rect.Width, Rect.Height) .Translate(Rect.X, Rect.Y) .Colorize(BackgroundColor) .Texture(Root.GetTileSheet(Background.Sheet).TileMatrix(Background.Tile))); } } if (!String.IsNullOrEmpty(Border)) { //Create a 'scale 9' background result.Add( Mesh.CreateScale9Background(Rect, Root.GetTileSheet(Border)) .Colorize(BackgroundColor)); } // Add text label if (!String.IsNullOrEmpty(Text)) { GetTextMesh(result); } return(Mesh.Merge(result.ToArray())); }
/// <summary> /// Create the rendering mesh for this widget. /// </summary> /// <returns></returns> protected virtual Mesh Redraw() { if (Hidden) { throw new InvalidOperationException(); } var r = Mesh.EmptyMesh(); if (Transparent || Root == null) { return(r); } if (Background != null) { if (Rotation != 0.0) { r.QuadPart() .Scale(Rect.Width, Rect.Height) .Transform(Rect.X, Rect.Y, Rect.Width, Rect.Height, Rotation) .Colorize(BackgroundColor) .Texture(Root.GetTileSheet(Background.Sheet).TileMatrix(Background.Tile)); } else { r.QuadPart() .Scale(Rect.Width, Rect.Height) .Translate(Rect.X, Rect.Y) .Colorize(BackgroundColor) .Texture(Root.GetTileSheet(Background.Sheet).TileMatrix(Background.Tile)); } } if (!String.IsNullOrEmpty(Border)) { r.Scale9Part(Rect, Root.GetTileSheet(Border)).Colorize(BackgroundColor); } if (!String.IsNullOrEmpty(Text)) { GetTextMeshPart(r); } return(r); }
public Mesh ForceRenderMeshUpdate() { if (Hidden) { return(Mesh.EmptyMesh()); } var r = new Mesh[1 + Children.Count]; r[0] = Redraw(); for (var i = 0; i < Children.Count; ++i) { r[i + 1] = Children[i].ForceRenderMeshUpdate(); } CachedRenderMesh = Mesh.Merge(r); return(CachedRenderMesh); }
/// <summary> /// Get the render mesh to draw this widget. /// </summary> /// <returns></returns> public Mesh GetRenderMesh() { if (Hidden) { return(Mesh.EmptyMesh()); } if (CachedRenderMesh == null) { var r = new Mesh[1 + Children.Count]; r[0] = Redraw(); for (var i = 0; i < Children.Count; ++i) { r[i + 1] = Children[i].GetRenderMesh(); } CachedRenderMesh = Mesh.Merge(r); } return(CachedRenderMesh); }
public Mesh GetTextMesh(String Text, Vector4 TextColor) { var drawableArea = GetDrawableInterior(); var stringMeshSize = new Rectangle(); var font = Root.GetTileSheet(Font); var text = (WrapText || WrapWithinWords) ? font.WordWrapString(Text, TextSize, drawableArea.Width, WrapWithinWords) : Text; var r = Mesh.EmptyMesh(); var stringMesh = r.StringPart(text, font, new Vector2(TextSize, TextSize), out stringMeshSize).Colorize(TextColor); if (AutoResizeToTextHeight && stringMeshSize.Height < Rect.Height) { if (!String.IsNullOrEmpty(Border)) { var tileSheet = Root.GetTileSheet(Border); Rect = new Rectangle(Rect.X, Rect.Y, Rect.Width, stringMeshSize.Height + tileSheet.TileHeight * 2); } else { Rect = new Rectangle(Rect.X, Rect.Y, Rect.Width, stringMeshSize.Height); } MinimumSize.Y = stringMeshSize.Height; Parent.Layout(); } var textDrawPos = Vector2.Zero; switch (TextHorizontalAlign) { case HorizontalAlign.Left: textDrawPos.X = drawableArea.X; break; case HorizontalAlign.Right: textDrawPos.X = drawableArea.X + drawableArea.Width - stringMeshSize.Width; break; case HorizontalAlign.Center: textDrawPos.X = drawableArea.X + ((drawableArea.Width - stringMeshSize.Width) / 2); break; } switch (TextVerticalAlign) { case VerticalAlign.Top: textDrawPos.Y = drawableArea.Y; break; case VerticalAlign.Bottom: textDrawPos.Y = drawableArea.Y + drawableArea.Height - stringMeshSize.Height; break; case VerticalAlign.Below: textDrawPos.Y = drawableArea.Y + drawableArea.Height; break; case VerticalAlign.Center: textDrawPos.Y = drawableArea.Y + ((drawableArea.Height - stringMeshSize.Height) / 2); break; } stringMesh.Translate(textDrawPos.X, textDrawPos.Y); return(r); }