diff --git a/Source/Examples/ExampleLauncher.cs b/Source/Examples/ExampleLauncher.cs index 202d1c5f..65ce9e0e 100644 --- a/Source/Examples/ExampleLauncher.cs +++ b/Source/Examples/ExampleLauncher.cs @@ -88,8 +88,8 @@ namespace Examples } catch (Exception expt) { - MessageBox.Show(String.Format("Stacktrace:{0}{1}{0}{0}Inner exception:{0}{2}", - System.Environment.NewLine, expt.StackTrace, expt.InnerException), expt.Message); + MessageBox.Show(String.Format("{3}{0}Stacktrace:{0}{1}{0}{0}Inner exception:{0}{2}", + System.Environment.NewLine, expt.StackTrace, expt.InnerException, expt.Message), expt.Message); } } diff --git a/Source/Examples/Shapes/Cube.cs b/Source/Examples/Shapes/Cube.cs index c63b5700..205908b7 100644 --- a/Source/Examples/Shapes/Cube.cs +++ b/Source/Examples/Shapes/Cube.cs @@ -39,12 +39,14 @@ namespace Examples.Shapes public static readonly Vector3[] Normals = { - new Vector3( 1.0f, 0.0f, 0.0f), - new Vector3( 0.0f, 1.0f, 0.0f), - new Vector3( 0.0f, 0.0f, 1.0f), - new Vector3(-1.0f, 0.0f, 0.0f), - new Vector3( 0.0f, -1.0f, 0.0f), - new Vector3( 0.0f, 0.0f, -1.0f), + new Vector3(-1.0f, -1.0f, 1.0f), + new Vector3( 1.0f, -1.0f, 1.0f), + new Vector3( 1.0f, 1.0f, 1.0f), + new Vector3(-1.0f, 1.0f, 1.0f), + new Vector3(-1.0f, -1.0f, -1.0f), + new Vector3( 1.0f, -1.0f, -1.0f), + new Vector3( 1.0f, 1.0f, -1.0f), + new Vector3(-1.0f, 1.0f, -1.0f), }; public static readonly int[] Colors = diff --git a/Source/Examples/Tutorial/T04_Lit_Cube.cs b/Source/Examples/Tutorial/T04_Lit_Cube.cs index 52056b60..22c3db88 100644 --- a/Source/Examples/Tutorial/T04_Lit_Cube.cs +++ b/Source/Examples/Tutorial/T04_Lit_Cube.cs @@ -10,28 +10,149 @@ using System.Text; using OpenTK; using OpenTK.OpenGL; +using System.Drawing; namespace Examples.Tutorial { - class T04_Lit_Cube : GameWindow//, IExample + class T04_Lit_Cube : GameWindow, IExample { + float angle; + + #region Constructor + public T04_Lit_Cube() { - CreateWindow(new DisplayMode(800, 600)); + this.CreateWindow(new DisplayMode(800, 600)); } + #endregion + + #region OnLoad + + public override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + GL.ClearColor(Color.MidnightBlue); + GL.Enable(GL.Enums.EnableCap.DEPTH_TEST); + + GL.EnableClientState(GL.Enums.EnableCap.VERTEX_ARRAY); + GL.EnableClientState(GL.Enums.EnableCap.NORMAL_ARRAY); + GL.VertexPointer(3, GL.Enums.VertexPointerType.FLOAT, 0, Shapes.Cube.Vertices); + GL.NormalPointer(GL.Enums.NormalPointerType.FLOAT, 0, Shapes.Cube.Normals); + //GL.ColorPointer(4, GL.Enums.ColorPointerType.UNSIGNED_BYTE, 0, Shapes.Cube.Colors); + + // Enable Light 0 and set its parameters. + GL.Lightv(GL.Enums.LightName.LIGHT0, GL.Enums.LightParameter.POSITION, new float[] { 1.0f, 1.0f, 0.0f }); + GL.Lightv(GL.Enums.LightName.LIGHT0, GL.Enums.LightParameter.AMBIENT, new float[] { 0.0f, 0.0f, 0.0f, 1.0f }); + GL.Lightv(GL.Enums.LightName.LIGHT0, GL.Enums.LightParameter.DIFFUSE, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); + GL.Lightv(GL.Enums.LightName.LIGHT0, GL.Enums.LightParameter.SPECULAR, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); + GL.LightModelv(GL.Enums.LightModelParameter.LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f }); + GL.Enable(GL.Enums.EnableCap.LIGHTING); + GL.Enable(GL.Enums.EnableCap.LIGHT0); + + // Use GL.Material to set your object's material parameters.. + GL.Materialv(GL.Enums.MaterialFace.FRONT, GL.Enums.MaterialParameter.AMBIENT, new float[] { 0.3f, 0.3f, 0.9f, 1.0f }); + GL.Materialv(GL.Enums.MaterialFace.FRONT, GL.Enums.MaterialParameter.DIFFUSE, new float[] { 0.3f, 0.3f, 0.9f, 1.0f }); + GL.Materialv(GL.Enums.MaterialFace.FRONT, GL.Enums.MaterialParameter.SPECULAR, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); + GL.Materialv(GL.Enums.MaterialFace.FRONT, GL.Enums.MaterialParameter.EMISSION, new float[] { 0.0f, 0.0f, 0.0f, 1.0f }); + } + + #endregion + + #region OnResize + + /// + /// Called when the user resizes the window. + /// + /// Contains the new width/height of the window. + /// + /// You want the OpenGL viewport to match the window. This is the place to do it! + /// protected override void OnResize(OpenTK.Platform.ResizeEventArgs e) { base.OnResize(e); - //GL.ARB. + GL.Viewport(0, 0, Width, Height); + + double ratio = e.Width / (double)e.Height; + + GL.MatrixMode(GL.Enums.MatrixMode.PROJECTION); + GL.LoadIdentity(); + Glu.Perspective(45.0, ratio, 1.0, 64.0); } - #region IExample Members + #endregion + #region OnUpdateFrame + + /// + /// Prepares the next frame for rendering. + /// + /// + /// Place your control logic here. This is the place to respond to user input, + /// update object positions etc. + /// + public override void OnUpdateFrame(UpdateFrameEventArgs e) + { + if (Keyboard[0][OpenTK.Input.Key.Escape]) + { + this.Exit(); + return; + } + + if ((Keyboard[0][OpenTK.Input.Key.AltLeft] || Keyboard[0][OpenTK.Input.Key.AltRight]) && + Keyboard[0][OpenTK.Input.Key.Enter]) + { + Fullscreen = !Fullscreen; + } + + //angle += 180.0f * (float)e.Time; + angle += 3.0f; + if (angle > 720.0f) + angle -= 720.0f; + } + + #endregion + + #region OnRenderFrame + + /// + /// Place your rendering code here. + /// + public override void OnRenderFrame(RenderFrameEventArgs e) + { + GL.Clear(GL.Enums.ClearBufferMask.COLOR_BUFFER_BIT | GL.Enums.ClearBufferMask.DEPTH_BUFFER_BIT); + + GL.MatrixMode(GL.Enums.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); + + GL.DrawElements(GL.Enums.BeginMode.TRIANGLES, Shapes.Cube.Indices.Length, + GL.Enums.All.UNSIGNED_SHORT, Shapes.Cube.Indices); + + Context.SwapBuffers(); + } + + #endregion + + #region public void Launch() + + /// + /// Launches this example. + /// + /// + /// Provides a simple way for the example launcher to launch the examples. + /// public void Launch() { - this.Run(60.0, 60.0); + // Lock UpdateFrame and RenderFrame at 60Hz. + Run(60.0, 60.0); } #endregion diff --git a/Source/Examples/Tutorial/T10_GLSL_Cube.cs b/Source/Examples/Tutorial/T10_GLSL_Cube.cs index dccf3268..32980e1b 100644 --- a/Source/Examples/Tutorial/T10_GLSL_Cube.cs +++ b/Source/Examples/Tutorial/T10_GLSL_Cube.cs @@ -28,17 +28,21 @@ namespace Examples.Tutorial #region Shaders string[] vertex_shader_source = - { - "void main() {", - "gl_FrontColor = gl_Color;", - "gl_Position = ftransform();", - "}", - }; +{@" +void main() +{ + gl_FrontColor = gl_Color; + gl_Position = ftransform(); +} +"}; string[] fragment_shader_source = - { - "void main() { gl_FragColor = gl_Color; }\0" - }; +{@" +void main() +{ + gl_FragColor = gl_Color; +} +"}; #endregion @@ -76,9 +80,14 @@ namespace Examples.Tutorial return; } - GL.ClearColor(0.1f, 0.1f, 0.5f, 0.0f); + GL.ClearColor(Color.MidnightBlue); GL.Enable(GL.Enums.EnableCap.DEPTH_TEST); + GL.EnableClientState(GL.Enums.EnableCap.VERTEX_ARRAY); + GL.EnableClientState(GL.Enums.EnableCap.COLOR_ARRAY); + GL.VertexPointer(3, GL.Enums.VertexPointerType.FLOAT, 0, Shapes.Cube.Vertices); + GL.ColorPointer(4, GL.Enums.ColorPointerType.UNSIGNED_BYTE, 0, Shapes.Cube.Colors); + uint vertex_shader_object, fragment_shader_object; int status; uint shader_program; @@ -126,14 +135,20 @@ namespace Examples.Tutorial #region OnResize + /// + /// Called when the user resizes the window. + /// + /// Contains the new width/height of the window. + /// + /// You want the OpenGL viewport to match the window. This is the place to do it! + /// protected override void OnResize(OpenTK.Platform.ResizeEventArgs e) { base.OnResize(e); GL.Viewport(0, 0, Width, Height); - double ratio = 0.0; - ratio = this.Width / (double)this.Height; + double ratio = e.Width / (double)e.Height; GL.MatrixMode(GL.Enums.MatrixMode.PROJECTION); GL.LoadIdentity(); @@ -145,18 +160,27 @@ namespace Examples.Tutorial #region OnUpdateFrame /// - /// Occurs when it is time to update the next frame. + /// Prepares the next frame for rendering. /// - /// Not used yet. + /// + /// Place your control logic here. This is the place to respond to user input, + /// update object positions etc. + /// public override void OnUpdateFrame(UpdateFrameEventArgs e) { - base.OnUpdateFrame(e); - if (Keyboard[0][OpenTK.Input.Key.Escape]) { this.Exit(); + return; } + if ((Keyboard[0][OpenTK.Input.Key.AltLeft] || Keyboard[0][OpenTK.Input.Key.AltRight]) && + Keyboard[0][OpenTK.Input.Key.Enter]) + { + Fullscreen = !Fullscreen; + } + + //angle += 180.0f * (float)e.Time; angle += 3.0f; if (angle > 720.0f) angle -= 720.0f; @@ -166,10 +190,11 @@ namespace Examples.Tutorial #region OnRenderFrame + /// + /// Place your rendering code here. + /// public override void OnRenderFrame(RenderFrameEventArgs e) { - base.OnRenderFrame(e); - GL.Clear(GL.Enums.ClearBufferMask.COLOR_BUFFER_BIT | GL.Enums.ClearBufferMask.DEPTH_BUFFER_BIT); GL.MatrixMode(GL.Enums.MatrixMode.MODELVIEW); @@ -181,61 +206,14 @@ namespace Examples.Tutorial ); GL.Rotate(angle, 0.0f, 1.0f, 0.0f); - DrawCube(); + GL.DrawElements(GL.Enums.BeginMode.TRIANGLES, Shapes.Cube.Indices.Length, + GL.Enums.All.UNSIGNED_SHORT, Shapes.Cube.Indices); Context.SwapBuffers(); } #endregion - #region private void DrawCube() - - private void DrawCube() - { - GL.Begin(GL.Enums.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 - #region public void Launch() /// @@ -246,6 +224,7 @@ namespace Examples.Tutorial /// public void Launch() { + // Lock UpdateFrame and RenderFrame at 60Hz. Run(60.0, 60.0); }