package openmods.renderer.shaders; import org.lwjgl.opengl.ARBDrawInstanced; import org.lwjgl.opengl.ARBInstancedArrays; import org.lwjgl.opengl.ARBVertexArrayObject; import org.lwjgl.opengl.ContextCapabilities; import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL33; import org.lwjgl.opengl.GLContext; public class ArraysHelper { static { initialize(); } public static IArrayMethods methods; static void initialize() { ContextCapabilities caps = GLContext.getCapabilities(); if (GLArrayMethods.isSupported(caps)) methods = new GLArrayMethods(); else if (ARBArrayMethods.isSupported(caps)) methods = new ARBArrayMethods(); } public static boolean isSupported() { return methods != null; } public static IArrayMethods methods() { return methods; } public static interface IArrayMethods { public int glGenVertexArrays(); public void glBindVertexArray(int array); public void glVertexAttribDivisor(int index, int divisor); public void glDrawArraysInstanced(int mode, int first, int count, int primcount); } private static class GLArrayMethods implements IArrayMethods { public static boolean isSupported(ContextCapabilities caps) { return caps.OpenGL33; } @Override public int glGenVertexArrays() { return GL30.glGenVertexArrays(); } @Override public void glBindVertexArray(int array) { GL30.glBindVertexArray(array); } @Override public void glVertexAttribDivisor(int index, int divisor) { GL33.glVertexAttribDivisor(index, divisor); } @Override public void glDrawArraysInstanced(int mode, int first, int count, int primcount) { GL31.glDrawArraysInstanced(mode, first, count, primcount); } } private static class ARBArrayMethods implements IArrayMethods { public static boolean isSupported(ContextCapabilities caps) { return caps.GL_ARB_instanced_arrays && caps.GL_ARB_vertex_array_object; } @Override public int glGenVertexArrays() { return ARBVertexArrayObject.glGenVertexArrays(); } @Override public void glBindVertexArray(int array) { ARBVertexArrayObject.glBindVertexArray(array); } @Override public void glVertexAttribDivisor(int index, int divisor) { ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); } @Override public void glDrawArraysInstanced(int mode, int first, int count, int primcount) { ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); } } }