public void Draw(IRender render) { render.Apply(); if (demo.EnableVertexBuffer) { if (meshVertexBuffer != -1) { if (meshIndexBuffer != -1) { GL.EnableClientState(ArrayCap.VertexArray); GL.EnableClientState(ArrayCap.NormalArray); GL.EnableClientState(ArrayCap.TextureCoordArray); GL.BindBuffer(BufferTarget.ArrayBuffer, meshVertexBuffer); GL.BindBuffer(BufferTarget.ElementArrayBuffer, meshIndexBuffer); GL.VertexPointer(3, VertexPointerType.Float, VertexPositionNormalTexture.SizeInBytes, IntPtr.Zero); GL.NormalPointer(NormalPointerType.Float, VertexPositionNormalTexture.SizeInBytes, (IntPtr)Vector3.SizeInBytes); GL.TexCoordPointer(2, TexCoordPointerType.Float, VertexPositionNormalTexture.SizeInBytes, (IntPtr)(Vector3.SizeInBytes + Vector3.SizeInBytes)); GL.DrawElements(PrimitiveType.Triangles, indexCount, meshIndicesType, 0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); GL.VertexPointer(3, VertexPointerType.Float, 0, IntPtr.Zero); GL.NormalPointer(NormalPointerType.Float, 0, IntPtr.Zero); GL.TexCoordPointer(2, TexCoordPointerType.Float, 0, IntPtr.Zero); GL.DisableClientState(ArrayCap.VertexArray); GL.DisableClientState(ArrayCap.NormalArray); GL.DisableClientState(ArrayCap.TextureCoordArray); } else { GL.EnableClientState(ArrayCap.VertexArray); GL.EnableClientState(ArrayCap.NormalArray); GL.EnableClientState(ArrayCap.TextureCoordArray); GL.BindBuffer(BufferTarget.ArrayBuffer, meshVertexBuffer); GL.VertexPointer(3, VertexPointerType.Float, VertexPositionNormalTexture.SizeInBytes, IntPtr.Zero); GL.NormalPointer(NormalPointerType.Float, VertexPositionNormalTexture.SizeInBytes, (IntPtr)Vector3.SizeInBytes); GL.TexCoordPointer(2, TexCoordPointerType.Float, VertexPositionNormalTexture.SizeInBytes, (IntPtr)(Vector3.SizeInBytes + Vector3.SizeInBytes)); GL.DrawArrays(PrimitiveType.Triangles, 0, vertexCount); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.VertexPointer(3, VertexPointerType.Float, 0, IntPtr.Zero); GL.NormalPointer(NormalPointerType.Float, 0, IntPtr.Zero); GL.TexCoordPointer(2, TexCoordPointerType.Float, 0, IntPtr.Zero); GL.DisableClientState(ArrayCap.VertexArray); GL.DisableClientState(ArrayCap.NormalArray); GL.DisableClientState(ArrayCap.TextureCoordArray); } } } else { VertexPositionNormalTexture v1, v2, v3; if (meshIndices16Bit != null) { GL.Begin(PrimitiveType.Triangles); for (int i = 0; i < indexCount; i += 3) { v1 = meshVertices[meshIndices16Bit[i]]; v2 = meshVertices[meshIndices16Bit[i + 1]]; v3 = meshVertices[meshIndices16Bit[i + 2]]; GL.TexCoord2(v1.TextureCoordinate); GL.Normal3(v1.Normal); GL.Vertex3(v1.Position); GL.TexCoord2(v2.TextureCoordinate); GL.Normal3(v2.Normal); GL.Vertex3(v2.Position); GL.TexCoord2(v3.TextureCoordinate); GL.Normal3(v3.Normal); GL.Vertex3(v3.Position); } GL.End(); } else if (meshIndices32Bit != null) { GL.Begin(PrimitiveType.Triangles); for (int i = 0; i < indexCount; i += 3) { v1 = meshVertices[meshIndices32Bit[i]]; v2 = meshVertices[meshIndices32Bit[i + 1]]; v3 = meshVertices[meshIndices32Bit[i + 2]]; GL.TexCoord2(v1.TextureCoordinate); GL.Normal3(v1.Normal); GL.Vertex3(v1.Position); GL.TexCoord2(v2.TextureCoordinate); GL.Normal3(v2.Normal); GL.Vertex3(v2.Position); GL.TexCoord2(v3.TextureCoordinate); GL.Normal3(v3.Normal); GL.Vertex3(v3.Position); } GL.End(); } else { GL.Begin(PrimitiveType.Triangles); for (int i = 0; i < vertexCount; i += 3) { v1 = meshVertices[i]; v2 = meshVertices[i + 1]; v3 = meshVertices[i + 2]; GL.TexCoord2(v1.TextureCoordinate); GL.Normal3(v1.Normal); GL.Vertex3(v1.Position); GL.TexCoord2(v2.TextureCoordinate); GL.Normal3(v2.Normal); GL.Vertex3(v2.Position); GL.TexCoord2(v3.TextureCoordinate); GL.Normal3(v3.Normal); GL.Vertex3(v3.Position); } GL.End(); } } }