#region --- License --- /* This source file is released under the MIT license. See License.txt for more information. * Coded by Erik Ylvisaker and Stefanos Apostolopoulos. */ #endregion #region --- Using directives --- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Threading; using OpenTK.Graphics; using OpenTK.Platform; #endregion namespace Examples.WinForms { [Example("GLControl game loop", ExampleCategory.WinForms, 2)] public partial class W02_Immediate_Mode_Cube : Form { static float angle = 0.0f; #region --- Constructor --- public W02_Immediate_Mode_Cube() { InitializeComponent(); } #endregion #region OnLoad protected override void OnLoad(EventArgs e) { base.OnLoad(e); glControl.KeyDown += new KeyEventHandler(glControl_KeyDown); glControl.KeyUp += new KeyEventHandler(glControl_KeyUp); //glControl.Resize += new EventHandler(glControl_Resize); glControl.Paint += new PaintEventHandler(glControl_Paint); Text = GL.GetString(StringName.Vendor) + " " + GL.GetString(StringName.Renderer) + " " + GL.GetString(StringName.Version); GL.ClearColor(Color.MidnightBlue); GL.Enable(EnableCap.DepthTest); Application.Idle += Application_Idle; //glControl_Resize(glControl, EventArgs.Empty); } void glControl_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.F12) glControl.GrabScreenshot().Save("screenshot.png"); } #endregion #region OnClosing protected override void OnClosing(CancelEventArgs e) { Application.Idle -= Application_Idle; base.OnClosing(e); } #endregion #region Application_Idle event void Application_Idle(object sender, EventArgs e) { while (glControl.IsIdle) { Render(); } } #endregion #region GLControl.Resize event handler void glControl_Resize(object sender, EventArgs e) { OpenTK.GLControl c = sender as OpenTK.GLControl; if (c.ClientSize.Height == 0) c.ClientSize = new System.Drawing.Size(c.ClientSize.Width, 1); GL.Viewport(0, 0, c.ClientSize.Width, c.ClientSize.Height); double ratio = 0.0; ratio = c.ClientSize.Width / (double)c.ClientSize.Height; GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); Glu.Perspective(45.0, ratio, 1.0, 64.0); } #endregion #region GLControl.KeyDown event handler void glControl_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyData) { case Keys.Escape: this.Close(); break; } } #endregion #region GLControl.Paint event handler void glControl_Paint(object sender, PaintEventArgs e) { Render(); } #endregion #region private void Render() private void Render() { GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); Glu.LookAt( 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); GL.Rotate(angle, 0.0f, 1.0f, 0.0f); angle += 0.5f; GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); DrawCube(); glControl.SwapBuffers(); } #endregion #region private void DrawCube() private void DrawCube() { GL.Begin(BeginMode.Quads); GL.Color3(Color.Silver); GL.Vertex3(-1.0f, -1.0f, -1.0f); GL.Vertex3(-1.0f, 1.0f, -1.0f); GL.Vertex3(1.0f, 1.0f, -1.0f); GL.Vertex3(1.0f, -1.0f, -1.0f); GL.Color3(Color.Honeydew); GL.Vertex3(-1.0f, -1.0f, -1.0f); GL.Vertex3(1.0f, -1.0f, -1.0f); GL.Vertex3(1.0f, -1.0f, 1.0f); GL.Vertex3(-1.0f, -1.0f, 1.0f); GL.Color3(Color.Moccasin); GL.Vertex3(-1.0f, -1.0f, -1.0f); GL.Vertex3(-1.0f, -1.0f, 1.0f); GL.Vertex3(-1.0f, 1.0f, 1.0f); GL.Vertex3(-1.0f, 1.0f, -1.0f); GL.Color3(Color.IndianRed); GL.Vertex3(-1.0f, -1.0f, 1.0f); GL.Vertex3(1.0f, -1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 1.0f); GL.Vertex3(-1.0f, 1.0f, 1.0f); GL.Color3(Color.PaleVioletRed); GL.Vertex3(-1.0f, 1.0f, -1.0f); GL.Vertex3(-1.0f, 1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, -1.0f); GL.Color3(Color.ForestGreen); GL.Vertex3(1.0f, -1.0f, -1.0f); GL.Vertex3(1.0f, 1.0f, -1.0f); GL.Vertex3(1.0f, 1.0f, 1.0f); GL.Vertex3(1.0f, -1.0f, 1.0f); GL.End(); } #endregion private void glControl_Layout(object sender, LayoutEventArgs e) { glControl_Resize(sender, EventArgs.Empty); } #region public static void Main() /// /// Entry point of this example. /// [STAThread] public static void Main() { using (W02_Immediate_Mode_Cube example = new W02_Immediate_Mode_Cube()) { // Get the title and category of this example using reflection. ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); example.Text = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); example.ShowDialog(); } } #endregion } }