All pastes #1701320 Raw Edit

Form1.cs

public text v1 · immutable
#1701320 ·published 2009-12-04 04:11 UTC
rendered paste body
using 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();
        }
    }
}