Esempio n. 1
0
    public Vector2 Render(Vector2 position, string str, Vector2 renderSize)
    {
        Vector2 curPos = position;
        Vector2 scale  = renderSize / Size;

        for (int idx = 0; idx < str.Length; idx++)
        {
            char       c        = str[idx];
            Material   mat      = GetCharacterMaterial((int)c);
            BitmapChar charInfo = GetBitmapChar((int)c);

            Vector2 scaledSize   = Vector2.Scale(charInfo.Size, scale);
            Vector2 scaledOffset = Vector2.Scale(charInfo.Offset, scale);

            Graphics.DrawTexture(new Rect((int)(curPos.x + scaledOffset.x), (int)(curPos.y + scaledOffset.y), (int)scaledSize.x, (int)scaledSize.y), mat.mainTexture, mat);
            //Graphics.DrawTexture(new Rect((int)(curPos.x), (int)(curPos.y), (int)scaledSize.x, (int)renderSize.y), mat.mainTexture, mat);

            float krn = 0;
            if (idx < str.Length - 1)
            {
                krn = GetKerning(c, str[idx + 1]);
            }
            curPos.x += (charInfo.XAdvance + krn) * scale.x;
        }

        return(curPos);
    }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="fontImage"></param>
        /// <param name="format">GHL format (FontBuilder)</param>
        public void Load(Bitmap fontImage, byte[] format)
        {
            var ser = new Xml.Serialization.XmlSerializer(typeof(font));

            using (var str = new System.IO.MemoryStream(format))
            {
                var font = (font)ser.Deserialize(str);
                textureList = new Dictionary <int, BitmapChar>();
                for (int i = 0; i < font.chars.Length; i++)
                {
                    var fChar = font.chars[i];

                    var bChar = new BitmapChar();
                    bChar.Id      = fChar.id[0];
                    bChar.Advance = fChar.advance;

                    var charRect = fChar.rect.Split(' ');
                    int charX    = Convert.ToInt32(charRect[0]);
                    int charY    = Convert.ToInt32(charRect[1]);
                    int charW    = Convert.ToInt32(charRect[2]);
                    int charH    = Convert.ToInt32(charRect[3]);

                    var offset = fChar.offset.Split(' ');
                    bChar.OffsetX = Convert.ToInt32(offset[0]);
                    bChar.OffsetY = Convert.ToInt32(offset[1]);

                    bChar.Texture = new Bitmap(charW, charH);
                    bChar.Texture.uTexture.name = (char)bChar.Id + "_GlyphTexture";
                    if (charW > 0 && charH > 0)
                    {
                    }

                    if (charW > 0 && charH > 0)
                    {
                        for (int y = charY, by = 0; by < charH; y++, by++)
                        {
                            for (int x = charX, bx = 0; bx < charW; x++, bx++)
                            {
                                var c1 = fontImage.GetPixel(x, y);
                                bChar.Texture.SetPixel(bx, by, c1);
                            }
                        }
                    }

                    bChar.Texture.Apply();
                    textureList.Add(bChar.Id, bChar);
                }
            }

            Loaded = true;
        }
Esempio n. 3
0
    public Rect GetUVRect(BitmapChar bitmapChar)
    {
        //Convert positions/scale from AngleCode-format (pixels, top left origin) to uv format (0-1, bottom left origin)
        Vector2 scaledSize = new Vector2(bitmapChar.Size.x / ScaleW, bitmapChar.Size.y / ScaleH);
        Vector2 scaledPos  = new Vector2(bitmapChar.Position.x / ScaleW, bitmapChar.Position.y / ScaleH);
        Vector2 uvCharPos  = new Vector2(scaledPos.x, 1 - (scaledPos.y + scaledSize.y));

        //Scale and translate according to page atlas
        Rect offset = PageOffsets[bitmapChar.Page];

        uvCharPos  = new Vector2(uvCharPos.x * offset.width + offset.xMin, uvCharPos.y * offset.height + offset.yMin);
        scaledSize = new Vector2(scaledSize.x * offset.width, scaledSize.y * offset.height);

        return(new Rect(uvCharPos.x, uvCharPos.y, scaledSize.x, scaledSize.y));
    }
Esempio n. 4
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fontImage"></param>
        /// <param name="format">GHL format (FontBuilder)</param>
        public void Load(Bitmap fontImage, byte[] format)
        {
            var ser = new Xml.Serialization.XmlSerializer(typeof(font));
            using (var str = new System.IO.MemoryStream(format))
            {
                var font = (font)ser.Deserialize(str);
                textureList = new Dictionary<int, BitmapChar>();
                for (int i = 0; i < font.chars.Length; i++)
                {
                    var fChar = font.chars[i];

                    var bChar = new BitmapChar();
                    bChar.Id = fChar.id[0];
                    bChar.Advance = fChar.advance;

                    var charRect = fChar.rect.Split(' ');
                    int charX = Convert.ToInt32(charRect[0]);
                    int charY = Convert.ToInt32(charRect[1]);
                    int charW = Convert.ToInt32(charRect[2]);
                    int charH = Convert.ToInt32(charRect[3]);

                    var offset = fChar.offset.Split(' ');
                    bChar.OffsetX = Convert.ToInt32(offset[0]);
                    bChar.OffsetY = Convert.ToInt32(offset[1]);

                    bChar.Texture = new Bitmap(charW, charH);
                    bChar.Texture.uTexture.name = (char)bChar.Id + "_GlyphTexture";
                    if (charW > 0 && charH > 0)
                    {

                    }

                    if (charW > 0 && charH > 0)
                        for (int y = charY, by = 0; by < charH; y++, by++)
                            for (int x = charX, bx = 0; bx < charW; x++, bx++)
                            {
                                var c1 = fontImage.GetPixel(x, y);
                                bChar.Texture.SetPixel(bx, by, c1);
                            }

                    bChar.Texture.Apply();
                    textureList.Add(bChar.Id, bChar);
                }
            }

            Loaded = true;
        }
Esempio n. 5
0
    public Vector2 CalculateSize(string str, Vector2 renderSize)
    {
        Vector2 curPos = new Vector2(0, renderSize.y);
        Vector2 scale  = renderSize / Size;

        for (int idx = 0; idx < str.Length; idx++)
        {
            char       c        = str[idx];
            BitmapChar charInfo = GetBitmapChar((int)c);

            float krn = 0;
            if (idx < str.Length - 1)
            {
                krn = GetKerning(c, str[idx + 1]);
            }
            curPos.x += (charInfo.XAdvance + krn) * scale.x;
        }

        return(curPos);
    }
Esempio n. 6
0
    /* Method: GetCharacterMaterial
     *
     * Returns a material with the right texture, offset and scale
     * to render the given character within the (0,1) x (0,1) uv space
     */
    public Material GetCharacterMaterial(int c)
    {
        //If material doesn't exist for this character, create it
        if (!fontMaterials.ContainsKey(c) || fontMaterials[c] == null)
        {
            Material   fontMaterial = CreateFontMaterial();
            BitmapChar bitmapChar   = GetBitmapChar(c);

            Rect uvRect = GetUVRect(bitmapChar);
            fontMaterial.mainTextureScale  = new Vector2(uvRect.width, uvRect.height); // xy
            fontMaterial.mainTextureOffset = new Vector2(uvRect.xMin, uvRect.yMin);    // zw

            //Cache material for this character
            fontMaterials[c] = fontMaterial;
        }

        //Update material to get the current parameters
        Material mat = fontMaterials[c];

        UpdateFontMaterial(mat);
        return(mat);
    }
Esempio n. 7
0
    private Mesh GenerateLineMesh(Vector3 position, string str, Vector3 renderSize)
    {
        Font.Color = new Color(255, 255, 255, 70);

        //Set up mesh structures
        List <int>     Triangles = new List <int>();
        List <Vector3> vertices  = new List <Vector3>();
        List <Vector2> uvs       = new List <Vector2>();

        //Keep track of position
        Vector3 curPos = position;
        Vector3 scale  = renderSize / Font.Size;

        scale.x = 1;
        scale.y = 1;
        scale.z = 1;

        for (int idx = 0; idx < str.Length; idx++)
        {
            char       c         = str[idx];
            BitmapChar charInfo  = Font.GetBitmapChar((int)c);
            int        vertIndex = vertices.Count;

            //Set up uvs
            Rect uvRect = Font.GetUVRect(charInfo);
            //Debug.Log(uvRect);
            Vector2 uvScale  = new Vector2(uvRect.width, uvRect.height);
            Vector2 uvOffset = new Vector2(uvRect.x, uvRect.y);
            for (int i = 0; i < quadUvs.Length; i++)
            {
                uvs.Add(Vector2.Scale(quadUvs[i], uvScale) + uvOffset);
            }

            //Set up verts
            Vector3 vertSize   = Vector2.Scale(charInfo.Size, scale);
            Vector3 vertOffset = Vector2.Scale(charInfo.Offset, scale);
            vertOffset.y = renderSize.y - (vertOffset.y + vertSize.y); // change offset from top to bottom
            for (int i = 0; i < quadVerts.Length; i++)
            {
                Vector3 vert = Vector3.Scale(quadVerts[i], vertSize) + curPos + vertOffset;

                vert.x = (int)vert.x;
                vert.y = (int)vert.y;
                vert.z = (int)vert.z;
                //Debug.Log(vert);
                vertices.Add(vert);
            }

            //Set up triangles
            for (int i = 0; i < quadTriangles.Length; i++)
            {
                Triangles.Add(quadTriangles[i] + vertIndex);
            }

            //Advance cursor
            float krn = 0;
            if (idx < Text.Length - 1)
            {
                krn = Font.GetKerning(c, Text[idx + 1]);
            }
            curPos.x += (charInfo.XAdvance + krn) * scale.x * spacing;
        }

        //Assign verts, uvs, tris and materials to mesh
        Mesh mesh = new Mesh();

        mesh.vertices     = vertices.ToArray();
        mesh.uv           = uvs.ToArray();
        mesh.subMeshCount = 1;
        mesh.SetTriangles(Triangles.ToArray(), 0);

        return(mesh);
    }
    public static void Work(BitmapFont bitmapFont, string exportPath)
    {
        Font font = new Font();

        Texture2D texture = bitmapFont.pageAtlas;
        float texW = texture.width;
        float texH = texture.height;

        CharacterInfo[] charInfos = new CharacterInfo[bitmapFont.chars.Length];
        Rect r;

        for (int i = 0; i < bitmapFont.chars.Length; i++)
        {
            BitmapChar charNode = bitmapFont.chars[i];
            CharacterInfo charInfo = new CharacterInfo();

            charInfo.index = charNode.id;
            charInfo.advance = (int)charNode.xAdvance;



            r = new Rect();
            r.x = charNode.position.x / bitmapFont.scaleW;
            r.y = charNode.position.y / bitmapFont.scaleH;
            r.width = charNode.size.x / bitmapFont.scaleW;
            r.height = charNode.size.y / bitmapFont.scaleH;
            r.y = 1f - r.y - r.height;

            if (bitmapFont.pageOffsets != null)
            {
                Rect pageOffset;
                if (charNode.chnl == 15)
                {
                    pageOffset = bitmapFont.pageOffsets[charNode.page];
                }
                else
                {
                    pageOffset = bitmapFont.pageOffsets[charNode.page * 4 + charNode.chnl >> 1];
                    //r.x = r.x * pageOffset.width + pageOffset.xMin;
                    //r.y = r.y * pageOffset.height + pageOffset.yMin;
                    //r.width *= pageOffset.width;
                    //r.height *= pageOffset.height;
                }

                r.x = r.x * pageOffset.width + pageOffset.xMin;
                r.y = r.y * pageOffset.height + pageOffset.yMin;
                r.width *= pageOffset.width;
                r.height *= pageOffset.height;

            }

            charInfo.uvBottomLeft = new Vector2(r.xMin, r.yMin);
            charInfo.uvBottomRight = new Vector2(r.xMax, r.yMin);
            charInfo.uvTopLeft = new Vector2(r.xMin, r.yMax);
            charInfo.uvTopRight = new Vector2(r.xMax, r.yMax);



            r = new Rect();
            r.x = charNode.offset.x;
            r.y = charNode.offset.y;
            r.width = charNode.size.x;
            r.height = charNode.size.y;
            r.y = -r.y;
            r.height = -r.height;

            //charInfo.minX = (int)r.xMin;
            //charInfo.minY = -(int)r.yMin;
            //charInfo.maxX = (int)r.xMax;
            //charInfo.maxY = -(int)r.yMax;
            charInfo.vert = r;
            //Rect t = new Rect();
            //t.xMin = r.xMin;
            //t.xMax = r.xMax;
            //t.yMin = r.yMin;
            //t.yMax = r.yMax;

            //Debug.Log(charNode.id+","+ t.x + "," + t.y + "," + t.width + "," + t.height);

            charInfos[i] = charInfo;
        }

        // Create material
        Shader shader = Shader.Find("GUI/Text Shader");
        Material material = new Material(shader);
        material.mainTexture = texture;
        AssetDatabase.CreateAsset(material, exportPath + ".mat");

        // Create font
        font.material = material;
        font.name = bitmapFont.face;
        font.characterInfo = charInfos;
        AssetDatabase.CreateAsset(font, exportPath + ".fontsettings");

        SetFontPrivateProperty(font, bitmapFont);
    }
Esempio n. 9
0
    public Rect GetUVRect(int c)
    {
        BitmapChar bitmapChar = GetBitmapChar(c);

        return(GetUVRect(bitmapChar));
    }
Esempio n. 10
0
    public Rect GetUVRect(BitmapChar bitmapChar)
    {
        //Convert positions/scale from AngleCode-format (pixels, top left origin) to uv format (0-1, bottom left origin)
        Vector2 scaledSize = new Vector2(bitmapChar.Size.x / ScaleW, bitmapChar.Size.y / ScaleH);
        Vector2 scaledPos = new Vector2(bitmapChar.Position.x / ScaleW, bitmapChar.Position.y / ScaleH);
        Vector2 uvCharPos = new Vector2(scaledPos.x, 1 - (scaledPos.y + scaledSize.y));

        //Scale and translate according to page atlas
        Rect offset = PageOffsets[bitmapChar.Page];
        uvCharPos = new Vector2(uvCharPos.x * offset.width + offset.xMin, uvCharPos.y * offset.height + offset.yMin);
        scaledSize = new Vector2(scaledSize.x * offset.width, scaledSize.y * offset.height);

        return new Rect(uvCharPos.x, uvCharPos.y, scaledSize.x, scaledSize.y);
    }