using System; using System.Collections.Generic; using System.Linq; using System.Text; using OpenGL4NET; using System.IO; using System.Runtime.InteropServices; using System.Drawing; using System.Windows.Forms; namespace ZPG_semestralka { class Klice { public int cisloKlice; float poziceX; float poziceY; float poziceZ; float sirkaXY = (float)0.5; Time cass; // Nastavení textury uint textura; Vector4 poziceTextury; // Pole jednotlivých bodů oběktu VrcholANormala[] vrcholTextura; // Pole jednotlivých stran uint[] indexStran = new uint[]{ 0,1,2,3 , 4,5,6,7 , 8,9,10,11 ,12,13,14,15 ,16,17,18,19, 20,21,22,23 }; // Buffery uint vertexVrcholyBuff, indexStranBuff; /* Konstrukotor pro vytvoření klíče * poziceX - udává pozici klíče na ose X; * poziceY - udává pozice klíče na ose Y * poziceZ - udává výšku v jaké se bude nacházet klíč * cisloKliče - udává číslo dveří které pujdou tímto klíčem otevřít */ public Klice(float poziceX, float poziceY, float poziceZ, int cisloKlice) { this.poziceTextury = GLW.vratPozTexCisla(cisloKlice); this.poziceX = poziceX; this.poziceY = poziceY; this.poziceZ = poziceZ; this.cisloKlice = cisloKlice; cass = new Time(); vrcholTextura = new VrcholANormala[24]; NahrajTexturu("textury/cisla.jpg", 1); } // Fce. pro uvolnění Bufferů public void Destroy() { gl.DeleteBuffer(vertexVrcholyBuff); gl.DeleteBuffer(indexStranBuff); } /* * Hlavní renderovací metoda pro klíč */ public void Render() { float sin = (float)Math.Abs(Math.Sin(((float)cass.FrameTime/1000)% (Math.PI*4))); float cos = (float)Math.Abs(Math.Cos(((float)cass.FrameTime / 1000) % (Math.PI * 2))); vrcholTextura[0] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)0, (float)1); vrcholTextura[1] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)1, (float)1); vrcholTextura[2] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)1, (float)0); vrcholTextura[3] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)0, (float)0); vrcholTextura[4] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ+1, (float)0, (float)0, (float)1, (float)0, (float)1); vrcholTextura[5] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ+1, (float)0, (float)0, (float)1, (float)1, (float)1); vrcholTextura[6] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ+1, (float)0, (float)0, (float)1, (float)1, (float)0); vrcholTextura[7] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ+1, (float)0, (float)0, (float)1, (float)0, (float)0); vrcholTextura[8] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.z); vrcholTextura[9] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.z); vrcholTextura[10] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.w); vrcholTextura[11] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.w); vrcholTextura[12] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.z); vrcholTextura[13] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.z); vrcholTextura[14] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.w); vrcholTextura[15] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.w); vrcholTextura[16] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.z); vrcholTextura[17] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.z); vrcholTextura[18] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.w); vrcholTextura[19] = new VrcholANormala(poziceX + sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.w); vrcholTextura[20] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.z); vrcholTextura[21] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ + 1, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.z); vrcholTextura[22] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY - sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.y, (float)poziceTextury.w); vrcholTextura[23] = new VrcholANormala(poziceX - sirkaXY * cos, poziceY + sirkaXY * sin, poziceZ, (float)0, (float)0, (float)1, (float)poziceTextury.x, (float)poziceTextury.w); vertexVrcholyBuff = Dum.vytvorVertexBuffer(vrcholTextura); indexStranBuff = Dum.vytvorIndexBuffer(indexStran); gl.ActiveTexture(GL.TEXTURE0); // Nastavení texturování gl.Enable(GL.TEXTURE_2D); gl.BindTexture(GL.TEXTURE_2D, textura); gl.TexEnvf(GL.TEXTURE_ENV, GL.TEXTURE_ENV_MODE, GL.MODULATE); gl.BindBuffer(GL.ARRAY_BUFFER, vertexVrcholyBuff); gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexStranBuff); gl.ClientActiveTexture(GL.TEXTURE0); gl.EnableClientState(GL.TEXTURE_COORD_ARRAY); // TEXTURA gl.TexCoordPointer(2, GL.FLOAT, VrcholANormala.SizeInBytes, (IntPtr)24); gl.EnableClientState(GL.NORMAL_ARRAY); // NORMÁLY gl.NormalPointer(GL.FLOAT, VrcholANormala.SizeInBytes, (IntPtr)12); gl.EnableClientState(GL.VERTEX_ARRAY); // POZICE BODU gl.VertexPointer(3, GL.FLOAT, VrcholANormala.SizeInBytes, (IntPtr)0); gl.DrawElements(GL.QUADS, indexStran.Length, GL.UNSIGNED_INT, (IntPtr)0); gl.DisableClientState(GL.VERTEX_ARRAY); // ÚKLID gl.DisableClientState(GL.NORMAL_ARRAY); gl.DisableClientState(GL.TEXTURE_COORD_ARRAY); gl.BindBuffer(GL.ARRAY_BUFFER, 0); gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, 0); gl.BindTexture(GL.TEXTURE_2D, 0); gl.ActiveTexture(GL.TEXTURE0); gl.Disable(GL.TEXTURE_2D); gl.BindTexture(GL.TEXTURE_2D, 0); cass.NextFrame(); } /* * Metoda určí zda byl Klíč sebrán. * x - X pozice pozorovatele na mapě * y - Y pozice pozorovatele na mapě */ public bool sebralJsemPredmet(float x, float y) { if (poziceX - sirkaXY < x && x < poziceX + sirkaXY && poziceY - sirkaXY < y && y < poziceY + sirkaXY) { return true; } return false; } /* * Metoda nahraje texturu do pole textur * nazev - cesta k dané textuře * pozice - pozice v poli textur kam se má textura uložit */ public void NahrajTexturu(String nazev, int pozice) { Bitmap image = null; if (!File.Exists(nazev)) { System.Console.Out.WriteLine("Textura nebyla nalezena!"); } else { image = new Bitmap(nazev); 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); textura = gl.GenTexture(); gl.BindTexture(GL.TEXTURE_2D, textura); gl.TexImage2D(GL.TEXTURE_2D, 0, (int)GL.RGB, image.Width, image.Height, 0, GL.BGR_EXT, GL.UNSIGNED_BYTE, bitmapdata.Scan0); gl.TexParameterf(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR); gl.TexParameterf(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR); gl.TexParameterf(GL.TEXTURE_2D, GL.TEXTURE_WRAP_S, GL.REPEAT); gl.TexParameterf(GL.TEXTURE_2D, GL.TEXTURE_WRAP_T, GL.REPEAT); } } } }