void glControl_Load(object sender, EventArgs e)
{
if (glControlLoaded) return;
try
{
GL.ShadeModel(ShadingModel.Smooth);
GL.Enable(EnableCap.Lighting);
GL.Enable(EnableCap.Light0);
SetSun();
GL.ClearDepth(1.0d);
GL.Enable(EnableCap.DepthTest);
GL.Enable(EnableCap.CullFace);
GL.CullFace(CullFaceMode.Back);
// GL.Color() tracks objects ambient and diffuse color
GL.Enable(EnableCap.ColorMaterial);
GL.ColorMaterial(MaterialFace.Front, ColorMaterialParameter.AmbientAndDiffuse);
GL.DepthMask(true);
GL.DepthFunc(DepthFunction.Lequal);
GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);
GL.MatrixMode(MatrixMode.Projection);
GL.AlphaFunc(AlphaFunction.Greater, 0.5f);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
// Compatibility checks
OpenTK.Graphics.IGraphicsContextInternal context = glControl.Context as OpenTK.Graphics.IGraphicsContextInternal;
string glExtensions = GL.GetString(StringName.Extensions);
// VBO
RenderSettings.ARBVBOPresent = context.GetAddress("glGenBuffersARB") != IntPtr.Zero;
RenderSettings.CoreVBOPresent = context.GetAddress("glGenBuffers") != IntPtr.Zero;
RenderSettings.UseVBO = (RenderSettings.ARBVBOPresent || RenderSettings.CoreVBOPresent)
&& instance.GlobalSettings["rendering_use_vbo"];
// Occlusion Query
RenderSettings.ARBQuerySupported = context.GetAddress("glGetQueryObjectivARB") != IntPtr.Zero;
RenderSettings.CoreQuerySupported = context.GetAddress("glGetQueryObjectiv") != IntPtr.Zero;
RenderSettings.OcclusionCullingEnabled = (RenderSettings.CoreQuerySupported || RenderSettings.ARBQuerySupported)
&& instance.GlobalSettings["rendering_occlusion_culling_enabled2"];
// Mipmap
RenderSettings.HasMipmap = context.GetAddress("glGenerateMipmap") != IntPtr.Zero;
// Shader support
RenderSettings.HasShaders = glExtensions.Contains("vertex_shader") && glExtensions.Contains("fragment_shader");
// Multi texture
RenderSettings.HasMultiTexturing = context.GetAddress("glMultiTexCoord2f") != IntPtr.Zero;
RenderSettings.WaterReflections = instance.GlobalSettings["water_reflections"];
if (!RenderSettings.HasMultiTexturing || !RenderSettings.HasShaders)
{
RenderSettings.WaterReflections = false;
}
// Do textures have to have dimensions that are powers of two
RenderSettings.TextureNonPowerOfTwoSupported = glExtensions.Contains("texture_non_power_of_two");
// Occlusion culling
RenderSettings.OcclusionCullingEnabled = Instance.GlobalSettings["rendering_occlusion_culling_enabled2"]
&& (RenderSettings.ARBQuerySupported || RenderSettings.CoreQuerySupported);
// Shiny
RenderSettings.EnableShiny = Instance.GlobalSettings["scene_viewer_shiny"];
RenderingEnabled = true;
// Call the resizing function which sets up the GL drawing window
// and will also invalidate the GL control
glControl_Resize(null, null);
RenderingEnabled = false;
// glControl.Context.MakeCurrent(null);
TextureThreadContextReady.Reset();
var textureThread = new Thread(() => TextureThread())
{
IsBackground = true,
Name = "TextureDecodingThread"
};
textureThread.Start();
TextureThreadContextReady.WaitOne(1000, false);
// glControl.MakeCurrent();
InitWater();
InitShaders();
RenderingEnabled = true;
glControlLoaded = true;
LoadCurrentPrims();
}
catch (Exception ex)
{
RenderingEnabled = false;
Logger.Log("Failed to initialize OpenGL control", Helpers.LogLevel.Warning, Client, ex);
}
}