From a3fffb47be3464bc17fa9461c5009dfdd86f22b9 Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Sun, 22 Mar 2026 11:10:55 -0700 Subject: [PATCH] Ban GL usage. * Everything must go through GLSM/Render Backend --- dependencies.gradle | 2 + .../client/debug/OpenGLDebugging.java | 707 ------------------ .../AngelicaRenderSystemService.java | 8 +- .../angelica/proxy/ClientProxy.java | 20 - .../com/prupe/mcpatcher/hd/FancyDial.java | 21 +- .../com/prupe/mcpatcher/hd/MipmapHelper.java | 7 +- .../prupe/mcpatcher/mal/resource/GLAPI.java | 4 +- .../iris/gl/program/ProgramUniforms.java | 3 +- .../angelica/arch/NoDirectGLCallsTest.java | 49 ++ 9 files changed, 70 insertions(+), 751 deletions(-) delete mode 100644 src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java create mode 100644 src/test/java/com/gtnewhorizons/angelica/arch/NoDirectGLCallsTest.java diff --git a/dependencies.gradle b/dependencies.gradle index e1a441f5b..04923996a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -146,6 +146,8 @@ dependencies { testImplementation('org.junit.platform:junit-platform-engine') testImplementation('org.junit.platform:junit-platform-reporting') testImplementation('org.junit.platform:junit-platform-launcher') + + testImplementation('com.tngtech.archunit:archunit-junit5:1.4.1') } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java b/src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java deleted file mode 100644 index 3e409e3fd..000000000 --- a/src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java +++ /dev/null @@ -1,707 +0,0 @@ -package com.gtnewhorizons.angelica.client.debug; - -import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; -import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.ITextureObject; -import net.minecraft.util.ResourceLocation; -import org.apache.commons.io.FileUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.joml.Matrix4f; -import org.lwjgl.BufferUtils; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; -import org.lwjgl.opengl.GL13; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferInt; -import java.io.File; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; - -// Adapted from https://github.com/makamys/CoreTweaks/blob/master/src/main/java/makamys/coretweaks/util/OpenGLDebugging.java; -// originally from https://github.com/TheGreyGhost/MinecraftByExample/blob/1-8final/src/main/java/minecraftbyexample/usefultools/OpenGLdebugging.java - -public class OpenGLDebugging { - - public static final Logger LOGGER = LogManager.getLogger("gldumper"); - - private static final Consumer LINE_LOGGER = LOGGER::debug; - private static final Set seenErrors = new HashSet<>(); - public static final String GL_IS_ENABLED = "glIsEnabled()"; - public static final String GL_GET_BOOLEANV = "glGetBooleanv()"; - public static final String GL_GET_INTEGERV = "glGetIntegerv()"; - public static final String GL_GET_FLOATV = "glGetFloatv()"; - - public static class GLproperty { - - public GLproperty(int glConstant, String name, String description, String category, String fetchCommand) { - this.gLConstant = glConstant; - this.name = name; - this.description = description; - this.category = category; - this.fetchCommand = fetchCommand; - } - - public int gLConstant; - public String name; - public String description; - public String category; - public String fetchCommand; - - static final ByteBuffer byteBuffer = BufferUtils.createByteBuffer(16); - static final IntBuffer intBuffer = BufferUtils.createIntBuffer(16); - static final FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(16); - - public String getAsString(boolean glsm) { - switch(fetchCommand) { - case GL_IS_ENABLED: { - return "" + (glsm ? GLStateManager.glIsEnabled(gLConstant) : GL11.glIsEnabled(gLConstant)); - } - case GL_GET_BOOLEANV: { - if(GLStateManager.HAS_MULTIPLE_SET.contains(gLConstant)) { - byteBuffer.clear(); - if(glsm) { - GLStateManager.glGetBoolean(gLConstant, byteBuffer); - } else { - GL11.glGetBoolean(gLConstant, byteBuffer); - } - final StringBuilder out = new StringBuilder(); - for (int i = 0; i < byteBuffer.capacity(); ++i) { - out.append(i == 0 ? "" : ", ").append(byteBuffer.get(i)); - } - return out.toString(); - } else { - return "" + (glsm ? GLStateManager.glGetBoolean(gLConstant) : GL11.glGetBoolean(gLConstant)); - } - } - case GL_GET_INTEGERV: { - if(GLStateManager.HAS_MULTIPLE_SET.contains(gLConstant)) { - intBuffer.clear(); - if(glsm) { - GLStateManager.glGetInteger(gLConstant, intBuffer); - } else { - GL11.glGetInteger(gLConstant, intBuffer); - } - final StringBuilder out = new StringBuilder(); - for (int i = 0; i < intBuffer.remaining(); ++i) { - out.append(i == 0 ? "" : ", ").append(intBuffer.get(i)); - } - return out.toString(); - } else { - return "" + (glsm ? GLStateManager.glGetInteger(gLConstant) : GL11.glGetInteger(gLConstant)); - } - } - case GL_GET_FLOATV: { - if(GLStateManager.HAS_MULTIPLE_SET.contains(gLConstant)) { - floatBuffer.clear(); - if(glsm) { - GLStateManager.glGetFloat(gLConstant, floatBuffer); - } else { - GL11.glGetFloat(gLConstant, floatBuffer); - } - final StringBuilder out = new StringBuilder(); - for (int i = 0; i < floatBuffer.remaining(); ++i) { - out.append(i == 0 ? "" : ", ").append(String.format("%f", floatBuffer.get(i))); - } - return out.toString(); - } else { - return "" + (glsm ? GLStateManager.glGetFloat(gLConstant) : GL11.glGetFloat(gLConstant)); - } - } - default: return ""; - } - - } - static final Matrix4f cachedMatrix = new Matrix4f(); - static final Matrix4f uncachedMatrix = new Matrix4f(); - public Matrix4f getAsMatrix4f(boolean glsm) { - if(!fetchCommand.equals(GL_GET_FLOATV)) { - throw new IllegalArgumentException("This property does not return a matrix"); - } - floatBuffer.clear(); - if(glsm) { - GLStateManager.glGetFloat(gLConstant, floatBuffer); - return cachedMatrix.set(0, floatBuffer); - } else { - GL11.glGetFloat(gLConstant, floatBuffer); - return uncachedMatrix.set(0, floatBuffer); - } - } - - } - - - public static OpenGLDebugging instance = new OpenGLDebugging(); - - public GLproperty[] propertyList = { - new GLproperty(GL11.GL_ACCUM_ALPHA_BITS, "GL_ACCUM_ALPHA_BITS", "Number of bits per alpha component in the accumulation buffer", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ACCUM_BLUE_BITS, "GL_ACCUM_BLUE_BITS", "Number of bits per blue component in the accumulation buffer", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ACCUM_CLEAR_VALUE, "GL_ACCUM_CLEAR_VALUE", "Accumulation-buffer clear value", "accum-buffer", GL_GET_FLOATV), - new GLproperty(GL11.GL_ACCUM_GREEN_BITS, "GL_ACCUM_GREEN_BITS", "Number of bits per green component in the accumulation buffer", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ACCUM_RED_BITS, "GL_ACCUM_RED_BITS", "Number of bits per red component in the accumulation buffer", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ALPHA_BITS, "GL_ALPHA_BITS", "Number of bits per alpha component in color buffers", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ALPHA_TEST, "GL_ALPHA_TEST", "Alpha test enabled", "color-buffer/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_ALPHA_TEST_FUNC, "GL_ALPHA_TEST_FUNC", "Alpha test function", "color-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ALPHA_TEST_REF, "GL_ALPHA_TEST_REF", "Alpha test reference value", "color-buffer", GL_GET_FLOATV), - new GLproperty(GL11.GL_AMBIENT, "GL_AMBIENT", "Ambient intensity of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_AMBIENT, "GL_AMBIENT", "Ambient material color", "lighting", "glGetMaterialfv()"), - new GLproperty(GL11.GL_ATTRIB_STACK_DEPTH, "GL_ATTRIB_STACK_DEPTH", "Attribute stack pointer", "current", GL_GET_INTEGERV), - new GLproperty(GL11.GL_AUTO_NORMAL, "GL_AUTO_NORMAL", "True if automatic normal generation enabled", "eval", GL_IS_ENABLED), - new GLproperty(GL11.GL_AUX_BUFFERS, "GL_AUX_BUFFERS", "Number of auxiliary buffers", "capability", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_BLEND, "GL_BLEND", "Blending enabled", "color-buffer/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_BLEND_DST, "GL_BLEND_DST", "Blending destination function", "color-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_BLEND_SRC, "GL_BLEND_SRC", "Blending source function", "color-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_BLUE_BITS, "GL_BLUE_BITS", "Number of bits per blue component in color buffers", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH, "GL_CLIENT_ATTRIB_STACK_DEPTH", "Client attribute stack pointer", "current", GL_GET_INTEGERV), - new GLproperty(GL11.GL_COEFF, "GL_COEFF", "1D control points", "capability", "glGetMapfv()"), - new GLproperty(GL11.GL_COEFF, "GL_COEFF", "2D control points", "capability", "glGetMapfv()"), - new GLproperty(GL11.GL_COLOR_ARRAY, "GL_COLOR_ARRAY", "RGBA color array enable", "vertex-array", GL_IS_ENABLED), - new GLproperty(GL11.GL_COLOR_ARRAY_POINTER, "GL_COLOR_ARRAY_POINTER", "Pointer to the color array", "vertex-array", "glGetPointerv()"), - new GLproperty(GL11.GL_COLOR_ARRAY_SIZE, "GL_COLOR_ARRAY_SIZE", "Colors per vertex", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_COLOR_ARRAY_STRIDE, "GL_COLOR_ARRAY_STRIDE", "Stride between colors", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_COLOR_ARRAY_TYPE, "GL_COLOR_ARRAY_TYPE", "Type of color components", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_COLOR_CLEAR_VALUE, "GL_COLOR_CLEAR_VALUE", "Color-buffer clear value (RGBA mode)", "color-buffer", GL_GET_FLOATV), - new GLproperty(GL11.GL_COLOR_INDEXES, "GL_COLOR_INDEXES", "ca, cd, and cs for color-index lighting", "lighting/e nable", "glGetMaterialfv()"), - new GLproperty(GL11.GL_COLOR_LOGIC_OP, "GL_COLOR_LOGIC_OP", "RGBA color logical operation enabled", "color-buffer/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_COLOR_MATERIAL, "GL_COLOR_MATERIAL", "True if color tracking is enabled", "lighting", GL_IS_ENABLED), - new GLproperty(GL11.GL_COLOR_MATERIAL_FACE, "GL_COLOR_MATERIAL_FACE", "Face(s) affected by color tracking", "lighting", GL_GET_INTEGERV), - new GLproperty(GL11.GL_COLOR_MATERIAL_PARAMETER, "GL_COLOR_MATERIAL_PARAMETER", "Material properties tracking current color", "lighting", GL_GET_INTEGERV), - new GLproperty(GL11.GL_COLOR_WRITEMASK, "GL_COLOR_WRITEMASK", "Color write enables; R, G, B, or A", "color-buffer", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_CONSTANT_ATTENUATION, "GL_CONSTANT_ATTENUATION", "Constant attenuation factor", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_CULL_FACE, "GL_CULL_FACE", "Polygon culling enabled", "polygon/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_CULL_FACE_MODE, "GL_CULL_FACE_MODE", "Cull front-/back-facing polygons", "polygon", GL_GET_INTEGERV), - new GLproperty(GL11.GL_CURRENT_COLOR, "GL_CURRENT_COLOR", "Current color", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_INDEX, "GL_CURRENT_INDEX", "Current color index", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_NORMAL, "GL_CURRENT_NORMAL", "Current normal", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_RASTER_COLOR, "GL_CURRENT_RASTER_COLOR", "Color associated with raster position", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_RASTER_DISTANCE, "GL_CURRENT_RASTER_DISTANCE", "Current raster distance", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_RASTER_INDEX, "GL_CURRENT_RASTER_INDEX", "Color index associated with raster position", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_RASTER_POSITION, "GL_CURRENT_RASTER_POSITION", "Current raster position", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_RASTER_POSITION_VALID, "GL_CURRENT_RASTER_POSITION_VALID", "Raster position valid bit", "current", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_CURRENT_RASTER_TEXTURE_COORDS, "GL_CURRENT_RASTER_TEXTURE_COORDS", "Texture coordinates associated with raster position", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_CURRENT_TEXTURE_COORDS, "GL_CURRENT_TEXTURE_COORDS", "Current texture coordinates", "current", GL_GET_FLOATV), - new GLproperty(GL11.GL_DEPTH_BITS, "GL_DEPTH_BITS", "Number of depth-buffer bitplanes", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_DEPTH_CLEAR_VALUE, "GL_DEPTH_CLEAR_VALUE", "Depth-buffer clear value", "depth-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_DEPTH_FUNC, "GL_DEPTH_FUNC", "Depth buffer test function", "depth-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_DEPTH_RANGE, "GL_DEPTH_RANGE", "Depth range near and far", "viewport", GL_GET_FLOATV), - new GLproperty(GL11.GL_DEPTH_TEST, "GL_DEPTH_TEST", "Depth buffer enabled", "depth-buffer/ena ble", GL_IS_ENABLED), - new GLproperty(GL11.GL_DEPTH_WRITEMASK, "GL_DEPTH_WRITEMASK", "Depth buffer enabled for writing", "depth-buffer", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_DIFFUSE, "GL_DIFFUSE", "Diffuse intensity of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_DIFFUSE, "GL_DIFFUSE", "Diffuse material color", "lighting", "glGetMaterialfv()"), - new GLproperty(GL11.GL_DITHER, "GL_DITHER", "Dithering enabled", "color-buffer/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_DOMAIN, "GL_DOMAIN", "1D domain endpoints", "capability", "glGetMapfv()"), - new GLproperty(GL11.GL_DOMAIN, "GL_DOMAIN", "2D domain endpoints", "capability", "glGetMapfv()"), - new GLproperty(GL11.GL_DOUBLEBUFFER, "GL_DOUBLEBUFFER", "True if front and back buffers exist", "capability", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_DRAW_BUFFER, "GL_DRAW_BUFFER", "Buffers selected for drawing", "color-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_EDGE_FLAG, "GL_EDGE_FLAG", "Edge flag", "current", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_EDGE_FLAG_ARRAY, "GL_EDGE_FLAG_ARRAY", "Edge flag array enable", "vertex-array", GL_IS_ENABLED), - new GLproperty(GL11.GL_EDGE_FLAG_ARRAY_POINTER, "GL_EDGE_FLAG_ARRAY_POINTER", "Pointer to the edge flag array", "vertex-array", "glGetPointerv()"), - new GLproperty(GL11.GL_EDGE_FLAG_ARRAY_STRIDE, "GL_EDGE_FLAG_ARRAY_STRIDE", "Stride between edge flags", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_EMISSION, "GL_EMISSION", "Emissive material color", "lighting", "glGetMaterialfv()"), - new GLproperty(GL11.GL_EYE_PLANE, "GL_EYE_PLANE", "Texgen plane equation coefficients", "texture", "glGetTexGenfv()"), - new GLproperty(GL11.GL_FEEDBACK_BUFFER_POINTER, "GL_FEEDBACK_BUFFER_POINTER", "Pointer to feedback buffer", "feedback", "glGetPointerv()"), - new GLproperty(GL11.GL_FEEDBACK_BUFFER_SIZE, "GL_FEEDBACK_BUFFER_SIZE", "Size of feedback buffer", "feedback", GL_GET_INTEGERV), - new GLproperty(GL11.GL_FEEDBACK_BUFFER_TYPE, "GL_FEEDBACK_BUFFER_TYPE", "Type of feedback buffer", "feedback", GL_GET_INTEGERV), - new GLproperty(GL11.GL_FOG, "GL_FOG", "True if fog enabled", "fog/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_FOG_COLOR, "GL_FOG_COLOR", "Fog color", "fog", GL_GET_FLOATV), - new GLproperty(GL11.GL_FOG_DENSITY, "GL_FOG_DENSITY", "Exponential fog density", "fog", GL_GET_FLOATV), - new GLproperty(GL11.GL_FOG_END, "GL_FOG_END", "Linear fog end", "fog", GL_GET_FLOATV), - new GLproperty(GL11.GL_FOG_HINT, "GL_FOG_HINT", "Fog hint", "hint", GL_GET_INTEGERV), - new GLproperty(GL11.GL_FOG_INDEX, "GL_FOG_INDEX", "Fog index", "fog", GL_GET_FLOATV), - new GLproperty(GL11.GL_FOG_MODE, "GL_FOG_MODE", "Fog mode", "fog", GL_GET_INTEGERV), - new GLproperty(GL11.GL_FOG_START, "GL_FOG_START", "Linear fog start", "fog", GL_GET_FLOATV), - new GLproperty(GL11.GL_FRONT_FACE, "GL_FRONT_FACE", "Polygon front-face CW/CCW indicator", "polygon", GL_GET_INTEGERV), - new GLproperty(GL11.GL_GREEN_BITS, "GL_GREEN_BITS", "Number of bits per green component in color buffers", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_INDEX_ARRAY, "GL_INDEX_ARRAY", "Color-index array enable", "vertex-array", GL_IS_ENABLED), - new GLproperty(GL11.GL_INDEX_ARRAY_POINTER, "GL_INDEX_ARRAY_POINTER", "Pointer to the index array", "vertex-array", "glGetPointerv()"), - new GLproperty(GL11.GL_INDEX_ARRAY_STRIDE, "GL_INDEX_ARRAY_STRIDE", "Stride between color indices", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_INDEX_ARRAY_TYPE, "GL_INDEX_ARRAY_TYPE", "Type of color indices", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_INDEX_BITS, "GL_INDEX_BITS", "Number of bits per index in color buffers", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_INDEX_CLEAR_VALUE, "GL_INDEX_CLEAR_VALUE", "Color-buffer clear value (color-index mode)", "color-buffer", GL_GET_FLOATV), - new GLproperty(GL11.GL_INDEX_LOGIC_OP, "GL_INDEX_LOGIC_OP", "Color index logical operation enabled", "color-buffer/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_INDEX_MODE, "GL_INDEX_MODE", "True if color buffers store indices", "capability", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_INDEX_OFFSET, "GL_INDEX_OFFSET", "Value of GL_INDEX_OFFSET", "pixel", GL_GET_INTEGERV), - new GLproperty(GL11.GL_INDEX_SHIFT, "GL_INDEX_SHIFT", "Value of GL_INDEX_SHIFT", "pixel", GL_GET_INTEGERV), - new GLproperty(GL11.GL_INDEX_WRITEMASK, "GL_INDEX_WRITEMASK", "Color-index writemask", "color-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LIGHT0, "GL_LIGHT0", "True if light 0 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT1, "GL_LIGHT1", "True if light 1 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT2, "GL_LIGHT2", "True if light 2 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT3, "GL_LIGHT3", "True if light 3 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT4, "GL_LIGHT4", "True if light 4 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT5, "GL_LIGHT5", "True if light 5 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT6, "GL_LIGHT6", "True if light 6 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT7, "GL_LIGHT7", "True if light 7 enabled", "lighting/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHTING, "GL_LIGHTING", "True if lighting is enabled", "lighting/e nable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LIGHT_MODEL_AMBIENT, "GL_LIGHT_MODEL_AMBIENT", "Ambient scene color", "lighting", GL_GET_FLOATV), - new GLproperty(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, "GL_LIGHT_MODEL_LOCAL_VIEWER", "Viewer is local", "lighting", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_LIGHT_MODEL_TWO_SIDE, "GL_LIGHT_MODEL_TWO_SIDE", "Use two-sided lighting", "lighting", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_LINEAR_ATTENUATION, "GL_LINEAR_ATTENUATION", "Linear attenuation factor", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_LINE_SMOOTH, "GL_LINE_SMOOTH", "Line antialiasing on", "line/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LINE_SMOOTH_HINT, "GL_LINE_SMOOTH_HINT", "Line smooth hint", "hint", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LINE_STIPPLE, "GL_LINE_STIPPLE", "Line stipple enable", "line/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_LINE_STIPPLE_PATTERN, "GL_LINE_STIPPLE_PATTERN", "Line stipple", "line", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LINE_STIPPLE_REPEAT, "GL_LINE_STIPPLE_REPEAT", "Line stipple repeat", "line", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LINE_WIDTH, "GL_LINE_WIDTH", "Line width", "line", GL_GET_FLOATV), - new GLproperty(GL11.GL_LINE_WIDTH_GRANULARITY, "GL_LINE_WIDTH_GRANULARITY", "Antialiased line-width granularity", "capability", GL_GET_FLOATV), - new GLproperty(GL11.GL_LINE_WIDTH_RANGE, "GL_LINE_WIDTH_RANGE", "Range (low to high) of antialiased line widths", "capability", GL_GET_FLOATV), - new GLproperty(GL11.GL_LIST_BASE, "GL_LIST_BASE", "Setting of glListBase()", "list", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LIST_INDEX, "GL_LIST_INDEX", "Number of display list under construction; 0 if none", "current", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LIST_MODE, "GL_LIST_MODE", "Mode of display list under construction; undefined if none", "current", GL_GET_INTEGERV), - new GLproperty(GL11.GL_LOGIC_OP_MODE, "GL_LOGIC_OP_MODE", "Logical operation function", "color-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAP1_GRID_DOMAIN, "GL_MAP1_GRID_DOMAIN", "1D grid endpoints", "eval", GL_GET_FLOATV), - new GLproperty(GL11.GL_MAP1_GRID_SEGMENTS, "GL_MAP1_GRID_SEGMENTS", "1D grid divisions", "eval", GL_GET_FLOATV), - new GLproperty(GL11.GL_MAP2_GRID_DOMAIN, "GL_MAP2_GRID_DOMAIN", "2D grid endpoints", "eval", GL_GET_FLOATV), - new GLproperty(GL11.GL_MAP2_GRID_SEGMENTS, "GL_MAP2_GRID_SEGMENTS", "2D grid divisions", "eval", GL_GET_FLOATV), - new GLproperty(GL11.GL_MAP_COLOR, "GL_MAP_COLOR", "True if colors are mapped", "pixel", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_MAP_STENCIL, "GL_MAP_STENCIL", "True if stencil values are mapped", "pixel", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_MATRIX_MODE, "GL_MATRIX_MODE", "Current matrix mode", "transform", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_ATTRIB_STACK_DEPTH, "GL_MAX_ATTRIB_STACK_DEPTH", "Maximum depth of the attribute stack", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH", "Maximum depth of the client attribute stack", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_CLIP_PLANES, "GL_MAX_CLIP_PLANES", "Maximum number of user clipping planes", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_EVAL_ORDER, "GL_MAX_EVAL_ORDER", "Maximum evaluator polynomial order", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_LIGHTS, "GL_MAX_LIGHTS", "Maximum number of lights", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_LIST_NESTING, "GL_MAX_LIST_NESTING", "Maximum display-list call nesting", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_MODELVIEW_STACK_DEPTH, "GL_MAX_MODELVIEW_STACK_DEPTH", "Maximum modelview-matrix stack depth", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_NAME_STACK_DEPTH, "GL_MAX_NAME_STACK_DEPTH", "Maximum selection-name stack depth", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_PIXEL_MAP_TABLE, "GL_MAX_PIXEL_MAP_TABLE", "Maximum size of a glPixelMap() translation table", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_PROJECTION_STACK_DEPTH, "GL_MAX_PROJECTION_STACK_DEPTH", "Maximum projection-matrix stack depth", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_TEXTURE_SIZE, "GL_MAX_TEXTURE_SIZE", "See discussion in Texture Proxy in Chapter 9", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_TEXTURE_STACK_DEPTH, "GL_MAX_TEXTURE_STACK_DEPTH", "Maximum depth of texture matrix stack", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MAX_VIEWPORT_DIMS, "GL_MAX_VIEWPORT_DIMS", "Maximum viewport dimensions", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_MODELVIEW_MATRIX, "GL_MODELVIEW_MATRIX", "Modelview matrix stack", "matrix", GL_GET_FLOATV), - new GLproperty(GL11.GL_MODELVIEW_STACK_DEPTH, "GL_MODELVIEW_STACK_DEPTH", "Modelview matrix stack pointer", "matrix", GL_GET_INTEGERV), - new GLproperty(GL11.GL_NAME_STACK_DEPTH, "GL_NAME_STACK_DEPTH", "Name stack depth", "current", GL_GET_INTEGERV), - new GLproperty(GL11.GL_NORMALIZE, "GL_NORMALIZE", "Current normal normalization on/off", "transform/ enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_NORMAL_ARRAY, "GL_NORMAL_ARRAY", "Normal array enable", "vertex-array", GL_IS_ENABLED), - new GLproperty(GL11.GL_NORMAL_ARRAY_POINTER, "GL_NORMAL_ARRAY_POINTER", "Pointer to the normal array", "vertex-array", "glGetPointerv()"), - new GLproperty(GL11.GL_NORMAL_ARRAY_STRIDE, "GL_NORMAL_ARRAY_STRIDE", "Stride between normals", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_NORMAL_ARRAY_TYPE, "GL_NORMAL_ARRAY_TYPE", "Type of normal coordinates", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_OBJECT_PLANE, "GL_OBJECT_PLANE", "Texgen object linear coefficients", "texture", "glGetTexGenfv()"), - new GLproperty(GL11.GL_ORDER, "GL_ORDER", "1D map order", "capability", "glGetMapiv()"), - new GLproperty(GL11.GL_ORDER, "GL_ORDER", "2D map orders", "capability", "glGetMapiv()"), - new GLproperty(GL11.GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT", "Value of GL_PACK_ALIGNMENT", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_PACK_LSB_FIRST, "GL_PACK_LSB_FIRST", "Value of GL_PACK_LSB_FIRST", "pixel-store", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_PACK_ROW_LENGTH, "GL_PACK_ROW_LENGTH", "Value of GL_PACK_ROW_LENGTH", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_PACK_SKIP_PIXELS, "GL_PACK_SKIP_PIXELS", "Value of GL_PACK_SKIP_PIXELS", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_PACK_SKIP_ROWS, "GL_PACK_SKIP_ROWS", "Value of GL_PACK_SKIP_ROWS", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_PACK_SWAP_BYTES, "GL_PACK_SWAP_BYTES", "Value of GL_PACK_SWAP_BYTES", "pixel-store", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_PERSPECTIVE_CORRECTION_HINT, "GL_PERSPECTIVE_CORRECTION_HINT", "Perspective correction hint", "hint", GL_GET_INTEGERV), - new GLproperty(GL11.GL_POINT_SIZE, "GL_POINT_SIZE", "Point size", "point", GL_GET_FLOATV), - new GLproperty(GL11.GL_POINT_SIZE_GRANULARITY, "GL_POINT_SIZE_GRANULARITY", "Antialiased point-size granularity", "capability", GL_GET_FLOATV), - new GLproperty(GL11.GL_POINT_SIZE_RANGE, "GL_POINT_SIZE_RANGE", "Range (low to high) of antialiased point sizes", "capability", GL_GET_FLOATV), - new GLproperty(GL11.GL_POINT_SMOOTH, "GL_POINT_SMOOTH", "Point antialiasing on", "point/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_POINT_SMOOTH_HINT, "GL_POINT_SMOOTH_HINT", "Point smooth hint", "hint", GL_GET_INTEGERV), - new GLproperty(GL11.GL_POLYGON_MODE, "GL_POLYGON_MODE", "Polygon rasterization mode (front and back)", "polygon", GL_GET_INTEGERV), - new GLproperty(GL11.GL_POLYGON_OFFSET_FACTOR, "GL_POLYGON_OFFSET_FACTOR", "Polygon offset factor", "polygon", GL_GET_FLOATV), - new GLproperty(GL11.GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL", "Polygon offset enable for GL_FILL mode rasterization", "polygon/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_POLYGON_OFFSET_LINE, "GL_POLYGON_OFFSET_LINE", "Polygon offset enable for GL_LINE mode rasterization", "polygon/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_POLYGON_OFFSET_POINT, "GL_POLYGON_OFFSET_POINT", "Polygon offset enable for GL_POINT mode rasterization", "polygon/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_POLYGON_SMOOTH, "GL_POLYGON_SMOOTH", "Polygon antialiasing on", "polygon/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_POLYGON_SMOOTH_HINT, "GL_POLYGON_SMOOTH_HINT", "Polygon smooth hint", "hint", GL_GET_INTEGERV), - new GLproperty(GL11.GL_POLYGON_STIPPLE, "GL_POLYGON_STIPPLE", "Polygon stipple enable", "polygon/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_POSITION, "GL_POSITION", "Position of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_PROJECTION_MATRIX, "GL_PROJECTION_MATRIX", "Projection matrix stack", "matrix", GL_GET_FLOATV), - new GLproperty(GL11.GL_PROJECTION_STACK_DEPTH, "GL_PROJECTION_STACK_DEPTH", "Projection matrix stack pointer", "matrix", GL_GET_INTEGERV), - new GLproperty(GL11.GL_QUADRATIC_ATTENUATION, "GL_QUADRATIC_ATTENUATION", "Quadratic attenuation factor", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_READ_BUFFER, "GL_READ_BUFFER", "Read source buffer", "pixel", GL_GET_INTEGERV), - new GLproperty(GL11.GL_RED_BITS, "GL_RED_BITS", "Number of bits per red component in color buffers", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_RENDER_MODE, "GL_RENDER_MODE", "glRenderMode() setting", "current", GL_GET_INTEGERV), - new GLproperty(GL11.GL_RGBA_MODE, "GL_RGBA_MODE", "True if color buffers store RGBA", "capability", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_SCISSOR_BOX, "GL_SCISSOR_BOX", "Scissor box", "scissor", GL_GET_INTEGERV), - new GLproperty(GL11.GL_SCISSOR_TEST, "GL_SCISSOR_TEST", "Scissoring enabled", "scissor/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_SELECTION_BUFFER_POINTER, "GL_SELECTION_BUFFER_POINTER", "Pointer to selection buffer", "select", "glGetPointerv()"), - new GLproperty(GL11.GL_SELECTION_BUFFER_SIZE, "GL_SELECTION_BUFFER_SIZE", "Size of selection buffer", "select", GL_GET_INTEGERV), - new GLproperty(GL11.GL_SHADE_MODEL, "GL_SHADE_MODEL", "glShadeModel() setting", "lighting", GL_GET_INTEGERV), - new GLproperty(GL11.GL_SHININESS, "GL_SHININESS", "Specular exponent of material", "lighting", "glGetMaterialfv()"), - new GLproperty(GL11.GL_SPECULAR, "GL_SPECULAR", "Specular intensity of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_SPECULAR, "GL_SPECULAR", "Specular material color", "lighting", "glGetMaterialfv()"), - new GLproperty(GL11.GL_SPOT_CUTOFF, "GL_SPOT_CUTOFF", "Spotlight angle of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_SPOT_DIRECTION, "GL_SPOT_DIRECTION", "Spotlight direction of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_SPOT_EXPONENT, "GL_SPOT_EXPONENT", "Spotlight exponent of light i", "lighting", "glGetLightfv()"), - new GLproperty(GL11.GL_STENCIL_BITS, "GL_STENCIL_BITS", "Number of stencil bitplanes", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_CLEAR_VALUE, "GL_STENCIL_CLEAR_VALUE", "Stencil-buffer clear value", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_FAIL, "GL_STENCIL_FAIL", "Stencil fail action", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_FUNC, "GL_STENCIL_FUNC", "Stencil function", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_PASS_DEPTH_FAIL, "GL_STENCIL_PASS_DEPTH_FAIL", "Stencil depth buffer fail action", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_PASS_DEPTH_PASS, "GL_STENCIL_PASS_DEPTH_PASS", "Stencil depth buffer pass action", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_REF, "GL_STENCIL_REF", "Stencil reference value", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_TEST, "GL_STENCIL_TEST", "Stenciling enabled", "stencil-buffer/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_STENCIL_VALUE_MASK, "GL_STENCIL_VALUE_MASK", "Stencil mask", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STENCIL_WRITEMASK, "GL_STENCIL_WRITEMASK", "Stencil-buffer writemask", "stencil-buffer", GL_GET_INTEGERV), - new GLproperty(GL11.GL_STEREO, "GL_STEREO", "True if left and right buffers exist", "capability", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_SUBPIXEL_BITS, "GL_SUBPIXEL_BITS", "Number of bits of subpixel precision in x and y", "capability", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE, "GL_TEXTURE", "x-D texture image at level of detail i", "UNUSED", "glGetTexImage()"), - new GLproperty(GL11.GL_TEXTURE_1D, "GL_TEXTURE_1D", "True if 1-D texturing enabled ", "texture/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_2D, "GL_TEXTURE_2D", "True if 2-D texturing enabled ", "texture/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_ALPHA_SIZE, "GL_TEXTURE_ALPHA_SIZE", "x-D texture image i's alpha resolution", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_BINDING_1D, "GL_TEXTURE_BINDING_1D", "Texture object bound to GL_TEXTURE_1D", "texture", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE_BINDING_2D, "GL_TEXTURE_BINDING_2D", "Texture object bound to GL_TEXTURE_2D", "texture", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE_BLUE_SIZE, "GL_TEXTURE_BLUE_SIZE", "x-D texture image i's blue resolution", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_BORDER, "GL_TEXTURE_BORDER", "x-D texture image i's border width", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_BORDER_COLOR, "GL_TEXTURE_BORDER_COLOR", "Texture border color", "texture", "glGetTexParameter*()"), - new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY, "GL_TEXTURE_COORD_ARRAY", "Texture coordinate array enable", "vertex-array", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_POINTER, "GL_TEXTURE_COORD_ARRAY_POINTER", "Pointer to the texture coordinate array", "vertex-array", "glGetPointerv()"), - new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_SIZE, "GL_TEXTURE_COORD_ARRAY_SIZE", "Texture coordinates per element", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_STRIDE, "GL_TEXTURE_COORD_ARRAY_STRIDE", "Stride between texture coordinates", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE_COORD_ARRAY_TYPE, "GL_TEXTURE_COORD_ARRAY_TYPE", "Type of texture coordinates", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE_ENV_COLOR, "GL_TEXTURE_ENV_COLOR", "Texture environment color", "texture", "glGetTexEnvfv()"), - new GLproperty(GL11.GL_TEXTURE_ENV_MODE, "GL_TEXTURE_ENV_MODE", "Texture application function", "texture", "glGetTexEnviv()"), - new GLproperty(GL11.GL_TEXTURE_GEN_MODE, "GL_TEXTURE_GEN_MODE", "Function used for texgen", "texture", "glGetTexGeniv()"), - new GLproperty(GL11.GL_TEXTURE_GEN_Q, "GL_TEXTURE_GEN_Q", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_GEN_R, "GL_TEXTURE_GEN_R", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_GEN_S, "GL_TEXTURE_GEN_S", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_GEN_T, "GL_TEXTURE_GEN_T", "Texgen enabled (x is S, T, R, or Q)", "texture/enable", GL_IS_ENABLED), - new GLproperty(GL11.GL_TEXTURE_GREEN_SIZE, "GL_TEXTURE_GREEN_SIZE", "x-D texture image i's green resolution", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_HEIGHT, "GL_TEXTURE_HEIGHT", "x-D texture image i's height", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_INTENSITY_SIZE, "GL_TEXTURE_INTENSITY_SIZE", "x-D texture image i's intensity resolution", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_LUMINANCE_SIZE, "GL_TEXTURE_LUMINANCE_SIZE", "x-D texture image i's luminance resolution", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_MAG_FILTER, "GL_TEXTURE_MAG_FILTER", "Texture magnification function", "texture", "glGetTexParameter*()"), - new GLproperty(GL11.GL_TEXTURE_MATRIX, "GL_TEXTURE_MATRIX", "Texture matrix stack", "matrix", GL_GET_FLOATV), - new GLproperty(GL11.GL_TEXTURE_MIN_FILTER, "GL_TEXTURE_MIN_FILTER", "Texture minification function", "texture", "glGetTexParameter*()"), - new GLproperty(GL11.GL_TEXTURE_PRIORITY, "GL_TEXTURE_PRIORITY", "Texture object priority", "texture", "glGetTexParameter*()"), - new GLproperty(GL11.GL_TEXTURE_RED_SIZE, "GL_TEXTURE_RED_SIZE", "x-D texture image i's red resolution", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_STACK_DEPTH, "GL_TEXTURE_STACK_DEPTH", "Texture matrix stack pointer", "matrix", GL_GET_INTEGERV), - new GLproperty(GL11.GL_TEXTURE_WIDTH, "GL_TEXTURE_WIDTH", "x-D texture image i's width", "UNUSED", "glGetTexLevelParameter*()"), - new GLproperty(GL11.GL_TEXTURE_WRAP_S, "GL_TEXTURE_WRAP_S", "Texture wrap mode (x is S or T)", "texture", "glGetTexParameter*()"), - new GLproperty(GL11.GL_TEXTURE_WRAP_T, "GL_TEXTURE_WRAP_T", "Texture wrap mode (x is S or T)", "texture", "glGetTexParameter*()"), - new GLproperty(GL11.GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT", "Value of GL_UNPACK_ALIGNMENT", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_UNPACK_LSB_FIRST, "GL_UNPACK_LSB_FIRST", "Value of GL_UNPACK_LSB_FIRST", "pixel-store", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_UNPACK_ROW_LENGTH, "GL_UNPACK_ROW_LENGTH", "Value of GL_UNPACK_ROW_LENGTH", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_UNPACK_SKIP_PIXELS, "GL_UNPACK_SKIP_PIXELS", "Value of GL_UNPACK_SKIP_PIXELS", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_UNPACK_SKIP_ROWS, "GL_UNPACK_SKIP_ROWS", "Value of GL_UNPACK_SKIP_ROWS", "pixel-store", GL_GET_INTEGERV), - new GLproperty(GL11.GL_UNPACK_SWAP_BYTES, "GL_UNPACK_SWAP_BYTES", "Value of GL_UNPACK_SWAP_BYTES", "pixel-store", GL_GET_BOOLEANV), - new GLproperty(GL11.GL_VERTEX_ARRAY, "GL_VERTEX_ARRAY", "Vertex array enable", "vertex-array", GL_IS_ENABLED), - new GLproperty(GL11.GL_VERTEX_ARRAY_POINTER, "GL_VERTEX_ARRAY_POINTER", "Pointer to the vertex array", "vertex-array", "glGetPointerv()"), - new GLproperty(GL11.GL_VERTEX_ARRAY_SIZE, "GL_VERTEX_ARRAY_SIZE", "Coordinates per vertex", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_VERTEX_ARRAY_STRIDE, "GL_VERTEX_ARRAY_STRIDE", "Stride between vertices", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_VERTEX_ARRAY_TYPE, "GL_VERTEX_ARRAY_TYPE", "Type of vertex coordinates", "vertex-array", GL_GET_INTEGERV), - new GLproperty(GL11.GL_VIEWPORT, "GL_VIEWPORT", "Viewport origin and extent", "viewport", GL_GET_INTEGERV), - new GLproperty(GL11.GL_ZOOM_X, "GL_ZOOM_X", "x zoom factor", "pixel", GL_GET_FLOATV), - new GLproperty(GL11.GL_ZOOM_Y, "GL_ZOOM_Y", "y zoom factor", "pixel", GL_GET_FLOATV), - }; - - public static void dumpToFile(Consumer> dumper, String fileName) { - final List lines = new ArrayList<>(); - dumper.accept(lines::add); - try { - FileUtils.writeLines(new File(fileName), lines); - } catch (IOException e) { - LOGGER.error("Failed to write file"); - e.printStackTrace(); - } - } - - public static void dumpStateToFile() { - dumpToFile(p -> dumpState(p, false), "gl-dump-state.txt"); - } - public static void dumpGLSMStateToFile() { - dumpToFile(p -> dumpState(p, true), "glsm-dump-state.txt"); - } - - public static void dumpState(boolean glsm) { - dumpState(LINE_LOGGER, glsm); - } - - public static void dumpState(Consumer printer, boolean glsm) { - for (int i = 0; i < instance.propertyList.length; ++i) { - final GLproperty gLProperty = instance.propertyList[i]; - printer.accept(gLProperty.name + ":" + gLProperty.getAsString(glsm) + " (" + gLProperty.description + ")"); - } - } - - public static void dumpIsEnabledToFile(boolean glsm) { - dumpToFile(p -> dumpIsEnabled(p, glsm), (glsm ? "glsm" : "gl") + "-dump-enabled.txt"); - } - - public static void dumpIsEnabled(boolean glsm) { - dumpIsEnabled(LINE_LOGGER, glsm); - } - - public static void dumpIsEnabled(Consumer printer, boolean glsm) { - for (int i = 0; i < instance.propertyList.length; ++i) { - final GLproperty gLProperty = instance.propertyList[i]; - if (gLProperty.fetchCommand.equals(GL_IS_ENABLED)) { - printer.accept(gLProperty.name + ":"); - printer.accept("" + gLProperty.getAsString(glsm)); - printer.accept(" (" + gLProperty.description + ")"); - } - } - } - - public static void dumpTypeToFile(String type, boolean glsm) { - dumpToFile(p -> dumpType(type, p, glsm), (glsm ? "glsm" : "gl") + "-dump-type-" + type + ".txt"); - } - - public static void dumpType(String type, boolean glsm) { - dumpType(type, LINE_LOGGER, glsm); - } - - public static void dumpType(String type, Consumer printer, boolean glsm) { - for (int i = 0; i < instance.propertyList.length; ++i) { - final GLproperty gLProperty = instance.propertyList[i]; - if (gLProperty.category.equals(type)) { - printer.accept(gLProperty.name + ":"); - printer.accept(gLProperty.getAsString(glsm)); - printer.accept(" (" + gLProperty.description + ")"); - } - } - } - - public static String getGLSMErrorLog() { - return getGLSMErrorLog(null, false, false); - } - - // Re-entrancy guard - getGLSMErrorLog calls glActiveTexture which could trigger checkGLSMOnce - private static boolean inCheck = false; - - /** - * Enhanced GLSM error logging with context, stack trace, and first-occurrence filtering. - * - * @param context Optional context string to include in error messages (e.g., "During rendering") - * @param logStacktrace If true, includes the current stack trace in the error output - * @param onlyFirstOccurrence If true, only logs each unique error once - * @return Error log string if mismatches found, null otherwise - */ - public static String getGLSMErrorLog(String context, boolean logStacktrace, boolean onlyFirstOccurrence) { - if (inCheck) return null; - if (!GLStateManager.isCachingEnabled() || GLStateManager.isRecordingDisplayList()) { - return null; - } - inCheck = true; - try { - String group = "checkGLSM" + (context == null ? "" : " " + context); - GLDebug.pushGroup(group); - final StringBuilder error = new StringBuilder(); - boolean mismatch = false; - - if (context != null && !context.isEmpty()) { - error.append("[").append(context).append("] "); - } - - for (int i = 0; i < instance.propertyList.length; ++i) { - final GLproperty gLProperty = instance.propertyList[i]; - if (gLProperty.fetchCommand.equals(GL_GET_FLOATV) && gLProperty.name.endsWith("_MATRIX")) { - final Matrix4f cached = gLProperty.getAsMatrix4f(true); - final Matrix4f uncached = gLProperty.getAsMatrix4f(false); - - // Skip comparison if either matrix is degenerate (contains NaN/Infinity) these represent invalid GL state from bad parameters, not cache bugs - if (isMatrixDegenerate(cached) || isMatrixDegenerate(uncached)) continue; - - if (!matricesEquivalent(cached, uncached, 0.001f)) { - final String errorKey = "MATRIX:" + gLProperty.name; - if (!onlyFirstOccurrence || seenErrors.add(errorKey)) { - final String errorMsg = "GLSM mismatch: " + gLProperty.name + "\ncached:\n" + cached + "uncached:\n" + uncached; - LOGGER.error(errorMsg); - error.append(errorMsg).append('\n'); - mismatch = true; - } - } - } else { - final String cached = gLProperty.getAsString(true); - final String uncached = gLProperty.getAsString(false); - if (!cached.equals(uncached)) { - final String errorKey = "PROPERTY:" + gLProperty.name + ":" + cached + ":" + uncached; - if (!onlyFirstOccurrence || seenErrors.add(errorKey)) { - error.append("GLSM mismatch: ").append(gLProperty.name).append(" cached: ").append(cached).append(" uncached: ").append(uncached); - error.append('\n'); - mismatch = true; - } - } - } - } - - final TextureUnitArray textureUnits = GLStateManager.getTextures(); - final int currentActiveTexture = GLStateManager.getActiveTextureUnit(); - - // Check GL_ACTIVE_TEXTURE - final int glActiveUnit = GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE) - GL13.GL_TEXTURE0; - if (glActiveUnit != currentActiveTexture) { - final String errorKey = "ACTIVE_TEXTURE:" + currentActiveTexture + ":" + glActiveUnit; - if (!onlyFirstOccurrence || seenErrors.add(errorKey)) { - error.append("GLSM mismatch: GL_ACTIVE_TEXTURE cached: ").append(currentActiveTexture) - .append(" uncached: ").append(glActiveUnit).append('\n'); - mismatch = true; - } - } - - // Check per-unit texture state - for (int i = 0; i < textureUnits.textureMatricies.length; i++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - - // Check GL_TEXTURE_2D enabled - final boolean cachedEnabled = textureUnits.getTextureUnitStates(i).isEnabled(); - final boolean uncachedEnabled = GL11.glIsEnabled(GL11.GL_TEXTURE_2D); - if (cachedEnabled != uncachedEnabled) { - final String errorKey = "TEXTURE_2D:" + i + ":" + cachedEnabled + ":" + uncachedEnabled; - if (!onlyFirstOccurrence || seenErrors.add(errorKey)) { - error.append("GLSM mismatch: GL_TEXTURE_2D cached: ").append(cachedEnabled) - .append(" uncached: ").append(uncachedEnabled) - .append(", texture unit: GL_TEXTURE").append(i).append('\n'); - mismatch = true; - } - } - - // Check GL_TEXTURE_BINDING_2D - final int cachedBinding = textureUnits.getTextureUnitBindings(i).getBinding(); - final int uncachedBinding = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - if (cachedBinding != uncachedBinding) { - final String errorKey = "TEXTURE_BINDING_2D:" + i + ":" + cachedBinding + ":" + uncachedBinding; - if (!onlyFirstOccurrence || seenErrors.add(errorKey)) { - error.append("GLSM mismatch: GL_TEXTURE_BINDING_2D cached: ").append(cachedBinding) - .append(" uncached: ").append(uncachedBinding) - .append(", texture unit: GL_TEXTURE").append(i).append('\n'); - mismatch = true; - } - } - } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + currentActiveTexture); - - // Add stack trace if requested - if (mismatch && logStacktrace) { - error.append("\nStack trace:\n"); - final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - for (int i = 2; i < stackTrace.length; i++) { - error.append(" at ").append(stackTrace[i].toString()).append('\n'); - } - } - GLDebug.popGroup(); - - return mismatch ? error.toString() : null; - } finally { - inCheck = false; - } - } - - public static boolean checkGLSMOnce(String context) { - final String output = getGLSMErrorLog(context, true, true); - - if (output != null) { - // Only log on actual mismatch - LOGGER.error("[{}] MISMATCH thread={}\n{}", context, Thread.currentThread().getName(), output); - return false; - } - return true; - } - - /** - * Check if a matrix contains any non-finite values (NaN or Infinity). - * Such matrices represent invalid/degenerate GL state (e.g., zero near/far in projection). - */ - private static boolean isMatrixDegenerate(Matrix4f matrix) { - for (int col = 0; col < 4; col++) { - for (int row = 0; row < 4; row++) { - if (!Float.isFinite(matrix.get(col, row))) { - return true; - } - } - } - return false; - } - - /** - * Compare two matrices with tolerance for NaN/Infinity. - * Treats NaN == NaN and Infinity == Infinity as equal (both are degenerate states). - * For finite values, uses epsilon comparison. - */ - private static boolean matricesEquivalent(Matrix4f a, Matrix4f b, float epsilon) { - // Compare all 16 elements - for (int col = 0; col < 4; col++) { - for (int row = 0; row < 4; row++) { - final float aVal = a.get(col, row); - final float bVal = b.get(col, row); - - // If both are non-finite (NaN or Infinity), consider them equal - if (!Float.isFinite(aVal) && !Float.isFinite(bVal)) { - // Both non-finite: check if both NaN or both same Infinity - if (Float.isNaN(aVal) && Float.isNaN(bVal)) continue; - if (Float.isInfinite(aVal) && Float.isInfinite(bVal)) { - // Check same sign of infinity - if ((aVal > 0) == (bVal > 0)) continue; - } - return false; // Different non-finite values - } - - // If one is finite and other is not, they differ - if (Float.isFinite(aVal) != Float.isFinite(bVal)) { - return false; - } - - // Both finite: use epsilon comparison - if (Math.abs(aVal - bVal) > epsilon) { - return false; - } - } - } - return true; - } - - public static void checkGLSM() { - final String output = getGLSMErrorLog(); - - if (output == null) { - LOGGER.info("GLSM state matches!"); - } else { - LOGGER.error(output); - } - } - - public static void copyTexture(ResourceLocation resource, File output) { - final Object object = Minecraft.getMinecraft().renderEngine.mapTextureObjects.get(resource); - - if (object != null) { - copyTexture(((ITextureObject) object).getGlTextureId(), output); - } - } - - public static void copyTexture(int textureID, File output) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureID); - - int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); - int height = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); - - BufferedImage bufferedimage = new BufferedImage(width, height, 1); - final int[] pixelValues = ((DataBufferInt) bufferedimage.getRaster().getDataBuffer()).getData(); - IntBuffer pixelBuffer = BufferUtils.createIntBuffer(pixelValues.length); - GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer); - pixelBuffer.get(pixelValues); - - // Flip texture - final int halfHeight = height / 2; - final int[] rowBuffer = new int[width]; - for (int y = 0; y < halfHeight; y++) { - final int top = y * width; - final int bottom = (height - 1 - y) * width; - - System.arraycopy(pixelValues, top, rowBuffer, 0, width); - System.arraycopy(pixelValues, bottom, pixelValues, top, width); - System.arraycopy(rowBuffer, 0, pixelValues, bottom, width); - } - - File dir = output.getParentFile(); - dir.mkdirs(); - copyBufferedImageToFile(bufferedimage, output); - bufferedimage.flush(); - } - - - private static void copyBufferedImageToFile(BufferedImage image, File file) { - try { - ImageIO.write(image, "png", file); - } catch (Exception e) { - e.printStackTrace(); - } - } - - -} diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java index d763449b1..b1f552f3d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java @@ -5,8 +5,6 @@ import com.mitchej123.glsm.RenderSystemService; import org.joml.Matrix4f; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; - import java.nio.FloatBuffer; public class AngelicaRenderSystemService implements RenderSystemService { @@ -115,17 +113,17 @@ public class AngelicaRenderSystemService implements RenderSystemService { @Override public void glUniform1i(int location, int value) { - GL20.glUniform1i(location, value); + GLStateManager.glUniform1i(location, value); } @Override public void glUniformMatrix3(int location, boolean transpose, FloatBuffer value) { - GL20.glUniformMatrix3(location, transpose, value); + GLStateManager.glUniformMatrix3(location, transpose, value); } @Override public void glUniformMatrix4(int location, boolean transpose, FloatBuffer value) { - GL20.glUniformMatrix4(location, transpose, value); + GLStateManager.glUniformMatrix4(location, transpose, value); } // ===================== THREAD ASSERTIONS ===================== diff --git a/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java b/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java index c01253b87..1d7d7f8f7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java +++ b/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java @@ -14,7 +14,6 @@ import com.gtnewhorizons.angelica.debug.TPSGraph; import com.gtnewhorizons.angelica.dynamiclights.DynamicLights; import com.gtnewhorizons.angelica.dynamiclights.config.EntityLightConfig; import com.gtnewhorizons.angelica.glsm.GLStateManager; -import com.gtnewhorizons.angelica.client.debug.OpenGLDebugging; import com.gtnewhorizons.angelica.hudcaching.HUDCaching; import com.gtnewhorizons.angelica.iris.IrisGLSMBridge; import com.gtnewhorizons.angelica.loading.AngelicaTweaker; @@ -27,7 +26,6 @@ import com.gtnewhorizons.angelica.rendering.celeritas.threading.ChunkTaskRegistr import com.gtnewhorizons.angelica.rendering.celeritas.threading.DefaultChunkTaskProvider; import com.gtnewhorizons.angelica.rendering.celeritas.threading.ThreadedChunkTaskProvider; import com.gtnewhorizons.angelica.zoom.Zoom; -import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; @@ -53,8 +51,6 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiVideoSettings; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.network.NetHandlerPlayClient; -import net.minecraft.client.settings.GameSettings; -import net.minecraft.client.settings.KeyBinding; import net.minecraft.server.integrated.IntegratedServer; import net.minecraft.util.Direction; import net.minecraft.util.MathHelper; @@ -114,8 +110,6 @@ public class ClientProxy extends CommonProxy { } } - private static KeyBinding glsmKeyBinding; - @Override public void init(FMLInitializationEvent event) { super.init(event); @@ -144,8 +138,6 @@ public class ClientProxy extends CommonProxy { FMLCommonHandler.instance().bus().register(this); MinecraftForge.EVENT_BUS.register(this); - glsmKeyBinding = new KeyBinding("Print GLSM Debug", Keyboard.KEY_NONE, "Angelica"); - ClientRegistry.registerKeyBinding(glsmKeyBinding); if (ModStatus.isBetterCrashesLoaded) { BetterCrashesCompat.init(); @@ -163,18 +155,6 @@ public class ClientProxy extends CommonProxy { } } - private boolean wasGLSMKeyPressed; - - @SubscribeEvent - public void onKeypress(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.END) return; - - final boolean isPressed = glsmKeyBinding.getKeyCode() != 0 && GameSettings.isKeyDown(glsmKeyBinding); - if (isPressed && !wasGLSMKeyPressed) { - OpenGLDebugging.checkGLSM(); - } - wasGLSMKeyPressed = isPressed; - } @Override public void postInit(FMLPostInitializationEvent event) { diff --git a/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java b/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java index 1a4fdd905..30f374775 100644 --- a/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java +++ b/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java @@ -26,7 +26,6 @@ import org.lwjgl.opengl.EXTFramebufferObject; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GLContext; import org.lwjgl.util.glu.GLU; import com.gtnewhorizons.angelica.glsm.GLStateManager; @@ -47,8 +46,8 @@ public class FancyDial { private static final double ANGLE_UNSET = Double.MAX_VALUE; private static final int NUM_SCRATCH_TEXTURES = 3; - private static final boolean fboSupported = GLContext.getCapabilities().GL_EXT_framebuffer_object; - private static final boolean gl13Supported = GLContext.getCapabilities().OpenGL13; + private static final boolean fboSupported = GLStateManager.capabilities.GL_EXT_framebuffer_object; + private static final boolean gl13Supported = GLStateManager.capabilities.OpenGL13; private static final boolean enableCompass = MCPatcherForgeConfig.ExtendedHD.fancyCompass; private static final boolean enableClock = MCPatcherForgeConfig.ExtendedHD.fancyClock; private static final boolean useGL13 = gl13Supported && MCPatcherForgeConfig.ExtendedHD.useGL13; @@ -148,7 +147,7 @@ public class FancyDial { FancyDial instance = getInstance(icon); return instance != null && instance.render(itemFrameRenderer); } finally { - EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, oldFB); + GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, oldFB); GLAPI.glBindTexture(oldTexture); } } @@ -603,13 +602,13 @@ public class FancyDial { this.width = width; this.height = height; - frameBuffer = EXTFramebufferObject.glGenFramebuffersEXT(); + frameBuffer = GLStateManager.glGenFramebuffers(); if (frameBuffer < 0) { throw new RuntimeException("could not get framebuffer object"); } GLAPI.glBindTexture(texture); - EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); - EXTFramebufferObject.glFramebufferTexture2DEXT( + GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); + GLStateManager.glFramebufferTexture2D( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT, GL11.GL_TEXTURE_2D, @@ -618,7 +617,7 @@ public class FancyDial { } void bind() { - EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); + GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); GLStateManager.glPushAttrib(glAttributes); GLStateManager.glViewport(x0, y0, width, height); @@ -674,11 +673,11 @@ public class FancyDial { GLStateManager.glEnable(GL11.GL_BLEND); GLAPI.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0); + GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0); } void read(ByteBuffer buffer) { - EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); + GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); buffer.position(0); GLStateManager.glReadPixels(x0, y0, width, height, MipmapHelper.TEX_FORMAT, MipmapHelper.TEX_DATA_TYPE, buffer); } @@ -704,7 +703,7 @@ public class FancyDial { if (ownTexture) { GLStateManager.glDeleteTextures(texture); } - EXTFramebufferObject.glDeleteFramebuffersEXT(frameBuffer); + GLStateManager.glDeleteFramebuffers(frameBuffer); } } diff --git a/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java b/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java index e8abba787..764b1f82d 100644 --- a/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java +++ b/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java @@ -11,7 +11,6 @@ import org.lwjgl.opengl.EXTTextureFilterAnisotropic; import org.lwjgl.opengl.EXTTextureLODBias; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import org.lwjgl.opengl.GLContext; import org.lwjgl.util.glu.GLU; import com.gtnewhorizons.angelica.glsm.GLStateManager; @@ -47,10 +46,10 @@ public class MipmapHelper { private static final Map mipmapType = new HashMap<>(); static { - mipmapSupported = GLContext.getCapabilities().OpenGL12; + mipmapSupported = GLStateManager.capabilities.OpenGL12; useMipmap = mipmapSupported && mipmapEnabled && maxMipmapLevel > 0; - anisoSupported = GLContext.getCapabilities().GL_EXT_texture_filter_anisotropic; + anisoSupported = GLStateManager.capabilities.GL_EXT_texture_filter_anisotropic; if (anisoSupported) { anisoMax = (int) GLStateManager.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); checkGLError("glGetFloat(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)"); @@ -59,7 +58,7 @@ public class MipmapHelper { anisoMax = anisoLevel = 1; } - lodSupported = GLContext.getCapabilities().GL_EXT_texture_lod_bias; + lodSupported = GLStateManager.capabilities.GL_EXT_texture_lod_bias; if (lodSupported) { lodBias = MCPatcherForgeConfig.ExtendedHD.lodBias; } else { diff --git a/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java b/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java index 024ba58dd..970f64a26 100644 --- a/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java +++ b/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java @@ -1,13 +1,11 @@ package com.prupe.mcpatcher.mal.resource; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GLContext; - import com.gtnewhorizons.angelica.glsm.GLStateManager; public class GLAPI { - private static final boolean useGlBlendFuncSeparate = GLContext.getCapabilities().OpenGL14; + private static final boolean useGlBlendFuncSeparate = GLStateManager.capabilities.OpenGL14; public static void glBindTexture(int texture) { if (texture >= 0) { diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java b/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java index 0f1fc2e20..6fe02f185 100644 --- a/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java +++ b/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java @@ -2,6 +2,7 @@ package net.coderbot.iris.gl.program; import com.google.common.collect.ImmutableList; import com.gtnewhorizons.angelica.config.AngelicaConfig; +import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import java.nio.IntBuffer; import java.util.ArrayList; @@ -189,7 +190,7 @@ public class ProgramUniforms { public ProgramUniforms buildUniforms() { // Check for any unsupported uniforms and warn about them so that we can easily figure out what uniforms we need to add. - final int activeUniforms = GL20.glGetProgrami(program, GL20.GL_ACTIVE_UNIFORMS); + final int activeUniforms = GLStateManager.glGetProgrami(program, GL20.GL_ACTIVE_UNIFORMS); IntBuffer sizeType = BufferUtils.createIntBuffer(2); for (int index = 0; index < activeUniforms; index++) { diff --git a/src/test/java/com/gtnewhorizons/angelica/arch/NoDirectGLCallsTest.java b/src/test/java/com/gtnewhorizons/angelica/arch/NoDirectGLCallsTest.java new file mode 100644 index 000000000..4c45e131d --- /dev/null +++ b/src/test/java/com/gtnewhorizons/angelica/arch/NoDirectGLCallsTest.java @@ -0,0 +1,49 @@ +package com.gtnewhorizons.angelica.arch; + +import com.tngtech.archunit.core.domain.JavaClasses; +import com.tngtech.archunit.core.importer.ClassFileImporter; +import com.tngtech.archunit.core.importer.ImportOption; +import com.tngtech.archunit.lang.ArchRule; +import org.junit.jupiter.api.Test; + +import static com.tngtech.archunit.core.domain.JavaCall.Predicates.target; +import static com.tngtech.archunit.core.domain.properties.HasName.Predicates.nameMatching; +import static com.tngtech.archunit.core.domain.properties.HasOwner.Predicates.With.owner; +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; + +/** + * Enforces that all GL calls go through GLStateManager / RENDER_BACKEND. Direct method calls on org.lwjgl.opengl GL command classes are banned outside + * of the GL backend implementation and the bytecode redirector. + * + * Field access (GL constants like GL11.GL_BLEND) is not affected + * + * LWJGL infrastructure classes (Display, ContextAttribs, PixelFormat, Drawable) are excluded + */ +class NoDirectGLCallsTest { + + // Matches GL command classes but not LWJGL infrastructure (Display, etc.) + // Covers: GL11-GL44, ARB*, EXT*, NV*, AMD*, ATI*, KHR*, INTEL*, GLContext, plus OpenGlHelper + private static final String GL_COMMAND_CLASSES = "org\\.lwjgl\\.opengl\\.(?!Display|ContextAttribs|PixelFormat|Drawable|SharedDrawable).*"; + + private static final JavaClasses classes = new ClassFileImporter() + .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) + .importPaths( + "build/classes/java/main", + "build/classes/java/mixin" + ); + + private static final ArchRule NO_DIRECT_GL_CALLS = noClasses() + .that().resideOutsideOfPackages( + "com.gtnewhorizons.angelica.glsm.backend..", + "com.gtnewhorizons.angelica.loading.." + ) + .should().callMethodWhere( + target(owner(nameMatching(GL_COMMAND_CLASSES))) + ) + .because("GL calls must go through GLStateManager/RENDER_BACKEND, not directly to LWJGL"); + + @Test + void noDirectGLCalls() { + NO_DIRECT_GL_CALLS.check(classes); + } +}