From 7c187e705ec383cfc0c124da1228c1d8d018ffee Mon Sep 17 00:00:00 2001 From: the_fiddler Date: Thu, 8 Nov 2007 16:43:03 +0000 Subject: [PATCH] Added SansSerif font. --- Source/Examples/Tutorial/Fonts.cs | 89 ++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 7 deletions(-) diff --git a/Source/Examples/Tutorial/Fonts.cs b/Source/Examples/Tutorial/Fonts.cs index 255b131b..c7e0a098 100644 --- a/Source/Examples/Tutorial/Fonts.cs +++ b/Source/Examples/Tutorial/Fonts.cs @@ -19,12 +19,16 @@ using OpenTK.Math; namespace Examples.Tutorial { + /// + /// Tests Font loading and rendering. + /// class Fonts : GameWindow, IExample { public Fonts() : base(new DisplayMode(800, 600), String.Format("OpenTK | Tutorial {0}: Fonts", order)) { } - ITextPrinter text = new TextPrinter(); + ITextPrinter printer = new TextPrinter(); + const string text = "Hello, world!"; // Load some different TextureFont sizes to compare their quality. TextureFont[] fonts = new TextureFont[] @@ -39,25 +43,70 @@ namespace Examples.Tutorial new TextureFont(new Font(FontFamily.GenericSerif, 20.0f)), new TextureFont(new Font(FontFamily.GenericSerif, 22.0f)), - new TextureFont(new Font(FontFamily.GenericSerif, 24.0f)), + new TextureFont(new Font(FontFamily.GenericSerif, 24.0f, FontStyle.Bold)), new TextureFont(new Font(FontFamily.GenericSerif, 26.0f)), new TextureFont(new Font(FontFamily.GenericSerif, 28.0f)), new TextureFont(new Font(FontFamily.GenericSerif, 30.0f)), - new TextureFont(new Font(FontFamily.GenericSerif, 32.0f)), + new TextureFont(new Font(FontFamily.GenericSerif, 32.0f, FontStyle.Italic)), new TextureFont(new Font(FontFamily.GenericSerif, 34.0f)), new TextureFont(new Font(FontFamily.GenericSerif, 36.0f)), new TextureFont(new Font(FontFamily.GenericSerif, 38.0f)), + + new TextureFont(new Font(FontFamily.GenericSansSerif, 8.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 10.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 12.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 14.0f)), + + new TextureFont(new Font(FontFamily.GenericSansSerif, 16.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 18.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 20.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 22.0f)), + + new TextureFont(new Font(FontFamily.GenericSansSerif, 24.0f, FontStyle.Bold)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 26.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 28.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 30.0f)), + + new TextureFont(new Font(FontFamily.GenericSansSerif, 32.0f, FontStyle.Italic)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 34.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 36.0f)), + new TextureFont(new Font(FontFamily.GenericSansSerif, 38.0f)), }; TextHandle[] handles; // Used to cache the strings we want to print. + /// + /// To maintain high rendering performance, we need to cache the text + /// we wish to draw, for each font we want to draw it with. To achieve + /// this, we use the TextPrinter.Prepare() method, which returns a + /// TextHandle - i.e. a handle to the cached text. + /// + /// We can use these TextHandles with the TextPrinter.Draw() method + /// to draw text with very high performance. + /// + /// + /// public override void OnLoad(EventArgs e) { GL.ClearColor(Color.SteelBlue); handles = new TextHandle[fonts.Length]; for (int i = handles.Length; --i >= 0; ) - text.Prepare("Hello, world!", fonts[i], out handles[i]); + printer.Prepare(text, fonts[i], out handles[i]); + } + + /// + /// It is important that we need to call the Dispose() methods to reclaim of + /// each and every TextHandle and TextureFont to reclaim the unamanged + /// (OpenGL) resources they are using. + /// + /// + public override void OnUnload(EventArgs e) + { + foreach (TextHandle h in handles) + h.Dispose(); + foreach (TextureFont f in fonts) + f.Dispose(); } protected override void OnResize(OpenTK.Platform.ResizeEventArgs e) @@ -71,6 +120,21 @@ namespace Examples.Tutorial this.Exit(); } + /// + /// To render pixel-perfect text, we have to setup a 2d display projection + /// with a width/height that corresponds to our current Viewport. + /// In OpenGL this can be easily achieved using the GL.Ortho method. + /// + /// It is still possible to render text in a 3d projection, but it will + /// be very hard to achieve pixel-perfect precision. + /// + /// + /// To achieve the highest possible performance, render your 3d scene first. + /// At the end of the RenderFrame call, setup a 2d projection and render all + /// text in one go. + /// + /// + /// public override void OnRenderFrame(RenderFrameEventArgs e) { GL.Clear(ClearBufferMask.ColorBufferBit); @@ -82,10 +146,21 @@ namespace Examples.Tutorial GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); - // Font size test: - for (int i = 0; i < handles.Length; i++) + // Print using the first font. + for (int i = 0; i < handles.Length / 2; i++) { - text.Draw(handles[i]); + printer.Draw(handles[i]); + GL.Translate(0, fonts[i].Height, 0); + } + + // Move to the right, and print using the second font. + float width, height; + fonts[handles.Length / 2 - 1].MeasureString(text, out width, out height); + GL.LoadIdentity(); + GL.Translate(width + 32.0f, 0, 0); + for (int i = handles.Length / 2; i < handles.Length; i++) + { + printer.Draw(handles[i]); GL.Translate(0, fonts[i].Height, 0); }