Ejemplo n.º 1
0
        private static Vector2 MeasureTextWidth(DynamicFontRenderer renderer, string text, float textScale, out Vector2 yBounds)
        {
            float width  = 1f;
            float height = 0;
            int   size   = Mathf.CeilToInt(((UIDynamicFont)renderer.font).baseline * textScale) * 2;

            ((UIDynamicFont)renderer.font).RequestCharacters(text, size, FontStyle.Normal);
            yBounds = new Vector2(float.MaxValue, float.MinValue);
            CharacterInfo characterInfo = default;

            for (int i = 0; i < text.Length; i++)
            {
                char c = text[i];
                ((UIDynamicFont)renderer.font).baseFont.GetCharacterInfo(c, out characterInfo, size, FontStyle.Normal);
                if (c == '\t')
                {
                    width += renderer.tabSize;
                }
                else
                {
                    width    += ((c != ' ') ? characterInfo.maxX : (characterInfo.advance + (renderer.characterSpacing * textScale)));
                    height    = Mathf.Max(characterInfo.glyphHeight, height);
                    yBounds.x = Mathf.Min(yBounds.x, characterInfo.minY);
                    yBounds.y = Mathf.Max(yBounds.y, characterInfo.maxY);
                }
            }
            if (text.Length > 2)
            {
                width += (text.Length - 2) * renderer.characterSpacing * textScale;
            }
            return(new Vector2(width, height) / 2f);
        }
Ejemplo n.º 2
0
 public static void CalcTokenRenderSizeNewTags(DynamicFontRenderer renderer, UIMarkupToken token)
 {
     if (token.tokenType == UIMarkupTokenType.StartTag && Matches(token, TAG_LINE) && renderer.spriteAtlas != null && token.GetAttribute(0).m_Value.value.Split(',').Length == 3)
     {
         float     num     = 0f;
         Texture2D texture = renderer.spriteAtlas.texture;
         float     num3    = ((UIDynamicFont)renderer.font).baseline * renderer.textScale * 2.5f;
         string    value   = token.GetAttribute(0).m_Value.value.Split(',')[0];
         UITextureAtlas.SpriteInfo spriteInfo = renderer.spriteAtlas[value];
         if (spriteInfo != null)
         {
             float num4 = spriteInfo.region.width * texture.width / (spriteInfo.region.height * texture.height);
             num = Mathf.CeilToInt((num3 * num4));
         }
         token.height = Mathf.CeilToInt(num3);
         typeof(UIMarkupToken).GetProperty("width").GetSetMethod(true).Invoke(token, new object[] { Mathf.CeilToInt(num) });
     }
 }
Ejemplo n.º 3
0
 public override dfFontRendererBase ObtainRenderer()
 {
     return(DynamicFontRenderer.Obtain(this));
 }
Ejemplo n.º 4
0
        private static void RenderText(DynamicFontRenderer renderer, string text, Vector3 position, float rescale, UIRenderData renderData, float textScale, Color textColor, Color outlineColor)
        {
            var                uidynamicFont = (UIDynamicFont)renderer.font;
            float              size          = ((UIDynamicFont)renderer.font).baseline * textScale;
            FontStyle          style         = FontStyle.Normal;
            int                descent       = uidynamicFont.Descent * 2;
            int                ascent        = renderer.font.baseFont.ascent * 2;
            PoolList <Vector3> vertices      = renderData.vertices;
            PoolList <int>     triangles     = renderData.triangles;
            PoolList <Vector2> uvs           = renderData.uvs;
            PoolList <Color32> colors        = renderData.colors;
            float              x             = position.x;
            float              y             = position.y;

            renderData.material = uidynamicFont.material;
            Color color2 = ApplyOpacity(renderer, textColor);
            Color c      = color2;

            if (renderer.bottomColor != null)
            {
                c = ApplyOpacity(renderer, textColor);
            }
            for (int i = 0; i < text.Length; i++)
            {
                if (i > 0)
                {
                    x += renderer.characterSpacing * textScale;
                }
                if (uidynamicFont.baseFont.GetCharacterInfo(text[i], out CharacterInfo glyph, Mathf.CeilToInt(size) * 2, style))
                {
                    float   num3    = (glyph.maxY / 2f);
                    float   minX    = x + (glyph.minX / 2f);
                    float   maxY    = y + num3;
                    float   maxX    = minX + (glyph.glyphWidth * rescale / 2f);
                    float   minY    = maxY - (glyph.glyphHeight / 2f);
                    Vector3 vector  = new Vector3(minX, maxY) * renderer.pixelRatio;
                    Vector3 vector2 = new Vector3(maxX, maxY) * renderer.pixelRatio;
                    Vector3 vector3 = new Vector3(maxX, minY) * renderer.pixelRatio;
                    Vector3 vector4 = new Vector3(minX, minY) * renderer.pixelRatio;
                    if (renderer.shadow)
                    {
                        AddTriangleIndices(vertices, triangles);
                        Vector3 b = renderer.shadowOffset * renderer.pixelRatio;
                        vertices.Add(vector + b);
                        vertices.Add(vector2 + b);
                        vertices.Add(vector3 + b);
                        vertices.Add(vector4 + b);
                        Color   c2   = ApplyOpacity(renderer, renderer.shadowColor);
                        Color32 item = c2.linear;
                        colors.Add(item);
                        colors.Add(item);
                        colors.Add(item);
                        colors.Add(item);
                        AddUVCoords(uvs, glyph);
                    }
                    if (outlineColor != default)
                    {
                        for (int j = 0; j < kOutlineOffsets.Length; j++)
                        {
                            AddTriangleIndices(vertices, triangles);
                            Vector3 b2 = kOutlineOffsets[j] * renderer.outlineSize * renderer.pixelRatio;
                            vertices.Add(vector + b2);
                            vertices.Add(vector2 + b2);
                            vertices.Add(vector3 + b2);
                            vertices.Add(vector4 + b2);
                            Color   c3    = ApplyOpacity(renderer, outlineColor);
                            Color32 item2 = c3.linear;
                            colors.Add(item2);
                            colors.Add(item2);
                            colors.Add(item2);
                            colors.Add(item2);
                            AddUVCoords(uvs, glyph);
                        }
                    }
                    AddTriangleIndices(vertices, triangles);
                    vertices.Add(vector);
                    vertices.Add(vector2);
                    vertices.Add(vector3);
                    vertices.Add(vector4);
                    Color32 item3 = color2.linear;
                    Color32 item4 = c.linear;
                    colors.Add(item3);
                    colors.Add(item3);
                    colors.Add(item4);
                    colors.Add(item4);
                    AddUVCoords(uvs, glyph);
                    x += glyph.maxX / 2f * rescale;
                }
            }
        }
Ejemplo n.º 5
0
        public static void RenderSpriteLine(DynamicFontRenderer renderer, UIMarkupToken token, Vector3 position, UIRenderData destination)
        {
            string[] args = token.GetAttribute(0)?.m_Value?.value?.Split(new char[] { ',' }, 3);
            if (args == null || args.Length != 3)
            {
                LogUtils.DoErrorLog($"INVALID ARGUMENT: {token.GetAttribute(0)?.m_Value?.value ?? "<NULL>"}");
                return;
            }

            UITextureAtlas.SpriteInfo spriteInfo = renderer.spriteAtlas[args[0]];
            if (spriteInfo == null)
            {
                CODebugBase <InternalLogChannel> .Warn(InternalLogChannel.UI, "Missing sprite " + args[0] + " in " + renderer.spriteAtlas.name);
            }
            else
            {
                var midLine = new Vector3(position.x, position.y - (((UIDynamicFont)renderer.font).baseline * renderer.textScale / 2));

                Texture2D texture        = renderer.spriteAtlas.texture;
                float     calcHeight     = ((UIDynamicFont)renderer.font).baseline * renderer.textScale * 2f;
                float     calcProportion = spriteInfo.region.width * texture.width / (spriteInfo.region.height * texture.height);
                float     calcWidth      = Mathf.CeilToInt(calcHeight * calcProportion);

                int height = Mathf.CeilToInt(calcHeight);
                int width  = Mathf.CeilToInt(calcWidth);

                Color32 bgColor        = ColorExtensions.FromRGB(args[1]);
                Color32 color2         = ApplyOpacity(renderer, bgColor);
                var     size           = new Vector3(width, height);
                Vector2 textDimensions = MeasureTextWidth(renderer, args[2], renderer.textScale, out Vector2 yBounds);

                float imageProportions = width / spriteInfo.width;

                float borderWidth = renderer.textScale * 2;

                float textBoundHeight = height - (spriteInfo.border.vertical * imageProportions) - borderWidth;
                float textBoundWidth  = width - (spriteInfo.border.horizontal * imageProportions) - borderWidth;

                var textAreaSize = new Vector4((spriteInfo.border.left * imageProportions) + (borderWidth / 2), (-spriteInfo.border.top + spriteInfo.border.bottom) * imageProportions / 2, textBoundWidth, textBoundHeight);

                float textScale = renderer.textScale;
                float multipler = Mathf.Min(Mathf.Min(3.5f, textAreaSize.z / textDimensions.x), Mathf.Min(3.5f, textAreaSize.w / textDimensions.y));
                if (multipler > 1)
                {
                    textScale     *= 1 + ((multipler - 1) / 2.1f);
                    multipler      = 1;
                    textDimensions = MeasureTextWidth(renderer, args[2], textScale, out yBounds);
                }
                float midLineOffset = (((UIDynamicFont)renderer.font).baseline / 2 * renderer.textScale);

                Color contrastColor = KlyteMonoUtils.ContrastColor(bgColor);

                RenderSprite(renderer.spriteBuffer, new RenderOptions
                {
                    atlas         = renderer.spriteAtlas,
                    color         = contrastColor,
                    fillAmount    = 1f,
                    flip          = UISpriteFlip.None,
                    offset        = position - new Vector3(0, -(height / 2) + midLineOffset),
                    pixelsToUnits = renderer.pixelRatio,
                    size          = size,
                    spriteInfo    = spriteInfo
                });

                RenderSprite(renderer.spriteBuffer, new RenderOptions
                {
                    atlas         = renderer.spriteAtlas,
                    color         = color2,
                    fillAmount    = 1f,
                    flip          = UISpriteFlip.None,
                    offset        = position - new Vector3(0, -(height / 2) + midLineOffset) + (new Vector3(borderWidth, -borderWidth) / 2),
                    pixelsToUnits = renderer.pixelRatio,
                    size          = size - new Vector3(borderWidth, borderWidth),
                    spriteInfo    = spriteInfo
                });
                midLineOffset = ((UIDynamicFont)renderer.font).baseline * textScale;
                Vector3 targetTextPos = midLine + VectorUtils.XY_(textAreaSize) + (new Vector3(textAreaSize.z - (textDimensions.x * multipler), -textDimensions.y) / 2);
                RenderText(renderer, args[2], targetTextPos, multipler, destination, textScale, contrastColor, bgColor);
            }
        }