public Renderer(DynamicRenderable[] dynamics = null, Renderable[] renderables = null) { watch = new Stopwatch(); if (dynamics != null) _dynamics = dynamics; if (renderables != null) _renderables = renderables; }
Buffers Load(Renderable renderable) { int size; Buffers buf = new Buffers(); var shape = renderable.Shape; GL.GenBuffers(1, out buf.vertex_buffer_object); GL.GenBuffers(1, out buf.color_buffer_object); GL.GenBuffers(1, out buf.element_buffer_object); GL.GenBuffers(1, out buf.normal_buffer_object); GL.GenBuffers(1, out buf.tex_buffer_object); // Upload the vertex buffer. GL.BindBuffer(BufferTarget.ArrayBuffer, buf.vertex_buffer_object); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(shape.Vertices.Length * 3 * sizeof(float)), shape.Vertices, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (size != shape.Vertices.Length * 3 * sizeof(Single)) throw new ApplicationException(String.Format( "Problem uploading vertex buffer to VBO (vertices). Tried to upload {0} bytes, uploaded {1}.", shape.Vertices.Length * 3 * sizeof(Single), size)); // Upload the color buffer. GL.BindBuffer(BufferTarget.ArrayBuffer, buf.color_buffer_object); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(shape.Colors.Length * sizeof(int)), shape.Colors, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (size != shape.Colors.Length * sizeof(int)) throw new ApplicationException(String.Format( "Problem uploading vertex buffer to VBO (colors). Tried to upload {0} bytes, uploaded {1}.", shape.Colors.Length * sizeof(int), size)); // Upload the index buffer (elements inside the vertex buffer, not color indices as per the IndexPointer function!) GL.BindBuffer(BufferTarget.ElementArrayBuffer, buf.element_buffer_object); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(shape.Indices.Length * sizeof(Int32)), shape.Indices, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out size); if (size != shape.Indices.Length * sizeof(int)) throw new ApplicationException(String.Format( "Problem uploading vertex buffer to VBO (offsets). Tried to upload {0} bytes, uploaded {1}.", shape.Indices.Length * sizeof(int), size)); GL.BindBuffer(BufferTarget.ArrayBuffer, buf.normal_buffer_object); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(shape.Normals.Length * 3 * sizeof(float)), shape.Normals, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (size != shape.Normals.Length * sizeof(float) * 3) throw new ApplicationException(String.Format( "Problem uploading vertex buffer to VBO (offsets). Tried to upload {0} bytes, uploaded {1}.", shape.Normals.Length * sizeof(float) * 3, size)); GL.BindBuffer(BufferTarget.ArrayBuffer, buf.tex_buffer_object); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(shape.Texcoords.Length * 2 * sizeof(float)), shape.Texcoords, BufferUsageHint.StaticDraw); GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out size); if (size != shape.Texcoords.Length * sizeof(float) * 2) throw new ApplicationException(String.Format( "Problem uploading vertex buffer to VBO (offsets). Tried to upload {0} bytes, uploaded {1}.", shape.Texcoords.Length * sizeof(float) * 2, size)); return buf; }