Пример #1
0
        /// <summary>
        /// Draw buffers
        /// </summary>
        /// <param name="mode">Element type to draw</param>
        /// <param name="update_values">Specifies if Glorg should update uniforms</param>
        /// <remarks>This function uses the currently set vertex and index buffer (if any) If no index buffer is set, the function will assume that elements follows each other in the vertex buffer.</remarks>
        public void Draw(DrawMode mode, bool update_values)
        {
            bool        found_err = false;
            OpenGLError err;

            GL.glGetError();
            if (update_values)
            {
                modelview_matrix.Update();
                projection_matrix.Update();
                texture_matrix.Update();
                normal_matrix.Update();

                err = (OpenGLError)GL.glGetError();
                if (err != OpenGLError.NoError && !encountered_draw_error)
                {
                    Debugging.Debug.WriteLine("Setting standard uniforms: " + err.ToString());
                    found_err = true;
                }
                if (active_shader != null)
                {
                    foreach (var u in active_shader.uniforms)
                    {
                        u.SetValue();
                    }
                    err = (OpenGLError)GL.glGetError();
                    if (err != OpenGLError.NoError && !encountered_draw_error)
                    {
                        Debugging.Debug.WriteLine("Setting uniforms: " + err.ToString());
                        found_err = true;
                    }
                }
            }
            if (vertex_buffer == null)
            {
                throw new InvalidOperationException("No vertex buffer has been set.");
            }
            if (index_buffer != null)
            {
                GL.glDrawElements((uint)mode, index_buffer.Count, index_buffer.Type, IntPtr.Zero);
            }
            else
            {
                GL.glDrawArrays((uint)mode, 0, vertex_buffer.Count);
            }
            err = (OpenGLError)GL.glGetError();
            if (err != OpenGLError.NoError && !encountered_draw_error)
            {
                Debugging.Debug.WriteLine("Drawing: " + err.ToString());
                found_err = true;
            }
            if (found_err)
            {
                encountered_draw_error = true;
            }
        }