Opentk/Source/Examples/OpenTK/Fonts/FontRenderingAdvanced.cs
the_fiddler 6bbaad8bfb Moved and renamed examples to match the new example structurs.
Made example source code visible for all examples in example browser.
Updated Prebuild.exe to newest SVN version (resolves issues with resources).
Added .rtf and .resx files to Examples project in Prebuild.xml.
2009-04-20 09:48:33 +00:00

162 lines
5.3 KiB
C#

#region --- License ---
/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
* See license.txt for license info
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;
using System.Diagnostics;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Input;
namespace Examples.Tutorial
{
/// <summary>
/// Shows how to render and scroll large amounts of text.
/// </summary>
[Example("Font rendering (advanced)", ExampleCategory.OpenTK, "Fonts", 2, Documentation="FontRenderingAdvanced")]
public class FontRenderingAdvanced : GameWindow
{
Font serif = new Font(FontFamily.GenericSerif, 16.0f);
Font sans = new Font(FontFamily.GenericSansSerif, 18.0f);
TextPrinter text = new TextPrinter();
string poem = new StreamReader("Data/Poem.txt").ReadToEnd();
int lines; // How many lines the poem contains.
float scroll_speed;
float initial_position;
float wraparound_position;
float current_position;
public FontRenderingAdvanced()
: base(800, 600)
{ }
#region OnLoad
public override void OnLoad(EventArgs e)
{
GL.ClearColor(Color.MidnightBlue);
current_position = initial_position;
scroll_speed = -1.0f;
// Count the amount of lines in the text, to find out the correct
// warparound position. We want the text to scroll until the last
// line moves outside the screen, then warp it around from the
// other side of the screen.
foreach (char c in poem)
if (c == '\n')
lines++;
wraparound_position = -(lines + 1) * serif.Height;
}
#endregion
#region OnUnload
public override void OnUnload(EventArgs e)
{
if (serif != null)
serif.Dispose();
if (sans != null)
sans.Dispose();
}
#endregion
#region OnResize
protected override void OnResize(OpenTK.Platform.ResizeEventArgs e)
{
GL.Viewport(0, 0, Width, Height);
initial_position = Height + serif.Height; // Start one line below the screen.
wraparound_position = -(lines + 1) * serif.Height;
}
#endregion
#region OnUpdateFrame
public override void OnUpdateFrame(UpdateFrameEventArgs e)
{
if (Keyboard[Key.Space])
scroll_speed = 0;
if (Keyboard[Key.Down])
scroll_speed += 10;
if (Keyboard[Key.Up])
scroll_speed -= 10;
if (Keyboard[Key.Escape])
this.Exit();
}
#endregion
#region OnRenderFrame
public override void OnRenderFrame(RenderFrameEventArgs e)
{
GL.Clear(ClearBufferMask.ColorBufferBit);
// We'll start printing from the lower left corner of the screen. The text
// will slowly move updwards - the user can control the movement speed with
// the keyboard arrows and the space bar.
current_position += scroll_speed * (float)e.Time;
if (scroll_speed > 0.0f && current_position > initial_position)
current_position = wraparound_position;
else if (scroll_speed < 0.0f && current_position < wraparound_position)
current_position = initial_position;
// TextPrinter.Begin() sets up a 2d orthographic projection, with the x axis
// moving from 0 to viewport.Width (left to right) and the y axis from
// 0 to viewport.Height (top to bottom). This is the typical coordinate system
// used in 2d graphics, and is necessary for achieving pixel-perfect glyph rendering.
// TextPrinter.End() restores your previous projection/modelview matrices.
text.Begin();
// Print FPS counter. Since the counter changes per frame,
// it shouldn't be cached (TextPrinterOptions.NoCache).
text.Print((1.0 / e.Time).ToString("F2"), sans, Color.SpringGreen, new RectangleF(0, 0, Width, 0), TextPrinterOptions.NoCache, TextAlignment.Far);
// Print the actual text.
GL.Translate(0, current_position, 0);
text.Print(poem, serif, Color.White, new RectangleF(Width / 2, 0, Width / 2, 0), TextPrinterOptions.Default, TextAlignment.Far);
text.Print(poem, serif, Color.White, new RectangleF(0, 0, Width / 2, 0));
text.End();
SwapBuffers();
}
#endregion
#region public static void Main()
/// <summary>
/// Entry point of this example.
/// </summary>
[STAThread]
public static void Main()
{
using (FontRenderingAdvanced example = new FontRenderingAdvanced())
{
// Get the title and category of this example using reflection.
ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]);
example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title);
example.Run(30.0, 0.0);
}
}
#endregion
}
}