using System; using System.Drawing; using System.Drawing.Imaging; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; using OpenTK.Input; namespace Examples.Tutorial { [Example("Texture Matrix Wormhole", ExampleCategory.OpenGL, "1.x", Documentation = "TextureMatrix")] class TextureMatrix : GameWindow { public TextureMatrix() : base(800, 600, new GraphicsMode(32, 16, 0, 4)) { VSync = VSyncMode.On; } int Texture; int list; protected override void OnLoad(EventArgs e) { GL.ClearColor(0f, 0f, 0f, 0f); GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); Texture = LoadTexture("Data/Textures/logo-dark.jpg"); GL.Enable(EnableCap.Texture2D); list = GL.GenLists(1); GL.NewList(list, ListMode.Compile); { const int slices = 32; const float distance = 0.25f; GL.Begin(BeginMode.Quads); for (float scale = 0.26f; scale < 5f; scale += distance) for (int i = 0; i < slices; i++) { Vector3 MiddleCenter = new Vector3((float)(Math.Sin((double)i / slices * 2 * Math.PI) * scale), (float)(Math.Cos((double)i / slices * 2 * Math.PI) * scale), (float)(1f / scale)); Vector3 MiddleRight = new Vector3((float)(Math.Sin((double)(i + 1) / slices * 2 * Math.PI) * scale), (float)(Math.Cos((double)(i + 1) / slices * 2 * Math.PI) * scale), (float)(1f / scale)); Vector3 BottomRight = new Vector3((float)(Math.Sin((double)(i + 1) / slices * 2 * Math.PI) * (scale - distance)), (float)(Math.Cos((double)(i + 1) / slices * 2 * Math.PI) * (scale - distance)), (float)(1f / (scale - distance))); Vector3 BottomCenter = new Vector3((float)(Math.Sin((double)i / slices * 2 * Math.PI) * (scale - distance)), (float)(Math.Cos((double)i / slices * 2 * Math.PI) * (scale - distance)), (float)(1f / (scale - distance))); GL.TexCoord2(1f, 0f); GL.Vertex3(MiddleCenter); GL.TexCoord2(0f, 0f); GL.Vertex3(MiddleRight); GL.TexCoord2(0f, 1f); GL.Vertex3(BottomRight); GL.TexCoord2(1f, 1f); GL.Vertex3(BottomCenter); } GL.End(); } GL.EndList(); } protected override void OnResize(EventArgs e) { GL.Viewport(this.ClientRectangle); Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, Width / (float)Height, 1.0f, 50.0f); GL.MatrixMode(MatrixMode.Projection); GL.LoadMatrix(ref projection); } protected override void OnUpdateFrame(FrameEventArgs e) { if (Keyboard[Key.Escape]) Exit(); } protected override void OnRenderFrame(FrameEventArgs e) { GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.MatrixMode(MatrixMode.Texture); GL.Translate(e.Time / 2, -e.Time, 0f); Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY); GL.MatrixMode(MatrixMode.Modelview); GL.LoadMatrix(ref modelview); GL.Translate(0f, 0f, 1.5f); GL.Rotate(Mouse.X, Vector3.UnitY); GL.Rotate(Mouse.Y, Vector3.UnitX); GL.CallList(list); SwapBuffers(); } public static int LoadTexture(string filename) { TextureTarget Target = TextureTarget.Texture2D; int texture; GL.GenTextures(1, out texture); GL.BindTexture(Target, texture); float version = Single.Parse(GL.GetString(StringName.Version).Substring(0, 3), System.Globalization.CultureInfo.InvariantCulture); if (version >= 1.4) { GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.GenerateMipmap, (int)All.True); GL.TexParameter(Target, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear); } else { GL.TexParameter(Target, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); } GL.TexParameter(Target, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(Target, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); GL.TexParameter(Target, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); Bitmap bitmap = new Bitmap(filename); BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(Target, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); GL.Finish(); bitmap.UnlockBits(data); if (GL.GetError() != ErrorCode.NoError) throw new Exception("Error loading texture " + filename); return texture; } /// /// The main entry point for the application. /// [STAThread] static void Main() { using (TextureMatrix example = new TextureMatrix()) { // Get the title and category of this example using reflection. ExampleAttribute info = ((ExampleAttribute)example.GetType().GetCustomAttributes(false)[0]); example.Title = String.Format("OpenTK | {0} {1}: {2}", info.Category, info.Difficulty, info.Title); example.Run(30.0, 0.0); } } } }