NeHe 1 OpenGL Tutorial:Code

From SDL.NET

This is the source to NeHe_1_OpenGL_Tutorial in some of the compliant languages.

Visual Basic .NET

This code needs to be updated to the latest version of SDL.NET

Imports System

Imports SdlDotNet
Imports Tao.Sdl
Imports Tao.OpenGl

Public Class Tute_001

#Region "Variables"
	Private Const width As Integer = 800
	Private Const height As Integer = 600
	Private Const bpp As Integer = 32
	Private fini As Boolean
	Private screen As Surface
#End Region

	Public Shared Sub Main()
		Dim t As Tute_001 = New Tute_001
		t.Run()
		t = Nothing
	End Sub

	Public Sub New()
		Initialise()
	End Sub

	Public Sub Initialise()
		AddHandler Events.KeyboardDown, AddressOf Me.KeyDown
		AddHandler Events.Quit, AddressOf Me.Quit
		screen = Video.SetVideoModeWindowOpenGL(width, height, True)
		Reshape()
	End Sub

	Public Sub Reshape()
		Gl.glViewport(0, 0, width, height)
		Gl.glMatrixMode(Gl.GL_PROJECTION)
		Gl.glLoadIdentity()

		' Calculate The Aspect Ratio Of The Window
		Glu.gluPerspective(45.0F, width / height, 0.1F, 100.0F)

		Gl.glMatrixMode(Gl.GL_MODELVIEW)
		Gl.glLoadIdentity()
	End Sub

	Public Function InitGL() As Integer
		Gl.glShadeModel(Gl.GL_SMOOTH)
		Gl.glClearColor(0.0F, 0.0F, 0.0F, 0.0F)
		Gl.glClearDepth(1.0F)
		Gl.glEnable(Gl.GL_DEPTH_TEST)
		Gl.glDepthFunc(Gl.GL_LEQUAL)

		Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST)

		Return True
	End Function

	Public Function DrawGLScene() As Integer
		Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
		Gl.glLoadIdentity()

		Video.GLSwapBuffers()

		Return True
	End Function

	Private Sub KeyDown(ByVal sender As Object, ByVal e As KeyboardEventArgs)
		Select Case e.Key
			Case Key.Escape
				fini = True
			Case Key.F1
				If screen.FullScreen = True Then
					screen = Video.SetVideoModeWindowOpenGL(width, height,  True)
				Else
					screen = Video.SetVideoModeOpenGL(width, height, bpp)
				End If
				Reshape()
		End Select
	End Sub

	Private Sub Quit(ByVal sender As Object, ByVal e As QuitEventArgs)
		fini = True
	End Sub

	Public Sub Run()
		InitGL()
		While (fini = False)
			While Events.Poll
			End While

			DrawGLScene()

		End While
	End Sub


 End Class

C#

using System;
using System.Reflection;
using System.Diagnostics.CodeAnalysis;

using SdlDotNet.Core;
using SdlDotNet.Input;
using SdlDotNet.Graphics;
using Tao.OpenGl;

namespace SdlDotNetExamples.NeHe
{
    /// <summary>
    /// Lesson 01: Setting Up An OpenGL Window
    /// </summary>
    public class NeHe001
    {
        #region Fields

        //Width of screen
        int width = 640;
        //Height of screen
        int height = 480;
        // Bits per pixel of screen
        int bpp = 16;
        // Surface to render on
        Surface screen;

        /// <summary>
        /// Width of window
        /// </summary>
        protected int Width
        {
            get
            {
                return width;
            }
        }

        /// <summary>
        /// Height of window
        /// </summary>
        protected int Height
        {
            get
            {
                return height;
            }
        }

        /// <summary>
        /// Bits per pixel of surface
        /// </summary>
        protected int BitsPerPixel
        {
            get
            {
                return this.bpp;
            }
        }

        /// <summary>
        /// Lesson title
        /// </summary>
        public static string Title
        {
            get
            {
                return "Lesson 01: Setting Up An OpenGL Window";
            }
        }

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Basic constructor
        /// </summary>
        public NeHe001()
        {
            Initialize();
        }

        #endregion Constructors

        #region Lesson Setup
        /// <summary>
        /// Initializes methods common to all NeHe lessons
        /// </summary>
        protected void Initialize()
        {
            // Sets keyboard events
            Events.KeyboardDown += new EventHandler<KeyboardEventArgs>(this.KeyDown);
            // Sets the ticker to update OpenGL Context
            Events.Tick += new EventHandler<TickEventArgs>(this.Tick);
            Events.Quit += new EventHandler<QuitEventArgs>(this.Quit);
            
            // Set the Frames per second.
            Events.Fps = 60;
            // Sets Window icon and title
            this.WindowAttributes();
            // Creates SDL.NET Surface to hold an OpenGL scene
            screen = Video.SetVideoMode(width, height, true, true);
        }

        /// <summary>
        /// Sets Window icon and caption
        /// </summary>
        protected void WindowAttributes()
        {
            Video.WindowIcon();
            Video.WindowCaption =
                "SDL.NET - NeHe Lesson " +
                this.GetType().ToString().Substring(
                this.GetType().ToString().Length - 3);
        }

        /// <summary>
        /// Resizes window
        /// </summary>
        protected virtual void Reshape()
        {
            this.Reshape(100.0F);
        }

        /// <summary>
        /// Resizes window
        /// </summary>
        /// <param name="distance"></param>
        protected virtual void Reshape(float distance)
        {
            // Reset The Current Viewport
            Gl.glViewport(0, 0, width, height);
            // Select The Projection Matrix
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            // Reset The Projection Matrix
            Gl.glLoadIdentity();
            // Calculate The Aspect Ratio Of The Window
            Glu.gluPerspective(45.0F, (width / (float)height), 0.1F, distance);
            // Select The Modelview Matrix
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            // Reset The Modelview Matrix
            Gl.glLoadIdentity();
        }

        /// <summary>
        /// Initializes the OpenGL system
        /// </summary>
        protected virtual void InitGL()
        {
            // Enable Smooth Shading
            Gl.glShadeModel(Gl.GL_SMOOTH);
            // Black Background
            Gl.glClearColor(0.0F, 0.0F, 0.0F, 0.5F);
            // Depth Buffer Setup
            Gl.glClearDepth(1.0F);
            // Enables Depth Testing
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            // The Type Of Depth Testing To Do
            Gl.glDepthFunc(Gl.GL_LEQUAL);
            // Really Nice Perspective Calculations
            Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);
        }

        #endregion Lesson Setup

        #region void DrawGLScene
        /// <summary>
        /// Renders the scene
        /// </summary>
        protected virtual void DrawGLScene()
        {
            // Clear Screen And Depth Buffer
            Gl.glClear((Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT));
            // Reset The Current Modelview Matrix
            Gl.glLoadIdentity();
        }
        #endregion void DrawGLScene

        #region Event Handlers

        private void KeyDown(object sender, KeyboardEventArgs e)
        {
            switch (e.Key)
            {
                case Key.Escape:
                    // Will stop the app loop
                    Events.QuitApplication();
                    break;
                case Key.F1:
                    // Toggle fullscreen
                    if ((screen.FullScreen))
                    {
                        screen = Video.SetVideoMode(width, height, true, true, true);
                        this.WindowAttributes();
                    }
                    else
                    {
                        screen = Video.SetVideoMode(width, height, true, true);
                    }
                    Reshape();
                    break;
            }
        }

        private void Tick(object sender, TickEventArgs e)
        {
            DrawGLScene();
            Video.GLSwapBuffers();
        }

        private void Quit(object sender, QuitEventArgs e)
        {
            Events.QuitApplication();
        }

        #endregion Event Handlers

        #region Run Loop
        /// <summary>
        /// Starts lesson
        /// </summary>
        [STAThread]
        public static void Main()
        {
            NeHe001 t = new NeHe001();
            t.Reshape();
            t.InitGL();
            Events.Run();
        }

        #endregion Run Loop
    }
}