예제 #1
0
 static public GlyphCache GetCache(int height)
 {
     if (!caches.ContainsKey(height))
     {
         caches[height] = new GlyphCache(height);
     }
     return(caches[height]);
 }
예제 #2
0
        public void Dispose()
        {
            if (vertexBuffer != null)
            {
                vertexBuffer.Dispose();
                GC.SuppressFinalize(vertexBuffer);
                vertexBuffer = null;
            }

            if (glyphCache != null)
            {
                glyphCache.CleanUp();
                glyphCache = null;
            }
        }
예제 #3
0
        public void PrepareBatch()
        {
            if (glyphCache == null)
            {
                glyphCache = GlyphCache.GetCache(Height);
            }
            // Add All Glyphs

            foreach (Text3d t3d in Items)
            {
                foreach (char c in t3d.Text)
                {
                    glyphCache.AddGlyph(c);
                }
            }

            // Calculate Metrics

            TextObject.Text = "";
            TextObject.FontSize = (float)Height*.50f;

            System.Drawing.Font font = TextObject.Font;
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Near;

            Bitmap bmp = new Bitmap(20, 20);
            Graphics g = Graphics.FromImage(bmp);
            // Create Index Buffers

            List<PositionColoredTextured> verts = new List<PositionColoredTextured>();
            foreach (Text3d t3d in Items)
            {
                float fntAdjust = font.Size / 128f;
                String text = t3d.Text;
                SizeF size = g.MeasureString(text, font);

                float factor = .6666f;
                t3d.width = size.Width * (float)t3d.scale * factor;
                t3d.height = size.Height * (float)t3d.scale * factor;
                float left = 0;

                int charsLeft = text.Length;
                int index = 0;
                // SetMeasurableCharacterRanges has a limit of 32 items per call;
                while (charsLeft > 0)
                {
                    int charsNow = Math.Min(32, charsLeft);
                    charsLeft -= charsNow;

                    CharacterRange[] ranges = new CharacterRange[charsNow];
                    for (int i = 0; i < charsNow; i++)
                    {
                        ranges[i] = new CharacterRange(i + index, 1);
                    }

                    sf.SetMeasurableCharacterRanges(ranges);

                    Region[] reg = g.MeasureCharacterRanges(text, font, new RectangleF(new PointF(0, 0), size), sf);

                    for (int i = 0; i < (charsNow); i++)
                    {
                        GlyphItem item = glyphCache.GetGlyphItem(text[i+index]);
                        RectangleF rectf = reg[i].GetBounds(g);
                        RectangleF position = new RectangleF(rectf.Left * (float)t3d.scale * factor, rectf.Top * (float)t3d.scale * factor, rectf.Width * (float)t3d.scale * factor, rectf.Height * (float)t3d.scale * factor);

                        position = new RectangleF(left * (float)t3d.scale * factor, 0 * (float)t3d.scale * factor, item.Extents.Width * fntAdjust * (float)t3d.scale * factor, item.Extents.Height * fntAdjust * (float)t3d.scale * factor);
                        left += item.Extents.Width * fntAdjust;
                        t3d.AddGlyphPoints(verts, item.Size, position, item.UVRect);
                    }

                    index += charsNow;
                }
            }

            g.Dispose();
            GC.SuppressFinalize(g);
            bmp.Dispose();
            font.Dispose();

            vertCount = verts.Count;
            vertexBuffer = new PositionColorTexturedVertexBuffer11(vertCount, RenderContext11.PrepDevice);

            PositionColoredTextured[] vertBuf = (PositionColoredTextured[])vertexBuffer.Lock(0, 0); // Lock the buffer (which will return our structs)

            for (int i = 0; i < vertCount; i++)
            {
                vertBuf[i] = verts[i];
            }

            vertexBuffer.Unlock();

            glyphVersion = glyphCache.Version;
        }
예제 #4
0
        public void Dispose()
        {
            if (vertexBuffer != null)
            {
                vertexBuffer.Dispose();
                GC.SuppressFinalize(vertexBuffer);
                vertexBuffer = null;
            }

            if (glyphCache != null)
            {
                glyphCache.CleanUp();
                glyphCache = null;
            }
        }
예제 #5
0
 public Text3dBatch(GlyphCache glyphCache)
 {
     Height = glyphCache.Height;
 }
예제 #6
0
 public static GlyphCache GetCache(int height)
 {
     if (!caches.ContainsKey(height))
     {
         caches[height] = new GlyphCache(height);
     }
     return caches[height];
 }
예제 #7
0
        public void PrepareBatch()
        {
            if (glyphCache == null)
            {
                glyphCache = GlyphCache.GetCache(Height);
            }
            // Add All Glyphs

            foreach (Text3d t3d in Items)
            {
                foreach (char c in t3d.Text)
                {
                    glyphCache.AddGlyph(c);
                }
            }

            // Calculate Metrics

            TextObject.Text     = "";
            TextObject.FontSize = (float)Height * .50f;

            System.Drawing.Font font = TextObject.Font;
            StringFormat        sf   = new StringFormat();

            sf.Alignment = StringAlignment.Near;

            Bitmap   bmp = new Bitmap(20, 20);
            Graphics g   = Graphics.FromImage(bmp);
            // Create Index Buffers

            List <PositionColoredTextured> verts = new List <PositionColoredTextured>();

            foreach (Text3d t3d in Items)
            {
                float  fntAdjust = font.Size / 128f;
                String text      = t3d.Text;
                SizeF  size      = g.MeasureString(text, font);

                float factor = .6666f;
                t3d.width  = size.Width * (float)t3d.scale * factor;
                t3d.height = size.Height * (float)t3d.scale * factor;
                float left = 0;

                int charsLeft = text.Length;
                int index     = 0;
                // SetMeasurableCharacterRanges has a limit of 32 items per call;
                while (charsLeft > 0)
                {
                    int charsNow = Math.Min(32, charsLeft);
                    charsLeft -= charsNow;

                    CharacterRange[] ranges = new CharacterRange[charsNow];
                    for (int i = 0; i < charsNow; i++)
                    {
                        ranges[i] = new CharacterRange(i + index, 1);
                    }

                    sf.SetMeasurableCharacterRanges(ranges);

                    Region[] reg = g.MeasureCharacterRanges(text, font, new RectangleF(new PointF(0, 0), size), sf);



                    for (int i = 0; i < (charsNow); i++)
                    {
                        GlyphItem  item     = glyphCache.GetGlyphItem(text[i + index]);
                        RectangleF rectf    = reg[i].GetBounds(g);
                        RectangleF position = new RectangleF(rectf.Left * (float)t3d.scale * factor, rectf.Top * (float)t3d.scale * factor, rectf.Width * (float)t3d.scale * factor, rectf.Height * (float)t3d.scale * factor);

                        position = new RectangleF(left * (float)t3d.scale * factor, 0 * (float)t3d.scale * factor, item.Extents.Width * fntAdjust * (float)t3d.scale * factor, item.Extents.Height * fntAdjust * (float)t3d.scale * factor);
                        left    += item.Extents.Width * fntAdjust;
                        t3d.AddGlyphPoints(verts, item.Size, position, item.UVRect);
                    }

                    index += charsNow;
                }
            }

            g.Dispose();
            GC.SuppressFinalize(g);
            bmp.Dispose();
            font.Dispose();

            vertCount    = verts.Count;
            vertexBuffer = new PositionColorTexturedVertexBuffer11(vertCount, RenderContext11.PrepDevice);

            PositionColoredTextured[] vertBuf = (PositionColoredTextured[])vertexBuffer.Lock(0, 0); // Lock the buffer (which will return our structs)

            for (int i = 0; i < vertCount; i++)
            {
                vertBuf[i] = verts[i];
            }

            vertexBuffer.Unlock();

            glyphVersion = glyphCache.Version;
        }
예제 #8
0
 public Text2dBatch(GlyphCache glyphCache)
 {
     Height = glyphCache.Height;
 }
예제 #9
0
        public void PrepareBatch()
        {
            if (glyphCache == null)
            {
                glyphCache = GlyphCache.GetCache(Height);
            }
            // Add All Glyphs

            foreach (var t3d in Items)
            {
                foreach (var c in t3d.Text)
                {
                    glyphCache.AddGlyph(c);
                }
            }

            // Calculate Metrics

            TextObject.Text = "";
            TextObject.FontSize = Height * .50f;

            var font = TextObject.Font;
            var sf = new StringFormat();
            sf.Alignment = StringAlignment.Near;

            var bmp = new Bitmap(20, 20);
            var g = Graphics.FromImage(bmp);
            // Create Index Buffers

            var verts = new List<PositionTextured>();
            foreach (var t2d in Items)
            {
                var text = t2d.Text;
                var size = g.MeasureString(text, font);

                float factor = 1;
                t2d.width = size.Width  * factor;
                t2d.height = size.Height *  factor;

                var charsLeft = text.Length;
                var index = 0;
                // SetMeasurableCharacterRanges has a limit of 32 items per call;
                while (charsLeft > 0)
                {
                    var charsNow = Math.Min(32, charsLeft);
                    charsLeft -= charsNow;

                    var ranges = new CharacterRange[charsNow];
                    for (var i = 0; i < charsNow; i++)
                    {
                        ranges[i] = new CharacterRange(i + index, 1);
                    }

                    sf.SetMeasurableCharacterRanges(ranges);

                    var reg = g.MeasureCharacterRanges(text, font, new RectangleF(new PointF(0, 0), size), sf);

                    for (var i = 0; i < (charsNow); i++)
                    {
                        var item = glyphCache.GetGlyphItem(text[i + index]);
                        var rectf = reg[i].GetBounds(g);
                        var position = new RectangleF(rectf.Left  * factor, rectf.Top *  factor, rectf.Width *  factor, rectf.Height * factor);
                        var sizef = new SizeF(item.Size.Width  * factor, item.Size.Height *  factor);

                        t2d.AddGlyphPoints(verts, item.Size, position, item.UVRect);
                    }

                    index += charsNow;
                }
            }

            g.Dispose();
            GC.SuppressFinalize(g);
            bmp.Dispose();
            font.Dispose();

            vertCount = verts.Count;
            vertexBuffer = new PositionTexturedVertexBuffer11(vertCount, RenderContext11.PrepDevice);

            var vertBuf = (PositionTextured[])vertexBuffer.Lock(0, 0); // Lock the buffer (which will return our structs)

            for (var i = 0; i < vertCount; i++)
            {
                vertBuf[i] = verts[i];
            }

            vertexBuffer.Unlock();

            glyphVersion = glyphCache.Version;
        }