OpenGL 3D samples

These samples use the Tao Framework for OpenGL on .NET and Mono.


Tao is constantly changing (and moving), so these samples may be out of date.

Redbook.Cube example in boo

//cube.boo
//when compiling with booc, add references to
//Tao.OpenGl.dll and Tao.FreeGlut.dll
//You may need to find a build of the freeglut.dll.  I don't
//know where such a build is now.

import Tao.FreeGlut
import Tao.OpenGl

def Init():
	Gl.glClearColor(0.0, 0.0, 0.0, 0.0) //floats
	Gl.glShadeModel(Gl.GL_FLAT)

def Display():
	Gl.glClear(Gl.GL_COLOR_BUFFER_BIT)
	Gl.glColor3f(1.0, 1.0, 1.0) //floats

	// Clear the matrix
	Gl.glLoadIdentity()

	// Viewing transformation
	Glu.gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

	// Modeling transformation
	Gl.glScalef(1.0, 2.0, 1.0) //floats

	Glut.glutWireCube(1.0)
	Gl.glFlush()

def Keyboard(key as byte, x as int, y as int):
	if key == 27:  //escape key
		System.Environment.Exit(0)

def Reshape(w as int, h as int):
	Gl.glViewport(0, 0, w, h)
	Gl.glMatrixMode(Gl.GL_PROJECTION)
	Gl.glLoadIdentity()
	Gl.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0)
	Gl.glMatrixMode(Gl.GL_MODELVIEW)


Glut.glutInit()
Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB)
Glut.glutInitWindowSize(500, 500)
Glut.glutInitWindowPosition(100, 100)
Glut.glutCreateWindow("Cube")
Init()
Glut.glutDisplayFunc(Display)
Glut.glutKeyboardFunc(Keyboard)
Glut.glutReshapeFunc(Reshape)
Glut.glutMainLoop()

NeHe Example

This is a port of the base code sample from the NeHe OpenGL tutorials site. It uses the Tao Framework's SimpleOpenGlControl.

/*
nehe.boo

Requires boo: http://boo.codehaus.org/
and the Tao OpenGl Framework: http://www.mono-project.com/Tao

Compile using the booc compile line tool:
booc.exe -r:Tao.OpenGl.dll -r:Tao.OpenGl.Glu.dll -r:Tao.Platform.Windows.dll -out:nehe.exe NeHe.boo
*/

namespace NeheTest

import System
import System.Windows.Forms
import System.Drawing
import System.ComponentModel
import Tao.OpenGl
import Tao.Platform.Windows

private class MainForm(Form):
	private components as Container = null
	private glControl = SimpleOpenGlControl()

	def constructor():
		InitializeComponent()

	def InitializeComponent():
		SuspendLayout()
		glControl.Location = Point(0, 0)
		glControl.Dock = DockStyle.Fill
		glControl.Visible = true
		glControl.KeyDown += HandleKeyDown

		Controls.Add(glControl)

		//the "self" is always optional:
		self.AutoScaleBaseSize = System.Drawing.Size(5, 13)
		self.ClientSize = System.Drawing.Size(292, 273)
		self.Name = 'MainForm'
		self.Text = 'NeHe Boo Example'
		ResumeLayout(false)

	protected override def OnLoad(e as EventArgs):
		super(e)
		InitGL()

	protected override def OnResize(e as EventArgs):
		super(e)
		ResizeGL(glControl.Width, glControl.Height)

	def Run(): //main loop
		while Created:
			Invalidate(true)
			DrawGL()
			Application.DoEvents()

	protected override def Dispose(disposing as bool):
		if disposing:
			if components != null:
				components.Dispose()
		super(disposing)

	private def HandleKeyDown(sender, e as KeyEventArgs):
		if e.KeyCode == Keys.Escape: //char type will be in boo soon
			Close()

	private def InitGL():
		glControl.InitializeContexts()
		OnResize(null)

	private def ResizeGL(w as int, h as int):
		Gl.glViewport( 0, 0, w, h)
		Gl.glMatrixMode ( Gl.GL_PROJECTION )
		Gl.glLoadIdentity()
		Glu.gluPerspective( 60.0, cast(double,w) / h, 1.0,1000.0)
		Gl.glMatrixMode ( Gl.GL_MODELVIEW )
		Gl.glLoadIdentity()

	///////////////////// Drawing code ///////////////////////////
	private _lastMs = 0
	private _angle = 0.0

	private def DrawGL():
		if _lastMs == 0:
			_lastMs = DateTime.Now.Ticks

		currentMs = DateTime.Now.Ticks
		//int division will change from / to \ in future:
		milliseconds as long = (currentMs - _lastMs) / 10000
		_lastMs = currentMs
		Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT)
		Gl.glLoadIdentity()
		Gl.glTranslatef(0, 0, -6)
		Gl.glRotatef(_angle, 0, 1, 0)
		rot1 = 0
		while rot1 < 2.0:
			Gl.glRotatef(90, 0, 1, 0)
			Gl.glRotatef(180, 1, 0, 0)
			rot2 = 0
			while rot2 < 2:
				Gl.glRotatef(180, 0, 1, 0)
				Gl.glBegin(Gl.GL_TRIANGLES)
				Gl.glColor3f(1, 0, 0)
				Gl.glVertex3f(0, 1, 0)
				Gl.glColor3f(0, 1, 0)
				Gl.glVertex3f(-1, -1, 1)
				Gl.glColor3f(0, 0, 1)
				Gl.glVertex3f(1, -1, 1)
				Gl.glEnd()
				rot2 += 1

			rot1 += 1

		Gl.glFlush()
		_angle += milliseconds / 5.0


////////////// main part of script ////////////////////
res = MessageBox.Show(null, 'Would You Like To Run In Fullscreen Mode?',
                           'Start Fullscreen?',
			   MessageBoxButtons.YesNo,
			   MessageBoxIcon.Information )
form = MainForm()
if res == DialogResult.Yes:
	form.FormBorderStyle = FormBorderStyle.None
	form.Location = Point(0, 0)
	form.Size = Screen.PrimaryScreen.Bounds.Size

form.Show()
form.Run()