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 Silnice { // Pole vrcholů jednotlivých částí silince VrcholANormala[] vrcholTexturaSilnice; uint[] indexSilnice; // Buffery pro silnici uint vertexSilniceBuff, indexSilniceBuff; // textura uint[] textury = new uint[1]; float poziceX; float poziceY; float poziceZ = 8; Time cas; // Odsazení vůči jiné textuře float odsazeni = (float)-0.01; public Silnice() { cas = new Time(); poziceX = 1; poziceY = 128; poziceZ = 8; //------------------------------------------Silnice int delka = 84; indexSilnice = new uint[delka * 4]; vrcholTexturaSilnice = new VrcholANormala[delka * 4]; for (int i = 0; i < delka; i++) // vygenerování jednotlivých čtverců { vrcholTexturaSilnice[0 + (i * 4)] = new VrcholANormala((float)poziceX + (3 * i), (float)(poziceY - 3) , (float)(poziceZ) - odsazeni, (float)0, (float)0, (float)1, (float)1, (float)0); vrcholTexturaSilnice[1 + (i * 4)] = new VrcholANormala((float)poziceX + (3 * i), (float)(poziceY ) , (float)(poziceZ) - odsazeni, (float)0, (float)0, (float)1, (float)1, (float)1); vrcholTexturaSilnice[3 + (i * 4)] = new VrcholANormala((float)poziceX + (3 * (1+i)) ,(float)(poziceY -3) , (float)(poziceZ) - odsazeni, (float)0, (float)0, (float)1, (float)0, (float)0); vrcholTexturaSilnice[2 + (i * 4)] = new VrcholANormala((float)poziceX + (3 * (1+i)), (float)(poziceY ), (float)(poziceZ) - odsazeni, (float)0, (float)0, (float)1, (float)0, (float)1); for (int j = 0; j < 4; j++) { indexSilnice[i * 4 + j] = (uint)(i * 4 + j); } } NahrajTexturu("textury/silnice.jpg", 0); vertexSilniceBuff = Dum.vytvorVertexBuffer(vrcholTexturaSilnice); indexSilniceBuff = Dum.vytvorIndexBuffer(indexSilnice); } /* * 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); textury[pozice] = gl.GenTexture(); gl.BindTexture(GL.TEXTURE_2D, textury[pozice]); 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); } } public void Destroy() { gl.DeleteBuffer(vertexSilniceBuff); gl.DeleteBuffer(indexSilniceBuff); } public void Render() { gl.ActiveTexture(GL.TEXTURE0); // nastavení Textur gl.Enable(GL.TEXTURE_2D); gl.BindTexture(GL.TEXTURE_2D, textury[0]); gl.TexEnvf(GL.TEXTURE_ENV, GL.TEXTURE_ENV_MODE, GL.MODULATE); gl.BindBuffer(GL.ARRAY_BUFFER, vertexSilniceBuff); // NAČTENÍ BUFFERU gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, indexSilniceBuff); 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, indexSilnice.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); cas.NextFrame(); } } }