rendered paste bodyusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tao.OpenGl;
namespace nehe01
{
public partial class Form1 : Form
{
public float xrot;
public float yrot;
public float xspeed;
public float yspeed;
public float z = -5;
public bool finished;
public uint[] texture;
bool[] keys;
bool light; // Lighting on/off
bool blend; // Blending on/off
bool lIsPressed;
bool fIsPressed;
bool bIsPressed;
float[] LightAmbient = { 0.5f, 0.5f, 0.5f, 1 };
float[] LightDiffuse = { 1, 1, 1, 1 };
float[] LightPosition = { 3, 0, 2, 1 };
uint filter;
public Form1()
{
this.ClientSize = new System.Drawing.Size(640, 480);
finished = false;
texture = new uint[3];
keys = new bool[256];
InitializeComponent();
this.simpleOpenGlControl1.InitializeContexts();
InitGl();
SetView();
if (!DrawGlScene())
MessageBox.Show("Error while Setting up view");
}
#region Keystrokes
bool keystrokeProcessed = false;
protected override bool ProcessDialogKey(Keys keyData)
{
keystrokeProcessed = true;
const float keyAcceleration = 0.02f;
switch (keyData)
{
case Keys.Down:
this.xspeed += keyAcceleration;
break;
case Keys.Up:
this.xspeed -= keyAcceleration;
break;
case Keys.Left:
this.yspeed -= keyAcceleration;
break;
case Keys.Right:
this.yspeed += keyAcceleration;
break;
case Keys.PageDown:
this.z += (2.5f * keyAcceleration);
break;
case Keys.PageUp:
this.z -= (2.5f * keyAcceleration);
break;
case Keys.Escape:
finished = true;
break;
case Keys.Alt | Keys.F4:
Application.Exit(); //uu... abrupt exit.
break;
default:
//if ((int)(Keys.Control & keyData) != 0)
//{
// //The control key is pressed. Do something here if you want.
// return true;
//}
//else if ((int)(Keys.Alt & keyData) != 0)
//{
// //The Alt key is pressed. Do something here if you want.
// return true;
//}
//else
//{
keystrokeProcessed = false; // let KeyPress event handler handle this keystroke.
//}
break;
}
return base.ProcessDialogKey(keyData);
}
protected void OurView_OnKeyUp(object Sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.L) // Release the lighting toggle key lock
this.lIsPressed = false;
else if (e.KeyCode == Keys.F) // Release the filter cycle key lock
this.fIsPressed = false;
else if (e.KeyCode == Keys.B)
this.bIsPressed = false;
}
protected void OurView_OnKeyDown(object Sender, KeyEventArgs e)
{
if (keystrokeProcessed)
return;
if (e.KeyCode == Keys.L && !this.lIsPressed)
{
this.lIsPressed = true;
this.light = !this.light;
if (this.light)
{
Gl.glEnable(Gl.GL_LIGHTING);
}
else
{
Gl.glEnable(Gl.GL_LIGHTING);
}
}
else if (e.KeyCode == Keys.F && !this.fIsPressed)
{
this.fIsPressed = true;
this.filter = (filter + 1) % 3;
}
else if (e.KeyCode == Keys.B && !this.bIsPressed) // Is B Key Pressed And bp FALSE?
{
bIsPressed = true; // If So, bp Becomes TRUE
blend = !blend; // Toggle blend TRUE / FALSE
if (blend) // Is blend TRUE?
{
Gl.glEnable(Gl.GL_BLEND); // Turn Blending On
Gl.glDisable(Gl.GL_DEPTH_TEST); // Turn Depth Testing Off
}
else // Otherwise
{
Gl.glDisable(Gl.GL_BLEND); // Turn Blending Off
Gl.glEnable(Gl.GL_DEPTH_TEST); // Turn Depth Testing On
}
}
}
#endregion Keystrokes
#region Visual Update
private void timer1_Tick(object sender, EventArgs e)
{
this.xrot += this.xspeed;
this.yrot += this.yspeed;
this.Refresh();
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
SetView();
}
#endregion Visual Update
#region Setting the Scene
private void SetView()
{
int height = (this.Height <= 0) ? 1 : this.Height;
int width = this.Width;
Gl.glViewport(0, 0, width, height); // Reset the current viewport
Gl.glMatrixMode(Gl.GL_PROJECTION); // Select the projection matrix mode
Gl.glLoadIdentity(); // Reset the projection matrix
// Calculate the aspect ratio of the window
double ratio = Convert.ToDouble(width) / Convert.ToDouble(height);
Glu.gluPerspective(45, ratio, 0.1, 100);
Gl.glMatrixMode(Gl.GL_MODELVIEW); // Select the modelview matrix
Gl.glLoadIdentity();
}
private bool InitGl()
{
LoadGLTextures();
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
Gl.glClearDepth(1.0f); // Depth Buffer Setup
Gl.glEnable(Gl.GL_DEPTH_TEST); // Enables Depth Testing
Gl.glDepthFunc(Gl.GL_LEQUAL); // The Type Of Depth Test To Do
Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST); // Really Nice Perspective Calculations
Gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f); // Full Brightness, 50% Alpha ( NEW )
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE); // Blending Function For Translucency Based On Source Alpha Value ( NEW )
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_AMBIENT, this.LightAmbient);
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, this.LightDiffuse);
Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_POSITION, this.LightPosition);
Gl.glEnable(Gl.GL_LIGHT1);
if (this.light)
{
Gl.glEnable(Gl.GL_LIGHTING);
}
return true;
}
#endregion Setting the Scene
private void LoadGLTextures()
{
Bitmap image = null;
string file = @"Data\Glass.bmp";
try
{
image = new Bitmap(file);
}
catch (System.ArgumentException)
{
MessageBox.Show("Could not load " + file + ".");
this.finished = true;
}
if (image != null)
{
image.RotateFlip(RotateFlipType.RotateNoneFlipY);
System.Drawing.Imaging.BitmapData bitmapdata;
Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);
bitmapdata = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Gl.glGenTextures(3, this.texture);
// Create Nearest Filtered Texture
Gl.glBindTexture(Gl.GL_TEXTURE_2D, this.texture[0]);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST); // Linear Filtering
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST); // Linear Filtering
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB8, image.Width, image.Height, 0, Gl.GL_BGR_EXT, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
// Create Linear Filtered Texture
Gl.glBindTexture(Gl.GL_TEXTURE_2D, this.texture[1]);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB, image.Width, image.Height, 0, Gl.GL_BGR_EXT, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
// Create MipMapped Texture
Gl.glBindTexture(Gl.GL_TEXTURE_2D, this.texture[2]);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_NEAREST);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB, image.Width, image.Height, 0, Gl.GL_BGR_EXT, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, 3, bitmapdata.Width, bitmapdata.Height, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0); // ( NEW )
image.UnlockBits(bitmapdata);
image.Dispose();
}
}
bool DrawGlScene()
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glLoadIdentity();
Gl.glTranslatef(0, 0, this.z);
Gl.glRotatef(xrot, 1, 0, 0);
Gl.glRotatef(yrot, 0, 1, 0);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[filter]);
Gl.glBegin(Gl.GL_QUADS);
// Front Face
Gl.glNormal3f(0.0f, 0.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
// Back Face
Gl.glNormal3f(0.0f, 0.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);
// Top Face
Gl.glNormal3f(0.0f, 1.0f, 0.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);
// Bottom Face
Gl.glNormal3f(0.0f, -1.0f, 0.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
// Right face
Gl.glNormal3f(1.0f, 0.0f, 0.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, -1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(1.0f, -1.0f, 1.0f);
// Left Face
Gl.glNormal3f(-1.0f, 0.0f, 0.0f);
Gl.glTexCoord2f(0.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
Gl.glTexCoord2f(1.0f, 0.0f); Gl.glVertex3f(-1.0f, -1.0f, 1.0f);
Gl.glTexCoord2f(1.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, 1.0f);
Gl.glTexCoord2f(0.0f, 1.0f); Gl.glVertex3f(-1.0f, 1.0f, -1.0f);
Gl.glEnd();
return true;
}
private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)
{
DrawGlScene();
}
}
}