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);
}