Example #1
0
 private static string CreateHash(TextTextureProperties text)
 {
     return(text.Text + "," + text.OffsetX + "," + text.OffsetY + "," +
            text.Width + "," + text.Height + "," +
            text.FontSize + "," + text.Background.r + "," +
            text.Background.g + "," + text.Background.b);
 }
Example #2
0
        /// <summary>
        /// Renders a texture and caches it so it can be used as a texture
        /// for a material (like a computer screen for example).
        /// </summary>
        /// <returns>The text.</returns>
        /// <param name="text">Text.</param>
        /// <param name="forceRender">Whether the texture should be rendered
        /// again even if it's cached.</param>
        public static Texture2D GetText(TextTextureProperties text, bool forceRender = false)
        {
            string Hash = CreateHash(text);

            if (forceRender || !Cache.ContainsKey(Hash))
            {
                Cache[Hash] = Singleton.RenderText(text);
            }
            return(Cache[Hash]);
        }
 /// <summary>
 /// Sets the text properties.
 /// </summary>
 /// <param name="Props">Properties.</param>
 public void SetTextProperties(TextTextureProperties Props)
 {
     TextProperties = Props;
     Dirty          = true;
 }
Example #4
0
        private Texture2D RenderText(TextTextureProperties text)
        {
            // Set scales
            float Scale = 2.0f / text.Width;

            Text.fontSize      = text.FontSize;
            Text.characterSize = text.FontSize * Scale * 0.25f;

            // Fix newlines
            Text.text = text.Text.Replace("\\n", "\n");
            float CharacterWidth = FontUtil.GetCharacterWidth(Text.font,
                                                              Text.fontSize, Text.fontStyle);
            string FixedText = "";
            int    CutAmount = 0;

            for (int i = 0; i < Text.text.Length; i++)
            {
                int    RowLength      = i - CutAmount;
                string Line           = Text.text.Substring(CutAmount, RowLength).Trim() + "\n";
                int    NextWordLength = 0;
                if (Text.text[i] == ' ' && i + 1 < Text.text.Length)
                {
                    NextWordLength = Text.text.Substring(i + 1).Split(' ')[0].Length;
                }
                if ((Line.Length + NextWordLength) * CharacterWidth > text.Width - text.OffsetX ||
                    Text.text[i] == '\n')
                {
                    FixedText += Line;
                    CutAmount  = i;
                }
            }
            FixedText += Text.text.Substring(CutAmount).Trim();
            Text.text  = FixedText;

            // Setup render textures
            RenderTexture TextTexture = RenderTexture.GetTemporary(text.Width, text.Height);
            RenderTexture OldRT       = Camera.targetTexture;

            // Calculate positions
            float OffsetX = -text.Width / 2f;
            float OffsetY = -text.Height / 2f;

            if (text.Centered)
            {
                OffsetX     = 0;
                Text.anchor = TextAnchor.UpperCenter;
            }
            else
            {
                Text.anchor = TextAnchor.UpperLeft;
            }
            Camera.orthographicSize        = 1.0f * text.Height / text.Width;
            Camera.transform.localPosition = new Vector3(
                -(text.OffsetX + OffsetX) * Scale,
                (text.OffsetY + OffsetY) * Scale);

            // Setup camera
            Camera.targetTexture   = TextTexture;
            Camera.backgroundColor = text.Background;

            // *click*
            Camera.Render();
            Camera.targetTexture = OldRT;

            // Copy the result to a Texture2D
            OldRT = RenderTexture.active;
            Texture2D Result = new Texture2D(text.Width, text.Height);

            RenderTexture.active = TextTexture;
            Result.ReadPixels(new Rect(0, 0, Result.width, Result.height), 0, 0);
            Result.Apply();

            // Clean up
            RenderTexture.active = OldRT;
            RenderTexture.ReleaseTemporary(TextTexture);

            return(Result);
        }