public void Render(RenderableObject renderObject, GameCamera camera) { // TODO this should actually enqueue rather than render but hey! if (renderObject.IsWireframe) { m_Graphics.FillMode(OpenGL.Mode.GL_LINE); } if (renderObject.DepthBufferEnabled == false) { m_Graphics.Disable(OpenGL.Enable.GL_DEPTH_TEST); } // TODO This texture setting needs improving if (renderObject.CubemapTextureId > -1) { m_Graphics.BindTexture(renderObject.CubemapTextureId, OpenGL.TextureType.GL_TEXTURE_CUBE_MAP, OpenGL.TextureUnits.GL_TEXTURE0); } if (renderObject.TextureIdA > -1) { m_Graphics.BindTexture(renderObject.TextureIdA, OpenGL.TextureType.GL_TEXTURE_2D, OpenGL.TextureUnits.GL_TEXTURE0); } if (renderObject.TextureIdB > -1) { m_Graphics.BindTexture(renderObject.TextureIdB, OpenGL.TextureType.GL_TEXTURE_2D, OpenGL.TextureUnits.GL_TEXTURE1); } m_Graphics.BindShaderProgram(renderObject.ShaderId); renderObject.OnApplyUniforms(this, camera); if (renderObject.BlendMode == BlendModes.Alpha) { m_Graphics.Enable(OpenGL.Enable.GL_BLEND); m_Graphics.BlendFunc(OpenGL.BlendFunc.GL_SRC_ALPHA, OpenGL.BlendFunc.GL_ONE_MINUS_SRC_ALPHA); } m_Graphics.BindVertexArrayObject(renderObject.VaoId); if (renderObject.HasIndexBuffer) { m_Graphics.DrawElements(PrimitiveType.TriangleList, renderObject.VertexCount, DrawElementsType.UnsignedInt, 0); } else { m_Graphics.DrawArrays(PrimitiveType.TriangleList, 0, renderObject.VertexCount); } if (renderObject.DepthBufferEnabled == false) { m_Graphics.Enable(OpenGL.Enable.GL_DEPTH_TEST); } if (renderObject.IsWireframe) { m_Graphics.FillMode(OpenGL.Mode.GL_FILL); } if (renderObject.BlendMode == BlendModes.Alpha) { m_Graphics.Disable(OpenGL.Enable.GL_BLEND); } }