using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using OpenGL4NET; namespace ZPG_2011_Moulis_Jan_A09B0359P { class SingleObject { private uint vboData; private uint iboData; private List listVertex; private PositionNormalColorTexCoor[] vertex; private List listIndex; private uint[] index; private float enlarge; public SingleObject(float enlarge) { this.enlarge = enlarge; listVertex = new List(); listIndex = new List(); } public void addVertex(float x, float y, float z, float nx, float ny, float nz, float r, float g, float b, float texCoorX, float texCoorY) { //Console.WriteLine("x: "+x+" ; y: "+y+" ; z: "+z+" ; nx: "+nx+" ; ny: "+ny+" ; nz: "+nz+" ; r: "+r+" ; g: "+g+" ; b: "+b+" ; tcX: "+texCoorX+" ; tcY: "+texCoorY); listVertex.Add(new PositionNormalColorTexCoor(enlarge * x, enlarge * y, enlarge * z, nx, ny, nz, r, g, b, texCoorX, texCoorY)); } public void addFace(uint p1, uint p2, uint p3) { listIndex.Add(p1); listIndex.Add(p2); listIndex.Add(p3); } public void createBuffers() { vertex = listVertex.ToArray(); index = listIndex.ToArray(); // Priprava vbo vboData = gl.GenBuffer(); gl.BindBuffer(GL.ARRAY_BUFFER, vboData); gl.BufferData(GL.ARRAY_BUFFER, vertex.Length * PositionNormalColorTexCoor.SizeInBytes, vertex, GL.STATIC_DRAW); gl.BindBuffer(GL.ARRAY_BUFFER, 0); // Priiprava ibo iboData = gl.GenBuffer(); gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, iboData); gl.BufferData(GL.ELEMENT_ARRAY_BUFFER, index.Length * sizeof(uint), index, GL.STATIC_DRAW); gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, 0); gl.BindBuffer(GL.ARRAY_BUFFER, 0); } public void render(uint texture) { gl.ActiveTexture(GL.TEXTURE0); gl.Enable(GL.TEXTURE_2D); gl.BindTexture(GL.TEXTURE_2D, texture); gl.TexEnvf(GL.TEXTURE_ENV, GL.TEXTURE_ENV_MODE, GL.MODULATE); gl.BindBuffer(GL.ARRAY_BUFFER, vboData); // NAČTENÍ BUFFERU gl.BindBuffer(GL.ELEMENT_ARRAY_BUFFER, iboData); gl.ClientActiveTexture(GL.TEXTURE0); gl.EnableClientState(GL.TEXTURE_COORD_ARRAY); // TEXTURA gl.TexCoordPointer(2, GL.FLOAT, PositionNormalColorTexCoor.SizeInBytes, (IntPtr)36); gl.EnableClientState(GL.COLOR_ARRAY); gl.ColorPointer(3, GL.FLOAT, PositionNormalColorTexCoor.SizeInBytes, (IntPtr)24); gl.EnableClientState(GL.NORMAL_ARRAY); // NORMÁLY gl.NormalPointer(GL.FLOAT, PositionNormalColorTexCoor.SizeInBytes, (IntPtr)12); gl.EnableClientState(GL.VERTEX_ARRAY); // POZICE BODU gl.VertexPointer(3, GL.FLOAT, PositionNormalColorTexCoor.SizeInBytes, (IntPtr)0); gl.DrawElements(GL.TRIANGLES, index.Length, GL.UNSIGNED_INT, (IntPtr)0); // VYKRESLENÍ gl.DisableClientState(GL.VERTEX_ARRAY); gl.DisableClientState(GL.NORMAL_ARRAY); gl.DisableClientState(GL.COLOR_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); } public void destroy() { gl.DeleteBuffer(vboData); gl.DeleteBuffer(iboData); } [StructLayout(LayoutKind.Sequential)] struct PositionNormalColorTexCoor { public Vector3 position; public Vector3 normal; public Vector3 color; public float texCoorX; public float texCoorY; /// /// Konstruktor z floatu /// /// X /// Y /// Z /// nX /// nY /// nZ /// R /// G /// B /// texCoorX /// texCoorY public PositionNormalColorTexCoor(float x, float y, float z, float nx, float ny, float nz, float r, float g, float b, float texCoorX, float texCoorY) { position = new Vector3(x, y, z); normal = new Vector3(nx, ny, nz); color = new Vector3(r, g, b); this.texCoorX = texCoorX; this.texCoorY = texCoorY; } /// /// Velikost struktury v bytech /// public static int SizeInBytes { get { return Marshal.SizeOf(typeof(PositionNormalColorTexCoor)); } } } } }