Exemple #1
0
        /// <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);
        }
Exemple #2
0
        public static Mesh Quad()
        {
            var r = Mesh.EmptyMesh();

            r.QuadPart();
            return(r);
        }
Exemple #3
0
        /// <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()));
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        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);
        }