diff --git a/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java b/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java
index e50c14c40..97230b120 100644
--- a/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java
+++ b/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java
@@ -78,8 +78,8 @@ import java.lang.annotation.Target;
*
* @Surround(method = ..., at = @At(value = "INVOKE", target = ...))
* private void enter() {
- * @Surround.Carry("depth") int depth = GLStateManager.pushState(StateSet.BLEND);
- * @Surround.Carry("prev") int prevProgram = GLStateManager.getActiveProgram();
+ * @Surround.Carry("depth") int depth = GLSMAttribStack.pushState(StateSet.BLEND);
+ * @Surround.Carry("prev") int prevProgram = GLSMPrograms.getActiveProgram();
* @Surround.Carry Class<?> prevRenderable = TesrAttribution.currentRenderable;
* }
*
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
index e2d51f88e..e5e539f62 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
@@ -257,8 +257,8 @@ public class CompatUniformManager {
}
private static void uploadMatrices(int[] locs, boolean mvChanged, boolean mvLinearChanged, boolean projChanged, boolean texMatChanged) {
- final Matrix4f mv = GLStateManager.getModelViewMatrix();
- final Matrix4f proj = GLStateManager.getProjectionMatrix();
+ final Matrix4f mv = GLSMMatrices.getModelViewMatrix();
+ final Matrix4f proj = GLSMMatrices.getProjectionMatrix();
if (mvChanged) {
// ModelView
@@ -340,13 +340,13 @@ public class CompatUniformManager {
// angelica_LightmapTextureMatrix — actual GLSM texture unit 1 matrix (set by enableLightmap())
if (locs[LOC_LIGHTMAP_TEXTURE_MATRIX] != -1) {
- GLStateManager.getTextures().getTextureUnitMatrix(1).get(mat4Buf);
+ GLSMTextures.getTextures().getTextureUnitMatrix(1).get(mat4Buf);
RENDER_BACKEND.uniformMatrix4(locs[LOC_LIGHTMAP_TEXTURE_MATRIX], false, mat4Buf);
}
// iris_TextureMatrix — texture unit 0 matrix (animated by glints, etc.)
if (locs[LOC_IRIS_TEXTURE_MATRIX] != -1) {
- GLStateManager.getTextures().getTextureUnitMatrix(0).get(mat4Buf);
+ GLSMTextures.getTextures().getTextureUnitMatrix(0).get(mat4Buf);
RENDER_BACKEND.uniformMatrix4(locs[LOC_IRIS_TEXTURE_MATRIX], false, mat4Buf);
}
}
@@ -359,7 +359,7 @@ public class CompatUniformManager {
private static void uploadFragmentUniforms(int[] locs) {
// Fog uniforms
- FogStateStack fog = GLStateManager.getFogState();
+ FogStateStack fog = GLSMFog.getFogState();
if (locs[LOC_FOG_DENSITY] != -1) {
RENDER_BACKEND.uniform1f(locs[LOC_FOG_DENSITY], Math.max(0.0f, fog.getDensity()));
}
@@ -383,10 +383,10 @@ public class CompatUniformManager {
// Return -1.0f for ALWAYS or disabled so `alpha <= ref` never discards.
if (locs[LOC_ALPHA_TEST_REF] != -1) {
final float ref;
- if (!GLStateManager.getAlphaTest().isEnabled() || GLStateManager.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
+ if (!GLSMDepthStencilAlpha.getAlphaTest().isEnabled() || GLSMDepthStencilAlpha.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
ref = -1.0f;
} else {
- ref = GLStateManager.getAlphaState().getReference();
+ ref = GLSMDepthStencilAlpha.getAlphaState().getReference();
}
RENDER_BACKEND.uniform1f(locs[LOC_ALPHA_TEST_REF], ref);
}
@@ -396,8 +396,8 @@ public class CompatUniformManager {
* Scene color = emission + ambient * lightModel.ambient, alpha = diffuse.a Same computation as {@code Uniforms.uploadLightingPreComputed()}.
*/
private static void uploadSceneColor(int[] locs) {
- final MaterialState mat = GLStateManager.getFrontMaterial();
- final LightModelState lm = GLStateManager.getLightModel();
+ final MaterialState mat = GLSMLighting.getFrontMaterial();
+ final LightModelState lm = GLSMLighting.getLightModel();
vec4Buf.clear();
vec4Buf.put(mat.emission.x + mat.ambient.x * lm.ambient.x)
.put(mat.emission.y + mat.ambient.y * lm.ambient.y)
@@ -408,7 +408,7 @@ public class CompatUniformManager {
}
private static void uploadLightSources(int[] locs) {
- final LightStateStack[] lights = GLStateManager.getLightDataStates();
+ final LightStateStack[] lights = GLSMLighting.getLightDataStates();
for (int li = 0; li < 2; li++) {
final int base = LOC_LIGHT_BASE + li * LIGHT_FIELDS;
final LightState light = lights[li];
@@ -455,7 +455,7 @@ public class CompatUniformManager {
private static void uploadMaterial(int[] locs) {
// Early exit: if the first material field isn't present, no material uniforms exist
if (locs[LOC_MAT_BASE] == -1) return;
- final MaterialState mat = GLStateManager.getFrontMaterial();
+ final MaterialState mat = GLSMLighting.getFrontMaterial();
if (locs[LOC_MAT_BASE + MF_EMISSION] != -1)
RENDER_BACKEND.uniform4f(locs[LOC_MAT_BASE + MF_EMISSION], mat.emission.x, mat.emission.y, mat.emission.z, mat.emission.w);
if (locs[LOC_MAT_BASE + MF_AMBIENT] != -1)
@@ -470,10 +470,10 @@ public class CompatUniformManager {
private static void uploadClipPlanes(int[] locs) {
if (locs[LOC_CLIP_PLANES_ENABLED] != -1) {
- RENDER_BACKEND.uniform1i(locs[LOC_CLIP_PLANES_ENABLED], GLStateManager.anyClipPlaneEnabled() ? 1 : 0);
+ RENDER_BACKEND.uniform1i(locs[LOC_CLIP_PLANES_ENABLED], GLSMRasterizer.anyClipPlaneEnabled() ? 1 : 0);
}
if (locs[LOC_CLIP_PLANES] != -1) {
- final ClipPlaneState cps = GLStateManager.getClipPlaneState();
+ final ClipPlaneState cps = GLSMRasterizer.getClipPlaneState();
clipPlaneBuf.clear();
for (int i = 0; i < GLStateManager.MAX_CLIP_PLANES; i++) {
cps.putEyePlane(i, clipPlaneBuf);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
index 4ec89f1b5..614325293 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
@@ -80,7 +80,7 @@ public class DisplayListManager {
private static int glListMode = 0;
private static int glListId = -1;
private static int recordedStatePushes;
- private static final DisplayListCommand POP_STATE = GLStateManager::popState;
+ private static final DisplayListCommand POP_STATE = GLSMAttribStack::popState;
private static CommandRecorder currentRecorder = null; // Command recorder (null when not recording)
private static volatile Thread recordingThread = null; // Thread that started recording (for thread-safety)
private static List accumulatedDraws = null; // Accumulates quad draws for batching
@@ -237,7 +237,7 @@ public class DisplayListManager {
currentRecorder.writeMultMatrix(pending);
}
if (glListMode == GL11.GL_COMPILE_AND_EXECUTE) {
- GLStateManager.applyMultMatrix(pending);
+ GLSMMatrices.applyMultMatrix(pending);
}
@@ -722,7 +722,7 @@ public class DisplayListManager {
/**
* Add an immediate mode draw to the current display list compilation.
- * Called by GLStateManager.glEnd() when immediate mode geometry is ready.
+ * Called by GLSMDraws.glEnd() when immediate mode geometry is ready.
*
* This method captures the current transform and command position, creating
* an AccumulatedDraw that will be interleaved correctly with other commands
@@ -781,7 +781,7 @@ public class DisplayListManager {
/**
* Update the relative transform with a matrix multiplication during display list compilation.
- * Called by GLStateManager.glMultMatrix().
+ * Called by GLSMMatrices.glMultMatrix().
*
*
In normal mode: accumulates transforms, emits collapsed MultMatrix at barriers.
*
In debug mode: emits MultMatrix immediately (no collapsing).
@@ -833,7 +833,7 @@ public class DisplayListManager {
/**
* Reset the relative transform to identity during display list compilation.
- * Called by GLStateManager.glLoadMatrix() - after loading an absolute matrix,
+ * Called by GLSMMatrices.glLoadMatrix() - after loading an absolute matrix,
* subsequent transforms are relative to that loaded matrix (i.e., start from identity).
*/
static void resetRelativeTransform() {
@@ -1147,7 +1147,7 @@ public class DisplayListManager {
}
if (pendingDraw.drawMode != tessellator.drawMode
|| pendingDraw.format != tessellator.getVertexFormat()
- || GLStateManager.isContinuousDraw(tessellator.drawMode)
+ || GLSMDraws.isContinuousDraw(tessellator.drawMode)
) {
drawBarrier();
createNewDraw(tessellator, copyLast);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java
index ff64e1b26..e6b5192b8 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java
@@ -160,8 +160,8 @@ final class ExitStateCapture {
textureInherited = true;
modelView.set(context.modelViewMatrix);
attribDepth = context.attribDepth;
- modelViewDepth = GLStateManager.getMatrixStackDepth(context.modelViewMatrix);
- textureDepth = GLStateManager.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0));
+ modelViewDepth = GLSMMatrices.getMatrixStackDepth(context.modelViewMatrix);
+ textureDepth = GLSMMatrices.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0));
entryOverrides = overridesInControl();
}
@@ -185,8 +185,8 @@ final class ExitStateCapture {
}
private boolean stacksMatchEntry() {
- return context.attribDepth == attribDepth && GLStateManager.getMatrixStackDepth(context.modelViewMatrix) == modelViewDepth
- && GLStateManager.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)) == textureDepth && modelView.equals(context.modelViewMatrix);
+ return context.attribDepth == attribDepth && GLSMMatrices.getMatrixStackDepth(context.modelViewMatrix) == modelViewDepth
+ && GLSMMatrices.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)) == textureDepth && modelView.equals(context.modelViewMatrix);
}
void cancel() {
@@ -448,7 +448,7 @@ final class ExitStateCapture {
if (result == null) return;
final int mode = context.matrixMode.getMode();
if (mode == GL11.GL_TEXTURE && context.activeTextureUnit.getValue() == 0) {
- final int depth = GLStateManager.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0));
+ final int depth = GLSMMatrices.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0));
if (depth < matrixWrites.length) {
matrixWrites[depth] = result.writes;
matrixInherited[depth] = textureInherited;
@@ -476,7 +476,7 @@ final class ExitStateCapture {
reject();
return;
}
- final int depth = GLStateManager.getMatrixStackDepth(matrix);
+ final int depth = GLSMMatrices.getMatrixStackDepth(matrix);
if (depth <= entryDepth) {
result.valid = false;
return;
@@ -549,34 +549,34 @@ final class ExitStateCapture {
// Capabilities go first so the glColor4f below bakes into the material only if color material is on at exit.
for (int field = 0; field < CAPS.length; field++) {
if (!has(fields, field)) continue;
- if (field == TEXTURE0 || field == TEXTURE1) GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + field - TEXTURE0);
+ if (field == TEXTURE0 || field == TEXTURE1) GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + field - TEXTURE0);
// glEnable would bake the live color, not the exit color, into the material.
if (field == COLOR_MATERIAL) {
context.colorMaterial.setEnabled((in.enabled & (1L << field)) != 0);
- } else if ((in.enabled & (1L << field)) != 0) GLStateManager.glEnable(CAPS[field]);
- else GLStateManager.glDisable(CAPS[field]);
+ } else if ((in.enabled & (1L << field)) != 0) GLSMEnable.glEnable(CAPS[field]);
+ else GLSMEnable.glDisable(CAPS[field]);
}
- if (has(fields, COLOR)) GLStateManager.glColor4f(in.color.getRed(), in.color.getGreen(), in.color.getBlue(), in.color.getAlpha());
- if (has(fields, NORMAL)) GLStateManager.glNormal3f(in.normal.x, in.normal.y, in.normal.z);
- if (has(fields, TEXCOORD)) GLStateManager.glTexCoord4f(in.texCoord.x, in.texCoord.y, in.texCoord.z, in.texCoord.w);
- if (has(fields, LIGHTMAP)) GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, in.lightmapX, in.lightmapY);
- if (has(fields, SHADER_COLOR)) GLStateManager.setShaderColor(in.shaderColor.x, in.shaderColor.y, in.shaderColor.z, in.shaderColor.w);
- if (has(fields, OVERLAY_COLOR)) GLStateManager.setOverlayColor(in.overlayColor.x, in.overlayColor.y, in.overlayColor.z, in.overlayColor.w);
- if (has(fields, BLEND_FUNC)) GLStateManager.tryBlendFuncSeparate(in.blend.getSrcRgb(), in.blend.getDstRgb(), in.blend.getSrcAlpha(), in.blend.getDstAlpha());
- if (has(fields, ALPHA_FUNC)) GLStateManager.glAlphaFunc(in.alpha.getFunction(), in.alpha.getReference());
- if (has(fields, DEPTH_FUNC)) GLStateManager.glDepthFunc(in.depthFunction);
- if (has(fields, DEPTH_MASK)) GLStateManager.glDepthMask(in.depthMask);
- if (has(fields, COLOR_MASK)) GLStateManager.glColorMask(in.colorMask.red, in.colorMask.green, in.colorMask.blue, in.colorMask.alpha);
- if (has(fields, CULL_FACE)) GLStateManager.glCullFace(in.cullFace);
- if (has(fields, FRONT_FACE)) GLStateManager.glFrontFace(in.frontFace);
- if (has(fields, SHADE_MODEL)) GLStateManager.glShadeModel(in.shadeModel);
- if (has(fields, OFFSET_VALUES)) GLStateManager.glPolygonOffsetClamp(in.offsetFactor, in.offsetUnits, in.offsetClamp);
+ if (has(fields, COLOR)) GLSMCurrentAttribs.glColor4f(in.color.getRed(), in.color.getGreen(), in.color.getBlue(), in.color.getAlpha());
+ if (has(fields, NORMAL)) GLSMCurrentAttribs.glNormal3f(in.normal.x, in.normal.y, in.normal.z);
+ if (has(fields, TEXCOORD)) GLSMCurrentAttribs.glTexCoord4f(in.texCoord.x, in.texCoord.y, in.texCoord.z, in.texCoord.w);
+ if (has(fields, LIGHTMAP)) GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, in.lightmapX, in.lightmapY);
+ if (has(fields, SHADER_COLOR)) GLSMCurrentAttribs.setShaderColor(in.shaderColor.x, in.shaderColor.y, in.shaderColor.z, in.shaderColor.w);
+ if (has(fields, OVERLAY_COLOR)) GLSMCurrentAttribs.setOverlayColor(in.overlayColor.x, in.overlayColor.y, in.overlayColor.z, in.overlayColor.w);
+ if (has(fields, BLEND_FUNC)) GLSMBlend.tryBlendFuncSeparate(in.blend.getSrcRgb(), in.blend.getDstRgb(), in.blend.getSrcAlpha(), in.blend.getDstAlpha());
+ if (has(fields, ALPHA_FUNC)) GLSMDepthStencilAlpha.glAlphaFunc(in.alpha.getFunction(), in.alpha.getReference());
+ if (has(fields, DEPTH_FUNC)) GLSMDepthStencilAlpha.glDepthFunc(in.depthFunction);
+ if (has(fields, DEPTH_MASK)) GLSMDepthStencilAlpha.glDepthMask(in.depthMask);
+ if (has(fields, COLOR_MASK)) GLSMBlend.glColorMask(in.colorMask.red, in.colorMask.green, in.colorMask.blue, in.colorMask.alpha);
+ if (has(fields, CULL_FACE)) GLSMRasterizer.glCullFace(in.cullFace);
+ if (has(fields, FRONT_FACE)) GLSMRasterizer.glFrontFace(in.frontFace);
+ if (has(fields, SHADE_MODEL)) GLSMRasterizer.glShadeModel(in.shadeModel);
+ if (has(fields, OFFSET_VALUES)) GLSMRasterizer.glPolygonOffsetClamp(in.offsetFactor, in.offsetUnits, in.offsetClamp);
if (has(fields, TEXTURE_BINDING)) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, in.texture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, in.texture);
}
- if (has(fields, TEXTURE_MATRIX)) GLStateManager.setTextureMatrix(0, in.textureMatrix);
- if (has(fields, COLOR_MATERIAL_SETTINGS)) GLStateManager.glColorMaterial(in.materialFace, in.materialParameter);
+ if (has(fields, TEXTURE_MATRIX)) GLSMMatrices.setTextureMatrix(0, in.textureMatrix);
+ if (has(fields, COLOR_MATERIAL_SETTINGS)) GLSMLighting.glColorMaterial(in.materialFace, in.materialParameter);
boolean materialChanged = false;
for (int field = FRONT_AMBIENT; field <= BACK_EMISSION; field++) {
if (!has(fields, field)) continue;
@@ -590,8 +590,8 @@ final class ExitStateCapture {
materialChanged = true;
}
if (materialChanged) context.lightingGeneration++;
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + (has(fields, ACTIVE_UNIT) ? in.activeUnit : liveUnit));
- if (has(fields, CLIENT_ACTIVE_UNIT)) GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + in.clientActiveUnit);
- if (has(fields, MATRIX_MODE)) GLStateManager.glMatrixMode(in.matrixMode);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + (has(fields, ACTIVE_UNIT) ? in.activeUnit : liveUnit));
+ if (has(fields, CLIENT_ACTIVE_UNIT)) GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + in.clientActiveUnit);
+ if (has(fields, MATRIX_MODE)) GLSMMatrices.glMatrixMode(in.matrixMode);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java
index 614374918..6a56399f5 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java
@@ -68,10 +68,10 @@ public class Feature {
*/
private static void addTextureGenStates(Set> collection) {
for(int i = 0 ; i < GLStateManager.MAX_TEXTURE_UNITS; i++) {
- collection.add(GLStateManager.getTextures().getTexGenSStates(i));
- collection.add(GLStateManager.getTextures().getTexGenTStates(i));
- collection.add(GLStateManager.getTextures().getTexGenRStates(i));
- collection.add(GLStateManager.getTextures().getTexGenQStates(i));
+ collection.add(GLSMTextures.getTextures().getTexGenSStates(i));
+ collection.add(GLSMTextures.getTextures().getTexGenTStates(i));
+ collection.add(GLSMTextures.getTextures().getTexGenRStates(i));
+ collection.add(GLSMTextures.getTextures().getTexGenQStates(i));
}
}
@@ -79,24 +79,24 @@ public class Feature {
final Int2ObjectMap>> attribToFeatures = new Int2ObjectOpenHashMap<>();
attribToFeatures.put(GL11.GL_COLOR_BUFFER_BIT, ImmutableSet.of(
- GLStateManager.getAlphaTest()
- , GLStateManager.getAlphaState()
- , GLStateManager.getBlendMode()
- , GLStateManager.getBlendState()
- , GLStateManager.getColorLogicOpState()
- , GLStateManager.getDitherState()
- , GLStateManager.getDrawBuffer()
- , GLStateManager.getIndexLogicOpState()
- , GLStateManager.getLogicOpMode()
- , GLStateManager.getColorMask()
- , GLStateManager.getClearColor()
+ GLSMDepthStencilAlpha.getAlphaTest()
+ , GLSMDepthStencilAlpha.getAlphaState()
+ , GLSMBlend.getBlendMode()
+ , GLSMBlend.getBlendState()
+ , GLSMBlend.getColorLogicOpState()
+ , GLSMRasterizer.getDitherState()
+ , GLSMFramebuffer.getDrawBuffer()
+ , GLSMBlend.getIndexLogicOpState()
+ , GLSMBlend.getLogicOpMode()
+ , GLSMBlend.getColorMask()
+ , GLSMBlend.getClearColor()
));
attribToFeatures.put(GL11.GL_CURRENT_BIT, ImmutableSet.of(
- GLStateManager.getColor()
- , GLStateManager.getSecondaryColor() // Current secondary color
+ GLSMCurrentAttribs.getColor()
+ , GLSMCurrentAttribs.getSecondaryColor() // Current secondary color
, ShaderManager.getNormalStack() // Current normal vector
, ShaderManager.getTexCoordStack() // Current texture coordinates
- , GLStateManager.getEdgeFlagState()
+ , GLSMRasterizer.getEdgeFlagState()
// Current color index
// Current raster position
// GL_CURRENT_RASTER_POSITION_VALID flag
@@ -106,82 +106,82 @@ public class Feature {
// GL_EDGE_FLAG flag
));
attribToFeatures.put(GL11.GL_DEPTH_BUFFER_BIT, ImmutableSet.of(
- GLStateManager.getDepthTest()
- , GLStateManager.getDepthState()
+ GLSMDepthStencilAlpha.getDepthTest()
+ , GLSMDepthStencilAlpha.getDepthState()
// Depth buffer clear value
// GL_DEPTH_WRITEMASK enable bit
));
final HashSet> enableBits = new HashSet<>(ImmutableSet.of(
- GLStateManager.getAlphaTest()
- , GLStateManager.getAutoNormalState()
- , GLStateManager.getBlendMode()
- , GLStateManager.getColorLogicOpState()
- , GLStateManager.getColorMaterial()
- , GLStateManager.getColorSumState()
- , GLStateManager.getCullState()
- , GLStateManager.getDepthTest()
- , GLStateManager.getDitherState()
- , GLStateManager.getFogMode()
- , GLStateManager.getIndexLogicOpState()
- , GLStateManager.getLightStates()[0] // GL_LIGHT0
- , GLStateManager.getLightStates()[1] // GL_LIGHT1
- , GLStateManager.getLightStates()[2] // GL_LIGHT2
- , GLStateManager.getLightStates()[3] // GL_LIGHT3
- , GLStateManager.getLightStates()[4] // GL_LIGHT4
- , GLStateManager.getLightStates()[5] // GL_LIGHT5
- , GLStateManager.getLightStates()[6] // GL_LIGHT6
- , GLStateManager.getLightStates()[7] // GL_LIGHT7
- , GLStateManager.getLightingState()
- , GLStateManager.getLineSmoothState()
- , GLStateManager.getLineStippleState()
- , GLStateManager.getMap1Color4State()
- , GLStateManager.getMap1IndexState()
- , GLStateManager.getMap1NormalState()
- , GLStateManager.getMap1TextureCoord1State()
- , GLStateManager.getMap1TextureCoord2State()
- , GLStateManager.getMap1TextureCoord3State()
- , GLStateManager.getMap1TextureCoord4State()
- , GLStateManager.getMap1Vertex3State()
- , GLStateManager.getMap1Vertex4State()
- , GLStateManager.getMap2Color4State()
- , GLStateManager.getMap2IndexState()
- , GLStateManager.getMap2NormalState()
- , GLStateManager.getMap2TextureCoord1State()
- , GLStateManager.getMap2TextureCoord2State()
- , GLStateManager.getMap2TextureCoord3State()
- , GLStateManager.getMap2TextureCoord4State()
- , GLStateManager.getMap2Vertex3State()
- , GLStateManager.getMap2Vertex4State()
- , GLStateManager.getMultisampleState()
- , GLStateManager.getNormalizeState()
- , GLStateManager.getPointSmoothState()
- , GLStateManager.getPolygonOffsetPointState()
- , GLStateManager.getPolygonOffsetLineState()
- , GLStateManager.getPolygonOffsetFillState()
- , GLStateManager.getPointSpriteState()
- , GLStateManager.getVertexProgramTwoSideState()
- , GLStateManager.getPolygonSmoothState()
- , GLStateManager.getPolygonStippleState()
- , GLStateManager.getRescaleNormalState()
- , GLStateManager.getSampleAlphaToCoverageState()
- , GLStateManager.getSampleAlphaToOneState()
- , GLStateManager.getSampleCoverageState()
- , GLStateManager.getScissorTest()
- , GLStateManager.getStencilTest()
+ GLSMDepthStencilAlpha.getAlphaTest()
+ , GLSMRasterizer.getAutoNormalState()
+ , GLSMBlend.getBlendMode()
+ , GLSMBlend.getColorLogicOpState()
+ , GLSMLighting.getColorMaterial()
+ , GLSMCurrentAttribs.getColorSumState()
+ , GLSMRasterizer.getCullState()
+ , GLSMDepthStencilAlpha.getDepthTest()
+ , GLSMRasterizer.getDitherState()
+ , GLSMFog.getFogMode()
+ , GLSMBlend.getIndexLogicOpState()
+ , GLSMLighting.getLightStates()[0] // GL_LIGHT0
+ , GLSMLighting.getLightStates()[1] // GL_LIGHT1
+ , GLSMLighting.getLightStates()[2] // GL_LIGHT2
+ , GLSMLighting.getLightStates()[3] // GL_LIGHT3
+ , GLSMLighting.getLightStates()[4] // GL_LIGHT4
+ , GLSMLighting.getLightStates()[5] // GL_LIGHT5
+ , GLSMLighting.getLightStates()[6] // GL_LIGHT6
+ , GLSMLighting.getLightStates()[7] // GL_LIGHT7
+ , GLSMLighting.getLightingState()
+ , GLSMRasterizer.getLineSmoothState()
+ , GLSMRasterizer.getLineStippleState()
+ , GLSMRasterizer.getMap1Color4State()
+ , GLSMRasterizer.getMap1IndexState()
+ , GLSMRasterizer.getMap1NormalState()
+ , GLSMRasterizer.getMap1TextureCoord1State()
+ , GLSMRasterizer.getMap1TextureCoord2State()
+ , GLSMRasterizer.getMap1TextureCoord3State()
+ , GLSMRasterizer.getMap1TextureCoord4State()
+ , GLSMRasterizer.getMap1Vertex3State()
+ , GLSMRasterizer.getMap1Vertex4State()
+ , GLSMRasterizer.getMap2Color4State()
+ , GLSMRasterizer.getMap2IndexState()
+ , GLSMRasterizer.getMap2NormalState()
+ , GLSMRasterizer.getMap2TextureCoord1State()
+ , GLSMRasterizer.getMap2TextureCoord2State()
+ , GLSMRasterizer.getMap2TextureCoord3State()
+ , GLSMRasterizer.getMap2TextureCoord4State()
+ , GLSMRasterizer.getMap2Vertex3State()
+ , GLSMRasterizer.getMap2Vertex4State()
+ , GLSMRasterizer.getMultisampleState()
+ , GLSMLighting.getNormalizeState()
+ , GLSMRasterizer.getPointSmoothState()
+ , GLSMRasterizer.getPolygonOffsetPointState()
+ , GLSMRasterizer.getPolygonOffsetLineState()
+ , GLSMRasterizer.getPolygonOffsetFillState()
+ , GLSMRasterizer.getPointSpriteState()
+ , GLSMPrograms.getVertexProgramTwoSideState()
+ , GLSMRasterizer.getPolygonSmoothState()
+ , GLSMRasterizer.getPolygonStippleState()
+ , GLSMLighting.getRescaleNormalState()
+ , GLSMRasterizer.getSampleAlphaToCoverageState()
+ , GLSMRasterizer.getSampleAlphaToOneState()
+ , GLSMRasterizer.getSampleCoverageState()
+ , GLSMRasterizer.getScissorTest()
+ , GLSMDepthStencilAlpha.getStencilTest()
));
// Enable bits for the user-definable clipping planes
- for(int i = 0; i < GLStateManager.getClipPlaneStates().length; i++) {
- enableBits.add(GLStateManager.getClipPlaneStates()[i]);
+ for(int i = 0; i < GLSMRasterizer.getClipPlaneStates().length; i++) {
+ enableBits.add(GLSMRasterizer.getClipPlaneStates()[i]);
}
// GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D flags
for(int i = 0 ; i < GLStateManager.MAX_TEXTURE_UNITS; i++) {
- enableBits.add(GLStateManager.getTextures().getTexture1DStates(i));
- enableBits.add(GLStateManager.getTextures().getTextureUnitStates(i));
- enableBits.add(GLStateManager.getTextures().getTexture3DStates(i));
- enableBits.add(GLStateManager.getTextures().getTextureCubeMapStates(i));
+ enableBits.add(GLSMTextures.getTextures().getTexture1DStates(i));
+ enableBits.add(GLSMTextures.getTextures().getTextureUnitStates(i));
+ enableBits.add(GLSMTextures.getTextures().getTexture3DStates(i));
+ enableBits.add(GLSMTextures.getTextures().getTextureCubeMapStates(i));
}
// Flags GL_TEXTURE_GEN_x where x is S, T, R, or Q
@@ -189,30 +189,30 @@ public class Feature {
attribToFeatures.put(GL11.GL_ENABLE_BIT, enableBits);
attribToFeatures.put(GL11.GL_EVAL_BIT, ImmutableSet.of(
- GLStateManager.getAutoNormalState()
- , GLStateManager.getMap1Color4State()
- , GLStateManager.getMap1IndexState()
- , GLStateManager.getMap1NormalState()
- , GLStateManager.getMap1TextureCoord1State()
- , GLStateManager.getMap1TextureCoord2State()
- , GLStateManager.getMap1TextureCoord3State()
- , GLStateManager.getMap1TextureCoord4State()
- , GLStateManager.getMap1Vertex3State()
- , GLStateManager.getMap1Vertex4State()
- , GLStateManager.getMap2Color4State()
- , GLStateManager.getMap2IndexState()
- , GLStateManager.getMap2NormalState()
- , GLStateManager.getMap2TextureCoord1State()
- , GLStateManager.getMap2TextureCoord2State()
- , GLStateManager.getMap2TextureCoord3State()
- , GLStateManager.getMap2TextureCoord4State()
- , GLStateManager.getMap2Vertex3State()
- , GLStateManager.getMap2Vertex4State()
+ GLSMRasterizer.getAutoNormalState()
+ , GLSMRasterizer.getMap1Color4State()
+ , GLSMRasterizer.getMap1IndexState()
+ , GLSMRasterizer.getMap1NormalState()
+ , GLSMRasterizer.getMap1TextureCoord1State()
+ , GLSMRasterizer.getMap1TextureCoord2State()
+ , GLSMRasterizer.getMap1TextureCoord3State()
+ , GLSMRasterizer.getMap1TextureCoord4State()
+ , GLSMRasterizer.getMap1Vertex3State()
+ , GLSMRasterizer.getMap1Vertex4State()
+ , GLSMRasterizer.getMap2Color4State()
+ , GLSMRasterizer.getMap2IndexState()
+ , GLSMRasterizer.getMap2NormalState()
+ , GLSMRasterizer.getMap2TextureCoord1State()
+ , GLSMRasterizer.getMap2TextureCoord2State()
+ , GLSMRasterizer.getMap2TextureCoord3State()
+ , GLSMRasterizer.getMap2TextureCoord4State()
+ , GLSMRasterizer.getMap2Vertex3State()
+ , GLSMRasterizer.getMap2Vertex4State()
));
attribToFeatures.put(GL11.GL_FOG_BIT, ImmutableSet.of(
- GLStateManager.getFogMode()
- , GLStateManager.getColorSumState()
- , GLStateManager.getFogState()
+ GLSMFog.getFogMode()
+ , GLSMCurrentAttribs.getColorSumState()
+ , GLSMFog.getFogState()
// ^^ Fog density
// ^^ Linear fog start
// ^^ Linear fog end
@@ -220,54 +220,54 @@ public class Feature {
// ^^ GL_FOG_MODE value
));
attribToFeatures.put(GL11.GL_HINT_BIT, ImmutableSet.of(
- GLStateManager.getHintState()
+ GLSMRasterizer.getHintState()
));
attribToFeatures.put(GL11.GL_LIGHTING_BIT, ImmutableSet.of(
- GLStateManager.getColorMaterial()
- , GLStateManager.getColorMaterialFace()
- , GLStateManager.getColorMaterialParameter()
- , GLStateManager.getLightModel()
- , GLStateManager.getLightingState()
+ GLSMLighting.getColorMaterial()
+ , GLSMLighting.getColorMaterialFace()
+ , GLSMLighting.getColorMaterialParameter()
+ , GLSMLighting.getLightModel()
+ , GLSMLighting.getLightingState()
// Enable bit for each light
- , GLStateManager.getLightStates()[0] // GL_LIGHT0
- , GLStateManager.getLightStates()[1] // GL_LIGHT1
- , GLStateManager.getLightStates()[2] // GL_LIGHT2
- , GLStateManager.getLightStates()[3] // GL_LIGHT3
- , GLStateManager.getLightStates()[4] // GL_LIGHT4
- , GLStateManager.getLightStates()[5] // GL_LIGHT5
- , GLStateManager.getLightStates()[6] // GL_LIGHT6
- , GLStateManager.getLightStates()[7] // GL_LIGHT7
+ , GLSMLighting.getLightStates()[0] // GL_LIGHT0
+ , GLSMLighting.getLightStates()[1] // GL_LIGHT1
+ , GLSMLighting.getLightStates()[2] // GL_LIGHT2
+ , GLSMLighting.getLightStates()[3] // GL_LIGHT3
+ , GLSMLighting.getLightStates()[4] // GL_LIGHT4
+ , GLSMLighting.getLightStates()[5] // GL_LIGHT5
+ , GLSMLighting.getLightStates()[6] // GL_LIGHT6
+ , GLSMLighting.getLightStates()[7] // GL_LIGHT7
// Ambient, diffuse, and specular intensity for each light
// Direction, position, exponent, and cutoff angle for each light
// Constant, linear, and quadratic attenuation factors for each light
- , GLStateManager.getLightDataStates()[0]
- , GLStateManager.getLightDataStates()[1]
- , GLStateManager.getLightDataStates()[2]
- , GLStateManager.getLightDataStates()[3]
- , GLStateManager.getLightDataStates()[4]
- , GLStateManager.getLightDataStates()[5]
- , GLStateManager.getLightDataStates()[6]
- , GLStateManager.getLightDataStates()[7]
+ , GLSMLighting.getLightDataStates()[0]
+ , GLSMLighting.getLightDataStates()[1]
+ , GLSMLighting.getLightDataStates()[2]
+ , GLSMLighting.getLightDataStates()[3]
+ , GLSMLighting.getLightDataStates()[4]
+ , GLSMLighting.getLightDataStates()[5]
+ , GLSMLighting.getLightDataStates()[6]
+ , GLSMLighting.getLightDataStates()[7]
// Ambient, diffuse, specular, and emissive color for each material
// Ambient, diffuse, and specular color indices for each material
// Specular exponent for each material
- , GLStateManager.getFrontMaterial()
- , GLStateManager.getBackMaterial()
- , GLStateManager.getShadeModelState()
+ , GLSMLighting.getFrontMaterial()
+ , GLSMLighting.getBackMaterial()
+ , GLSMRasterizer.getShadeModelState()
));
attribToFeatures.put(GL11.GL_LINE_BIT, ImmutableSet.of(
- GLStateManager.getLineSmoothState()
- , GLStateManager.getLineStippleState()
- , GLStateManager.getLineState()
+ GLSMRasterizer.getLineSmoothState()
+ , GLSMRasterizer.getLineStippleState()
+ , GLSMRasterizer.getLineState()
));
attribToFeatures.put(GL11.GL_LIST_BIT, ImmutableSet.of(
// GL_LIST_BASE setting
));
attribToFeatures.put(GL13.GL_MULTISAMPLE_BIT, ImmutableSet.of(
- GLStateManager.getMultisampleState()
- , GLStateManager.getSampleAlphaToCoverageState()
- , GLStateManager.getSampleAlphaToOneState()
- , GLStateManager.getSampleCoverageState()
+ GLSMRasterizer.getMultisampleState()
+ , GLSMRasterizer.getSampleAlphaToCoverageState()
+ , GLSMRasterizer.getSampleAlphaToOneState()
+ , GLSMRasterizer.getSampleCoverageState()
// GL_SAMPLE_COVERAGE_VALUE value
// GL_SAMPLE_COVERAGE_INVERT value
));
@@ -283,32 +283,32 @@ public class Feature {
// GL_READ_BUFFER setting
));
attribToFeatures.put(GL11.GL_POINT_BIT, ImmutableSet.of(
- GLStateManager.getPointSmoothState()
- , GLStateManager.getPointSpriteState()
- , GLStateManager.getPointState()
+ GLSMRasterizer.getPointSmoothState()
+ , GLSMRasterizer.getPointSpriteState()
+ , GLSMRasterizer.getPointState()
));
attribToFeatures.put(GL11.GL_POLYGON_BIT, ImmutableSet.of(
- GLStateManager.getCullState()
- , GLStateManager.getPolygonSmoothState()
- , GLStateManager.getPolygonStippleState()
- , GLStateManager.getPolygonOffsetFillState()
- , GLStateManager.getPolygonOffsetLineState()
- , GLStateManager.getPolygonOffsetPointState()
- , GLStateManager.getPolygonState()
+ GLSMRasterizer.getCullState()
+ , GLSMRasterizer.getPolygonSmoothState()
+ , GLSMRasterizer.getPolygonStippleState()
+ , GLSMRasterizer.getPolygonOffsetFillState()
+ , GLSMRasterizer.getPolygonOffsetLineState()
+ , GLSMRasterizer.getPolygonOffsetPointState()
+ , GLSMRasterizer.getPolygonState()
));
attribToFeatures.put(GL11.GL_POLYGON_STIPPLE_BIT, ImmutableSet.of(
// Polygon stipple pattern
));
attribToFeatures.put(GL11.GL_SCISSOR_BIT, ImmutableSet.of(
- GLStateManager.getScissorTest()
- , GLStateManager.getScissorState()
+ GLSMRasterizer.getScissorTest()
+ , GLSMRasterizer.getScissorState()
));
attribToFeatures.put(GL11.GL_STENCIL_BUFFER_BIT, ImmutableSet.of(
- GLStateManager.getStencilTest()
- , GLStateManager.getStencilState()
+ GLSMDepthStencilAlpha.getStencilTest()
+ , GLSMDepthStencilAlpha.getStencilState()
));
final Set> textureAttribs = new HashSet<>(ImmutableSet.of(
- GLStateManager.getActiveTextureUnitStack()
+ GLSMTextures.getActiveTextureUnitStack()
// GL_TEXTURE_ENV_MODE + GL_TEXTURE_ENV_COLOR — now per-unit in TexEnvState (added below)
// Enable bits for the four texture coordinates
@@ -325,12 +325,12 @@ public class Feature {
// Current Texture Bindings - GL_TEXTURE_BINDING_2D + per-unit TexEnvState
for(int i = 0 ; i < GLStateManager.MAX_TEXTURE_UNITS; i++) {
- textureAttribs.add(GLStateManager.getTextures().getTextureUnitBindings(i));
- textureAttribs.add(GLStateManager.getTextures().getTexEnvState(i));
- textureAttribs.add(GLStateManager.getTextures().getTexture1DStates(i));
- textureAttribs.add(GLStateManager.getTextures().getTextureUnitStates(i));
- textureAttribs.add(GLStateManager.getTextures().getTexture3DStates(i));
- textureAttribs.add(GLStateManager.getTextures().getTextureCubeMapStates(i));
+ textureAttribs.add(GLSMTextures.getTextures().getTextureUnitBindings(i));
+ textureAttribs.add(GLSMTextures.getTextures().getTexEnvState(i));
+ textureAttribs.add(GLSMTextures.getTextures().getTexture1DStates(i));
+ textureAttribs.add(GLSMTextures.getTextures().getTextureUnitStates(i));
+ textureAttribs.add(GLSMTextures.getTextures().getTexture3DStates(i));
+ textureAttribs.add(GLSMTextures.getTextures().getTextureCubeMapStates(i));
}
// Enable bits GL_TEXTURE_GEN_x where x is S, T, R, or Q
@@ -341,17 +341,17 @@ public class Feature {
final Set> transformAttribs = new HashSet<>(ImmutableSet.of(
// Coefficients of the six clipping planes
- GLStateManager.getMatrixMode()
- , GLStateManager.getNormalizeState()
- , GLStateManager.getRescaleNormalState()
+ GLSMMatrices.getMatrixMode()
+ , GLSMLighting.getNormalizeState()
+ , GLSMLighting.getRescaleNormalState()
));
- for(int i = 0; i < GLStateManager.getClipPlaneStates().length; i++) {
- transformAttribs.add(GLStateManager.getClipPlaneStates()[i]);
+ for(int i = 0; i < GLSMRasterizer.getClipPlaneStates().length; i++) {
+ transformAttribs.add(GLSMRasterizer.getClipPlaneStates()[i]);
}
attribToFeatures.put(GL11.GL_TRANSFORM_BIT, transformAttribs);
attribToFeatures.put(GL11.GL_VIEWPORT_BIT, ImmutableSet.of(
- GLStateManager.getViewportState()
+ GLSMRasterizer.getViewportState()
));
for (Int2ObjectMap.Entry>> entry : attribToFeatures.int2ObjectEntrySet()) {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
index 86b91f89a..ba1ca4ce3 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
@@ -121,7 +121,7 @@ public class FeedbackManager {
final float ndcY = clipVec.y / w;
final float ndcZ = clipVec.z / w;
- final ViewportState vp = GLStateManager.getViewportState();
+ final ViewportState vp = GLSMRasterizer.getViewportState();
final float winX = vp.x + vp.width * (ndcX + 1.0f) * 0.5f;
final float winY = vp.y + vp.height * (ndcY + 1.0f) * 0.5f;
final float winZ = (float) ((vp.depthRangeFar - vp.depthRangeNear) * ndcZ + (vp.depthRangeFar + vp.depthRangeNear)) * 0.5f;
@@ -229,7 +229,7 @@ public class FeedbackManager {
}
private static void computeMVP() {
- mvpMatrix.set(GLStateManager.getProjectionMatrix()).mul(GLStateManager.getModelViewMatrix());
+ mvpMatrix.set(GLSMMatrices.getProjectionMatrix()).mul(GLSMMatrices.getModelViewMatrix());
}
private static int computeMask(int type) {
@@ -277,13 +277,13 @@ public class FeedbackManager {
final int previousVbo = glCtx.boundVBO;
if (positionVbo != 0 && positionVbo != previousVbo) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, positionVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, positionVbo);
}
try {
RENDER_BACKEND.getBufferSubData(GL15.GL_ARRAY_BUFFER, offset, destination);
} finally {
if (positionVbo != 0 && positionVbo != previousVbo) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, previousVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, previousVbo);
}
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java
index fed79c546..d8e3383e0 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java
@@ -161,7 +161,7 @@ public class GLContextState {
public final BooleanStateStack colorSumState = track(new BooleanStateStack(GL14.GL_COLOR_SUM, false, true));
public final Color4Stack clearColor = member(new Color4Stack(StackIdAllocator.nextId(), new Color4(0.0F, 0.0F, 0.0F, 0.0F)).restoreBit(StateSet.R_CLEAR_COLOR));
public final ColorMaskStack colorMask = member(new ColorMaskStack(StackIdAllocator.nextId()));
- public final IntegerStateStack drawBuffer = member(new IntegerStateStack(GLStateManager.DEFAULT_DRAW_BUFFER, StackIdAllocator.nextId()).restoreBit(StateSet.R_DRAW_BUFFER));
+ public final IntegerStateStack drawBuffer = member(new IntegerStateStack(GLSMFramebuffer.DEFAULT_DRAW_BUFFER, StackIdAllocator.nextId()).restoreBit(StateSet.R_DRAW_BUFFER));
public final IntegerStateStack logicOpMode = member(new IntegerStateStack(GL11.GL_COPY, StackIdAllocator.nextId()).restoreBit(StateSet.R_LOGIC_OP));
public final BooleanStateStack cullState = track(new BooleanStateStack(GL11.GL_CULL_FACE));
public final AlphaState restoredAlphaScratch = new AlphaState();
@@ -245,12 +245,12 @@ public class GLContextState {
public final int[] storageBufferBindings = new int[GLStateManager.INDEXED_BUFFER_SLOTS];
public PixelStoreState pixelUnpackState = PixelStoreState.DEFAULT;
public PixelStoreState pixelPackState = PixelStoreState.DEFAULT;
- public final int[] clientAttribSavedMask = new int[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH];
- public final PixelStoreState[] clientAttribSavedPixelUnpack = new PixelStoreState[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH];
- public final PixelStoreState[] clientAttribSavedPixelPack = new PixelStoreState[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH];
- public final int[] clientAttribSavedUnpackBuffer = new int[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH];
- public final int[] clientAttribSavedPackBuffer = new int[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH];
- public final VAOManager.ClientArrays[] clientAttribSavedArrays = new VAOManager.ClientArrays[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH];
+ public final int[] clientAttribSavedMask = new int[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH];
+ public final PixelStoreState[] clientAttribSavedPixelUnpack = new PixelStoreState[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH];
+ public final PixelStoreState[] clientAttribSavedPixelPack = new PixelStoreState[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH];
+ public final int[] clientAttribSavedUnpackBuffer = new int[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH];
+ public final int[] clientAttribSavedPackBuffer = new int[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH];
+ public final VAOManager.ClientArrays[] clientAttribSavedArrays = new VAOManager.ClientArrays[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH];
public int clientAttribStackPointer = 0;
public int restoreChangedMask;
public long restoreUnitChangedMask;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java
new file mode 100644
index 000000000..e9655bc1b
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java
@@ -0,0 +1,667 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.stacks.BlendStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.CowDepths;
+import com.gtnewhorizons.angelica.glsm.stacks.CowDispatch;
+import com.gtnewhorizons.angelica.glsm.stacks.CowStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.RetainedState;
+import com.gtnewhorizons.angelica.glsm.states.AlphaState;
+import com.gtnewhorizons.angelica.glsm.states.PixelStoreState;
+import com.gtnewhorizons.angelica.glsm.states.SamplerUnitArray;
+import com.gtnewhorizons.angelica.glsm.states.TextureBinding;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL21;
+import org.lwjgl.opengl.GL30;
+import java.util.List;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_ATTRIB_STACK_DEPTH;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_UNITS;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.RETAINED_SLOT;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.primaryContext;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMAttribStack {
+
+ private GLSMAttribStack() {}
+
+ public static long attribPushes;
+ public static long attribSlotsSaved;
+ public static long attribValueRestores;
+ public static long attribBackendCalls;
+ public static long attribDiscards;
+
+ /** Register a state stack id as modified at the current depth (called from beforeModify). */
+ public static void registerModifiedState(GLContextState c, int id) {
+ if (c.attribDepth > 0) {
+ final int depth = c.attribDepth - 1;
+ c.modifiedIds[depth][c.modifiedCount[depth]++] = id;
+ if (!c.poppingAttributes) {
+ attribSlotsSaved++;
+ }
+ }
+ }
+
+ static final int CLIENT_ATTRIB_STACK_DEPTH = 16;
+ public static void glPushClientAttrib(int mask) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final int sp = glCtx.clientAttribStackPointer;
+ if (sp < CLIENT_ATTRIB_STACK_DEPTH) {
+ glCtx.clientAttribSavedMask[sp] = mask;
+ if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) {
+ glCtx.clientAttribSavedPixelPack[sp] = glCtx.pixelPackState;
+ glCtx.clientAttribSavedPixelUnpack[sp] = glCtx.pixelUnpackState;
+ glCtx.clientAttribSavedPackBuffer[sp] = glCtx.boundPixelPackBuffer;
+ glCtx.clientAttribSavedUnpackBuffer[sp] = glCtx.boundPixelUnpackBuffer;
+ }
+ if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) {
+ VAOManager.ClientArrays saved = glCtx.clientAttribSavedArrays[sp];
+ if (saved == null) glCtx.clientAttribSavedArrays[sp] = saved = new VAOManager.ClientArrays();
+ saved.boundVAO = glCtx.boundVAO;
+ saved.boundVBO = glCtx.boundVBO;
+ saved.boundEBO = glCtx.vaos.boundEBO;
+ saved.clientActiveTextureUnit = glCtx.clientActiveTextureUnit;
+ glCtx.vaos.saveClientArrays(saved);
+ }
+ glCtx.clientAttribStackPointer = sp + 1;
+ }
+ }
+
+ public static void glPopClientAttrib() {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (glCtx.clientAttribStackPointer > 0) {
+ final int sp = --glCtx.clientAttribStackPointer;
+ final int mask = glCtx.clientAttribSavedMask[sp];
+ if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) {
+ final PixelStoreState pack = glCtx.clientAttribSavedPixelPack[sp];
+ final PixelStoreState unpack = glCtx.clientAttribSavedPixelUnpack[sp];
+ glCtx.clientAttribSavedPixelPack[sp] = null;
+ glCtx.clientAttribSavedPixelUnpack[sp] = null;
+ PixelStoreState.applyDiff(glCtx.pixelPackState, pack, true);
+ glCtx.pixelPackState = pack;
+ PixelStoreState.applyDiff(glCtx.pixelUnpackState, unpack, false);
+ glCtx.pixelUnpackState = unpack;
+ final int packBuffer = glCtx.clientAttribSavedPackBuffer[sp];
+ if (glCtx.boundPixelPackBuffer != packBuffer) GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer);
+ final int unpackBuffer = glCtx.clientAttribSavedUnpackBuffer[sp];
+ if (glCtx.boundPixelUnpackBuffer != unpackBuffer) GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
+ }
+ if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) {
+ restoreClientArrays(glCtx, glCtx.clientAttribSavedArrays[sp]);
+ }
+ }
+ }
+
+ private static void restoreClientArrays(GLContextState glCtx, VAOManager.ClientArrays saved) {
+ final VAOManager vaos = glCtx.vaos;
+ if (!vaos.vaoMap.containsKey(saved.boundVAO)) return;
+ GLSMVertexInput.bindVertexArrayInternal(glCtx, saved.boundVAO);
+ glCtx.clientActiveTextureUnit = saved.clientActiveTextureUnit;
+ if (vaos.isBufferLive(saved.boundVBO, saved)) {
+ final int changed = vaos.restoreClientArrays(saved);
+ for (int pointers = changed & 0xFFFF; pointers != 0; pointers &= pointers - 1) {
+ GLSMVertexInput.pointAttrib(glCtx, Integer.numberOfTrailingZeros(pointers));
+ }
+ for (int enables = changed >>> 16; enables != 0; enables &= enables - 1) {
+ GLSMVertexInput.syncAttribEnable(glCtx, Integer.numberOfTrailingZeros(enables));
+ }
+ if (glCtx.boundVBO != saved.boundVBO) GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, saved.boundVBO);
+ }
+ if (vaos.boundEBO != saved.boundEBO && vaos.isBufferLive(saved.boundEBO, saved)) GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, saved.boundEBO);
+ }
+
+ public static void pushState(int mask) {
+ pushStateLive(StateSet.forMask(mask));
+ }
+
+ public static int pushState(StateSet set) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ final int token = ctx().attribDepth + DisplayListManager.virtualStateDepth(mode);
+ if (token >= MAX_ATTRIB_STACK_DEPTH) {
+ throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached");
+ }
+ DisplayListManager.recordPushState(set);
+ if (mode == RecordMode.COMPILE) {
+ return token;
+ }
+ }
+ return pushStateLive(set);
+ }
+
+ static int pushStateLive(StateSet set) {
+ attribPushes++;
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.pushAttrib();
+ if (glCtx.attribDepth >= MAX_ATTRIB_STACK_DEPTH) {
+ throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached");
+ }
+ final int depthBefore = glCtx.attribDepth;
+ glCtx.attribSets[depthBefore] = set;
+ glCtx.savedBatchStateGen[depthBefore] = glCtx.batchStateGeneration;
+
+ snapshotGenerations(glCtx, set.bump);
+
+ glCtx.modifiedCount[depthBefore] = 0;
+
+ if ((set.restore & StateSet.R_PROGRAM) != 0) {
+ glCtx.programStack.setValue(glCtx.activeProgram);
+ glCtx.programStack.push();
+ attribSlotsSaved++;
+ }
+
+ glCtx.attribDepth++;
+ return depthBefore;
+ }
+
+ private static void snapshotGenerations(GLContextState glCtx, int bump) {
+ final int depth = glCtx.attribDepth;
+ if ((bump & StateSet.B_LIGHTING) != 0) {
+ glCtx.savedLightingGen[depth] = glCtx.lightingGeneration;
+ }
+ if ((bump & (StateSet.B_FRAG_COLORBUF | StateSet.B_FRAG_TEXTURE | StateSet.B_FRAG_FOG)) != 0) {
+ glCtx.savedFragmentGen[depth] = glCtx.fragmentGeneration;
+ }
+ if ((bump & StateSet.B_TRANSFORM) != 0) {
+ glCtx.savedMvGen[depth] = glCtx.mvGeneration;
+ glCtx.savedMvLinearGen[depth] = glCtx.mvLinearGeneration;
+ glCtx.savedProjGen[depth] = glCtx.projGeneration;
+ glCtx.savedTexMatGen[depth] = glCtx.texMatrixGeneration;
+ }
+ if ((bump & StateSet.B_CURRENT) != 0) {
+ glCtx.savedColorGen[depth] = glCtx.colorGeneration;
+ glCtx.savedNormalGen[depth] = glCtx.ffp.normalGeneration;
+ glCtx.savedTexCoordGen[depth] = glCtx.ffp.texCoordGeneration;
+ }
+ }
+
+ public static void popStateTo(int depth) {
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ while (glCtx.attribDepth + DisplayListManager.virtualStateDepth(mode) > depth) {
+ if (mode == RecordMode.COMPILE && DisplayListManager.recordPopStateIfPending()) continue;
+ if (mode == RecordMode.COMPILE_AND_EXECUTE) DisplayListManager.recordPopStateIfPending();
+ popState();
+ }
+ }
+
+ public static void popState() {
+ final GLContextState glCtx = ctx();
+ if (glCtx.attribDepth > 0 && glCtx.savedBatchStateGen[glCtx.attribDepth - 1] != glCtx.batchStateGeneration) {
+ beforeUncapturedStateChange();
+ }
+ final int poppedDepth = glCtx.attribDepth;
+ final StateSet set = glCtx.attribSets[poppedDepth - 1];
+ glCtx.exitCapture.popAttrib(set);
+ final boolean inspectAlpha = GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()
+ && ((glCtx.alphaState.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaState.stackId()))
+ || (glCtx.alphaTest.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaTest.stackId())));
+ final AlphaState effectiveAlpha = inspectAlpha ? glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch) : null;
+ final boolean effectiveEnabled = inspectAlpha && glCtx.alphaTest.isEffectivelyEnabled();
+ final int effectiveFunction = inspectAlpha ? effectiveAlpha.getFunction() : 0;
+ final float effectiveReference = inspectAlpha ? effectiveAlpha.getReference() : 0.0f;
+ final boolean liveEnabled = inspectAlpha && glCtx.alphaTest.isEnabled();
+ final int liveFunction = inspectAlpha ? glCtx.alphaState.getFunction() : 0;
+ final float liveReference = inspectAlpha ? glCtx.alphaState.getReference() : 0.0f;
+ final boolean prevPoppingAttributes = glCtx.poppingAttributes;
+ glCtx.poppingAttributes = true;
+ try {
+ glCtx.attribDepth--;
+ final int restore = set.restore;
+
+ final boolean blendSnapshotted = set.blendSnapshot
+ && (glCtx.blendState.cowDepths().claimedAt(poppedDepth) || glCtx.blendMode.cowDepths().claimedAt(poppedDepth))
+ && GLSMBlend.snapshotVanillaBlendFunc();
+
+ int changed = 0;
+ long unitsChanged = 0L;
+
+ if ((restore & StateSet.R_PROGRAM) != 0) {
+ glCtx.programStack.setValue(glCtx.activeProgram);
+ if (glCtx.programStack.topSlotChanged()) changed |= StateSet.R_PROGRAM;
+ glCtx.programStack.pop();
+ }
+
+ final int depth = glCtx.attribDepth;
+ final int count = glCtx.modifiedCount[depth];
+ final int[] ids = glCtx.modifiedIds[depth];
+ final CowStateStack>[] stackById = glCtx.stackById;
+ final CowDepths[] depthsById = glCtx.depthsById;
+ final int[] restoreBitById = glCtx.restoreBitById;
+ final int[] restoreUnitById = glCtx.restoreUnitById;
+ final byte[] kindById = glCtx.kindById;
+
+ for (int i = 0; i < count; i++) {
+ final int id = ids[i];
+ final CowStateStack> cow = stackById[id];
+ final byte kind = kindById[id];
+ if (set.contains(id)) {
+ final int bit = restoreBitById[id];
+ if (bit != 0 && CowDispatch.topSlotChanged(kind, cow)) {
+ changed |= bit;
+ final int unit = restoreUnitById[id];
+ if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63);
+ }
+ final int slot = depthsById[id].pop();
+ if (slot >= 0) CowDispatch.restoreSlot(kind, cow, slot);
+ if (bit == 0
+ && (kind == CowDispatch.BOOLEAN
+ || kind == CowDispatch.CLIP_PLANE_BOOLEAN
+ || kind == CowDispatch.TEXTURE_UNIT_BOOLEAN)) attribValueRestores++;
+ } else {
+ if (depthsById[id].discard(poppedDepth) >= 0) registerModifiedState(glCtx, id);
+ attribDiscards++;
+ }
+ }
+ glCtx.modifiedCount[depth] = 0;
+
+ glCtx.restoreChangedMask = changed;
+ glCtx.restoreUnitChangedMask = unitsChanged;
+
+ applyRestoredState(set, blendSnapshotted);
+ } finally {
+ glCtx.poppingAttributes = prevPoppingAttributes;
+ }
+ if (inspectAlpha) {
+ glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch);
+ if (effectiveEnabled != glCtx.alphaTest.isEffectivelyEnabled()
+ || effectiveFunction != effectiveAlpha.getFunction()
+ || Float.compare(effectiveReference, effectiveAlpha.getReference()) != 0
+ || liveEnabled != glCtx.alphaTest.isEnabled()
+ || liveFunction != glCtx.alphaState.getFunction()
+ || Float.compare(liveReference, glCtx.alphaState.getReference()) != 0) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ }
+ }
+
+ public static void retainModifiedState(int depth, RetainedState out) {
+ final GLContextState glCtx = ctx();
+ if (depth < 0 || depth != glCtx.attribDepth - 1) {
+ throw new IllegalStateException("retainModifiedState: depth " + depth + " is not the open push (attrib depth " + glCtx.attribDepth + ")");
+ }
+ glCtx.retainedOwner = out;
+ final int count = glCtx.modifiedCount[depth];
+ final int[] ids = glCtx.modifiedIds[depth];
+ final CowStateStack>[] stackById = glCtx.stackById;
+ out.ensureCapacity(count);
+ for (int i = 0; i < count; i++) {
+ final int id = ids[i];
+ stackById[id].captureSlot(RETAINED_SLOT);
+ out.ids[i] = id;
+ }
+ out.count = count;
+ out.program = glCtx.activeProgram;
+ out.programGen = GLSMPrograms.programLifetimeGeneration;
+ }
+
+ public static void applyRetainedState(RetainedState in) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (glCtx.retainedOwner != in) return;
+ final CowStateStack>[] stackById = glCtx.stackById;
+ final byte[] kindById = glCtx.kindById;
+ final int[] ids = in.ids;
+ final int count = in.count;
+ int first = 0;
+ while (first < count && !CowDispatch.slotChanged(kindById[ids[first]], stackById[ids[first]], RETAINED_SLOT)) first++;
+ if (first < count) applyRetainedChanges(glCtx, in, first);
+ if (in.program != glCtx.activeProgram && (in.program == 0 || in.programGen == GLSMPrograms.programLifetimeGeneration)) GLSMPrograms.glUseProgram(in.program);
+ }
+
+ private static void applyRetainedChanges(GLContextState glCtx, RetainedState in, int first) {
+ beforeUncapturedStateChange();
+ final boolean blendSnapshotted = GLSMBlend.snapshotVanillaBlendFunc();
+ final int alphaFuncId = glCtx.alphaState.stackId();
+ final int alphaTestId = glCtx.alphaTest.stackId();
+ boolean alphaChanged = false;
+ final boolean prevPoppingAttributes = glCtx.poppingAttributes;
+ glCtx.poppingAttributes = true;
+ try {
+ final CowStateStack>[] stackById = glCtx.stackById;
+ final int[] restoreBitById = glCtx.restoreBitById;
+ final int[] restoreUnitById = glCtx.restoreUnitById;
+ final byte[] kindById = glCtx.kindById;
+ int changed = 0;
+ long unitsChanged = 0L;
+ for (int i = first; i < in.count; i++) {
+ final int id = in.ids[i];
+ final CowStateStack> cow = stackById[id];
+ final byte kind = kindById[id];
+ if (!CowDispatch.slotChanged(kind, cow, RETAINED_SLOT)) continue;
+ cow.beforeModify();
+ final int bit = restoreBitById[id];
+ if (bit != 0) {
+ changed |= bit;
+ final int unit = restoreUnitById[id];
+ if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63);
+ }
+ CowDispatch.restoreSlot(kind, cow, RETAINED_SLOT);
+ if (id == alphaFuncId || id == alphaTestId) alphaChanged = true;
+ }
+ glCtx.restoreChangedMask = changed;
+ glCtx.restoreUnitChangedMask = unitsChanged;
+ issueRestoredBackendState(glCtx, -1);
+ glCtx.lightingGeneration++;
+ glCtx.fragmentGeneration++;
+ glCtx.colorGeneration++;
+ glCtx.ffp.normalGeneration++;
+ glCtx.ffp.texCoordGeneration++;
+ glCtx.dirtyColorAttrib = true;
+ glCtx.dirtyNormalAttrib = true;
+ glCtx.dirtyTexCoordAttrib = true;
+ GLSMBlend.postVanillaBlendChangeIfMoved(blendSnapshotted);
+ } finally {
+ glCtx.poppingAttributes = prevPoppingAttributes;
+ }
+ if (alphaChanged && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ }
+
+ private static boolean isDepthColorOverridden() {
+ final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
+ return dch != null && dch.isOverrideHeld();
+ }
+
+ public static void replayStateToBackend() {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (RENDER_BACKEND == null) return;
+
+ final List booleanStates = glCtx.allBooleanStates;
+ for (int i = 0; i < booleanStates.size(); i++) {
+ booleanStates.get(i).applyToBackend();
+ }
+
+ RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc());
+ RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled());
+ RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue());
+
+ GLSMBlend.issueBlendFunc(glCtx.blendState);
+ glCtx.blendState.clearFuncUnknownState();
+ RENDER_BACKEND.blendEquationSeparate(glCtx.blendState.getEquationRgb(), glCtx.blendState.getEquationAlpha());
+ RENDER_BACKEND.blendColor(glCtx.blendState.getBlendColorR(), glCtx.blendState.getBlendColorG(), glCtx.blendState.getBlendColorB(), glCtx.blendState.getBlendColorA());
+ RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha);
+ RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha());
+ RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue());
+
+ RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront());
+ RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack());
+ RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront());
+ RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack());
+ RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront());
+ RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack());
+ RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue());
+
+ RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height);
+ RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar);
+ RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height);
+ RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), GLSMRasterizer.lineWidthMin, GLSMRasterizer.lineWidthMax));
+ GLSMRasterizer.applyPointState(glCtx);
+ GLSMRasterizer.applyHintState(glCtx);
+
+ RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode());
+ applyPolygonOffset(glCtx);
+ RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode());
+ RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace());
+
+ final SamplerUnitArray samplerUnits = glCtx.samplerUnits;
+ for (int i = 0; i <= samplerUnits.getHighestBoundUnit(); i++) {
+ final int sampler = samplerUnits.get(i);
+ if (sampler != 0) RENDER_BACKEND.bindSampler(i, sampler);
+ }
+
+ for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) {
+ final TextureBinding b = glCtx.textures.getTextureUnitBindings(i);
+ RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i);
+ RENDER_BACKEND.bindTexture(b.getTarget() == 0 ? GL11.GL_TEXTURE_2D : b.getTarget(), b.getBinding());
+ }
+ RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + GLSMTextures.getActiveTextureUnit());
+ if (glCtx.defaultVAO == 0 && primaryContext().defaultVAO != 0) glCtx.defaultVAO = RENDER_BACKEND.genVertexArrays();
+ if (!glCtx.vaos.isInitialized()) glCtx.vaos.init(glCtx.defaultVAO);
+ RENDER_BACKEND.bindVertexArray(glCtx.boundVAO != 0 ? glCtx.boundVAO : glCtx.defaultVAO);
+ RENDER_BACKEND.useProgram(glCtx.activeProgram);
+ glCtx.ffp.invalidateProgram();
+ RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer);
+ RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer);
+ glCtx.dirtyColorAttrib = true;
+ glCtx.dirtyNormalAttrib = true;
+ glCtx.dirtyTexCoordAttrib = true;
+ glCtx.dirtyLightmapAttrib = true;
+ glCtx.dirtyEntityIdsAttrib = true;
+ }
+
+ private static void applyPolygonOffset(GLContextState glCtx) {
+ final float clamp = glCtx.polygonState.getOffsetClamp();
+ if (clamp == 0.0f) {
+ RENDER_BACKEND.polygonOffset(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits());
+ } else {
+ RENDER_BACKEND.polygonOffsetClamp(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits(), clamp);
+ }
+ }
+
+ private static void issueRestoredBackendState(GLContextState glCtx, int restore) {
+ final int changed = glCtx.restoreChangedMask;
+ if ((restore & StateSet.R_DEPTH) != 0 && (changed & StateSet.R_DEPTH) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc());
+ attribBackendCalls++;
+ if (!isDepthColorOverridden()) {
+ RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled());
+ attribBackendCalls++;
+ }
+ RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue());
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_BLEND) != 0) {
+ final BlendStateStack blend = glCtx.blendState;
+ if ((changed & StateSet.R_BLEND) != 0 || blend.isFuncUnknown()) {
+ attribValueRestores++;
+ final DeferredBlendHandler restoreBlendHandler = GLSMHooks.blendHandler;
+ if (restoreBlendHandler == null || !restoreBlendHandler.isOverrideHeld()) {
+ GLSMBlend.issueBlendFunc(blend);
+ attribBackendCalls++;
+ blend.clearFuncUnknownState();
+ }
+ if ((changed & StateSet.R_BLEND) != 0) {
+ RENDER_BACKEND.blendEquationSeparate(blend.getEquationRgb(), blend.getEquationAlpha());
+ attribBackendCalls++;
+ RENDER_BACKEND.blendColor(
+ blend.getBlendColorR(), blend.getBlendColorG(), blend.getBlendColorB(), blend.getBlendColorA());
+ attribBackendCalls++;
+ }
+ }
+ }
+ if ((restore & StateSet.R_COLOR_MASK) != 0 && (changed & StateSet.R_COLOR_MASK) != 0 && !isDepthColorOverridden()) {
+ attribValueRestores++;
+ RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha);
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_CLEAR_COLOR) != 0 && (changed & StateSet.R_CLEAR_COLOR) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha());
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_DRAW_BUFFER) != 0 && (changed & StateSet.R_DRAW_BUFFER) != 0 && glCtx.drawFramebuffer == 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.drawBuffer(glCtx.drawBuffer.getValue());
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_LOGIC_OP) != 0 && (changed & StateSet.R_LOGIC_OP) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue());
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_STENCIL) != 0 && (changed & StateSet.R_STENCIL) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront());
+ RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack());
+ RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront());
+ RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack());
+ RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront());
+ RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack());
+ RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue());
+ attribBackendCalls += 7;
+ }
+ if ((restore & StateSet.R_VIEWPORT) != 0 && (changed & StateSet.R_VIEWPORT) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height);
+ RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar);
+ attribBackendCalls += 2;
+ }
+ if ((restore & StateSet.R_SCISSOR) != 0 && (changed & StateSet.R_SCISSOR) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height);
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_LINE) != 0 && (changed & StateSet.R_LINE) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), GLSMRasterizer.lineWidthMin, GLSMRasterizer.lineWidthMax));
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_POINT) != 0 && (changed & StateSet.R_POINT) != 0) {
+ attribValueRestores++;
+ GLSMRasterizer.applyPointState(glCtx);
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_HINT) != 0 && (changed & StateSet.R_HINT) != 0) {
+ attribValueRestores++;
+ GLSMRasterizer.applyHintState(glCtx);
+ attribBackendCalls++;
+ }
+ if ((restore & StateSet.R_POLYGON) != 0 && (changed & StateSet.R_POLYGON) != 0) {
+ attribValueRestores++;
+ RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode());
+ applyPolygonOffset(glCtx);
+ RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode());
+ RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace());
+ attribBackendCalls += 4;
+ }
+ final boolean textureBitSet = (restore & StateSet.R_TEXTURE) != 0 && (changed & StateSet.R_TEXTURE) != 0;
+ final boolean activeUnitBitSet = (restore & StateSet.R_ACTIVE_UNIT) != 0;
+ if (textureBitSet || activeUnitBitSet) {
+ boolean unitTouched = false;
+ if (textureBitSet) {
+ final long unitsChanged = glCtx.restoreUnitChangedMask;
+ for (int i = 0; i < MAX_TEXTURE_UNITS; i++) {
+ if ((unitsChanged & (1L << Math.min(i, 63))) != 0) {
+ final TextureBinding restored = glCtx.textures.getTextureUnitBindings(i);
+ final int restoredTarget = restored.getTarget() != 0 ? restored.getTarget() : GL11.GL_TEXTURE_2D;
+ RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i);
+ RENDER_BACKEND.bindTexture(restoredTarget, restored.getBinding());
+ attribValueRestores++;
+ attribBackendCalls += 2;
+ unitTouched = true;
+ }
+ }
+ }
+ if (unitTouched || (activeUnitBitSet && (changed & StateSet.R_ACTIVE_UNIT) != 0)) {
+ RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + glCtx.activeTextureUnit.getValue());
+ attribValueRestores++;
+ attribBackendCalls++;
+ }
+ }
+ }
+
+ /**
+ * After popping GLSM stacks, apply restored state to the GL driver.
+ */
+ private static void applyRestoredState(StateSet set, boolean blendSnapshotted) {
+ final GLContextState glCtx = ctx();
+ final int restore = set.restore;
+ final int changed = glCtx.restoreChangedMask;
+ issueRestoredBackendState(glCtx, restore);
+
+ final int bump = set.bump;
+ final int depth = glCtx.attribDepth;
+ if ((bump & StateSet.B_LIGHTING) != 0 && glCtx.lightingGeneration != glCtx.savedLightingGen[depth]) glCtx.lightingGeneration++;
+ if ((bump & StateSet.B_FRAG_FOG) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++;
+ if ((bump & StateSet.B_FRAG_COLORBUF) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++;
+ if ((bump & StateSet.B_FRAG_TEXTURE) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++;
+ if ((bump & StateSet.B_TRANSFORM) != 0) {
+ if (glCtx.mvGeneration != glCtx.savedMvGen[depth]) glCtx.mvGeneration++;
+ if (glCtx.mvLinearGeneration != glCtx.savedMvLinearGen[depth]) glCtx.mvLinearGeneration++;
+ if (glCtx.projGeneration != glCtx.savedProjGen[depth]) glCtx.projGeneration++;
+ if (glCtx.texMatrixGeneration != glCtx.savedTexMatGen[depth]) glCtx.texMatrixGeneration++;
+ }
+ if ((bump & StateSet.B_CURRENT) != 0) {
+ if (glCtx.colorGeneration != glCtx.savedColorGen[depth]) {
+ glCtx.colorGeneration++;
+ glCtx.dirtyColorAttrib = true;
+ }
+ if (glCtx.ffp.normalGeneration != glCtx.savedNormalGen[depth]) {
+ glCtx.ffp.normalGeneration++;
+ glCtx.dirtyNormalAttrib = true;
+ }
+ if (glCtx.ffp.texCoordGeneration != glCtx.savedTexCoordGen[depth]) {
+ glCtx.ffp.texCoordGeneration++;
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+ if ((restore & StateSet.R_SECONDARY_COLOR) != 0 && (changed & StateSet.R_SECONDARY_COLOR) != 0) glCtx.fragmentGeneration++;
+ }
+
+ GLSMBlend.postVanillaBlendChangeIfMoved(blendSnapshotted);
+
+ if ((restore & StateSet.R_PROGRAM) != 0 && (changed & StateSet.R_PROGRAM) != 0) {
+ GLSMPrograms.glUseProgram(glCtx.programStack.getValue());
+ attribValueRestores++;
+ attribBackendCalls++;
+ }
+ }
+
+ public static void glPushAttrib(int mask) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPushAttrib(mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ GLDebug.pushGroup("pushState");
+ pushState(mask);
+ }
+
+ public static void glPopAttrib() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPopAttrib();
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (ctx().attribDepth == 0) {
+ rejectExitCapture();
+ warnOnce("popattrib-underflow", "glPopAttrib called with an empty attrib stack; ignoring");
+ return;
+ }
+ GLDebug.popGroup();
+ GLDebug.pushGroup("popState");
+ try {
+ popState();
+ } finally {
+ GLDebug.popGroup();
+ }
+ }
+
+ public static boolean isPoppingAttributes() {
+ return ctx().poppingAttributes;
+ }
+
+ public static int getAttribDepth() {
+ return ctx().attribDepth;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java
new file mode 100644
index 000000000..003e58f14
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java
@@ -0,0 +1,335 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.stacks.BlendStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.Color4Stack;
+import com.gtnewhorizons.angelica.glsm.stacks.ColorMaskStack;
+import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
+import com.gtnewhorizons.angelica.glsm.states.BlendState;
+import com.gtnewhorizons.angelica.glsm.states.ColorMask;
+import org.lwjgl.opengl.GL11;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMBlend {
+
+ private GLSMBlend() {}
+
+ public static void glBlendColor(float red, float green, float blue, float alpha) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordBlendColor(red, green, blue, alpha);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ final boolean bypass = !caching;
+ if (bypass || red != glCtx.blendState.getBlendColorR() || green != glCtx.blendState.getBlendColorG() || blue != glCtx.blendState.getBlendColorB() || alpha != glCtx.blendState.getBlendColorA()) {
+ mod(glCtx.blendState);
+ beforeUncapturedStateChange();
+ glCtx.blendState.setBlendColorR(red);
+ glCtx.blendState.setBlendColorG(green);
+ glCtx.blendState.setBlendColorB(blue);
+ glCtx.blendState.setBlendColorA(alpha);
+ RENDER_BACKEND.blendColor(red, green, blue, alpha);
+ }
+ }
+
+ public static void glBlendFuncSeparatei(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
+ rejectExitCapture();
+ RENDER_BACKEND.blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
+ ctx().blendState.setFuncUnknownState();
+ }
+
+ public static void enableBlend() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_BLEND);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableBlend(ctx());
+ }
+
+ static void enableBlend(GLContextState glCtx) {
+ final BooleanStateStack blend = glCtx.blendMode;
+ final boolean wasEnabled = blend.isEffectivelyEnabled();
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ glCtx.exitCapture.capability(GL11.GL_BLEND, -1);
+ blend.beforeModify();
+ bh.deferBlendModeToggle(true);
+ } else {
+ blend.enable();
+ }
+ if (!wasEnabled && blend.isEffectivelyEnabled()) postVanillaBlendChange();
+ }
+
+ public static void disableBlend() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_BLEND);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableBlend(ctx());
+ }
+
+ static void disableBlend(GLContextState glCtx) {
+ final BooleanStateStack blend = glCtx.blendMode;
+ final boolean wasEnabled = blend.isEffectivelyEnabled();
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ glCtx.exitCapture.capability(GL11.GL_BLEND, -1);
+ blend.beforeModify();
+ bh.deferBlendModeToggle(false);
+ } else {
+ blend.disable();
+ }
+ if (wasEnabled && !blend.isEffectivelyEnabled()) postVanillaBlendChange();
+ }
+
+ private static void postVanillaBlendChange() {
+ if (GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) {
+ GLSMHooks.VANILLA_BLEND_CHANGE.post(GLSMHooks.vanillaBlendChangeEvent);
+ }
+ }
+
+ static boolean snapshotVanillaBlendFunc() {
+ if (!GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) return false;
+ final GLContextState glCtx = ctx();
+ glCtx.blendState.readEffective(glCtx.vanillaBlendBefore);
+ glCtx.vanillaBlendEnabledBefore = glCtx.blendMode.isEffectivelyEnabled();
+ return true;
+ }
+
+ static void postVanillaBlendChangeIfMoved(boolean snapshotted) {
+ if (!snapshotted) return;
+ final GLContextState glCtx = ctx();
+ final BlendState before = glCtx.vanillaBlendBefore;
+ final BlendState after = glCtx.blendState.readEffective(glCtx.vanillaBlendAfter);
+ if (glCtx.blendMode.isEffectivelyEnabled() != glCtx.vanillaBlendEnabledBefore
+ || after.getSrcRgb() != before.getSrcRgb()
+ || after.getDstRgb() != before.getDstRgb()
+ || after.getSrcAlpha() != before.getSrcAlpha()
+ || after.getDstAlpha() != before.getDstAlpha()) {
+ postVanillaBlendChange();
+ }
+ }
+
+ public static boolean isEffectiveBlendEnabled() {
+ return ctx().blendMode.isEffectivelyEnabled();
+ }
+
+ public static BlendState getEffectiveBlendState(BlendState out) {
+ return ctx().blendState.readEffective(out);
+ }
+
+ public static ColorMask getEffectiveColorMask(ColorMask out) {
+ return ctx().colorMask.readEffective(out);
+ }
+
+ public static void glBlendFunc(int srcFactor, int dstFactor) {
+ tryBlendFuncSeparate(srcFactor, dstFactor, srcFactor, dstFactor);
+ }
+
+ static void issueBlendFunc(BlendStateStack blend) {
+ if (GLSMConfig.hudCacheOverride) {
+ RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ } else {
+ RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), blend.getSrcAlpha(), blend.getDstAlpha());
+ }
+ }
+
+ public static void setHudCacheOverride(boolean enabled) {
+ if (GLSMConfig.hudCacheOverride == enabled) return;
+ GLSMConfig.hudCacheOverride = enabled;
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isOverrideHeld()) return;
+ final BlendStateStack blend = ctx().blendState;
+ issueBlendFunc(blend);
+ blend.clearFuncUnknownState();
+ }
+
+ public static void glBlendEquation(int mode) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glBlendEquation");
+ }
+ final boolean caching = isCachingEnabled();
+ final boolean bypass = !caching;
+ if (bypass || glCtx.blendState.getEquationRgb() != mode || glCtx.blendState.getEquationAlpha() != mode) {
+ mod(glCtx.blendState);
+ beforeUncapturedStateChange();
+ glCtx.blendState.setEquationRgb(mode);
+ glCtx.blendState.setEquationAlpha(mode);
+ RENDER_BACKEND.blendEquation(mode);
+ }
+ }
+
+ public static void glBlendEquationSeparate(int modeRGB, int modeAlpha) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glBlendEquationSeparate");
+ }
+ final boolean caching = isCachingEnabled();
+ final boolean bypass = !caching;
+ if (bypass || glCtx.blendState.getEquationRgb() != modeRGB || glCtx.blendState.getEquationAlpha() != modeAlpha) {
+ mod(glCtx.blendState);
+ beforeUncapturedStateChange();
+ glCtx.blendState.setEquationRgb(modeRGB);
+ glCtx.blendState.setEquationAlpha(modeAlpha);
+ RENDER_BACKEND.blendEquationSeparate(modeRGB, modeAlpha);
+ }
+ }
+
+ public static void tryBlendFuncSeparate(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.writeBlend();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean snapshotted = snapshotVanillaBlendFunc();
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ mod(glCtx.blendState);
+ bh.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ postVanillaBlendChangeIfMoved(snapshotted);
+ return;
+ }
+ final boolean caching = isCachingEnabled();
+ final boolean bypass = !caching;
+ if (bypass || glCtx.blendState.getSrcRgb() != srcRgb || glCtx.blendState.getDstRgb() != dstRgb || glCtx.blendState.getSrcAlpha() != srcAlpha || glCtx.blendState.getDstAlpha() != dstAlpha || glCtx.blendState.isFuncUnknown()) {
+ mod(glCtx.blendState);
+ glCtx.blendState.setAll(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ glCtx.blendState.clearFuncUnknownState();
+ issueBlendFunc(glCtx.blendState);
+ if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) {
+ final boolean hudCache = GLSMConfig.hudCacheOverride;
+ GLSMHooks.blendFuncChangeEvent.srcRgb = srcRgb;
+ GLSMHooks.blendFuncChangeEvent.dstRgb = dstRgb;
+ GLSMHooks.blendFuncChangeEvent.srcAlpha = hudCache ? GL11.GL_ONE : srcAlpha;
+ GLSMHooks.blendFuncChangeEvent.dstAlpha = hudCache ? GL11.GL_ONE_MINUS_SRC_ALPHA : dstAlpha;
+ GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent);
+ }
+ }
+ postVanillaBlendChangeIfMoved(snapshotted);
+ }
+
+ public static void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
+ tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
+ }
+
+ public static void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.writeDepthColor(ExitStateCapture.COLOR_MASK);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColorMask(red, green, blue, alpha);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
+ if (dch != null && dch.isDepthColorLocked()) {
+ mod(glCtx.colorMask);
+ dch.deferColorMask(red, green, blue, alpha);
+ return;
+ }
+ final boolean caching = isCachingEnabled();
+ final boolean bypass = !caching;
+ if (bypass || red != glCtx.colorMask.red || green != glCtx.colorMask.green || blue != glCtx.colorMask.blue || alpha != glCtx.colorMask.alpha) {
+ mod(glCtx.colorMask);
+ glCtx.colorMask.setAll(red, green, blue, alpha);
+ RENDER_BACKEND.colorMask(red, green, blue, alpha);
+ }
+ }
+
+ public static void glClearColor(float red, float green, float blue, float alpha) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordClearColor(red, green, blue, alpha);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || red != glCtx.clearColor.getRed() || green != glCtx.clearColor.getGreen() || blue != glCtx.clearColor.getBlue() || alpha != glCtx.clearColor.getAlpha()) {
+ mod(glCtx.clearColor);
+ glCtx.clearColor.setRed(red);
+ glCtx.clearColor.setGreen(green);
+ glCtx.clearColor.setBlue(blue);
+ glCtx.clearColor.setAlpha(alpha);
+ RENDER_BACKEND.clearColor(red, green, blue, alpha);
+ }
+ }
+
+ public static void glLogicOp(int opcode) {
+ rejectExitCapture();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLogicOp(opcode);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (!isCachingEnabled() || ctx().logicOpMode.getValue() != opcode) beforeUncapturedStateChange();
+ if (isCachingEnabled()) mod(ctx().logicOpMode).setValue(opcode);
+ RENDER_BACKEND.logicOp(opcode);
+ }
+
+ public static void defaultBlendFunc() {
+ tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ }
+
+ public static BlendStateStack getBlendState() {
+ return ctx().blendState;
+ }
+
+ public static BooleanStateStack getBlendMode() {
+ return ctx().blendMode;
+ }
+
+ public static Color4Stack getClearColor() {
+ return ctx().clearColor;
+ }
+
+ public static ColorMaskStack getColorMask() {
+ return ctx().colorMask;
+ }
+
+ public static IntegerStateStack getLogicOpMode() {
+ return ctx().logicOpMode;
+ }
+
+ public static BooleanStateStack getColorLogicOpState() {
+ return ctx().colorLogicOpState;
+ }
+
+ public static BooleanStateStack getIndexLogicOpState() {
+ return ctx().indexLogicOpState;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java
new file mode 100644
index 000000000..6f799d662
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java
@@ -0,0 +1,628 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
+import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
+import it.unimi.dsi.fastutil.ints.Int2IntMap;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL21;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL31;
+import org.lwjgl.opengl.GL43;
+import java.nio.ByteBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.LongBuffer;
+import java.nio.ShortBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.INDEXED_BUFFER_SLOTS;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMBuffers {
+
+ private GLSMBuffers() {}
+
+ private static final IntOpenHashSet writeMappedBuffers = new IntOpenHashSet();
+
+ public static void glDeleteBuffers(int buffer) {
+ rejectExitCapture();
+ if (buffer == 0) return;
+ invalidateDeletedBuffer(buffer);
+ RENDER_BACKEND.deleteBuffers(buffer);
+ }
+
+ public static void glDeleteSync(long sync) {
+ rejectExitCapture();
+ RENDER_BACKEND.deleteSync(sync);
+ }
+
+ public static long glFenceSync(int condition, int flags) { rejectExitCapture(); return RENDER_BACKEND.fenceSync(condition, flags); }
+ public static int glClientWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); return RENDER_BACKEND.clientWaitSync(sync, flags, timeout); }
+ public static void glWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); RENDER_BACKEND.waitSync(sync, flags, timeout); }
+ public static int glGetSynci(long sync, int pname, IntBuffer length) { rejectExitCapture(); return RENDER_BACKEND.getSynci(sync, pname, length); }
+
+ public static void glDeleteBuffers(IntBuffer buffers) {
+ rejectExitCapture();
+ for (int i = buffers.position(); i < buffers.limit(); i++) {
+ invalidateDeletedBuffer(buffers.get(i));
+ }
+ RENDER_BACKEND.deleteBuffers(buffers);
+ }
+
+ public static void glDeleteBuffers(int[] buffers) {
+ for (int buffer : buffers) {
+ glDeleteBuffers(buffer);
+ }
+ }
+
+ private static void invalidateDeletedBuffer(int buffer) {
+ final GLContextState glCtx = ctx();
+ if (buffer == 0) return;
+ final boolean locked = acquireDrawLock();
+ try {
+ FfpExtendedAttribs.onDeleteBuffer(glCtx, buffer);
+ if (glCtx.boundVBO == buffer) glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ if (glCtx.vaos.boundEBO == buffer) glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ if (glCtx.boundPixelUnpackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
+ if (glCtx.boundPixelPackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ if (glCtx.boundCopyReadBuffer == buffer) glBindBuffer(GL31.GL_COPY_READ_BUFFER, 0);
+ if (glCtx.boundCopyWriteBuffer == buffer) glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, 0);
+ for (Int2IntMap.Entry e : glCtx.boundOtherBuffers.int2IntEntrySet()) {
+ if (e.getIntValue() != buffer) continue;
+ e.setValue(0);
+ RENDER_BACKEND.bindBuffer(e.getIntKey(), 0);
+ }
+ for (int i = 0; i < INDEXED_BUFFER_SLOTS; i++) {
+ if (glCtx.uniformBufferBindings[i] == buffer) glCtx.uniformBufferBindings[i] = 0;
+ if (glCtx.storageBufferBindings[i] == buffer) glCtx.storageBufferBindings[i] = 0;
+ }
+ writeMappedBuffers.remove(buffer);
+
+ glCtx.vaos.onDeleteBuffer(buffer);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ /** glBindBufferBase/Range also set the generic binding point, so they share this. */
+ private static void trackBufferBinding(GLContextState glCtx, int target, int buffer) {
+ if (target == GL15.GL_ARRAY_BUFFER) {
+ // if (boundVBO == buffer) return; TODO figure out why this breaks switching async occlusion mode
+ glCtx.boundVBO = buffer;
+ } else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) {
+ glCtx.vaos.onBindEBO(buffer);
+ } else if (target == GL21.GL_PIXEL_UNPACK_BUFFER) {
+ glCtx.boundPixelUnpackBuffer = buffer;
+ } else if (target == GL21.GL_PIXEL_PACK_BUFFER) {
+ glCtx.boundPixelPackBuffer = buffer;
+ } else if (target == GL31.GL_COPY_READ_BUFFER) {
+ glCtx.boundCopyReadBuffer = buffer;
+ } else if (target == GL31.GL_COPY_WRITE_BUFFER) {
+ glCtx.boundCopyWriteBuffer = buffer;
+ } else {
+ glCtx.boundOtherBuffers.put(target, buffer);
+ }
+ }
+
+ public static void glBindBuffer(int target, int buffer) {
+ rejectExitCapture();
+ final boolean locked = acquireDrawLock();
+ try {
+ trackBufferBinding(ctx(), target, buffer);
+ RENDER_BACKEND.bindBuffer(target, buffer);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static boolean warnedUntrackedPixelBuffer;
+
+ private static void warnUntrackedPixelBuffer(int binding, String name) {
+ if (warnedUntrackedPixelBuffer || initConfig == null || !initConfig.isLwjglDebug()) return;
+ final int actual = RENDER_BACKEND.getInteger(binding);
+ if (actual == 0) return;
+ warnedUntrackedPixelBuffer = true;
+ LOGGER.warn("{} is bound to {} but GLSM's cache says 0; a call site bypassed GLSMBuffers.glBindBuffer", name, actual, new Throwable());
+ }
+
+ static void suspendPixelUnpackBuffer() {
+ if (ctx().boundPixelUnpackBuffer != 0) {
+ RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
+ } else {
+ warnUntrackedPixelBuffer(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING, "GL_PIXEL_UNPACK_BUFFER");
+ }
+ }
+
+ static void restorePixelUnpackBuffer() {
+ final GLContextState glCtx = ctx();
+ if (glCtx.boundPixelUnpackBuffer != 0) {
+ RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, glCtx.boundPixelUnpackBuffer);
+ }
+ }
+
+ static void suspendPixelPackBuffer() {
+ if (ctx().boundPixelPackBuffer != 0) {
+ RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ } else {
+ warnUntrackedPixelBuffer(GL21.GL_PIXEL_PACK_BUFFER_BINDING, "GL_PIXEL_PACK_BUFFER");
+ }
+ }
+
+ static void restorePixelPackBuffer() {
+ final GLContextState glCtx = ctx();
+ if (glCtx.boundPixelPackBuffer != 0) {
+ RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, glCtx.boundPixelPackBuffer);
+ }
+ }
+
+ public static int glGenBuffers() {
+ requireContext("glGenBuffers");
+ return RENDER_BACKEND.genBuffers();
+ }
+
+ public static void glGenBuffers(IntBuffer buffers) {
+ requireContext("glGenBuffers");
+ for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.genBuffers());
+ }
+
+ public static void glGenBuffers(int[] buffers) {
+ requireContext("glGenBuffers");
+ for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.genBuffers();
+ }
+
+ public static int glCreateBuffers() {
+ requireContext("glCreateBuffers");
+ return RENDER_BACKEND.createBuffers();
+ }
+
+ public static void glCreateBuffers(IntBuffer buffers) {
+ requireContext("glCreateBuffers");
+ for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.createBuffers());
+ }
+
+ public static void glCreateBuffers(int[] buffers) {
+ requireContext("glCreateBuffers");
+ for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.createBuffers();
+ }
+
+ private static final int MAP_PERSISTENT_BIT = 0x40;
+
+ private static int bufferForTarget(GLContextState glCtx, int target) {
+ if (target == GL15.GL_ARRAY_BUFFER) return glCtx.boundVBO;
+ if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) return glCtx.vaos.boundEBO;
+ if (target == GL31.GL_COPY_READ_BUFFER) return glCtx.boundCopyReadBuffer;
+ if (target == GL31.GL_COPY_WRITE_BUFFER) return glCtx.boundCopyWriteBuffer;
+ if (target == GL21.GL_PIXEL_UNPACK_BUFFER) return glCtx.boundPixelUnpackBuffer;
+ if (target == GL21.GL_PIXEL_PACK_BUFFER) return glCtx.boundPixelPackBuffer;
+ return glCtx.boundOtherBuffers.get(target);
+ }
+
+ private static void onBufferRespec(int target) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final int buffer = bufferForTarget(glCtx, target);
+ if (buffer != 0) onNamedBufferRespec(glCtx, buffer);
+ }
+
+ private static void onNamedBufferRespec(GLContextState glCtx, int buffer) {
+ rejectExitCapture();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static void onBufferMap(int target, int access) {
+ if (access == GL15.GL_READ_ONLY) return;
+ onBufferWriteMap(target);
+ }
+
+ private static void onBufferMapRange(int target, int access) {
+ if ((access & GL30.GL_MAP_WRITE_BIT) == 0) return;
+ if ((access & MAP_PERSISTENT_BIT) != 0) {
+ markPersistentlyMapped(target);
+ return;
+ }
+ onBufferWriteMap(target);
+ }
+
+ private static void onBufferWriteMap(int target) {
+ final GLContextState glCtx = ctx();
+ final int buffer = bufferForTarget(glCtx, target);
+ if (buffer == 0) return;
+ final boolean locked = acquireDrawLock();
+ try {
+ writeMappedBuffers.add(buffer);
+ if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static void onBufferUnmap(int target) {
+ final GLContextState glCtx = ctx();
+ final int buffer = bufferForTarget(glCtx, target);
+ if (buffer == 0) return;
+ final boolean locked = acquireDrawLock();
+ try {
+ if (writeMappedBuffers.remove(buffer) && !FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static void onBufferStorage(int target, int flags) {
+ rejectExitCapture();
+ if ((flags & MAP_PERSISTENT_BIT) != 0) {
+ if (!RENDER_BACKEND.isBufferImmutable(bufferForTarget(ctx(), target))) markPersistentlyMapped(target);
+ return;
+ }
+ onBufferRespec(target);
+ }
+
+ private static void markPersistentlyMapped(int target) {
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ FfpExtendedAttribs.markPersistent(glCtx, bufferForTarget(glCtx, target));
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glBufferData(int target, long size, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, size, usage); }
+ public static void glBufferData(int target, ByteBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, ShortBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, IntBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, FloatBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, DoubleBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, LongBuffer data, int usage) { glBufferData(target, MemoryUtilities.memByteBuffer(data), usage); }
+ public static void glBufferData(int target, int[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, float[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
+ public static void glBufferData(int target, short[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferData(target, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferData(int target, long[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferData(target, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferData(int target, double[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferData(target, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+
+ public static void nglBufferData(int target, long size, long data, int usage) {
+ if (data == 0L) {
+ glBufferData(target, size, usage);
+ return;
+ }
+ glBufferData(target, MemoryUtilities.memByteBuffer(data, checkedSize(size)), usage);
+ }
+
+ public static void glBufferSubData(int target, long offset, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
+ public static void glBufferSubData(int target, long offset, ShortBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
+ public static void glBufferSubData(int target, long offset, IntBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
+ public static void glBufferSubData(int target, long offset, FloatBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
+ public static void glBufferSubData(int target, long offset, DoubleBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
+ public static void glBufferSubData(int target, long offset, LongBuffer data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glBufferSubData(int target, long offset, short[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferSubData(target, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferSubData(int target, long offset, int[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferSubData(target, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferSubData(int target, long offset, long[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferSubData(target, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferSubData(int target, long offset, float[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferSubData(target, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferSubData(int target, long offset, double[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferSubData(target, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+
+ public static void nglBufferSubData(int target, long offset, long size, long data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); }
+
+ public static ByteBuffer glMapBuffer(int target, int access) {
+ rejectExitCapture();
+ final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access);
+ if (buf != null) onBufferMap(target, access);
+ return buf;
+ }
+ public static ByteBuffer glMapBuffer(int target, int access, ByteBuffer old_buffer) { return glMapBuffer(target, access); }
+ public static ByteBuffer glMapBuffer(int target, int access, long length, ByteBuffer old_buffer) {
+ rejectExitCapture();
+ final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access, length, old_buffer);
+ if (buf != null) onBufferMap(target, access);
+ return buf;
+ }
+ public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access) {
+ rejectExitCapture();
+ final ByteBuffer buf = RENDER_BACKEND.mapBufferRange(target, offset, length, access);
+ if (buf != null) onBufferMapRange(target, access);
+ return buf;
+ }
+ public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { return glMapBufferRange(target, offset, length, access); }
+ public static long glMapBufferRangeAddress(int target, long offset, long length, int access) {
+ rejectExitCapture();
+ final long address = RENDER_BACKEND.mapBufferRangeAddress(target, offset, length, access);
+ if (address != 0L) onBufferMapRange(target, access);
+ return address;
+ }
+ public static void glFlushMappedBufferRange(int target, long offset, long length) { rejectExitCapture(); RENDER_BACKEND.flushMappedBufferRange(target, offset, length); }
+ public static boolean glUnmapBuffer(int target) {
+ rejectExitCapture();
+ onBufferUnmap(target);
+ return RENDER_BACKEND.unmapBuffer(target);
+ }
+
+ public static void glGetBufferSubData(int target, long offset, ByteBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
+ public static void glGetBufferSubData(int target, long offset, ShortBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
+ public static void glGetBufferSubData(int target, long offset, IntBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
+ public static void glGetBufferSubData(int target, long offset, FloatBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
+ public static void glGetBufferSubData(int target, long offset, DoubleBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
+ public static void glGetBufferSubData(int target, long offset, LongBuffer data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glGetBufferSubData(int target, long offset, short[] data) {
+ final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 1);
+ glGetBufferSubData(target, offset, copy);
+ copy.asShortBuffer().get(data);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glGetBufferSubData(int target, long offset, int[] data) {
+ final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2);
+ glGetBufferSubData(target, offset, copy);
+ copy.asIntBuffer().get(data);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glGetBufferSubData(int target, long offset, long[] data) {
+ final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3);
+ glGetBufferSubData(target, offset, copy);
+ copy.asLongBuffer().get(data);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glGetBufferSubData(int target, long offset, float[] data) {
+ final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2);
+ glGetBufferSubData(target, offset, copy);
+ copy.asFloatBuffer().get(data);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glGetBufferSubData(int target, long offset, double[] data) {
+ final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3);
+ glGetBufferSubData(target, offset, copy);
+ copy.asDoubleBuffer().get(data);
+ MemoryUtilities.memFree(copy);
+ }
+
+ public static void nglGetBufferSubData(int target, long offset, long size, long data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); }
+
+ public static int glGetBufferParameteri(int target, int pname) { rejectExitCapture(); return RENDER_BACKEND.getBufferParameteri(target, pname); }
+ public static int glGetBufferParameter(int target, int pname) { return glGetBufferParameteri(target, pname); }
+ public static void glGetBufferParameter(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); }
+ public static void glGetBufferParameteriv(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); }
+ public static void glGetBufferParameteriv(int target, int pname, int[] params) { params[0] = glGetBufferParameteri(target, pname); }
+
+ public static void glBufferStorage(int target, long size, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, size, flags); }
+ public static void glBufferStorage(int target, ByteBuffer data, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, data, flags); }
+ public static void glBufferStorage(int target, ShortBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
+ public static void glBufferStorage(int target, IntBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
+ public static void glBufferStorage(int target, FloatBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
+ public static void glBufferStorage(int target, DoubleBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
+ public static void glBufferStorage(int target, short[] data, int flags) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferStorage(target, copy, flags);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferStorage(int target, int[] data, int flags) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferStorage(target, copy, flags);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferStorage(int target, float[] data, int flags) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferStorage(target, copy, flags);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glBufferStorage(int target, double[] data, int flags) {
+ final ByteBuffer copy = copyOf(data);
+ glBufferStorage(target, copy, flags);
+ MemoryUtilities.memFree(copy);
+ }
+
+ public static void glNamedBufferData(int buffer, long size, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, size, usage); }
+ public static void glNamedBufferData(int buffer, ByteBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); }
+ public static void glNamedBufferData(int buffer, FloatBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); }
+ public static void glNamedBufferData(int buffer, ShortBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
+ public static void glNamedBufferData(int buffer, IntBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
+ public static void glNamedBufferData(int buffer, LongBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
+ public static void glNamedBufferData(int buffer, DoubleBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
+ public static void glNamedBufferData(int buffer, short[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferData(buffer, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferData(int buffer, int[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferData(buffer, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferData(int buffer, long[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferData(buffer, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferData(int buffer, float[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferData(buffer, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferData(int buffer, double[] data, int usage) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferData(buffer, copy, usage);
+ MemoryUtilities.memFree(copy);
+ }
+
+ public static void glNamedBufferSubData(int buffer, long offset, ByteBuffer data) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferSubData(buffer, offset, data); }
+ public static void glNamedBufferSubData(int buffer, long offset, ShortBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glNamedBufferSubData(int buffer, long offset, IntBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glNamedBufferSubData(int buffer, long offset, LongBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glNamedBufferSubData(int buffer, long offset, FloatBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glNamedBufferSubData(int buffer, long offset, DoubleBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
+ public static void glNamedBufferSubData(int buffer, long offset, short[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferSubData(buffer, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferSubData(int buffer, long offset, int[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferSubData(buffer, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferSubData(int buffer, long offset, long[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferSubData(buffer, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferSubData(int buffer, long offset, float[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferSubData(buffer, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+ public static void glNamedBufferSubData(int buffer, long offset, double[] data) {
+ final ByteBuffer copy = copyOf(data);
+ glNamedBufferSubData(buffer, offset, copy);
+ MemoryUtilities.memFree(copy);
+ }
+
+ public static void glClearBufferSubData(int target, int internalFormat, long offset, long size, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferSubData(target, internalFormat, offset, size, format, type, data); }
+ public static void glClearBufferData(int target, int internalformat, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferData(target, internalformat, format, type, data); }
+ public static boolean glIsBuffer(int buffer) { rejectExitCapture(); return RENDER_BACKEND.isBuffer(buffer); }
+ public static void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset, long size) { onBufferRespec(writeTarget); RENDER_BACKEND.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); }
+
+ private static int checkedSize(long size) {
+ if (size < 0 || size > Integer.MAX_VALUE) {
+ throw new IllegalArgumentException("Buffer range does not fit a ByteBuffer wrapper: " + size);
+ }
+ return (int) size;
+ }
+
+ private static ByteBuffer copyOf(short[] data) {
+ final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 1);
+ bb.asShortBuffer().put(data);
+ return bb;
+ }
+
+ private static ByteBuffer copyOf(int[] data) {
+ final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2);
+ bb.asIntBuffer().put(data);
+ return bb;
+ }
+
+ private static ByteBuffer copyOf(long[] data) {
+ final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3);
+ bb.asLongBuffer().put(data);
+ return bb;
+ }
+
+ private static ByteBuffer copyOf(float[] data) {
+ final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2);
+ bb.asFloatBuffer().put(data);
+ return bb;
+ }
+
+ private static ByteBuffer copyOf(double[] data) {
+ final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3);
+ bb.asDoubleBuffer().put(data);
+ return bb;
+ }
+
+ public static void glBindBufferBase(int target, int index, int buffer) {
+ rejectExitCapture();
+ final boolean locked = acquireDrawLock();
+ try {
+ final GLContextState glCtx = ctx();
+ trackBufferBinding(glCtx, target, buffer);
+ trackIndexedBufferBinding(glCtx, target, index, buffer);
+ RENDER_BACKEND.bindBufferBase(target, index, buffer);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) {
+ rejectExitCapture();
+ final boolean locked = acquireDrawLock();
+ try {
+ final GLContextState glCtx = ctx();
+ trackBufferBinding(glCtx, target, buffer);
+ trackIndexedBufferBinding(glCtx, target, index, buffer);
+ RENDER_BACKEND.bindBufferRange(target, index, buffer, offset, size);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static int[] indexedBufferBindings(GLContextState glCtx, int target, int index) {
+ if (index < 0 || index >= INDEXED_BUFFER_SLOTS) return null;
+ if (target == GL31.GL_UNIFORM_BUFFER) return glCtx.uniformBufferBindings;
+ if (target == GL43.GL_SHADER_STORAGE_BUFFER) return glCtx.storageBufferBindings;
+ return null;
+ }
+
+ private static void trackIndexedBufferBinding(GLContextState glCtx, int target, int index, int buffer) {
+ final int[] bindings = indexedBufferBindings(glCtx, target, index);
+ if (bindings != null) bindings[index] = buffer;
+ }
+
+ public static int getIndexedBufferBinding(int target, int index) {
+ if (isCachingEnabled()) {
+ final int[] bindings = indexedBufferBindings(ctx(), target, index);
+ if (bindings != null) return bindings[index];
+ }
+ return RENDER_BACKEND.getIndexedBufferBinding(target, index);
+ }
+ public static long nglMapBuffer(int target, int access) {
+ rejectExitCapture();
+ final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access);
+ if (buf != null) onBufferMap(target, access);
+ return buf == null ? 0L : MemoryUtilities.memAddress0(buf);
+ }
+
+ public static void glMemoryBarrier(int barriers) { rejectExitCapture(); RENDER_BACKEND.memoryBarrier(barriers); }
+
+ public static int getBoundVBO() {
+ return ctx().boundVBO;
+ }
+
+ public static int getBoundCopyReadBuffer() {
+ return ctx().boundCopyReadBuffer;
+ }
+
+ public static int getBoundCopyWriteBuffer() {
+ return ctx().boundCopyWriteBuffer;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java
new file mode 100644
index 000000000..f688ba546
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java
@@ -0,0 +1,524 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
+import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.hooks.GlintColorHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
+import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.Color4Stack;
+import com.gtnewhorizons.angelica.glsm.streaming.TessellatorEntityIds;
+import org.lwjgl.opengl.GL13;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isMainThread;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMCurrentAttribs {
+
+ private GLSMCurrentAttribs() {}
+
+ public static void setOverlayColor(float r, float g, float b, float a) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.OVERLAY_COLOR);
+ if (r == glCtx.overlayR && g == glCtx.overlayG && b == glCtx.overlayB && a == glCtx.overlayA) return;
+ glCtx.overlayR = r; glCtx.overlayG = g; glCtx.overlayB = b; glCtx.overlayA = a;
+ glCtx.fragmentGeneration++;
+ }
+
+ public static void setShaderColor(float r, float g, float b, float a) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.SHADER_COLOR);
+ if (r == glCtx.shaderColorR && g == glCtx.shaderColorG && b == glCtx.shaderColorB && a == glCtx.shaderColorA) return;
+ glCtx.shaderColorR = r; glCtx.shaderColorG = g; glCtx.shaderColorB = b; glCtx.shaderColorA = a;
+ if (GLSMHooks.SHADER_COLOR_CHANGE.hasListeners()) {
+ GLSMHooks.shaderColorChangeEvent.red = r;
+ GLSMHooks.shaderColorChangeEvent.green = g;
+ GLSMHooks.shaderColorChangeEvent.blue = b;
+ GLSMHooks.shaderColorChangeEvent.alpha = a;
+ GLSMHooks.SHADER_COLOR_CHANGE.post(GLSMHooks.shaderColorChangeEvent);
+ }
+ }
+
+
+ public static boolean consumeUnit23TexCoordSetDuringDraw(GLContextState glCtx) {
+ boolean v = glCtx.unit23TexCoordSetDuringDraw;
+ glCtx.unit23TexCoordSetDuringDraw = false;
+ return v;
+ }
+
+ public static void forceAttribDefaultsDirty() {
+ final GLContextState glCtx = ctx();
+ glCtx.dirtyNormalAttrib = true;
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ // has* bits mark attribs the VBO already supplies; FFP supplies the rest via u_Current* uniforms.
+ // Skip the backend vertexAttrib call in either case
+ public static void flushDeferredVertexAttribs(GLContextState glCtx, boolean hasColor, boolean hasNormal, boolean hasTexCoord, boolean hasLightmap) {
+ final ShaderManager sm = glCtx.ffp;
+ final boolean ffpWillHandle = sm.isActive() || (sm.isEnabled() && glCtx.activeProgram == 0);
+ if (!hasColor && glCtx.dirtyColorAttrib && !ffpWillHandle) {
+ RENDER_BACKEND.vertexAttrib4f(Usage.COLOR.getAttributeLocation(), glCtx.color.getRed(), glCtx.color.getGreen(), glCtx.color.getBlue(), glCtx.color.getAlpha());
+ glCtx.dirtyColorAttrib = false;
+ }
+ if (!hasNormal && glCtx.dirtyNormalAttrib && !ffpWillHandle) {
+ final var n = sm.currentNormal;
+ RENDER_BACKEND.vertexAttrib3f(Usage.NORMAL.getAttributeLocation(), n.x, n.y, n.z);
+ glCtx.dirtyNormalAttrib = false;
+ }
+ if (!hasTexCoord && glCtx.dirtyTexCoordAttrib && !ffpWillHandle) {
+ final var tc = sm.currentTexCoords[0];
+ RENDER_BACKEND.vertexAttrib4f(Usage.PRIMARY_UV.getAttributeLocation(), tc.x, tc.y, tc.z, tc.w);
+ glCtx.dirtyTexCoordAttrib = false;
+ }
+ if (!hasLightmap && glCtx.dirtyLightmapAttrib && !ffpWillHandle) {
+ RENDER_BACKEND.vertexAttrib4f(Usage.SECONDARY_UV.getAttributeLocation(), glCtx.lastBrightnessX, glCtx.lastBrightnessY, 0.0f, 1.0f);
+ glCtx.dirtyLightmapAttrib = false;
+ }
+ }
+
+ public static void setEntityIds(int entity, int blockEntity, int item) {
+ rejectExitCapture();
+ if (!isMainThread()) return;
+ final GLContextState glCtx = ctx();
+ final long ids = InstancedAttribs.packEntityInfo(entity, blockEntity, item);
+ if (ids == glCtx.entityIds) return;
+ TessellatorEntityIds.onIdsChanged(glCtx.entityIds, ids);
+ glCtx.entityIds = ids;
+ glCtx.dirtyEntityIdsAttrib = true;
+ }
+
+ public static void flushEntityIds(GLContextState glCtx) {
+ if (!glCtx.dirtyEntityIdsAttrib || glCtx.activeProgram == 0) return;
+ final ImmediateExtendedAttribHandler handler = GLSMHooks.immediateExtendedHandler;
+ if (handler == null || !handler.wantsEntityIds()) return;
+ final long ids = glCtx.entityIds;
+ RENDER_BACKEND.vertexAttrib4f(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS,
+ InstancedAttribs.normalizedId(ids, 0), InstancedAttribs.normalizedId(ids, 16), InstancedAttribs.normalizedId(ids, 32), 0.0f);
+ glCtx.dirtyEntityIdsAttrib = false;
+ }
+
+ public static void glNormal3b(byte nx, byte ny, byte nz) {
+ final float fnx = b2f(nx), fny = b2f(ny), fnz = b2f(nz);
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setNormal(fnx, fny, fnz);
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setNormal(fnx, fny, fnz);
+ return;
+ }
+ glCtx.dirtyNormalAttrib = true;
+ }
+
+ public static void glNormal3d(double nx, double ny, double nz) {
+ final float fnx = (float) nx, fny = (float) ny, fnz = (float) nz;
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setNormal(fnx, fny, fnz);
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setNormal(fnx, fny, fnz);
+ return;
+ }
+ glCtx.dirtyNormalAttrib = true;
+ }
+
+ public static void glNormal3f(float nx, float ny, float nz) {
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setNormal(nx, ny, nz);
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setNormal(nx, ny, nz);
+ return;
+ }
+ glCtx.dirtyNormalAttrib = true;
+ }
+
+ public static void glNormal3i(int nx, int ny, int nz) {
+ final float fnx = nx / 2147483647.0f, fny = ny / 2147483647.0f, fnz = nz / 2147483647.0f;
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setNormal(fnx, fny, fnz);
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setNormal(fnx, fny, fnz);
+ return;
+ }
+ glCtx.dirtyNormalAttrib = true;
+ }
+
+ public static void glEdgeFlag(boolean flag) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStateCommand(() -> glEdgeFlag(flag));
+ if (mode == RecordMode.COMPILE) return;
+ }
+ ctx().edgeFlagState.setEnabled(flag);
+ }
+
+ public static void glColor4f(float red, float green, float blue, float alpha) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor(red, green, blue, alpha);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor(red, green, blue, alpha);
+ }
+
+ public static void glColor4d(double red, double green, double blue, double alpha) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor((float) red, (float) green, (float) blue, (float) alpha);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor((float) red, (float) green, (float) blue, (float) alpha);
+ }
+
+ public static void glColor4b(byte red, byte green, byte blue, byte alpha) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), b2f(alpha));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor(b2f(red), b2f(green), b2f(blue), b2f(alpha));
+ }
+
+ public static void glColor4ub(byte red, byte green, byte blue, byte alpha) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha));
+ }
+
+ public static void glColor3f(float red, float green, float blue) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor(red, green, blue, 1.0F);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor(red, green, blue, 1.0F);
+ }
+
+ public static void glColor3d(double red, double green, double blue) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor((float) red, (float) green, (float) blue, 1.0F);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor((float) red, (float) green, (float) blue, 1.0F);
+ }
+
+ public static void glColor3b(byte red, byte green, byte blue) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), 1.0F);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor(b2f(red), b2f(green), b2f(blue), 1.0F);
+ }
+
+ public static void glColor3ub(byte red, byte green, byte blue) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F);
+ }
+
+ private static float ub2f(byte b) {
+ return (b & 0xFF) / 255.0F;
+ }
+
+ private static float b2f(byte b) {
+ return ((b - Byte.MIN_VALUE) & 0xFF) / 255.0F;
+ }
+
+ private static boolean changeColor(float red, float green, float blue, float alpha) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.COLOR);
+ // Helper function for glColor*
+ final boolean caching = isCachingEnabled();
+ if (!caching || red != glCtx.color.getRed() || green != glCtx.color.getGreen() || blue != glCtx.color.getBlue() || alpha != glCtx.color.getAlpha()) {
+ mod(glCtx.color);
+ glCtx.color.setRed(red);
+ glCtx.color.setGreen(green);
+ glCtx.color.setBlue(blue);
+ glCtx.color.setAlpha(alpha);
+ glCtx.colorGeneration++;
+ if (ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setColor(red, green, blue, alpha);
+ }
+ glCtx.dirtyColorAttrib = true;
+ // Only set while an enchantment-glint span is active
+ final GlintColorHandler glintHandler = GLSMHooks.glintColorHandler;
+ if (glintHandler != null) {
+ glintHandler.onColorChanged(red, green, blue, alpha);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public static void glSecondaryColor3f(float red, float green, float blue) {
+ rejectExitCapture();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordSecondaryColor(red, green, blue);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ changeSecondaryColor(red, green, blue);
+ }
+
+ public static void glSecondaryColor3d(double red, double green, double blue) {
+ glSecondaryColor3f((float) red, (float) green, (float) blue);
+ }
+
+ public static void glSecondaryColor3b(byte red, byte green, byte blue) {
+ glSecondaryColor3f(b2f(red), b2f(green), b2f(blue));
+ }
+
+ public static void glSecondaryColor3ub(byte red, byte green, byte blue) {
+ glSecondaryColor3f(ub2f(red), ub2f(green), ub2f(blue));
+ }
+
+ /** Helper for glSecondaryColor* - the color sum is emulated by the FFP shaders, nothing is sent to the driver. */
+ private static void changeSecondaryColor(float red, float green, float blue) {
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled() || red != glCtx.secondaryColor.getRed() || green != glCtx.secondaryColor.getGreen() || blue != glCtx.secondaryColor.getBlue()) {
+ if (glCtx.colorSumState.isEnabled()) beforeUncapturedStateChange();
+ mod(glCtx.secondaryColor);
+ glCtx.secondaryColor.setRed(red);
+ glCtx.secondaryColor.setGreen(green);
+ glCtx.secondaryColor.setBlue(blue);
+ glCtx.fragmentGeneration++;
+ }
+ }
+
+ public static void glTexCoord1f(float s) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord(s, 0.0f);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord(s, 0.0f, 0.0f, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord1d(double s) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord((float) s, 0.0f);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord((float) s, 0.0f, 0.0f, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord2f(float s, float t) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord(s, t);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord2d(double s, double t) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord((float) s, (float) t);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord((float) s, (float) t, 0.0f, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord3f(float s, float t, float r) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord(s, t); // Only track s,t for 2D textures
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord(s, t, r, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord3d(double s, double t, double r) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord((float) s, (float) t);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord4f(float s, float t, float r, float q) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord(s, t);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord(s, t, r, q);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glTexCoord4d(double s, double t, double r, double q) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord((float) s, (float) t);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, (float) q);
+ glCtx.dirtyTexCoordAttrib = true;
+ }
+
+ public static void glVertexAttrib2f(int index, float v0, float v1) {
+ glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f);
+ }
+
+ public static void glVertexAttrib2s(int index, short v0, short v1) {
+ glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f);
+ }
+
+ public static void glVertexAttrib3f(int index, float v0, float v1, float v2) {
+ glVertexAttrib4f(index, v0, v1, v2, 1.0f);
+ }
+
+ public static void glVertexAttrib4f(int index, float v0, float v1, float v2, float v3) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordVertexAttrib(index, v0, v1, v2, v3);
+ if (mode == RecordMode.COMPILE) return;
+ }
+ beforeUncapturedStateChange();
+ RENDER_BACKEND.vertexAttrib4f(index, v0, v1, v2, v3);
+ }
+
+ public static void glMultiTexCoord2f(int target, float s, float t) {
+ final GLContextState glCtx = ctx();
+ if (target == GL13.GL_TEXTURE0) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setTexCoord(s, t);
+ return;
+ }
+ glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f);
+ glCtx.dirtyTexCoordAttrib = true;
+ } else if (target == GL13.GL_TEXTURE1) {
+ if (ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setLightmapCoord(s, t);
+ return;
+ }
+ setLightmapTextureCoords(target, s, t);
+ } else {
+ final int unit = target - GL13.GL_TEXTURE0;
+ if (unit >= 2 && unit < 4) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ glCtx.unit23TexCoordSetDuringDraw = true;
+ }
+ beforeUncapturedStateChange();
+ glCtx.ffp.setTexCoord(unit, s, t, 0.0f, 1.0f);
+ } else {
+ glCtx.exitCapture.reject();
+ }
+ }
+ }
+
+ public static void glMultiTexCoord2d(int target, double s, double t) {
+ glMultiTexCoord2f(target, (float) s, (float) t);
+ }
+
+ public static void glMultiTexCoord2s(int target, short s, short t) {
+ glMultiTexCoord2f(target, s, t);
+ }
+
+ public static void setLightmapTextureCoords(int unit, float x, float y) {
+ if (unit != GL13.GL_TEXTURE1) {
+ rejectExitCapture();
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.LIGHTMAP);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStateCommand(() -> setLightmapTextureCoords(unit, x, y));
+ if (mode == RecordMode.COMPILE) return;
+ }
+ glCtx.lastBrightnessX = x;
+ glCtx.lastBrightnessY = y;
+ glCtx.dirtyLightmapAttrib = true;
+ if (GLSMHooks.LIGHTMAP_COORDS.hasListeners()) {
+ GLSMHooks.lightmapCoordsEvent.x = x;
+ GLSMHooks.lightmapCoordsEvent.y = y;
+ GLSMHooks.LIGHTMAP_COORDS.post(GLSMHooks.lightmapCoordsEvent);
+ }
+ }
+
+ public static float getOverlayR() {
+ return ctx().overlayR;
+ }
+
+ public static float getOverlayG() {
+ return ctx().overlayG;
+ }
+
+ public static float getOverlayB() {
+ return ctx().overlayB;
+ }
+
+ public static float getOverlayA() {
+ return ctx().overlayA;
+ }
+
+ public static float getShaderColorR() {
+ return ctx().shaderColorR;
+ }
+
+ public static float getShaderColorG() {
+ return ctx().shaderColorG;
+ }
+
+ public static float getShaderColorB() {
+ return ctx().shaderColorB;
+ }
+
+ public static float getShaderColorA() {
+ return ctx().shaderColorA;
+ }
+
+ public static Color4Stack getColor() {
+ return ctx().color;
+ }
+
+ public static Color4Stack getSecondaryColor() {
+ return ctx().secondaryColor;
+ }
+
+ public static BooleanStateStack getColorSumState() {
+ return ctx().colorSumState;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java
new file mode 100644
index 000000000..20afa584a
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java
@@ -0,0 +1,427 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredAlphaHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.stacks.AlphaStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.DepthStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.StencilStateStack;
+import com.gtnewhorizons.angelica.glsm.states.AlphaState;
+import org.lwjgl.opengl.GL11;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMDepthStencilAlpha {
+
+ private GLSMDepthStencilAlpha() {}
+
+ public static boolean isEffectiveDepthMaskEnabled() {
+ return ctx().depthState.isEffectiveMaskEnabled();
+ }
+
+ public static boolean isEffectiveAlphaTestEnabled() {
+ return ctx().alphaTest.isEffectivelyEnabled();
+ }
+
+ public static AlphaState getEffectiveAlphaState(AlphaState out) {
+ return ctx().alphaState.readEffective(out);
+ }
+
+ public static void glDepthFunc(int func) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.DEPTH_FUNC);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDepthFunc(func);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || func != glCtx.depthState.getFunc()) {
+ mod(glCtx.depthState);
+ glCtx.depthState.setFunc(func);
+ RENDER_BACKEND.depthFunc(func);
+ }
+ }
+
+ public static void glDepthMask(boolean mask) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.writeDepthColor(ExitStateCapture.DEPTH_MASK);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDepthMask(mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
+ if (dch != null && dch.isDepthColorLocked()) {
+ mod(glCtx.depthState);
+ dch.deferDepthEnable(mask);
+ return;
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || mask != glCtx.depthState.isEnabled()) {
+ mod(glCtx.depthState);
+ glCtx.depthState.setEnabled(mask);
+ RENDER_BACKEND.depthMask(mask);
+ }
+ }
+
+ public static void glClearDepth(double depth) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordClearDepth(depth);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ depth = Math.min(1.0, Math.max(0.0, depth));
+ mod(glCtx.depthState);
+ if (isCachingEnabled()) glCtx.depthState.setClearValue(depth);
+ RENDER_BACKEND.clearDepth(depth);
+ }
+
+ public static void enableAlphaTest() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_ALPHA_TEST);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableAlphaTest(ctx());
+ }
+
+ static void enableAlphaTest(GLContextState glCtx) {
+ final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
+ if (ah != null && ah.isAlphaTestLocked()) {
+ glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1);
+ glCtx.alphaTest.beforeModify();
+ if (ah.deferAlphaTestToggle(true) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ return;
+ }
+ final boolean wasEnabled = glCtx.alphaTest.isEnabled();
+ glCtx.alphaTest.enable();
+ if (glCtx.alphaTest.isEnabled() != wasEnabled) {
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ }
+ }
+
+ public static void disableAlphaTest() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_ALPHA_TEST);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableAlphaTest(ctx());
+ }
+
+ static void disableAlphaTest(GLContextState glCtx) {
+ final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
+ if (ah != null && ah.isAlphaTestLocked()) {
+ glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1);
+ glCtx.alphaTest.beforeModify();
+ if (ah.deferAlphaTestToggle(false) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ return;
+ }
+ final boolean wasEnabled = glCtx.alphaTest.isEnabled();
+ glCtx.alphaTest.disable();
+ if (glCtx.alphaTest.isEnabled() != wasEnabled) {
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ }
+ }
+
+ public static void glAlphaFunc(int function, float reference) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.writeAlpha();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordAlphaFunc(function, reference);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
+ if (ah != null && ah.isAlphaTestLocked()) {
+ mod(glCtx.alphaState);
+ if (ah.deferAlphaFunc(function, reference) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ return;
+ }
+ if (isCachingEnabled()
+ && (function != glCtx.alphaState.getFunction() || Float.compare(reference, glCtx.alphaState.getReference()) != 0)) {
+ mod(glCtx.alphaState);
+ glCtx.alphaState.setFunction(function);
+ glCtx.alphaState.setReference(reference);
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
+ }
+ }
+ }
+
+ public static void enableDepthTest() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_DEPTH_TEST);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableDepthTest(ctx());
+ }
+
+ static void enableDepthTest(GLContextState glCtx) {
+ glCtx.depthTest.enable();
+ }
+
+ public static void disableDepthTest() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_DEPTH_TEST);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableDepthTest(ctx());
+ }
+
+ static void disableDepthTest(GLContextState glCtx) {
+ glCtx.depthTest.disable();
+ }
+
+ public static void glDepthRange(double near, double far) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled() || glCtx.viewportState.depthRangeNear != near || glCtx.viewportState.depthRangeFar != far) beforeUncapturedStateChange();
+ if (isCachingEnabled()) mod(glCtx.viewportState).setDepthRange(near, far);
+ RENDER_BACKEND.depthRange(near, far);
+ }
+
+ public static void glStencilFunc(int func, int ref, int mask) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStencilFunc(func, ref, mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final int clampedMask = mask & glCtx.stencilBitMask;
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask) {
+ beforeUncapturedStateChange();
+ mod(glCtx.stencilState).setFunc(func, ref, clampedMask);
+ RENDER_BACKEND.stencilFunc(func, ref, clampedMask);
+ }
+ }
+
+ public static void glStencilMask(int mask) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStencilMask(mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final int clampedMask = mask & glCtx.stencilBitMask;
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.stencilState.getWriteMaskFront() != clampedMask) {
+ beforeUncapturedStateChange();
+ mod(glCtx.stencilState).setWriteMask(clampedMask);
+ RENDER_BACKEND.stencilMask(clampedMask);
+ }
+ }
+
+ public static void glStencilOp(int fail, int zfail, int zpass) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStencilOp(fail, zfail, zpass);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.stencilState.getFailOpFront() != fail || glCtx.stencilState.getZFailOpFront() != zfail || glCtx.stencilState.getZPassOpFront() != zpass) {
+ beforeUncapturedStateChange();
+ mod(glCtx.stencilState).setOp(fail, zfail, zpass);
+ RENDER_BACKEND.stencilOp(fail, zfail, zpass);
+ }
+ }
+
+ public static void glClearStencil(int s) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordClearStencil(s);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.stencilState.getClearValue() != s) {
+ mod(glCtx.stencilState).setClearValue(s);
+ RENDER_BACKEND.clearStencil(s);
+ }
+ }
+
+ public static void glStencilFuncSeparate(int face, int func, int ref, int mask) {
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStencilFuncSeparate(face, func, ref, mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ final int clampedMask = mask & glCtx.stencilBitMask;
+ final boolean caching = isCachingEnabled();
+ boolean needsUpdate = !caching;
+ if (!needsUpdate) {
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ needsUpdate = glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask;
+ }
+ if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) {
+ needsUpdate = glCtx.stencilState.getFuncBack() != func || glCtx.stencilState.getRefBack() != ref || glCtx.stencilState.getValueMaskBack() != clampedMask;
+ }
+ }
+ if (needsUpdate) {
+ mod(glCtx.stencilState);
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ glCtx.stencilState.setFuncFront(func);
+ glCtx.stencilState.setRefFront(ref);
+ glCtx.stencilState.setValueMaskFront(clampedMask);
+ }
+ if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
+ glCtx.stencilState.setFuncBack(func);
+ glCtx.stencilState.setRefBack(ref);
+ glCtx.stencilState.setValueMaskBack(clampedMask);
+ }
+ RENDER_BACKEND.stencilFuncSeparate(face, func, ref, clampedMask);
+ }
+ }
+
+ public static void glStencilMaskSeparate(int face, int mask) {
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStencilMaskSeparate(face, mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ final int clampedMask = mask & glCtx.stencilBitMask;
+ final boolean caching = isCachingEnabled();
+ boolean needsUpdate = !caching;
+ if (!needsUpdate) {
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ needsUpdate = glCtx.stencilState.getWriteMaskFront() != clampedMask;
+ }
+ if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) {
+ needsUpdate = glCtx.stencilState.getWriteMaskBack() != clampedMask;
+ }
+ }
+ if (needsUpdate) {
+ mod(glCtx.stencilState);
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ glCtx.stencilState.setWriteMaskFront(clampedMask);
+ }
+ if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
+ glCtx.stencilState.setWriteMaskBack(clampedMask);
+ }
+ RENDER_BACKEND.stencilMaskSeparate(face, clampedMask);
+ }
+ }
+
+ public static void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) {
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordStencilOpSeparate(face, sfail, dpfail, dppass);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ final boolean caching = isCachingEnabled();
+ boolean needsUpdate = !caching;
+ if (!needsUpdate) {
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ needsUpdate = glCtx.stencilState.getFailOpFront() != sfail || glCtx.stencilState.getZFailOpFront() != dpfail || glCtx.stencilState.getZPassOpFront() != dppass;
+ }
+ if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) {
+ needsUpdate = glCtx.stencilState.getFailOpBack() != sfail || glCtx.stencilState.getZFailOpBack() != dpfail || glCtx.stencilState.getZPassOpBack() != dppass;
+ }
+ }
+ if (needsUpdate) {
+ mod(glCtx.stencilState);
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ glCtx.stencilState.setFailOpFront(sfail);
+ glCtx.stencilState.setZFailOpFront(dpfail);
+ glCtx.stencilState.setZPassOpFront(dppass);
+ }
+ if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
+ glCtx.stencilState.setFailOpBack(sfail);
+ glCtx.stencilState.setZFailOpBack(dpfail);
+ glCtx.stencilState.setZPassOpBack(dppass);
+ }
+ RENDER_BACKEND.stencilOpSeparate(face, sfail, dpfail, dppass);
+ }
+ }
+
+ public static DepthStateStack getDepthState() {
+ return ctx().depthState;
+ }
+
+ public static BooleanStateStack getDepthTest() {
+ return ctx().depthTest;
+ }
+
+ public static AlphaStateStack getAlphaState() {
+ return ctx().alphaState;
+ }
+
+ public static BooleanStateStack getAlphaTest() {
+ return ctx().alphaTest;
+ }
+
+ public static BooleanStateStack getStencilTest() {
+ return ctx().stencilTest;
+ }
+
+ public static StencilStateStack getStencilState() {
+ return ctx().stencilState;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java
new file mode 100644
index 000000000..721dd5f0a
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java
@@ -0,0 +1,713 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
+import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.backend.GLDebugMessageListener;
+import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
+import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
+import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder;
+import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList;
+import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder;
+import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawCapture;
+import com.gtnewhorizons.angelica.glsm.streaming.LineQuads;
+import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL32;
+import org.lwjgl.opengl.KHRDebugCallback;
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.ShortBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.guardUnsupportedFFP;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMDraws {
+
+ private GLSMDraws() {}
+
+ public static long drawCalls;
+
+ /**
+ * Check if a display list exists (has been compiled and stored). Delegates to DisplayListManager.
+ *
+ * @param list The display list ID to check
+ * @return true if the display list exists, false otherwise
+ */
+ public static boolean displayListExists(int list) {
+ return DisplayListManager.displayListExists(list);
+ }
+
+ private static final String PIXELTRANSFER_MSG = "glPixelTransfer is not available in GL 3.3 core profile.";
+
+ public static void glPixelTransferf(int pname, float param) {
+ guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG);
+ }
+
+ public static void glPixelTransferi(int pname, int param) {
+ guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG);
+ }
+
+ private static final String RASTERPOS_MSG = "glRasterPos is not available in GL 3.3 core profile.";
+
+ public static void glRasterPos2f(float x, float y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos2d(double x, double y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos2i(int x, int y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos3f(float x, float y, float z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos3d(double x, double y, double z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos3i(int x, int y, int z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos4f(float x, float y, float z, float w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos4d(double x, double y, double z, double w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+ public static void glRasterPos4i(int x, int y, int z, int w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
+
+ public static void glBegin(int mode) {
+ rejectExitCapture();
+ ctx().unit23TexCoordSetDuringDraw = false;
+ if (DisplayListManager.isRecording()) {
+ ImmediateModeRecorder.begin(mode);
+ return;
+ }
+ ImmediateModeRecorder.beginLive(mode);
+ }
+
+ public static void glEnd() {
+ rejectExitCapture();
+ final DirectTessellator result = ImmediateModeRecorder.end();
+ if (result != null) {
+ if (DisplayListManager.isRecording()) {
+ if (DisplayListManager.isCompileAndExecute() && initConfig != null && initConfig.getDirectDrawer() != null) {
+ final CommandRecorder recorder = DisplayListManager.pauseRecording();
+ initConfig.getDirectDrawer().accept(result);
+ DisplayListManager.resumeRecording(recorder);
+ }
+ DisplayListManager.addImmediateModeDraw(result);
+ return;
+ }
+ if (initConfig != null && initConfig.getDirectDrawer() != null) {
+ initConfig.getDirectDrawer().accept(result);
+ }
+ }
+ }
+
+ public static void glVertex2f(float x, float y) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.vertex(x, y, 0.0f);
+ }
+ }
+
+ public static void glVertex2i(int x, int y) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f);
+ }
+ }
+
+ public static void glVertex2d(double x, double y) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f);
+ }
+ }
+
+ public static void glVertex3f(float x, float y, float z) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.vertex(x, y, z);
+ }
+ }
+
+ public static void glVertex3d(double x, double y, double z) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.vertex((float) x, (float) y, (float) z);
+ }
+ }
+
+ public static void glVertex3i(int x, int y, int z) {
+ if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.vertex((float) x, (float) y, (float) z);
+ }
+ }
+
+ public static void preDraw(GLContextState glCtx, int drawMode) {
+ prepareLineEmulation(glCtx, drawMode);
+ glCtx.ffp.preDraw(glCtx);
+ GLSMVertexInput.prepareClientArrays(glCtx);
+ }
+
+ public static void glDrawElements(int mode, ByteBuffer indices) {
+ rejectExitCapture();
+ drawCalls++;
+ CommandRecorder savedRecorder = null;
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices), indices.remaining());
+ if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
+ if (recordMode == RecordMode.COMPILE) return;
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
+ FeedbackManager.processDrawElements(mode, indices);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadElementsAsTriangles(glCtx, indices.remaining(), GL11.GL_UNSIGNED_BYTE, indices);
+ return;
+ }
+ if (widensLineDraw(mode, indices.remaining())) {
+ drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices)));
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawElements(mode, indices);
+ } finally {
+ if (locked) releaseDrawLock();
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
+ }
+ }
+
+ public static void glDrawElements(int mode, IntBuffer indices) {
+ rejectExitCapture();
+ drawCalls++;
+ CommandRecorder savedRecorder = null;
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 2);
+ if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
+ if (recordMode == RecordMode.COMPILE) return;
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
+ FeedbackManager.processDrawElements(mode, indices);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadElementsAsTriangles(glCtx, indices);
+ return;
+ }
+ if (widensLineDraw(mode, indices.remaining())) {
+ drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices)));
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawElements(mode, indices);
+ } finally {
+ if (locked) releaseDrawLock();
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
+ }
+ }
+
+ public static void glDrawElements(int mode, ShortBuffer indices) {
+ rejectExitCapture();
+ drawCalls++;
+ CommandRecorder savedRecorder = null;
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 1);
+ if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
+ if (recordMode == RecordMode.COMPILE) return;
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
+ FeedbackManager.processDrawElements(mode, indices);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadElementsAsTriangles(glCtx, indices);
+ return;
+ }
+ if (widensLineDraw(mode, indices.remaining())) {
+ drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices)));
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawElements(mode, indices);
+ } finally {
+ if (locked) releaseDrawLock();
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
+ }
+ }
+
+ public static void glDrawElements(int mode, int count, int type, ByteBuffer indices) {
+ rejectExitCapture();
+ drawCalls++;
+ CommandRecorder savedRecorder = null;
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, count, type, MemoryUtilities.memAddress(indices), indices.remaining());
+ if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
+ if (recordMode == RecordMode.COMPILE) return;
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
+ FeedbackManager.processDrawElements(mode, count, type, indices);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadElementsAsTriangles(glCtx, count, type, indices);
+ return;
+ }
+ if (widensLineDraw(mode, count)) {
+ drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress(indices)));
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawElements(mode, count, type, indices);
+ } finally {
+ if (locked) releaseDrawLock();
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
+ }
+ }
+
+ public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ drawCalls++;
+ CommandRecorder savedRecorder = null;
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ // Core profile: a default VAO is generated at init and glBindVertexArray(0)
+ // is redirected to it, so a VAO is always bound here -- no fallback branches.
+ final IndexedDrawCapture capture = IndexedDrawCapture.create(mode, indices_count, type, indices_buffer_offset, glCtx.vaos.boundEBO);
+ if (capture != null) {
+ DisplayListManager.recordIndexedDrawCapture(capture);
+ }
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
+ FeedbackManager.processDrawElements(mode, indices_count, type, indices_buffer_offset);
+ return;
+ }
+ final boolean locked = acquireDrawLock();
+ try {
+ if (widensLineDraw(mode, indices_count)) {
+ drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, indices_count, type, indices_buffer_offset));
+ return;
+ }
+ final boolean ffpExt = FfpExtendedAttribs.maybeBindIndexed(glCtx, mode, indices_count, type, indices_buffer_offset);
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadElementsAsTriangles(glCtx, indices_count, type, indices_buffer_offset);
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawElements(mode, indices_count, type, indices_buffer_offset);
+ } finally {
+ if (ffpExt) FfpExtendedAttribs.unbind();
+ }
+ } finally {
+ if (locked) releaseDrawLock();
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
+ }
+ }
+
+ public static void glMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) {
+ rejectExitCapture();
+ drawCalls += drawcount;
+ RENDER_BACKEND.multiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+ }
+
+ public static void glMultiDrawElementsBaseVertex(int mode, long pCount, int type, long pIndices, int drawcount, long pBaseVertex) {
+ rejectExitCapture();
+ drawCalls += drawcount;
+ RENDER_BACKEND.multiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex);
+ }
+
+ public static void glDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) {
+ rejectExitCapture();
+ drawCalls++;
+ RENDER_BACKEND.drawElementsBaseVertex(mode, count, type, indices, basevertex);
+ }
+
+ public static void glDrawElementsInstanced(int mode, int count, int type, long indices, int primcount) {
+ rejectExitCapture();
+ drawCalls++;
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadElementsAsTrianglesInstanced(glCtx, count, type, indices, primcount);
+ return;
+ }
+ warnIfInstancedWideLines(mode);
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawElementsInstanced(mode, count, type, indices, primcount);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) {
+ rejectExitCapture();
+ drawCalls++;
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadsAsTrianglesInstanced(glCtx, first, count, primcount);
+ } else if (mode == GL11.GL_QUAD_STRIP) {
+ preDraw(glCtx, GL11.GL_TRIANGLES);
+ RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_STRIP, first, count & ~1, primcount);
+ } else if (mode == GL11.GL_POLYGON) {
+ preDraw(glCtx, GL11.GL_TRIANGLES);
+ RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_FAN, first, count, primcount);
+ } else {
+ warnIfInstancedWideLines(mode);
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawArraysInstanced(mode, first, count, primcount);
+ }
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (widensLineDraw(mode, count)) {
+ drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, count, type, indices));
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawRangeElements(mode, start, end, count, type, indices);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int baseVertex) {
+ rejectExitCapture();
+ RENDER_BACKEND.drawRangeElementsBaseVertex(mode, start, end, count, type, indices, baseVertex);
+ }
+
+ public static void glMultiDrawArrays(int mode, IntBuffer firsts, IntBuffer counts) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) {
+ for (int i = firsts.position(); i < firsts.limit(); i++) {
+ final int count = counts.get(counts.position() + i - firsts.position());
+ if (LineQuads.segmentCount(mode, count) == 0) continue;
+ drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, firsts.get(i), count));
+ }
+ return;
+ }
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.multiDrawArrays(mode, firsts, counts);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glPrimitiveRestartIndex(int index) {
+ rejectExitCapture();
+ RENDER_BACKEND.primitiveRestartIndex(index);
+ }
+
+ public static void glDrawArrays(int mode, int first, int count) {
+ rejectExitCapture();
+ drawCalls++;
+ CommandRecorder savedRecorder = null;
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ final DirectTessellator result = ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count);
+ if (result != null) {
+ DisplayListManager.addImmediateModeDraw(result);
+ }
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ DisplayListManager.flushAll();
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
+ FeedbackManager.processDrawArrays(mode, first, count);
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ if (widensLineDraw(mode, count)) {
+ drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count));
+ return;
+ }
+ final boolean ffpExt = FfpExtendedAttribs.maybeBind(glCtx, mode, first, count);
+ try {
+ if (mode == GL11.GL_QUADS) {
+ QuadConverter.drawQuadsAsTriangles(glCtx, first, count);
+ } else if (mode == GL11.GL_QUAD_STRIP) {
+ preDraw(glCtx, GL11.GL_TRIANGLES);
+ RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_STRIP, first, count & ~1);
+ } else if (mode == GL11.GL_POLYGON) {
+ preDraw(glCtx, GL11.GL_TRIANGLES);
+ RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_FAN, first, count);
+ } else {
+ preDraw(glCtx, mode);
+ RENDER_BACKEND.drawArrays(mode, first, count);
+ }
+ } finally {
+ if (ffpExt) FfpExtendedAttribs.unbind();
+ }
+ } finally {
+ if (locked) releaseDrawLock();
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
+ }
+ }
+
+ public static void glNewList(int list, int mode) {
+ rejectExitCapture();
+ DisplayListManager.glNewList(list, mode);
+ }
+
+ public static void glEndList() {
+ rejectExitCapture();
+ DisplayListManager.glEndList();
+ }
+
+ private static final DisplayListIDAllocator displayListIdAllocator = new DisplayListIDAllocator();
+
+ public static int glGenLists(int range) {
+ rejectExitCapture();
+ return displayListIdAllocator.allocRange(range);
+ }
+
+ public static boolean glIsList(int list) {
+ rejectExitCapture();
+ return displayListIdAllocator.isAllocated(list);
+ }
+
+ /**
+ * Delete display lists and free their VBO resources.
+ */
+ public static void glDeleteLists(int list, int range) {
+ rejectExitCapture();
+ final boolean locked = acquireDrawLock();
+ try {
+ synchronized (displayListIdAllocator) {
+ DisplayListManager.glDeleteLists(list, range);
+ displayListIdAllocator.freeRange(list, range);
+ }
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ /**
+ * Get a compiled display list from the cache. Used for executing nested display lists.
+ *
+ * @param list The display list ID
+ * @return The CompiledDisplayList, or null if not found
+ */
+ public static CompiledDisplayList getDisplayList(int list) {
+ return DisplayListManager.getDisplayList(list);
+ }
+
+ public static void glCallList(int list) {
+ rejectExitCapture();
+ if (!GLDebug.isActive()) {
+ DisplayListManager.glCallList(list);
+ return;
+ }
+ GLDebug.pushGroup("glCallList ", list);
+ try {
+ DisplayListManager.glCallList(list);
+ } finally {
+ GLDebug.popGroup();
+ }
+ }
+
+ public static int getListMode() {
+ return DisplayListManager.getListMode();
+ }
+
+ public static boolean ffpWidensLineQuads() {
+ final GLContextState glCtx = ctx();
+ return GLSMRasterizer.wideLineEmulationEnabled && glCtx.activeProgram == 0 && glCtx.lineState.getWidth() > 1.0f
+ && !DisplayListManager.isRecording();
+ }
+
+ private static boolean widensLineDraw(int mode, int count) {
+ return LineQuads.isLineMode(mode) && LineQuads.segmentCount(mode, count) > 0 && ffpWidensLineQuads();
+ }
+
+ private static void drawLinesAsQuads(GLContextState glCtx, DirectTessellator lines) {
+ if (lines == null) return;
+ if (readsBufferObject(glCtx.vaos)) {
+ warnOnce("line-readback", "Wide GL_LINES drawn from a buffer object; widening them reads the buffer back, which waits for the GPU");
+ }
+ final int vao = glCtx.boundVAO;
+ final int vbo = glCtx.boundVBO;
+ TessellatorStreamingDrawer.drawDirect(lines);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ }
+
+ private static DirectTessellator lineElementsFromBuffer(GLContextState glCtx, int mode, int count, int type, long offset) {
+ if (glCtx.vaos.boundEBO == 0) return null;
+ final ByteBuffer indices = MemoryUtilities.memAlloc(count * GLTypes.sizeBytes(type));
+ try {
+ GLSMBuffers.glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, offset, indices);
+ return ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress0(indices));
+ } finally {
+ MemoryUtilities.memFree(indices);
+ }
+ }
+
+ private static void warnIfInstancedWideLines(int mode) {
+ if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) {
+ warnOnce("instanced-wide-lines", "Instanced wide GL_LINES are not widened and draw 1 px wide");
+ }
+ }
+
+ private static boolean readsBufferObject(VAOManager vaos) {
+ for (int i = 0; i < VAOManager.MAX_ATTRIBS; i++) {
+ final VAOManager.Attrib attrib = vaos.attrib(i);
+ if (attrib != null && attrib.enabled && attrib.vboId != 0) return true;
+ }
+ return false;
+ }
+
+ private static void prepareLineEmulation(GLContextState glCtx, int drawMode) {
+ setLineStippleActive(glCtx, (LineQuads.isLineMode(drawMode) || glCtx.lineQuadsActive) && glCtx.lineStippleState.isEnabled());
+ }
+
+ private static void setLineStippleActive(GLContextState glCtx, boolean active) {
+ if (glCtx.lineStippleActive == active) return;
+ glCtx.lineStippleActive = active;
+ RENDER_BACKEND.provokingVertex(active ? GL32.GL_FIRST_VERTEX_CONVENTION : GL32.GL_LAST_VERTEX_CONVENTION);
+ }
+
+ public static void glFlush() {
+ rejectExitCapture();
+ RENDER_BACKEND.flush();
+ }
+
+ public static void glFinish() {
+ rejectExitCapture();
+ RENDER_BACKEND.finish();
+ }
+
+ public static void glMultiDrawArraysIndirectCount(int mode, long indirect, long drawcount, int maxdrawcount, int stride) {
+ rejectExitCapture();
+ RENDER_BACKEND.multiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);
+ }
+
+ public static void glMultiDrawElementsIndirectCount(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride) {
+ rejectExitCapture();
+ RENDER_BACKEND.multiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride);
+ }
+
+ public static void glCallLists(IntBuffer lists) {
+ while (lists.hasRemaining()) {
+ final int listId = lists.get() + ctx().listBase;
+ glCallList(listId);
+ }
+ }
+
+ public static void glCallLists(ShortBuffer lists) {
+ while (lists.hasRemaining()) {
+ final int listId = (lists.get() & 0xFFFF) + ctx().listBase;
+ glCallList(listId);
+ }
+ }
+
+ public static void glCallLists(ByteBuffer lists) {
+ while (lists.hasRemaining()) {
+ final int listId = (lists.get() & 0xFF) + ctx().listBase;
+ glCallList(listId);
+ }
+ }
+
+ public static void glListBase(int base) {
+ rejectExitCapture();
+ ctx().listBase = base;
+ }
+ public static void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int primcount, long basevertex) {
+ rejectExitCapture();
+ RENDER_BACKEND.multiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex);
+ }
+
+ public static void glObjectLabel(int identifier, int name, CharSequence label) { RENDER_BACKEND.objectLabel(identifier, name, label); }
+ public static String glGetObjectLabel(int identifier, int name, int bufSize) { rejectExitCapture(); return RENDER_BACKEND.getObjectLabel(identifier, name); }
+ public static void glPushDebugGroup(int source, int id, CharSequence message) { RENDER_BACKEND.pushDebugGroup(source, id, message); }
+ public static void glPopDebugGroup() { RENDER_BACKEND.popDebugGroup(); }
+ public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { RENDER_BACKEND.debugMessageInsert(source, type, id, severity, buf); }
+ public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { RENDER_BACKEND.debugMessageControl(source, type, severity, ids, enabled); }
+
+ public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog);
+ }
+
+ public static void registerDebugMessageListener(GLDebugMessageListener listener, long userParam) {
+ RENDER_BACKEND.debugMessageCallback(listener, userParam);
+ }
+
+ public static void glDebugMessageCallback(KHRDebugCallback callback) {
+ RENDER_BACKEND.debugMessageCallback(GLDebug.adaptDebugCallback(callback), 0L);
+ }
+
+ public static void glAccum(int op, float value) {
+ guardUnsupportedFFP("glAccum", "The accumulation buffer is not available in GL 3.3 core profile.");
+ }
+
+ public static void glFeedbackBuffer(int type, FloatBuffer buffer) {
+ rejectExitCapture();
+ FeedbackManager.glFeedbackBuffer(type, buffer);
+ }
+
+ public static int glRenderMode(int mode) {
+ rejectExitCapture();
+ return FeedbackManager.glRenderMode(mode);
+ }
+
+ public static void glPassThrough(float token) {
+ rejectExitCapture();
+ FeedbackManager.glPassThrough(token);
+ }
+
+ private static boolean selectWarned = false;
+
+ public static void glSelectBuffer(IntBuffer buffer) {
+ rejectExitCapture();
+ if (!selectWarned) {
+ LOGGER.warn("glSelectBuffer: selection mode not emulated");
+ selectWarned = true;
+ }
+ }
+
+ public static void glInitNames() { /* no-op: ignored outside GL_SELECT */ }
+
+ public static void glPushName(int name) { /* no-op */ }
+
+ public static void glPopName() { /* no-op */ }
+
+ public static void glLoadName(int name) { /* no-op */ }
+
+ /**
+ * Draw modes that rely on the previous vertex data cannot be merged currently.
+ * It is possible to merge them using Index Buffers, but currently unimplemented.
+ */
+ public static boolean isContinuousDraw(int drawMode) {
+ return drawMode == GL11.GL_TRIANGLE_STRIP || drawMode == GL11.GL_TRIANGLE_FAN
+ || drawMode == GL11.GL_LINE_STRIP || drawMode == GL11.GL_LINE_LOOP
+ || drawMode == GL11.GL_QUAD_STRIP || drawMode == GL11.GL_POLYGON;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java
new file mode 100644
index 000000000..6ecb0c3e1
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java
@@ -0,0 +1,302 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL30;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_CLIP_PLANES;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMEnable {
+
+ private GLSMEnable() {}
+
+ public static void glEnable(int cap) {
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(cap);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
+ if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
+ glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].enable();
+ glCtx.clipPlaneGeneration++;
+ return;
+ }
+
+ switch (cap) {
+ case GL11.GL_ALPHA_TEST -> GLSMDepthStencilAlpha.enableAlphaTest(glCtx);
+ case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.enable();
+ case GL11.GL_BLEND -> GLSMBlend.enableBlend(glCtx);
+ case GL11.GL_COLOR_MATERIAL -> GLSMLighting.enableColorMaterial(glCtx);
+ case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.enable();
+ case GL14.GL_COLOR_SUM -> glCtx.colorSumState.enable();
+ case GL11.GL_CULL_FACE -> GLSMRasterizer.enableCull(glCtx);
+ case GL11.GL_DEPTH_TEST -> GLSMDepthStencilAlpha.enableDepthTest(glCtx);
+ case GL11.GL_DITHER -> glCtx.ditherState.enable();
+ case GL11.GL_FOG -> GLSMFog.enableFog(glCtx);
+ case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.enable();
+ case GL11.GL_LIGHTING -> GLSMLighting.enableLighting(glCtx);
+ case GL11.GL_LIGHT0 -> GLSMLighting.enableLight(glCtx, 0);
+ case GL11.GL_LIGHT1 -> GLSMLighting.enableLight(glCtx, 1);
+ case GL11.GL_LIGHT2 -> GLSMLighting.enableLight(glCtx, 2);
+ case GL11.GL_LIGHT3 -> GLSMLighting.enableLight(glCtx, 3);
+ case GL11.GL_LIGHT4 -> GLSMLighting.enableLight(glCtx, 4);
+ case GL11.GL_LIGHT5 -> GLSMLighting.enableLight(glCtx, 5);
+ case GL11.GL_LIGHT6 -> GLSMLighting.enableLight(glCtx, 6);
+ case GL11.GL_LIGHT7 -> GLSMLighting.enableLight(glCtx, 7);
+ case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.enable();
+ case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.enable();
+ case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.enable();
+ case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.enable();
+ case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.enable();
+ case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.enable();
+ case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.enable();
+ case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.enable();
+ case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.enable();
+ case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.enable();
+ case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.enable();
+ case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.enable();
+ case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.enable();
+ case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.enable();
+ case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.enable();
+ case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.enable();
+ case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.enable();
+ case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.enable();
+ case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.enable();
+ case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.enable();
+ case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.enable();
+ case GL11.GL_NORMALIZE -> glCtx.normalizeState.enable();
+ case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.enable();
+ case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.enable();
+ case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.enable();
+ case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.enable();
+ case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.enable();
+ case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.enable();
+ case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.enable();
+ case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.enable();
+ case GL12.GL_RESCALE_NORMAL -> GLSMLighting.enableRescaleNormal(glCtx);
+ case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.enable();
+ case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.enable();
+ case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.enable();
+ case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.enable();
+ case GL11.GL_SCISSOR_TEST -> GLSMRasterizer.enableScissorTest(glCtx);
+ case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.enable();
+ case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).enable();
+ case GL11.GL_TEXTURE_2D -> GLSMTextures.enableTexture(glCtx);
+ case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).enable();
+ case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).enable();
+ case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).enable();
+ case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).enable();
+ case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).enable();
+ case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).enable();
+ default -> {
+ glCtx.exitCapture.reject();
+ if (!GLSMVertexInput.setClientArrayCap(glCtx, cap, true)) RENDER_BACKEND.enable(cap);
+ }
+ }
+ }
+
+ public static void glDisable(int cap) {
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(cap);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
+ if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
+ glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].disable();
+ glCtx.clipPlaneGeneration++;
+ return;
+ }
+
+ switch (cap) {
+ case GL11.GL_ALPHA_TEST -> GLSMDepthStencilAlpha.disableAlphaTest(glCtx);
+ case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.disable();
+ case GL11.GL_BLEND -> GLSMBlend.disableBlend(glCtx);
+ case GL11.GL_COLOR_MATERIAL -> GLSMLighting.disableColorMaterial(glCtx);
+ case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.disable();
+ case GL14.GL_COLOR_SUM -> glCtx.colorSumState.disable();
+ case GL11.GL_CULL_FACE -> GLSMRasterizer.disableCull(glCtx);
+ case GL11.GL_DEPTH_TEST -> GLSMDepthStencilAlpha.disableDepthTest(glCtx);
+ case GL11.GL_DITHER -> glCtx.ditherState.disable();
+ case GL11.GL_FOG -> GLSMFog.disableFog(glCtx);
+ case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.disable();
+ case GL11.GL_LIGHTING -> GLSMLighting.disableLighting(glCtx);
+ case GL11.GL_LIGHT0 -> GLSMLighting.disableLight(glCtx, 0);
+ case GL11.GL_LIGHT1 -> GLSMLighting.disableLight(glCtx, 1);
+ case GL11.GL_LIGHT2 -> GLSMLighting.disableLight(glCtx, 2);
+ case GL11.GL_LIGHT3 -> GLSMLighting.disableLight(glCtx, 3);
+ case GL11.GL_LIGHT4 -> GLSMLighting.disableLight(glCtx, 4);
+ case GL11.GL_LIGHT5 -> GLSMLighting.disableLight(glCtx, 5);
+ case GL11.GL_LIGHT6 -> GLSMLighting.disableLight(glCtx, 6);
+ case GL11.GL_LIGHT7 -> GLSMLighting.disableLight(glCtx, 7);
+ case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.disable();
+ case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.disable();
+ case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.disable();
+ case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.disable();
+ case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.disable();
+ case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.disable();
+ case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.disable();
+ case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.disable();
+ case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.disable();
+ case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.disable();
+ case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.disable();
+ case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.disable();
+ case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.disable();
+ case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.disable();
+ case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.disable();
+ case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.disable();
+ case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.disable();
+ case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.disable();
+ case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.disable();
+ case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.disable();
+ case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.disable();
+ case GL11.GL_NORMALIZE -> glCtx.normalizeState.disable();
+ case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.disable();
+ case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.disable();
+ case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.disable();
+ case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.disable();
+ case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.disable();
+ case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.disable();
+ case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.disable();
+ case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.disable();
+ case GL12.GL_RESCALE_NORMAL -> GLSMLighting.disableRescaleNormal(glCtx);
+ case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.disable();
+ case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.disable();
+ case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.disable();
+ case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.disable();
+ case GL11.GL_SCISSOR_TEST -> GLSMRasterizer.disableScissorTest(glCtx);
+ case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.disable();
+ case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).disable();
+ case GL11.GL_TEXTURE_2D -> GLSMTextures.disableTexture(glCtx);
+ case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).disable();
+ case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).disable();
+ case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).disable();
+ case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).disable();
+ case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).disable();
+ case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).disable();
+ default -> {
+ glCtx.exitCapture.reject();
+ if (!GLSMVertexInput.setClientArrayCap(glCtx, cap, false)) RENDER_BACKEND.disable(cap);
+ }
+ }
+ }
+
+ public static boolean glIsEnabled(int cap) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) {
+ return RENDER_BACKEND.getBoolean(cap);
+ }
+ // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
+ if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
+ return glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].isEnabled();
+ }
+
+ return switch (cap) {
+ case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled();
+ case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled();
+ case GL11.GL_BLEND -> glCtx.blendMode.isEnabled();
+ case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled();
+ case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled();
+ case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled();
+ case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled();
+ case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled();
+ case GL11.GL_DITHER -> glCtx.ditherState.isEnabled();
+ case GL11.GL_FOG -> glCtx.fogMode.isEnabled();
+ case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled();
+ case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled();
+ case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled();
+ case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled();
+ case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled();
+ case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled();
+ case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled();
+ case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled();
+ case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled();
+ case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled();
+ case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled();
+ case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled();
+ case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled();
+ case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled();
+ case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled();
+ case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled();
+ case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled();
+ case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled();
+ case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled();
+ case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled();
+ case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled();
+ case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled();
+ case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled();
+ case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled();
+ case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled();
+ case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled();
+ case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled();
+ case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled();
+ case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled();
+ case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled();
+ case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled();
+ case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled();
+ case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled();
+ case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled();
+ case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled();
+ case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled();
+ case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled();
+ case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled();
+ case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled();
+ case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ default -> {
+ final int conv = GLSMVertexInput.clientStateToConventional(glCtx, cap);
+ yield conv >= 0 ? glCtx.vaos.isConventionalEnabled(conv) : LegacyQueries.desc(cap) == 0 && RENDER_BACKEND.getBoolean(cap);
+ }
+ };
+ }
+
+ public static void glEnablei(int cap, int index) {
+ rejectExitCapture();
+ RENDER_BACKEND.enablei(cap, index);
+ markIndexedCapUnknown(cap);
+ }
+
+ public static void glDisablei(int cap, int index) {
+ rejectExitCapture();
+ RENDER_BACKEND.disablei(cap, index);
+ markIndexedCapUnknown(cap);
+ }
+
+ private static void markIndexedCapUnknown(int cap) {
+ if (cap == GL11.GL_BLEND) {
+ ctx().blendMode.setUnknownState();
+ } else if (cap == GL11.GL_SCISSOR_TEST) {
+ ctx().scissorTest.setUnknownState();
+ }
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java
new file mode 100644
index 000000000..98abb9e99
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java
@@ -0,0 +1,169 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.FogStateStack;
+import org.joml.Vector3d;
+import org.lwjgl.opengl.GL11;
+import java.nio.FloatBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.HAS_MULTIPLE_SET;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+
+public final class GLSMFog {
+
+ private GLSMFog() {}
+
+ public static void enableFog() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_FOG);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableFog(ctx());
+ }
+
+ static void enableFog(GLContextState glCtx) {
+ glCtx.fogMode.enable();
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
+ }
+
+ public static void disableFog() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_FOG);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableFog(ctx());
+ }
+
+ static void disableFog(GLContextState glCtx) {
+ glCtx.fogMode.disable();
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
+ }
+
+ public static void glFog(int pname, FloatBuffer param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordFog(pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (HAS_MULTIPLE_SET.contains(pname)) {
+ if (pname == GL11.GL_FOG_COLOR && isCachingEnabled()) {
+ final float red = param.get(0);
+ final float green = param.get(1);
+ final float blue = param.get(2);
+
+ beforeUncapturedStateChange();
+ mod(glCtx.fogState);
+ glCtx.fogState.getFogColor().set(red, green, blue);
+ glCtx.fogState.setFogAlpha(param.get(3));
+ glCtx.fogState.getFogColorBuffer().clear();
+ glCtx.fogState.getFogColorBuffer().put((FloatBuffer) param.position(0)).flip();
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
+ }
+ } else {
+ glFogf(pname, param.get(0));
+ }
+ }
+
+ public static Vector3d getFogColor() {
+ return ctx().fogState.getFogColor();
+ }
+
+ public static void fogColor(float red, float green, float blue, float alpha) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final boolean caching = isCachingEnabled();
+ if (!caching || red != glCtx.fogState.getFogColor().x || green != glCtx.fogState.getFogColor().y || blue != glCtx.fogState.getFogColor().z || alpha != glCtx.fogState.getFogAlpha()) {
+ beforeUncapturedStateChange();
+ mod(glCtx.fogState);
+ glCtx.fogState.getFogColor().set(red, green, blue);
+ glCtx.fogState.setFogAlpha(alpha);
+ glCtx.fogState.getFogColorBuffer().clear();
+ glCtx.fogState.getFogColorBuffer().put(red).put(green).put(blue).put(alpha).flip();
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
+ }
+ }
+
+ public static void glFogf(int pname, float param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordFogf(pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Update cached state (FFP shader reads from cache)
+ if (isCachingEnabled()) {
+ boolean changed = false;
+ switch (pname) {
+ case GL11.GL_FOG_DENSITY -> { if (!isCachingEnabled() || glCtx.fogState.getDensity() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setDensity(param); changed = true; } }
+ case GL11.GL_FOG_START -> { if (!isCachingEnabled() || glCtx.fogState.getStart() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setStart(param); changed = true; } }
+ case GL11.GL_FOG_END -> { if (!isCachingEnabled() || glCtx.fogState.getEnd() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setEnd(param); changed = true; } }
+ case GL11.GL_FOG_MODE -> { if (!isCachingEnabled() || glCtx.fogState.getFogMode() != (int) param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setFogMode((int) param); changed = true; } }
+ default -> {}
+ }
+ if (changed) {
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
+ }
+ }
+ }
+
+ public static void glFogi(int pname, int param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordFogi(pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Update cached state (FFP shader reads from cache)
+ if (isCachingEnabled() && pname == GL11.GL_FOG_MODE && (!isCachingEnabled() || glCtx.fogState.getFogMode() != param)) {
+ beforeUncapturedStateChange();
+ mod(glCtx.fogState).setFogMode(param);
+ glCtx.fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
+ }
+ }
+
+ public static FogStateStack getFogState() {
+ return ctx().fogState;
+ }
+
+ public static BooleanStateStack getFogMode() {
+ return ctx().fogMode;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java
new file mode 100644
index 000000000..937c36251
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java
@@ -0,0 +1,344 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL30;
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MainThread;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMFramebuffer {
+
+ private GLSMFramebuffer() {}
+
+ // This setting varies depending on driver, so it gets queried at runtime
+ public static int DEFAULT_DRAW_BUFFER = GL11.GL_BACK;
+ public static boolean framebufferCompletenessIsMeaningful() { return RENDER_BACKEND.framebufferCompletenessIsMeaningful(); }
+
+ static int drawFramebufferBits(GLContextState glCtx, boolean stencil) {
+ final int sizePname = stencil ? GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE : GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;
+ if (glCtx.drawFramebuffer == 0) {
+ return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, stencil ? GL11.GL_STENCIL : GL11.GL_DEPTH, sizePname);
+ }
+ final int attachment = stencil ? GL30.GL_STENCIL_ATTACHMENT : GL30.GL_DEPTH_ATTACHMENT;
+ if (RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) == GL11.GL_NONE) {
+ return 0;
+ }
+ return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, sizePname);
+ }
+
+ static void queryDefaultDrawBuffer() {
+ DEFAULT_DRAW_BUFFER = RENDER_BACKEND.getInteger(GL11.GL_DRAW_BUFFER);
+ }
+
+ static void armFirstClear() {
+ firstClearPending = true;
+ }
+
+ public static void glDrawBuffer(int mode) {
+ rejectExitCapture();
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ DisplayListManager.recordDrawBuffer(mode);
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (!isCachingEnabled() || ctx().drawBuffer.getValue() != mode) beforeUncapturedStateChange();
+ if (isCachingEnabled()) mod(ctx().drawBuffer).setValue(mode);
+ RENDER_BACKEND.drawBuffer(mode);
+ }
+
+ private static boolean firstClearPending;
+ private static long firstClearBlockNanos;
+
+ public static void glClear(int mask) {
+ rejectExitCapture();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordClear(mask);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (ctx().rasterizerDiscard.isEnabled() || FeedbackManager.getRenderMode() != GL11.GL_RENDER) {
+ return;
+ }
+ if (firstClearPending && Thread.currentThread() == MainThread && getDrawFramebuffer() == 0) {
+ firstClearPending = false;
+ final long start = System.nanoTime();
+ RENDER_BACKEND.clear(mask);
+ final long end = System.nanoTime();
+ if (end - start > 0) {
+ firstClearBlockNanos += end - start;
+ RENDER_BACKEND.recordGate(end - start, end);
+ }
+ return;
+ }
+ RENDER_BACKEND.clear(mask);
+ }
+
+ public static long takeFirstClearBlockNanos() {
+ final long value = firstClearBlockNanos;
+ firstClearBlockNanos = 0L;
+ return value;
+ }
+
+ public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ type = GLSMTextures.remapPixelTypeForGLES(format, type);
+ GLSMBuffers.suspendPixelPackBuffer();
+ RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
+ GLSMBuffers.restorePixelPackBuffer();
+ }
+ public static void glReadPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) {
+ rejectExitCapture();
+ type = GLSMTextures.remapPixelTypeForGLES(format, type);
+ GLSMBuffers.suspendPixelPackBuffer();
+ RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
+ GLSMBuffers.restorePixelPackBuffer();
+ }
+ public static void glReadPixels(int x, int y, int width, int height, int format, int type, IntBuffer pixels) {
+ rejectExitCapture();
+ type = GLSMTextures.remapPixelTypeForGLES(format, type);
+ GLSMBuffers.suspendPixelPackBuffer();
+ RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
+ GLSMBuffers.restorePixelPackBuffer();
+ }
+
+ public static void glReadBuffer(int mode) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glReadBuffer");
+ }
+ RENDER_BACKEND.readBuffer(mode);
+ }
+
+ public static void glDrawBuffers(int buffer) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDrawBuffers(1, buffer);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ RENDER_BACKEND.drawBuffers(buffer);
+ }
+
+ public static void glDrawBuffers(IntBuffer bufs) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDrawBuffers(bufs.remaining(), bufs);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ RENDER_BACKEND.drawBuffers(bufs);
+ }
+ public static boolean glIsFramebuffer(int framebuffer) { rejectExitCapture(); return RENDER_BACKEND.isFramebuffer(framebuffer); }
+ public static boolean glIsRenderbuffer(int renderbuffer) { rejectExitCapture(); return RENDER_BACKEND.isRenderbuffer(renderbuffer); }
+
+ public static void glBindFramebuffer(int target, int framebuffer) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (target == GL30.GL_FRAMEBUFFER) {
+ if (glCtx.drawFramebuffer == framebuffer && glCtx.readFramebuffer == framebuffer) return;
+ if (glCtx.drawFramebuffer != framebuffer) glCtx.drawFramebufferGeneration++;
+ glCtx.drawFramebuffer = framebuffer;
+ glCtx.readFramebuffer = framebuffer;
+ } else if (target == GL30.GL_DRAW_FRAMEBUFFER) {
+ if (glCtx.drawFramebuffer == framebuffer) return;
+ glCtx.drawFramebufferGeneration++;
+ glCtx.drawFramebuffer = framebuffer;
+ } else if (target == GL30.GL_READ_FRAMEBUFFER) {
+ if (glCtx.readFramebuffer == framebuffer) return;
+ glCtx.readFramebuffer = framebuffer;
+ }
+ RENDER_BACKEND.bindFramebuffer(target, framebuffer);
+ }
+
+ public static void glDeleteFramebuffers(int framebuffer) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (glCtx.drawFramebuffer == framebuffer) { glCtx.drawFramebuffer = 0; glCtx.drawFramebufferGeneration++; }
+ if (glCtx.readFramebuffer == framebuffer) glCtx.readFramebuffer = 0;
+ final int[] slots = glCtx.framebufferTextures.remove(framebuffer);
+ if (slots != null) {
+ for (int slot = 0; slot < slots.length; slot++) GLSMTextureLifetime.setFramebufferSlot(slots, slot, 0);
+ }
+ RENDER_BACKEND.deleteFramebuffers(framebuffer);
+ }
+
+ public static void glDeleteFramebuffers(IntBuffer framebuffers) {
+ for (int i = framebuffers.position(); i < framebuffers.limit(); i++) glDeleteFramebuffers(framebuffers.get(i));
+ }
+
+ public static void glDeleteFramebuffers(int[] framebuffers) {
+ for (int framebuffer : framebuffers) glDeleteFramebuffers(framebuffer);
+ }
+
+ public static int glGenFramebuffers() {
+ requireContext("glGenFramebuffers");
+ return RENDER_BACKEND.genFramebuffers();
+ }
+
+ public static int glCheckFramebufferStatus(int target) {
+ rejectExitCapture();
+ return RENDER_BACKEND.checkFramebufferStatus(target);
+ }
+
+ public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getFramebufferAttachmentParameteri(target, attachment, pname);
+ }
+
+ public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) {
+ rejectExitCapture();
+ if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return;
+ RENDER_BACKEND.framebufferTexture2D(target, attachment, textarget, texture, level);
+ }
+
+ public static void glFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level) {
+ rejectExitCapture();
+ if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return;
+ RENDER_BACKEND.framebufferTexture1D(target, attachment, textarget, texture, level);
+ }
+
+ public static void glFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int zoffset) {
+ rejectExitCapture();
+ if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return;
+ RENDER_BACKEND.framebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
+ }
+
+ public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) {
+ rejectExitCapture();
+ if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return;
+ RENDER_BACKEND.framebufferTextureLayer(target, attachment, texture, level, layer);
+ }
+
+ public static void glFramebufferTexture(int target, int attachment, int texture, int level) {
+ rejectExitCapture();
+ if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return;
+ RENDER_BACKEND.framebufferTexture(target, attachment, texture, level);
+ }
+
+ public static void glFramebufferTextureFace(int target, int attachment, int texture, int level, int face) {
+ glFramebufferTexture2D(target, attachment, face, texture, level);
+ }
+
+ public static void glNamedFramebufferTexture(int framebuffer, int attachment, int texture, int level) {
+ rejectExitCapture();
+ if (!GLSMTextureLifetime.beginAttach(ctx(), framebuffer, attachment, texture)) return;
+ RENDER_BACKEND.namedFramebufferTexture(framebuffer, attachment, texture, level);
+ }
+
+ private static int swapDrawFramebuffer(int framebuffer) {
+ final GLContextState glCtx = ctx();
+ final int previous = glCtx.drawFramebuffer;
+ glCtx.drawFramebuffer = framebuffer;
+ RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer);
+ return previous;
+ }
+
+ public static void glNamedFramebufferTextureLayer(int framebuffer, int attachment, int texture, int level, int layer) {
+ final int previous = swapDrawFramebuffer(framebuffer);
+ glFramebufferTextureLayer(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level, layer);
+ swapDrawFramebuffer(previous);
+ }
+
+ public static void glNamedFramebufferRenderbuffer(int framebuffer, int attachment, int renderbuffertarget, int renderbuffer) {
+ final int previous = swapDrawFramebuffer(framebuffer);
+ glFramebufferRenderbuffer(GL30.GL_DRAW_FRAMEBUFFER, attachment, renderbuffertarget, renderbuffer);
+ swapDrawFramebuffer(previous);
+ }
+
+ public static void glNamedFramebufferTexture1DEXT(int framebuffer, int attachment, int textarget, int texture, int level) {
+ final int previous = swapDrawFramebuffer(framebuffer);
+ glFramebufferTexture1D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level);
+ swapDrawFramebuffer(previous);
+ }
+
+ public static void glNamedFramebufferTexture2DEXT(int framebuffer, int attachment, int textarget, int texture, int level) {
+ final int previous = swapDrawFramebuffer(framebuffer);
+ glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level);
+ swapDrawFramebuffer(previous);
+ }
+
+ public static void glNamedFramebufferTexture3DEXT(int framebuffer, int attachment, int textarget, int texture, int level, int zoffset) {
+ final int previous = swapDrawFramebuffer(framebuffer);
+ glFramebufferTexture3D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level, zoffset);
+ swapDrawFramebuffer(previous);
+ }
+
+ public static void glNamedFramebufferTextureEXT(int framebuffer, int attachment, int texture, int level) {
+ final int previous = swapDrawFramebuffer(framebuffer);
+ glFramebufferTexture(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level);
+ swapDrawFramebuffer(previous);
+ }
+
+ public static void glNamedFramebufferTextureFaceEXT(int framebuffer, int attachment, int texture, int level, int face) {
+ glNamedFramebufferTexture2DEXT(framebuffer, attachment, face, texture, level);
+ }
+
+ public static void attachTextureForReading(int attachment, int texture) {
+ if (GLSMTextureLifetime.isDeferredDelete(texture)) return;
+ final GLContextState glCtx = ctx();
+ GLSMTextureLifetime.trackFramebufferAttachment(glCtx, glCtx.readFramebuffer, attachment, texture);
+ RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, attachment, GL11.GL_TEXTURE_2D, texture, 0);
+ }
+
+ public static int glGenRenderbuffers() {
+ requireContext("glGenRenderbuffers");
+ return RENDER_BACKEND.genRenderbuffers();
+ }
+ public static void glDeleteRenderbuffers(int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.deleteRenderbuffers(renderbuffer); }
+ public static void glBindRenderbuffer(int target, int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.bindRenderbuffer(target, renderbuffer); }
+ public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorage(target, internalformat, width, height); }
+ public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorageMultisample(target, samples, internalformat, width, height); }
+ public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) {
+ rejectExitCapture();
+ GLSMTextureLifetime.beginAttach(target, attachment, 0);
+ RENDER_BACKEND.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+ }
+
+ public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) {
+ rejectExitCapture();
+ RENDER_BACKEND.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ }
+
+ public static boolean isFramebufferEnabled() {
+ return true;
+ }
+ public static void glReadPixels(int x, int y, int width, int height, int format, int type, long pixels) {
+ rejectExitCapture();
+ RENDER_BACKEND.readPixels(x, y, width, height, format, GLSMTextures.remapPixelTypeForGLES(format, type), pixels);
+ }
+
+ public static int getDrawFramebufferGeneration() {
+ return ctx().drawFramebufferGeneration;
+ }
+
+ public static IntegerStateStack getDrawBuffer() {
+ return ctx().drawBuffer;
+ }
+
+ public static int getDrawFramebuffer() {
+ return ctx().drawFramebuffer;
+ }
+
+ public static int getReadFramebuffer() {
+ return ctx().readFramebuffer;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java
new file mode 100644
index 000000000..23f7424e4
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java
@@ -0,0 +1,781 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
+import com.gtnewhorizons.angelica.glsm.ffp.VertexKey;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.LightModelStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.LightStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.MaterialStateStack;
+import org.joml.Vector4f;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+
+public final class GLSMLighting {
+
+ private GLSMLighting() {}
+
+ public static void glGetMaterial(int face, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final MaterialStateStack state;
+ if (face == GL11.GL_FRONT) {
+ state = glCtx.frontMaterial;
+ } else if (face == GL11.GL_BACK) {
+ state = glCtx.backMaterial;
+ } else {
+ throw new RuntimeException("Invalid face parameter specified to glGetMaterial: " + face);
+ }
+
+ switch (pname) {
+ case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params);
+ case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params);
+ case GL11.GL_SPECULAR -> state.specular.get(params.position(), params);
+ case GL11.GL_EMISSION -> state.emission.get(params.position(), params);
+ case GL11.GL_SHININESS -> params.put(params.position(), state.shininess);
+ case GL11.GL_COLOR_INDEXES -> state.colorIndexes.get(params.position(), params);
+ default -> {
+ }
+ }
+ }
+
+ private static void putLightingInts(FloatBuffer values, int pname, boolean material, IntBuffer params) {
+ final int count = switch (pname) {
+ case GL11.GL_AMBIENT, GL11.GL_DIFFUSE, GL11.GL_SPECULAR -> 4;
+ case GL11.GL_EMISSION -> material ? 4 : 0;
+ case GL11.GL_COLOR_INDEXES -> material ? 3 : 0;
+ case GL11.GL_SHININESS -> material ? 1 : 0;
+ case GL11.GL_POSITION -> material ? 0 : 4;
+ case GL11.GL_SPOT_DIRECTION -> material ? 0 : 3;
+ case GL11.GL_SPOT_EXPONENT, GL11.GL_SPOT_CUTOFF, GL11.GL_CONSTANT_ATTENUATION, GL11.GL_LINEAR_ATTENUATION,
+ GL11.GL_QUADRATIC_ATTENUATION -> material ? 0 : 1;
+ default -> 0;
+ };
+ final boolean color = count == 4 && pname != GL11.GL_POSITION;
+ final int pos = params.position();
+ for (int i = 0; i < count; i++) {
+ final float value = values.get(i);
+ final int converted;
+ if (color) {
+ converted = LegacyQueries.floatToInt(value);
+ } else if (material) {
+ converted = LegacyQueries.lround(value);
+ } else {
+ converted = (int) value;
+ }
+ params.put(pos + i, converted);
+ }
+ }
+
+ public static void glGetMaterial(int face, int pname, IntBuffer params) {
+ final FloatBuffer scratch = ctx().queryScratch;
+ scratch.clear();
+ glGetMaterial(face, pname, scratch);
+ putLightingInts(scratch, pname, true, params);
+ }
+
+ public static void glGetLight(int light, int pname, IntBuffer params) {
+ final FloatBuffer scratch = ctx().queryScratch;
+ scratch.clear();
+ glGetLight(light, pname, scratch);
+ putLightingInts(scratch, pname, false, params);
+ }
+
+ public static void glGetLight(int light, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final LightStateStack state = ctx().lightDataStates[light - GL11.GL_LIGHT0];
+ switch (pname) {
+ case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params);
+ case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params);
+ case GL11.GL_SPECULAR -> state.specular.get(params.position(), params);
+ case GL11.GL_POSITION -> state.position.get(params.position(), params);
+ case GL11.GL_SPOT_DIRECTION -> state.spotDirection.get(params.position(), params);
+ case GL11.GL_SPOT_EXPONENT -> params.put(params.position(), state.spotExponent);
+ case GL11.GL_SPOT_CUTOFF -> params.put(params.position(), state.spotCutoff);
+ case GL11.GL_CONSTANT_ATTENUATION -> params.put(params.position(), state.constantAttenuation);
+ case GL11.GL_LINEAR_ATTENUATION -> params.put(params.position(), state.linearAttenuation);
+ case GL11.GL_QUADRATIC_ATTENUATION -> params.put(params.position(), state.quadraticAttenuation);
+ default -> {
+ }
+ }
+ }
+
+ public static float i2f(int i) {return ((i - Integer.MIN_VALUE) & 0xFFFFFFFFL) / 4294967295.0F;}
+
+ public static void enableLighting() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_LIGHTING);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableLighting(ctx());
+ }
+
+ static void enableLighting(GLContextState glCtx) {
+ glCtx.lightingState.enable();
+ }
+
+ public static void enableLight(int light) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_LIGHT0 + light);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableLight(ctx(), light);
+ }
+
+ static void enableLight(GLContextState glCtx, int light) {
+ if (light >= VertexKey.FFP_LIGHT_COUNT && (warnedFfpLightMask & (1 << light)) == 0 && ShaderManager.isEnabled()) {
+ warnedFfpLightMask |= (1 << light);
+ LOGGER.warn("GL_LIGHT{} enabled, but FFP shader emulation implements only GL_LIGHT0..{}", light, VertexKey.FFP_LIGHT_COUNT - 1, new Throwable("call site"));
+ }
+ glCtx.lightStates[light].enable();
+ }
+
+ private static int warnedFfpLightMask = 0;
+
+ public static void enableColorMaterial() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_COLOR_MATERIAL);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableColorMaterial(ctx());
+ }
+
+ static void enableColorMaterial(GLContextState glCtx) {
+ glCtx.colorMaterial.enable();
+ bakeCurrentColorIntoTrackedMaterial(glCtx);
+ }
+
+ public static void disableColorMaterial() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_COLOR_MATERIAL);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableColorMaterial(ctx());
+ }
+
+ static void disableColorMaterial(GLContextState glCtx) {
+ bakeCurrentColorIntoTrackedMaterial(glCtx);
+ glCtx.colorMaterial.disable();
+ }
+
+ private static void bakeCurrentColorIntoTrackedMaterial(GLContextState glCtx) {
+ glCtx.exitCapture.requireMaterialBakeInputs();
+ final float r = glCtx.color.getRed();
+ final float g = glCtx.color.getGreen();
+ final float b = glCtx.color.getBlue();
+ final float a = glCtx.color.getAlpha();
+ final int face = glCtx.colorMaterialFace.getValue();
+ final int param = glCtx.colorMaterialParameter.getValue();
+ if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
+ bakeMaterialColor(glCtx, glCtx.frontMaterial, param, r, g, b, a);
+ }
+ if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
+ bakeMaterialColor(glCtx, glCtx.backMaterial, param, r, g, b, a);
+ }
+ }
+
+ private static boolean materialVectorDiffers(Vector4f vec, float r, float g, float b, float a) {
+ return vec.x != r || vec.y != g || vec.z != b || vec.w != a;
+ }
+
+ private static void bakeMaterialColor(GLContextState glCtx, MaterialStateStack material, int param, float r, float g, float b, float a) {
+ glCtx.exitCapture.material(material.face, param);
+ final boolean changed = switch (param) {
+ case GL11.GL_AMBIENT_AND_DIFFUSE -> materialVectorDiffers(material.ambient, r, g, b, a) || materialVectorDiffers(material.diffuse, r, g, b, a);
+ case GL11.GL_AMBIENT -> materialVectorDiffers(material.ambient, r, g, b, a);
+ case GL11.GL_DIFFUSE -> materialVectorDiffers(material.diffuse, r, g, b, a);
+ case GL11.GL_SPECULAR -> materialVectorDiffers(material.specular, r, g, b, a);
+ case GL11.GL_EMISSION -> materialVectorDiffers(material.emission, r, g, b, a);
+ default -> false;
+ };
+ if (!changed) return;
+ mod(material);
+ switch (param) {
+ case GL11.GL_AMBIENT_AND_DIFFUSE -> {
+ material.ambient.set(r, g, b, a);
+ material.diffuse.set(r, g, b, a);
+ }
+ case GL11.GL_AMBIENT -> material.ambient.set(r, g, b, a);
+ case GL11.GL_DIFFUSE -> material.diffuse.set(r, g, b, a);
+ case GL11.GL_SPECULAR -> material.specular.set(r, g, b, a);
+ case GL11.GL_EMISSION -> material.emission.set(r, g, b, a);
+ default -> {}
+ }
+ }
+
+ public static void disableLighting() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_LIGHTING);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableLighting(ctx());
+ }
+
+ static void disableLighting(GLContextState glCtx) {
+ glCtx.lightingState.disable();
+ }
+
+ public static void disableLight(int light) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_LIGHT0 + light);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableLight(ctx(), light);
+ }
+
+ static void disableLight(GLContextState glCtx, int light) {
+ glCtx.lightStates[light].disable();
+ }
+
+ public static void enableRescaleNormal() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL12.GL_RESCALE_NORMAL);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableRescaleNormal(ctx());
+ }
+
+ static void enableRescaleNormal(GLContextState glCtx) {
+ glCtx.rescaleNormalState.enable();
+ }
+
+ public static void disableRescaleNormal() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL12.GL_RESCALE_NORMAL);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableRescaleNormal(ctx());
+ }
+
+ static void disableRescaleNormal(GLContextState glCtx) {
+ glCtx.rescaleNormalState.disable();
+ }
+
+ private static boolean glMaterialFront(int pname, FloatBuffer params) {
+ final GLContextState glCtx = ctx();
+ mod(glCtx.frontMaterial);
+ return switch (pname) {
+ case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params);
+ case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params);
+ case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params);
+ case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params);
+ case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params);
+ case GL11.GL_AMBIENT_AND_DIFFUSE -> {
+ final boolean a = glCtx.frontMaterial.setAmbient(params);
+ final boolean d = glCtx.frontMaterial.setDiffuse(params);
+ yield a || d;
+ }
+ case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params);
+ default -> false;
+ };
+ }
+
+ private static boolean glMaterialBack(int pname, FloatBuffer params) {
+ final GLContextState glCtx = ctx();
+ mod(glCtx.backMaterial);
+ return switch (pname) {
+ case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params);
+ case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params);
+ case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params);
+ case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params);
+ case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params);
+ case GL11.GL_AMBIENT_AND_DIFFUSE -> {
+ final boolean a = glCtx.backMaterial.setAmbient(params);
+ final boolean d = glCtx.backMaterial.setDiffuse(params);
+ yield a || d;
+ }
+ case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params);
+ default -> false;
+ };
+ }
+
+ private static boolean glMaterialFront(int pname, IntBuffer params) {
+ final GLContextState glCtx = ctx();
+ mod(glCtx.frontMaterial);
+ return switch (pname) {
+ case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params);
+ case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params);
+ case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params);
+ case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params);
+ case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params);
+ case GL11.GL_AMBIENT_AND_DIFFUSE -> {
+ final boolean a = glCtx.frontMaterial.setAmbient(params);
+ final boolean d = glCtx.frontMaterial.setDiffuse(params);
+ yield a || d;
+ }
+ case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params);
+ default -> false;
+ };
+ }
+
+ private static boolean glMaterialBack(int pname, IntBuffer params) {
+ final GLContextState glCtx = ctx();
+ mod(glCtx.backMaterial);
+ return switch (pname) {
+ case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params);
+ case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params);
+ case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params);
+ case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params);
+ case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params);
+ case GL11.GL_AMBIENT_AND_DIFFUSE -> {
+ final boolean a = glCtx.backMaterial.setAmbient(params);
+ final boolean d = glCtx.backMaterial.setDiffuse(params);
+ yield a || d;
+ }
+ case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params);
+ default -> false;
+ };
+ }
+
+ public static void glMaterial(int face, int pname, FloatBuffer params) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.material(face, pname);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordMaterial(face, pname, params);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ boolean changed = false;
+ if (face == GL11.GL_FRONT) {
+ changed = glMaterialFront(pname, params);
+ } else if (face == GL11.GL_BACK) {
+ changed = glMaterialBack(pname, params);
+ } else if (face == GL11.GL_FRONT_AND_BACK) {
+ final boolean f = glMaterialFront(pname, params);
+ final boolean b = glMaterialBack(pname, params);
+ changed = f || b;
+ } else {
+ throw new RuntimeException("Unsupported face value for glMaterial: " + face);
+ }
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glMaterial(int face, int pname, IntBuffer params) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.material(face, pname);
+ // For IntBuffer version, we need to convert to float for recording
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ // Convert int params to float for recording
+ final float[] floatParams = new float[params.remaining()];
+ params.mark();
+ for (int i = 0; i < floatParams.length; i++) {
+ floatParams[i] = i2f(params.get());
+ }
+ params.reset();
+ DisplayListManager.recordMaterial(face, pname, FloatBuffer.wrap(floatParams));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ boolean changed = false;
+ if (face == GL11.GL_FRONT) {
+ changed = glMaterialFront(pname, params);
+ } else if (face == GL11.GL_BACK) {
+ changed = glMaterialBack(pname, params);
+ } else if (face == GL11.GL_FRONT_AND_BACK) {
+ final boolean f = glMaterialFront(pname, params);
+ final boolean b = glMaterialBack(pname, params);
+ changed = f || b;
+ } else {
+ throw new RuntimeException("Unsupported face value for glMaterial: " + face);
+ }
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glMaterialf(int face, int pname, float val) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordMaterialf(face, pname, val);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (pname != GL11.GL_SHININESS) {
+ // it is only valid to call glMaterialf for the GL_SHININESS parameter
+ return;
+ }
+
+ boolean changed = false;
+ if (face == GL11.GL_FRONT) {
+ mod(glCtx.frontMaterial);
+ changed = glCtx.frontMaterial.setShininess(val);
+ } else if (face == GL11.GL_BACK) {
+ mod(glCtx.backMaterial);
+ changed = glCtx.backMaterial.setShininess(val);
+ } else if (face == GL11.GL_FRONT_AND_BACK) {
+ mod(glCtx.frontMaterial);
+ mod(glCtx.backMaterial);
+ final boolean f = glCtx.frontMaterial.setShininess(val);
+ final boolean b = glCtx.backMaterial.setShininess(val);
+ changed = f || b;
+ } else {
+ throw new RuntimeException("Unsupported face value for glMaterial: " + face);
+ }
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glMateriali(int face, int pname, int val) {
+ // This will end up no-opping if pname != GL_SHININESS, it is invalid to call this with another pname
+ // Command recording happens in glMaterialf
+ glMaterialf(face, pname, (float) val);
+ }
+
+ public static void glLight(int light, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLight(light, pname, params);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
+ mod(lightState);
+ final boolean changed = switch (pname) {
+ case GL11.GL_AMBIENT -> lightState.setAmbient(params);
+ case GL11.GL_DIFFUSE -> lightState.setDiffuse(params);
+ case GL11.GL_SPECULAR -> lightState.setSpecular(params);
+ case GL11.GL_POSITION -> lightState.setPosition(params);
+ case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params);
+ case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params);
+ case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params);
+ case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params);
+ case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params);
+ case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glLight(int light, int pname, IntBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ // For IntBuffer version, we need to convert to float for recording
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ // Convert int params to float for recording
+ final float[] floatParams = new float[params.remaining()];
+ params.mark();
+ for (int i = 0; i < floatParams.length; i++) {
+ floatParams[i] = i2f(params.get());
+ }
+ params.reset();
+ DisplayListManager.recordLight(light, pname, FloatBuffer.wrap(floatParams));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
+ mod(lightState);
+ final boolean changed = switch (pname) {
+ case GL11.GL_AMBIENT -> lightState.setAmbient(params);
+ case GL11.GL_DIFFUSE -> lightState.setDiffuse(params);
+ case GL11.GL_SPECULAR -> lightState.setSpecular(params);
+ case GL11.GL_POSITION -> lightState.setPosition(params);
+ case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params);
+ case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params);
+ case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params);
+ case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params);
+ case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params);
+ case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glLightf(int light, int pname, float param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLightf(light, pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
+ mod(lightState);
+ final boolean changed = switch (pname) {
+ case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param);
+ case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param);
+ case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param);
+ case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param);
+ case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glLighti(int light, int pname, int param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLighti(light, pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
+ mod(lightState);
+ final boolean changed = switch (pname) {
+ case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param);
+ case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param);
+ case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param);
+ case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param);
+ case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glLightModel(int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLightModel(pname, params);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ mod(glCtx.lightModel);
+ final boolean changed = switch (pname) {
+ case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params);
+ case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params);
+ case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glLightModel(int pname, IntBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ // For IntBuffer version, we need to convert to float for recording
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ // Convert int params to float for recording
+ final float[] floatParams = new float[params.remaining()];
+ params.mark();
+ for (int i = 0; i < floatParams.length; i++) {
+ floatParams[i] = i2f(params.get());
+ }
+ params.reset();
+ DisplayListManager.recordLightModel(pname, FloatBuffer.wrap(floatParams));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ mod(glCtx.lightModel);
+ final boolean changed = switch (pname) {
+ case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params);
+ case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(params);
+ case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params);
+ case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+
+ public static void glLightModelf(int pname, float param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLightModelf(pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+
+ if (isCachingEnabled()) {
+ mod(glCtx.lightModel);
+ final boolean changed = switch (pname) {
+ case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param);
+ case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+ }
+
+ public static void glLightModeli(int pname, int param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLightModeli(pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+
+ if (isCachingEnabled()) {
+ mod(glCtx.lightModel);
+ final boolean changed = switch (pname) {
+ case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(param);
+ case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param);
+ case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param);
+ default -> false;
+ };
+ if (changed) glCtx.lightingGeneration++;
+ }
+ }
+
+ public static void glColorMaterial(int face, int mode) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.COLOR_MATERIAL_SETTINGS);
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ DisplayListManager.recordColorMaterial(face, mode);
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.colorMaterialFace.getValue() != face || glCtx.colorMaterialParameter.getValue() != mode) {
+ mod(glCtx.colorMaterialFace).setValue(face);
+ mod(glCtx.colorMaterialParameter).setValue(mode);
+ glCtx.lightingGeneration++;
+ }
+ }
+
+ public static int getLightingGeneration() {
+ return ctx().lightingGeneration;
+ }
+
+ public static BooleanStateStack getLightingState() {
+ return ctx().lightingState;
+ }
+
+ public static BooleanStateStack getRescaleNormalState() {
+ return ctx().rescaleNormalState;
+ }
+
+ public static BooleanStateStack getNormalizeState() {
+ return ctx().normalizeState;
+ }
+
+ public static BooleanStateStack[] getLightStates() {
+ return ctx().lightStates;
+ }
+
+ public static LightStateStack[] getLightDataStates() {
+ return ctx().lightDataStates;
+ }
+
+ public static BooleanStateStack getColorMaterial() {
+ return ctx().colorMaterial;
+ }
+
+ public static IntegerStateStack getColorMaterialFace() {
+ return ctx().colorMaterialFace;
+ }
+
+ public static IntegerStateStack getColorMaterialParameter() {
+ return ctx().colorMaterialParameter;
+ }
+
+ public static LightModelStateStack getLightModel() {
+ return ctx().lightModel;
+ }
+
+ public static MaterialStateStack getFrontMaterial() {
+ return ctx().frontMaterial;
+ }
+
+ public static MaterialStateStack getBackMaterial() {
+ return ctx().backMaterial;
+ }
+
+ public static void captureLighting(LightingSnapshot out) {
+ final GLContextState glCtx = ctx();
+ for (int i = 0; i < out.lights.length; i++) {
+ out.lightEnabled[i] = glCtx.lightStates[i].isEnabled();
+ out.lights[i].set(glCtx.lightDataStates[i]);
+ }
+ out.lightModel.set(glCtx.lightModel);
+ out.frontMaterial.set(glCtx.frontMaterial);
+ out.backMaterial.set(glCtx.backMaterial);
+ out.colorMaterial = glCtx.colorMaterial.isEnabled();
+ out.colorMaterialFace = glCtx.colorMaterialFace.getValue();
+ out.colorMaterialParameter = glCtx.colorMaterialParameter.getValue();
+ out.normalize = glCtx.normalizeState.isEnabled();
+ out.rescaleNormal = glCtx.rescaleNormalState.isEnabled();
+ }
+
+ public static void applyLighting(LightingSnapshot in) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ boolean changed = false;
+ for (int i = 0; i < in.lights.length; i++) {
+ glCtx.lightStates[i].setEnabled(in.lightEnabled[i]);
+ if (!glCtx.lightDataStates[i].sameAs(in.lights[i])) {
+ mod(glCtx.lightDataStates[i]).set(in.lights[i]);
+ changed = true;
+ }
+ }
+ if (!glCtx.lightModel.sameAs(in.lightModel)) {
+ mod(glCtx.lightModel).set(in.lightModel);
+ changed = true;
+ }
+ if (!glCtx.frontMaterial.sameAs(in.frontMaterial)) {
+ mod(glCtx.frontMaterial).set(in.frontMaterial);
+ changed = true;
+ }
+ if (!glCtx.backMaterial.sameAs(in.backMaterial)) {
+ mod(glCtx.backMaterial).set(in.backMaterial);
+ changed = true;
+ }
+ if (glCtx.colorMaterialFace.getValue() != in.colorMaterialFace || glCtx.colorMaterialParameter.getValue() != in.colorMaterialParameter) {
+ mod(glCtx.colorMaterialFace).setValue(in.colorMaterialFace);
+ mod(glCtx.colorMaterialParameter).setValue(in.colorMaterialParameter);
+ changed = true;
+ }
+ // Direct set: glEnable(GL_COLOR_MATERIAL) would bake the current color over the captured material.
+ glCtx.colorMaterial.setEnabled(in.colorMaterial);
+ glCtx.normalizeState.setEnabled(in.normalize);
+ glCtx.rescaleNormalState.setEnabled(in.rescaleNormal);
+ if (changed) glCtx.lightingGeneration++;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java
new file mode 100644
index 000000000..a9e33967e
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java
@@ -0,0 +1,504 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.stacks.MatrixModeStack;
+import lombok.SneakyThrows;
+import org.joml.Matrix4f;
+import org.joml.Matrix4fStack;
+import org.joml.Matrix4fc;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.util.glu.GLU;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+
+public final class GLSMMatrices {
+
+ private GLSMMatrices() {}
+
+ private static void beforeMatrixChange(GLContextState c) {
+ beforeMatrixChange(c, false);
+ }
+
+ private static void beforeMatrixChange(GLContextState c, boolean absolute) {
+ c.exitCapture.matrixChange(absolute);
+ if (isUncapturedMatrix(c)) beforeUncapturedStateChange();
+ }
+
+ private static boolean isUncapturedMatrix(GLContextState c) {
+ final int mode = c.matrixMode.getMode();
+ return mode == GL11.GL_PROJECTION || (mode == GL11.GL_TEXTURE && c.activeTextureUnit.getValue() != 0);
+ }
+
+ private static final MethodHandle MAT4_STACK_CURR_DEPTH;
+
+ static {
+ try {
+ final Field curr = Matrix4fStack.class.getDeclaredField("curr");
+ curr.setAccessible(true);
+ MAT4_STACK_CURR_DEPTH = MethodHandles.lookup().unreflectGetter(curr);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @SneakyThrows
+ public static int getMatrixStackDepth(Matrix4fStack stack) {
+ // JOML's curr is 0-based (0 = no pushes), but OpenGL starts at 1 (base matrix counts)
+ return (int) MAT4_STACK_CURR_DEPTH.invokeExact(stack) + 1;
+ }
+
+ public static void glMatrixMode(int mode) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.MATRIX_MODE);
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ DisplayListManager.recordMatrixMode(mode);
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ mod(glCtx.matrixMode).setMode(mode);
+ }
+
+ public static void glLoadMatrix(FloatBuffer m) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx, true);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ final Matrix4f matrix = new Matrix4f().set(m);
+ m.rewind();
+ DisplayListManager.recordLoadMatrix(matrix);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).set(m);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glLoadMatrix(DoubleBuffer m) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx, true);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ // Convert double buffer to float buffer for recording
+ glCtx.conversionMatrix4d.set(m);
+ m.rewind();
+ final Matrix4f floatMatrix = new Matrix4f();
+ floatMatrix.set(glCtx.conversionMatrix4d);
+ DisplayListManager.recordLoadMatrix(floatMatrix);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (isCachingEnabled()) {
+ glCtx.conversionMatrix4d.set(m);
+ matrixStack(glCtx).set(glCtx.conversionMatrix4d);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void setModelViewMatrix(Matrix4fc m) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.matrixChange(GL11.GL_MODELVIEW, 0, true);
+ if (isCachingEnabled()) {
+ glCtx.modelViewMatrix.set(m);
+ glCtx.mvGeneration++;
+ glCtx.mvLinearGeneration++;
+ }
+ }
+
+ public static void setTextureMatrix(int unit, Matrix4fc m) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.matrixChange(GL11.GL_TEXTURE, unit, true);
+ if (unit != 0) beforeUncapturedStateChange();
+ if (isCachingEnabled()) {
+ glCtx.textures.getTextureUnitMatrix(unit).set(m);
+ glCtx.texMatrixGeneration++;
+ }
+ }
+
+ public static void setProjectionMatrix(Matrix4fc m) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (isCachingEnabled()) {
+ glCtx.projectionMatrix.set(m);
+ glCtx.projGeneration++;
+ }
+ }
+
+ public static Matrix4fStack getMatrixStack() {
+ return matrixStack(ctx());
+ }
+
+ private static Matrix4fStack matrixStack(GLContextState glCtx) {
+ switch (glCtx.matrixMode.getMode()) {
+ case GL11.GL_MODELVIEW -> {
+ return glCtx.modelViewMatrix;
+ }
+ case GL11.GL_PROJECTION -> {
+ return glCtx.projectionMatrix;
+ }
+ case GL11.GL_TEXTURE -> {
+ return glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue());
+ }
+ default -> throw new IllegalStateException("Unknown matrix mode: " + glCtx.matrixMode.getMode());
+ }
+ }
+
+ /** Bump the generation counter for the currently active matrix mode. */
+ private static void bumpMatrixGeneration(GLContextState glCtx) {
+ bumpMatrixGeneration(glCtx, true);
+ }
+
+ private static void bumpMatrixGeneration(GLContextState glCtx, boolean linearChanged) {
+ switch (glCtx.matrixMode.getMode()) {
+ case GL11.GL_MODELVIEW -> {
+ glCtx.mvGeneration++;
+ if (linearChanged) glCtx.mvLinearGeneration++;
+ }
+ case GL11.GL_PROJECTION -> glCtx.projGeneration++;
+ case GL11.GL_TEXTURE -> glCtx.texMatrixGeneration++;
+ }
+ }
+
+ public static void glLoadIdentity() {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx, true);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLoadIdentity();
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).identity();
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glTranslatef(float x, float y, float z) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.applyMatrixTranslation(x, y, z);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).translate(x, y, z);
+ bumpMatrixGeneration(glCtx, false);
+ }
+ }
+
+ public static void glTranslated(double x, double y, double z) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.applyMatrixTranslation((float) x, (float) y, (float) z);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).translate((float) x, (float) y, (float) z);
+ bumpMatrixGeneration(glCtx, false);
+ }
+ }
+
+ public static void glScalef(float x, float y, float z) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.applyMatrixScale(x, y, z);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).scale(x, y, z);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glScaled(double x, double y, double z) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.applyMatrixScale((float) x, (float) y, (float) z);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).scale((float) x, (float) y, (float) z);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glMultMatrix(FloatBuffer floatBuffer) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ glCtx.multMatrix.set(floatBuffer);
+ final int currentMode = glCtx.matrixMode.getMode();
+
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.updateRelativeTransform(glCtx.multMatrix);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).mul(glCtx.multMatrix);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void applyMultMatrix(Matrix4f multMatrix) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).mul(multMatrix);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glMultMatrix(DoubleBuffer matrix) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ glCtx.conversionMatrix4d.set(matrix);
+ glCtx.conversionMatrix4f.set(glCtx.conversionMatrix4d);
+
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.updateRelativeTransform(glCtx.conversionMatrix4f);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).mul(glCtx.conversionMatrix4f);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glRotatef(float angle, float x, float y, float z) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ final float lenSq = x * x + y * y + z * z;
+ if (lenSq == 0.0f) return;
+
+ // Fast way to normalize rotation
+ final float scalar = 1.0f / (float) Math.sqrt(lenSq);
+ x *= scalar;
+ y *= scalar;
+ z *= scalar;
+ // Convert deg to rad
+ angle = (float) Math.toRadians(angle);
+
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.applyMatrixRotation(angle, x, y, z);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).rotate(angle, x, y, z);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glRotated(double angle, double x, double y, double z) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ final double lenSq = x * x + y * y + z * z;
+ if (lenSq == 0.0) return;
+
+ // Fast way to normalize rotation
+ final double scalar = 1.0 / Math.sqrt(lenSq);
+ x *= scalar;
+ y *= scalar;
+ z *= scalar;
+ // Convert deg to rad
+ angle = Math.toRadians(angle);
+
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.applyMatrixRotation((float) angle, (float) x, (float) y, (float) z);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).rotate((float) angle, (float) x, (float) y, (float) z);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.updateRelativeTransformOrtho(left, right, bottom, top, zNear, zFar);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).ortho((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar) {
+ final GLContextState glCtx = ctx();
+ beforeMatrixChange(glCtx);
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.updateRelativeTransformFrustum(left, right, bottom, top, zNear, zFar);
+ return;
+ }
+ if (isCachingEnabled()) {
+ matrixStack(glCtx).frustum((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar);
+ bumpMatrixGeneration(glCtx);
+ }
+ }
+
+ public static void glPushMatrix() {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.pushMatrix();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPushMatrix(); // Handles flush + relativeTransform stack
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Only track stack on main thread (splash thread has separate GL context)
+ if (isCachingEnabled()) {
+ try {
+ matrixStack(glCtx).pushMatrix();
+ } catch (IllegalStateException ignored) {
+ glCtx.exitCapture.reject();
+ if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack overflow ", new Throwable());
+ }
+ }
+ }
+
+ public static void glPopMatrix() {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.popMatrix();
+ if (isUncapturedMatrix(glCtx)) beforeUncapturedStateChange();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPopMatrix(); // Handles flush + relativeTransform stack + lastRecordedTransform sync
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Only track stack on main thread (splash thread has separate GL context)
+ if (isCachingEnabled()) {
+ try {
+ matrixStack(glCtx).popMatrix();
+ bumpMatrixGeneration(glCtx);
+ } catch (IllegalStateException ignored) {
+ glCtx.exitCapture.reject();
+ if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack underflow ", new Throwable());
+ }
+ }
+ }
+
+ public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) {
+ final GLContextState glCtx = ctx();
+ glCtx.gluMatrix.identity().perspective((float) Math.toRadians(fovy), aspect, zNear, zFar);
+ glCtx.gluMatrix.get(0, glCtx.gluBuffer);
+ glMultMatrix(glCtx.gluBuffer);
+ }
+
+ public static void gluLookAt(float eyex, float eyey, float eyez, float centerx, float centery, float centerz, float upx, float upy, float upz) {
+ final GLContextState glCtx = ctx();
+ glCtx.gluMatrix.identity().lookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz);
+ glCtx.gluMatrix.get(0, glCtx.gluBuffer);
+ glMultMatrix(glCtx.gluBuffer);
+ }
+
+ public static void gluOrtho2D(float left, float right, float bottom, float top) {
+ glOrtho(left, right, bottom, top, -1.0, 1.0);
+ }
+
+ public static void gluPickMatrix(float x, float y, float deltaX, float deltaY, IntBuffer viewport) {
+ rejectExitCapture();
+ if (deltaX <= 0 || deltaY <= 0) return;
+ glTranslatef(
+ (viewport.get(viewport.position() + 2) - 2 * (x - viewport.get(viewport.position() + 0))) / deltaX,
+ (viewport.get(viewport.position() + 3) - 2 * (y - viewport.get(viewport.position() + 1))) / deltaY,
+ 0);
+ glScalef(viewport.get(viewport.position() + 2) / deltaX, viewport.get(viewport.position() + 3) / deltaY, 1.0f);
+ }
+
+ public static int gluBuild2DMipmaps(int target, int components, int width, int height, int format, int type, ByteBuffer data) {
+ if (width < 1 || height < 1) return GLU.GLU_INVALID_VALUE;
+ GLSMTextures.glTexImage2D(target, 0, components, width, height, 0, format, type, data);
+ GLSMTextures.glGenerateMipmap(target);
+ return 0;
+ }
+
+ public static String gluErrorString(int errorCode) {
+ return switch (errorCode) {
+ case GLU.GLU_INVALID_ENUM -> "Invalid enum (glu)";
+ case GLU.GLU_INVALID_VALUE -> "Invalid value (glu)";
+ case GLU.GLU_OUT_OF_MEMORY -> "Out of memory (glu)";
+ case GL11.GL_NO_ERROR -> "No error";
+ case GL11.GL_INVALID_ENUM -> "Invalid enum";
+ case GL11.GL_INVALID_VALUE -> "Invalid value";
+ case GL11.GL_INVALID_OPERATION -> "Invalid operation";
+ case GL11.GL_OUT_OF_MEMORY -> "Out of memory";
+ default -> "Unknown error: " + errorCode;
+ };
+ }
+
+ public static boolean gluUnProject(float winx, float winy, float winz, FloatBuffer modelMatrix, FloatBuffer projMatrix, IntBuffer viewport, FloatBuffer obj_pos) {
+ final GLContextState glCtx = ctx();
+ glCtx.gluMatrix.set(projMatrix).mul(glCtx.gluMatrix2.set(modelMatrix));
+ if (Math.abs(glCtx.gluMatrix.determinant()) < 1.0e-10f) return false;
+ glCtx.gluMatrix.invert(glCtx.gluMatrix);
+
+ float ndcX = (winx - viewport.get(viewport.position())) / viewport.get(viewport.position() + 2) * 2.0f - 1.0f;
+ float ndcY = (winy - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3) * 2.0f - 1.0f;
+ float ndcZ = winz * 2.0f - 1.0f;
+
+ glCtx.gluVec4.set(ndcX, ndcY, ndcZ, 1.0f);
+ glCtx.gluMatrix.transform(glCtx.gluVec4);
+ if (glCtx.gluVec4.w == 0.0f) return false;
+
+ float invW = 1.0f / glCtx.gluVec4.w;
+ obj_pos.put(obj_pos.position(), glCtx.gluVec4.x * invW);
+ obj_pos.put(obj_pos.position() + 1, glCtx.gluVec4.y * invW);
+ obj_pos.put(obj_pos.position() + 2, glCtx.gluVec4.z * invW);
+ return true;
+ }
+
+ public static int getMvGeneration() {
+ return ctx().mvGeneration;
+ }
+
+ public static int getMvLinearGeneration() {
+ return ctx().mvLinearGeneration;
+ }
+
+ public static int getProjGeneration() {
+ return ctx().projGeneration;
+ }
+
+ public static int getTexMatrixGeneration() {
+ return ctx().texMatrixGeneration;
+ }
+
+ public static MatrixModeStack getMatrixMode() {
+ return ctx().matrixMode;
+ }
+
+ public static Matrix4fStack getModelViewMatrix() {
+ return ctx().modelViewMatrix;
+ }
+
+ public static Matrix4fStack getProjectionMatrix() {
+ return ctx().projectionMatrix;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java
new file mode 100644
index 000000000..f582fd7f3
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java
@@ -0,0 +1,613 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
+import com.gtnewhorizon.gtnhlib.bytebuf.Pointer;
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
+import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
+import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+import lombok.Getter;
+import org.lwjgl.opengl.ARBShaderObjects;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.KHRDebug;
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.charset.StandardCharsets;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMPrograms {
+
+ private GLSMPrograms() {}
+
+ public static long programSwitches;
+
+ private static final String TEXTURE = "texture";
+ private static final String TEXTURE_RENAMED = "gtexture";
+ public static void setFfpInstancing(Instancing mode) {
+ ctx().ffpInstancing = mode;
+ }
+
+ public static void glUseProgram(int program) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordUseProgram(program);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+
+ final ShaderManager ffp = glCtx.ffp;
+ if (program == 0 && ffp.isEnabled()) {
+ final int prev = glCtx.activeProgram;
+ final boolean changed = prev != 0;
+ if (changed) glCtx.programGeneration++;
+ glCtx.activeProgram = 0; // Track that FFP was requested
+ if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
+ GLSMHooks.programChangeEvent.previousProgram = prev;
+ GLSMHooks.programChangeEvent.newProgram = 0;
+ GLSMHooks.programChangeEvent.postBind = false;
+ GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
+ }
+ ffp.activate();
+ if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
+ GLSMHooks.programChangeEvent.previousProgram = prev;
+ GLSMHooks.programChangeEvent.newProgram = 0;
+ GLSMHooks.programChangeEvent.postBind = true;
+ GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
+ }
+ return;
+ }
+
+ // Non-zero program or FFP emulation not enabled
+ if (program == 0) {
+ warnOnce("useprogram-zero-ffp-disabled",
+ "[FFP] glUseProgram(0) reached the driver because emulation is disabled");
+ }
+ if (ffp.isActive()) {
+ ffp.deactivate();
+ }
+
+ final boolean caching = isCachingEnabled();
+ if (!caching || program != glCtx.activeProgram) {
+ if (Tracy.ENABLED) programSwitches++;
+ glCtx.programGeneration++;
+ final int prev = glCtx.activeProgram;
+ glCtx.activeProgram = program;
+ if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
+ GLSMHooks.programChangeEvent.previousProgram = prev;
+ GLSMHooks.programChangeEvent.newProgram = program;
+ GLSMHooks.programChangeEvent.postBind = false;
+ GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
+ }
+ if (initConfig != null && initConfig.isLwjglDebug()) {
+ final String programName = GLDebug.getObjectLabel(KHRDebug.GL_PROGRAM, program);
+ GLDebug.debugMessage("Activating Program - " + program + ":" + programName);
+ }
+ RENDER_BACKEND.useProgram(program);
+ if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
+ GLSMHooks.programChangeEvent.previousProgram = prev;
+ GLSMHooks.programChangeEvent.newProgram = program;
+ GLSMHooks.programChangeEvent.postBind = true;
+ GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
+ }
+ }
+ }
+
+ public static void glShaderSource(int shader, CharSequence source) {
+ rejectExitCapture();
+ String src = source.toString();
+ // Always rename reserved words for the target GLSL version (e.g. 'sampler' at 460)
+ src = GlslTransformUtils.renameReservedWords(src, RENDER_BACKEND.getMinGLSLVersion());
+ if (ShaderManager.isEnabled()) {
+ final int shaderType = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE);
+ src = CompatShaderTransformer.transform(src, shaderType, shaderType == GL20.GL_FRAGMENT_SHADER);
+ }
+ RENDER_BACKEND.shaderSource(shader, src);
+ }
+
+ public static void nglShaderSource(int shader, int count, long strings, long lengths) {
+ rejectExitCapture();
+ if (count <= 0) return;
+ final CharSequence source;
+ if (count == 1) {
+ source = decodeShaderSourceString(strings, lengths, 0);
+ } else {
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < count; i++) sb.append(decodeShaderSourceString(strings, lengths, i));
+ source = sb.toString();
+ }
+ glShaderSource(shader, source);
+ }
+
+ private static String decodeShaderSourceString(long strings, long lengths, int i) {
+ final long strAddr = MemoryUtilities.memGetAddress(strings + (long) i * Pointer.POINTER_SIZE);
+ final int len = lengths == MemoryUtilities.NULL ? -1 : MemoryUtilities.memGetInt(lengths + (long) i * 4);
+ return len < 0 ? MemoryUtilities.memUTF8(strAddr) : MemoryUtilities.memUTF8(strAddr, len);
+ }
+
+ public static void glShaderSource(int shader, ByteBuffer source) {
+ final byte[] bytes = new byte[source.remaining()];
+ final int pos = source.position();
+ source.get(bytes);
+ source.position(pos);
+ glShaderSource(shader, new String(bytes, StandardCharsets.UTF_8));
+ }
+
+ public static void glShaderSource(int shader, CharSequence[] sources) {
+ int totalLen = 0;
+ for (CharSequence s : sources) totalLen += s.length();
+ final StringBuilder sb = new StringBuilder(totalLen);
+ for (CharSequence s : sources) sb.append(s);
+ glShaderSource(shader, sb.toString());
+ }
+
+ public static void glSpecializeShader(int shader, CharSequence entryPoint, IntBuffer constantIndex, IntBuffer constantValue) {
+ rejectExitCapture();
+ RENDER_BACKEND.specializeShader(shader, entryPoint, constantIndex, constantValue);
+ }
+
+ public static int glGetUniformBlockIndex(int program, CharSequence name) { rejectExitCapture(); return RENDER_BACKEND.getUniformBlockIndex(program, name); }
+ public static void glUniformBlockBinding(int program, int blockIndex, int binding) { rejectExitCapture(); RENDER_BACKEND.uniformBlockBinding(program, blockIndex, binding); }
+ public static void glBindFragDataLocation(int program, int colorNumber, CharSequence name) { rejectExitCapture(); RENDER_BACKEND.bindFragDataLocation(program, colorNumber, name); }
+ public static void glUniform3(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform3fv(location, values); }
+ public static void glUniform4(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform4fv(location, values); }
+
+ public static void glLinkProgram(int program) {
+ rejectExitCapture();
+ if (ShaderManager.isEnabled()) {
+ generateVertexShaderIfNeeded(program);
+ }
+ if (ProgramBinaryCache.isEnabled()) {
+ ProgramBinaryCache.markRetrievable(program);
+ }
+ RENDER_BACKEND.linkProgram(program);
+ if (ShaderManager.isEnabled() && RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) {
+ LOGGER.warn("Program {} failed to link: {}", program, RENDER_BACKEND.getProgramInfoLog(program));
+ }
+ CompatUniformManager.onLinkProgram(program);
+ }
+
+ public static void glProgramParameteri(int program, int pname, int value) {
+ rejectExitCapture();
+ RENDER_BACKEND.programParameteri(program, pname, value);
+ }
+
+ public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) {
+ rejectExitCapture();
+ RENDER_BACKEND.getProgramBinary(program, length, binaryFormat, binary);
+ }
+
+ public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) {
+ rejectExitCapture();
+ RENDER_BACKEND.programBinary(program, binaryFormat, binary);
+ if (RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_TRUE) {
+ CompatUniformManager.onLinkProgram(program);
+ }
+ }
+
+ /**
+ * If a program has a fragment shader but no vertex shader, generate a passthrough vertex shader from the fragment's in declarations and attach it.
+ */
+ private static void generateVertexShaderIfNeeded(int program) {
+ final GLContextState glCtx = ctx();
+ final int shaderCount = RENDER_BACKEND.getProgrami(program, GL20.GL_ATTACHED_SHADERS);
+ if (shaderCount == 0 || shaderCount > glCtx.shaderBuf.capacity()) return;
+
+ glCtx.shaderBuf.clear().limit(shaderCount);
+ RENDER_BACKEND.getAttachedShaders(program, null, glCtx.shaderBuf);
+
+ int fragmentShader = 0;
+ boolean hasVertex = false;
+ for (int i = 0; i < shaderCount; i++) {
+ final int shader = glCtx.shaderBuf.get(i);
+ final int type = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE);
+ if (type == GL20.GL_VERTEX_SHADER) {
+ hasVertex = true;
+ break;
+ } else if (type == GL20.GL_FRAGMENT_SHADER) {
+ fragmentShader = shader;
+ }
+ }
+
+ if (hasVertex || fragmentShader == 0) return;
+
+ // Fragment-only program - generate a passthrough vertex shader
+ final String fragSource = RENDER_BACKEND.getShaderSource(fragmentShader, 65536);
+ String vertSource = CompatShaderTransformer.generatePassthroughVertexShader(fragSource);
+ if (RenderSystem.isGLES()) {
+ vertSource = CompatShaderTransformer.toGLES(vertSource, GL20.GL_VERTEX_SHADER, false);
+ }
+
+ final int vertShader = RENDER_BACKEND.createShader(GL20.GL_VERTEX_SHADER);
+ RENDER_BACKEND.shaderSource(vertShader, vertSource);
+ RENDER_BACKEND.compileShader(vertShader);
+
+ if (RENDER_BACKEND.getShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
+ final String log = RENDER_BACKEND.getShaderInfoLog(vertShader, 8192);
+ LOGGER.warn("CompatShaderTransformer: Generated passthrough vertex shader failed to compile:\n{}\nSource:\n{}", log, vertSource);
+ RENDER_BACKEND.deleteShader(vertShader);
+ return;
+ }
+
+ LOGGER.debug("CompatShaderTransformer: Generated passthrough vertex shader for fragment-only program {}", program);
+ RENDER_BACKEND.attachShader(program, vertShader);
+ RENDER_BACKEND.deleteShader(vertShader);
+ }
+
+ @Getter
+ static long programLifetimeGeneration;
+ private static final IntOpenHashSet programsPendingDeletion = new IntOpenHashSet();
+
+ public static boolean isProgramPendingDeletion(int program) {
+ return programsPendingDeletion.contains(program);
+ }
+
+ public static void glDeleteProgram(int program) {
+ rejectExitCapture();
+ if (program == 0) return;
+ CompatUniformManager.onDeleteProgram(program);
+
+ // GL defers deletion of a bound program until unbind; activeProgram stays set so the
+ // cache matches GL_CURRENT_PROGRAM and the next glUseProgram is not skipped as redundant.
+ if (GLSMHooks.PROGRAM_DELETE.hasListeners()) {
+ GLSMHooks.programDeleteEvent.program = program;
+ GLSMHooks.PROGRAM_DELETE.post(GLSMHooks.programDeleteEvent);
+ }
+ RENDER_BACKEND.deleteProgram(program);
+ programsPendingDeletion.add(program);
+ programsPendingDeletion.removeIf((int id) -> !RENDER_BACKEND.isProgram(id));
+ programLifetimeGeneration++;
+ }
+
+ public static int glCreateShader(int type) {
+ requireContext("glCreateShader");
+ return RENDER_BACKEND.createShader(type);
+ }
+
+ public static void glCompileShader(int shader) {
+ rejectExitCapture();
+ RENDER_BACKEND.compileShader(shader);
+ }
+
+ public static int glCreateProgram() {
+ requireContext("glCreateProgram");
+ final int program = RENDER_BACKEND.createProgram();
+ programsPendingDeletion.remove(program);
+ programLifetimeGeneration++;
+ return program;
+ }
+
+ public static void glAttachShader(int program, int shader) {
+ rejectExitCapture();
+ RENDER_BACKEND.attachShader(program, shader);
+ }
+
+ public static void glDetachShader(int program, int shader) {
+ rejectExitCapture();
+ RENDER_BACKEND.detachShader(program, shader);
+ }
+
+ public static void glDeleteShader(int shader) {
+ rejectExitCapture();
+ RENDER_BACKEND.deleteShader(shader);
+ }
+
+ public static void glBindAttribLocation(int program, int index, CharSequence name) {
+ rejectExitCapture();
+ RENDER_BACKEND.bindAttribLocation(program, index, name);
+ }
+
+ public static void glValidateProgram(int program) {
+ rejectExitCapture();
+ RENDER_BACKEND.validateProgram(program);
+ }
+
+ public static int glGetShaderi(int shader, int pname) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getShaderi(shader, pname);
+ }
+
+ public static String glGetShaderInfoLog(int shader, int maxLength) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getShaderInfoLog(shader, maxLength);
+ }
+
+ public static String glGetShaderInfoLog(int shader) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getShaderInfoLog(shader);
+ }
+
+ public static int glGetProgrami(int program, int pname) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getProgrami(program, pname);
+ }
+
+ public static String glGetProgramInfoLog(int program, int maxLength) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getProgramInfoLog(program, maxLength);
+ }
+
+ public static String glGetProgramInfoLog(int program) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getProgramInfoLog(program);
+ }
+
+ public static boolean glIsProgram(int obj) {
+ rejectExitCapture();
+ final boolean valid = RENDER_BACKEND.isProgram(obj);
+ if (!valid) programsPendingDeletion.remove(obj);
+ return valid;
+ }
+
+ public static boolean glIsShader(int obj) {
+ rejectExitCapture();
+ return RENDER_BACKEND.isShader(obj);
+ }
+ public static void glDispatchCompute(int x, int y, int z) { rejectExitCapture(); RENDER_BACKEND.dispatchCompute(x, y, z); }
+
+ public static int glGetUniformLocation(int program, CharSequence name) {
+ rejectExitCapture();
+ int loc = RENDER_BACKEND.getUniformLocation(program, name);
+ if (loc == -1 && TEXTURE.contentEquals(name)) {
+ loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED);
+ }
+ return loc;
+ }
+
+ public static int glGetUniformLocation(int program, ByteBuffer name) {
+ rejectExitCapture();
+ int loc = RENDER_BACKEND.getUniformLocation(program, name);
+ if (loc == -1 && isTextureBuffer(name)) {
+ loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED);
+ }
+ return loc;
+ }
+
+ public static int glGetAttribLocation(int program, CharSequence name) {
+ rejectExitCapture();
+ int loc = RENDER_BACKEND.getAttribLocation(program, name);
+ if (loc == -1 && TEXTURE.contentEquals(name)) {
+ loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED);
+ }
+ return loc;
+ }
+
+ public static int glGetAttribLocation(int program, ByteBuffer name) {
+ rejectExitCapture();
+ int loc = RENDER_BACKEND.getAttribLocation(program, name);
+ if (loc == -1 && isTextureBuffer(name)) {
+ loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED);
+ }
+ return loc;
+ }
+
+ private static final ByteBuffer TEXTURE_BYTES = ByteBuffer.wrap(TEXTURE.getBytes(StandardCharsets.US_ASCII));
+
+ private static boolean isTextureBuffer(ByteBuffer buf) {
+ final int len = buf.remaining();
+ if (len != 7 && len != 8) return false;
+ // I believe the driver accepts null terminated or not
+ if (len == 8 && buf.get(buf.position() + 7) != 0) return false;
+ return buf.slice(buf.position(), 7).equals(TEXTURE_BYTES);
+ }
+
+ public static void glDeleteObjectARB(int obj) {
+ rejectExitCapture();
+ if (RENDER_BACKEND.isShader(obj)) {
+ RENDER_BACKEND.deleteShader(obj);
+ } else {
+ glDeleteProgram(obj);
+ }
+ }
+
+ public static int glGetHandleARB(int pname) {
+ rejectExitCapture();
+ return pname == ARBShaderObjects.GL_PROGRAM_OBJECT_ARB ? GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM) : RENDER_BACKEND.getInteger(pname);
+ }
+
+ public static void glGetObjectParameterARB(int obj, int pname, IntBuffer params) {
+ rejectExitCapture();
+ final var backend = RENDER_BACKEND;
+ if (backend.isShader(obj)) {
+ params.put(params.position(), backend.getShaderi(obj, pname));
+ } else {
+ backend.getProgramiv(obj, pname, params);
+ }
+ }
+
+ public static void glGetObjectParameterARB(int obj, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final var backend = RENDER_BACKEND;
+ params.put(params.position(), (float) (backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname)));
+ }
+
+ public static int glGetObjectParameteriARB(int obj, int pname) {
+ rejectExitCapture();
+ final var backend = RENDER_BACKEND;
+ return backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname);
+ }
+
+ public static String glGetInfoLogARB(int obj, int maxLength) {
+ rejectExitCapture();
+ final var backend = RENDER_BACKEND;
+ return backend.isShader(obj) ? backend.getShaderInfoLog(obj, maxLength) : backend.getProgramInfoLog(obj, maxLength);
+ }
+
+ public static void glGetInfoLogARB(int obj, IntBuffer length, ByteBuffer infoLog) {
+ rejectExitCapture();
+ final var backend = RENDER_BACKEND;
+ if (backend.isShader(obj)) {
+ backend.getShaderInfoLog(obj, length, infoLog);
+ } else {
+ backend.getProgramInfoLog(obj, length, infoLog);
+ }
+ }
+
+ public static void glUniform1f(int location, float v0) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform1f(location, v0);
+ }
+
+ public static void glUniform2f(int location, float v0, float v1) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform2f(location, v0, v1);
+ }
+
+ public static void glUniform3f(int location, float v0, float v1, float v2) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform3f(location, v0, v1, v2);
+ }
+
+ public static void glUniform4f(int location, float v0, float v1, float v2, float v3) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform4f(location, v0, v1, v2, v3);
+ }
+
+ public static void glUniform1i(int location, int v0) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform1i(location, v0);
+ }
+
+ public static void glUniform2i(int location, int v0, int v1) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform2i(location, v0, v1);
+ }
+
+ public static void glUniform3i(int location, int v0, int v1, int v2) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform3i(location, v0, v1, v2);
+ }
+
+ public static void glUniform4i(int location, int v0, int v1, int v2, int v3) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform4i(location, v0, v1, v2, v3);
+ }
+
+ public static void glUniform1(int location, FloatBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform1fv(location, values);
+ }
+
+ public static void glUniform1(int location, IntBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform1iv(location, values);
+ }
+
+ public static void glUniform2(int location, FloatBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform2(location, values);
+ }
+
+ public static void glUniform2(int location, IntBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform2iv(location, values);
+ }
+
+ public static void glUniform3(int location, FloatBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform3(location, values);
+ }
+
+ public static void glUniform3(int location, IntBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform3iv(location, values);
+ }
+
+ public static void glUniform4(int location, FloatBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform4(location, values);
+ }
+
+ public static void glUniform4(int location, IntBuffer values) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniform4iv(location, values);
+ }
+
+ public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer matrices) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniformMatrix2(location, transpose, matrices);
+ }
+
+ public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer matrices) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniformMatrix3(location, transpose, matrices);
+ }
+
+ public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer matrices) {
+ rejectExitCapture();
+ RENDER_BACKEND.uniformMatrix4(location, transpose, matrices);
+ }
+
+ public static void glGetActiveUniform(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) {
+ rejectExitCapture();
+ RENDER_BACKEND.getActiveUniform(program, index, length, size, type, name);
+ }
+
+ public static void glGetActiveAttrib(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) {
+ rejectExitCapture();
+ RENDER_BACKEND.getActiveAttrib(program, index, length, size, type, name);
+ }
+
+ public static String glGetActiveAttrib(int program, int index, int maxLength, IntBuffer sizeType) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getActiveAttrib(program, index, maxLength, sizeType);
+ }
+
+ public static void glGetAttachedShaders(int program, IntBuffer count, IntBuffer shaders) {
+ rejectExitCapture();
+ RENDER_BACKEND.getAttachedShaders(program, count, shaders);
+ }
+
+ public static String glGetShaderSource(int shader, int maxLength) {
+ rejectExitCapture();
+ return RENDER_BACKEND.getShaderSource(shader, maxLength);
+ }
+
+ public static void glGetShaderSource(int shader, IntBuffer length, ByteBuffer source) {
+ rejectExitCapture();
+ RENDER_BACKEND.getShaderSource(shader, length, source);
+ }
+
+ public static void glGetUniform(int program, int location, FloatBuffer params) {
+ rejectExitCapture();
+ RENDER_BACKEND.getUniformfv(program, location, params);
+ }
+
+ public static void glGetUniform(int program, int location, IntBuffer params) {
+ rejectExitCapture();
+ RENDER_BACKEND.getUniformiv(program, location, params);
+ }
+
+ public static int getProgramGeneration() {
+ return ctx().programGeneration;
+ }
+
+ public static IntegerStateStack getProgramStack() {
+ return ctx().programStack;
+ }
+
+ public static BooleanStateStack getVertexProgramTwoSideState() {
+ return ctx().vertexProgramTwoSideState;
+ }
+
+ public static int getActiveProgram() {
+ return ctx().activeProgram;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java
new file mode 100644
index 000000000..a48b6e789
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java
@@ -0,0 +1,594 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.states.PolygonState;
+import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding;
+import org.joml.Vector3f;
+import org.joml.Vector4f;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL21;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL31;
+import org.lwjgl.opengl.GL33;
+import org.lwjgl.opengl.GL42;
+import org.lwjgl.opengl.GL43;
+import java.nio.ByteBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.HAS_MULTIPLE_SET;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_ATTRIB_STACK_DEPTH;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_CLIP_PLANES;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_LEGACY_TEXTURE_UNITS;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_MODELVIEW_STACK_DEPTH;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_PROJECTION_STACK_DEPTH;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_COORDS;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_STACK_DEPTH;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMQueries {
+
+ private GLSMQueries() {}
+
+ public static boolean glGetBoolean(int pname) {
+ rejectExitCapture();
+ return glGetBoolean(ctx(), pname);
+ }
+
+ static boolean glGetBoolean(GLContextState glCtx, int pname) {
+ if (!isCachingEnabled()) {
+ return RENDER_BACKEND.getBoolean(pname);
+ }
+ // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
+ if (pname >= GL11.GL_CLIP_PLANE0 && pname < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
+ return glCtx.clipPlaneStates[pname - GL11.GL_CLIP_PLANE0].isEnabled();
+ }
+
+ return switch (pname) {
+ case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled();
+ case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled();
+ case GL11.GL_BLEND -> glCtx.blendMode.isEnabled();
+ case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled();
+ case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled();
+ case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled();
+ case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled();
+ case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled();
+ case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled();
+ case GL11.GL_DITHER -> glCtx.ditherState.isEnabled();
+ case GL11.GL_FOG -> glCtx.fogMode.isEnabled();
+ case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled();
+ case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled();
+ case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled();
+ case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled();
+ case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled();
+ case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled();
+ case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled();
+ case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled();
+ case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled();
+ case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled();
+ case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled();
+ case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled();
+ case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled();
+ case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled();
+ case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled();
+ case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled();
+ case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled();
+ case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled();
+ case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled();
+ case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled();
+ case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled();
+ case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled();
+ case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled();
+ case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled();
+ case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled();
+ case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled();
+ case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled();
+ case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled();
+ case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled();
+ case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled();
+ case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled();
+ case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled();
+ case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled();
+ case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled();
+ case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled();
+ case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled();
+ case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled();
+ case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled();
+ case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled();
+ case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled();
+ case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled();
+ case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled();
+ case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.localViewer != 0.0f;
+ case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.twoSide != 0.0f;
+ case GL11.GL_EDGE_FLAG -> glCtx.edgeFlagState.isEnabled();
+ default -> {
+ final int conv = GLSMVertexInput.clientStateToConventional(glCtx, pname);
+ if (conv >= 0) yield glCtx.vaos.isConventionalEnabled(conv);
+ final int desc = LegacyQueries.desc(pname);
+ yield desc != 0 ? LegacyQueries.getBoolean(glCtx, pname, desc) : RENDER_BACKEND.getBoolean(pname);
+ }
+ };
+ }
+
+ public static void glGetBoolean(int pname, ByteBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) {
+ RENDER_BACKEND.getBoolean(pname, params);
+ return;
+ }
+
+ switch (pname) {
+ case GL11.GL_COLOR_WRITEMASK -> {
+ final int pos = params.position();
+ params.put(pos, (byte) (glCtx.colorMask.red ? GL11.GL_TRUE : GL11.GL_FALSE));
+ params.put(pos + 1, (byte) (glCtx.colorMask.green ? GL11.GL_TRUE : GL11.GL_FALSE));
+ params.put(pos + 2, (byte) (glCtx.colorMask.blue ? GL11.GL_TRUE : GL11.GL_FALSE));
+ params.put(pos + 3, (byte) (glCtx.colorMask.alpha ? GL11.GL_TRUE : GL11.GL_FALSE));
+ }
+ default -> {
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
+ params.put(params.position(), (byte) (glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE));
+ } else if (!LegacyQueries.getBooleanv(glCtx, pname, params)) {
+ RENDER_BACKEND.getBoolean(pname, params);
+ }
+ }
+ }
+ }
+
+ public static int glGetInteger(int pname) {
+ rejectExitCapture();
+ return glGetInteger(ctx(), pname);
+ }
+
+ static int glGetInteger(GLContextState glCtx, int pname) {
+ if (!isCachingEnabled()) {
+ return RENDER_BACKEND.getInteger(pname);
+ }
+
+ return switch (pname) {
+ case GL11.GL_ALPHA_TEST_FUNC -> glCtx.alphaState.getFunction();
+ case GL11.GL_DEPTH_FUNC -> glCtx.depthState.getFunc();
+ case GL11.GL_LIST_BASE -> glCtx.listBase;
+ case GL11.GL_LIST_MODE -> DisplayListManager.getListMode();
+ case GL11.GL_MATRIX_MODE -> glCtx.matrixMode.getMode();
+ case GL11.GL_SHADE_MODEL -> glCtx.shadeModelState.getValue();
+ // GL_TEXTURE_2D makes no sense here, but some mod still queries it...
+ case GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BINDING_2D -> GLSMTextures.getBoundTextureForServerState();
+ case GL13.GL_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + GLSMTextures.getActiveTextureUnitForServerState();
+ case GL13.GL_CLIENT_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + glCtx.clientActiveTextureUnit;
+ case GL11.GL_COLOR_MATERIAL_FACE -> glCtx.colorMaterialFace.getValue();
+ case GL11.GL_COLOR_MATERIAL_PARAMETER -> glCtx.colorMaterialParameter.getValue();
+ case GL11.GL_MODELVIEW_STACK_DEPTH -> GLSMMatrices.getMatrixStackDepth(glCtx.modelViewMatrix);
+ case GL11.GL_PROJECTION_STACK_DEPTH -> GLSMMatrices.getMatrixStackDepth(glCtx.projectionMatrix);
+ case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled() ? GL11.GL_TRUE : GL11.GL_FALSE;
+ case GL11.GL_CULL_FACE_MODE -> glCtx.polygonState.getCullFaceMode();
+ case GL11.GL_FRONT_FACE -> glCtx.polygonState.getFrontFace();
+ case GL11.GL_POLYGON_MODE -> glCtx.polygonState.getFrontMode();
+ case GL11.GL_UNPACK_ALIGNMENT -> glCtx.pixelUnpackState.alignment();
+ case GL11.GL_UNPACK_ROW_LENGTH -> glCtx.pixelUnpackState.rowLength();
+ case GL11.GL_UNPACK_SKIP_ROWS -> glCtx.pixelUnpackState.skipRows();
+ case GL11.GL_UNPACK_SKIP_PIXELS -> glCtx.pixelUnpackState.skipPixels();
+
+ case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.colorControl;
+
+ case GL14.GL_BLEND_DST_ALPHA -> glCtx.blendState.getDstAlpha();
+ case GL11.GL_BLEND_DST, GL14.GL_BLEND_DST_RGB -> glCtx.blendState.getDstRgb();
+ case GL14.GL_BLEND_SRC_ALPHA -> glCtx.blendState.getSrcAlpha();
+ case GL11.GL_BLEND_SRC, GL14.GL_BLEND_SRC_RGB -> glCtx.blendState.getSrcRgb();
+ case GL14.GL_BLEND_EQUATION -> glCtx.blendState.getEquationRgb();
+ case GL20.GL_BLEND_EQUATION_ALPHA -> glCtx.blendState.getEquationAlpha();
+
+ case GL11.GL_LOGIC_OP_MODE -> glCtx.logicOpMode.getValue();
+ case GL11.GL_DRAW_BUFFER -> glCtx.drawBuffer.getValue();
+
+ case GL11.GL_STENCIL_FUNC -> glCtx.stencilState.getFuncFront();
+ case GL11.GL_STENCIL_REF -> glCtx.stencilState.getRefFront();
+ case GL11.GL_STENCIL_VALUE_MASK -> glCtx.stencilState.getValueMaskFront();
+ case GL11.GL_STENCIL_FAIL -> glCtx.stencilState.getFailOpFront();
+ case GL11.GL_STENCIL_PASS_DEPTH_FAIL -> glCtx.stencilState.getZFailOpFront();
+ case GL11.GL_STENCIL_PASS_DEPTH_PASS -> glCtx.stencilState.getZPassOpFront();
+ case GL11.GL_STENCIL_WRITEMASK -> glCtx.stencilState.getWriteMaskFront();
+ case GL11.GL_STENCIL_CLEAR_VALUE -> glCtx.stencilState.getClearValue();
+
+ case GL15.GL_ARRAY_BUFFER_BINDING -> glCtx.boundVBO;
+ case GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING -> glCtx.vaos.boundEBO;
+ case GL21.GL_PIXEL_UNPACK_BUFFER_BINDING -> glCtx.boundPixelUnpackBuffer;
+ case GL21.GL_PIXEL_PACK_BUFFER_BINDING -> glCtx.boundPixelPackBuffer;
+
+ case GL20.GL_CURRENT_PROGRAM -> glCtx.activeProgram;
+
+ case GL30.GL_VERTEX_ARRAY_BINDING -> glCtx.boundVAO;
+
+ case GL30.GL_DRAW_FRAMEBUFFER_BINDING -> glCtx.drawFramebuffer;
+ case GL30.GL_READ_FRAMEBUFFER_BINDING -> glCtx.readFramebuffer;
+
+ case GL33.GL_SAMPLER_BINDING -> glCtx.samplerUnits.get(glCtx.activeTextureUnit.getValue());
+
+ default -> switch (pname) {
+ case GL11.GL_FOG_MODE -> glCtx.fogState.getFogMode();
+ case GL11.GL_LINE_STIPPLE_PATTERN -> glCtx.lineState.getStipplePattern() & 0xFFFF;
+ case GL11.GL_LINE_STIPPLE_REPEAT -> glCtx.lineState.getStippleFactor();
+ case GL11.GL_LIST_INDEX -> DisplayListManager.isRecording() ? Math.max(DisplayListManager.getRecordingListId(), 0) : 0;
+ case GL11.GL_ATTRIB_STACK_DEPTH -> glCtx.attribDepth;
+ case GL11.GL_CLIENT_ATTRIB_STACK_DEPTH -> glCtx.clientAttribStackPointer;
+ case GL11.GL_TEXTURE_STACK_DEPTH -> GLSMMatrices.getMatrixStackDepth(glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue()));
+ case GL11.GL_MAX_ATTRIB_STACK_DEPTH -> MAX_ATTRIB_STACK_DEPTH;
+ case GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH -> GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH;
+ case GL11.GL_MAX_MODELVIEW_STACK_DEPTH -> MAX_MODELVIEW_STACK_DEPTH;
+ case GL11.GL_MAX_PROJECTION_STACK_DEPTH -> MAX_PROJECTION_STACK_DEPTH;
+ case GL11.GL_MAX_TEXTURE_STACK_DEPTH -> MAX_TEXTURE_STACK_DEPTH;
+ case GL13.GL_MAX_TEXTURE_UNITS -> MAX_LEGACY_TEXTURE_UNITS;
+ case GL11.GL_MAX_LIGHTS -> glCtx.lightStates.length;
+ case GL11.GL_STENCIL_BITS -> GLSMFramebuffer.drawFramebufferBits(glCtx, true);
+ case GL11.GL_DEPTH_BITS -> GLSMFramebuffer.drawFramebufferBits(glCtx, false);
+ case GL20.GL_MAX_TEXTURE_COORDS -> MAX_TEXTURE_COORDS;
+ case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> glCtx.pointState.getSpriteCoordOrigin();
+ case GL11.GL_RENDER_MODE -> FeedbackManager.getRenderMode();
+ default -> {
+ final int shift = GLSMRasterizer.hintShift(pname);
+ if (shift >= 0) yield GLSMRasterizer.hintMode(glCtx.hintState.getValue(), shift);
+ final int key = GLSMVertexInput.clientArrayField(glCtx, pname);
+ if (key >= 0 && (key & ~0xFF) != GLSMVertexInput.FIELD_POINTER) yield GLSMVertexInput.clientArrayParam(glCtx, key);
+ final int desc = LegacyQueries.desc(pname);
+ yield desc != 0 ? LegacyQueries.getInteger(glCtx, pname, desc) : RENDER_BACKEND.getInteger(pname);
+ }
+ };
+ };
+ }
+
+ public static void glGetInteger(int pname, IntBuffer params) {
+ rejectExitCapture();
+ if (!isCachingEnabled()) {
+ RENDER_BACKEND.getInteger(pname, params);
+ return;
+ }
+
+ switch (pname) {
+ case GL11.GL_VIEWPORT -> ctx().viewportState.get(params);
+ case GL11.GL_SCISSOR_BOX -> ctx().scissorState.get(params);
+ case GL11.GL_POLYGON_MODE -> {
+ final PolygonState polygon = ctx().polygonState;
+ final int pos = params.position();
+ params.put(pos, polygon.getFrontMode());
+ params.put(pos + 1, polygon.getBackMode());
+ }
+ default -> {
+ final GLContextState glCtx = ctx();
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
+ params.put(params.position(), glGetInteger(glCtx, pname));
+ } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) {
+ RENDER_BACKEND.getInteger(pname, params);
+ }
+ }
+ }
+ }
+
+ public static void glGetFloat(int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) {
+ RENDER_BACKEND.getFloat(pname, params);
+ return;
+ }
+
+ switch (pname) {
+ case GL11.GL_MODELVIEW_MATRIX -> glCtx.modelViewMatrix.get(params.position(), params);
+ case GL11.GL_PROJECTION_MATRIX -> glCtx.projectionMatrix.get(params.position(), params);
+ case GL11.GL_TEXTURE_MATRIX -> glCtx.textures.getTextureUnitMatrix(GLSMTextures.getActiveTextureUnit()).get(params.position(), params);
+ case GL11.GL_COLOR_CLEAR_VALUE -> glCtx.clearColor.get(params);
+ case GL11.GL_CURRENT_COLOR -> glCtx.color.get(params);
+ case GL14.GL_CURRENT_SECONDARY_COLOR -> glCtx.secondaryColor.get(params);
+ case GL11.GL_DEPTH_RANGE -> {
+ final int pos = params.position();
+ params.put(pos, (float) glCtx.viewportState.depthRangeNear);
+ params.put(pos + 1, (float) glCtx.viewportState.depthRangeFar);
+ }
+ case GL14.GL_BLEND_COLOR -> {
+ final int pos = params.position();
+ params.put(pos, glCtx.blendState.getBlendColorR());
+ params.put(pos + 1, glCtx.blendState.getBlendColorG());
+ params.put(pos + 2, glCtx.blendState.getBlendColorB());
+ params.put(pos + 3, glCtx.blendState.getBlendColorA());
+ }
+ case GL11.GL_CURRENT_NORMAL -> {
+ final Vector3f normal = glCtx.ffp.currentNormal;
+ final int pos = params.position();
+ params.put(pos, normal.x);
+ params.put(pos + 1, normal.y);
+ params.put(pos + 2, normal.z);
+ }
+ case GL11.GL_CURRENT_TEXTURE_COORDS -> {
+ final int unit = glCtx.activeTextureUnit.getValue();
+ final int pos = params.position();
+ if (unit == 1) {
+ params.put(pos, glCtx.lastBrightnessX);
+ params.put(pos + 1, glCtx.lastBrightnessY);
+ params.put(pos + 2, 0.0f);
+ params.put(pos + 3, 1.0f);
+ } else if (unit >= 0 && unit < glCtx.ffp.currentTexCoords.length) {
+ final Vector4f tc = glCtx.ffp.currentTexCoords[unit];
+ params.put(pos, tc.x);
+ params.put(pos + 1, tc.y);
+ params.put(pos + 2, tc.z);
+ params.put(pos + 3, tc.w);
+ } else {
+ params.put(pos, 0.0f);
+ params.put(pos + 1, 0.0f);
+ params.put(pos + 2, 0.0f);
+ params.put(pos + 3, 1.0f);
+ }
+ }
+ case GL11.GL_FOG_COLOR -> {
+ final FloatBuffer fogBuf = glCtx.fogState.getFogColorBuffer();
+ final int pos = params.position();
+ params.put(pos, fogBuf.get(0));
+ params.put(pos + 1, fogBuf.get(1));
+ params.put(pos + 2, fogBuf.get(2));
+ params.put(pos + 3, fogBuf.get(3));
+ }
+ case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.ambient.get(params.position(), params);
+ case GL14.GL_POINT_DISTANCE_ATTENUATION -> {
+ final int pos = params.position();
+ params.put(pos, glCtx.pointState.getAttenuationConstant());
+ params.put(pos + 1, glCtx.pointState.getAttenuationLinear());
+ params.put(pos + 2, glCtx.pointState.getAttenuationQuadratic());
+ }
+ default -> {
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
+ params.put(params.position(), glGetFloat(glCtx, pname));
+ } else {
+ RENDER_BACKEND.getFloat(pname, params);
+ }
+ }
+ }
+ }
+
+ public static float glGetFloat(int pname) {
+ rejectExitCapture();
+ return glGetFloat(ctx(), pname);
+ }
+
+ static float glGetFloat(GLContextState glCtx, int pname) {
+ return switch (pname) {
+ case GL11.GL_ALPHA_TEST_REF -> glCtx.alphaState.getReference();
+ case GL11.GL_FOG_DENSITY -> glCtx.fogState.getDensity();
+ case GL11.GL_FOG_START -> glCtx.fogState.getStart();
+ case GL11.GL_FOG_END -> glCtx.fogState.getEnd();
+ case GL11.GL_DEPTH_CLEAR_VALUE -> (float) glCtx.depthState.getClearValue();
+ case GL11.GL_LINE_WIDTH -> glCtx.lineState.getWidth();
+ case GL11.GL_POINT_SIZE -> glCtx.pointState.getSize();
+ case GL14.GL_POINT_SIZE_MIN -> glCtx.pointState.getMinSize();
+ case GL14.GL_POINT_SIZE_MAX -> Float.isNaN(glCtx.pointState.getMaxSize()) ? GLSMRasterizer.maxPointSize : glCtx.pointState.getMaxSize();
+ case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> glCtx.pointState.getFadeThreshold();
+ default -> {
+ final int desc = isCachingEnabled() ? LegacyQueries.desc(pname) : 0;
+ yield desc != 0 ? LegacyQueries.getFloat(glCtx, pname, desc) : RENDER_BACKEND.getFloat(pname);
+ }
+ };
+ }
+
+ public static void glGetFloat(int pname, float[] params) {
+ final FloatBuffer scratch = ctx().queryScratch;
+ final FloatBuffer buf;
+ if (params.length <= scratch.capacity()) {
+ buf = scratch;
+ buf.clear();
+ buf.limit(params.length);
+ } else {
+ buf = BufferUtils.createFloatBuffer(params.length);
+ }
+ glGetFloat(pname, buf);
+ buf.position(0);
+ buf.get(params);
+ }
+
+ public static double glGetDouble(int pname) {
+ rejectExitCapture();
+ return switch (pname) {
+ case GL11.GL_DEPTH_CLEAR_VALUE -> ctx().depthState.getClearValue();
+ default -> glGetFloat(pname);
+ };
+ }
+
+ public static void glGetDouble(int pname, DoubleBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) {
+ RENDER_BACKEND.getDouble(pname, params);
+ return;
+ }
+
+ final int pos = params.position();
+ switch (pname) {
+ case GL11.GL_DEPTH_CLEAR_VALUE -> params.put(pos, glCtx.depthState.getClearValue());
+ case GL11.GL_DEPTH_RANGE -> {
+ params.put(pos, glCtx.viewportState.depthRangeNear);
+ params.put(pos + 1, glCtx.viewportState.depthRangeFar);
+ }
+ case GL11.GL_MODELVIEW_MATRIX, GL11.GL_PROJECTION_MATRIX, GL11.GL_TEXTURE_MATRIX -> widenFromFloat(pname, params, 16);
+ case GL11.GL_COLOR_CLEAR_VALUE, GL11.GL_CURRENT_COLOR, GL11.GL_CURRENT_TEXTURE_COORDS, GL11.GL_FOG_COLOR,
+ GL11.GL_LIGHT_MODEL_AMBIENT, GL14.GL_BLEND_COLOR, GL14.GL_CURRENT_SECONDARY_COLOR -> widenFromFloat(pname, params, 4);
+ case GL11.GL_CURRENT_NORMAL, GL14.GL_POINT_DISTANCE_ATTENUATION -> widenFromFloat(pname, params, 3);
+ default -> {
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
+ params.put(pos, glGetDouble(pname));
+ } else {
+ RENDER_BACKEND.getDouble(pname, params);
+ }
+ }
+ }
+ }
+
+ public static void glGetDouble(int pname, double[] params) {
+ final DoubleBuffer scratch = ctx().queryScratchDouble;
+ final DoubleBuffer buf;
+ if (params.length <= scratch.capacity()) {
+ buf = scratch;
+ buf.clear();
+ buf.limit(params.length);
+ } else {
+ buf = BufferUtils.createDoubleBuffer(params.length);
+ }
+ glGetDouble(pname, buf);
+ buf.position(0);
+ buf.get(params);
+ }
+
+ private static void widenFromFloat(int pname, DoubleBuffer params, int count) {
+ final FloatBuffer scratch = ctx().queryScratch;
+ scratch.clear();
+ glGetFloat(pname, scratch);
+ final int pos = params.position();
+ for (int i = 0; i < count; i++) {
+ params.put(pos + i, scratch.get(i));
+ }
+ }
+
+ public static int glGetError() {
+ rejectExitCapture();
+ if (!RENDER_BACKEND.hasContext()) return 0;
+ if (initConfig.isNoErrorChecks()) return 0;
+ return RENDER_BACKEND.getError();
+ }
+
+ public static void checkGLError() {
+ final int error = glGetError();
+ if (error != GL11.GL_NO_ERROR) GLErrorReporter.reportError(error);
+ }
+
+ public static String glGetString(int pname) {
+ rejectExitCapture();
+ if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context";
+ return RENDER_BACKEND.getString(pname);
+ }
+
+ public static String glGetStringi(int name, int index) {
+ rejectExitCapture();
+ if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context";
+ return RENDER_BACKEND.getStringi(name, index);
+ }
+ public static boolean glIsQuery(int query) { rejectExitCapture(); return RENDER_BACKEND.isQuery(query); }
+
+ public static void glGenQueries(IntBuffer ids) {
+ requireContext("glGenQueries");
+ RENDER_BACKEND.genQueries(ids);
+ }
+ public static int glGenQueries() {
+ requireContext("glGenQueries");
+ return RENDER_BACKEND.genQueries();
+ }
+ public static void glDeleteQueries(int id) { rejectExitCapture(); RENDER_BACKEND.deleteQueries(id); }
+ public static void glBeginQuery(int target, int id) { rejectExitCapture(); RENDER_BACKEND.beginQuery(target, id); }
+ public static void glEndQuery(int target) { rejectExitCapture(); RENDER_BACKEND.endQuery(target); }
+ public static void glGetQueryObjectui(int id, int pname, IntBuffer params) { rejectExitCapture(); RENDER_BACKEND.getQueryObjectui(id, pname, params); }
+ public static int glGetQueryObjecti(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjecti(id, pname); }
+ public static void glQueryCounter(int id, int target) { rejectExitCapture(); RENDER_BACKEND.queryCounter(id, target); }
+ public static long glGetQueryObjectui64(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjectui64(id, pname); }
+
+ public static void glGetInteger(int pname, int[] params) {
+ rejectExitCapture();
+ if (!isCachingEnabled() || params.length == 0) {
+ RENDER_BACKEND.getInteger(pname, params);
+ return;
+ }
+
+ switch (pname) {
+ case GL11.GL_VIEWPORT -> {
+ if (params.length < 4) {
+ RENDER_BACKEND.getInteger(pname, params);
+ } else {
+ ctx().viewportState.get(params);
+ }
+ }
+ case GL11.GL_SCISSOR_BOX -> {
+ if (params.length < 4) {
+ RENDER_BACKEND.getInteger(pname, params);
+ } else {
+ ctx().scissorState.get(params);
+ }
+ }
+ case GL11.GL_POLYGON_MODE -> {
+ final PolygonState polygon = ctx().polygonState;
+ params[0] = polygon.getFrontMode();
+ if (params.length > 1) params[1] = polygon.getBackMode();
+ }
+ default -> {
+ final GLContextState glCtx = ctx();
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
+ params[0] = glGetInteger(glCtx, pname);
+ } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) {
+ RENDER_BACKEND.getInteger(pname, params);
+ }
+ }
+ }
+ }
+
+ private static int indexedIntegerOrBackend(int pname, int index) {
+ if (pname == GL31.GL_UNIFORM_BUFFER_BINDING) return GLSMBuffers.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index);
+ if (pname == GL43.GL_SHADER_STORAGE_BUFFER_BINDING) return GLSMBuffers.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, index);
+ final ImageUnitBinding binding = !isCachingEnabled() ? null : ctx().imageUnits.get(index);
+ if (binding == null) return RENDER_BACKEND.getIntegerIndexed(pname, index);
+ return switch (pname) {
+ case GL42.GL_IMAGE_BINDING_NAME -> binding.getTexture();
+ case GL42.GL_IMAGE_BINDING_LEVEL -> binding.getLevel();
+ case GL42.GL_IMAGE_BINDING_LAYERED -> binding.isLayered() ? GL11.GL_TRUE : GL11.GL_FALSE;
+ case GL42.GL_IMAGE_BINDING_LAYER -> binding.getLayer();
+ case GL42.GL_IMAGE_BINDING_ACCESS -> binding.getAccess();
+ case GL42.GL_IMAGE_BINDING_FORMAT -> binding.getFormat();
+ default -> RENDER_BACKEND.getIntegerIndexed(pname, index);
+ };
+ }
+
+ public static int glGetInteger(int pname, int index) {
+ rejectExitCapture();
+ return indexedIntegerOrBackend(pname, index);
+ }
+
+ public static int glGetIntegeri(int pname, int index) {
+ rejectExitCapture();
+ return indexedIntegerOrBackend(pname, index);
+ }
+
+ public static void glGetIntegeri(int pname, int index, IntBuffer params) {
+ glGetIntegeri_v(pname, index, params);
+ }
+
+ public static void glGetIntegeri_v(int pname, int index, IntBuffer params) {
+ rejectExitCapture();
+ params.put(params.position(), indexedIntegerOrBackend(pname, index));
+ }
+
+ public static void glGetBooleani_v(int pname, int index, ByteBuffer params) {
+ rejectExitCapture();
+ params.put(params.position(), (byte) (indexedIntegerOrBackend(pname, index) != 0 ? GL11.GL_TRUE : GL11.GL_FALSE));
+ }
+
+ public static void glGetBooleani(int pname, int index, ByteBuffer params) {
+ glGetBooleani_v(pname, index, params);
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java
new file mode 100644
index 000000000..face3d271
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java
@@ -0,0 +1,700 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.LineStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.PointStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.PolygonStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.ScissorStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.ViewPortStateStack;
+import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.opengl.GL20;
+import java.nio.ByteBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_CLIP_PLANES;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.guardUnsupportedFFP;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMRasterizer {
+
+ private GLSMRasterizer() {}
+
+ static float maxPointSize;
+
+ // Line width range queried at init from GL_ALIASED_LINE_WIDTH_RANGE
+ static float lineWidthMin = 1.0f;
+ static float lineWidthMax = 1.0f;
+ // The driver cannot draw wide lines (Mesa forward-compat, SDL_GPU), so FFP widens them from LineQuads in the vertex shader
+ public static boolean wideLineEmulationEnabled = false;
+
+ public static void glGetClipPlane(int plane, DoubleBuffer equation) {
+ rejectExitCapture();
+ final int index = plane - GL11.GL_CLIP_PLANE0;
+ if (index < 0 || index >= MAX_CLIP_PLANES) return;
+ ctx().clipPlaneState.getEyePlane(index, equation);
+ }
+
+ static void probeLineWidthRange() {
+ final FloatBuffer lwRange = BufferUtils.createFloatBuffer(16);
+ RENDER_BACKEND.getFloat(GL12.GL_ALIASED_LINE_WIDTH_RANGE, lwRange);
+ lineWidthMin = lwRange.get(0);
+ lineWidthMax = lwRange.get(1);
+ final float queriedMax = lineWidthMax;
+ // Probe whether the driver actually accepts the queried max (Mesa forward-compat rejects > 1.0)
+ if (lineWidthMax > 1.0f) {
+ while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {}
+ RENDER_BACKEND.lineWidth(lineWidthMax);
+ if (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {
+ // Binary search for the actual accepted max between 1.0 and queriedMax
+ float lo = 1.0f, hi = queriedMax;
+ while (hi - lo > 0.01f) {
+ final float mid = (lo + hi) * 0.5f;
+ while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {}
+ RENDER_BACKEND.lineWidth(mid);
+ if (RENDER_BACKEND.getError() == GL11.GL_NO_ERROR) {
+ lo = mid;
+ } else {
+ hi = mid;
+ }
+ }
+ lineWidthMax = lo;
+ }
+ RENDER_BACKEND.lineWidth(1.0f);
+ while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {}
+ }
+ wideLineEmulationEnabled = lineWidthMax <= 1.0f;
+ if (wideLineEmulationEnabled) {
+ LOGGER.info("GL line width: aliased range [{}, {}], probe at {} rejected, native [{}, {}], line quads widen ({}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax, lineWidthMax, queriedMax);
+ } else {
+ LOGGER.info("GL line width: aliased range [{}, {}], probe at {} accepted, native [{}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax);
+ }
+ }
+
+ static void probePointSizeRange(GLContextState glCtx) {
+ final FloatBuffer range = glCtx.queryScratch;
+ range.clear();
+ RENDER_BACKEND.getFloat(GL11.GL_POINT_SIZE_RANGE, range);
+ final float smooth = range.get(1);
+ RENDER_BACKEND.getFloat(GL12.GL_ALIASED_POINT_SIZE_RANGE, range);
+ maxPointSize = Math.max(smooth, range.get(1));
+ }
+
+ public static void enableScissorTest() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_SCISSOR_TEST);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableScissorTest(ctx());
+ }
+
+ static void enableScissorTest(GLContextState glCtx) {
+ glCtx.scissorTest.enable();
+ }
+
+ public static void disableScissorTest() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_SCISSOR_TEST);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableScissorTest(ctx());
+ }
+
+ static void disableScissorTest(GLContextState glCtx) {
+ glCtx.scissorTest.disable();
+ }
+
+ public static void glPointParameterf(int pname, float param) {
+ pointParameter(pname, param, 0.0f, 0.0f);
+ }
+
+ public static void glPointParameteri(int pname, int param) {
+ pointParameter(pname, param, 0.0f, 0.0f);
+ }
+
+ public static void glPointParameter(int pname, FloatBuffer params) {
+ final int pos = params.position();
+ final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION;
+ pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f);
+ }
+
+ public static void glPointParameter(int pname, IntBuffer params) {
+ final int pos = params.position();
+ final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION;
+ pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f);
+ }
+
+ private static void pointParameter(int pname, float v0, float v1, float v2) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final PointStateStack point = glCtx.pointState;
+ switch (pname) {
+ case GL14.GL_POINT_SIZE_MIN -> {
+ if (!(v0 < 0.0f) && point.getMinSize() != v0) mod(point).setMinSize(v0);
+ }
+ case GL14.GL_POINT_SIZE_MAX -> {
+ if (!(v0 < 0.0f) && point.getMaxSize() != v0) mod(point).setMaxSize(v0);
+ }
+ case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> {
+ if (!(v0 < 0.0f) && point.getFadeThreshold() != v0) {
+ mod(point).setFadeThreshold(v0);
+ RENDER_BACKEND.pointParameterf(pname, v0);
+ }
+ }
+ case GL14.GL_POINT_DISTANCE_ATTENUATION -> {
+ if (point.getAttenuationConstant() == v0 && point.getAttenuationLinear() == v1 && point.getAttenuationQuadratic() == v2) return;
+ mod(point);
+ point.setAttenuationConstant(v0);
+ point.setAttenuationLinear(v1);
+ point.setAttenuationQuadratic(v2);
+ }
+ case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> {
+ final int origin = (int) v0;
+ if ((origin == GL20.GL_LOWER_LEFT || origin == GL20.GL_UPPER_LEFT) && point.getSpriteCoordOrigin() != origin) {
+ mod(point).setSpriteCoordOrigin(origin);
+ RENDER_BACKEND.pointParameteri(pname, origin);
+ }
+ }
+ default -> RENDER_BACKEND.pointParameterf(pname, v0);
+ }
+ }
+
+ static void applyPointState(GLContextState glCtx) {
+ final PointStateStack point = glCtx.pointState;
+ RENDER_BACKEND.pointSize(point.getSize());
+ RENDER_BACKEND.pointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, point.getFadeThreshold());
+ RENDER_BACKEND.pointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, point.getSpriteCoordOrigin());
+ }
+
+ private static boolean isLegacyHint(int target) {
+ return switch (target) {
+ case GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_POINT_SMOOTH_HINT, GL11.GL_FOG_HINT, GL14.GL_GENERATE_MIPMAP_HINT -> true;
+ default -> false;
+ };
+ }
+
+ static int hintShift(int target) {
+ return switch (target) {
+ case GL11.GL_PERSPECTIVE_CORRECTION_HINT -> 0;
+ case GL11.GL_POINT_SMOOTH_HINT -> 2;
+ case GL11.GL_LINE_SMOOTH_HINT -> 4;
+ case GL11.GL_POLYGON_SMOOTH_HINT -> 6;
+ case GL11.GL_FOG_HINT -> 8;
+ case GL13.GL_TEXTURE_COMPRESSION_HINT -> 10;
+ case GL14.GL_GENERATE_MIPMAP_HINT -> 12;
+ case GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT -> 14;
+ default -> -1;
+ };
+ }
+
+ static int hintMode(int packed, int shift) {
+ return switch (packed >>> shift & 3) {
+ case 1 -> GL11.GL_FASTEST;
+ case 2 -> GL11.GL_NICEST;
+ default -> GL11.GL_DONT_CARE;
+ };
+ }
+
+ private static final int[] DRIVER_HINTS = {
+ GL11.GL_LINE_SMOOTH_HINT, GL11.GL_POLYGON_SMOOTH_HINT, GL13.GL_TEXTURE_COMPRESSION_HINT, GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT
+ };
+
+ static void applyHintState(GLContextState glCtx) {
+ final int packed = glCtx.hintState.getValue();
+ for (final int target : DRIVER_HINTS) {
+ RENDER_BACKEND.hint(target, hintMode(packed, hintShift(target)));
+ }
+ }
+
+ public static void enableCull() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_CULL_FACE);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableCull(ctx());
+ }
+
+ static void enableCull(GLContextState glCtx) {
+ glCtx.cullState.enable();
+ }
+
+ public static void disableCull() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_CULL_FACE);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableCull(ctx());
+ }
+
+ static void disableCull(GLContextState glCtx) {
+ glCtx.cullState.disable();
+ }
+
+ public static void glShadeModel(int mode) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.SHADE_MODEL);
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ DisplayListManager.recordShadeModel(mode);
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ final int oldValue = glCtx.shadeModelState.getValue();
+ final boolean needsUpdate = !caching || oldValue != mode;
+
+ if (needsUpdate) {
+ mod(glCtx.shadeModelState).setValue(mode);
+ }
+ }
+
+ public static void glViewport(int x, int y, int width, int height) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordViewport(x, y, width, height);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ RENDER_BACKEND.viewport(x, y, width, height);
+ // Only update cached state when caching is enabled
+ if (isCachingEnabled()) {
+ mod(ctx().viewportState).setViewPort(x, y, width, height);
+ }
+ }
+
+ public static void glLineWidth(float width) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLineWidth(width);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.lineState.getWidth() != width) {
+ mod(glCtx.lineState).setWidth(width);
+ RENDER_BACKEND.lineWidth(Math.clamp(width, lineWidthMin, lineWidthMax));
+ }
+ }
+
+ public static void glCullFace(int mode) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.CULL_FACE);
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ DisplayListManager.recordCullFace(mode);
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.polygonState.getCullFaceMode() != mode) {
+ mod(glCtx.polygonState).setCullFaceMode(mode);
+ RENDER_BACKEND.cullFace(mode);
+ }
+ }
+
+ public static void glFrontFace(int mode) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.FRONT_FACE);
+ final RecordMode recordMode = DisplayListManager.getRecordMode();
+ if (recordMode != RecordMode.NONE) {
+ DisplayListManager.recordFrontFace(mode);
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.polygonState.getFrontFace() != mode) {
+ mod(glCtx.polygonState).setFrontFace(mode);
+ RENDER_BACKEND.frontFace(mode);
+ }
+ }
+
+ public static void glHint(int target, int hint) {
+ rejectExitCapture();
+ if (hint != GL11.GL_NICEST && hint != GL11.GL_FASTEST && hint != GL11.GL_DONT_CARE) {
+ return;
+ }
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordHint(target, hint);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final int shift = hintShift(target);
+ if (shift >= 0) {
+ final IntegerStateStack hints = ctx().hintState;
+ final int code = hint == GL11.GL_FASTEST ? 1 : hint == GL11.GL_NICEST ? 2 : 0;
+ final int packed = hints.getValue() & ~(3 << shift) | code << shift;
+ if (packed != hints.getValue()) mod(hints).setValue(packed);
+ }
+ if (!isLegacyHint(target)) {
+ RENDER_BACKEND.hint(target, hint);
+ }
+ }
+
+ public static void glLineStipple(int factor, short pattern) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordLineStipple(factor, pattern);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ mod(glCtx.lineState);
+ glCtx.lineState.setStippleFactor(factor);
+ glCtx.lineState.setStipplePattern(pattern);
+ }
+
+ public static void glPointSize(float size) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPointSize(size);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.pointState.getSize() != size) {
+ mod(glCtx.pointState).setSize(size);
+ RENDER_BACKEND.pointSize(size);
+ }
+ }
+
+ public static void glPolygonMode(int face, int polygonMode) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPolygonMode(face, polygonMode);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ // Track front/back separately in cache (Mesa compat semantics), but always issue GL_FRONT_AND_BACK to the driver (core profile constraint).
+ final boolean caching = isCachingEnabled();
+ final boolean front = face != GL11.GL_BACK;
+ final boolean back = face != GL11.GL_FRONT;
+ final boolean needsUpdate = !caching
+ || (front && glCtx.polygonState.getFrontMode() != polygonMode)
+ || (back && glCtx.polygonState.getBackMode() != polygonMode);
+ if (!needsUpdate) return;
+ beforeUncapturedStateChange();
+ if (caching) {
+ mod(glCtx.polygonState);
+ if (front) glCtx.polygonState.setFrontMode(polygonMode);
+ if (back) glCtx.polygonState.setBackMode(polygonMode);
+ }
+ RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, polygonMode);
+ }
+
+ public static void glPolygonOffset(float factor, float units) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordPolygonOffset(factor, units);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final boolean caching = isCachingEnabled();
+
+ if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != 0.0f) {
+ mod(glCtx.polygonState);
+ glCtx.polygonState.setOffsetFactor(factor);
+ glCtx.polygonState.setOffsetUnits(units);
+ glCtx.polygonState.setOffsetClamp(0.0f);
+ RENDER_BACKEND.polygonOffset(factor, units);
+ }
+ }
+
+ public static void glPolygonOffsetClamp(float factor, float units, float clamp) {
+ if (clamp == 0.0f) {
+ glPolygonOffset(factor, units);
+ return;
+ }
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glPolygonOffsetClamp");
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES);
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != clamp) {
+ mod(glCtx.polygonState);
+ glCtx.polygonState.setOffsetFactor(factor);
+ glCtx.polygonState.setOffsetUnits(units);
+ glCtx.polygonState.setOffsetClamp(clamp);
+ RENDER_BACKEND.polygonOffsetClamp(factor, units, clamp);
+ }
+ }
+
+ public static void glScissor(int x, int y, int width, int height) {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordScissor(x, y, width, height);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ beforeUncapturedStateChange();
+ RENDER_BACKEND.scissor(x, y, width, height);
+ if (isCachingEnabled()) {
+ mod(ctx().scissorState).setScissor(x, y, width, height);
+ }
+ }
+
+ public static void glClipPlane(int plane, DoubleBuffer equation) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (DisplayListManager.isRecording()) {
+ final int pos = equation.position();
+ DisplayListManager.recordClipPlane(plane, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3));
+ return;
+ }
+ final int index = plane - GL11.GL_CLIP_PLANE0;
+ if (index < 0 || index >= MAX_CLIP_PLANES) return;
+ final int pos = equation.position();
+ beforeUncapturedStateChange();
+ glCtx.clipPlaneState.setPlane(index, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3), glCtx.modelViewMatrix);
+ glCtx.clipPlaneGeneration++;
+ }
+
+ /** Returns true if any GL_CLIP_PLANE0..7 is currently enabled. */
+ public static boolean anyClipPlaneEnabled() {
+ return anyClipPlaneEnabled(ctx());
+ }
+
+ public static boolean anyClipPlaneEnabled(GLContextState glCtx) {
+ return glCtx.clipPlaneEnabledMask != 0;
+ }
+
+ public static void glSampleCoverage(float value, boolean invert) {
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glSampleCoverage");
+ }
+ beforeUncapturedStateChange();
+ RENDER_BACKEND.sampleCoverage(value, invert);
+ }
+
+ public static void glPolygonStipple(ByteBuffer pattern) {
+ guardUnsupportedFFP("glPolygonStipple", "glPolygonStipple is not available in GL 3.3 core profile.");
+ }
+
+ public static IntegerStateStack getShadeModelState() {
+ return ctx().shadeModelState;
+ }
+
+ public static BooleanStateStack getScissorTest() {
+ return ctx().scissorTest;
+ }
+
+ public static BooleanStateStack getCullState() {
+ return ctx().cullState;
+ }
+
+ public static BooleanStateStack getDitherState() {
+ return ctx().ditherState;
+ }
+
+ public static BooleanStateStack getLineSmoothState() {
+ return ctx().lineSmoothState;
+ }
+
+ public static BooleanStateStack getLineStippleState() {
+ return ctx().lineStippleState;
+ }
+
+ public static BooleanStateStack getPointSmoothState() {
+ return ctx().pointSmoothState;
+ }
+
+ public static BooleanStateStack getPolygonSmoothState() {
+ return ctx().polygonSmoothState;
+ }
+
+ public static BooleanStateStack getPolygonStippleState() {
+ return ctx().polygonStippleState;
+ }
+
+ public static BooleanStateStack getMultisampleState() {
+ return ctx().multisampleState;
+ }
+
+ public static BooleanStateStack getSampleAlphaToCoverageState() {
+ return ctx().sampleAlphaToCoverageState;
+ }
+
+ public static BooleanStateStack getSampleAlphaToOneState() {
+ return ctx().sampleAlphaToOneState;
+ }
+
+ public static BooleanStateStack getSampleCoverageState() {
+ return ctx().sampleCoverageState;
+ }
+
+ public static BooleanStateStack getPolygonOffsetPointState() {
+ return ctx().polygonOffsetPointState;
+ }
+
+ public static BooleanStateStack getPolygonOffsetLineState() {
+ return ctx().polygonOffsetLineState;
+ }
+
+ public static BooleanStateStack getPolygonOffsetFillState() {
+ return ctx().polygonOffsetFillState;
+ }
+
+ public static LineStateStack getLineState() {
+ return ctx().lineState;
+ }
+
+ public static PointStateStack getPointState() {
+ return ctx().pointState;
+ }
+
+ public static IntegerStateStack getHintState() {
+ return ctx().hintState;
+ }
+
+ public static BooleanStateStack getPointSpriteState() {
+ return ctx().pointSpriteState;
+ }
+
+ public static BooleanStateStack getEdgeFlagState() {
+ return ctx().edgeFlagState;
+ }
+
+ public static PolygonStateStack getPolygonState() {
+ return ctx().polygonState;
+ }
+
+ public static BooleanStateStack getAutoNormalState() {
+ return ctx().autoNormalState;
+ }
+
+ public static BooleanStateStack getMap1Color4State() {
+ return ctx().map1Color4State;
+ }
+
+ public static BooleanStateStack getMap1IndexState() {
+ return ctx().map1IndexState;
+ }
+
+ public static BooleanStateStack getMap1NormalState() {
+ return ctx().map1NormalState;
+ }
+
+ public static BooleanStateStack getMap1TextureCoord1State() {
+ return ctx().map1TextureCoord1State;
+ }
+
+ public static BooleanStateStack getMap1TextureCoord2State() {
+ return ctx().map1TextureCoord2State;
+ }
+
+ public static BooleanStateStack getMap1TextureCoord3State() {
+ return ctx().map1TextureCoord3State;
+ }
+
+ public static BooleanStateStack getMap1TextureCoord4State() {
+ return ctx().map1TextureCoord4State;
+ }
+
+ public static BooleanStateStack getMap1Vertex3State() {
+ return ctx().map1Vertex3State;
+ }
+
+ public static BooleanStateStack getMap1Vertex4State() {
+ return ctx().map1Vertex4State;
+ }
+
+ public static BooleanStateStack getMap2Color4State() {
+ return ctx().map2Color4State;
+ }
+
+ public static BooleanStateStack getMap2IndexState() {
+ return ctx().map2IndexState;
+ }
+
+ public static BooleanStateStack getMap2NormalState() {
+ return ctx().map2NormalState;
+ }
+
+ public static BooleanStateStack getMap2TextureCoord1State() {
+ return ctx().map2TextureCoord1State;
+ }
+
+ public static BooleanStateStack getMap2TextureCoord2State() {
+ return ctx().map2TextureCoord2State;
+ }
+
+ public static BooleanStateStack getMap2TextureCoord3State() {
+ return ctx().map2TextureCoord3State;
+ }
+
+ public static BooleanStateStack getMap2TextureCoord4State() {
+ return ctx().map2TextureCoord4State;
+ }
+
+ public static BooleanStateStack getMap2Vertex3State() {
+ return ctx().map2Vertex3State;
+ }
+
+ public static BooleanStateStack getMap2Vertex4State() {
+ return ctx().map2Vertex4State;
+ }
+
+ public static BooleanStateStack[] getClipPlaneStates() {
+ return ctx().clipPlaneStates;
+ }
+
+ public static ClipPlaneState getClipPlaneState() {
+ return ctx().clipPlaneState;
+ }
+
+ public static ViewPortStateStack getViewportState() {
+ return ctx().viewportState;
+ }
+
+ public static ScissorStateStack getScissorState() {
+ return ctx().scissorState;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java
new file mode 100644
index 000000000..c1532d148
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java
@@ -0,0 +1,366 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL14;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.guardUnsupportedFFP;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+
+public final class GLSMTexEnvGen {
+
+ private GLSMTexEnvGen() {}
+
+ public static void glTexEnvi(int target, int pname, int param) {
+ handleTexEnvScalar(target, pname, param);
+ }
+
+ public static void glTexEnvf(int target, int pname, float param) {
+ handleTexEnvScalar(target, pname, param);
+ }
+
+ public static void glTexEnv(int target, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (target == GL11.GL_TEXTURE_ENV && pname == GL11.GL_TEXTURE_ENV_COLOR && params.remaining() >= 4) {
+ beforeUncapturedStateChange();
+ final int pos = params.position();
+ final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
+ envState.beforeModify();
+ envState.envColorR = params.get(pos);
+ envState.envColorG = params.get(pos + 1);
+ envState.envColorB = params.get(pos + 2);
+ envState.envColorA = params.get(pos + 3);
+ glCtx.fragmentGeneration++;
+ return;
+ }
+ if (target == GL14.GL_TEXTURE_FILTER_CONTROL) {
+ guardUnsupportedFFP(
+ "glTexEnv",
+ "LOD bias via buffer glTexEnv is not supported; use glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value) instead.");
+ return;
+ }
+ // Silently ignore other buffer glTexEnv calls (some mods pass combine params via buffers)
+ }
+
+ public static void glTexEnv(int target, int pname, IntBuffer params) {
+ rejectExitCapture();
+ if (target == GL11.GL_TEXTURE_ENV) {
+ handleTexEnvScalar(target, pname, (float) params.get(params.position()));
+ }
+ }
+
+ /**
+ * Scalar glTexEnvi/glTexEnvf dispatch. glTexEnv is removed in core profile. GL_TEXTURE_FILTER_CONTROL (LOD bias) is remapped to glTexParameterf. All
+ * GL_TEXTURE_ENV parameters including GL_COMBINE sub-params are tracked in per-unit TexEnvState.
+ */
+ private static void handleTexEnvScalar(int target, int pname, float param) {
+ beforeUncapturedStateChange();
+ final GLContextState glCtx = ctx();
+ if (target == GL14.GL_TEXTURE_FILTER_CONTROL) {
+ // LOD bias via legacy glTexEnv path - remap to core-profile glTexParameterf
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, param);
+ return;
+ }
+ if (target != GL11.GL_TEXTURE_ENV) return;
+
+ final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
+ envState.beforeModify();
+ final int iparam = (int) param;
+
+ switch (pname) {
+ case GL11.GL_TEXTURE_ENV_MODE -> {
+ envState.mode = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_COMBINE_RGB -> {
+ envState.combineRgb = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_COMBINE_ALPHA -> {
+ envState.combineAlpha = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_SOURCE0_RGB -> {
+ envState.sourceRgb[0] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_SOURCE1_RGB -> {
+ envState.sourceRgb[1] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_SOURCE2_RGB -> {
+ envState.sourceRgb[2] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_SOURCE0_ALPHA -> {
+ envState.sourceAlpha[0] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_SOURCE1_ALPHA -> {
+ envState.sourceAlpha[1] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_SOURCE2_ALPHA -> {
+ envState.sourceAlpha[2] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_OPERAND0_RGB -> {
+ envState.operandRgb[0] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_OPERAND1_RGB -> {
+ envState.operandRgb[1] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_OPERAND2_RGB -> {
+ envState.operandRgb[2] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_OPERAND0_ALPHA -> {
+ envState.operandAlpha[0] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_OPERAND1_ALPHA -> {
+ envState.operandAlpha[1] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_OPERAND2_ALPHA -> {
+ envState.operandAlpha[2] = iparam;
+ glCtx.fragmentGeneration++;
+ }
+ case GL13.GL_RGB_SCALE -> {
+ envState.scaleRgb = param;
+ glCtx.fragmentGeneration++;
+ }
+ case GL11.GL_ALPHA_SCALE -> {
+ envState.scaleAlpha = param;
+ glCtx.fragmentGeneration++;
+ }
+ // Silently ignore unknown pname - other mods may pass unrecognized params
+ }
+ }
+
+ public static float glGetTexEnvf(int target, int pname) {
+ return (float) glGetTexEnvi(target, pname);
+ }
+
+ public static int glGetTexEnvi(int target, int pname) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (target != GL11.GL_TEXTURE_ENV) return 0;
+
+ final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
+ return switch (pname) {
+ case GL11.GL_TEXTURE_ENV_MODE -> envState.mode;
+ case GL13.GL_COMBINE_RGB -> envState.combineRgb;
+ case GL13.GL_COMBINE_ALPHA -> envState.combineAlpha;
+ case GL13.GL_SOURCE0_RGB -> envState.sourceRgb[0];
+ case GL13.GL_SOURCE1_RGB -> envState.sourceRgb[1];
+ case GL13.GL_SOURCE2_RGB -> envState.sourceRgb[2];
+ case GL13.GL_SOURCE0_ALPHA -> envState.sourceAlpha[0];
+ case GL13.GL_SOURCE1_ALPHA -> envState.sourceAlpha[1];
+ case GL13.GL_SOURCE2_ALPHA -> envState.sourceAlpha[2];
+ case GL13.GL_OPERAND0_RGB -> envState.operandRgb[0];
+ case GL13.GL_OPERAND1_RGB -> envState.operandRgb[1];
+ case GL13.GL_OPERAND2_RGB -> envState.operandRgb[2];
+ case GL13.GL_OPERAND0_ALPHA -> envState.operandAlpha[0];
+ case GL13.GL_OPERAND1_ALPHA -> envState.operandAlpha[1];
+ case GL13.GL_OPERAND2_ALPHA -> envState.operandAlpha[2];
+ case GL13.GL_RGB_SCALE -> (int) envState.scaleRgb;
+ case GL11.GL_ALPHA_SCALE -> (int) envState.scaleAlpha;
+ default -> 0;
+ };
+ }
+
+ public static void glGetTexEnv(int target, int pname, IntBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (target != GL11.GL_TEXTURE_ENV) return;
+ if (pname == GL11.GL_TEXTURE_ENV_COLOR) {
+ final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
+ params.put(params.position(), (int) (envState.envColorR * 2147483647.0f));
+ params.put(params.position() + 1, (int) (envState.envColorG * 2147483647.0f));
+ params.put(params.position() + 2, (int) (envState.envColorB * 2147483647.0f));
+ params.put(params.position() + 3, (int) (envState.envColorA * 2147483647.0f));
+ } else {
+ params.put(params.position(), glGetTexEnvi(target, pname));
+ }
+ }
+
+ public static void glGetTexEnv(int target, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (target != GL11.GL_TEXTURE_ENV) return;
+ if (pname == GL11.GL_TEXTURE_ENV_COLOR) {
+ final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
+ params.put(params.position(), envState.envColorR);
+ params.put(params.position() + 1, envState.envColorG);
+ params.put(params.position() + 2, envState.envColorB);
+ params.put(params.position() + 3, envState.envColorA);
+ } else {
+ params.put(params.position(), (float) glGetTexEnvi(target, pname));
+ }
+ }
+
+
+ public static void glTexGeni(int coord, int pname, int param) {
+ beforeUncapturedStateChange();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) return;
+ if (pname == GL11.GL_TEXTURE_GEN_MODE) {
+ final int unit = glCtx.activeTextureUnit.getValue();
+ glCtx.textures.getTexGenState(unit).setMode(coord, param);
+ glCtx.texGenGeneration++;
+ }
+ }
+
+ public static void glTexGenf(int coord, int pname, float param) {
+ // Single-float form only valid for GL_TEXTURE_GEN_MODE
+ glTexGeni(coord, pname, (int) param);
+ }
+
+ public static void glTexGend(int coord, int pname, double param) {
+ glTexGeni(coord, pname, (int) param);
+ }
+
+ public static void glTexGen(int coord, int pname, FloatBuffer params) {
+ beforeUncapturedStateChange();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) return;
+ final int unit = glCtx.activeTextureUnit.getValue();
+ final var texGenState = glCtx.textures.getTexGenState(unit);
+ final int pos = params.position();
+ switch (pname) {
+ case GL11.GL_TEXTURE_GEN_MODE -> {
+ texGenState.setMode(coord, (int) params.get(pos));
+ glCtx.texGenGeneration++;
+ }
+ case GL11.GL_OBJECT_PLANE -> {
+ glCtx.texGenTempPlane[0] = params.get(pos);
+ glCtx.texGenTempPlane[1] = params.get(pos + 1);
+ glCtx.texGenTempPlane[2] = params.get(pos + 2);
+ glCtx.texGenTempPlane[3] = params.get(pos + 3);
+ texGenState.setObjectPlane(coord, glCtx.texGenTempPlane);
+ glCtx.texGenGeneration++;
+ }
+ case GL11.GL_EYE_PLANE -> {
+ glCtx.texGenTempPlane[0] = params.get(pos);
+ glCtx.texGenTempPlane[1] = params.get(pos + 1);
+ glCtx.texGenTempPlane[2] = params.get(pos + 2);
+ glCtx.texGenTempPlane[3] = params.get(pos + 3);
+ texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix);
+ glCtx.texGenGeneration++;
+ }
+ }
+ }
+
+ public static void glTexGen(int coord, int pname, DoubleBuffer params) {
+ beforeUncapturedStateChange();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) return;
+ final int pos = params.position();
+ glCtx.texGenTempPlane[0] = (float) params.get(pos);
+ glCtx.texGenTempPlane[1] = (float) params.get(pos + 1);
+ glCtx.texGenTempPlane[2] = (float) params.get(pos + 2);
+ glCtx.texGenTempPlane[3] = (float) params.get(pos + 3);
+ final int unit = glCtx.activeTextureUnit.getValue();
+ final var texGenState = glCtx.textures.getTexGenState(unit);
+ switch (pname) {
+ case GL11.GL_TEXTURE_GEN_MODE -> {
+ texGenState.setMode(coord, (int) params.get(pos));
+ glCtx.texGenGeneration++;
+ }
+ case GL11.GL_OBJECT_PLANE -> {
+ texGenState.setObjectPlane(coord, glCtx.texGenTempPlane);
+ glCtx.texGenGeneration++;
+ }
+ case GL11.GL_EYE_PLANE -> {
+ texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix);
+ glCtx.texGenGeneration++;
+ }
+ }
+ }
+
+ public static void glTexGen(int coord, int pname, IntBuffer params) {
+ beforeUncapturedStateChange();
+ final GLContextState glCtx = ctx();
+ if (!isCachingEnabled()) return;
+ if (pname == GL11.GL_TEXTURE_GEN_MODE) {
+ final int unit = glCtx.activeTextureUnit.getValue();
+ glCtx.textures.getTexGenState(unit).setMode(coord, params.get(params.position()));
+ glCtx.texGenGeneration++;
+ }
+ }
+
+ public static int glGetTexGeni(int coord, int pname) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (pname == GL11.GL_TEXTURE_GEN_MODE) {
+ return glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()).getMode(coord);
+ }
+ return 0;
+ }
+
+ public static float glGetTexGenf(int coord, int pname) {
+ return (float) glGetTexGeni(coord, pname);
+ }
+
+ public static double glGetTexGend(int coord, int pname) {
+ return glGetTexGeni(coord, pname);
+ }
+
+ public static void glGetTexGen(int coord, int pname, IntBuffer params) {
+ if (pname == GL11.GL_TEXTURE_GEN_MODE) {
+ params.put(params.position(), glGetTexGeni(coord, pname));
+ }
+ }
+
+ public static void glGetTexGen(int coord, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue());
+ if (pname == GL11.GL_TEXTURE_GEN_MODE) {
+ params.put(params.position(), (float) state.getMode(coord));
+ } else if (pname == GL11.GL_OBJECT_PLANE) {
+ final float[] plane = state.getObjectPlane(coord);
+ params.put(params.position(), plane[0]);
+ params.put(params.position() + 1, plane[1]);
+ params.put(params.position() + 2, plane[2]);
+ params.put(params.position() + 3, plane[3]);
+ } else if (pname == GL11.GL_EYE_PLANE) {
+ final float[] plane = state.getEyePlane(coord);
+ params.put(params.position(), plane[0]);
+ params.put(params.position() + 1, plane[1]);
+ params.put(params.position() + 2, plane[2]);
+ params.put(params.position() + 3, plane[3]);
+ }
+ }
+
+ public static void glGetTexGen(int coord, int pname, DoubleBuffer params) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue());
+ if (pname == GL11.GL_TEXTURE_GEN_MODE) {
+ params.put(params.position(), state.getMode(coord));
+ } else if (pname == GL11.GL_OBJECT_PLANE) {
+ final float[] plane = state.getObjectPlane(coord);
+ params.put(params.position(), plane[0]);
+ params.put(params.position() + 1, plane[1]);
+ params.put(params.position() + 2, plane[2]);
+ params.put(params.position() + 3, plane[3]);
+ } else if (pname == GL11.GL_EYE_PLANE) {
+ final float[] plane = state.getEyePlane(coord);
+ params.put(params.position(), plane[0]);
+ params.put(params.position() + 1, plane[1]);
+ params.put(params.position() + 2, plane[2]);
+ params.put(params.position() + 3, plane[3]);
+ }
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java
new file mode 100644
index 000000000..09737dcfb
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java
@@ -0,0 +1,360 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
+import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack;
+import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding;
+import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
+import com.gtnewhorizons.angelica.glsm.texture.TextureTargets;
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2LongMap;
+import it.unimi.dsi.fastutil.ints.Int2LongMaps;
+import it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap;
+import it.unimi.dsi.fastutil.longs.LongIterator;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.EXTTextureFilterAnisotropic;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL31;
+import org.lwjgl.opengl.GL32;
+import org.lwjgl.opengl.GL33;
+import org.lwjgl.opengl.GL42;
+import org.lwjgl.opengl.GL43;
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.drawableContextStates;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.primaryContext;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.splashComplete;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMTextureLifetime {
+
+ private GLSMTextureLifetime() {}
+
+ // Deferred texture deletion: names kept valid until glGenTextures recycles them.
+ // Emulates Mesa/compat-profile behavior where delete-then-bind doesn't error.
+ private static final Int2LongOpenHashMap deferredDeleteTextures = new Int2LongOpenHashMap();
+ private static final long DEFERRED_ABSENT = Long.MIN_VALUE;
+ private static final long DEFERRED_ATTACHED = -1;
+ private static final long DEFERRED_RELEASED = -2;
+ private static final int RELEASE_DELAY_FRAMES = 3;
+ private static long frameIndex;
+ private static long nextReleaseFrame = Long.MAX_VALUE;
+ private static final Int2IntOpenHashMap non2DTextureTargets = new Int2IntOpenHashMap();
+ private static final Int2IntOpenHashMap textureFramebufferRefs = new Int2IntOpenHashMap();
+ private static final FloatBuffer TRANSPARENT_BLACK = BufferUtils.createFloatBuffer(4);
+ private static final Tracy.ZoneId Z_TEX_RELEASE_STORAGE = Tracy.zoneId("texReleaseStorage", Tracy.COLOR_FFP);
+ private static final Tracy.ZoneId Z_TEX_RESCUE_RESET = Tracy.zoneId("texRescueReset", Tracy.COLOR_FFP);
+ private static final Tracy.ZoneId Z_TEX_FLUSH_DELETES = Tracy.zoneId("texFlushDeletes", Tracy.COLOR_FFP);
+ static {
+ deferredDeleteTextures.defaultReturnValue(DEFERRED_ABSENT);
+ non2DTextureTargets.defaultReturnValue(GL11.GL_TEXTURE_2D);
+ }
+
+ /**
+ * Defer deleting textures until it has been reclaimed.
+ * Why you might ask? In compat profile if you bind a texture that doesn't exist, ie a deleted texture,
+ * mesa will silently create it for you, in core this is an error. Why would you be binding a deleted texture?
+ * Damned if I know, but vanilla and mods do it... they create one, delete it, and then bind it....
+ * */
+ static void deferDeleteTexture(int id) {
+ final GLContextState glCtx = ctx();
+ if (id == 0) return;
+
+ final int savedUnit = glCtx.activeTextureUnit.getValue();
+ int activeUnit = savedUnit;
+
+ // Unbind from all units that have this texture
+ for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) {
+ final TextureBindingStack unitBindings = glCtx.textures.getTextureUnitBindings(i);
+ if (unitBindings.getBinding() == id) {
+ if (i != activeUnit) {
+ RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i);
+ activeUnit = i;
+ }
+ final int unitTarget = unitBindings.getTarget();
+ RENDER_BACKEND.bindTexture(unitTarget == 0 ? GL11.GL_TEXTURE_2D : unitTarget, 0);
+ }
+ }
+
+ for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) {
+ final ImageUnitBinding image = glCtx.imageUnits.get(i);
+ if (image != null && image.getTexture() == id) {
+ RENDER_BACKEND.bindImageTexture(i, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8);
+ }
+ }
+
+ if (activeUnit != savedUnit) {
+ RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + savedUnit);
+ }
+
+ final TextureBindingStack savedBindings = glCtx.textures.getTextureUnitBindings(savedUnit);
+ if (!is2D(savedBindings.getTarget()) && previous2D(savedBindings) == id) restoreUnitAfter2DBind(savedBindings, id, id);
+
+ final boolean locked = acquireDrawLock();
+ try {
+ detachFromFramebuffer(glCtx, GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer, id);
+ if (glCtx.readFramebuffer != glCtx.drawFramebuffer) detachFromFramebuffer(glCtx, GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer, id);
+ if (textureFramebufferRefs.get(id) > 0) deferredDeleteTextures.put(id, DEFERRED_ATTACHED);
+ else scheduleRelease(id);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static void scheduleRelease(int id) {
+ deferredDeleteTextures.put(id, frameIndex);
+ nextReleaseFrame = Math.min(nextReleaseFrame, frameIndex + RELEASE_DELAY_FRAMES);
+ }
+
+ static final long BIND_REJECTED = Long.MIN_VALUE + 1;
+
+ // Rebinding a deferred-delete texture rescues it (Mesa/compat-profile behavior)
+ static long claimForBind(int texture, int target) {
+ if (texture == 0) return DEFERRED_ABSENT;
+ final boolean locked = acquireDrawLock();
+ try {
+ final long state = deferredDeleteTextures.isEmpty() ? DEFERRED_ABSENT : deferredDeleteTextures.get(texture);
+ if (state == DEFERRED_ABSENT) {
+ recordTarget(texture, target);
+ return DEFERRED_ABSENT;
+ }
+ return non2DTextureTargets.get(texture) == target ? deferredDeleteTextures.remove(texture) : BIND_REJECTED;
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ static void finishRescue(int target, int texture, long claim) {
+ if (claim != DEFERRED_ABSENT) resetRescuedTexture(target, texture, claim);
+ }
+
+ static int targetOf(int texture) {
+ return non2DTextureTargets.get(texture);
+ }
+
+ static boolean isDeferredDelete(int texture) {
+ if (texture == 0 || deferredDeleteTextures.isEmpty()) return false;
+ final boolean locked = acquireDrawLock();
+ try {
+ return deferredDeleteTextures.containsKey(texture);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void onFrameEnd() {
+ frameIndex++;
+ if (!splashComplete || frameIndex < nextReleaseFrame) return;
+ nextReleaseFrame = Long.MAX_VALUE;
+ for (Int2LongMap.Entry entry : Int2LongMaps.fastIterable(deferredDeleteTextures)) {
+ final long since = entry.getLongValue();
+ if (since < 0) continue;
+ if (frameIndex - since < RELEASE_DELAY_FRAMES) {
+ nextReleaseFrame = Math.min(nextReleaseFrame, since + RELEASE_DELAY_FRAMES);
+ continue;
+ }
+ final int id = entry.getIntKey();
+ if (non2DTextureTargets.get(id) == GL11.GL_TEXTURE_2D) releaseStorage2D(id);
+ entry.setValue(DEFERRED_RELEASED);
+ }
+ }
+
+ public static int deferredTexturesAwaitingRelease() {
+ int count = 0;
+ final LongIterator it = deferredDeleteTextures.values().iterator();
+ while (it.hasNext()) {
+ if (it.nextLong() != DEFERRED_RELEASED) count++;
+ }
+ return count;
+ }
+
+ private static void releaseStorage2D(int id) {
+ if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RELEASE_STORAGE);
+ try {
+ final TextureBindingStack unit = ctx().textures.getTextureUnitBindings(GLSMTextures.getActiveTextureUnit());
+ final int previous2D = previous2D(unit);
+ RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, id);
+ if (bindTook(GL11.GL_TEXTURE_2D, id)) releaseBoundStorage2D();
+ restoreUnitAfter2DBind(unit, id, previous2D);
+ } finally {
+ if (Tracy.ENABLED) Tracy.endZone();
+ }
+ }
+
+ private static void restoreUnitAfter2DBind(TextureBindingStack unit, int deleted, int previous2D) {
+ RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, previous2D == deleted ? 0 : previous2D);
+ final int target = unit.getTarget();
+ if (is2D(target)) return;
+ RENDER_BACKEND.bindTexture(target, unit.getBinding() == deleted ? 0 : unit.getBinding());
+ }
+
+ static boolean is2D(int target) {
+ return target == 0 || target == GL11.GL_TEXTURE_2D;
+ }
+
+ private static int previous2D(TextureBindingStack unit) {
+ return is2D(unit.getTarget()) ? unit.getBinding() : RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D);
+ }
+
+ static void recordTarget(int texture, int target) {
+ if (target != GL11.GL_TEXTURE_2D) non2DTextureTargets.put(texture, target);
+ }
+
+ private static void releaseBoundStorage2D() {
+ if (RenderSystem.supportsTextureStorage() && RENDER_BACKEND.getTexParameteri(GL11.GL_TEXTURE_2D, GL42.GL_TEXTURE_IMMUTABLE_FORMAT) != 0) return;
+ final int size = Math.max(RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH), RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT));
+ final int levels = Math.max(1, 32 - Integer.numberOfLeadingZeros(size));
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ for (int level = 0; level < levels; level++) {
+ RENDER_BACKEND.texImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ }
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+
+ private static boolean bindTook(int target, int texture) {
+ return RENDER_BACKEND.getInteger(TextureTargets.bindingQuery(target)) == texture;
+ }
+
+ private static void resetRescuedTexture(int target, int texture, long state) {
+ if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RESCUE_RESET);
+ try {
+ if (!bindTook(target, texture)) return;
+ if (target == GL11.GL_TEXTURE_2D && state >= 0) releaseBoundStorage2D();
+ if (target == GL31.GL_TEXTURE_BUFFER || target == GL32.GL_TEXTURE_2D_MULTISAMPLE || target == GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY) return;
+ final boolean rectangle = target == GL31.GL_TEXTURE_RECTANGLE;
+ final int wrap = rectangle ? GL12.GL_CLAMP_TO_EDGE : GL11.GL_REPEAT;
+ RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, rectangle ? GL11.GL_LINEAR : GL11.GL_NEAREST_MIPMAP_LINEAR);
+ RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_S, wrap);
+ RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_T, wrap);
+ RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_WRAP_R, wrap);
+ RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_BASE_LEVEL, 0);
+ if (!rectangle) RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_MAX_LEVEL, 1000);
+ RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MIN_LOD, -1000.0f);
+ RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MAX_LOD, 1000.0f);
+ RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_MODE, GL11.GL_NONE);
+ RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL);
+ RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_RED);
+ RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_G, GL11.GL_GREEN);
+ RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_B, GL11.GL_BLUE);
+ RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_A, GL11.GL_ALPHA);
+ if (!RenderSystem.isGLES()) {
+ RENDER_BACKEND.texParameterf(target, GL14.GL_TEXTURE_LOD_BIAS, 0.0f);
+ RENDER_BACKEND.texParameterfv(target, GL11.GL_TEXTURE_BORDER_COLOR, TRANSPARENT_BLACK);
+ }
+ if (RenderSystem.supportsStencilTexturing()) RENDER_BACKEND.texParameteri(target, GL43.GL_DEPTH_STENCIL_TEXTURE_MODE, GL11.GL_DEPTH_COMPONENT);
+ if (RENDER_BACKEND.isAnisotropicSupported()) RENDER_BACKEND.texParameterf(target, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
+ } finally {
+ if (Tracy.ENABLED) Tracy.endZone();
+ }
+ }
+
+ /** Flush deferred deletes so the driver can recycle names. */
+ static void flushDeferredTextureDeletes() {
+ if (!splashComplete || deferredDeleteTextures.isEmpty()) return;
+ if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_FLUSH_DELETES);
+ try {
+ final GLContextState primary = primaryContext();
+ final GLContextState[] drawables = drawableContextStates;
+ final var it = Int2LongMaps.fastIterator(deferredDeleteTextures);
+ while (it.hasNext()) {
+ final Int2LongMap.Entry entry = it.next();
+ if (entry.getLongValue() == DEFERRED_ATTACHED) continue;
+ final int id = entry.getIntKey();
+ it.remove();
+ RENDER_BACKEND.deleteTextures(id);
+ non2DTextureTargets.remove(id);
+ GLSMTextures.clearTextureBindings(primary, id);
+ for (int i = 0; i < drawables.length; i++) {
+ GLSMTextures.clearTextureBindings(drawables[i], id);
+ }
+ }
+ } finally {
+ if (Tracy.ENABLED) Tracy.endZone();
+ }
+ }
+
+ private static final int DEPTH_SLOT = 16;
+ private static final int STENCIL_SLOT = 17;
+ private static final int FRAMEBUFFER_SLOTS = 18;
+
+ private static int attachmentSlot(int attachment) {
+ return switch (attachment) {
+ case GL30.GL_DEPTH_ATTACHMENT -> DEPTH_SLOT;
+ case GL30.GL_STENCIL_ATTACHMENT -> STENCIL_SLOT;
+ default -> attachment >= GL30.GL_COLOR_ATTACHMENT0 && attachment <= GL30.GL_COLOR_ATTACHMENT15 ? attachment - GL30.GL_COLOR_ATTACHMENT0 : -1;
+ };
+ }
+
+ private static int slotAttachment(int slot) {
+ return switch (slot) {
+ case DEPTH_SLOT -> GL30.GL_DEPTH_ATTACHMENT;
+ case STENCIL_SLOT -> GL30.GL_STENCIL_ATTACHMENT;
+ default -> GL30.GL_COLOR_ATTACHMENT0 + slot;
+ };
+ }
+
+ static boolean beginAttach(int target, int attachment, int texture) {
+ final GLContextState glCtx = ctx();
+ return beginAttach(glCtx, target == GL30.GL_READ_FRAMEBUFFER ? glCtx.readFramebuffer : glCtx.drawFramebuffer, attachment, texture);
+ }
+
+ static boolean beginAttach(GLContextState glCtx, int framebuffer, int attachment, int texture) {
+ if (isDeferredDelete(texture)) return false;
+ TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture);
+ trackFramebufferAttachment(glCtx, framebuffer, attachment, texture);
+ return true;
+ }
+
+ static void trackFramebufferAttachment(GLContextState glCtx, int framebuffer, int attachment, int texture) {
+ if (framebuffer == 0) return;
+ if (attachment == GL30.GL_DEPTH_STENCIL_ATTACHMENT) {
+ trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_DEPTH_ATTACHMENT, texture);
+ trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_STENCIL_ATTACHMENT, texture);
+ return;
+ }
+ final int slot = attachmentSlot(attachment);
+ if (slot < 0) return;
+ int[] slots = glCtx.framebufferTextures.get(framebuffer);
+ if (slots == null) {
+ if (texture == 0) return;
+ slots = new int[FRAMEBUFFER_SLOTS];
+ glCtx.framebufferTextures.put(framebuffer, slots);
+ }
+ setFramebufferSlot(slots, slot, texture);
+ }
+
+ static void setFramebufferSlot(int[] slots, int slot, int texture) {
+ final int previous = slots[slot];
+ if (previous == texture) return;
+ slots[slot] = texture;
+ final boolean locked = acquireDrawLock();
+ try {
+ if (texture != 0) textureFramebufferRefs.addTo(texture, 1);
+ if (previous != 0 && textureFramebufferRefs.addTo(previous, -1) == 1) {
+ textureFramebufferRefs.remove(previous);
+ if (deferredDeleteTextures.get(previous) == DEFERRED_ATTACHED) scheduleRelease(previous);
+ }
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ private static void detachFromFramebuffer(GLContextState glCtx, int target, int framebuffer, int texture) {
+ final int[] slots = glCtx.framebufferTextures.get(framebuffer);
+ if (slots == null) return;
+ for (int slot = 0; slot < slots.length; slot++) {
+ if (slots[slot] != texture) continue;
+ RENDER_BACKEND.framebufferTexture2D(target, slotAttachment(slot), GL11.GL_TEXTURE_2D, 0, 0);
+ setFramebufferSlot(slots, slot, 0);
+ }
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java
new file mode 100644
index 000000000..c32c71fd3
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java
@@ -0,0 +1,1334 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
+import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder;
+import com.gtnewhorizons.angelica.glsm.recording.commands.TexImage2DCmd;
+import com.gtnewhorizons.angelica.glsm.recording.commands.TexSubImage2DCmd;
+import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
+import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack;
+import com.gtnewhorizons.angelica.glsm.states.PixelStoreState;
+import com.gtnewhorizons.angelica.glsm.states.SamplerUnitArray;
+import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding;
+import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray;
+import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
+import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
+import com.gtnewhorizons.angelica.glsm.texture.TextureStaging;
+import org.lwjgl.opengl.EXTTextureFilterAnisotropic;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL13;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL30;
+import org.lwjgl.opengl.GL31;
+import org.lwjgl.opengl.GL32;
+import org.lwjgl.opengl.GL33;
+import org.lwjgl.opengl.GL40;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_COORDS;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_UNITS;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.isRecordingDisplayList;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.recordExitTextureBind;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnceTrace;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMTextures {
+
+ private GLSMTextures() {}
+
+ public static long texBindMisses;
+
+
+ public static int getMaxBoundTextureUnit() {
+ return ctx().maxBoundTextureUnit;
+ }
+
+ public static void trackMaxBoundTextureUnit(int unit) {
+ final GLContextState glCtx = ctx();
+ if (unit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = unit;
+ }
+ private static final Tracy.ZoneId Z_TEX_DELETE = Tracy.zoneId("texDelete", Tracy.COLOR_FFP);
+
+ /**
+ * Get the active texture unit for server-side state operations. If caching is enabled, returns cached value. If caching is disabled (SharedDrawable),
+ * queries actual GL state.
+ */
+ public static int getActiveTextureUnitForServerState() {
+ if (isCachingEnabled()) {
+ return getActiveTextureUnit();
+ }
+ // Query actual GL state for SharedDrawable context
+ return RENDER_BACKEND.getInteger(GL13.GL_ACTIVE_TEXTURE) - GL13.GL_TEXTURE0;
+ }
+
+ /**
+ * Get the texture bound to the current texture unit for server-side state operations.
+ * If caching is enabled, returns cached value.
+ * If caching is disabled (SharedDrawable), queries actual GL state.
+ */
+ public static int getBoundTextureForServerState() {
+ if (isCachingEnabled()) {
+ return getBoundTexture();
+ }
+ // Query actual GL state for SharedDrawable context
+ return RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D);
+ }
+
+ private static TextureInfo getBoundTextureInfo() {
+ final GLContextState glCtx = ctx();
+ if (isCachingEnabled()) {
+ return glCtx.textures.getTextureUnitBindings(glCtx.activeTextureUnit.getValue()).getOrResolveInfo();
+ }
+ return TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState());
+ }
+
+ /**
+ * Get the texture bound to a specific texture unit for server-side state operations.
+ * If caching is enabled, returns cached value.
+ * If caching is disabled (SharedDrawable), returns -1 to force operations to proceed
+ */
+ public static int getBoundTextureForServerState(int unit) {
+ if (isCachingEnabled()) {
+ return getBoundTexture(unit);
+ }
+ return -1;
+ }
+
+ public static int setTextureSupersamplingSamples(int samples) {
+ if (samples < 1 || samples > 16 || (samples & (samples - 1)) != 0) {
+ throw new IllegalArgumentException("Texture supersampling requires 1, 2, 4, 8, or 16 samples");
+ }
+ final GLContextState glCtx = ctx();
+ final int previous = glCtx.textureSupersamplingSamples;
+ if (previous != samples) {
+ beforeUncapturedStateChange();
+ glCtx.textureSupersamplingSamples = samples;
+ }
+ return previous;
+ }
+
+ public static void markTextureAsAtlas(int texture, int gutter) {
+ if (texture <= 0) return;
+ final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texture);
+ if (info.getAtlasGutter() != gutter) {
+ beforeUncapturedStateChange();
+ info.setAtlasGutter(gutter);
+ }
+ }
+
+ public static void glActiveTexture(int texture) {
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.ACTIVE_UNIT);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordActiveTexture(texture);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final int newTexture = texture - GL13.GL_TEXTURE0;
+ if (!isValidTextureUnit(newTexture, texture, "glActiveTexture")) {
+ return;
+ }
+ final boolean caching = isCachingEnabled();
+ if (!caching || glCtx.activeTextureUnit.getValue() != newTexture) {
+ mod(glCtx.activeTextureUnit).setValue(newTexture);
+ RENDER_BACKEND.activeTexture(texture);
+ }
+ }
+
+ private static boolean isValidTextureUnit(int unit, int rawEnum, String function) {
+ return isValidTextureUnit(unit, MAX_TEXTURE_UNITS, rawEnum, function);
+ }
+
+ private static boolean isValidTextureUnit(int unit, int limit, int rawEnum, String function) {
+ if (unit >= 0 && unit < limit) {
+ return true;
+ }
+ warnOnceTrace(function, "{}({}) is not a valid texture unit enum (expected GL_TEXTURE0..GL_TEXTURE{}); ignoring", function, rawEnum, limit - 1);
+ return false;
+ }
+
+ public static void glActiveTextureARB(int texture) {
+ glActiveTexture(texture);
+ }
+
+ public static void glClientActiveTexture(int texture) {
+ final int unit = texture - GL13.GL_TEXTURE0;
+ if (!isValidTextureUnit(unit, MAX_TEXTURE_COORDS, texture, "glClientActiveTexture")) {
+ return;
+ }
+ final GLContextState glCtx = ctx();
+ glCtx.exitCapture.write(ExitStateCapture.CLIENT_ACTIVE_UNIT);
+ glCtx.clientActiveTextureUnit = unit;
+ }
+
+ public static int getClientActiveTextureUnit() {
+ return ctx().clientActiveTextureUnit;
+ }
+
+ private static int getBoundTexture() {
+ return getBoundTexture(ctx().activeTextureUnit.getValue());
+ }
+
+ private static int getBoundTexture(int unit) {
+ return ctx().textures.getTextureUnitBindings(unit).getBinding();
+ }
+
+ public static void glBindTexture(int target, int texture) {
+ if (TextureInfoCache.isProxyTarget(target)) return;
+ final GLContextState glCtx = ctx();
+ recordExitTextureBind(glCtx, target, glCtx.activeTextureUnit.getValue());
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordBindTexture(target, texture);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ final long claim = GLSMTextureLifetime.claimForBind(texture, target);
+ if (claim == GLSMTextureLifetime.BIND_REJECTED) return;
+
+ if (!isCachingEnabled()) {
+ RENDER_BACKEND.bindTexture(target, texture);
+ GLSMTextureLifetime.finishRescue(target, texture, claim);
+ return;
+ }
+
+ final int activeUnit = glCtx.activeTextureUnit.getValue();
+ final TextureBindingStack textureUnit = glCtx.textures.getTextureUnitBindings(activeUnit);
+ final int cachedBinding = textureUnit.getBinding();
+
+ if (cachedBinding != texture || (texture == 0 && textureUnit.getTarget() != target)) {
+ if (activeUnit != 0 || target != GL11.GL_TEXTURE_2D) beforeUncapturedStateChange();
+ if (Tracy.ENABLED) texBindMisses++;
+ RENDER_BACKEND.bindTexture(target, texture);
+ mod(textureUnit).setBinding(texture, target);
+ if (texture != 0) {
+ if (activeUnit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = activeUnit;
+ }
+ if (!glCtx.lockBindCallback && target == GL11.GL_TEXTURE_2D && glCtx.activeTextureUnit.getValue() == 0) {
+ glCtx.lockBindCallback = true;
+ if (GLSMHooks.TEXTURE_BIND.hasListeners()) {
+ GLSMHooks.textureBindEvent.textureId = texture;
+ GLSMHooks.TEXTURE_BIND.post(GLSMHooks.textureBindEvent);
+ }
+ RenderSystem.bindTextureToUnit(0, texture);
+ glCtx.lockBindCallback = false;
+ }
+ }
+ GLSMTextureLifetime.finishRescue(target, texture, claim);
+ }
+
+ private static void bindTextureUnitByName(int unit, int texture) {
+ if (GLSMTextureLifetime.isDeferredDelete(texture)) return;
+ final CommandRecorder paused = DisplayListManager.pauseRecording();
+ final int saved = getActiveTextureUnit();
+ try {
+ glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ if (texture == 0) {
+ // Read before the 2D unbind, which overwrites the unit's cached target.
+ final int target = ctx().textures.getTextureUnitBindings(unit).getTarget();
+ glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ if (!GLSMTextureLifetime.is2D(target)) glBindTexture(target, 0);
+ } else {
+ glBindTexture(GLSMTextureLifetime.targetOf(texture), texture);
+ }
+ } finally {
+ glActiveTexture(GL13.GL_TEXTURE0 + saved);
+ if (paused != null) DisplayListManager.resumeRecording(paused);
+ }
+ }
+
+ public static void glBindTextures(int first, int count, IntBuffer textures) {
+ if (first < 0 || !isValidTextureUnit(first + count - 1, GL13.GL_TEXTURE0 + first + count - 1, "glBindTextures")) return;
+ if (textures != null) requireRemaining(textures, count);
+ for (int i = 0; i < count; i++) bindTextureUnitByName(first + i, textures == null ? 0 : textures.get(textures.position() + i));
+ }
+
+ public static void glBindTextures(int first, IntBuffer textures) {
+ if (textures != null) glBindTextures(first, textures.remaining(), textures);
+ }
+
+ public static void glBindTextures(int first, int[] textures) {
+ if (textures != null) glBindTextures(first, textures.length, IntBuffer.wrap(textures));
+ }
+
+ public static void glBindTextureUnit(int unit, int texture) {
+ if (isValidTextureUnit(unit, GL13.GL_TEXTURE0 + unit, "glBindTextureUnit")) bindTextureUnitByName(unit, texture);
+ }
+
+ public static void glBindMultiTextureEXT(int texunit, int target, int texture) {
+ if (DisplayListManager.isRecording()) throw DisplayListManager.unsupportedInList("glBindMultiTextureEXT");
+ if (!isValidTextureUnit(texunit - GL13.GL_TEXTURE0, texunit, "glBindMultiTextureEXT")) return;
+ final int saved = getActiveTextureUnit();
+ glActiveTexture(texunit);
+ glBindTexture(target, texture);
+ glActiveTexture(GL13.GL_TEXTURE0 + saved);
+ }
+
+ private static int changeFormatIfDeprecated(int internalformat) {
+ internalformat = GLESFormatRemap.promoteAlphaFormat(internalformat);
+ if (RenderSystem.isGLES()) {
+ internalformat = GLESFormatRemap.remapInternalFormat(internalformat);
+ }
+ return internalformat;
+ }
+
+ public static final class GLESTexImageRemap {
+ private final GLESFormatRemap.Result r;
+ private GLESTexImageRemap(GLESFormatRemap.Result r) { this.r = r; }
+ public int internalFormat() { return r.internalFormat(); }
+ public int format() { return r.format(); }
+ public int type() { return r.type(); }
+ }
+
+ public static GLESTexImageRemap remapTexImageForGLES(int internalformat, int format, int type) {
+ return new GLESTexImageRemap(GLESFormatRemap.apply(internalformat, format, type, RenderSystem.isGLES()));
+ }
+
+ static {
+ if (ByteOrder.nativeOrder() != ByteOrder.LITTLE_ENDIAN) {
+ LOGGER.warn("GLSM GLES pixel-type remap assumes little-endian host; big-endian detected - BGRA uploads may be byte-swapped");
+ }
+ }
+
+ static int remapPixelTypeForGLES(int format, int type) {
+ return RenderSystem.isGLES() ? GLESFormatRemap.remapPixelType(format, type) : type;
+ }
+
+ private static int remapTypeForRemappedInternalFormat(int internalformat, int type) {
+ if (!RenderSystem.isGLES()) return type;
+ if (!GLESFormatRemap.isGenericPixelType(type)) return type;
+ return GLESFormatRemap.typeForInternalFormatES32(internalformat, type);
+ }
+
+ public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordComplexCommand(TexImage2DCmd.fromIntBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordComplexCommand(TexImage2DCmd.fromFloatBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordComplexCommand(TexImage2DCmd.fromDoubleBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordComplexCommand(TexImage2DCmd.fromByteBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels != null ? pixels.asIntBuffer() : null);
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexImage2D with buffer offset");
+ }
+ TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset);
+ RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glDeleteTextures(int id) {
+ rejectExitCapture();
+ deleteTexture(id);
+ }
+
+ public static void glDeleteTextures(IntBuffer ids) {
+ rejectExitCapture();
+ for (int i = 0; i < ids.remaining(); i++) {
+ deleteTexture(ids.get(ids.position() + i));
+ }
+ }
+
+ public static void glDeleteTextures(int[] ids) {
+ rejectExitCapture();
+ for (int id : ids) deleteTexture(id);
+ }
+
+ private static void deleteTexture(int id) {
+ if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_DELETE);
+ try {
+ GLSMTextureLifetime.deferDeleteTexture(id);
+ onDeleteTexture(id);
+ } finally {
+ if (Tracy.ENABLED) Tracy.endZone();
+ }
+ }
+
+ public static int glGenTextures() {
+ requireContext("glGenTextures");
+ GLSMTextureLifetime.flushDeferredTextureDeletes();
+ return RENDER_BACKEND.genTextures();
+ }
+
+ public static void glGenTextures(IntBuffer textures) {
+ requireContext("glGenTextures");
+ GLSMTextureLifetime.flushDeferredTextureDeletes();
+ RENDER_BACKEND.genTextures(textures);
+ }
+
+ public static void glGenTextures(int[] textures) {
+ requireContext("glGenTextures");
+ GLSMTextureLifetime.flushDeferredTextureDeletes();
+ for (int i = 0; i < textures.length; i++) textures[i] = RENDER_BACKEND.genTextures();
+ }
+
+ public static int glCreateTextures(int target) {
+ requireContext("glCreateTextures");
+ final int id = RENDER_BACKEND.createTextures(target);
+ final boolean locked = acquireDrawLock();
+ try {
+ GLSMTextureLifetime.recordTarget(id, target);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ return id;
+ }
+
+ public static void glCreateTextures(int target, IntBuffer textures) {
+ for (int i = textures.position(); i < textures.limit(); i++) textures.put(i, glCreateTextures(target));
+ }
+
+ public static void glCreateTextures(int target, int[] textures) {
+ for (int i = 0; i < textures.length; i++) textures[i] = glCreateTextures(target);
+ }
+
+ public static void enableTexture() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordEnable(GL11.GL_TEXTURE_2D);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ enableTexture(ctx());
+ }
+
+ static void enableTexture(GLContextState glCtx) {
+ glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).enable();
+ }
+
+ public static void disableTexture() {
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordDisable(GL11.GL_TEXTURE_2D);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ disableTexture(ctx());
+ }
+
+ static void disableTexture(GLContextState glCtx) {
+ glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).disable();
+ }
+
+ public static void setFilter(boolean bilinear, boolean mipmap) {
+ final int i, j;
+ if (bilinear) {
+ i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_LINEAR;
+ j = GL11.GL_LINEAR;
+ } else {
+ i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_NEAREST;
+ j = GL11.GL_NEAREST;
+ }
+ glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, i);
+ glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, j);
+ }
+
+ private static void onDeleteTexture(int id) {
+ final GLContextState glCtx = ctx();
+ TextureInfoCache.INSTANCE.onDeleteTexture(id);
+ if (GLSMHooks.TEXTURE_DELETE.hasListeners()) {
+ GLSMHooks.textureDeleteEvent.textureId = id;
+ GLSMHooks.TEXTURE_DELETE.post(GLSMHooks.textureDeleteEvent);
+ }
+
+ // Always delete
+ clearTextureBindings(glCtx, id);
+ }
+
+ static void clearTextureBindings(GLContextState glCtx, int id) {
+ for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) {
+ if (glCtx.textures.getTextureUnitBindings(i).getBinding() == id) {
+ mod(glCtx.textures.getTextureUnitBindings(i)).setBinding(0);
+ }
+ }
+
+ for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) {
+ final ImageUnitBinding image = glCtx.imageUnits.get(i);
+ if (image != null && image.getTexture() == id) {
+ image.reset();
+ }
+ }
+ }
+
+ public static int getActiveTextureUnit() {
+ return ctx().activeTextureUnit.getValue();
+ }
+
+ private static boolean handleRemovedTexParam(int target, int pname, int value) {
+ if (pname == GL14.GL_GENERATE_MIPMAP) {
+ if (target == GL11.GL_TEXTURE_2D) {
+ final TextureInfo info = getBoundTextureInfo();
+ if (info != null) info.setGenerateMipmap(value != 0);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private static void maybeGenerateMipmap(int target, int level) {
+ if (target != GL11.GL_TEXTURE_2D) return;
+ final TextureInfo info = getBoundTextureInfo();
+ if (info != null && info.isGenerateMipmap() && level == info.getBaseLevel() && level < info.getMaxLevel()) {
+ RENDER_BACKEND.generateMipmap(target);
+ }
+ }
+
+ public static boolean updateTexParameteriCache(int target, int texture, int pname, int param) {
+ rejectExitCapture();
+ if (target != GL11.GL_TEXTURE_2D) {
+ return true;
+ }
+ return updateTexParameteriCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param);
+ }
+
+ static boolean updateTexParameteriCache(TextureInfo info, int pname, int param) {
+ if (info == null) {
+ return true;
+ }
+ switch (pname) {
+ case GL11.GL_TEXTURE_MIN_FILTER -> {
+ if (info.getMinFilter() == param && isCachingEnabled()) return false;
+ info.setMinFilter(param);
+ }
+ case GL11.GL_TEXTURE_MAG_FILTER -> {
+ if (info.getMagFilter() == param && isCachingEnabled()) return false;
+ info.setMagFilter(param);
+ }
+ case GL11.GL_TEXTURE_WRAP_S -> {
+ if (info.getWrapS() == param && isCachingEnabled()) return false;
+ info.setWrapS(param);
+ }
+ case GL11.GL_TEXTURE_WRAP_T -> {
+ if (info.getWrapT() == param && isCachingEnabled()) return false;
+ info.setWrapT(param);
+ }
+ case GL12.GL_TEXTURE_BASE_LEVEL -> {
+ if (info.getBaseLevel() == param && isCachingEnabled()) return false;
+ info.setBaseLevel(param);
+ }
+ case GL12.GL_TEXTURE_MAX_LEVEL -> {
+ if (info.getMaxLevel() == param && isCachingEnabled()) return false;
+ info.setMaxLevel(param);
+ }
+ case GL12.GL_TEXTURE_MIN_LOD -> {
+ if (info.getMinLod() == param && isCachingEnabled()) return false;
+ info.setMinLod(param);
+ }
+ case GL12.GL_TEXTURE_MAX_LOD -> {
+ if (info.getMaxLod() == param && isCachingEnabled()) return false;
+ info.setMaxLod(param);
+ }
+ }
+ return true;
+ }
+
+ public static void glTexParameter(int target, int pname, IntBuffer params) {
+ rejectExitCapture();
+ if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? params.get(params.position()) : 0)) return;
+ if (params.remaining() >= 1) {
+ final int val = params.get(params.position());
+ final int remapped = remapTexClamp(pname, val);
+ if (remapped != val) params.put(params.position(), remapped);
+ if (target == GL11.GL_TEXTURE_2D) {
+ updateTexParameteriCache(getBoundTextureInfo(), pname, remapped);
+ }
+ }
+ RENDER_BACKEND.texParameteriv(target, pname, params);
+ }
+
+ public static void glTexParameter(int target, int pname, FloatBuffer params) {
+ rejectExitCapture();
+ if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? (int) params.get(params.position()) : 0)) return;
+ if (params.remaining() >= 1) {
+ final float val = params.get(params.position());
+ final float remapped = remapTexClamp(pname, val);
+ if (remapped != val) params.put(params.position(), remapped);
+ if (target == GL11.GL_TEXTURE_2D) {
+ updateTexParameterfCache(getBoundTextureInfo(), pname, remapped);
+ }
+ }
+ RENDER_BACKEND.texParameterfv(target, pname, params);
+ }
+
+ public static void glTexParameteri(int target, int pname, int param) {
+ rejectExitCapture();
+ if (handleRemovedTexParam(target, pname, param)) return;
+ param = remapTexClamp(pname, param);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordTexParameteri(target, pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (getActiveTextureUnit() != 0) beforeUncapturedStateChange();
+ if (target != GL11.GL_TEXTURE_2D) {
+ RENDER_BACKEND.texParameteri(target, pname, param);
+ return;
+ }
+ if (!updateTexParameteriCache(getBoundTextureInfo(), pname, param)) return;
+
+ RENDER_BACKEND.texParameteri(target, pname, param);
+ }
+
+ public static boolean updateTexParameterfCache(int target, int texture, int pname, float param) {
+ rejectExitCapture();
+ if (target != GL11.GL_TEXTURE_2D) {
+ return true;
+ }
+ return updateTexParameterfCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param);
+ }
+
+ static boolean updateTexParameterfCache(TextureInfo info, int pname, float param) {
+ if (info == null) {
+ return true;
+ }
+ switch (pname) {
+ case GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_TEXTURE_WRAP_S, GL11.GL_TEXTURE_WRAP_T -> {
+ return updateTexParameteriCache(info, pname, (int) param);
+ }
+ case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> {
+ if (info.getMaxAnisotropy() == param && isCachingEnabled()) return false;
+ info.setMaxAnisotropy(param);
+ }
+ case GL14.GL_TEXTURE_LOD_BIAS -> {
+ if (info.getLodBias() == param && isCachingEnabled()) return false;
+ info.setLodBias(param);
+ }
+ }
+ return true;
+ }
+
+ public static void glTexParameterf(int target, int pname, float param) {
+ rejectExitCapture();
+ if (handleRemovedTexParam(target, pname, param > 0 ? (int) (param + 0.5f) : (int) (param - 0.5f))) return;
+ param = remapTexClamp(pname, param);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordTexParameterf(target, pname, param);
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ if (getActiveTextureUnit() != 0) beforeUncapturedStateChange();
+ if (target != GL11.GL_TEXTURE_2D) {
+ RENDER_BACKEND.texParameterf(target, pname, param);
+ return;
+ }
+ if (!updateTexParameterfCache(getBoundTextureInfo(), pname, param)) return;
+
+ RENDER_BACKEND.texParameterf(target, pname, param);
+ }
+
+ public static final long TEX_PARAM_MISS = Long.MIN_VALUE;
+
+ public static long lookupTexParameteri(TextureInfo info, int pname) {
+ if (info == null) {
+ if (isRecordingDisplayList()) {
+ throw new IllegalStateException(
+ "glGetTexParameteri called during display list recording with no cached TextureInfo. " +
+ "Cannot query OpenGL state during compilation!");
+ }
+ return TEX_PARAM_MISS;
+ }
+ return switch (pname) {
+ case GL11.GL_TEXTURE_MIN_FILTER -> info.getMinFilter();
+ case GL11.GL_TEXTURE_MAG_FILTER -> info.getMagFilter();
+ case GL11.GL_TEXTURE_WRAP_S -> info.getWrapS();
+ case GL11.GL_TEXTURE_WRAP_T -> info.getWrapT();
+ case GL12.GL_TEXTURE_BASE_LEVEL -> info.getBaseLevel();
+ case GL12.GL_TEXTURE_MAX_LEVEL -> info.getMaxLevel();
+ case GL12.GL_TEXTURE_MIN_LOD -> info.getMinLod();
+ case GL12.GL_TEXTURE_MAX_LOD -> info.getMaxLod();
+ case GL14.GL_GENERATE_MIPMAP -> info.isGenerateMipmap() ? GL11.GL_TRUE : GL11.GL_FALSE;
+ default -> {
+ if (isRecordingDisplayList()) {
+ throw new IllegalStateException(String.format(
+ "glGetTexParameteri called during display list recording with uncached pname 0x%s. " +
+ "Cannot query OpenGL state during compilation!", Integer.toHexString(pname)));
+ }
+ yield TEX_PARAM_MISS;
+ }
+ };
+ }
+
+ public static int glGetTexParameteri(int target, int pname) {
+ rejectExitCapture();
+ if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) {
+ return RENDER_BACKEND.getTexParameteri(target, pname);
+ }
+ final long v = lookupTexParameteri(getBoundTextureInfo(), pname);
+ return v != TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTexParameteri(target, pname);
+ }
+
+ public static float glGetTexParameterf(int target, int pname) {
+ rejectExitCapture();
+ if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) {
+ return RENDER_BACKEND.getTexParameterf(target, pname);
+ }
+ final TextureInfo info = getBoundTextureInfo();
+ if(info == null) {
+ if (isRecordingDisplayList()) {
+ throw new IllegalStateException(
+ "glGetTexParameterf called during display list recording with no cached TextureInfo. " +
+ "Cannot query OpenGL state during compilation!");
+ }
+ return RENDER_BACKEND.getTexParameterf(target, pname);
+ }
+
+ return switch (pname) {
+ case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> info.getMaxAnisotropy();
+ case GL14.GL_TEXTURE_LOD_BIAS -> info.getLodBias();
+ default -> {
+ if (isRecordingDisplayList()) {
+ throw new IllegalStateException(String.format(
+ "glGetTexParameterf called during display list recording with uncached pname 0x%s. " +
+ "Cannot query OpenGL state during compilation!", Integer.toHexString(pname)));
+ }
+ yield RENDER_BACKEND.getTexParameterf(target, pname);
+ }
+ };
+ }
+
+ private static int mipLevelSize(int base, int level) {
+ if (base <= 0 || level < 0 || level >= Integer.SIZE - 1) return 1;
+ return Math.max(base >> level, 1);
+ }
+
+ public static int glGetTexLevelParameteri(int target, int level, int pname) {
+ rejectExitCapture();
+ if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) {
+ return RENDER_BACKEND.getTexLevelParameteri(target, level, pname);
+ }
+ final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState());
+ if (info == null) {
+ if (isRecordingDisplayList()) {
+ throw new IllegalStateException(String.format(
+ "glGetTexLevelParameteri called during display list recording with no cached TextureInfo for texture %d. " +
+ "Cannot query OpenGL state during compilation!", getBoundTextureForServerState()));
+ }
+ return RENDER_BACKEND.getTexLevelParameteri(target, level, pname);
+ }
+ return switch (pname) {
+ case GL11.GL_TEXTURE_WIDTH -> mipLevelSize(info.getWidth(), level);
+ case GL11.GL_TEXTURE_HEIGHT -> mipLevelSize(info.getHeight(), level);
+ case GL11.GL_TEXTURE_INTERNAL_FORMAT -> {
+ if (info.needsInternalFormatResolve() && isRecordingDisplayList()) {
+ throw new IllegalStateException(String.format("glGetTexLevelParameteri(GL_TEXTURE_INTERNAL_FORMAT) needs to resolve a generic compressed format for texture %d during display list recording", getBoundTextureForServerState()));
+ }
+ yield info.getResolvedInternalFormat();
+ }
+ default -> {
+ if (isRecordingDisplayList()) {
+ throw new IllegalStateException(String.format(
+ "glGetTexLevelParameteri called during display list recording with uncached pname 0x%s for texture %d. " +
+ "Cannot query OpenGL state during compilation!", Integer.toHexString(pname), getBoundTextureForServerState()));
+ }
+ yield RENDER_BACKEND.getTexLevelParameteri(target, level, pname);
+ }
+ };
+ }
+
+ public static void glGetTexImage(int target, int level, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ if (RenderSystem.isGLES()) {
+ getTexImageViaFboReadPixels(target, level, format, type, pixels);
+ return;
+ }
+ GLSMBuffers.suspendPixelPackBuffer();
+ RENDER_BACKEND.getTexImage(target, level, format, type, pixels);
+ GLSMBuffers.restorePixelPackBuffer();
+ }
+ public static void glGetTexImage(int target, int level, int format, int type, IntBuffer pixels) {
+ rejectExitCapture();
+ if (RenderSystem.isGLES()) {
+ getTexImageViaFboReadPixels(target, level, format, type, pixels);
+ return;
+ }
+ GLSMBuffers.suspendPixelPackBuffer();
+ RENDER_BACKEND.getTexImage(target, level, format, type, pixels);
+ GLSMBuffers.restorePixelPackBuffer();
+ }
+
+ private static void getTexImageViaFboReadPixels(int target, int level, int format, int type, Buffer pixels) {
+ if (target != GL11.GL_TEXTURE_2D) {
+ LOGGER.warn("glGetTexImage ES: unsupported target 0x{}", Integer.toHexString(target));
+ return;
+ }
+ final int texId = getBoundTextureForServerState();
+ if (texId == 0) return;
+ final int width = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_WIDTH);
+ final int height = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_HEIGHT);
+ if (width <= 0 || height <= 0) return;
+
+ final int prevReadFb = RENDER_BACKEND.getInteger(GL30.GL_READ_FRAMEBUFFER_BINDING);
+ final int fbo = RENDER_BACKEND.genFramebuffers();
+ try {
+ RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo);
+ RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, target, texId, level);
+ final int status = RENDER_BACKEND.checkFramebufferStatus(GL30.GL_READ_FRAMEBUFFER);
+ if (status != GL30.GL_FRAMEBUFFER_COMPLETE) {
+ LOGGER.warn("glGetTexImage ES: FBO incomplete (0x{})", Integer.toHexString(status));
+ return;
+ }
+ final int esType = remapPixelTypeForGLES(format, type);
+ final boolean bgra = format == GL12.GL_BGRA;
+ final int esFormat = bgra ? GL11.GL_RGBA : format;
+ GLSMBuffers.suspendPixelPackBuffer();
+ try {
+ if (pixels instanceof ByteBuffer bb) {
+ RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, bb);
+ } else if (pixels instanceof IntBuffer ib) {
+ RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, ib);
+ }
+ if (bgra) swapRedBlueInPlace(pixels);
+ } finally {
+ GLSMBuffers.restorePixelPackBuffer();
+ }
+ } finally {
+ RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, prevReadFb);
+ RENDER_BACKEND.deleteFramebuffers(fbo);
+ }
+ }
+
+ private static void swapRedBlueInPlace(Buffer pixels) {
+ if (pixels instanceof ByteBuffer bb) {
+ final int p = bb.position();
+ final int lim = bb.limit();
+ for (int i = p; i + 3 < lim; i += 4) {
+ final byte r = bb.get(i);
+ bb.put(i, bb.get(i + 2));
+ bb.put(i + 2, r);
+ }
+ } else if (pixels instanceof IntBuffer ib) {
+ final int p = ib.position();
+ final int lim = ib.limit();
+ for (int i = p; i < lim; i++) {
+ final int w = ib.get(i);
+ ib.put(i, (w & 0xFF00FF00) | ((w & 0xFF) << 16) | ((w >> 16) & 0xFF));
+ }
+ }
+ }
+ public static void glTexStorage2D(int target, int levels, int internalFormat, int width, int height) {
+ rejectExitCapture();
+ RENDER_BACKEND.texStorage2D(target, levels, internalFormat, width, height);
+ TextureInfoCache.INSTANCE.onTexStorage2D(target, internalFormat, width, height);
+ }
+ public static void glClearTexImage(int texture, int level, int format, int type, ByteBuffer data) {
+ rejectExitCapture();
+ RENDER_BACKEND.clearTexImage(texture, level, format, type);
+ if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture);
+ }
+
+ public static int glGenSamplers() {
+ requireContext("glGenSamplers");
+ return RENDER_BACKEND.genSamplers();
+ }
+
+ public static void glGenSamplers(IntBuffer samplers) {
+ requireContext("glGenSamplers");
+ for (int i = samplers.position(); i < samplers.limit(); i++) samplers.put(i, RENDER_BACKEND.genSamplers());
+ }
+
+ public static void glGenSamplers(int[] samplers) {
+ requireContext("glGenSamplers");
+ for (int i = 0; i < samplers.length; i++) samplers[i] = RENDER_BACKEND.genSamplers();
+ }
+
+ public static void glDeleteSamplers(int sampler) {
+ rejectExitCapture();
+ if (sampler == 0) return;
+ ctx().samplerUnits.unbindEverywhere(sampler);
+ RENDER_BACKEND.deleteSamplers(sampler);
+ }
+
+ public static void glDeleteSamplers(IntBuffer samplers) {
+ for (int i = samplers.position(); i < samplers.limit(); i++) glDeleteSamplers(samplers.get(i));
+ }
+
+ public static void glDeleteSamplers(int[] samplers) {
+ for (int sampler : samplers) glDeleteSamplers(sampler);
+ }
+
+ public static void glBindSampler(int unit, int sampler) {
+ bindSampler(ctx().samplerUnits, unit, sampler);
+ }
+
+ private static void bindSampler(SamplerUnitArray units, int unit, int sampler) {
+ rejectExitCapture();
+ if (isCachingEnabled() && unit >= 0 && unit < units.size() && units.get(unit) == sampler) return;
+ beforeUncapturedStateChange();
+ if (!units.set(unit, sampler)) {
+ warnOnce("samplerUnitRange", "glBindSampler unit {} exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS {}", unit, units.size());
+ }
+ RENDER_BACKEND.bindSampler(unit, sampler);
+ }
+
+ public static void unbindAllSamplers() {
+ final SamplerUnitArray units = ctx().samplerUnits;
+ if (units.getHighestBoundUnit() < 0) return;
+ beforeUncapturedStateChange();
+ for (int unit = units.getHighestBoundUnit(); unit >= 0; unit = units.getHighestBoundUnit()) {
+ units.set(unit, 0);
+ RENDER_BACKEND.bindSampler(unit, 0);
+ }
+ }
+
+ public static void glBindSamplers(int first, int count, IntBuffer samplers) {
+ if (samplers == null) {
+ for (int i = 0; i < count; i++) glBindSampler(first + i, 0);
+ return;
+ }
+ requireRemaining(samplers, count);
+ final int base = samplers.position();
+ for (int i = 0; i < count; i++) glBindSampler(first + i, samplers.get(base + i));
+ }
+
+ private static void requireRemaining(IntBuffer buffer, int count) {
+ if (buffer.remaining() < count) throw new IllegalArgumentException("Number of remaining buffer elements is " + buffer.remaining() + ", must be at least " + count);
+ }
+
+ public static void glBindSamplers(int first, IntBuffer samplers) {
+ if (samplers != null) glBindSamplers(first, samplers.remaining(), samplers);
+ }
+
+ public static void glBindSamplers(int first, int[] samplers) {
+ if (samplers == null) return;
+ for (int i = 0; i < samplers.length; i++) glBindSampler(first + i, samplers[i]);
+ }
+
+ public static int getSamplerBinding(int unit) { return ctx().samplerUnits.get(unit); }
+ public static int getSamplerUnitCount() { return ctx().samplerUnits.size(); }
+ public static void glSamplerParameteri(int sampler, int pname, int param) { rejectExitCapture(); RENDER_BACKEND.samplerParameteri(sampler, pname, param); }
+ public static void glSamplerParameterf(int sampler, int pname, float param) { rejectExitCapture(); RENDER_BACKEND.samplerParameterf(sampler, pname, param); }
+
+ public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexImage1D");
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage1D(target, level, internalformat, width, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+
+ public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexImage3D");
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+
+ public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) {
+ rejectExitCapture();
+ internalformat = changeFormatIfDeprecated(internalformat);
+ type = remapPixelTypeForGLES(format, type);
+ type = remapTypeForRemappedInternalFormat(internalformat, type);
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexImage3D");
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+
+ public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexSubImage1D");
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texSubImage1D(target, level, xoffset, width, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+
+ public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ type = remapPixelTypeForGLES(format, type);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromByteBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) {
+ rejectExitCapture();
+ type = remapPixelTypeForGLES(format, type);
+ final RecordMode mode = DisplayListManager.getRecordMode();
+ if (mode != RecordMode.NONE) {
+ DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromIntBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState));
+ if (mode == RecordMode.COMPILE) {
+ return;
+ }
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) {
+ rejectExitCapture();
+ type = remapPixelTypeForGLES(format, type);
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexSubImage2D with buffer offset");
+ }
+ RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset);
+ TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static TextureStaging beginTextureStaging(int level, int x, int y, int width, int height) {
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("beginTextureStaging");
+ }
+ if (!ctx().pixelUnpackState.isDefault()) {
+ return null;
+ }
+ return RENDER_BACKEND.beginTextureStaging(level, x, y, width, height);
+ }
+
+ public static boolean commitTextureStaging(TextureStaging staging) {
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("commitTextureStaging");
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ final boolean committed;
+ try {
+ committed = RENDER_BACKEND.commitTextureStaging(staging);
+ } finally {
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+ if (committed) {
+ TextureInfoCache.INSTANCE.onTexSubImage2D(GL11.GL_TEXTURE_2D, staging.level());
+ maybeGenerateMipmap(GL11.GL_TEXTURE_2D, staging.level());
+ }
+ return committed;
+ }
+
+ public static void abandonTextureStaging(TextureStaging staging) {
+ RENDER_BACKEND.abandonTextureStaging(staging);
+ }
+
+ public static void trimTextureStaging() {
+ RENDER_BACKEND.trimTextureStaging();
+ }
+
+ public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glTexSubImage3D");
+ }
+ GLSMBuffers.suspendPixelUnpackBuffer();
+ RENDER_BACKEND.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ }
+
+ public static void glCopyTexImage1D(int target, int level, int internalFormat, int x, int y, int width, int border) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glCopyTexImage1D");
+ }
+ RENDER_BACKEND.copyTexImage1D(target, level, internalFormat, x, y, width, border);
+ }
+
+ public static void glCopyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) {
+ rejectExitCapture();
+ internalFormat = changeFormatIfDeprecated(internalFormat);
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glCopyTexImage2D");
+ }
+ RENDER_BACKEND.copyTexImage2D(target, level, internalFormat, x, y, width, height, border);
+ TextureInfoCache.INSTANCE.onCopyTexImage2D(target, level, internalFormat, width, height);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glCopyTexSubImage1D(int target, int level, int xoffset, int x, int y, int width) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glCopyTexSubImage1D");
+ }
+ RENDER_BACKEND.copyTexSubImage1D(target, level, xoffset, x, y, width);
+ }
+
+ public static void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glCopyTexSubImage2D");
+ }
+ RENDER_BACKEND.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+ TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
+ maybeGenerateMipmap(target, level);
+ }
+
+ public static void glCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) {
+ rejectExitCapture();
+ if (DisplayListManager.isRecording()) {
+ throw DisplayListManager.unsupportedInList("glCopyTexSubImage3D");
+ }
+ RENDER_BACKEND.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+ }
+
+ // glPixelStore* isn't compiled into display lists, it executes immediately
+ public static void glPixelStorei(int pname, int param) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (isCachingEnabled()) {
+ if (PixelStoreState.isPack(pname)) {
+ glCtx.pixelPackState = glCtx.pixelPackState.with(pname, param);
+ } else {
+ glCtx.pixelUnpackState = glCtx.pixelUnpackState.with(pname, param);
+ }
+ }
+ RENDER_BACKEND.pixelStorei(pname, param);
+ }
+
+ public static void glPixelStoref(int pname, float param) {
+ glPixelStorei(pname, param < 0 ? -Math.round(-param) : Math.round(param));
+ }
+
+ public static void forcePixelUnpackState(PixelStoreState target) {
+ PixelStoreState.applyDiff(ctx().pixelUnpackState, target, false);
+ }
+
+ public static void restorePixelUnpackState(PixelStoreState applied) {
+ PixelStoreState.applyDiff(applied, ctx().pixelUnpackState, false);
+ }
+ public static boolean glIsTexture(int texture) { rejectExitCapture(); return !GLSMTextureLifetime.isDeferredDelete(texture) && RENDER_BACKEND.isTexture(texture); }
+ public static boolean glIsSampler(int sampler) { rejectExitCapture(); return RENDER_BACKEND.isSampler(sampler); }
+
+ public static void glGenerateMipmap(int target) {
+ rejectExitCapture();
+ RENDER_BACKEND.generateMipmap(target);
+ }
+
+ public static void setActiveTexture(int textureUnit) {
+ glActiveTexture(textureUnit);
+ }
+
+ /**
+ * In core profile, GL_CLAMP (0x2900) is removed. Remap to GL_CLAMP_TO_EDGE for wrap modes. Semantically equivalent when texture border is not used (border
+ * textures are also removed in core).
+ */
+ public static int remapTexClamp(int pname, int param) {
+ if (param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) {
+ return GL12.GL_CLAMP_TO_EDGE;
+ }
+ return param;
+ }
+
+ public static float remapTexClamp(int pname, float param) {
+ if ((int) param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) {
+ return (float) GL12.GL_CLAMP_TO_EDGE;
+ }
+ return param;
+ }
+
+ public static void remapTexClampBuffer(int pname, IntBuffer params) {
+ if (params.remaining() >= 1) {
+ final int val = params.get(params.position());
+ final int remapped = remapTexClamp(pname, val);
+ if (remapped != val) params.put(params.position(), remapped);
+ }
+ }
+
+ public static void glBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) {
+ rejectExitCapture();
+ if (GLSMTextureLifetime.isDeferredDelete(texture)) return;
+ final GLContextState glCtx = ctx();
+ final ImageUnitBinding binding = glCtx.imageUnits.get(unit);
+ if (binding == null) {
+ warnOnce("imageUnitRange", "glBindImageTexture unit {} exceeds GL_MAX_IMAGE_UNITS {}", unit, glCtx.imageUnits.size());
+ } else {
+ binding.setBinding(texture, level, texture != 0 && layered, texture != 0 ? layer : 0, access, format);
+ if (texture != 0 && unit > glCtx.maxBoundImageUnit) glCtx.maxBoundImageUnit = unit;
+ }
+ if (access != GL15.GL_READ_ONLY) TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture);
+ RENDER_BACKEND.bindImageTexture(unit, texture, level, layered, layer, access, format);
+ }
+
+ public static void glBindImageTextures(int first, int count, IntBuffer textures) {
+ if (first < 0 || first + count > ctx().imageUnits.size()) return;
+ if (textures == null) {
+ for (int i = 0; i < count; i++) bindImageUnitByName(first + i, 0);
+ return;
+ }
+ requireRemaining(textures, count);
+ for (int i = 0; i < count; i++) bindImageUnitByName(first + i, textures.get(textures.position() + i));
+ }
+
+ public static void glBindImageTextures(int first, IntBuffer textures) {
+ if (textures != null) glBindImageTextures(first, textures.remaining(), textures);
+ }
+
+ public static void glBindImageTextures(int first, int[] textures) {
+ if (textures != null) glBindImageTextures(first, textures.length, IntBuffer.wrap(textures));
+ }
+
+ private static void bindImageUnitByName(int unit, int texture) {
+ if (texture == 0) {
+ glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8);
+ return;
+ }
+ if (GLSMTextureLifetime.isDeferredDelete(texture)) return;
+ final int format = TextureInfoCache.INSTANCE.getInfo(texture).getInternalFormat();
+ if (!isImageFormat(format)) return;
+ final boolean layered = switch (GLSMTextureLifetime.targetOf(texture)) {
+ case GL30.GL_TEXTURE_1D_ARRAY, GL30.GL_TEXTURE_2D_ARRAY, GL12.GL_TEXTURE_3D, GL13.GL_TEXTURE_CUBE_MAP, GL40.GL_TEXTURE_CUBE_MAP_ARRAY, GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY -> true;
+ default -> false;
+ };
+ glBindImageTexture(unit, texture, 0, layered, 0, GL15.GL_READ_WRITE, format);
+ }
+
+ private static boolean isImageFormat(int format) {
+ return switch (format) {
+ case GL30.GL_RGBA32F, GL30.GL_RGBA16F, GL30.GL_RG32F, GL30.GL_RG16F, GL30.GL_R11F_G11F_B10F, GL30.GL_R32F, GL30.GL_R16F,
+ GL30.GL_RGBA32UI, GL30.GL_RGBA16UI, GL33.GL_RGB10_A2UI, GL30.GL_RGBA8UI, GL30.GL_RG32UI, GL30.GL_RG16UI, GL30.GL_RG8UI, GL30.GL_R32UI, GL30.GL_R16UI, GL30.GL_R8UI,
+ GL30.GL_RGBA32I, GL30.GL_RGBA16I, GL30.GL_RGBA8I, GL30.GL_RG32I, GL30.GL_RG16I, GL30.GL_RG8I, GL30.GL_R32I, GL30.GL_R16I, GL30.GL_R8I,
+ GL11.GL_RGBA16, GL11.GL_RGB10_A2, GL11.GL_RGBA8, GL30.GL_RG16, GL30.GL_RG8, GL30.GL_R16, GL30.GL_R8,
+ GL31.GL_RGBA16_SNORM, GL31.GL_RGBA8_SNORM, GL31.GL_RG16_SNORM, GL31.GL_RG8_SNORM, GL31.GL_R16_SNORM, GL31.GL_R8_SNORM -> true;
+ default -> false;
+ };
+ }
+
+ public static ImageUnitBinding getImageUnitBinding(int unit) {
+ return ctx().imageUnits.get(unit);
+ }
+ public static void glCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ,
+ int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ,
+ int srcWidth, int srcHeight, int srcDepth) {
+ rejectExitCapture();
+ RENDER_BACKEND.copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ,
+ dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
+ if (dstTarget != GL30.GL_RENDERBUFFER && dstLevel == 0) TextureInfoCache.INSTANCE.onContentsChanged(dstName);
+ }
+ public static void glGetTexImage(int target, int level, int format, int type, long pixels) {
+ rejectExitCapture();
+ RENDER_BACKEND.getTexImage(target, level, format, type, pixels);
+ }
+
+ public static IntegerStateStack getActiveTextureUnitStack() {
+ return ctx().activeTextureUnit;
+ }
+
+ public static TextureUnitArray getTextures() {
+ return ctx().textures;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java
new file mode 100644
index 000000000..d302fb7c5
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java
@@ -0,0 +1,654 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
+import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
+import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
+import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL14;
+import org.lwjgl.opengl.GL15;
+import java.nio.ByteBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.ShortBuffer;
+
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext;
+import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnceTrace;
+import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
+
+public final class GLSMVertexInput {
+
+ private GLSMVertexInput() {}
+
+ public static int getBoundEBO() {
+ return ctx().vaos.boundEBO;
+ }
+
+ private static int texCoordConventional(GLContextState glCtx) {
+ return VAOManager.CONV_TEX0 + glCtx.clientActiveTextureUnit;
+ }
+
+ static void prepareClientArrays(GLContextState glCtx) {
+ final VAOManager vaos = glCtx.vaos;
+ if (vaos.hasAnyClientSideEnabledAttrib()) {
+ vaos.uploadClientArraysToVBO();
+ }
+ }
+
+ private static boolean isLegalClientArray(int conv, int size, int type, int stride) {
+ return isLegalPointer(VAOManager.isLegalConventional(conv, size, type), "client-array", "client array", conv, size, type, stride);
+ }
+
+ private static boolean isLegalVertexAttrib(int index, int size, int type, int stride, boolean integer) {
+ return isLegalPointer(VAOManager.isLegalGeneric(index, size, type, integer), "vertex-attrib", "vertex attribute", index, size, type, stride);
+ }
+
+ private static boolean isLegalPointer(boolean legal, String key, String what, int slot, int size, int type, int stride) {
+ if (stride < 0) warnOnceTrace(key + "-stride", "Negative {} stride {}", what, stride);
+ if (legal) return true;
+ warnOnceTrace(key + "-" + slot, "Ignoring {} {} with illegal size {} / type 0x{}", what, slot, size, Integer.toHexString(type));
+ return false;
+ }
+
+ private static boolean isValidVertexAttribIndex(int index, String function) {
+ if (index >= 0 && index < VAOManager.MAX_ATTRIBS) return true;
+ warnOnceTrace(function, "{}({}) is outside the {} supported vertex attributes; ignoring", function, index, VAOManager.MAX_ATTRIBS);
+ return false;
+ }
+
+ private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, long offset) {
+ rejectExitCapture();
+ if (!isLegalClientArray(conv, size, type, stride)) return;
+ final GLContextState glCtx = ctx();
+ if (glCtx.vaos.setConventional(conv, size, type, normalized, stride, offset, glCtx.boundVBO)) {
+ RENDER_BACKEND.vertexAttribPointer(VAOManager.conventionalLocation(conv), size, type, normalized, stride, offset);
+ }
+ }
+
+ private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, ByteBuffer pointer) {
+ rejectExitCapture();
+ if (!isLegalClientArray(conv, size, type, stride)) return;
+ ctx().vaos.setConventional(conv, size, type, normalized, stride, pointer);
+ }
+
+ static final int FIELD_SIZE = 0, FIELD_TYPE = 1 << 8, FIELD_STRIDE = 2 << 8, FIELD_BINDING = 3 << 8, FIELD_POINTER = 4 << 8;
+
+ static int clientArrayField(GLContextState glCtx, int pname) {
+ return switch (pname) {
+ case GL11.GL_VERTEX_ARRAY_SIZE -> VAOManager.CONV_POSITION | FIELD_SIZE;
+ case GL11.GL_VERTEX_ARRAY_TYPE -> VAOManager.CONV_POSITION | FIELD_TYPE;
+ case GL11.GL_VERTEX_ARRAY_STRIDE -> VAOManager.CONV_POSITION | FIELD_STRIDE;
+ case GL15.GL_VERTEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_POSITION | FIELD_BINDING;
+ case GL11.GL_VERTEX_ARRAY_POINTER -> VAOManager.CONV_POSITION | FIELD_POINTER;
+ case GL11.GL_NORMAL_ARRAY_TYPE -> VAOManager.CONV_NORMAL | FIELD_TYPE;
+ case GL11.GL_NORMAL_ARRAY_STRIDE -> VAOManager.CONV_NORMAL | FIELD_STRIDE;
+ case GL15.GL_NORMAL_ARRAY_BUFFER_BINDING -> VAOManager.CONV_NORMAL | FIELD_BINDING;
+ case GL11.GL_NORMAL_ARRAY_POINTER -> VAOManager.CONV_NORMAL | FIELD_POINTER;
+ case GL11.GL_COLOR_ARRAY_SIZE -> VAOManager.CONV_COLOR | FIELD_SIZE;
+ case GL11.GL_COLOR_ARRAY_TYPE -> VAOManager.CONV_COLOR | FIELD_TYPE;
+ case GL11.GL_COLOR_ARRAY_STRIDE -> VAOManager.CONV_COLOR | FIELD_STRIDE;
+ case GL15.GL_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_COLOR | FIELD_BINDING;
+ case GL11.GL_COLOR_ARRAY_POINTER -> VAOManager.CONV_COLOR | FIELD_POINTER;
+ case GL11.GL_INDEX_ARRAY_TYPE -> VAOManager.CONV_INDEX | FIELD_TYPE;
+ case GL11.GL_INDEX_ARRAY_STRIDE -> VAOManager.CONV_INDEX | FIELD_STRIDE;
+ case GL15.GL_INDEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_INDEX | FIELD_BINDING;
+ case GL11.GL_INDEX_ARRAY_POINTER -> VAOManager.CONV_INDEX | FIELD_POINTER;
+ case GL11.GL_EDGE_FLAG_ARRAY_STRIDE -> VAOManager.CONV_EDGE_FLAG | FIELD_STRIDE;
+ case GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING -> VAOManager.CONV_EDGE_FLAG | FIELD_BINDING;
+ case GL11.GL_EDGE_FLAG_ARRAY_POINTER -> VAOManager.CONV_EDGE_FLAG | FIELD_POINTER;
+ case GL14.GL_SECONDARY_COLOR_ARRAY_SIZE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_SIZE;
+ case GL14.GL_SECONDARY_COLOR_ARRAY_TYPE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_TYPE;
+ case GL14.GL_SECONDARY_COLOR_ARRAY_STRIDE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_STRIDE;
+ case GL15.GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_SECONDARY_COLOR | FIELD_BINDING;
+ case GL14.GL_SECONDARY_COLOR_ARRAY_POINTER -> VAOManager.CONV_SECONDARY_COLOR | FIELD_POINTER;
+ case GL14.GL_FOG_COORDINATE_ARRAY_TYPE -> VAOManager.CONV_FOG_COORD | FIELD_TYPE;
+ case GL14.GL_FOG_COORDINATE_ARRAY_STRIDE -> VAOManager.CONV_FOG_COORD | FIELD_STRIDE;
+ case GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -> VAOManager.CONV_FOG_COORD | FIELD_BINDING;
+ case GL14.GL_FOG_COORDINATE_ARRAY_POINTER -> VAOManager.CONV_FOG_COORD | FIELD_POINTER;
+ case GL11.GL_TEXTURE_COORD_ARRAY_SIZE -> texCoordConventional(glCtx) | FIELD_SIZE;
+ case GL11.GL_TEXTURE_COORD_ARRAY_TYPE -> texCoordConventional(glCtx) | FIELD_TYPE;
+ case GL11.GL_TEXTURE_COORD_ARRAY_STRIDE -> texCoordConventional(glCtx) | FIELD_STRIDE;
+ case GL15.GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING -> texCoordConventional(glCtx) | FIELD_BINDING;
+ case GL11.GL_TEXTURE_COORD_ARRAY_POINTER -> texCoordConventional(glCtx) | FIELD_POINTER;
+ default -> -1;
+ };
+ }
+
+ static int clientArrayParam(GLContextState glCtx, int key) {
+ final int conv = key & 0xFF;
+ final VAOManager.Attrib a = glCtx.vaos.conventional(conv);
+ final boolean specified = a != null && a.size != 0;
+ return switch (key & ~0xFF) {
+ case FIELD_SIZE -> specified ? a.size : conv == VAOManager.CONV_SECONDARY_COLOR ? 3 : 4;
+ case FIELD_TYPE -> specified ? a.type : GL11.GL_FLOAT;
+ case FIELD_STRIDE -> specified ? a.stride : 0;
+ default -> specified ? a.vboId : 0;
+ };
+ }
+
+ public static ByteBuffer glGetPointer(int pname, long result_size) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final int key = clientArrayField(glCtx, pname);
+ if ((key & ~0xFF) != FIELD_POINTER) return null;
+ final VAOManager.Attrib a = glCtx.vaos.conventional(key & 0xFF);
+ if (a == null) return null;
+ final long address = a.clientPointer != null ? MemoryUtilities.memAddress(a.clientPointer) : a.offset;
+ return address == 0 ? null : MemoryUtilities.memByteBuffer(address, (int) result_size);
+ }
+
+ public static void glEdgeFlagPointer(int stride, ByteBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer);
+ }
+
+ public static void glEdgeFlagPointer(int stride, long pointer_buffer_offset) {
+ ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer_buffer_offset);
+ }
+
+ public static void glFogCoordPointer(int stride, FloatBuffer data) {
+ ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(data));
+ }
+
+ public static void glFogCoordPointer(int stride, DoubleBuffer data) {
+ ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(data));
+ }
+
+ public static void glFogCoordPointer(int type, int stride, long data_buffer_offset) {
+ ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, type, false, stride, data_buffer_offset);
+ }
+
+ public static void glSecondaryColorPointer(int size, int stride, FloatBuffer data) {
+ ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_FLOAT, true, stride, MemoryUtilities.memByteBuffer(data));
+ }
+
+ public static void glSecondaryColorPointer(int size, int stride, DoubleBuffer data) {
+ ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_DOUBLE, true, stride, MemoryUtilities.memByteBuffer(data));
+ }
+
+ public static void glSecondaryColorPointer(int size, boolean unsigned, int stride, ByteBuffer data) {
+ final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE;
+ ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data);
+ }
+
+ public static void glSecondaryColorPointer(int size, int type, int stride, long data_buffer_offset) {
+ ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data_buffer_offset);
+ }
+
+ static void pointAttrib(GLContextState glCtx, int index) {
+ final VAOManager vaos = glCtx.vaos;
+ final VAOManager.Attrib a = vaos.attrib(index);
+ if (a == null) return;
+ RENDER_BACKEND.vertexAttribDivisor(index, a.divisor);
+ if (a.size == 0 || a.vboId == 0 || !vaos.isBufferLive(a)) return;
+ if (glCtx.boundVBO != a.vboId) GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
+ if (a.integer) {
+ RENDER_BACKEND.vertexAttribIPointer(index, a.size, a.type, a.stride, a.offset);
+ } else {
+ RENDER_BACKEND.vertexAttribPointer(index, a.size, a.type, a.normalized, a.stride, a.offset);
+ }
+ }
+
+ private static void repointAttrib(GLContextState glCtx, int index) {
+ final int savedVBO = glCtx.boundVBO;
+ pointAttrib(glCtx, index);
+ if (glCtx.boundVBO != savedVBO) GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ }
+
+ public static void glVertexPointer(int size, int stride, IntBuffer pointer) {
+ glVertexPointer(size, GL11.GL_INT, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexPointer(int size, int stride, ShortBuffer pointer) {
+ glVertexPointer(size, GL11.GL_SHORT, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexPointer(int size, int stride, FloatBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexPointer(int size, int stride, DoubleBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexPointer(int size, int type, int stride, ByteBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer);
+ }
+
+ public static void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset) {
+ ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer_buffer_offset);
+ }
+
+ public static void glColorPointer(int size, int stride, FloatBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_FLOAT, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glColorPointer(int size, int stride, DoubleBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_DOUBLE, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glColorPointer(int size, int type, int stride, ByteBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer);
+ }
+
+ public static void glColorPointer(int size, boolean unsigned, int stride, ByteBuffer pointer) {
+ final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE;
+ ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer);
+ }
+
+ public static void glColorPointer(int size, int type, int stride, long pointer_buffer_offset) {
+ ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer_buffer_offset);
+ }
+
+ public static void glNormalPointer(int stride, FloatBuffer pointer) {
+ glNormalPointer(GL11.GL_FLOAT, stride, pointer);
+ }
+
+ public static void glNormalPointer(int stride, ByteBuffer pointer) {
+ glNormalPointer(GL11.GL_BYTE, stride, pointer);
+ }
+
+ public static void glNormalPointer(int stride, IntBuffer pointer) {
+ glNormalPointer(GL11.GL_INT, stride, pointer);
+ }
+
+ public static void glNormalPointer(int stride, DoubleBuffer pointer) {
+ glNormalPointer(GL11.GL_DOUBLE, stride, pointer);
+ }
+
+ public static void glNormalPointer(int type, int stride, ByteBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer);
+ }
+
+ public static void glNormalPointer(int type, int stride, FloatBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glNormalPointer(int type, int stride, ShortBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_SHORT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glNormalPointer(int type, int stride, IntBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_INT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glNormalPointer(int type, int stride, DoubleBuffer pointer) {
+ ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_DOUBLE, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glNormalPointer(int type, int stride, long pointer_buffer_offset) {
+ ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer_buffer_offset);
+ }
+
+ public static void glTexCoordPointer(int size, int type, int stride, ByteBuffer pointer) {
+ ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer);
+ }
+
+ public static void glTexCoordPointer(int size, int stride, FloatBuffer pointer) {
+ glTexCoordPointer(size, GL11.GL_FLOAT, stride, pointer);
+ }
+
+ public static void glTexCoordPointer(int size, int stride, IntBuffer pointer) {
+ glTexCoordPointer(size, GL11.GL_INT, stride, pointer);
+ }
+
+ public static void glTexCoordPointer(int size, int stride, ShortBuffer pointer) {
+ glTexCoordPointer(size, GL11.GL_SHORT, stride, pointer);
+ }
+
+ public static void glTexCoordPointer(int size, int stride, DoubleBuffer pointer) {
+ glTexCoordPointer(size, GL11.GL_DOUBLE, stride, pointer);
+ }
+
+ public static void glTexCoordPointer(int size, int type, int stride, FloatBuffer pointer) {
+ ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glTexCoordPointer(int size, int type, int stride, ShortBuffer pointer) {
+ ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_SHORT, false, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glTexCoordPointer(int size, int type, int stride, IntBuffer pointer) {
+ ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_INT, false, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glTexCoordPointer(int size, int type, int stride, DoubleBuffer pointer) {
+ ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glTexCoordPointer(int size, int type, int stride, long pointer_buffer_offset) {
+ ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer_buffer_offset);
+ }
+
+ public static void glEnableClientState(int cap) {
+ rejectExitCapture();
+ setClientArrayCap(ctx(), cap, true);
+ }
+
+ public static void glDisableClientState(int cap) {
+ rejectExitCapture();
+ setClientArrayCap(ctx(), cap, false);
+ }
+
+ static boolean setClientArrayCap(GLContextState glCtx, int cap, boolean enabled) {
+ final int conv = clientStateToConventional(glCtx, cap);
+ if (conv < 0) return false;
+ setClientArrayEnabled(glCtx, conv, enabled);
+ return true;
+ }
+
+ private static void setClientArrayEnabled(GLContextState glCtx, int conv, boolean enabled) {
+ final VAOManager vaos = glCtx.vaos;
+ final boolean repoint = vaos.setConventionalEnabled(conv, enabled);
+ final int index = VAOManager.conventionalLocation(conv);
+ if (index >= 0) {
+ if (repoint) repointAttrib(glCtx, index);
+ syncAttribEnable(glCtx, index);
+ }
+ final int flag = conventionalVertexFlag(conv);
+ if (flag == 0) return;
+ if (enabled) {
+ vaos.enableClientVertexFlag(flag);
+ } else {
+ vaos.disableClientVertexFlag(flag);
+ }
+ }
+
+ static void syncAttribEnable(GLContextState glCtx, int index) {
+ if (glCtx.vaos.isAttribEnabled(index)) {
+ RENDER_BACKEND.enableVertexAttribArray(index);
+ } else {
+ RENDER_BACKEND.disableVertexAttribArray(index);
+ }
+ }
+
+ public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) {
+ rejectExitCapture();
+ if (!isLegalVertexAttrib(index, size, type, stride, false)) return;
+ final GLContextState glCtx = ctx();
+ if (glCtx.vaos.setAttribute(index, size, type, normalized, stride, offset, glCtx.boundVBO)) {
+ RENDER_BACKEND.vertexAttribPointer(index, size, type, normalized, stride, offset);
+ }
+ }
+
+ public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer pointer) {
+ glVertexAttribPointer(index, size, GL11.GL_FLOAT, normalized, stride, pointer);
+ }
+
+ public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, FloatBuffer pointer) {
+ glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, DoubleBuffer pointer) {
+ glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, IntBuffer pointer) {
+ glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ShortBuffer pointer) {
+ glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ByteBuffer pointer) {
+ rejectExitCapture();
+ if (!isLegalVertexAttrib(index, size, type, stride, false)) return;
+ ctx().vaos.setAttribute(index, size, type, normalized, stride, pointer);
+ }
+
+ public static void glVertexAttribIPointer(int index, int size, int type, int stride, long offset) {
+ rejectExitCapture();
+ if (!isLegalVertexAttrib(index, size, type, stride, true)) return;
+ final GLContextState glCtx = ctx();
+ if (glCtx.vaos.setIntegerAttribute(index, size, type, stride, offset, glCtx.boundVBO)) {
+ RENDER_BACKEND.vertexAttribIPointer(index, size, type, stride, offset);
+ }
+ }
+
+ public static void glVertexAttribIPointer(int index, int size, int type, int stride, ByteBuffer pointer) {
+ rejectExitCapture();
+ if (!isLegalVertexAttrib(index, size, type, stride, true)) return;
+ ctx().vaos.setIntegerAttribute(index, size, type, stride, pointer);
+ }
+
+ public static void glVertexAttribIPointer(int index, int size, int type, int stride, IntBuffer pointer) {
+ glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexAttribIPointer(int index, int size, int type, int stride, ShortBuffer pointer) {
+ glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glVertexAttribDivisor(int index, int divisor) {
+ rejectExitCapture();
+ if (ctx().vaos.setDivisor(index, divisor)) RENDER_BACKEND.vertexAttribDivisor(index, divisor);
+ }
+
+ public static void glVertexAttribDivisorARB(int index, int divisor) { glVertexAttribDivisor(index, divisor); }
+ public static void glBindVertexBuffer(int bindingindex, int buffer, long offset, int stride) { rejectExitCapture(); RENDER_BACKEND.bindVertexBuffer(bindingindex, buffer, offset, stride); }
+ public static void glVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribFormat(attribindex, size, type, normalized, relativeoffset); }
+ public static void glVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribIFormat(attribindex, size, type, relativeoffset); }
+ public static void glVertexAttribBinding(int attribindex, int bindingindex) { rejectExitCapture(); RENDER_BACKEND.vertexAttribBinding(attribindex, bindingindex); }
+
+ public static void glEnableVertexAttribArray(int index) {
+ rejectExitCapture();
+ if (!isValidVertexAttribIndex(index, "glEnableVertexAttribArray")) return;
+ final GLContextState glCtx = ctx();
+ if (glCtx.vaos.enableAttribute(index)) repointAttrib(glCtx, index);
+ RENDER_BACKEND.enableVertexAttribArray(index);
+ }
+
+ public static void glDisableVertexAttribArray(int index) {
+ rejectExitCapture();
+ if (!isValidVertexAttribIndex(index, "glDisableVertexAttribArray")) return;
+ final GLContextState glCtx = ctx();
+ if (glCtx.vaos.disableAttribute(index)) repointAttrib(glCtx, index);
+ if (!glCtx.vaos.isAttribEnabled(index)) RENDER_BACKEND.disableVertexAttribArray(index);
+ }
+
+ static int clientStateToConventional(GLContextState glCtx, int cap) {
+ return switch (cap) {
+ case GL11.GL_VERTEX_ARRAY -> VAOManager.CONV_POSITION;
+ case GL11.GL_NORMAL_ARRAY -> VAOManager.CONV_NORMAL;
+ case GL11.GL_COLOR_ARRAY -> VAOManager.CONV_COLOR;
+ case GL11.GL_INDEX_ARRAY -> VAOManager.CONV_INDEX;
+ case GL11.GL_EDGE_FLAG_ARRAY -> VAOManager.CONV_EDGE_FLAG;
+ case GL14.GL_SECONDARY_COLOR_ARRAY -> VAOManager.CONV_SECONDARY_COLOR;
+ case GL14.GL_FOG_COORDINATE_ARRAY -> VAOManager.CONV_FOG_COORD;
+ case GL11.GL_TEXTURE_COORD_ARRAY -> texCoordConventional(glCtx);
+ default -> -1;
+ };
+ }
+
+ private static int conventionalVertexFlag(int conv) {
+ return switch (conv) {
+ case VAOManager.CONV_COLOR -> VertexFlags.COLOR_BIT;
+ case VAOManager.CONV_NORMAL -> VertexFlags.NORMAL_BIT;
+ case VAOManager.CONV_TEX0 -> VertexFlags.TEXTURE_BIT;
+ case VAOManager.CONV_TEX0 + 1 -> VertexFlags.BRIGHTNESS_BIT;
+ default -> 0;
+ };
+ }
+
+ public static void glInterleavedArrays(int format, int stride, long pointer) {
+ interleavedArrays(format, stride, pointer, null);
+ }
+
+ private static void interleavedPointer(int conv, int size, int type, boolean normalized, int stride, long pointer, ByteBuffer base, int offset) {
+ if (base == null) {
+ ffpClientArrayPointer(conv, size, type, normalized, stride, pointer + offset);
+ } else {
+ ffpClientArrayPointer(conv, size, type, normalized, stride, MemoryUtilities.memSlice(base, offset, base.remaining() - offset));
+ }
+ }
+
+ private static void interleavedArrays(int format, int stride, long pointer, ByteBuffer base) {
+ rejectExitCapture();
+ // Mesa _mesa_get_interleaved_layout decomposition
+ final int f = 4; // sizeof(float)
+ final int c = f * ((4 + (f - 1)) / f); // 4 ubytes padded to float alignment = 4
+
+ boolean tflag = false, cflag = false, nflag = false;
+ int tcomps = 0, ccomps = 0, vcomps = 0;
+ int ctype = 0;
+ final int toffset = 0;
+ int coffset = 0;
+ int noffset = 0;
+ int voffset = 0;
+ final int defstride;
+
+ switch (format) {
+ case GL11.GL_V2F:
+ vcomps = 2; defstride = 2 * f; break;
+ case GL11.GL_V3F:
+ vcomps = 3; defstride = 3 * f; break;
+ case GL11.GL_C4UB_V2F:
+ cflag = true; ccomps = 4; vcomps = 2;
+ ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 2 * f; break;
+ case GL11.GL_C4UB_V3F:
+ cflag = true; ccomps = 4; vcomps = 3;
+ ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 3 * f; break;
+ case GL11.GL_C3F_V3F:
+ cflag = true; ccomps = 3; vcomps = 3;
+ ctype = GL11.GL_FLOAT; voffset = 3 * f; defstride = 6 * f; break;
+ case GL11.GL_N3F_V3F:
+ nflag = true; vcomps = 3;
+ voffset = 3 * f; defstride = 6 * f; break;
+ case GL11.GL_C4F_N3F_V3F:
+ cflag = true; nflag = true; ccomps = 4; vcomps = 3;
+ ctype = GL11.GL_FLOAT; noffset = 4 * f; voffset = 7 * f; defstride = 10 * f; break;
+ case GL11.GL_T2F_V3F:
+ tflag = true; tcomps = 2; vcomps = 3;
+ voffset = 2 * f; defstride = 5 * f; break;
+ case GL11.GL_T4F_V4F:
+ tflag = true; tcomps = 4; vcomps = 4;
+ voffset = 4 * f; defstride = 8 * f; break;
+ case GL11.GL_T2F_C4UB_V3F:
+ tflag = true; cflag = true; tcomps = 2; ccomps = 4; vcomps = 3;
+ ctype = GL11.GL_UNSIGNED_BYTE; coffset = 2 * f; voffset = c + 2 * f; defstride = c + 5 * f; break;
+ case GL11.GL_T2F_C3F_V3F:
+ tflag = true; cflag = true; tcomps = 2; ccomps = 3; vcomps = 3;
+ ctype = GL11.GL_FLOAT; coffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break;
+ case GL11.GL_T2F_N3F_V3F:
+ tflag = true; nflag = true; tcomps = 2; vcomps = 3;
+ noffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break;
+ case GL11.GL_T2F_C4F_N3F_V3F:
+ tflag = true; cflag = true; nflag = true; tcomps = 2; ccomps = 4; vcomps = 3;
+ ctype = GL11.GL_FLOAT; coffset = 2 * f; noffset = 6 * f; voffset = 9 * f; defstride = 12 * f; break;
+ case GL11.GL_T4F_C4F_N3F_V4F:
+ tflag = true; cflag = true; nflag = true; tcomps = 4; ccomps = 4; vcomps = 4;
+ ctype = GL11.GL_FLOAT; coffset = 4 * f; noffset = 8 * f; voffset = 11 * f; defstride = 15 * f; break;
+ default:
+ return; // Invalid format
+ }
+
+ if (stride == 0) stride = defstride;
+
+ if (tflag) {
+ glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ interleavedPointer(texCoordConventional(ctx()), tcomps, GL11.GL_FLOAT, false, stride, pointer, base, toffset);
+ } else {
+ glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ }
+
+ if (cflag) {
+ glEnableClientState(GL11.GL_COLOR_ARRAY);
+ interleavedPointer(VAOManager.CONV_COLOR, ccomps, ctype, Usage.COLOR.isNormalized(), stride, pointer, base, coffset);
+ } else {
+ glDisableClientState(GL11.GL_COLOR_ARRAY);
+ }
+
+ if (nflag) {
+ glEnableClientState(GL11.GL_NORMAL_ARRAY);
+ interleavedPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, pointer, base, noffset);
+ } else {
+ glDisableClientState(GL11.GL_NORMAL_ARRAY);
+ }
+
+ glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ interleavedPointer(VAOManager.CONV_POSITION, vcomps, GL11.GL_FLOAT, false, stride, pointer, base, voffset);
+ }
+
+ public static void glInterleavedArrays(int format, int stride, ByteBuffer pointer) {
+ interleavedArrays(format, stride, 0L, pointer);
+ }
+
+ public static void glInterleavedArrays(int format, int stride, FloatBuffer pointer) {
+ interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glInterleavedArrays(int format, int stride, DoubleBuffer pointer) {
+ interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glInterleavedArrays(int format, int stride, IntBuffer pointer) {
+ interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glInterleavedArrays(int format, int stride, ShortBuffer pointer) {
+ interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
+ }
+
+ public static void glBindVertexArray(int array) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ if (DisplayListManager.isRecording()) {
+ DisplayListManager.recordBindVAO(array);
+ // Since the vao needs to be bound to do stuff like state setup & data upload, it'll still execute the bind call.
+ // This is technically wrong, but I'm not sure if there's a better solution here.
+ }
+ bindVertexArrayInternal(glCtx, array == 0 ? glCtx.defaultVAO : array);
+ }
+
+ static void bindVertexArrayInternal(GLContextState glCtx, int array) {
+ final boolean locked = acquireDrawLock();
+ try {
+ if (glCtx.boundVAO != array) {
+ glCtx.boundVAO = array;
+ glCtx.vaos.onBindVertexArrayPre(array);
+ RENDER_BACKEND.bindVertexArray(array);
+ }
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static void glDeleteVertexArrays(int array) {
+ rejectExitCapture();
+ final GLContextState glCtx = ctx();
+ final boolean locked = acquireDrawLock();
+ try {
+ glCtx.vaos.onDeleteVertexArray(array);
+ if (array == glCtx.boundVAO) {
+ // Deleting the bound VAO implicitly unbinds it. Rebind the default VAO.
+ bindVertexArrayInternal(glCtx, glCtx.defaultVAO);
+ }
+ RENDER_BACKEND.deleteVertexArrays(array);
+ } finally {
+ if (locked) releaseDrawLock();
+ }
+ }
+
+ public static int glGenVertexArrays() {
+ requireContext("glGenVertexArrays");
+ return RENDER_BACKEND.genVertexArrays();
+ }
+
+ public static boolean glIsVertexArray(int array) {
+ rejectExitCapture();
+ return RENDER_BACKEND.isVertexArray(array);
+ }
+
+ public static void glBindVertexArrayAPPLE(int array) {
+ glBindVertexArray(array);
+ }
+
+ public static int getBoundVAO() {
+ return ctx().boundVAO;
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
index 2c0dbd2e5..6c4be63a6 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
@@ -1,140 +1,37 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import com.gtnewhorizon.gtnhlib.bytebuf.Pointer;
-import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.stacks.IStateStack;
-import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
-import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
-import com.gtnewhorizons.angelica.glsm.backend.GLDebugMessageListener;
import com.gtnewhorizons.angelica.glsm.backend.VSyncMode;
-import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
-import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
-import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
-import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
-import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
import com.gtnewhorizons.angelica.glsm.ffp.VertexKey;
-import com.gtnewhorizons.angelica.glsm.hooks.DeferredAlphaHandler;
-import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
-import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler;
-import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMInitConfig;
-import com.gtnewhorizons.angelica.glsm.hooks.GlintColorHandler;
-import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
-import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder;
-import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList;
import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder;
-import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawCapture;
-import com.gtnewhorizons.angelica.glsm.recording.commands.TexImage2DCmd;
-import com.gtnewhorizons.angelica.glsm.recording.commands.TexSubImage2DCmd;
-import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache;
-import com.gtnewhorizons.angelica.glsm.stacks.AlphaStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.BlendStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.Color4Stack;
-import com.gtnewhorizons.angelica.glsm.stacks.ColorMaskStack;
-import com.gtnewhorizons.angelica.glsm.stacks.CowDepths;
-import com.gtnewhorizons.angelica.glsm.stacks.CowDispatch;
import com.gtnewhorizons.angelica.glsm.stacks.CowStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.DepthStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.FogStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.LightModelStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.LightStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.LineStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.MaterialStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.MatrixModeStack;
-import com.gtnewhorizons.angelica.glsm.stacks.PointStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.PolygonStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.RetainedState;
-import com.gtnewhorizons.angelica.glsm.stacks.ScissorStateStack;
import com.gtnewhorizons.angelica.glsm.stacks.StackIdAllocator;
-import com.gtnewhorizons.angelica.glsm.stacks.StencilStateStack;
-import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack;
-import com.gtnewhorizons.angelica.glsm.stacks.ViewPortStateStack;
-import com.gtnewhorizons.angelica.glsm.states.AlphaState;
-import com.gtnewhorizons.angelica.glsm.states.BlendState;
-import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState;
-import com.gtnewhorizons.angelica.glsm.states.Color4;
-import com.gtnewhorizons.angelica.glsm.states.ColorMask;
-import com.gtnewhorizons.angelica.glsm.states.PixelStoreState;
-import com.gtnewhorizons.angelica.glsm.states.PolygonState;
-import com.gtnewhorizons.angelica.glsm.states.SamplerUnitArray;
-import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding;
-import com.gtnewhorizons.angelica.glsm.states.TextureBinding;
-import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray;
-import com.gtnewhorizons.angelica.glsm.streaming.LineQuads;
-import com.gtnewhorizons.angelica.glsm.streaming.TessellatorEntityIds;
-import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
-import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
-import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
-import com.gtnewhorizons.angelica.glsm.texture.TextureStaging;
-import com.gtnewhorizons.angelica.glsm.texture.TextureTargets;
-import it.unimi.dsi.fastutil.ints.Int2IntMap;
-import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
-import it.unimi.dsi.fastutil.ints.Int2LongMap;
-import it.unimi.dsi.fastutil.ints.Int2LongMaps;
-import it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
-import it.unimi.dsi.fastutil.longs.LongIterator;
import lombok.Getter;
import lombok.Setter;
-import lombok.SneakyThrows;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.joml.Matrix4f;
-import org.joml.Matrix4fStack;
-import org.joml.Matrix4fc;
-import org.joml.Vector3d;
-import org.joml.Vector3f;
-import org.joml.Vector4f;
-import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
-import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.ContextCapabilities;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.Drawable;
-import org.lwjgl.opengl.EXTTextureFilterAnisotropic;
import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL14;
-import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
-import org.lwjgl.opengl.GL21;
import org.lwjgl.opengl.GL30;
-import org.lwjgl.opengl.GL31;
import org.lwjgl.opengl.GL32;
-import org.lwjgl.opengl.GL33;
-import org.lwjgl.opengl.GL40;
-import org.lwjgl.opengl.GL42;
-import org.lwjgl.opengl.GL43;
import org.lwjgl.opengl.GLContext;
-import org.lwjgl.opengl.KHRDebug;
-import org.lwjgl.opengl.KHRDebugCallback;
-import org.lwjgl.util.glu.GLU;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.reflect.Field;
-import java.nio.Buffer;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.DoubleBuffer;
-import java.nio.FloatBuffer;
-import java.nio.IntBuffer;
-import java.nio.LongBuffer;
-import java.nio.ShortBuffer;
-import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.IdentityHashMap;
-import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@@ -146,16 +43,8 @@ import static com.gtnewhorizons.angelica.glsm.Vendor.NVIDIA;
import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND;
/**
- * OpenGL State Manager - Provides cached state tracking and management for Backend Renderer Actions
- * IMPORTANT NOTE: Do NOT call open gl directly, route everything through {@link BackendManager#RENDER_BACKEND}
- *
- * IMPORTANT INITIALIZATION ORDER:
- *
- * This class performs GL queries in static initializers (MAX_CLIP_PLANES, MAX_TEXTURE_UNITS, etc.)
- * The class MUST NOT be loaded until after the GL context has been created and made current
- * Violating this requirement will cause crashes with "No current context" or return invalid values
- * Call {@link #initialize(GLSMInitConfig)} after GL context creation to initialize runtime state
- *
+ * GLSM core: per-thread context lookup ({@link #ctx()}), the exit-capture/batch-guard prologue, limits and lifecycle; GL entry points live in the GLSM group classes.
+ * The static initializer queries the backend, so this class must not load before a GL context is current; call {@link #initialize(GLSMInitConfig)} after context creation.
*/
@SuppressWarnings("unused") // Used in ASM
public class GLStateManager {
@@ -211,7 +100,7 @@ public class GLStateManager {
if (ExitStateCapture.anyOpen()) recordExitTextureBind(ctx(), target, unit);
}
- private static void recordExitTextureBind(GLContextState glCtx, int target, int unit) {
+ static void recordExitTextureBind(GLContextState glCtx, int target, int unit) {
if (target == GL11.GL_TEXTURE_2D && unit == 0) glCtx.exitCapture.write(ExitStateCapture.TEXTURE_BINDING);
else glCtx.exitCapture.reject();
}
@@ -242,20 +131,6 @@ public class GLStateManager {
beforeUncapturedStateChange();
}
- private static void beforeMatrixChange(GLContextState c) {
- beforeMatrixChange(c, false);
- }
-
- private static void beforeMatrixChange(GLContextState c, boolean absolute) {
- c.exitCapture.matrixChange(absolute);
- if (isUncapturedMatrix(c)) beforeUncapturedStateChange();
- }
-
- private static boolean isUncapturedMatrix(GLContextState c) {
- final int mode = c.matrixMode.getMode();
- return mode == GL11.GL_PROJECTION || (mode == GL11.GL_TEXTURE && c.activeTextureUnit.getValue() != 0);
- }
-
public static final Logger LOGGER = LogManager.getLogger("GLSM");
private static final Set WARN_ONCE = ConcurrentHashMap.newKeySet();
@@ -264,13 +139,21 @@ public class GLStateManager {
if (WARN_ONCE.add(key)) LOGGER.warn(fmt, args);
}
- private static volatile GLContextState primaryContext;
+ // The key check comes first so a caller repeating the mistake every frame does not capture a stack each time.
+ static void warnOnceTrace(String key, String fmt, Object... args) {
+ if (!WARN_ONCE.add(key)) return;
+ final Object[] withTrace = Arrays.copyOf(args, args.length + 1);
+ withTrace[args.length] = new Throwable("call site");
+ LOGGER.warn(fmt, withTrace);
+ }
+
+ static volatile GLContextState primaryContext;
private static final ThreadLocal tlWorkerContext = new ThreadLocal<>();
private static GLContextState mainCtx;
private static volatile boolean workerContextsActive;
private static int workerContextCount;
private static final IdentityHashMap drawableContexts = new IdentityHashMap<>();
- private static GLContextState[] drawableContextStates = new GLContextState[0];
+ static GLContextState[] drawableContextStates = new GLContextState[0];
public static GLContextState ctx() {
if (Thread.currentThread() == MainThread) {
@@ -368,20 +251,8 @@ public class GLStateManager {
return d == Display.getDrawable();
}
- // Tracy profiling counters
- public static long drawCalls;
- public static long texBindMisses;
- public static long programSwitches;
- public static long attribPushes;
- public static long attribSlotsSaved;
- public static long attribValueRestores;
- public static long attribBackendCalls;
- public static long attribDiscards;
- public static int programGeneration;
- public static int drawFramebufferGeneration;
-
// Thread Checking - must be early in static init order so isMainThread() works for state initialization
- @Getter private static final Thread MainThread = Thread.currentThread();
+ @Getter static final Thread MainThread = Thread.currentThread();
public static boolean isMainThread() {
return Thread.currentThread() == MainThread;
@@ -393,7 +264,7 @@ public class GLStateManager {
throw new IllegalStateException(call + " on thread " + Thread.currentThread().getName() + ", which has no GL context");
}
- @Getter private static GLSMInitConfig initConfig;
+ @Getter static GLSMInitConfig initConfig;
public static ContextCapabilities capabilities;
@@ -412,132 +283,14 @@ public class GLStateManager {
public static final GLFeatureSet HAS_MULTIPLE_SET = new GLFeatureSet();
- // Generation counters for FFP uniform dirty tracking. Bumped when the corresponding GLSM state changes.
- // Per-matrix-mode generation counters - avoids re-uploading all matrices when only one mode changed
- public static void setOverlayColor(float r, float g, float b, float a) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.OVERLAY_COLOR);
- if (r == glCtx.overlayR && g == glCtx.overlayG && b == glCtx.overlayB && a == glCtx.overlayA) return;
- glCtx.overlayR = r; glCtx.overlayG = g; glCtx.overlayB = b; glCtx.overlayA = a;
- glCtx.fragmentGeneration++;
- }
-
- public static void setShaderColor(float r, float g, float b, float a) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.SHADER_COLOR);
- if (r == glCtx.shaderColorR && g == glCtx.shaderColorG && b == glCtx.shaderColorB && a == glCtx.shaderColorA) return;
- glCtx.shaderColorR = r; glCtx.shaderColorG = g; glCtx.shaderColorB = b; glCtx.shaderColorA = a;
- if (GLSMHooks.SHADER_COLOR_CHANGE.hasListeners()) {
- GLSMHooks.shaderColorChangeEvent.red = r;
- GLSMHooks.shaderColorChangeEvent.green = g;
- GLSMHooks.shaderColorChangeEvent.blue = b;
- GLSMHooks.shaderColorChangeEvent.alpha = a;
- GLSMHooks.SHADER_COLOR_CHANGE.post(GLSMHooks.shaderColorChangeEvent);
- }
- }
-
-
- public static boolean consumeUnit23TexCoordSetDuringDraw(GLContextState glCtx) {
- boolean v = glCtx.unit23TexCoordSetDuringDraw;
- glCtx.unit23TexCoordSetDuringDraw = false;
- return v;
- }
-
- public static void forceAttribDefaultsDirty() {
- final GLContextState glCtx = ctx();
- glCtx.dirtyNormalAttrib = true;
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- // has* bits mark attribs the VBO already supplies; FFP supplies the rest via u_Current* uniforms.
- // Skip the backend vertexAttrib call in either case
- public static void flushDeferredVertexAttribs(GLContextState glCtx, boolean hasColor, boolean hasNormal, boolean hasTexCoord, boolean hasLightmap) {
- final ShaderManager sm = glCtx.ffp;
- final boolean ffpWillHandle = sm.isActive() || (sm.isEnabled() && glCtx.activeProgram == 0);
- if (!hasColor && glCtx.dirtyColorAttrib && !ffpWillHandle) {
- RENDER_BACKEND.vertexAttrib4f(Usage.COLOR.getAttributeLocation(), glCtx.color.getRed(), glCtx.color.getGreen(), glCtx.color.getBlue(), glCtx.color.getAlpha());
- glCtx.dirtyColorAttrib = false;
- }
- if (!hasNormal && glCtx.dirtyNormalAttrib && !ffpWillHandle) {
- final var n = sm.currentNormal;
- RENDER_BACKEND.vertexAttrib3f(Usage.NORMAL.getAttributeLocation(), n.x, n.y, n.z);
- glCtx.dirtyNormalAttrib = false;
- }
- if (!hasTexCoord && glCtx.dirtyTexCoordAttrib && !ffpWillHandle) {
- final var tc = sm.currentTexCoords[0];
- RENDER_BACKEND.vertexAttrib4f(Usage.PRIMARY_UV.getAttributeLocation(), tc.x, tc.y, tc.z, tc.w);
- glCtx.dirtyTexCoordAttrib = false;
- }
- if (!hasLightmap && glCtx.dirtyLightmapAttrib && !ffpWillHandle) {
- RENDER_BACKEND.vertexAttrib4f(Usage.SECONDARY_UV.getAttributeLocation(), glCtx.lastBrightnessX, glCtx.lastBrightnessY, 0.0f, 1.0f);
- glCtx.dirtyLightmapAttrib = false;
- }
- }
-
- public static void setEntityIds(int entity, int blockEntity, int item) {
- rejectExitCapture();
- if (!isMainThread()) return;
- final GLContextState glCtx = ctx();
- final long ids = InstancedAttribs.packEntityInfo(entity, blockEntity, item);
- if (ids == glCtx.entityIds) return;
- TessellatorEntityIds.onIdsChanged(glCtx.entityIds, ids);
- glCtx.entityIds = ids;
- glCtx.dirtyEntityIdsAttrib = true;
- }
-
- public static void flushEntityIds(GLContextState glCtx) {
- if (!glCtx.dirtyEntityIdsAttrib || glCtx.activeProgram == 0) return;
- final ImmediateExtendedAttribHandler handler = GLSMHooks.immediateExtendedHandler;
- if (handler == null || !handler.wantsEntityIds()) return;
- final long ids = glCtx.entityIds;
- RENDER_BACKEND.vertexAttrib4f(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS,
- InstancedAttribs.normalizedId(ids, 0), InstancedAttribs.normalizedId(ids, 16), InstancedAttribs.normalizedId(ids, 32), 0.0f);
- glCtx.dirtyEntityIdsAttrib = false;
- }
-
-
- public static int getMaxBoundTextureUnit() {
- return ctx().maxBoundTextureUnit;
- }
-
- public static void trackMaxBoundTextureUnit(int unit) {
- final GLContextState glCtx = ctx();
- if (unit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = unit;
- }
- // Deferred texture deletion: names kept valid until glGenTextures recycles them.
- // Emulates Mesa/compat-profile behavior where delete-then-bind doesn't error.
- private static final Int2LongOpenHashMap deferredDeleteTextures = new Int2LongOpenHashMap();
- private static final long DEFERRED_ABSENT = Long.MIN_VALUE;
- private static final long DEFERRED_ATTACHED = -1;
- private static final long DEFERRED_RELEASED = -2;
- private static final int RELEASE_DELAY_FRAMES = 3;
- private static long frameIndex;
- private static long nextReleaseFrame = Long.MAX_VALUE;
- private static final Int2IntOpenHashMap non2DTextureTargets = new Int2IntOpenHashMap();
- private static final Int2IntOpenHashMap textureFramebufferRefs = new Int2IntOpenHashMap();
- private static final FloatBuffer TRANSPARENT_BLACK = BufferUtils.createFloatBuffer(4);
- private static final Tracy.ZoneId Z_TEX_DELETE = Tracy.zoneId("texDelete", Tracy.COLOR_FFP);
- private static final Tracy.ZoneId Z_TEX_RELEASE_STORAGE = Tracy.zoneId("texReleaseStorage", Tracy.COLOR_FFP);
- private static final Tracy.ZoneId Z_TEX_RESCUE_RESET = Tracy.zoneId("texRescueReset", Tracy.COLOR_FFP);
- private static final Tracy.ZoneId Z_TEX_FLUSH_DELETES = Tracy.zoneId("texFlushDeletes", Tracy.COLOR_FFP);
- static {
- deferredDeleteTextures.defaultReturnValue(DEFERRED_ABSENT);
- non2DTextureTargets.defaultReturnValue(GL11.GL_TEXTURE_2D);
- }
- private static final IntOpenHashSet writeMappedBuffers = new IntOpenHashSet();
-
@Getter private static Vendor VENDOR;
@Getter private static boolean windows;
- // This setting varies depending on driver, so it gets queried at runtime
- public static int DEFAULT_DRAW_BUFFER = GL11.GL_BACK;
- private static float maxPointSize;
-
private static volatile Thread CurrentThread = MainThread;
@Setter @Getter private static boolean runningSplash = true;
- private static volatile boolean splashComplete = false;
+ static volatile boolean splashComplete = false;
private static volatile Thread splashDisplayReleaser;
@Getter @Setter private static volatile Thread drawableGLHolder = MainThread;
// Reference to DrawableGL (main display context) - works with both FML and BLS splash
@@ -576,121 +329,11 @@ public class GLStateManager {
return splashComplete;
}
- /**
- * Get the active texture unit for server-side state operations. If caching is enabled, returns cached value. If caching is disabled (SharedDrawable),
- * queries actual GL state.
- */
- public static int getActiveTextureUnitForServerState() {
- if (isCachingEnabled()) {
- return getActiveTextureUnit();
- }
- // Query actual GL state for SharedDrawable context
- return RENDER_BACKEND.getInteger(GL13.GL_ACTIVE_TEXTURE) - GL13.GL_TEXTURE0;
- }
-
- /**
- * Get the texture bound to the current texture unit for server-side state operations.
- * If caching is enabled, returns cached value.
- * If caching is disabled (SharedDrawable), queries actual GL state.
- */
- public static int getBoundTextureForServerState() {
- if (isCachingEnabled()) {
- return getBoundTexture();
- }
- // Query actual GL state for SharedDrawable context
- return RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D);
- }
-
- private static TextureInfo getBoundTextureInfo() {
- final GLContextState glCtx = ctx();
- if (isCachingEnabled()) {
- return glCtx.textures.getTextureUnitBindings(glCtx.activeTextureUnit.getValue()).getOrResolveInfo();
- }
- return TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState());
- }
-
- /**
- * Get the texture bound to a specific texture unit for server-side state operations.
- * If caching is enabled, returns cached value.
- * If caching is disabled (SharedDrawable), returns -1 to force operations to proceed
- */
- public static int getBoundTextureForServerState(int unit) {
- if (isCachingEnabled()) {
- return getBoundTexture(unit);
- }
- return -1;
- }
-
- private static final String TEXTURE = "texture";
- private static final String TEXTURE_RENAMED = "gtexture";
-
- /** Register a state stack id as modified at the current depth (called from beforeModify). */
- public static void registerModifiedState(GLContextState c, int id) {
- if (c.attribDepth > 0) {
- final int depth = c.attribDepth - 1;
- c.modifiedIds[depth][c.modifiedCount[depth]++] = id;
- if (!c.poppingAttributes) {
- attribSlotsSaved++;
- }
- }
- }
-
- private static > T mod(T s) {
+ static > T mod(T s) {
s.beforeModify();
return s;
}
- // Additional enable bit states tracked by GL_ENABLE_BIT
-
-
- // Line width range queried at init from GL_ALIASED_LINE_WIDTH_RANGE
- static float lineWidthMin = 1.0f;
- static float lineWidthMax = 1.0f;
- // The driver cannot draw wide lines (Mesa forward-compat, SDL_GPU), so FFP widens them from LineQuads in the vertex shader
- public static boolean wideLineEmulationEnabled = false;
- public static boolean framebufferCompletenessIsMeaningful() { return RENDER_BACKEND.framebufferCompletenessIsMeaningful(); }
- public static void setFfpInstancing(Instancing mode) {
- ctx().ffpInstancing = mode;
- }
-
- public static int setTextureSupersamplingSamples(int samples) {
- if (samples < 1 || samples > 16 || (samples & (samples - 1)) != 0) {
- throw new IllegalArgumentException("Texture supersampling requires 1, 2, 4, 8, or 16 samples");
- }
- final GLContextState glCtx = ctx();
- final int previous = glCtx.textureSupersamplingSamples;
- if (previous != samples) {
- beforeUncapturedStateChange();
- glCtx.textureSupersamplingSamples = samples;
- }
- return previous;
- }
-
- public static void markTextureAsAtlas(int texture, int gutter) {
- if (texture <= 0) return;
- final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texture);
- if (info.getAtlasGutter() != gutter) {
- beforeUncapturedStateChange();
- info.setAtlasGutter(gutter);
- }
- }
-
- private static final MethodHandle MAT4_STACK_CURR_DEPTH;
-
- static {
- try {
- final Field curr = Matrix4fStack.class.getDeclaredField("curr");
- curr.setAccessible(true);
- MAT4_STACK_CURR_DEPTH = MethodHandles.lookup().unreflectGetter(curr);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- public static int getBoundEBO() {
- return ctx().vaos.boundEBO;
- }
-
public static void reset() {
final GLContextState glCtx = ctx();
glCtx.exitCapture.cancel();
@@ -741,20 +384,10 @@ public class GLStateManager {
if (RENDER_BACKEND != null) {
RENDER_BACKEND.invalidateStateMirror();
- replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
}
}
- /**
- * Check if a display list exists (has been compiled and stored). Delegates to DisplayListManager.
- *
- * @param list The display list ID to check
- * @return true if the display list exists, false otherwise
- */
- public static boolean displayListExists(int list) {
- return DisplayListManager.displayListExists(list);
- }
-
public static class GLFeatureSet extends IntOpenHashSet {
private static final long serialVersionUID = 8558779940775721010L;
@@ -826,7 +459,7 @@ public class GLStateManager {
final GLContextState glCtx = ctx();
RenderSystem.initRenderer();
- DEFAULT_DRAW_BUFFER = RENDER_BACKEND.getInteger(GL11.GL_DRAW_BUFFER);
+ GLSMFramebuffer.queryDefaultDrawBuffer();
// The initial mask value should be defined as all 1's. However, some drivers have it set to 0's.
// To ensure consistency & correctness across all drivers, we're setting them to 0xFF.
@@ -844,39 +477,7 @@ public class GLStateManager {
// Initialize stencil masks from computed bit mask
applyStencilBitMask(glCtx, stencilBitMask);
- final FloatBuffer lwRange = BufferUtils.createFloatBuffer(16);
- RENDER_BACKEND.getFloat(GL12.GL_ALIASED_LINE_WIDTH_RANGE, lwRange);
- lineWidthMin = lwRange.get(0);
- lineWidthMax = lwRange.get(1);
- final float queriedMax = lineWidthMax;
- // Probe whether the driver actually accepts the queried max (Mesa forward-compat rejects > 1.0)
- if (lineWidthMax > 1.0f) {
- while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {}
- RENDER_BACKEND.lineWidth(lineWidthMax);
- if (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {
- // Binary search for the actual accepted max between 1.0 and queriedMax
- float lo = 1.0f, hi = queriedMax;
- while (hi - lo > 0.01f) {
- final float mid = (lo + hi) * 0.5f;
- while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {}
- RENDER_BACKEND.lineWidth(mid);
- if (RENDER_BACKEND.getError() == GL11.GL_NO_ERROR) {
- lo = mid;
- } else {
- hi = mid;
- }
- }
- lineWidthMax = lo;
- }
- RENDER_BACKEND.lineWidth(1.0f);
- while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {}
- }
- wideLineEmulationEnabled = lineWidthMax <= 1.0f;
- if (wideLineEmulationEnabled) {
- LOGGER.info("GL line width: aliased range [{}, {}], probe at {} rejected, native [{}, {}], line quads widen ({}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax, lineWidthMax, queriedMax);
- } else {
- LOGGER.info("GL line width: aliased range [{}, {}], probe at {} accepted, native [{}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax);
- }
+ GLSMRasterizer.probeLineWidthRange();
// Sync default vertex attribs with GLSM cache initial values.
RENDER_BACKEND.vertexAttrib4f(1, 1.0f, 1.0f, 1.0f, 1.0f); // COLOR = white
@@ -906,12 +507,7 @@ public class GLStateManager {
initCallback.run();
}
- final FloatBuffer range = glCtx.queryScratch;
- range.clear();
- RENDER_BACKEND.getFloat(GL11.GL_POINT_SIZE_RANGE, range);
- final float smooth = range.get(1);
- RENDER_BACKEND.getFloat(GL12.GL_ALIASED_POINT_SIZE_RANGE, range);
- maxPointSize = Math.max(smooth, range.get(1));
+ GLSMRasterizer.probePointSizeRange(glCtx);
// Drain any pending GL errors from initialization. In core profile, some legacy queries may generate GL_INVALID_ENUM. The splash thread inherits the
// DrawableGL context and its error state, so stale errors here would cause SplashProgress.checkGLError() to fail.
@@ -921,960 +517,6 @@ public class GLStateManager {
}
}
- // LWJGL Overrides
- public static void glEnable(int cap) {
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(cap);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
- if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
- glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].enable();
- glCtx.clipPlaneGeneration++;
- return;
- }
-
- switch (cap) {
- case GL11.GL_ALPHA_TEST -> enableAlphaTest(glCtx);
- case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.enable();
- case GL11.GL_BLEND -> enableBlend(glCtx);
- case GL11.GL_COLOR_MATERIAL -> enableColorMaterial(glCtx);
- case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.enable();
- case GL14.GL_COLOR_SUM -> glCtx.colorSumState.enable();
- case GL11.GL_CULL_FACE -> enableCull(glCtx);
- case GL11.GL_DEPTH_TEST -> enableDepthTest(glCtx);
- case GL11.GL_DITHER -> glCtx.ditherState.enable();
- case GL11.GL_FOG -> enableFog(glCtx);
- case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.enable();
- case GL11.GL_LIGHTING -> enableLighting(glCtx);
- case GL11.GL_LIGHT0 -> enableLight(glCtx, 0);
- case GL11.GL_LIGHT1 -> enableLight(glCtx, 1);
- case GL11.GL_LIGHT2 -> enableLight(glCtx, 2);
- case GL11.GL_LIGHT3 -> enableLight(glCtx, 3);
- case GL11.GL_LIGHT4 -> enableLight(glCtx, 4);
- case GL11.GL_LIGHT5 -> enableLight(glCtx, 5);
- case GL11.GL_LIGHT6 -> enableLight(glCtx, 6);
- case GL11.GL_LIGHT7 -> enableLight(glCtx, 7);
- case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.enable();
- case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.enable();
- case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.enable();
- case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.enable();
- case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.enable();
- case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.enable();
- case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.enable();
- case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.enable();
- case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.enable();
- case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.enable();
- case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.enable();
- case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.enable();
- case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.enable();
- case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.enable();
- case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.enable();
- case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.enable();
- case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.enable();
- case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.enable();
- case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.enable();
- case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.enable();
- case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.enable();
- case GL11.GL_NORMALIZE -> glCtx.normalizeState.enable();
- case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.enable();
- case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.enable();
- case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.enable();
- case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.enable();
- case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.enable();
- case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.enable();
- case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.enable();
- case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.enable();
- case GL12.GL_RESCALE_NORMAL -> enableRescaleNormal(glCtx);
- case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.enable();
- case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.enable();
- case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.enable();
- case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.enable();
- case GL11.GL_SCISSOR_TEST -> enableScissorTest(glCtx);
- case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.enable();
- case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).enable();
- case GL11.GL_TEXTURE_2D -> enableTexture(glCtx);
- case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).enable();
- case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).enable();
- case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).enable();
- case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).enable();
- case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).enable();
- case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).enable();
- default -> {
- glCtx.exitCapture.reject();
- if (!setClientArrayCap(glCtx, cap, true)) RENDER_BACKEND.enable(cap);
- }
- }
- }
-
- public static void glDisable(int cap) {
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(cap);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
- if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
- glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].disable();
- glCtx.clipPlaneGeneration++;
- return;
- }
-
- switch (cap) {
- case GL11.GL_ALPHA_TEST -> disableAlphaTest(glCtx);
- case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.disable();
- case GL11.GL_BLEND -> disableBlend(glCtx);
- case GL11.GL_COLOR_MATERIAL -> disableColorMaterial(glCtx);
- case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.disable();
- case GL14.GL_COLOR_SUM -> glCtx.colorSumState.disable();
- case GL11.GL_CULL_FACE -> disableCull(glCtx);
- case GL11.GL_DEPTH_TEST -> disableDepthTest(glCtx);
- case GL11.GL_DITHER -> glCtx.ditherState.disable();
- case GL11.GL_FOG -> disableFog(glCtx);
- case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.disable();
- case GL11.GL_LIGHTING -> disableLighting(glCtx);
- case GL11.GL_LIGHT0 -> disableLight(glCtx, 0);
- case GL11.GL_LIGHT1 -> disableLight(glCtx, 1);
- case GL11.GL_LIGHT2 -> disableLight(glCtx, 2);
- case GL11.GL_LIGHT3 -> disableLight(glCtx, 3);
- case GL11.GL_LIGHT4 -> disableLight(glCtx, 4);
- case GL11.GL_LIGHT5 -> disableLight(glCtx, 5);
- case GL11.GL_LIGHT6 -> disableLight(glCtx, 6);
- case GL11.GL_LIGHT7 -> disableLight(glCtx, 7);
- case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.disable();
- case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.disable();
- case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.disable();
- case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.disable();
- case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.disable();
- case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.disable();
- case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.disable();
- case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.disable();
- case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.disable();
- case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.disable();
- case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.disable();
- case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.disable();
- case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.disable();
- case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.disable();
- case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.disable();
- case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.disable();
- case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.disable();
- case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.disable();
- case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.disable();
- case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.disable();
- case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.disable();
- case GL11.GL_NORMALIZE -> glCtx.normalizeState.disable();
- case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.disable();
- case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.disable();
- case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.disable();
- case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.disable();
- case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.disable();
- case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.disable();
- case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.disable();
- case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.disable();
- case GL12.GL_RESCALE_NORMAL -> disableRescaleNormal(glCtx);
- case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.disable();
- case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.disable();
- case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.disable();
- case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.disable();
- case GL11.GL_SCISSOR_TEST -> disableScissorTest(glCtx);
- case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.disable();
- case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).disable();
- case GL11.GL_TEXTURE_2D -> disableTexture(glCtx);
- case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).disable();
- case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).disable();
- case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).disable();
- case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).disable();
- case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).disable();
- case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).disable();
- default -> {
- glCtx.exitCapture.reject();
- if (!setClientArrayCap(glCtx, cap, false)) RENDER_BACKEND.disable(cap);
- }
- }
- }
-
- public static boolean glIsEnabled(int cap) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) {
- return RENDER_BACKEND.getBoolean(cap);
- }
- // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
- if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
- return glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].isEnabled();
- }
-
- return switch (cap) {
- case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled();
- case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled();
- case GL11.GL_BLEND -> glCtx.blendMode.isEnabled();
- case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled();
- case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled();
- case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled();
- case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled();
- case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled();
- case GL11.GL_DITHER -> glCtx.ditherState.isEnabled();
- case GL11.GL_FOG -> glCtx.fogMode.isEnabled();
- case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled();
- case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled();
- case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled();
- case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled();
- case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled();
- case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled();
- case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled();
- case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled();
- case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled();
- case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled();
- case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled();
- case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled();
- case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled();
- case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled();
- case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled();
- case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled();
- case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled();
- case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled();
- case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled();
- case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled();
- case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled();
- case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled();
- case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled();
- case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled();
- case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled();
- case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled();
- case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled();
- case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled();
- case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled();
- case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled();
- case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled();
- case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled();
- case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled();
- case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled();
- case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled();
- case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled();
- case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled();
- case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled();
- case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled();
- case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- default -> {
- final int conv = clientStateToConventional(glCtx, cap);
- yield conv >= 0 ? glCtx.vaos.isConventionalEnabled(conv) : LegacyQueries.desc(cap) == 0 && RENDER_BACKEND.getBoolean(cap);
- }
- };
- }
-
- public static boolean glGetBoolean(int pname) {
- rejectExitCapture();
- return glGetBoolean(ctx(), pname);
- }
-
- static boolean glGetBoolean(GLContextState glCtx, int pname) {
- if (!isCachingEnabled()) {
- return RENDER_BACKEND.getBoolean(pname);
- }
- // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
- if (pname >= GL11.GL_CLIP_PLANE0 && pname < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) {
- return glCtx.clipPlaneStates[pname - GL11.GL_CLIP_PLANE0].isEnabled();
- }
-
- return switch (pname) {
- case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled();
- case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled();
- case GL11.GL_BLEND -> glCtx.blendMode.isEnabled();
- case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled();
- case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled();
- case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled();
- case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled();
- case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled();
- case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled();
- case GL11.GL_DITHER -> glCtx.ditherState.isEnabled();
- case GL11.GL_FOG -> glCtx.fogMode.isEnabled();
- case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled();
- case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled();
- case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled();
- case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled();
- case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled();
- case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled();
- case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled();
- case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled();
- case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled();
- case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled();
- case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled();
- case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled();
- case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled();
- case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled();
- case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled();
- case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled();
- case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled();
- case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled();
- case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled();
- case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled();
- case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled();
- case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled();
- case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled();
- case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled();
- case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled();
- case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled();
- case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled();
- case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled();
- case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled();
- case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled();
- case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled();
- case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled();
- case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled();
- case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled();
- case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled();
- case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled();
- case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled();
- case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled();
- case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled();
- case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled();
- case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled();
- case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled();
- case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.localViewer != 0.0f;
- case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.twoSide != 0.0f;
- case GL11.GL_EDGE_FLAG -> glCtx.edgeFlagState.isEnabled();
- default -> {
- final int conv = clientStateToConventional(glCtx, pname);
- if (conv >= 0) yield glCtx.vaos.isConventionalEnabled(conv);
- final int desc = LegacyQueries.desc(pname);
- yield desc != 0 ? LegacyQueries.getBoolean(glCtx, pname, desc) : RENDER_BACKEND.getBoolean(pname);
- }
- };
- }
-
- public static void glGetBoolean(int pname, ByteBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) {
- RENDER_BACKEND.getBoolean(pname, params);
- return;
- }
-
- switch (pname) {
- case GL11.GL_COLOR_WRITEMASK -> {
- final int pos = params.position();
- params.put(pos, (byte) (glCtx.colorMask.red ? GL11.GL_TRUE : GL11.GL_FALSE));
- params.put(pos + 1, (byte) (glCtx.colorMask.green ? GL11.GL_TRUE : GL11.GL_FALSE));
- params.put(pos + 2, (byte) (glCtx.colorMask.blue ? GL11.GL_TRUE : GL11.GL_FALSE));
- params.put(pos + 3, (byte) (glCtx.colorMask.alpha ? GL11.GL_TRUE : GL11.GL_FALSE));
- }
- default -> {
- if (!HAS_MULTIPLE_SET.contains(pname)) {
- params.put(params.position(), (byte) (glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE));
- } else if (!LegacyQueries.getBooleanv(glCtx, pname, params)) {
- RENDER_BACKEND.getBoolean(pname, params);
- }
- }
- }
- }
-
- @SneakyThrows
- public static int getMatrixStackDepth(Matrix4fStack stack) {
- // JOML's curr is 0-based (0 = no pushes), but OpenGL starts at 1 (base matrix counts)
- return (int) MAT4_STACK_CURR_DEPTH.invokeExact(stack) + 1;
- }
-
- public static int glGetInteger(int pname) {
- rejectExitCapture();
- return glGetInteger(ctx(), pname);
- }
-
- static int glGetInteger(GLContextState glCtx, int pname) {
- if (!isCachingEnabled()) {
- return RENDER_BACKEND.getInteger(pname);
- }
-
- return switch (pname) {
- case GL11.GL_ALPHA_TEST_FUNC -> glCtx.alphaState.getFunction();
- case GL11.GL_DEPTH_FUNC -> glCtx.depthState.getFunc();
- case GL11.GL_LIST_BASE -> glCtx.listBase;
- case GL11.GL_LIST_MODE -> DisplayListManager.getListMode();
- case GL11.GL_MATRIX_MODE -> glCtx.matrixMode.getMode();
- case GL11.GL_SHADE_MODEL -> glCtx.shadeModelState.getValue();
- // GL_TEXTURE_2D makes no sense here, but some mod still queries it...
- case GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BINDING_2D -> getBoundTextureForServerState();
- case GL13.GL_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + getActiveTextureUnitForServerState();
- case GL13.GL_CLIENT_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + glCtx.clientActiveTextureUnit;
- case GL11.GL_COLOR_MATERIAL_FACE -> glCtx.colorMaterialFace.getValue();
- case GL11.GL_COLOR_MATERIAL_PARAMETER -> glCtx.colorMaterialParameter.getValue();
- case GL11.GL_MODELVIEW_STACK_DEPTH -> getMatrixStackDepth(glCtx.modelViewMatrix);
- case GL11.GL_PROJECTION_STACK_DEPTH -> getMatrixStackDepth(glCtx.projectionMatrix);
- case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled() ? GL11.GL_TRUE : GL11.GL_FALSE;
- case GL11.GL_CULL_FACE_MODE -> glCtx.polygonState.getCullFaceMode();
- case GL11.GL_FRONT_FACE -> glCtx.polygonState.getFrontFace();
- case GL11.GL_POLYGON_MODE -> glCtx.polygonState.getFrontMode();
- case GL11.GL_UNPACK_ALIGNMENT -> glCtx.pixelUnpackState.alignment();
- case GL11.GL_UNPACK_ROW_LENGTH -> glCtx.pixelUnpackState.rowLength();
- case GL11.GL_UNPACK_SKIP_ROWS -> glCtx.pixelUnpackState.skipRows();
- case GL11.GL_UNPACK_SKIP_PIXELS -> glCtx.pixelUnpackState.skipPixels();
-
- case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.colorControl;
-
- case GL14.GL_BLEND_DST_ALPHA -> glCtx.blendState.getDstAlpha();
- case GL11.GL_BLEND_DST, GL14.GL_BLEND_DST_RGB -> glCtx.blendState.getDstRgb();
- case GL14.GL_BLEND_SRC_ALPHA -> glCtx.blendState.getSrcAlpha();
- case GL11.GL_BLEND_SRC, GL14.GL_BLEND_SRC_RGB -> glCtx.blendState.getSrcRgb();
- case GL14.GL_BLEND_EQUATION -> glCtx.blendState.getEquationRgb();
- case GL20.GL_BLEND_EQUATION_ALPHA -> glCtx.blendState.getEquationAlpha();
-
- case GL11.GL_LOGIC_OP_MODE -> glCtx.logicOpMode.getValue();
- case GL11.GL_DRAW_BUFFER -> glCtx.drawBuffer.getValue();
-
- case GL11.GL_STENCIL_FUNC -> glCtx.stencilState.getFuncFront();
- case GL11.GL_STENCIL_REF -> glCtx.stencilState.getRefFront();
- case GL11.GL_STENCIL_VALUE_MASK -> glCtx.stencilState.getValueMaskFront();
- case GL11.GL_STENCIL_FAIL -> glCtx.stencilState.getFailOpFront();
- case GL11.GL_STENCIL_PASS_DEPTH_FAIL -> glCtx.stencilState.getZFailOpFront();
- case GL11.GL_STENCIL_PASS_DEPTH_PASS -> glCtx.stencilState.getZPassOpFront();
- case GL11.GL_STENCIL_WRITEMASK -> glCtx.stencilState.getWriteMaskFront();
- case GL11.GL_STENCIL_CLEAR_VALUE -> glCtx.stencilState.getClearValue();
-
- case GL15.GL_ARRAY_BUFFER_BINDING -> glCtx.boundVBO;
- case GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING -> glCtx.vaos.boundEBO;
- case GL21.GL_PIXEL_UNPACK_BUFFER_BINDING -> glCtx.boundPixelUnpackBuffer;
- case GL21.GL_PIXEL_PACK_BUFFER_BINDING -> glCtx.boundPixelPackBuffer;
-
- case GL20.GL_CURRENT_PROGRAM -> glCtx.activeProgram;
-
- case GL30.GL_VERTEX_ARRAY_BINDING -> glCtx.boundVAO;
-
- case GL30.GL_DRAW_FRAMEBUFFER_BINDING -> glCtx.drawFramebuffer;
- case GL30.GL_READ_FRAMEBUFFER_BINDING -> glCtx.readFramebuffer;
-
- case GL33.GL_SAMPLER_BINDING -> glCtx.samplerUnits.get(glCtx.activeTextureUnit.getValue());
-
- default -> switch (pname) {
- case GL11.GL_FOG_MODE -> glCtx.fogState.getFogMode();
- case GL11.GL_LINE_STIPPLE_PATTERN -> glCtx.lineState.getStipplePattern() & 0xFFFF;
- case GL11.GL_LINE_STIPPLE_REPEAT -> glCtx.lineState.getStippleFactor();
- case GL11.GL_LIST_INDEX -> DisplayListManager.isRecording() ? Math.max(DisplayListManager.getRecordingListId(), 0) : 0;
- case GL11.GL_ATTRIB_STACK_DEPTH -> glCtx.attribDepth;
- case GL11.GL_CLIENT_ATTRIB_STACK_DEPTH -> glCtx.clientAttribStackPointer;
- case GL11.GL_TEXTURE_STACK_DEPTH -> getMatrixStackDepth(glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue()));
- case GL11.GL_MAX_ATTRIB_STACK_DEPTH -> MAX_ATTRIB_STACK_DEPTH;
- case GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH -> CLIENT_ATTRIB_STACK_DEPTH;
- case GL11.GL_MAX_MODELVIEW_STACK_DEPTH -> MAX_MODELVIEW_STACK_DEPTH;
- case GL11.GL_MAX_PROJECTION_STACK_DEPTH -> MAX_PROJECTION_STACK_DEPTH;
- case GL11.GL_MAX_TEXTURE_STACK_DEPTH -> MAX_TEXTURE_STACK_DEPTH;
- case GL13.GL_MAX_TEXTURE_UNITS -> MAX_LEGACY_TEXTURE_UNITS;
- case GL11.GL_MAX_LIGHTS -> glCtx.lightStates.length;
- case GL11.GL_STENCIL_BITS -> drawFramebufferBits(glCtx, true);
- case GL11.GL_DEPTH_BITS -> drawFramebufferBits(glCtx, false);
- case GL20.GL_MAX_TEXTURE_COORDS -> MAX_TEXTURE_COORDS;
- case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> glCtx.pointState.getSpriteCoordOrigin();
- case GL11.GL_RENDER_MODE -> FeedbackManager.getRenderMode();
- default -> {
- final int shift = hintShift(pname);
- if (shift >= 0) yield hintMode(glCtx.hintState.getValue(), shift);
- final int key = clientArrayField(glCtx, pname);
- if (key >= 0 && (key & ~0xFF) != FIELD_POINTER) yield clientArrayParam(glCtx, key);
- final int desc = LegacyQueries.desc(pname);
- yield desc != 0 ? LegacyQueries.getInteger(glCtx, pname, desc) : RENDER_BACKEND.getInteger(pname);
- }
- };
- };
- }
-
- private static int drawFramebufferBits(GLContextState glCtx, boolean stencil) {
- final int sizePname = stencil ? GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE : GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE;
- if (glCtx.drawFramebuffer == 0) {
- return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, stencil ? GL11.GL_STENCIL : GL11.GL_DEPTH, sizePname);
- }
- final int attachment = stencil ? GL30.GL_STENCIL_ATTACHMENT : GL30.GL_DEPTH_ATTACHMENT;
- if (RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) == GL11.GL_NONE) {
- return 0;
- }
- return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, sizePname);
- }
-
- public static void glGetInteger(int pname, IntBuffer params) {
- rejectExitCapture();
- if (!isCachingEnabled()) {
- RENDER_BACKEND.getInteger(pname, params);
- return;
- }
-
- switch (pname) {
- case GL11.GL_VIEWPORT -> ctx().viewportState.get(params);
- case GL11.GL_SCISSOR_BOX -> ctx().scissorState.get(params);
- case GL11.GL_POLYGON_MODE -> {
- final PolygonState polygon = ctx().polygonState;
- final int pos = params.position();
- params.put(pos, polygon.getFrontMode());
- params.put(pos + 1, polygon.getBackMode());
- }
- default -> {
- final GLContextState glCtx = ctx();
- if (!HAS_MULTIPLE_SET.contains(pname)) {
- params.put(params.position(), glGetInteger(glCtx, pname));
- } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) {
- RENDER_BACKEND.getInteger(pname, params);
- }
- }
- }
- }
-
- public static void glGetMaterial(int face, int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final MaterialStateStack state;
- if (face == GL11.GL_FRONT) {
- state = glCtx.frontMaterial;
- } else if (face == GL11.GL_BACK) {
- state = glCtx.backMaterial;
- } else {
- throw new RuntimeException("Invalid face parameter specified to glGetMaterial: " + face);
- }
-
- switch (pname) {
- case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params);
- case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params);
- case GL11.GL_SPECULAR -> state.specular.get(params.position(), params);
- case GL11.GL_EMISSION -> state.emission.get(params.position(), params);
- case GL11.GL_SHININESS -> params.put(params.position(), state.shininess);
- case GL11.GL_COLOR_INDEXES -> state.colorIndexes.get(params.position(), params);
- default -> {
- }
- }
- }
-
- private static void putLightingInts(FloatBuffer values, int pname, boolean material, IntBuffer params) {
- final int count = switch (pname) {
- case GL11.GL_AMBIENT, GL11.GL_DIFFUSE, GL11.GL_SPECULAR -> 4;
- case GL11.GL_EMISSION -> material ? 4 : 0;
- case GL11.GL_COLOR_INDEXES -> material ? 3 : 0;
- case GL11.GL_SHININESS -> material ? 1 : 0;
- case GL11.GL_POSITION -> material ? 0 : 4;
- case GL11.GL_SPOT_DIRECTION -> material ? 0 : 3;
- case GL11.GL_SPOT_EXPONENT, GL11.GL_SPOT_CUTOFF, GL11.GL_CONSTANT_ATTENUATION, GL11.GL_LINEAR_ATTENUATION,
- GL11.GL_QUADRATIC_ATTENUATION -> material ? 0 : 1;
- default -> 0;
- };
- final boolean color = count == 4 && pname != GL11.GL_POSITION;
- final int pos = params.position();
- for (int i = 0; i < count; i++) {
- final float value = values.get(i);
- final int converted;
- if (color) {
- converted = LegacyQueries.floatToInt(value);
- } else if (material) {
- converted = LegacyQueries.lround(value);
- } else {
- converted = (int) value;
- }
- params.put(pos + i, converted);
- }
- }
-
- public static void glGetMaterial(int face, int pname, IntBuffer params) {
- final FloatBuffer scratch = ctx().queryScratch;
- scratch.clear();
- glGetMaterial(face, pname, scratch);
- putLightingInts(scratch, pname, true, params);
- }
-
- public static void glGetLight(int light, int pname, IntBuffer params) {
- final FloatBuffer scratch = ctx().queryScratch;
- scratch.clear();
- glGetLight(light, pname, scratch);
- putLightingInts(scratch, pname, false, params);
- }
-
- public static void glGetLight(int light, int pname, FloatBuffer params) {
- rejectExitCapture();
- final LightStateStack state = ctx().lightDataStates[light - GL11.GL_LIGHT0];
- switch (pname) {
- case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params);
- case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params);
- case GL11.GL_SPECULAR -> state.specular.get(params.position(), params);
- case GL11.GL_POSITION -> state.position.get(params.position(), params);
- case GL11.GL_SPOT_DIRECTION -> state.spotDirection.get(params.position(), params);
- case GL11.GL_SPOT_EXPONENT -> params.put(params.position(), state.spotExponent);
- case GL11.GL_SPOT_CUTOFF -> params.put(params.position(), state.spotCutoff);
- case GL11.GL_CONSTANT_ATTENUATION -> params.put(params.position(), state.constantAttenuation);
- case GL11.GL_LINEAR_ATTENUATION -> params.put(params.position(), state.linearAttenuation);
- case GL11.GL_QUADRATIC_ATTENUATION -> params.put(params.position(), state.quadraticAttenuation);
- default -> {
- }
- }
- }
-
- public static void glGetFloat(int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) {
- RENDER_BACKEND.getFloat(pname, params);
- return;
- }
-
- switch (pname) {
- case GL11.GL_MODELVIEW_MATRIX -> glCtx.modelViewMatrix.get(params.position(), params);
- case GL11.GL_PROJECTION_MATRIX -> glCtx.projectionMatrix.get(params.position(), params);
- case GL11.GL_TEXTURE_MATRIX -> glCtx.textures.getTextureUnitMatrix(getActiveTextureUnit()).get(params.position(), params);
- case GL11.GL_COLOR_CLEAR_VALUE -> glCtx.clearColor.get(params);
- case GL11.GL_CURRENT_COLOR -> glCtx.color.get(params);
- case GL14.GL_CURRENT_SECONDARY_COLOR -> glCtx.secondaryColor.get(params);
- case GL11.GL_DEPTH_RANGE -> {
- final int pos = params.position();
- params.put(pos, (float) glCtx.viewportState.depthRangeNear);
- params.put(pos + 1, (float) glCtx.viewportState.depthRangeFar);
- }
- case GL14.GL_BLEND_COLOR -> {
- final int pos = params.position();
- params.put(pos, glCtx.blendState.getBlendColorR());
- params.put(pos + 1, glCtx.blendState.getBlendColorG());
- params.put(pos + 2, glCtx.blendState.getBlendColorB());
- params.put(pos + 3, glCtx.blendState.getBlendColorA());
- }
- case GL11.GL_CURRENT_NORMAL -> {
- final Vector3f normal = glCtx.ffp.currentNormal;
- final int pos = params.position();
- params.put(pos, normal.x);
- params.put(pos + 1, normal.y);
- params.put(pos + 2, normal.z);
- }
- case GL11.GL_CURRENT_TEXTURE_COORDS -> {
- final int unit = glCtx.activeTextureUnit.getValue();
- final int pos = params.position();
- if (unit == 1) {
- params.put(pos, glCtx.lastBrightnessX);
- params.put(pos + 1, glCtx.lastBrightnessY);
- params.put(pos + 2, 0.0f);
- params.put(pos + 3, 1.0f);
- } else if (unit >= 0 && unit < glCtx.ffp.currentTexCoords.length) {
- final Vector4f tc = glCtx.ffp.currentTexCoords[unit];
- params.put(pos, tc.x);
- params.put(pos + 1, tc.y);
- params.put(pos + 2, tc.z);
- params.put(pos + 3, tc.w);
- } else {
- params.put(pos, 0.0f);
- params.put(pos + 1, 0.0f);
- params.put(pos + 2, 0.0f);
- params.put(pos + 3, 1.0f);
- }
- }
- case GL11.GL_FOG_COLOR -> {
- final FloatBuffer fogBuf = glCtx.fogState.getFogColorBuffer();
- final int pos = params.position();
- params.put(pos, fogBuf.get(0));
- params.put(pos + 1, fogBuf.get(1));
- params.put(pos + 2, fogBuf.get(2));
- params.put(pos + 3, fogBuf.get(3));
- }
- case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.ambient.get(params.position(), params);
- case GL14.GL_POINT_DISTANCE_ATTENUATION -> {
- final int pos = params.position();
- params.put(pos, glCtx.pointState.getAttenuationConstant());
- params.put(pos + 1, glCtx.pointState.getAttenuationLinear());
- params.put(pos + 2, glCtx.pointState.getAttenuationQuadratic());
- }
- default -> {
- if (!HAS_MULTIPLE_SET.contains(pname)) {
- params.put(params.position(), glGetFloat(glCtx, pname));
- } else {
- RENDER_BACKEND.getFloat(pname, params);
- }
- }
- }
- }
-
- public static float glGetFloat(int pname) {
- rejectExitCapture();
- return glGetFloat(ctx(), pname);
- }
-
- static float glGetFloat(GLContextState glCtx, int pname) {
- return switch (pname) {
- case GL11.GL_ALPHA_TEST_REF -> glCtx.alphaState.getReference();
- case GL11.GL_FOG_DENSITY -> glCtx.fogState.getDensity();
- case GL11.GL_FOG_START -> glCtx.fogState.getStart();
- case GL11.GL_FOG_END -> glCtx.fogState.getEnd();
- case GL11.GL_DEPTH_CLEAR_VALUE -> (float) glCtx.depthState.getClearValue();
- case GL11.GL_LINE_WIDTH -> glCtx.lineState.getWidth();
- case GL11.GL_POINT_SIZE -> glCtx.pointState.getSize();
- case GL14.GL_POINT_SIZE_MIN -> glCtx.pointState.getMinSize();
- case GL14.GL_POINT_SIZE_MAX -> Float.isNaN(glCtx.pointState.getMaxSize()) ? maxPointSize : glCtx.pointState.getMaxSize();
- case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> glCtx.pointState.getFadeThreshold();
- default -> {
- final int desc = isCachingEnabled() ? LegacyQueries.desc(pname) : 0;
- yield desc != 0 ? LegacyQueries.getFloat(glCtx, pname, desc) : RENDER_BACKEND.getFloat(pname);
- }
- };
- }
-
- public static void glGetFloat(int pname, float[] params) {
- final FloatBuffer scratch = ctx().queryScratch;
- final FloatBuffer buf;
- if (params.length <= scratch.capacity()) {
- buf = scratch;
- buf.clear();
- buf.limit(params.length);
- } else {
- buf = BufferUtils.createFloatBuffer(params.length);
- }
- glGetFloat(pname, buf);
- buf.position(0);
- buf.get(params);
- }
-
- public static double glGetDouble(int pname) {
- rejectExitCapture();
- return switch (pname) {
- case GL11.GL_DEPTH_CLEAR_VALUE -> ctx().depthState.getClearValue();
- default -> glGetFloat(pname);
- };
- }
-
- public static void glGetDouble(int pname, DoubleBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) {
- RENDER_BACKEND.getDouble(pname, params);
- return;
- }
-
- final int pos = params.position();
- switch (pname) {
- case GL11.GL_DEPTH_CLEAR_VALUE -> params.put(pos, glCtx.depthState.getClearValue());
- case GL11.GL_DEPTH_RANGE -> {
- params.put(pos, glCtx.viewportState.depthRangeNear);
- params.put(pos + 1, glCtx.viewportState.depthRangeFar);
- }
- case GL11.GL_MODELVIEW_MATRIX, GL11.GL_PROJECTION_MATRIX, GL11.GL_TEXTURE_MATRIX -> widenFromFloat(pname, params, 16);
- case GL11.GL_COLOR_CLEAR_VALUE, GL11.GL_CURRENT_COLOR, GL11.GL_CURRENT_TEXTURE_COORDS, GL11.GL_FOG_COLOR,
- GL11.GL_LIGHT_MODEL_AMBIENT, GL14.GL_BLEND_COLOR, GL14.GL_CURRENT_SECONDARY_COLOR -> widenFromFloat(pname, params, 4);
- case GL11.GL_CURRENT_NORMAL, GL14.GL_POINT_DISTANCE_ATTENUATION -> widenFromFloat(pname, params, 3);
- default -> {
- if (!HAS_MULTIPLE_SET.contains(pname)) {
- params.put(pos, glGetDouble(pname));
- } else {
- RENDER_BACKEND.getDouble(pname, params);
- }
- }
- }
- }
-
- public static void glGetDouble(int pname, double[] params) {
- final DoubleBuffer scratch = ctx().queryScratchDouble;
- final DoubleBuffer buf;
- if (params.length <= scratch.capacity()) {
- buf = scratch;
- buf.clear();
- buf.limit(params.length);
- } else {
- buf = BufferUtils.createDoubleBuffer(params.length);
- }
- glGetDouble(pname, buf);
- buf.position(0);
- buf.get(params);
- }
-
- private static void widenFromFloat(int pname, DoubleBuffer params, int count) {
- final FloatBuffer scratch = ctx().queryScratch;
- scratch.clear();
- glGetFloat(pname, scratch);
- final int pos = params.position();
- for (int i = 0; i < count; i++) {
- params.put(pos + i, scratch.get(i));
- }
- }
-
- public static void glGetClipPlane(int plane, DoubleBuffer equation) {
- rejectExitCapture();
- final int index = plane - GL11.GL_CLIP_PLANE0;
- if (index < 0 || index >= MAX_CLIP_PLANES) return;
- ctx().clipPlaneState.getEyePlane(index, equation);
- }
-
- // GLStateManager Functions
-
- public static void glBlendColor(float red, float green, float blue, float alpha) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordBlendColor(red, green, blue, alpha);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- final boolean bypass = !caching;
- if (bypass || red != glCtx.blendState.getBlendColorR() || green != glCtx.blendState.getBlendColorG() || blue != glCtx.blendState.getBlendColorB() || alpha != glCtx.blendState.getBlendColorA()) {
- mod(glCtx.blendState);
- beforeUncapturedStateChange();
- glCtx.blendState.setBlendColorR(red);
- glCtx.blendState.setBlendColorG(green);
- glCtx.blendState.setBlendColorB(blue);
- glCtx.blendState.setBlendColorA(alpha);
- RENDER_BACKEND.blendColor(red, green, blue, alpha);
- }
- }
-
- public static void glEnablei(int cap, int index) {
- rejectExitCapture();
- RENDER_BACKEND.enablei(cap, index);
- markIndexedCapUnknown(cap);
- }
-
- public static void glDisablei(int cap, int index) {
- rejectExitCapture();
- RENDER_BACKEND.disablei(cap, index);
- markIndexedCapUnknown(cap);
- }
-
- private static void markIndexedCapUnknown(int cap) {
- if (cap == GL11.GL_BLEND) {
- ctx().blendMode.setUnknownState();
- } else if (cap == GL11.GL_SCISSOR_TEST) {
- ctx().scissorTest.setUnknownState();
- }
- }
-
- public static void glBlendFuncSeparatei(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
- rejectExitCapture();
- RENDER_BACKEND.blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
- ctx().blendState.setFuncUnknownState();
- }
-
- public static void enableBlend() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_BLEND);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableBlend(ctx());
- }
-
- private static void enableBlend(GLContextState glCtx) {
- final BooleanStateStack blend = glCtx.blendMode;
- final boolean wasEnabled = blend.isEffectivelyEnabled();
- final DeferredBlendHandler bh = GLSMHooks.blendHandler;
- if (bh != null && bh.isBlendLocked()) {
- glCtx.exitCapture.capability(GL11.GL_BLEND, -1);
- blend.beforeModify();
- bh.deferBlendModeToggle(true);
- } else {
- blend.enable();
- }
- if (!wasEnabled && blend.isEffectivelyEnabled()) postVanillaBlendChange();
- }
-
- public static void disableBlend() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_BLEND);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableBlend(ctx());
- }
-
- private static void disableBlend(GLContextState glCtx) {
- final BooleanStateStack blend = glCtx.blendMode;
- final boolean wasEnabled = blend.isEffectivelyEnabled();
- final DeferredBlendHandler bh = GLSMHooks.blendHandler;
- if (bh != null && bh.isBlendLocked()) {
- glCtx.exitCapture.capability(GL11.GL_BLEND, -1);
- blend.beforeModify();
- bh.deferBlendModeToggle(false);
- } else {
- blend.disable();
- }
- if (wasEnabled && !blend.isEffectivelyEnabled()) postVanillaBlendChange();
- }
-
- private static void postVanillaBlendChange() {
- if (GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) {
- GLSMHooks.VANILLA_BLEND_CHANGE.post(GLSMHooks.vanillaBlendChangeEvent);
- }
- }
-
- private static boolean snapshotVanillaBlendFunc() {
- if (!GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) return false;
- final GLContextState glCtx = ctx();
- glCtx.blendState.readEffective(glCtx.vanillaBlendBefore);
- glCtx.vanillaBlendEnabledBefore = glCtx.blendMode.isEffectivelyEnabled();
- return true;
- }
-
- private static void postVanillaBlendChangeIfMoved(boolean snapshotted) {
- if (!snapshotted) return;
- final GLContextState glCtx = ctx();
- final BlendState before = glCtx.vanillaBlendBefore;
- final BlendState after = glCtx.blendState.readEffective(glCtx.vanillaBlendAfter);
- if (glCtx.blendMode.isEffectivelyEnabled() != glCtx.vanillaBlendEnabledBefore
- || after.getSrcRgb() != before.getSrcRgb()
- || after.getDstRgb() != before.getDstRgb()
- || after.getSrcAlpha() != before.getSrcAlpha()
- || after.getDstAlpha() != before.getDstAlpha()) {
- postVanillaBlendChange();
- }
- }
-
- public static boolean isEffectiveBlendEnabled() {
- return ctx().blendMode.isEffectivelyEnabled();
- }
-
- public static BlendState getEffectiveBlendState(BlendState out) {
- return ctx().blendState.readEffective(out);
- }
-
- public static boolean isEffectiveDepthMaskEnabled() {
- return ctx().depthState.isEffectiveMaskEnabled();
- }
-
- public static ColorMask getEffectiveColorMask(ColorMask out) {
- return ctx().colorMask.readEffective(out);
- }
-
- public static boolean isEffectiveAlphaTestEnabled() {
- return ctx().alphaTest.isEffectivelyEnabled();
- }
-
- public static AlphaState getEffectiveAlphaState(AlphaState out) {
- return ctx().alphaState.readEffective(out);
- }
-
public static void beginForeignDraw() {
ctx().foreignDrawDepth++;
}
@@ -1893,2974 +535,6 @@ public class GLStateManager {
return ctx().foreignDrawDepth > 0;
}
- public static void enableScissorTest() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_SCISSOR_TEST);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableScissorTest(ctx());
- }
-
- private static void enableScissorTest(GLContextState glCtx) {
- glCtx.scissorTest.enable();
- }
-
- public static void disableScissorTest() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_SCISSOR_TEST);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableScissorTest(ctx());
- }
-
- private static void disableScissorTest(GLContextState glCtx) {
- glCtx.scissorTest.disable();
- }
-
- public static void glBlendFunc(int srcFactor, int dstFactor) {
- tryBlendFuncSeparate(srcFactor, dstFactor, srcFactor, dstFactor);
- }
-
- private static void issueBlendFunc(BlendStateStack blend) {
- if (GLSMConfig.hudCacheOverride) {
- RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- } else {
- RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), blend.getSrcAlpha(), blend.getDstAlpha());
- }
- }
-
- public static void setHudCacheOverride(boolean enabled) {
- if (GLSMConfig.hudCacheOverride == enabled) return;
- GLSMConfig.hudCacheOverride = enabled;
- final DeferredBlendHandler bh = GLSMHooks.blendHandler;
- if (bh != null && bh.isOverrideHeld()) return;
- final BlendStateStack blend = ctx().blendState;
- issueBlendFunc(blend);
- blend.clearFuncUnknownState();
- }
-
- public static void glBlendEquation(int mode) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glBlendEquation");
- }
- final boolean caching = isCachingEnabled();
- final boolean bypass = !caching;
- if (bypass || glCtx.blendState.getEquationRgb() != mode || glCtx.blendState.getEquationAlpha() != mode) {
- mod(glCtx.blendState);
- beforeUncapturedStateChange();
- glCtx.blendState.setEquationRgb(mode);
- glCtx.blendState.setEquationAlpha(mode);
- RENDER_BACKEND.blendEquation(mode);
- }
- }
-
- public static void glBlendEquationSeparate(int modeRGB, int modeAlpha) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glBlendEquationSeparate");
- }
- final boolean caching = isCachingEnabled();
- final boolean bypass = !caching;
- if (bypass || glCtx.blendState.getEquationRgb() != modeRGB || glCtx.blendState.getEquationAlpha() != modeAlpha) {
- mod(glCtx.blendState);
- beforeUncapturedStateChange();
- glCtx.blendState.setEquationRgb(modeRGB);
- glCtx.blendState.setEquationAlpha(modeAlpha);
- RENDER_BACKEND.blendEquationSeparate(modeRGB, modeAlpha);
- }
- }
-
- public static void tryBlendFuncSeparate(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.writeBlend();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean snapshotted = snapshotVanillaBlendFunc();
- final DeferredBlendHandler bh = GLSMHooks.blendHandler;
- if (bh != null && bh.isBlendLocked()) {
- mod(glCtx.blendState);
- bh.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
- postVanillaBlendChangeIfMoved(snapshotted);
- return;
- }
- final boolean caching = isCachingEnabled();
- final boolean bypass = !caching;
- if (bypass || glCtx.blendState.getSrcRgb() != srcRgb || glCtx.blendState.getDstRgb() != dstRgb || glCtx.blendState.getSrcAlpha() != srcAlpha || glCtx.blendState.getDstAlpha() != dstAlpha || glCtx.blendState.isFuncUnknown()) {
- mod(glCtx.blendState);
- glCtx.blendState.setAll(srcRgb, dstRgb, srcAlpha, dstAlpha);
- glCtx.blendState.clearFuncUnknownState();
- issueBlendFunc(glCtx.blendState);
- if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) {
- final boolean hudCache = GLSMConfig.hudCacheOverride;
- GLSMHooks.blendFuncChangeEvent.srcRgb = srcRgb;
- GLSMHooks.blendFuncChangeEvent.dstRgb = dstRgb;
- GLSMHooks.blendFuncChangeEvent.srcAlpha = hudCache ? GL11.GL_ONE : srcAlpha;
- GLSMHooks.blendFuncChangeEvent.dstAlpha = hudCache ? GL11.GL_ONE_MINUS_SRC_ALPHA : dstAlpha;
- GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent);
- }
- }
- postVanillaBlendChangeIfMoved(snapshotted);
- }
-
- public static void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
- tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
- }
-
- public static void checkCompiling() {
- checkCompiling("");
- }
-
- public static void checkCompiling(String name) {
- if (DisplayListManager.isRecording()) {
- throw new UnsupportedOperationException("Not yet implemented (" + name + ")");
- }
- }
-
- // Records glBegin/glEnd/glVertex and compiles them to a VBO
- // Currently only used inside of display lists
-
- public static void glNormal3b(byte nx, byte ny, byte nz) {
- final float fnx = b2f(nx), fny = b2f(ny), fnz = b2f(nz);
- final GLContextState glCtx = ctx();
- glCtx.ffp.setNormal(fnx, fny, fnz);
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setNormal(fnx, fny, fnz);
- return;
- }
- glCtx.dirtyNormalAttrib = true;
- }
-
- public static void glNormal3d(double nx, double ny, double nz) {
- final float fnx = (float) nx, fny = (float) ny, fnz = (float) nz;
- final GLContextState glCtx = ctx();
- glCtx.ffp.setNormal(fnx, fny, fnz);
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setNormal(fnx, fny, fnz);
- return;
- }
- glCtx.dirtyNormalAttrib = true;
- }
-
- public static void glNormal3f(float nx, float ny, float nz) {
- final GLContextState glCtx = ctx();
- glCtx.ffp.setNormal(nx, ny, nz);
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setNormal(nx, ny, nz);
- return;
- }
- glCtx.dirtyNormalAttrib = true;
- }
-
- public static void glNormal3i(int nx, int ny, int nz) {
- final float fnx = nx / 2147483647.0f, fny = ny / 2147483647.0f, fnz = nz / 2147483647.0f;
- final GLContextState glCtx = ctx();
- glCtx.ffp.setNormal(fnx, fny, fnz);
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setNormal(fnx, fny, fnz);
- return;
- }
- glCtx.dirtyNormalAttrib = true;
- }
-
- public static void glDepthFunc(int func) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.DEPTH_FUNC);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDepthFunc(func);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || func != glCtx.depthState.getFunc()) {
- mod(glCtx.depthState);
- glCtx.depthState.setFunc(func);
- RENDER_BACKEND.depthFunc(func);
- }
- }
-
- public static void glDepthMask(boolean mask) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.writeDepthColor(ExitStateCapture.DEPTH_MASK);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDepthMask(mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
- if (dch != null && dch.isDepthColorLocked()) {
- mod(glCtx.depthState);
- dch.deferDepthEnable(mask);
- return;
- }
- final boolean caching = isCachingEnabled();
- if (!caching || mask != glCtx.depthState.isEnabled()) {
- mod(glCtx.depthState);
- glCtx.depthState.setEnabled(mask);
- RENDER_BACKEND.depthMask(mask);
- }
- }
-
- public static void glEdgeFlag(boolean flag) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStateCommand(() -> glEdgeFlag(flag));
- if (mode == RecordMode.COMPILE) return;
- }
- ctx().edgeFlagState.setEnabled(flag);
- }
-
- public static void glColor4f(float red, float green, float blue, float alpha) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor(red, green, blue, alpha);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor(red, green, blue, alpha);
- }
-
- public static void glColor4d(double red, double green, double blue, double alpha) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor((float) red, (float) green, (float) blue, (float) alpha);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor((float) red, (float) green, (float) blue, (float) alpha);
- }
-
- public static void glColor4b(byte red, byte green, byte blue, byte alpha) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), b2f(alpha));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor(b2f(red), b2f(green), b2f(blue), b2f(alpha));
- }
-
- public static void glColor4ub(byte red, byte green, byte blue, byte alpha) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha));
- }
-
- public static void glColor3f(float red, float green, float blue) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor(red, green, blue, 1.0F);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor(red, green, blue, 1.0F);
- }
-
- public static void glColor3d(double red, double green, double blue) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor((float) red, (float) green, (float) blue, 1.0F);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor((float) red, (float) green, (float) blue, 1.0F);
- }
-
- public static void glColor3b(byte red, byte green, byte blue) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), 1.0F);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor(b2f(red), b2f(green), b2f(blue), 1.0F);
- }
-
- public static void glColor3ub(byte red, byte green, byte blue) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F);
- }
-
- private static float ub2f(byte b) {
- return (b & 0xFF) / 255.0F;
- }
-
- private static float b2f(byte b) {
- return ((b - Byte.MIN_VALUE) & 0xFF) / 255.0F;
- }
-
- public static float i2f(int i) {return ((i - Integer.MIN_VALUE) & 0xFFFFFFFFL) / 4294967295.0F;}
-
- private static boolean changeColor(float red, float green, float blue, float alpha) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.COLOR);
- // Helper function for glColor*
- final boolean caching = isCachingEnabled();
- if (!caching || red != glCtx.color.getRed() || green != glCtx.color.getGreen() || blue != glCtx.color.getBlue() || alpha != glCtx.color.getAlpha()) {
- mod(glCtx.color);
- glCtx.color.setRed(red);
- glCtx.color.setGreen(green);
- glCtx.color.setBlue(blue);
- glCtx.color.setAlpha(alpha);
- glCtx.colorGeneration++;
- if (ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setColor(red, green, blue, alpha);
- }
- glCtx.dirtyColorAttrib = true;
- // Only set while an enchantment-glint span is active
- final GlintColorHandler glintHandler = GLSMHooks.glintColorHandler;
- if (glintHandler != null) {
- glintHandler.onColorChanged(red, green, blue, alpha);
- }
- return true;
- }
- return false;
- }
-
- public static void glSecondaryColor3f(float red, float green, float blue) {
- rejectExitCapture();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordSecondaryColor(red, green, blue);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- changeSecondaryColor(red, green, blue);
- }
-
- public static void glSecondaryColor3d(double red, double green, double blue) {
- glSecondaryColor3f((float) red, (float) green, (float) blue);
- }
-
- public static void glSecondaryColor3b(byte red, byte green, byte blue) {
- glSecondaryColor3f(b2f(red), b2f(green), b2f(blue));
- }
-
- public static void glSecondaryColor3ub(byte red, byte green, byte blue) {
- glSecondaryColor3f(ub2f(red), ub2f(green), ub2f(blue));
- }
-
- /** Helper for glSecondaryColor* - the color sum is emulated by the FFP shaders, nothing is sent to the driver. */
- private static void changeSecondaryColor(float red, float green, float blue) {
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled() || red != glCtx.secondaryColor.getRed() || green != glCtx.secondaryColor.getGreen() || blue != glCtx.secondaryColor.getBlue()) {
- if (glCtx.colorSumState.isEnabled()) beforeUncapturedStateChange();
- mod(glCtx.secondaryColor);
- glCtx.secondaryColor.setRed(red);
- glCtx.secondaryColor.setGreen(green);
- glCtx.secondaryColor.setBlue(blue);
- glCtx.fragmentGeneration++;
- }
- }
-
- private static final Color4 DirtyColor = new Color4(-1.0F, -1.0F, -1.0F, -1.0F);
-
- public static void clearCurrentColor() {
- rejectExitCapture();
- // Marks the cache dirty, doesn't actually reset the color
- mod(ctx().color).set(DirtyColor);
- }
-
- public static void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.writeDepthColor(ExitStateCapture.COLOR_MASK);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordColorMask(red, green, blue, alpha);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
- if (dch != null && dch.isDepthColorLocked()) {
- mod(glCtx.colorMask);
- dch.deferColorMask(red, green, blue, alpha);
- return;
- }
- final boolean caching = isCachingEnabled();
- final boolean bypass = !caching;
- if (bypass || red != glCtx.colorMask.red || green != glCtx.colorMask.green || blue != glCtx.colorMask.blue || alpha != glCtx.colorMask.alpha) {
- mod(glCtx.colorMask);
- glCtx.colorMask.setAll(red, green, blue, alpha);
- RENDER_BACKEND.colorMask(red, green, blue, alpha);
- }
- }
-
- // Clear Color
- public static void glClearColor(float red, float green, float blue, float alpha) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordClearColor(red, green, blue, alpha);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || red != glCtx.clearColor.getRed() || green != glCtx.clearColor.getGreen() || blue != glCtx.clearColor.getBlue() || alpha != glCtx.clearColor.getAlpha()) {
- mod(glCtx.clearColor);
- glCtx.clearColor.setRed(red);
- glCtx.clearColor.setGreen(green);
- glCtx.clearColor.setBlue(blue);
- glCtx.clearColor.setAlpha(alpha);
- RENDER_BACKEND.clearColor(red, green, blue, alpha);
- }
- }
-
- public static void glClearDepth(double depth) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordClearDepth(depth);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- depth = Math.min(1.0, Math.max(0.0, depth));
- mod(glCtx.depthState);
- if (isCachingEnabled()) glCtx.depthState.setClearValue(depth);
- RENDER_BACKEND.clearDepth(depth);
- }
-
- // ALPHA
- public static void enableAlphaTest() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_ALPHA_TEST);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableAlphaTest(ctx());
- }
-
- private static void enableAlphaTest(GLContextState glCtx) {
- final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
- if (ah != null && ah.isAlphaTestLocked()) {
- glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1);
- glCtx.alphaTest.beforeModify();
- if (ah.deferAlphaTestToggle(true) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- return;
- }
- final boolean wasEnabled = glCtx.alphaTest.isEnabled();
- glCtx.alphaTest.enable();
- if (glCtx.alphaTest.isEnabled() != wasEnabled) {
- glCtx.fragmentGeneration++;
- if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- }
- }
-
- public static void disableAlphaTest() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_ALPHA_TEST);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableAlphaTest(ctx());
- }
-
- private static void disableAlphaTest(GLContextState glCtx) {
- final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
- if (ah != null && ah.isAlphaTestLocked()) {
- glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1);
- glCtx.alphaTest.beforeModify();
- if (ah.deferAlphaTestToggle(false) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- return;
- }
- final boolean wasEnabled = glCtx.alphaTest.isEnabled();
- glCtx.alphaTest.disable();
- if (glCtx.alphaTest.isEnabled() != wasEnabled) {
- glCtx.fragmentGeneration++;
- if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- }
- }
-
- public static void glAlphaFunc(int function, float reference) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.writeAlpha();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordAlphaFunc(function, reference);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
- if (ah != null && ah.isAlphaTestLocked()) {
- mod(glCtx.alphaState);
- if (ah.deferAlphaFunc(function, reference) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- return;
- }
- if (isCachingEnabled()
- && (function != glCtx.alphaState.getFunction() || Float.compare(reference, glCtx.alphaState.getReference()) != 0)) {
- mod(glCtx.alphaState);
- glCtx.alphaState.setFunction(function);
- glCtx.alphaState.setReference(reference);
- glCtx.fragmentGeneration++;
- if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- }
- }
-
- // Textures
- public static void glActiveTexture(int texture) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.ACTIVE_UNIT);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordActiveTexture(texture);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final int newTexture = texture - GL13.GL_TEXTURE0;
- if (!isValidTextureUnit(newTexture, texture, "glActiveTexture")) {
- return;
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.activeTextureUnit.getValue() != newTexture) {
- mod(glCtx.activeTextureUnit).setValue(newTexture);
- RENDER_BACKEND.activeTexture(texture);
- }
- }
-
- private static boolean isValidTextureUnit(int unit, int rawEnum, String function) {
- return isValidTextureUnit(unit, MAX_TEXTURE_UNITS, rawEnum, function);
- }
-
- private static boolean isValidTextureUnit(int unit, int limit, int rawEnum, String function) {
- if (unit >= 0 && unit < limit) {
- return true;
- }
- if (WARN_ONCE.add(function)) {
- LOGGER.warn("{}({}) is not a valid texture unit enum (expected GL_TEXTURE0..GL_TEXTURE{}); ignoring", function, rawEnum, limit - 1, new Throwable("call site"));
- }
- return false;
- }
-
- public static void glActiveTextureARB(int texture) {
- glActiveTexture(texture);
- }
-
- public static void glClientActiveTexture(int texture) {
- final int unit = texture - GL13.GL_TEXTURE0;
- if (!isValidTextureUnit(unit, MAX_TEXTURE_COORDS, texture, "glClientActiveTexture")) {
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.CLIENT_ACTIVE_UNIT);
- glCtx.clientActiveTextureUnit = unit;
- }
-
- public static int getClientActiveTextureUnit() {
- return ctx().clientActiveTextureUnit;
- }
-
- private static int texCoordConventional(GLContextState glCtx) {
- return VAOManager.CONV_TEX0 + glCtx.clientActiveTextureUnit;
- }
-
- private static int getBoundTexture() {
- return getBoundTexture(ctx().activeTextureUnit.getValue());
- }
-
- private static int getBoundTexture(int unit) {
- return ctx().textures.getTextureUnitBindings(unit).getBinding();
- }
-
- public static void glBindTexture(int target, int texture) {
- if (TextureInfoCache.isProxyTarget(target)) return;
- final GLContextState glCtx = ctx();
- recordExitTextureBind(glCtx, target, glCtx.activeTextureUnit.getValue());
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordBindTexture(target, texture);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Rebinding a deferred-delete texture rescues it (Mesa/compat-profile behavior)
- long rescued = DEFERRED_ABSENT;
- boolean rejected = false;
- if (texture != 0) {
- final boolean locked = acquireDrawLock();
- try {
- final long state = deferredDeleteTextures.isEmpty() ? DEFERRED_ABSENT : deferredDeleteTextures.get(texture);
- if (state == DEFERRED_ABSENT) {
- recordTarget(texture, target);
- } else if (non2DTextureTargets.get(texture) == target) {
- rescued = deferredDeleteTextures.remove(texture);
- } else {
- rejected = true;
- }
- } finally {
- if (locked) releaseDrawLock();
- }
- }
- if (rejected) return;
-
- if (!isCachingEnabled()) {
- RENDER_BACKEND.bindTexture(target, texture);
- if (rescued != DEFERRED_ABSENT) resetRescuedTexture(target, texture, rescued);
- return;
- }
-
- final int activeUnit = glCtx.activeTextureUnit.getValue();
- final TextureBindingStack textureUnit = glCtx.textures.getTextureUnitBindings(activeUnit);
- final int cachedBinding = textureUnit.getBinding();
-
- if (cachedBinding != texture || (texture == 0 && textureUnit.getTarget() != target)) {
- if (activeUnit != 0 || target != GL11.GL_TEXTURE_2D) beforeUncapturedStateChange();
- if (Tracy.ENABLED) texBindMisses++;
- RENDER_BACKEND.bindTexture(target, texture);
- mod(textureUnit).setBinding(texture, target);
- if (texture != 0) {
- if (activeUnit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = activeUnit;
- }
- if (!glCtx.lockBindCallback && target == GL11.GL_TEXTURE_2D && glCtx.activeTextureUnit.getValue() == 0) {
- glCtx.lockBindCallback = true;
- if (GLSMHooks.TEXTURE_BIND.hasListeners()) {
- GLSMHooks.textureBindEvent.textureId = texture;
- GLSMHooks.TEXTURE_BIND.post(GLSMHooks.textureBindEvent);
- }
- RenderSystem.bindTextureToUnit(0, texture);
- glCtx.lockBindCallback = false;
- }
- }
- if (rescued != DEFERRED_ABSENT) resetRescuedTexture(target, texture, rescued);
- }
-
- private static void bindTextureUnitByName(int unit, int texture) {
- if (isDeferredDelete(texture)) return;
- final CommandRecorder paused = DisplayListManager.pauseRecording();
- final int saved = getActiveTextureUnit();
- try {
- glActiveTexture(GL13.GL_TEXTURE0 + unit);
- if (texture == 0) {
- // Read before the 2D unbind, which overwrites the unit's cached target.
- final int target = ctx().textures.getTextureUnitBindings(unit).getTarget();
- glBindTexture(GL11.GL_TEXTURE_2D, 0);
- if (!is2D(target)) glBindTexture(target, 0);
- } else {
- glBindTexture(non2DTextureTargets.get(texture), texture);
- }
- } finally {
- glActiveTexture(GL13.GL_TEXTURE0 + saved);
- if (paused != null) DisplayListManager.resumeRecording(paused);
- }
- }
-
- public static void glBindTextures(int first, int count, IntBuffer textures) {
- if (first < 0 || !isValidTextureUnit(first + count - 1, GL13.GL_TEXTURE0 + first + count - 1, "glBindTextures")) return;
- if (textures != null) requireRemaining(textures, count);
- for (int i = 0; i < count; i++) bindTextureUnitByName(first + i, textures == null ? 0 : textures.get(textures.position() + i));
- }
-
- public static void glBindTextures(int first, IntBuffer textures) {
- if (textures != null) glBindTextures(first, textures.remaining(), textures);
- }
-
- public static void glBindTextures(int first, int[] textures) {
- if (textures != null) glBindTextures(first, textures.length, IntBuffer.wrap(textures));
- }
-
- public static void glBindTextureUnit(int unit, int texture) {
- if (isValidTextureUnit(unit, GL13.GL_TEXTURE0 + unit, "glBindTextureUnit")) bindTextureUnitByName(unit, texture);
- }
-
- public static void glBindMultiTextureEXT(int texunit, int target, int texture) {
- if (DisplayListManager.isRecording()) throw DisplayListManager.unsupportedInList("glBindMultiTextureEXT");
- if (!isValidTextureUnit(texunit - GL13.GL_TEXTURE0, texunit, "glBindMultiTextureEXT")) return;
- final int saved = getActiveTextureUnit();
- glActiveTexture(texunit);
- glBindTexture(target, texture);
- glActiveTexture(GL13.GL_TEXTURE0 + saved);
- }
-
- private static int changeFormatIfDeprecated(int internalformat) {
- internalformat = GLESFormatRemap.promoteAlphaFormat(internalformat);
- if (RenderSystem.isGLES()) {
- internalformat = GLESFormatRemap.remapInternalFormat(internalformat);
- }
- return internalformat;
- }
-
- public static final class GLESTexImageRemap {
- private final GLESFormatRemap.Result r;
- private GLESTexImageRemap(GLESFormatRemap.Result r) { this.r = r; }
- public int internalFormat() { return r.internalFormat(); }
- public int format() { return r.format(); }
- public int type() { return r.type(); }
- }
-
- public static GLESTexImageRemap remapTexImageForGLES(int internalformat, int format, int type) {
- return new GLESTexImageRemap(GLESFormatRemap.apply(internalformat, format, type, RenderSystem.isGLES()));
- }
-
- static {
- if (ByteOrder.nativeOrder() != ByteOrder.LITTLE_ENDIAN) {
- LOGGER.warn("GLSM GLES pixel-type remap assumes little-endian host; big-endian detected - BGRA uploads may be byte-swapped");
- }
- }
-
- private static int remapPixelTypeForGLES(int format, int type) {
- return RenderSystem.isGLES() ? GLESFormatRemap.remapPixelType(format, type) : type;
- }
-
- private static int remapTypeForRemappedInternalFormat(int internalformat, int type) {
- if (!RenderSystem.isGLES()) return type;
- if (!GLESFormatRemap.isGenericPixelType(type)) return type;
- return GLESFormatRemap.typeForInternalFormatES32(internalformat, type);
- }
-
- public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordComplexCommand(TexImage2DCmd.fromIntBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- restorePixelUnpackBuffer();
- if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordComplexCommand(TexImage2DCmd.fromFloatBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- restorePixelUnpackBuffer();
- if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordComplexCommand(TexImage2DCmd.fromDoubleBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- restorePixelUnpackBuffer();
- if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordComplexCommand(TexImage2DCmd.fromByteBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels != null ? pixels.asIntBuffer() : null);
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- restorePixelUnpackBuffer();
- if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexImage2D with buffer offset");
- }
- TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset);
- RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexCoord1f(float s) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord(s, 0.0f);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord(s, 0.0f, 0.0f, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord1d(double s) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord((float) s, 0.0f);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord((float) s, 0.0f, 0.0f, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord2f(float s, float t) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord(s, t);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord2d(double s, double t) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord((float) s, (float) t);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord((float) s, (float) t, 0.0f, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord3f(float s, float t, float r) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord(s, t); // Only track s,t for 2D textures
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord(s, t, r, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord3d(double s, double t, double r) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord((float) s, (float) t);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord4f(float s, float t, float r, float q) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord(s, t);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord(s, t, r, q);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glTexCoord4d(double s, double t, double r, double q) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord((float) s, (float) t);
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, (float) q);
- glCtx.dirtyTexCoordAttrib = true;
- }
-
- public static void glDeleteTextures(int id) {
- rejectExitCapture();
- deleteTexture(id);
- }
-
- public static void glDeleteTextures(IntBuffer ids) {
- rejectExitCapture();
- for (int i = 0; i < ids.remaining(); i++) {
- deleteTexture(ids.get(ids.position() + i));
- }
- }
-
- public static void glDeleteTextures(int[] ids) {
- rejectExitCapture();
- for (int id : ids) deleteTexture(id);
- }
-
- private static void deleteTexture(int id) {
- if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_DELETE);
- try {
- deferDeleteTexture(id);
- onDeleteTexture(id);
- } finally {
- if (Tracy.ENABLED) Tracy.endZone();
- }
- }
-
- /**
- * Defer deleting textures until it has been reclaimed.
- * Why you might ask? In compat profile if you bind a texture that doesn't exist, ie a deleted texture,
- * mesa will silently create it for you, in core this is an error. Why would you be binding a deleted texture?
- * Damned if I know, but vanilla and mods do it... they create one, delete it, and then bind it....
- * */
- private static void deferDeleteTexture(int id) {
- final GLContextState glCtx = ctx();
- if (id == 0) return;
-
- final int savedUnit = glCtx.activeTextureUnit.getValue();
- int activeUnit = savedUnit;
-
- // Unbind from all units that have this texture
- for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) {
- final TextureBindingStack unitBindings = glCtx.textures.getTextureUnitBindings(i);
- if (unitBindings.getBinding() == id) {
- if (i != activeUnit) {
- RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i);
- activeUnit = i;
- }
- final int unitTarget = unitBindings.getTarget();
- RENDER_BACKEND.bindTexture(unitTarget == 0 ? GL11.GL_TEXTURE_2D : unitTarget, 0);
- }
- }
-
- for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) {
- final ImageUnitBinding image = glCtx.imageUnits.get(i);
- if (image != null && image.getTexture() == id) {
- RENDER_BACKEND.bindImageTexture(i, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8);
- }
- }
-
- if (activeUnit != savedUnit) {
- RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + savedUnit);
- }
-
- final TextureBindingStack savedBindings = glCtx.textures.getTextureUnitBindings(savedUnit);
- if (!is2D(savedBindings.getTarget()) && previous2D(savedBindings) == id) restoreUnitAfter2DBind(savedBindings, id, id);
-
- final boolean locked = acquireDrawLock();
- try {
- detachFromFramebuffer(glCtx, GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer, id);
- if (glCtx.readFramebuffer != glCtx.drawFramebuffer) detachFromFramebuffer(glCtx, GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer, id);
- if (textureFramebufferRefs.get(id) > 0) deferredDeleteTextures.put(id, DEFERRED_ATTACHED);
- else scheduleRelease(id);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- private static void scheduleRelease(int id) {
- deferredDeleteTextures.put(id, frameIndex);
- nextReleaseFrame = Math.min(nextReleaseFrame, frameIndex + RELEASE_DELAY_FRAMES);
- }
-
- private static boolean isDeferredDelete(int texture) {
- if (texture == 0 || deferredDeleteTextures.isEmpty()) return false;
- final boolean locked = acquireDrawLock();
- try {
- return deferredDeleteTextures.containsKey(texture);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void onFrameEnd() {
- frameIndex++;
- if (!splashComplete || frameIndex < nextReleaseFrame) return;
- nextReleaseFrame = Long.MAX_VALUE;
- for (Int2LongMap.Entry entry : Int2LongMaps.fastIterable(deferredDeleteTextures)) {
- final long since = entry.getLongValue();
- if (since < 0) continue;
- if (frameIndex - since < RELEASE_DELAY_FRAMES) {
- nextReleaseFrame = Math.min(nextReleaseFrame, since + RELEASE_DELAY_FRAMES);
- continue;
- }
- final int id = entry.getIntKey();
- if (non2DTextureTargets.get(id) == GL11.GL_TEXTURE_2D) releaseStorage2D(id);
- entry.setValue(DEFERRED_RELEASED);
- }
- }
-
- public static int deferredTexturesAwaitingRelease() {
- int count = 0;
- final LongIterator it = deferredDeleteTextures.values().iterator();
- while (it.hasNext()) {
- if (it.nextLong() != DEFERRED_RELEASED) count++;
- }
- return count;
- }
-
- private static void releaseStorage2D(int id) {
- if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RELEASE_STORAGE);
- try {
- final TextureBindingStack unit = ctx().textures.getTextureUnitBindings(getActiveTextureUnit());
- final int previous2D = previous2D(unit);
- RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, id);
- if (bindTook(GL11.GL_TEXTURE_2D, id)) releaseBoundStorage2D();
- restoreUnitAfter2DBind(unit, id, previous2D);
- } finally {
- if (Tracy.ENABLED) Tracy.endZone();
- }
- }
-
- private static void restoreUnitAfter2DBind(TextureBindingStack unit, int deleted, int previous2D) {
- RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, previous2D == deleted ? 0 : previous2D);
- final int target = unit.getTarget();
- if (is2D(target)) return;
- RENDER_BACKEND.bindTexture(target, unit.getBinding() == deleted ? 0 : unit.getBinding());
- }
-
- private static boolean is2D(int target) {
- return target == 0 || target == GL11.GL_TEXTURE_2D;
- }
-
- private static int previous2D(TextureBindingStack unit) {
- return is2D(unit.getTarget()) ? unit.getBinding() : RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D);
- }
-
- private static void recordTarget(int texture, int target) {
- if (target != GL11.GL_TEXTURE_2D) non2DTextureTargets.put(texture, target);
- }
-
- private static void releaseBoundStorage2D() {
- if (RenderSystem.supportsTextureStorage() && RENDER_BACKEND.getTexParameteri(GL11.GL_TEXTURE_2D, GL42.GL_TEXTURE_IMMUTABLE_FORMAT) != 0) return;
- final int size = Math.max(RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH), RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT));
- final int levels = Math.max(1, 32 - Integer.numberOfLeadingZeros(size));
- suspendPixelUnpackBuffer();
- for (int level = 0; level < levels; level++) {
- RENDER_BACKEND.texImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- }
- restorePixelUnpackBuffer();
- }
-
- private static boolean bindTook(int target, int texture) {
- return RENDER_BACKEND.getInteger(TextureTargets.bindingQuery(target)) == texture;
- }
-
- private static void resetRescuedTexture(int target, int texture, long state) {
- if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RESCUE_RESET);
- try {
- if (!bindTook(target, texture)) return;
- if (target == GL11.GL_TEXTURE_2D && state >= 0) releaseBoundStorage2D();
- if (target == GL31.GL_TEXTURE_BUFFER || target == GL32.GL_TEXTURE_2D_MULTISAMPLE || target == GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY) return;
- final boolean rectangle = target == GL31.GL_TEXTURE_RECTANGLE;
- final int wrap = rectangle ? GL12.GL_CLAMP_TO_EDGE : GL11.GL_REPEAT;
- RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, rectangle ? GL11.GL_LINEAR : GL11.GL_NEAREST_MIPMAP_LINEAR);
- RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_S, wrap);
- RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_T, wrap);
- RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_WRAP_R, wrap);
- RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_BASE_LEVEL, 0);
- if (!rectangle) RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_MAX_LEVEL, 1000);
- RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MIN_LOD, -1000.0f);
- RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MAX_LOD, 1000.0f);
- RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_MODE, GL11.GL_NONE);
- RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL);
- RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_RED);
- RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_G, GL11.GL_GREEN);
- RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_B, GL11.GL_BLUE);
- RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_A, GL11.GL_ALPHA);
- if (!RenderSystem.isGLES()) {
- RENDER_BACKEND.texParameterf(target, GL14.GL_TEXTURE_LOD_BIAS, 0.0f);
- RENDER_BACKEND.texParameterfv(target, GL11.GL_TEXTURE_BORDER_COLOR, TRANSPARENT_BLACK);
- }
- if (RenderSystem.supportsStencilTexturing()) RENDER_BACKEND.texParameteri(target, GL43.GL_DEPTH_STENCIL_TEXTURE_MODE, GL11.GL_DEPTH_COMPONENT);
- if (RENDER_BACKEND.isAnisotropicSupported()) RENDER_BACKEND.texParameterf(target, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
- } finally {
- if (Tracy.ENABLED) Tracy.endZone();
- }
- }
-
- /** Flush deferred deletes so the driver can recycle names. */
- private static void flushDeferredTextureDeletes() {
- if (!splashComplete || deferredDeleteTextures.isEmpty()) return;
- if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_FLUSH_DELETES);
- try {
- final GLContextState primary = primaryContext();
- final GLContextState[] drawables = drawableContextStates;
- final var it = Int2LongMaps.fastIterator(deferredDeleteTextures);
- while (it.hasNext()) {
- final Int2LongMap.Entry entry = it.next();
- if (entry.getLongValue() == DEFERRED_ATTACHED) continue;
- final int id = entry.getIntKey();
- it.remove();
- RENDER_BACKEND.deleteTextures(id);
- non2DTextureTargets.remove(id);
- clearTextureBindings(primary, id);
- for (int i = 0; i < drawables.length; i++) {
- clearTextureBindings(drawables[i], id);
- }
- }
- } finally {
- if (Tracy.ENABLED) Tracy.endZone();
- }
- }
-
- private static final int DEPTH_SLOT = 16;
- private static final int STENCIL_SLOT = 17;
- private static final int FRAMEBUFFER_SLOTS = 18;
-
- private static int attachmentSlot(int attachment) {
- return switch (attachment) {
- case GL30.GL_DEPTH_ATTACHMENT -> DEPTH_SLOT;
- case GL30.GL_STENCIL_ATTACHMENT -> STENCIL_SLOT;
- default -> attachment >= GL30.GL_COLOR_ATTACHMENT0 && attachment <= GL30.GL_COLOR_ATTACHMENT15 ? attachment - GL30.GL_COLOR_ATTACHMENT0 : -1;
- };
- }
-
- private static int slotAttachment(int slot) {
- return switch (slot) {
- case DEPTH_SLOT -> GL30.GL_DEPTH_ATTACHMENT;
- case STENCIL_SLOT -> GL30.GL_STENCIL_ATTACHMENT;
- default -> GL30.GL_COLOR_ATTACHMENT0 + slot;
- };
- }
-
- private static boolean beginAttach(int target, int attachment, int texture) {
- final GLContextState glCtx = ctx();
- return beginAttach(glCtx, target == GL30.GL_READ_FRAMEBUFFER ? glCtx.readFramebuffer : glCtx.drawFramebuffer, attachment, texture);
- }
-
- private static boolean beginAttach(GLContextState glCtx, int framebuffer, int attachment, int texture) {
- if (isDeferredDelete(texture)) return false;
- TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture);
- trackFramebufferAttachment(glCtx, framebuffer, attachment, texture);
- return true;
- }
-
- private static void trackFramebufferAttachment(GLContextState glCtx, int framebuffer, int attachment, int texture) {
- if (framebuffer == 0) return;
- if (attachment == GL30.GL_DEPTH_STENCIL_ATTACHMENT) {
- trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_DEPTH_ATTACHMENT, texture);
- trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_STENCIL_ATTACHMENT, texture);
- return;
- }
- final int slot = attachmentSlot(attachment);
- if (slot < 0) return;
- int[] slots = glCtx.framebufferTextures.get(framebuffer);
- if (slots == null) {
- if (texture == 0) return;
- slots = new int[FRAMEBUFFER_SLOTS];
- glCtx.framebufferTextures.put(framebuffer, slots);
- }
- setFramebufferSlot(slots, slot, texture);
- }
-
- private static void setFramebufferSlot(int[] slots, int slot, int texture) {
- final int previous = slots[slot];
- if (previous == texture) return;
- slots[slot] = texture;
- final boolean locked = acquireDrawLock();
- try {
- if (texture != 0) textureFramebufferRefs.addTo(texture, 1);
- if (previous != 0 && textureFramebufferRefs.addTo(previous, -1) == 1) {
- textureFramebufferRefs.remove(previous);
- if (deferredDeleteTextures.get(previous) == DEFERRED_ATTACHED) scheduleRelease(previous);
- }
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- private static void detachFromFramebuffer(GLContextState glCtx, int target, int framebuffer, int texture) {
- final int[] slots = glCtx.framebufferTextures.get(framebuffer);
- if (slots == null) return;
- for (int slot = 0; slot < slots.length; slot++) {
- if (slots[slot] != texture) continue;
- RENDER_BACKEND.framebufferTexture2D(target, slotAttachment(slot), GL11.GL_TEXTURE_2D, 0, 0);
- setFramebufferSlot(slots, slot, 0);
- }
- }
-
- public static int glGenTextures() {
- requireContext("glGenTextures");
- flushDeferredTextureDeletes();
- return RENDER_BACKEND.genTextures();
- }
-
- public static void glGenTextures(IntBuffer textures) {
- requireContext("glGenTextures");
- flushDeferredTextureDeletes();
- RENDER_BACKEND.genTextures(textures);
- }
-
- public static void glGenTextures(int[] textures) {
- requireContext("glGenTextures");
- flushDeferredTextureDeletes();
- for (int i = 0; i < textures.length; i++) textures[i] = RENDER_BACKEND.genTextures();
- }
-
- public static int glCreateTextures(int target) {
- requireContext("glCreateTextures");
- final int id = RENDER_BACKEND.createTextures(target);
- final boolean locked = acquireDrawLock();
- try {
- recordTarget(id, target);
- } finally {
- if (locked) releaseDrawLock();
- }
- return id;
- }
-
- public static void glCreateTextures(int target, IntBuffer textures) {
- for (int i = textures.position(); i < textures.limit(); i++) textures.put(i, glCreateTextures(target));
- }
-
- public static void glCreateTextures(int target, int[] textures) {
- for (int i = 0; i < textures.length; i++) textures[i] = glCreateTextures(target);
- }
-
- public static void enableTexture() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_TEXTURE_2D);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableTexture(ctx());
- }
-
- private static void enableTexture(GLContextState glCtx) {
- glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).enable();
- }
-
- public static void disableTexture() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_TEXTURE_2D);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableTexture(ctx());
- }
-
- private static void disableTexture(GLContextState glCtx) {
- glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).disable();
- }
-
- private static final String PIXELTRANSFER_MSG = "glPixelTransfer is not available in GL 3.3 core profile.";
-
- public static void glPixelTransferf(int pname, float param) {
- guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG);
- }
-
- public static void glPixelTransferi(int pname, int param) {
- guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG);
- }
-
- private static final String RASTERPOS_MSG = "glRasterPos is not available in GL 3.3 core profile.";
-
- public static void glRasterPos2f(float x, float y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos2d(double x, double y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos2i(int x, int y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos3f(float x, float y, float z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos3d(double x, double y, double z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos3i(int x, int y, int z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos4f(float x, float y, float z, float w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos4d(double x, double y, double z, double w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
- public static void glRasterPos4i(int x, int y, int z, int w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); }
-
- public static void setFilter(boolean bilinear, boolean mipmap) {
- final int i, j;
- if (bilinear) {
- i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_LINEAR;
- j = GL11.GL_LINEAR;
- } else {
- i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_NEAREST;
- j = GL11.GL_NEAREST;
- }
- glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, i);
- glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, j);
- }
-
- public static void glBegin(int mode) {
- rejectExitCapture();
- ctx().unit23TexCoordSetDuringDraw = false;
- if (DisplayListManager.isRecording()) {
- ImmediateModeRecorder.begin(mode);
- return;
- }
- ImmediateModeRecorder.beginLive(mode);
- }
-
- public static void glEnd() {
- rejectExitCapture();
- final DirectTessellator result = ImmediateModeRecorder.end();
- if (result != null) {
- if (DisplayListManager.isRecording()) {
- if (DisplayListManager.isCompileAndExecute() && initConfig != null && initConfig.getDirectDrawer() != null) {
- final CommandRecorder recorder = DisplayListManager.pauseRecording();
- initConfig.getDirectDrawer().accept(result);
- DisplayListManager.resumeRecording(recorder);
- }
- DisplayListManager.addImmediateModeDraw(result);
- return;
- }
- if (initConfig != null && initConfig.getDirectDrawer() != null) {
- initConfig.getDirectDrawer().accept(result);
- }
- }
- }
-
- // Vertex methods for display list recording and live immediate mode
- public static void glVertex2f(float x, float y) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.vertex(x, y, 0.0f);
- }
- }
-
- public static void glVertex2i(int x, int y) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f);
- }
- }
-
- public static void glVertex2d(double x, double y) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f);
- }
- }
-
- public static void glVertex3f(float x, float y, float z) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.vertex(x, y, z);
- }
- }
-
- public static void glVertex3d(double x, double y, double z) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.vertex((float) x, (float) y, (float) z);
- }
- }
-
- public static void glVertex3i(int x, int y, int z) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.vertex((float) x, (float) y, (float) z);
- }
- }
-
- public static void preDraw(GLContextState glCtx, int drawMode) {
- prepareLineEmulation(glCtx, drawMode);
- glCtx.ffp.preDraw(glCtx);
- prepareClientArrays(glCtx);
- }
-
- public static void glDrawElements(int mode, ByteBuffer indices) {
- rejectExitCapture();
- drawCalls++;
- CommandRecorder savedRecorder = null;
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices), indices.remaining());
- if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
- if (recordMode == RecordMode.COMPILE) return;
- savedRecorder = DisplayListManager.pauseRecording();
- } else if (FeedbackManager.isFeedbackMode()) {
- FeedbackManager.processDrawElements(mode, indices);
- return;
- }
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadElementsAsTriangles(glCtx, indices.remaining(), GL11.GL_UNSIGNED_BYTE, indices);
- return;
- }
- if (widensLineDraw(mode, indices.remaining())) {
- drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices)));
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawElements(mode, indices);
- } finally {
- if (locked) releaseDrawLock();
- if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
- }
- }
-
- public static void glDrawElements(int mode, IntBuffer indices) {
- rejectExitCapture();
- drawCalls++;
- CommandRecorder savedRecorder = null;
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 2);
- if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
- if (recordMode == RecordMode.COMPILE) return;
- savedRecorder = DisplayListManager.pauseRecording();
- } else if (FeedbackManager.isFeedbackMode()) {
- FeedbackManager.processDrawElements(mode, indices);
- return;
- }
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadElementsAsTriangles(glCtx, indices);
- return;
- }
- if (widensLineDraw(mode, indices.remaining())) {
- drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices)));
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawElements(mode, indices);
- } finally {
- if (locked) releaseDrawLock();
- if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
- }
- }
-
- public static void glDrawElements(int mode, ShortBuffer indices) {
- rejectExitCapture();
- drawCalls++;
- CommandRecorder savedRecorder = null;
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 1);
- if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
- if (recordMode == RecordMode.COMPILE) return;
- savedRecorder = DisplayListManager.pauseRecording();
- } else if (FeedbackManager.isFeedbackMode()) {
- FeedbackManager.processDrawElements(mode, indices);
- return;
- }
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadElementsAsTriangles(glCtx, indices);
- return;
- }
- if (widensLineDraw(mode, indices.remaining())) {
- drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices)));
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawElements(mode, indices);
- } finally {
- if (locked) releaseDrawLock();
- if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
- }
- }
-
- public static void glDrawElements(int mode, int count, int type, ByteBuffer indices) {
- rejectExitCapture();
- drawCalls++;
- CommandRecorder savedRecorder = null;
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, count, type, MemoryUtilities.memAddress(indices), indices.remaining());
- if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture);
- if (recordMode == RecordMode.COMPILE) return;
- savedRecorder = DisplayListManager.pauseRecording();
- } else if (FeedbackManager.isFeedbackMode()) {
- FeedbackManager.processDrawElements(mode, count, type, indices);
- return;
- }
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadElementsAsTriangles(glCtx, count, type, indices);
- return;
- }
- if (widensLineDraw(mode, count)) {
- drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress(indices)));
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawElements(mode, count, type, indices);
- } finally {
- if (locked) releaseDrawLock();
- if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
- }
- }
-
- public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- drawCalls++;
- CommandRecorder savedRecorder = null;
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- // Core profile: a default VAO is generated at init and glBindVertexArray(0)
- // is redirected to it, so a VAO is always bound here — no fallback branches.
- final IndexedDrawCapture capture = IndexedDrawCapture.create(mode, indices_count, type, indices_buffer_offset, glCtx.vaos.boundEBO);
- if (capture != null) {
- DisplayListManager.recordIndexedDrawCapture(capture);
- }
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- savedRecorder = DisplayListManager.pauseRecording();
- } else if (FeedbackManager.isFeedbackMode()) {
- FeedbackManager.processDrawElements(mode, indices_count, type, indices_buffer_offset);
- return;
- }
- final boolean locked = acquireDrawLock();
- try {
- if (widensLineDraw(mode, indices_count)) {
- drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, indices_count, type, indices_buffer_offset));
- return;
- }
- final boolean ffpExt = FfpExtendedAttribs.maybeBindIndexed(glCtx, mode, indices_count, type, indices_buffer_offset);
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadElementsAsTriangles(glCtx, indices_count, type, indices_buffer_offset);
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawElements(mode, indices_count, type, indices_buffer_offset);
- } finally {
- if (ffpExt) FfpExtendedAttribs.unbind();
- }
- } finally {
- if (locked) releaseDrawLock();
- if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
- }
- }
-
- public static void glDrawBuffer(int mode) {
- rejectExitCapture();
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- DisplayListManager.recordDrawBuffer(mode);
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- }
- if (!isCachingEnabled() || ctx().drawBuffer.getValue() != mode) beforeUncapturedStateChange();
- if (isCachingEnabled()) mod(ctx().drawBuffer).setValue(mode);
- RENDER_BACKEND.drawBuffer(mode);
- }
-
- public static void glMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) {
- rejectExitCapture();
- drawCalls += drawcount;
- RENDER_BACKEND.multiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
- }
-
- public static void glMultiDrawElementsBaseVertex(int mode, long pCount, int type, long pIndices, int drawcount, long pBaseVertex) {
- rejectExitCapture();
- drawCalls += drawcount;
- RENDER_BACKEND.multiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex);
- }
-
- public static void glDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) {
- rejectExitCapture();
- drawCalls++;
- RENDER_BACKEND.drawElementsBaseVertex(mode, count, type, indices, basevertex);
- }
-
- public static void glDrawElementsInstanced(int mode, int count, int type, long indices, int primcount) {
- rejectExitCapture();
- drawCalls++;
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadElementsAsTrianglesInstanced(glCtx, count, type, indices, primcount);
- return;
- }
- warnIfInstancedWideLines(mode);
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawElementsInstanced(mode, count, type, indices, primcount);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) {
- rejectExitCapture();
- drawCalls++;
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadsAsTrianglesInstanced(glCtx, first, count, primcount);
- } else if (mode == GL11.GL_QUAD_STRIP) {
- preDraw(glCtx, GL11.GL_TRIANGLES);
- RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_STRIP, first, count & ~1, primcount);
- } else if (mode == GL11.GL_POLYGON) {
- preDraw(glCtx, GL11.GL_TRIANGLES);
- RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_FAN, first, count, primcount);
- } else {
- warnIfInstancedWideLines(mode);
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawArraysInstanced(mode, first, count, primcount);
- }
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (widensLineDraw(mode, count)) {
- drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, count, type, indices));
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawRangeElements(mode, start, end, count, type, indices);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int baseVertex) {
- rejectExitCapture();
- RENDER_BACKEND.drawRangeElementsBaseVertex(mode, start, end, count, type, indices, baseVertex);
- }
-
- public static void glMultiDrawArrays(int mode, IntBuffer firsts, IntBuffer counts) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) {
- for (int i = firsts.position(); i < firsts.limit(); i++) {
- final int count = counts.get(counts.position() + i - firsts.position());
- if (LineQuads.segmentCount(mode, count) == 0) continue;
- drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, firsts.get(i), count));
- }
- return;
- }
- preDraw(glCtx, mode);
- RENDER_BACKEND.multiDrawArrays(mode, firsts, counts);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glPrimitiveRestartIndex(int index) {
- rejectExitCapture();
- RENDER_BACKEND.primitiveRestartIndex(index);
- }
-
- public static void glPointParameterf(int pname, float param) {
- pointParameter(pname, param, 0.0f, 0.0f);
- }
-
- public static void glPointParameteri(int pname, int param) {
- pointParameter(pname, param, 0.0f, 0.0f);
- }
-
- public static void glPointParameter(int pname, FloatBuffer params) {
- final int pos = params.position();
- final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION;
- pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f);
- }
-
- public static void glPointParameter(int pname, IntBuffer params) {
- final int pos = params.position();
- final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION;
- pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f);
- }
-
- private static void pointParameter(int pname, float v0, float v1, float v2) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final PointStateStack point = glCtx.pointState;
- switch (pname) {
- case GL14.GL_POINT_SIZE_MIN -> {
- if (!(v0 < 0.0f) && point.getMinSize() != v0) mod(point).setMinSize(v0);
- }
- case GL14.GL_POINT_SIZE_MAX -> {
- if (!(v0 < 0.0f) && point.getMaxSize() != v0) mod(point).setMaxSize(v0);
- }
- case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> {
- if (!(v0 < 0.0f) && point.getFadeThreshold() != v0) {
- mod(point).setFadeThreshold(v0);
- RENDER_BACKEND.pointParameterf(pname, v0);
- }
- }
- case GL14.GL_POINT_DISTANCE_ATTENUATION -> {
- if (point.getAttenuationConstant() == v0 && point.getAttenuationLinear() == v1 && point.getAttenuationQuadratic() == v2) return;
- mod(point);
- point.setAttenuationConstant(v0);
- point.setAttenuationLinear(v1);
- point.setAttenuationQuadratic(v2);
- }
- case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> {
- final int origin = (int) v0;
- if ((origin == GL20.GL_LOWER_LEFT || origin == GL20.GL_UPPER_LEFT) && point.getSpriteCoordOrigin() != origin) {
- mod(point).setSpriteCoordOrigin(origin);
- RENDER_BACKEND.pointParameteri(pname, origin);
- }
- }
- default -> RENDER_BACKEND.pointParameterf(pname, v0);
- }
- }
-
- private static void applyPointState(GLContextState glCtx) {
- final PointStateStack point = glCtx.pointState;
- RENDER_BACKEND.pointSize(point.getSize());
- RENDER_BACKEND.pointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, point.getFadeThreshold());
- RENDER_BACKEND.pointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, point.getSpriteCoordOrigin());
- }
-
- private static boolean isLegacyHint(int target) {
- return switch (target) {
- case GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_POINT_SMOOTH_HINT, GL11.GL_FOG_HINT, GL14.GL_GENERATE_MIPMAP_HINT -> true;
- default -> false;
- };
- }
-
- private static int hintShift(int target) {
- return switch (target) {
- case GL11.GL_PERSPECTIVE_CORRECTION_HINT -> 0;
- case GL11.GL_POINT_SMOOTH_HINT -> 2;
- case GL11.GL_LINE_SMOOTH_HINT -> 4;
- case GL11.GL_POLYGON_SMOOTH_HINT -> 6;
- case GL11.GL_FOG_HINT -> 8;
- case GL13.GL_TEXTURE_COMPRESSION_HINT -> 10;
- case GL14.GL_GENERATE_MIPMAP_HINT -> 12;
- case GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT -> 14;
- default -> -1;
- };
- }
-
- private static int hintMode(int packed, int shift) {
- return switch (packed >>> shift & 3) {
- case 1 -> GL11.GL_FASTEST;
- case 2 -> GL11.GL_NICEST;
- default -> GL11.GL_DONT_CARE;
- };
- }
-
- private static final int[] DRIVER_HINTS = {
- GL11.GL_LINE_SMOOTH_HINT, GL11.GL_POLYGON_SMOOTH_HINT, GL13.GL_TEXTURE_COMPRESSION_HINT, GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT
- };
-
- private static void applyHintState(GLContextState glCtx) {
- final int packed = glCtx.hintState.getValue();
- for (final int target : DRIVER_HINTS) {
- RENDER_BACKEND.hint(target, hintMode(packed, hintShift(target)));
- }
- }
-
- private static void prepareClientArrays(GLContextState glCtx) {
- final VAOManager vaos = glCtx.vaos;
- if (vaos.hasAnyClientSideEnabledAttrib()) {
- vaos.uploadClientArraysToVBO();
- }
- }
-
- public static void glDrawArrays(int mode, int first, int count) {
- rejectExitCapture();
- drawCalls++;
- CommandRecorder savedRecorder = null;
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- final DirectTessellator result = ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count);
- if (result != null) {
- DisplayListManager.addImmediateModeDraw(result);
- }
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- DisplayListManager.flushAll();
- savedRecorder = DisplayListManager.pauseRecording();
- } else if (FeedbackManager.isFeedbackMode()) {
- FeedbackManager.processDrawArrays(mode, first, count);
- return;
- }
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- if (widensLineDraw(mode, count)) {
- drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count));
- return;
- }
- final boolean ffpExt = FfpExtendedAttribs.maybeBind(glCtx, mode, first, count);
- try {
- if (mode == GL11.GL_QUADS) {
- QuadConverter.drawQuadsAsTriangles(glCtx, first, count);
- } else if (mode == GL11.GL_QUAD_STRIP) {
- preDraw(glCtx, GL11.GL_TRIANGLES);
- RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_STRIP, first, count & ~1);
- } else if (mode == GL11.GL_POLYGON) {
- preDraw(glCtx, GL11.GL_TRIANGLES);
- RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_FAN, first, count);
- } else {
- preDraw(glCtx, mode);
- RENDER_BACKEND.drawArrays(mode, first, count);
- }
- } finally {
- if (ffpExt) FfpExtendedAttribs.unbind();
- }
- } finally {
- if (locked) releaseDrawLock();
- if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
- }
- }
-
- private static boolean isLegalClientArray(int conv, int size, int type, int stride) {
- return isLegalPointer(VAOManager.isLegalConventional(conv, size, type), "client-array", "client array", conv, size, type, stride);
- }
-
- private static boolean isLegalVertexAttrib(int index, int size, int type, int stride, boolean integer) {
- return isLegalPointer(VAOManager.isLegalGeneric(index, size, type, integer), "vertex-attrib", "vertex attribute", index, size, type, stride);
- }
-
- // The WARN_ONCE check comes first so a caller repeating the mistake every frame does not capture a stack each time.
- private static boolean isLegalPointer(boolean legal, String key, String what, int slot, int size, int type, int stride) {
- if (stride < 0 && WARN_ONCE.add(key + "-stride")) {
- LOGGER.warn("Negative {} stride {}", what, stride, new Throwable("call site"));
- }
- if (legal) return true;
- if (WARN_ONCE.add(key + "-" + slot)) {
- LOGGER.warn("Ignoring {} {} with illegal size {} / type 0x{}", what, slot, size, Integer.toHexString(type), new Throwable("call site"));
- }
- return false;
- }
-
- private static boolean isValidVertexAttribIndex(int index, String function) {
- if (index >= 0 && index < VAOManager.MAX_ATTRIBS) return true;
- if (WARN_ONCE.add(function)) {
- LOGGER.warn("{}({}) is outside the {} supported vertex attributes; ignoring", function, index, VAOManager.MAX_ATTRIBS, new Throwable("call site"));
- }
- return false;
- }
-
- private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, long offset) {
- rejectExitCapture();
- if (!isLegalClientArray(conv, size, type, stride)) return;
- final GLContextState glCtx = ctx();
- if (glCtx.vaos.setConventional(conv, size, type, normalized, stride, offset, glCtx.boundVBO)) {
- RENDER_BACKEND.vertexAttribPointer(VAOManager.conventionalLocation(conv), size, type, normalized, stride, offset);
- }
- }
-
- private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, ByteBuffer pointer) {
- rejectExitCapture();
- if (!isLegalClientArray(conv, size, type, stride)) return;
- ctx().vaos.setConventional(conv, size, type, normalized, stride, pointer);
- }
-
- private static final int FIELD_SIZE = 0, FIELD_TYPE = 1 << 8, FIELD_STRIDE = 2 << 8, FIELD_BINDING = 3 << 8, FIELD_POINTER = 4 << 8;
-
- private static int clientArrayField(GLContextState glCtx, int pname) {
- return switch (pname) {
- case GL11.GL_VERTEX_ARRAY_SIZE -> VAOManager.CONV_POSITION | FIELD_SIZE;
- case GL11.GL_VERTEX_ARRAY_TYPE -> VAOManager.CONV_POSITION | FIELD_TYPE;
- case GL11.GL_VERTEX_ARRAY_STRIDE -> VAOManager.CONV_POSITION | FIELD_STRIDE;
- case GL15.GL_VERTEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_POSITION | FIELD_BINDING;
- case GL11.GL_VERTEX_ARRAY_POINTER -> VAOManager.CONV_POSITION | FIELD_POINTER;
- case GL11.GL_NORMAL_ARRAY_TYPE -> VAOManager.CONV_NORMAL | FIELD_TYPE;
- case GL11.GL_NORMAL_ARRAY_STRIDE -> VAOManager.CONV_NORMAL | FIELD_STRIDE;
- case GL15.GL_NORMAL_ARRAY_BUFFER_BINDING -> VAOManager.CONV_NORMAL | FIELD_BINDING;
- case GL11.GL_NORMAL_ARRAY_POINTER -> VAOManager.CONV_NORMAL | FIELD_POINTER;
- case GL11.GL_COLOR_ARRAY_SIZE -> VAOManager.CONV_COLOR | FIELD_SIZE;
- case GL11.GL_COLOR_ARRAY_TYPE -> VAOManager.CONV_COLOR | FIELD_TYPE;
- case GL11.GL_COLOR_ARRAY_STRIDE -> VAOManager.CONV_COLOR | FIELD_STRIDE;
- case GL15.GL_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_COLOR | FIELD_BINDING;
- case GL11.GL_COLOR_ARRAY_POINTER -> VAOManager.CONV_COLOR | FIELD_POINTER;
- case GL11.GL_INDEX_ARRAY_TYPE -> VAOManager.CONV_INDEX | FIELD_TYPE;
- case GL11.GL_INDEX_ARRAY_STRIDE -> VAOManager.CONV_INDEX | FIELD_STRIDE;
- case GL15.GL_INDEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_INDEX | FIELD_BINDING;
- case GL11.GL_INDEX_ARRAY_POINTER -> VAOManager.CONV_INDEX | FIELD_POINTER;
- case GL11.GL_EDGE_FLAG_ARRAY_STRIDE -> VAOManager.CONV_EDGE_FLAG | FIELD_STRIDE;
- case GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING -> VAOManager.CONV_EDGE_FLAG | FIELD_BINDING;
- case GL11.GL_EDGE_FLAG_ARRAY_POINTER -> VAOManager.CONV_EDGE_FLAG | FIELD_POINTER;
- case GL14.GL_SECONDARY_COLOR_ARRAY_SIZE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_SIZE;
- case GL14.GL_SECONDARY_COLOR_ARRAY_TYPE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_TYPE;
- case GL14.GL_SECONDARY_COLOR_ARRAY_STRIDE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_STRIDE;
- case GL15.GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_SECONDARY_COLOR | FIELD_BINDING;
- case GL14.GL_SECONDARY_COLOR_ARRAY_POINTER -> VAOManager.CONV_SECONDARY_COLOR | FIELD_POINTER;
- case GL14.GL_FOG_COORDINATE_ARRAY_TYPE -> VAOManager.CONV_FOG_COORD | FIELD_TYPE;
- case GL14.GL_FOG_COORDINATE_ARRAY_STRIDE -> VAOManager.CONV_FOG_COORD | FIELD_STRIDE;
- case GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -> VAOManager.CONV_FOG_COORD | FIELD_BINDING;
- case GL14.GL_FOG_COORDINATE_ARRAY_POINTER -> VAOManager.CONV_FOG_COORD | FIELD_POINTER;
- case GL11.GL_TEXTURE_COORD_ARRAY_SIZE -> texCoordConventional(glCtx) | FIELD_SIZE;
- case GL11.GL_TEXTURE_COORD_ARRAY_TYPE -> texCoordConventional(glCtx) | FIELD_TYPE;
- case GL11.GL_TEXTURE_COORD_ARRAY_STRIDE -> texCoordConventional(glCtx) | FIELD_STRIDE;
- case GL15.GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING -> texCoordConventional(glCtx) | FIELD_BINDING;
- case GL11.GL_TEXTURE_COORD_ARRAY_POINTER -> texCoordConventional(glCtx) | FIELD_POINTER;
- default -> -1;
- };
- }
-
- private static int clientArrayParam(GLContextState glCtx, int key) {
- final int conv = key & 0xFF;
- final VAOManager.Attrib a = glCtx.vaos.conventional(conv);
- final boolean specified = a != null && a.size != 0;
- return switch (key & ~0xFF) {
- case FIELD_SIZE -> specified ? a.size : conv == VAOManager.CONV_SECONDARY_COLOR ? 3 : 4;
- case FIELD_TYPE -> specified ? a.type : GL11.GL_FLOAT;
- case FIELD_STRIDE -> specified ? a.stride : 0;
- default -> specified ? a.vboId : 0;
- };
- }
-
- public static ByteBuffer glGetPointer(int pname, long result_size) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final int key = clientArrayField(glCtx, pname);
- if ((key & ~0xFF) != FIELD_POINTER) return null;
- final VAOManager.Attrib a = glCtx.vaos.conventional(key & 0xFF);
- if (a == null) return null;
- final long address = a.clientPointer != null ? MemoryUtilities.memAddress(a.clientPointer) : a.offset;
- return address == 0 ? null : MemoryUtilities.memByteBuffer(address, (int) result_size);
- }
-
- public static void glEdgeFlagPointer(int stride, ByteBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer);
- }
-
- public static void glEdgeFlagPointer(int stride, long pointer_buffer_offset) {
- ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer_buffer_offset);
- }
-
- public static void glFogCoordPointer(int stride, FloatBuffer data) {
- ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(data));
- }
-
- public static void glFogCoordPointer(int stride, DoubleBuffer data) {
- ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(data));
- }
-
- public static void glFogCoordPointer(int type, int stride, long data_buffer_offset) {
- ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, type, false, stride, data_buffer_offset);
- }
-
- public static void glSecondaryColorPointer(int size, int stride, FloatBuffer data) {
- ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_FLOAT, true, stride, MemoryUtilities.memByteBuffer(data));
- }
-
- public static void glSecondaryColorPointer(int size, int stride, DoubleBuffer data) {
- ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_DOUBLE, true, stride, MemoryUtilities.memByteBuffer(data));
- }
-
- public static void glSecondaryColorPointer(int size, boolean unsigned, int stride, ByteBuffer data) {
- final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE;
- ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data);
- }
-
- public static void glSecondaryColorPointer(int size, int type, int stride, long data_buffer_offset) {
- ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data_buffer_offset);
- }
-
- private static void pointAttrib(GLContextState glCtx, int index) {
- final VAOManager vaos = glCtx.vaos;
- final VAOManager.Attrib a = vaos.attrib(index);
- if (a == null) return;
- RENDER_BACKEND.vertexAttribDivisor(index, a.divisor);
- if (a.size == 0 || a.vboId == 0 || !vaos.isBufferLive(a)) return;
- if (glCtx.boundVBO != a.vboId) glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
- if (a.integer) {
- RENDER_BACKEND.vertexAttribIPointer(index, a.size, a.type, a.stride, a.offset);
- } else {
- RENDER_BACKEND.vertexAttribPointer(index, a.size, a.type, a.normalized, a.stride, a.offset);
- }
- }
-
- private static void repointAttrib(GLContextState glCtx, int index) {
- final int savedVBO = glCtx.boundVBO;
- pointAttrib(glCtx, index);
- if (glCtx.boundVBO != savedVBO) glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
- }
-
- public static void glVertexPointer(int size, int stride, IntBuffer pointer) {
- glVertexPointer(size, GL11.GL_INT, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexPointer(int size, int stride, ShortBuffer pointer) {
- glVertexPointer(size, GL11.GL_SHORT, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexPointer(int size, int stride, FloatBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexPointer(int size, int stride, DoubleBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexPointer(int size, int type, int stride, ByteBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer);
- }
-
- public static void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset) {
- ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer_buffer_offset);
- }
-
- public static void glColorPointer(int size, int stride, FloatBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_FLOAT, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glColorPointer(int size, int stride, DoubleBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_DOUBLE, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glColorPointer(int size, int type, int stride, ByteBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer);
- }
-
- public static void glColorPointer(int size, boolean unsigned, int stride, ByteBuffer pointer) {
- final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE;
- ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer);
- }
-
- public static void glColorPointer(int size, int type, int stride, long pointer_buffer_offset) {
- ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer_buffer_offset);
- }
-
- public static void glNormalPointer(int stride, FloatBuffer pointer) {
- glNormalPointer(GL11.GL_FLOAT, stride, pointer);
- }
-
- public static void glNormalPointer(int stride, ByteBuffer pointer) {
- glNormalPointer(GL11.GL_BYTE, stride, pointer);
- }
-
- public static void glNormalPointer(int stride, IntBuffer pointer) {
- glNormalPointer(GL11.GL_INT, stride, pointer);
- }
-
- public static void glNormalPointer(int stride, DoubleBuffer pointer) {
- glNormalPointer(GL11.GL_DOUBLE, stride, pointer);
- }
-
- public static void glNormalPointer(int type, int stride, ByteBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer);
- }
-
- public static void glNormalPointer(int type, int stride, FloatBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glNormalPointer(int type, int stride, ShortBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_SHORT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glNormalPointer(int type, int stride, IntBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_INT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glNormalPointer(int type, int stride, DoubleBuffer pointer) {
- ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_DOUBLE, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glNormalPointer(int type, int stride, long pointer_buffer_offset) {
- ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer_buffer_offset);
- }
-
- public static void glTexCoordPointer(int size, int type, int stride, ByteBuffer pointer) {
- ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer);
- }
-
- public static void glTexCoordPointer(int size, int stride, FloatBuffer pointer) {
- glTexCoordPointer(size, GL11.GL_FLOAT, stride, pointer);
- }
-
- public static void glTexCoordPointer(int size, int stride, IntBuffer pointer) {
- glTexCoordPointer(size, GL11.GL_INT, stride, pointer);
- }
-
- public static void glTexCoordPointer(int size, int stride, ShortBuffer pointer) {
- glTexCoordPointer(size, GL11.GL_SHORT, stride, pointer);
- }
-
- public static void glTexCoordPointer(int size, int stride, DoubleBuffer pointer) {
- glTexCoordPointer(size, GL11.GL_DOUBLE, stride, pointer);
- }
-
- public static void glTexCoordPointer(int size, int type, int stride, FloatBuffer pointer) {
- ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glTexCoordPointer(int size, int type, int stride, ShortBuffer pointer) {
- ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_SHORT, false, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glTexCoordPointer(int size, int type, int stride, IntBuffer pointer) {
- ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_INT, false, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glTexCoordPointer(int size, int type, int stride, DoubleBuffer pointer) {
- ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glTexCoordPointer(int size, int type, int stride, long pointer_buffer_offset) {
- ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer_buffer_offset);
- }
-
- public static void glEnableClientState(int cap) {
- rejectExitCapture();
- setClientArrayCap(ctx(), cap, true);
- }
-
- public static void glDisableClientState(int cap) {
- rejectExitCapture();
- setClientArrayCap(ctx(), cap, false);
- }
-
- private static boolean setClientArrayCap(GLContextState glCtx, int cap, boolean enabled) {
- final int conv = clientStateToConventional(glCtx, cap);
- if (conv < 0) return false;
- setClientArrayEnabled(glCtx, conv, enabled);
- return true;
- }
-
- private static void setClientArrayEnabled(GLContextState glCtx, int conv, boolean enabled) {
- final VAOManager vaos = glCtx.vaos;
- final boolean repoint = vaos.setConventionalEnabled(conv, enabled);
- final int index = VAOManager.conventionalLocation(conv);
- if (index >= 0) {
- if (repoint) repointAttrib(glCtx, index);
- syncAttribEnable(glCtx, index);
- }
- final int flag = conventionalVertexFlag(conv);
- if (flag == 0) return;
- if (enabled) {
- vaos.enableClientVertexFlag(flag);
- } else {
- vaos.disableClientVertexFlag(flag);
- }
- }
-
- private static void syncAttribEnable(GLContextState glCtx, int index) {
- if (glCtx.vaos.isAttribEnabled(index)) {
- RENDER_BACKEND.enableVertexAttribArray(index);
- } else {
- RENDER_BACKEND.disableVertexAttribArray(index);
- }
- }
-
- public static void glVertexAttrib2f(int index, float v0, float v1) {
- glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f);
- }
-
- public static void glVertexAttrib2s(int index, short v0, short v1) {
- glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f);
- }
-
- public static void glVertexAttrib3f(int index, float v0, float v1, float v2) {
- glVertexAttrib4f(index, v0, v1, v2, 1.0f);
- }
-
- public static void glVertexAttrib4f(int index, float v0, float v1, float v2, float v3) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordVertexAttrib(index, v0, v1, v2, v3);
- if (mode == RecordMode.COMPILE) return;
- }
- beforeUncapturedStateChange();
- RENDER_BACKEND.vertexAttrib4f(index, v0, v1, v2, v3);
- }
-
- public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) {
- rejectExitCapture();
- if (!isLegalVertexAttrib(index, size, type, stride, false)) return;
- final GLContextState glCtx = ctx();
- if (glCtx.vaos.setAttribute(index, size, type, normalized, stride, offset, glCtx.boundVBO)) {
- RENDER_BACKEND.vertexAttribPointer(index, size, type, normalized, stride, offset);
- }
- }
-
- public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer pointer) {
- glVertexAttribPointer(index, size, GL11.GL_FLOAT, normalized, stride, pointer);
- }
-
- public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, FloatBuffer pointer) {
- glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, DoubleBuffer pointer) {
- glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, IntBuffer pointer) {
- glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ShortBuffer pointer) {
- glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ByteBuffer pointer) {
- rejectExitCapture();
- if (!isLegalVertexAttrib(index, size, type, stride, false)) return;
- ctx().vaos.setAttribute(index, size, type, normalized, stride, pointer);
- }
-
- public static void glVertexAttribIPointer(int index, int size, int type, int stride, long offset) {
- rejectExitCapture();
- if (!isLegalVertexAttrib(index, size, type, stride, true)) return;
- final GLContextState glCtx = ctx();
- if (glCtx.vaos.setIntegerAttribute(index, size, type, stride, offset, glCtx.boundVBO)) {
- RENDER_BACKEND.vertexAttribIPointer(index, size, type, stride, offset);
- }
- }
-
- public static void glVertexAttribIPointer(int index, int size, int type, int stride, ByteBuffer pointer) {
- rejectExitCapture();
- if (!isLegalVertexAttrib(index, size, type, stride, true)) return;
- ctx().vaos.setIntegerAttribute(index, size, type, stride, pointer);
- }
-
- public static void glVertexAttribIPointer(int index, int size, int type, int stride, IntBuffer pointer) {
- glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexAttribIPointer(int index, int size, int type, int stride, ShortBuffer pointer) {
- glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glVertexAttribDivisor(int index, int divisor) {
- rejectExitCapture();
- if (ctx().vaos.setDivisor(index, divisor)) RENDER_BACKEND.vertexAttribDivisor(index, divisor);
- }
-
- public static void glVertexAttribDivisorARB(int index, int divisor) { glVertexAttribDivisor(index, divisor); }
- public static void glBindVertexBuffer(int bindingindex, int buffer, long offset, int stride) { rejectExitCapture(); RENDER_BACKEND.bindVertexBuffer(bindingindex, buffer, offset, stride); }
- public static void glVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribFormat(attribindex, size, type, normalized, relativeoffset); }
- public static void glVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribIFormat(attribindex, size, type, relativeoffset); }
- public static void glVertexAttribBinding(int attribindex, int bindingindex) { rejectExitCapture(); RENDER_BACKEND.vertexAttribBinding(attribindex, bindingindex); }
-
- public static void glEnableVertexAttribArray(int index) {
- rejectExitCapture();
- if (!isValidVertexAttribIndex(index, "glEnableVertexAttribArray")) return;
- final GLContextState glCtx = ctx();
- if (glCtx.vaos.enableAttribute(index)) repointAttrib(glCtx, index);
- RENDER_BACKEND.enableVertexAttribArray(index);
- }
-
- public static void glDisableVertexAttribArray(int index) {
- rejectExitCapture();
- if (!isValidVertexAttribIndex(index, "glDisableVertexAttribArray")) return;
- final GLContextState glCtx = ctx();
- if (glCtx.vaos.disableAttribute(index)) repointAttrib(glCtx, index);
- if (!glCtx.vaos.isAttribEnabled(index)) RENDER_BACKEND.disableVertexAttribArray(index);
- }
-
- private static int clientStateToConventional(GLContextState glCtx, int cap) {
- return switch (cap) {
- case GL11.GL_VERTEX_ARRAY -> VAOManager.CONV_POSITION;
- case GL11.GL_NORMAL_ARRAY -> VAOManager.CONV_NORMAL;
- case GL11.GL_COLOR_ARRAY -> VAOManager.CONV_COLOR;
- case GL11.GL_INDEX_ARRAY -> VAOManager.CONV_INDEX;
- case GL11.GL_EDGE_FLAG_ARRAY -> VAOManager.CONV_EDGE_FLAG;
- case GL14.GL_SECONDARY_COLOR_ARRAY -> VAOManager.CONV_SECONDARY_COLOR;
- case GL14.GL_FOG_COORDINATE_ARRAY -> VAOManager.CONV_FOG_COORD;
- case GL11.GL_TEXTURE_COORD_ARRAY -> texCoordConventional(glCtx);
- default -> -1;
- };
- }
-
- private static int conventionalVertexFlag(int conv) {
- return switch (conv) {
- case VAOManager.CONV_COLOR -> VertexFlags.COLOR_BIT;
- case VAOManager.CONV_NORMAL -> VertexFlags.NORMAL_BIT;
- case VAOManager.CONV_TEX0 -> VertexFlags.TEXTURE_BIT;
- case VAOManager.CONV_TEX0 + 1 -> VertexFlags.BRIGHTNESS_BIT;
- default -> 0;
- };
- }
-
- static final int CLIENT_ATTRIB_STACK_DEPTH = 16;
- public static void glPushClientAttrib(int mask) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final int sp = glCtx.clientAttribStackPointer;
- if (sp < CLIENT_ATTRIB_STACK_DEPTH) {
- glCtx.clientAttribSavedMask[sp] = mask;
- if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) {
- glCtx.clientAttribSavedPixelPack[sp] = glCtx.pixelPackState;
- glCtx.clientAttribSavedPixelUnpack[sp] = glCtx.pixelUnpackState;
- glCtx.clientAttribSavedPackBuffer[sp] = glCtx.boundPixelPackBuffer;
- glCtx.clientAttribSavedUnpackBuffer[sp] = glCtx.boundPixelUnpackBuffer;
- }
- if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) {
- VAOManager.ClientArrays saved = glCtx.clientAttribSavedArrays[sp];
- if (saved == null) glCtx.clientAttribSavedArrays[sp] = saved = new VAOManager.ClientArrays();
- saved.boundVAO = glCtx.boundVAO;
- saved.boundVBO = glCtx.boundVBO;
- saved.boundEBO = glCtx.vaos.boundEBO;
- saved.clientActiveTextureUnit = glCtx.clientActiveTextureUnit;
- glCtx.vaos.saveClientArrays(saved);
- }
- glCtx.clientAttribStackPointer = sp + 1;
- }
- }
-
- public static void glPopClientAttrib() {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (glCtx.clientAttribStackPointer > 0) {
- final int sp = --glCtx.clientAttribStackPointer;
- final int mask = glCtx.clientAttribSavedMask[sp];
- if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) {
- final PixelStoreState pack = glCtx.clientAttribSavedPixelPack[sp];
- final PixelStoreState unpack = glCtx.clientAttribSavedPixelUnpack[sp];
- glCtx.clientAttribSavedPixelPack[sp] = null;
- glCtx.clientAttribSavedPixelUnpack[sp] = null;
- PixelStoreState.applyDiff(glCtx.pixelPackState, pack, true);
- glCtx.pixelPackState = pack;
- PixelStoreState.applyDiff(glCtx.pixelUnpackState, unpack, false);
- glCtx.pixelUnpackState = unpack;
- final int packBuffer = glCtx.clientAttribSavedPackBuffer[sp];
- if (glCtx.boundPixelPackBuffer != packBuffer) glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer);
- final int unpackBuffer = glCtx.clientAttribSavedUnpackBuffer[sp];
- if (glCtx.boundPixelUnpackBuffer != unpackBuffer) glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
- }
- if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) {
- restoreClientArrays(glCtx, glCtx.clientAttribSavedArrays[sp]);
- }
- }
- }
-
- private static void restoreClientArrays(GLContextState glCtx, VAOManager.ClientArrays saved) {
- final VAOManager vaos = glCtx.vaos;
- if (!vaos.vaoMap.containsKey(saved.boundVAO)) return;
- bindVertexArrayInternal(glCtx, saved.boundVAO);
- glCtx.clientActiveTextureUnit = saved.clientActiveTextureUnit;
- if (vaos.isBufferLive(saved.boundVBO, saved)) {
- final int changed = vaos.restoreClientArrays(saved);
- for (int pointers = changed & 0xFFFF; pointers != 0; pointers &= pointers - 1) {
- pointAttrib(glCtx, Integer.numberOfTrailingZeros(pointers));
- }
- for (int enables = changed >>> 16; enables != 0; enables &= enables - 1) {
- syncAttribEnable(glCtx, Integer.numberOfTrailingZeros(enables));
- }
- if (glCtx.boundVBO != saved.boundVBO) glBindBuffer(GL15.GL_ARRAY_BUFFER, saved.boundVBO);
- }
- if (vaos.boundEBO != saved.boundEBO && vaos.isBufferLive(saved.boundEBO, saved)) glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, saved.boundEBO);
- }
-
- public static void glInterleavedArrays(int format, int stride, long pointer) {
- interleavedArrays(format, stride, pointer, null);
- }
-
- private static void interleavedPointer(int conv, int size, int type, boolean normalized, int stride, long pointer, ByteBuffer base, int offset) {
- if (base == null) {
- ffpClientArrayPointer(conv, size, type, normalized, stride, pointer + offset);
- } else {
- ffpClientArrayPointer(conv, size, type, normalized, stride, MemoryUtilities.memSlice(base, offset, base.remaining() - offset));
- }
- }
-
- private static void interleavedArrays(int format, int stride, long pointer, ByteBuffer base) {
- rejectExitCapture();
- // Mesa _mesa_get_interleaved_layout decomposition
- final int f = 4; // sizeof(float)
- final int c = f * ((4 + (f - 1)) / f); // 4 ubytes padded to float alignment = 4
-
- boolean tflag = false, cflag = false, nflag = false;
- int tcomps = 0, ccomps = 0, vcomps = 0;
- int ctype = 0;
- final int toffset = 0;
- int coffset = 0;
- int noffset = 0;
- int voffset = 0;
- final int defstride;
-
- switch (format) {
- case GL11.GL_V2F:
- vcomps = 2; defstride = 2 * f; break;
- case GL11.GL_V3F:
- vcomps = 3; defstride = 3 * f; break;
- case GL11.GL_C4UB_V2F:
- cflag = true; ccomps = 4; vcomps = 2;
- ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 2 * f; break;
- case GL11.GL_C4UB_V3F:
- cflag = true; ccomps = 4; vcomps = 3;
- ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 3 * f; break;
- case GL11.GL_C3F_V3F:
- cflag = true; ccomps = 3; vcomps = 3;
- ctype = GL11.GL_FLOAT; voffset = 3 * f; defstride = 6 * f; break;
- case GL11.GL_N3F_V3F:
- nflag = true; vcomps = 3;
- voffset = 3 * f; defstride = 6 * f; break;
- case GL11.GL_C4F_N3F_V3F:
- cflag = true; nflag = true; ccomps = 4; vcomps = 3;
- ctype = GL11.GL_FLOAT; noffset = 4 * f; voffset = 7 * f; defstride = 10 * f; break;
- case GL11.GL_T2F_V3F:
- tflag = true; tcomps = 2; vcomps = 3;
- voffset = 2 * f; defstride = 5 * f; break;
- case GL11.GL_T4F_V4F:
- tflag = true; tcomps = 4; vcomps = 4;
- voffset = 4 * f; defstride = 8 * f; break;
- case GL11.GL_T2F_C4UB_V3F:
- tflag = true; cflag = true; tcomps = 2; ccomps = 4; vcomps = 3;
- ctype = GL11.GL_UNSIGNED_BYTE; coffset = 2 * f; voffset = c + 2 * f; defstride = c + 5 * f; break;
- case GL11.GL_T2F_C3F_V3F:
- tflag = true; cflag = true; tcomps = 2; ccomps = 3; vcomps = 3;
- ctype = GL11.GL_FLOAT; coffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break;
- case GL11.GL_T2F_N3F_V3F:
- tflag = true; nflag = true; tcomps = 2; vcomps = 3;
- noffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break;
- case GL11.GL_T2F_C4F_N3F_V3F:
- tflag = true; cflag = true; nflag = true; tcomps = 2; ccomps = 4; vcomps = 3;
- ctype = GL11.GL_FLOAT; coffset = 2 * f; noffset = 6 * f; voffset = 9 * f; defstride = 12 * f; break;
- case GL11.GL_T4F_C4F_N3F_V4F:
- tflag = true; cflag = true; nflag = true; tcomps = 4; ccomps = 4; vcomps = 4;
- ctype = GL11.GL_FLOAT; coffset = 4 * f; noffset = 8 * f; voffset = 11 * f; defstride = 15 * f; break;
- default:
- return; // Invalid format
- }
-
- if (stride == 0) stride = defstride;
-
- if (tflag) {
- glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
- interleavedPointer(texCoordConventional(ctx()), tcomps, GL11.GL_FLOAT, false, stride, pointer, base, toffset);
- } else {
- glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
- }
-
- if (cflag) {
- glEnableClientState(GL11.GL_COLOR_ARRAY);
- interleavedPointer(VAOManager.CONV_COLOR, ccomps, ctype, Usage.COLOR.isNormalized(), stride, pointer, base, coffset);
- } else {
- glDisableClientState(GL11.GL_COLOR_ARRAY);
- }
-
- if (nflag) {
- glEnableClientState(GL11.GL_NORMAL_ARRAY);
- interleavedPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, pointer, base, noffset);
- } else {
- glDisableClientState(GL11.GL_NORMAL_ARRAY);
- }
-
- glEnableClientState(GL11.GL_VERTEX_ARRAY);
- interleavedPointer(VAOManager.CONV_POSITION, vcomps, GL11.GL_FLOAT, false, stride, pointer, base, voffset);
- }
-
- public static void glInterleavedArrays(int format, int stride, ByteBuffer pointer) {
- interleavedArrays(format, stride, 0L, pointer);
- }
-
- public static void glInterleavedArrays(int format, int stride, FloatBuffer pointer) {
- interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glInterleavedArrays(int format, int stride, DoubleBuffer pointer) {
- interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glInterleavedArrays(int format, int stride, IntBuffer pointer) {
- interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glInterleavedArrays(int format, int stride, ShortBuffer pointer) {
- interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer));
- }
-
- public static void glLogicOp(int opcode) {
- rejectExitCapture();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLogicOp(opcode);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (!isCachingEnabled() || ctx().logicOpMode.getValue() != opcode) beforeUncapturedStateChange();
- if (isCachingEnabled()) mod(ctx().logicOpMode).setValue(opcode);
- RENDER_BACKEND.logicOp(opcode);
- }
-
- public static void defaultBlendFunc() {
- tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- }
-
- public static void enableCull() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_CULL_FACE);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableCull(ctx());
- }
-
- private static void enableCull(GLContextState glCtx) {
- glCtx.cullState.enable();
- }
-
- public static void disableCull() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_CULL_FACE);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableCull(ctx());
- }
-
- private static void disableCull(GLContextState glCtx) {
- glCtx.cullState.disable();
- }
-
- public static void enableDepthTest() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_DEPTH_TEST);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableDepthTest(ctx());
- }
-
- private static void enableDepthTest(GLContextState glCtx) {
- glCtx.depthTest.enable();
- }
-
- public static void disableDepthTest() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_DEPTH_TEST);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableDepthTest(ctx());
- }
-
- private static void disableDepthTest(GLContextState glCtx) {
- glCtx.depthTest.disable();
- }
-
- public static void enableLighting() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_LIGHTING);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableLighting(ctx());
- }
-
- private static void enableLighting(GLContextState glCtx) {
- glCtx.lightingState.enable();
- }
-
- public static void enableLight(int light) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_LIGHT0 + light);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableLight(ctx(), light);
- }
-
- private static void enableLight(GLContextState glCtx, int light) {
- if (light >= VertexKey.FFP_LIGHT_COUNT && (warnedFfpLightMask & (1 << light)) == 0 && ShaderManager.isEnabled()) {
- warnedFfpLightMask |= (1 << light);
- LOGGER.warn("GL_LIGHT{} enabled, but FFP shader emulation implements only GL_LIGHT0..{}", light, VertexKey.FFP_LIGHT_COUNT - 1, new Throwable("call site"));
- }
- glCtx.lightStates[light].enable();
- }
-
- private static int warnedFfpLightMask = 0;
-
- public static void enableColorMaterial() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_COLOR_MATERIAL);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableColorMaterial(ctx());
- }
-
- private static void enableColorMaterial(GLContextState glCtx) {
- glCtx.colorMaterial.enable();
- bakeCurrentColorIntoTrackedMaterial(glCtx);
- }
-
- public static void disableColorMaterial() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_COLOR_MATERIAL);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableColorMaterial(ctx());
- }
-
- private static void disableColorMaterial(GLContextState glCtx) {
- bakeCurrentColorIntoTrackedMaterial(glCtx);
- glCtx.colorMaterial.disable();
- }
-
- private static void bakeCurrentColorIntoTrackedMaterial(GLContextState glCtx) {
- glCtx.exitCapture.requireMaterialBakeInputs();
- final float r = glCtx.color.getRed();
- final float g = glCtx.color.getGreen();
- final float b = glCtx.color.getBlue();
- final float a = glCtx.color.getAlpha();
- final int face = glCtx.colorMaterialFace.getValue();
- final int param = glCtx.colorMaterialParameter.getValue();
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- bakeMaterialColor(glCtx, glCtx.frontMaterial, param, r, g, b, a);
- }
- if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
- bakeMaterialColor(glCtx, glCtx.backMaterial, param, r, g, b, a);
- }
- }
-
- private static boolean materialVectorDiffers(Vector4f vec, float r, float g, float b, float a) {
- return vec.x != r || vec.y != g || vec.z != b || vec.w != a;
- }
-
- private static void bakeMaterialColor(GLContextState glCtx, MaterialStateStack material, int param, float r, float g, float b, float a) {
- glCtx.exitCapture.material(material.face, param);
- final boolean changed = switch (param) {
- case GL11.GL_AMBIENT_AND_DIFFUSE -> materialVectorDiffers(material.ambient, r, g, b, a) || materialVectorDiffers(material.diffuse, r, g, b, a);
- case GL11.GL_AMBIENT -> materialVectorDiffers(material.ambient, r, g, b, a);
- case GL11.GL_DIFFUSE -> materialVectorDiffers(material.diffuse, r, g, b, a);
- case GL11.GL_SPECULAR -> materialVectorDiffers(material.specular, r, g, b, a);
- case GL11.GL_EMISSION -> materialVectorDiffers(material.emission, r, g, b, a);
- default -> false;
- };
- if (!changed) return;
- mod(material);
- switch (param) {
- case GL11.GL_AMBIENT_AND_DIFFUSE -> {
- material.ambient.set(r, g, b, a);
- material.diffuse.set(r, g, b, a);
- }
- case GL11.GL_AMBIENT -> material.ambient.set(r, g, b, a);
- case GL11.GL_DIFFUSE -> material.diffuse.set(r, g, b, a);
- case GL11.GL_SPECULAR -> material.specular.set(r, g, b, a);
- case GL11.GL_EMISSION -> material.emission.set(r, g, b, a);
- default -> {}
- }
- }
-
- public static void disableLighting() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_LIGHTING);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableLighting(ctx());
- }
-
- private static void disableLighting(GLContextState glCtx) {
- glCtx.lightingState.disable();
- }
-
- public static void disableLight(int light) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_LIGHT0 + light);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableLight(ctx(), light);
- }
-
- private static void disableLight(GLContextState glCtx, int light) {
- glCtx.lightStates[light].disable();
- }
-
- public static void enableRescaleNormal() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL12.GL_RESCALE_NORMAL);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableRescaleNormal(ctx());
- }
-
- private static void enableRescaleNormal(GLContextState glCtx) {
- glCtx.rescaleNormalState.enable();
- }
-
- public static void disableRescaleNormal() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL12.GL_RESCALE_NORMAL);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableRescaleNormal(ctx());
- }
-
- private static void disableRescaleNormal(GLContextState glCtx) {
- glCtx.rescaleNormalState.disable();
- }
-
- public static void enableFog() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordEnable(GL11.GL_FOG);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- enableFog(ctx());
- }
-
- private static void enableFog(GLContextState glCtx) {
- glCtx.fogMode.enable();
- if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
- GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
- }
- }
-
- public static void disableFog() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDisable(GL11.GL_FOG);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- disableFog(ctx());
- }
-
- private static void disableFog(GLContextState glCtx) {
- glCtx.fogMode.disable();
- if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
- GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
- }
- }
-
- public static void glFog(int pname, FloatBuffer param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordFog(pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (HAS_MULTIPLE_SET.contains(pname)) {
- if (pname == GL11.GL_FOG_COLOR && isCachingEnabled()) {
- final float red = param.get(0);
- final float green = param.get(1);
- final float blue = param.get(2);
-
- beforeUncapturedStateChange();
- mod(glCtx.fogState);
- glCtx.fogState.getFogColor().set(red, green, blue);
- glCtx.fogState.setFogAlpha(param.get(3));
- glCtx.fogState.getFogColorBuffer().clear();
- glCtx.fogState.getFogColorBuffer().put((FloatBuffer) param.position(0)).flip();
- glCtx.fragmentGeneration++;
- if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
- GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
- }
- }
- } else {
- GLStateManager.glFogf(pname, param.get(0));
- }
- }
-
- public static Vector3d getFogColor() {
- return ctx().fogState.getFogColor();
- }
-
- public static void fogColor(float red, float green, float blue, float alpha) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final boolean caching = isCachingEnabled();
- if (!caching || red != glCtx.fogState.getFogColor().x || green != glCtx.fogState.getFogColor().y || blue != glCtx.fogState.getFogColor().z || alpha != glCtx.fogState.getFogAlpha()) {
- beforeUncapturedStateChange();
- mod(glCtx.fogState);
- glCtx.fogState.getFogColor().set(red, green, blue);
- glCtx.fogState.setFogAlpha(alpha);
- glCtx.fogState.getFogColorBuffer().clear();
- glCtx.fogState.getFogColorBuffer().put(red).put(green).put(blue).put(alpha).flip();
- glCtx.fragmentGeneration++;
- if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
- GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
- }
- }
- }
-
- public static void glFogf(int pname, float param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordFogf(pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Update cached state (FFP shader reads from cache)
- if (isCachingEnabled()) {
- boolean changed = false;
- switch (pname) {
- case GL11.GL_FOG_DENSITY -> { if (!isCachingEnabled() || glCtx.fogState.getDensity() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setDensity(param); changed = true; } }
- case GL11.GL_FOG_START -> { if (!isCachingEnabled() || glCtx.fogState.getStart() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setStart(param); changed = true; } }
- case GL11.GL_FOG_END -> { if (!isCachingEnabled() || glCtx.fogState.getEnd() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setEnd(param); changed = true; } }
- case GL11.GL_FOG_MODE -> { if (!isCachingEnabled() || glCtx.fogState.getFogMode() != (int) param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setFogMode((int) param); changed = true; } }
- default -> {}
- }
- if (changed) {
- glCtx.fragmentGeneration++;
- if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
- GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
- }
- }
- }
- }
-
- public static void glFogi(int pname, int param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordFogi(pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Update cached state (FFP shader reads from cache)
- if (isCachingEnabled() && pname == GL11.GL_FOG_MODE && (!isCachingEnabled() || glCtx.fogState.getFogMode() != param)) {
- beforeUncapturedStateChange();
- mod(glCtx.fogState).setFogMode(param);
- glCtx.fragmentGeneration++;
- if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
- GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
- }
- }
- }
-
- public static void setFogBlack() {
- glFogf(GL11.GL_FOG_COLOR, 0.0F);
- }
-
- public static void glShadeModel(int mode) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.SHADE_MODEL);
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- DisplayListManager.recordShadeModel(mode);
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- final int oldValue = glCtx.shadeModelState.getValue();
- final boolean needsUpdate = !caching || oldValue != mode;
-
- if (needsUpdate) {
- mod(glCtx.shadeModelState).setValue(mode);
- }
- }
-
- // Iris Functions
- private static void onDeleteTexture(int id) {
- final GLContextState glCtx = ctx();
- TextureInfoCache.INSTANCE.onDeleteTexture(id);
- if (GLSMHooks.TEXTURE_DELETE.hasListeners()) {
- GLSMHooks.textureDeleteEvent.textureId = id;
- GLSMHooks.TEXTURE_DELETE.post(GLSMHooks.textureDeleteEvent);
- }
-
- // Always delete
- clearTextureBindings(glCtx, id);
- }
-
- private static void clearTextureBindings(GLContextState glCtx, int id) {
- for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) {
- if (glCtx.textures.getTextureUnitBindings(i).getBinding() == id) {
- mod(glCtx.textures.getTextureUnitBindings(i)).setBinding(0);
- }
- }
-
- for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) {
- final ImageUnitBinding image = glCtx.imageUnits.get(i);
- if (image != null && image.getTexture() == id) {
- image.reset();
- }
- }
- }
-
public static void makeCurrent(Drawable drawable) throws LWJGLException {
final GLContextState previous = tlWorkerContext.get();
final boolean changed = bindThreadContext(isDisplayDrawable(drawable) ? null : contextFor(drawable));
@@ -4872,7 +546,7 @@ public class GLStateManager {
if (changed) bindThreadContext(previous);
throw failure;
}
- if (!handled && changed) replayStateToBackend();
+ if (!handled && changed) GLSMAttribStack.replayStateToBackend();
CurrentThread = Thread.currentThread();
if (splashComplete) return;
@@ -4921,9 +595,6 @@ public class GLStateManager {
Display.swapBuffers();
}
- private static boolean firstClearPending;
- private static long firstClearBlockNanos;
-
public static void updateDisplay() throws LWJGLException {
updateDisplay(true);
}
@@ -4942,7 +613,7 @@ public class GLStateManager {
Display.update(false);
final long end = System.nanoTime();
RENDER_BACKEND.recordGate(end - start, end);
- firstClearPending = true;
+ GLSMFramebuffer.armFirstClear();
}
/**
@@ -4963,16 +634,6 @@ public class GLStateManager {
}
}
- public static void glNewList(int list, int mode) {
- rejectExitCapture();
- DisplayListManager.glNewList(list, mode);
- }
-
- public static void glEndList() {
- rejectExitCapture();
- DisplayListManager.glEndList();
- }
-
/**
* Check if we're currently recording a display list.
*/
@@ -4980,2143 +641,6 @@ public class GLStateManager {
return DisplayListManager.isRecording();
}
- public static int getRecordingDisplayListId() {
- return DisplayListManager.getRecordingListId();
- }
-
- private static final DisplayListIDAllocator displayListIdAllocator = new DisplayListIDAllocator();
-
- public static int glGenLists(int range) {
- rejectExitCapture();
- return displayListIdAllocator.allocRange(range);
- }
-
- public static boolean glIsList(int list) {
- rejectExitCapture();
- return displayListIdAllocator.isAllocated(list);
- }
-
- /**
- * Delete display lists and free their VBO resources.
- */
- public static void glDeleteLists(int list, int range) {
- rejectExitCapture();
- final boolean locked = acquireDrawLock();
- try {
- synchronized (displayListIdAllocator) {
- DisplayListManager.glDeleteLists(list, range);
- displayListIdAllocator.freeRange(list, range);
- }
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- /**
- * Get a compiled display list from the cache. Used for executing nested display lists.
- *
- * @param list The display list ID
- * @return The CompiledDisplayList, or null if not found
- */
- public static CompiledDisplayList getDisplayList(int list) {
- return DisplayListManager.getDisplayList(list);
- }
-
- public static void glCallList(int list) {
- rejectExitCapture();
- if (!GLDebug.isActive()) {
- DisplayListManager.glCallList(list);
- return;
- }
- GLDebug.pushGroup("glCallList ", list);
- try {
- DisplayListManager.glCallList(list);
- } finally {
- GLDebug.popGroup();
- }
- }
-
- public static void pushState(int mask) {
- pushStateLive(StateSet.forMask(mask));
- }
-
- public static int pushState(StateSet set) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- final int token = ctx().attribDepth + DisplayListManager.virtualStateDepth(mode);
- if (token >= MAX_ATTRIB_STACK_DEPTH) {
- throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached");
- }
- DisplayListManager.recordPushState(set);
- if (mode == RecordMode.COMPILE) {
- return token;
- }
- }
- return pushStateLive(set);
- }
-
- static int pushStateLive(StateSet set) {
- attribPushes++;
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.pushAttrib();
- if (glCtx.attribDepth >= MAX_ATTRIB_STACK_DEPTH) {
- throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached");
- }
- final int depthBefore = glCtx.attribDepth;
- glCtx.attribSets[depthBefore] = set;
- glCtx.savedBatchStateGen[depthBefore] = glCtx.batchStateGeneration;
-
- snapshotGenerations(glCtx, set.bump);
-
- glCtx.modifiedCount[depthBefore] = 0;
-
- if ((set.restore & StateSet.R_PROGRAM) != 0) {
- glCtx.programStack.setValue(glCtx.activeProgram);
- glCtx.programStack.push();
- attribSlotsSaved++;
- }
-
- glCtx.attribDepth++;
- return depthBefore;
- }
-
- private static void snapshotGenerations(GLContextState glCtx, int bump) {
- final int depth = glCtx.attribDepth;
- if ((bump & StateSet.B_LIGHTING) != 0) {
- glCtx.savedLightingGen[depth] = glCtx.lightingGeneration;
- }
- if ((bump & (StateSet.B_FRAG_COLORBUF | StateSet.B_FRAG_TEXTURE | StateSet.B_FRAG_FOG)) != 0) {
- glCtx.savedFragmentGen[depth] = glCtx.fragmentGeneration;
- }
- if ((bump & StateSet.B_TRANSFORM) != 0) {
- glCtx.savedMvGen[depth] = glCtx.mvGeneration;
- glCtx.savedMvLinearGen[depth] = glCtx.mvLinearGeneration;
- glCtx.savedProjGen[depth] = glCtx.projGeneration;
- glCtx.savedTexMatGen[depth] = glCtx.texMatrixGeneration;
- }
- if ((bump & StateSet.B_CURRENT) != 0) {
- glCtx.savedColorGen[depth] = glCtx.colorGeneration;
- glCtx.savedNormalGen[depth] = glCtx.ffp.normalGeneration;
- glCtx.savedTexCoordGen[depth] = glCtx.ffp.texCoordGeneration;
- }
- }
-
- public static void popStateTo(int depth) {
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- while (glCtx.attribDepth + DisplayListManager.virtualStateDepth(mode) > depth) {
- if (mode == RecordMode.COMPILE && DisplayListManager.recordPopStateIfPending()) continue;
- if (mode == RecordMode.COMPILE_AND_EXECUTE) DisplayListManager.recordPopStateIfPending();
- popState();
- }
- }
-
- public static void popState() {
- final GLContextState glCtx = ctx();
- if (glCtx.attribDepth > 0 && glCtx.savedBatchStateGen[glCtx.attribDepth - 1] != glCtx.batchStateGeneration) {
- beforeUncapturedStateChange();
- }
- final int poppedDepth = glCtx.attribDepth;
- final StateSet set = glCtx.attribSets[poppedDepth - 1];
- glCtx.exitCapture.popAttrib(set);
- final boolean inspectAlpha = GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()
- && ((glCtx.alphaState.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaState.stackId()))
- || (glCtx.alphaTest.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaTest.stackId())));
- final AlphaState effectiveAlpha = inspectAlpha ? glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch) : null;
- final boolean effectiveEnabled = inspectAlpha && glCtx.alphaTest.isEffectivelyEnabled();
- final int effectiveFunction = inspectAlpha ? effectiveAlpha.getFunction() : 0;
- final float effectiveReference = inspectAlpha ? effectiveAlpha.getReference() : 0.0f;
- final boolean liveEnabled = inspectAlpha && glCtx.alphaTest.isEnabled();
- final int liveFunction = inspectAlpha ? glCtx.alphaState.getFunction() : 0;
- final float liveReference = inspectAlpha ? glCtx.alphaState.getReference() : 0.0f;
- final boolean prevPoppingAttributes = glCtx.poppingAttributes;
- glCtx.poppingAttributes = true;
- try {
- glCtx.attribDepth--;
- final int restore = set.restore;
-
- final boolean blendSnapshotted = set.blendSnapshot
- && (glCtx.blendState.cowDepths().claimedAt(poppedDepth) || glCtx.blendMode.cowDepths().claimedAt(poppedDepth))
- && snapshotVanillaBlendFunc();
-
- int changed = 0;
- long unitsChanged = 0L;
-
- if ((restore & StateSet.R_PROGRAM) != 0) {
- glCtx.programStack.setValue(glCtx.activeProgram);
- if (glCtx.programStack.topSlotChanged()) changed |= StateSet.R_PROGRAM;
- glCtx.programStack.pop();
- }
-
- final int depth = glCtx.attribDepth;
- final int count = glCtx.modifiedCount[depth];
- final int[] ids = glCtx.modifiedIds[depth];
- final CowStateStack>[] stackById = glCtx.stackById;
- final CowDepths[] depthsById = glCtx.depthsById;
- final int[] restoreBitById = glCtx.restoreBitById;
- final int[] restoreUnitById = glCtx.restoreUnitById;
- final byte[] kindById = glCtx.kindById;
-
- for (int i = 0; i < count; i++) {
- final int id = ids[i];
- final CowStateStack> cow = stackById[id];
- final byte kind = kindById[id];
- if (set.contains(id)) {
- final int bit = restoreBitById[id];
- if (bit != 0 && CowDispatch.topSlotChanged(kind, cow)) {
- changed |= bit;
- final int unit = restoreUnitById[id];
- if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63);
- }
- final int slot = depthsById[id].pop();
- if (slot >= 0) CowDispatch.restoreSlot(kind, cow, slot);
- if (bit == 0
- && (kind == CowDispatch.BOOLEAN
- || kind == CowDispatch.CLIP_PLANE_BOOLEAN
- || kind == CowDispatch.TEXTURE_UNIT_BOOLEAN)) attribValueRestores++;
- } else {
- if (depthsById[id].discard(poppedDepth) >= 0) registerModifiedState(glCtx, id);
- attribDiscards++;
- }
- }
- glCtx.modifiedCount[depth] = 0;
-
- glCtx.restoreChangedMask = changed;
- glCtx.restoreUnitChangedMask = unitsChanged;
-
- applyRestoredState(set, blendSnapshotted);
- } finally {
- glCtx.poppingAttributes = prevPoppingAttributes;
- }
- if (inspectAlpha) {
- glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch);
- if (effectiveEnabled != glCtx.alphaTest.isEffectivelyEnabled()
- || effectiveFunction != effectiveAlpha.getFunction()
- || Float.compare(effectiveReference, effectiveAlpha.getReference()) != 0
- || liveEnabled != glCtx.alphaTest.isEnabled()
- || liveFunction != glCtx.alphaState.getFunction()
- || Float.compare(liveReference, glCtx.alphaState.getReference()) != 0) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- }
- }
-
- public static void retainModifiedState(int depth, RetainedState out) {
- final GLContextState glCtx = ctx();
- if (depth < 0 || depth != glCtx.attribDepth - 1) {
- throw new IllegalStateException("retainModifiedState: depth " + depth + " is not the open push (attrib depth " + glCtx.attribDepth + ")");
- }
- glCtx.retainedOwner = out;
- final int count = glCtx.modifiedCount[depth];
- final int[] ids = glCtx.modifiedIds[depth];
- final CowStateStack>[] stackById = glCtx.stackById;
- out.ensureCapacity(count);
- for (int i = 0; i < count; i++) {
- final int id = ids[i];
- stackById[id].captureSlot(RETAINED_SLOT);
- out.ids[i] = id;
- }
- out.count = count;
- out.program = glCtx.activeProgram;
- out.programGen = programLifetimeGeneration;
- }
-
- public static void applyRetainedState(RetainedState in) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (glCtx.retainedOwner != in) return;
- final CowStateStack>[] stackById = glCtx.stackById;
- final byte[] kindById = glCtx.kindById;
- final int[] ids = in.ids;
- final int count = in.count;
- int first = 0;
- while (first < count && !CowDispatch.slotChanged(kindById[ids[first]], stackById[ids[first]], RETAINED_SLOT)) first++;
- if (first < count) applyRetainedChanges(glCtx, in, first);
- if (in.program != glCtx.activeProgram && (in.program == 0 || in.programGen == programLifetimeGeneration)) glUseProgram(in.program);
- }
-
- private static void applyRetainedChanges(GLContextState glCtx, RetainedState in, int first) {
- beforeUncapturedStateChange();
- final boolean blendSnapshotted = snapshotVanillaBlendFunc();
- final int alphaFuncId = glCtx.alphaState.stackId();
- final int alphaTestId = glCtx.alphaTest.stackId();
- boolean alphaChanged = false;
- final boolean prevPoppingAttributes = glCtx.poppingAttributes;
- glCtx.poppingAttributes = true;
- try {
- final CowStateStack>[] stackById = glCtx.stackById;
- final int[] restoreBitById = glCtx.restoreBitById;
- final int[] restoreUnitById = glCtx.restoreUnitById;
- final byte[] kindById = glCtx.kindById;
- int changed = 0;
- long unitsChanged = 0L;
- for (int i = first; i < in.count; i++) {
- final int id = in.ids[i];
- final CowStateStack> cow = stackById[id];
- final byte kind = kindById[id];
- if (!CowDispatch.slotChanged(kind, cow, RETAINED_SLOT)) continue;
- cow.beforeModify();
- final int bit = restoreBitById[id];
- if (bit != 0) {
- changed |= bit;
- final int unit = restoreUnitById[id];
- if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63);
- }
- CowDispatch.restoreSlot(kind, cow, RETAINED_SLOT);
- if (id == alphaFuncId || id == alphaTestId) alphaChanged = true;
- }
- glCtx.restoreChangedMask = changed;
- glCtx.restoreUnitChangedMask = unitsChanged;
- issueRestoredBackendState(glCtx, -1);
- glCtx.lightingGeneration++;
- glCtx.fragmentGeneration++;
- glCtx.colorGeneration++;
- glCtx.ffp.normalGeneration++;
- glCtx.ffp.texCoordGeneration++;
- glCtx.dirtyColorAttrib = true;
- glCtx.dirtyNormalAttrib = true;
- glCtx.dirtyTexCoordAttrib = true;
- postVanillaBlendChangeIfMoved(blendSnapshotted);
- } finally {
- glCtx.poppingAttributes = prevPoppingAttributes;
- }
- if (alphaChanged && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) {
- GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent);
- }
- }
-
- private static boolean isDepthColorOverridden() {
- final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
- return dch != null && dch.isOverrideHeld();
- }
-
- public static void replayStateToBackend() {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (RENDER_BACKEND == null) return;
-
- final List booleanStates = glCtx.allBooleanStates;
- for (int i = 0; i < booleanStates.size(); i++) {
- booleanStates.get(i).applyToBackend();
- }
-
- RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc());
- RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled());
- RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue());
-
- issueBlendFunc(glCtx.blendState);
- glCtx.blendState.clearFuncUnknownState();
- RENDER_BACKEND.blendEquationSeparate(glCtx.blendState.getEquationRgb(), glCtx.blendState.getEquationAlpha());
- RENDER_BACKEND.blendColor(glCtx.blendState.getBlendColorR(), glCtx.blendState.getBlendColorG(), glCtx.blendState.getBlendColorB(), glCtx.blendState.getBlendColorA());
- RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha);
- RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha());
- RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue());
-
- RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront());
- RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack());
- RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront());
- RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack());
- RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront());
- RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack());
- RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue());
-
- RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height);
- RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar);
- RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height);
- RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), lineWidthMin, lineWidthMax));
- applyPointState(glCtx);
- applyHintState(glCtx);
-
- RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode());
- applyPolygonOffset(glCtx);
- RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode());
- RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace());
-
- final SamplerUnitArray samplerUnits = glCtx.samplerUnits;
- for (int i = 0; i <= samplerUnits.getHighestBoundUnit(); i++) {
- final int sampler = samplerUnits.get(i);
- if (sampler != 0) RENDER_BACKEND.bindSampler(i, sampler);
- }
-
- for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) {
- final TextureBinding b = glCtx.textures.getTextureUnitBindings(i);
- RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i);
- RENDER_BACKEND.bindTexture(b.getTarget() == 0 ? GL11.GL_TEXTURE_2D : b.getTarget(), b.getBinding());
- }
- RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + getActiveTextureUnit());
- if (glCtx.defaultVAO == 0 && primaryContext().defaultVAO != 0) glCtx.defaultVAO = RENDER_BACKEND.genVertexArrays();
- if (!glCtx.vaos.isInitialized()) glCtx.vaos.init(glCtx.defaultVAO);
- RENDER_BACKEND.bindVertexArray(glCtx.boundVAO != 0 ? glCtx.boundVAO : glCtx.defaultVAO);
- RENDER_BACKEND.useProgram(glCtx.activeProgram);
- glCtx.ffp.invalidateProgram();
- RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer);
- RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer);
- glCtx.dirtyColorAttrib = true;
- glCtx.dirtyNormalAttrib = true;
- glCtx.dirtyTexCoordAttrib = true;
- glCtx.dirtyLightmapAttrib = true;
- glCtx.dirtyEntityIdsAttrib = true;
- }
-
- private static void applyPolygonOffset(GLContextState glCtx) {
- final float clamp = glCtx.polygonState.getOffsetClamp();
- if (clamp == 0.0f) {
- RENDER_BACKEND.polygonOffset(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits());
- } else {
- RENDER_BACKEND.polygonOffsetClamp(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits(), clamp);
- }
- }
-
- private static void issueRestoredBackendState(GLContextState glCtx, int restore) {
- final int changed = glCtx.restoreChangedMask;
- if ((restore & StateSet.R_DEPTH) != 0 && (changed & StateSet.R_DEPTH) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc());
- attribBackendCalls++;
- if (!isDepthColorOverridden()) {
- RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled());
- attribBackendCalls++;
- }
- RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue());
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_BLEND) != 0) {
- final BlendStateStack blend = glCtx.blendState;
- if ((changed & StateSet.R_BLEND) != 0 || blend.isFuncUnknown()) {
- attribValueRestores++;
- final DeferredBlendHandler restoreBlendHandler = GLSMHooks.blendHandler;
- if (restoreBlendHandler == null || !restoreBlendHandler.isOverrideHeld()) {
- issueBlendFunc(blend);
- attribBackendCalls++;
- blend.clearFuncUnknownState();
- }
- if ((changed & StateSet.R_BLEND) != 0) {
- RENDER_BACKEND.blendEquationSeparate(blend.getEquationRgb(), blend.getEquationAlpha());
- attribBackendCalls++;
- RENDER_BACKEND.blendColor(
- blend.getBlendColorR(), blend.getBlendColorG(), blend.getBlendColorB(), blend.getBlendColorA());
- attribBackendCalls++;
- }
- }
- }
- if ((restore & StateSet.R_COLOR_MASK) != 0 && (changed & StateSet.R_COLOR_MASK) != 0 && !isDepthColorOverridden()) {
- attribValueRestores++;
- RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha);
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_CLEAR_COLOR) != 0 && (changed & StateSet.R_CLEAR_COLOR) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha());
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_DRAW_BUFFER) != 0 && (changed & StateSet.R_DRAW_BUFFER) != 0 && glCtx.drawFramebuffer == 0) {
- attribValueRestores++;
- RENDER_BACKEND.drawBuffer(glCtx.drawBuffer.getValue());
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_LOGIC_OP) != 0 && (changed & StateSet.R_LOGIC_OP) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue());
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_STENCIL) != 0 && (changed & StateSet.R_STENCIL) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront());
- RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack());
- RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront());
- RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack());
- RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront());
- RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack());
- RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue());
- attribBackendCalls += 7;
- }
- if ((restore & StateSet.R_VIEWPORT) != 0 && (changed & StateSet.R_VIEWPORT) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height);
- RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar);
- attribBackendCalls += 2;
- }
- if ((restore & StateSet.R_SCISSOR) != 0 && (changed & StateSet.R_SCISSOR) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height);
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_LINE) != 0 && (changed & StateSet.R_LINE) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), lineWidthMin, lineWidthMax));
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_POINT) != 0 && (changed & StateSet.R_POINT) != 0) {
- attribValueRestores++;
- applyPointState(glCtx);
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_HINT) != 0 && (changed & StateSet.R_HINT) != 0) {
- attribValueRestores++;
- applyHintState(glCtx);
- attribBackendCalls++;
- }
- if ((restore & StateSet.R_POLYGON) != 0 && (changed & StateSet.R_POLYGON) != 0) {
- attribValueRestores++;
- RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode());
- applyPolygonOffset(glCtx);
- RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode());
- RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace());
- attribBackendCalls += 4;
- }
- final boolean textureBitSet = (restore & StateSet.R_TEXTURE) != 0 && (changed & StateSet.R_TEXTURE) != 0;
- final boolean activeUnitBitSet = (restore & StateSet.R_ACTIVE_UNIT) != 0;
- if (textureBitSet || activeUnitBitSet) {
- boolean unitTouched = false;
- if (textureBitSet) {
- final long unitsChanged = glCtx.restoreUnitChangedMask;
- for (int i = 0; i < MAX_TEXTURE_UNITS; i++) {
- if ((unitsChanged & (1L << Math.min(i, 63))) != 0) {
- final TextureBinding restored = glCtx.textures.getTextureUnitBindings(i);
- final int restoredTarget = restored.getTarget() != 0 ? restored.getTarget() : GL11.GL_TEXTURE_2D;
- RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i);
- RENDER_BACKEND.bindTexture(restoredTarget, restored.getBinding());
- attribValueRestores++;
- attribBackendCalls += 2;
- unitTouched = true;
- }
- }
- }
- if (unitTouched || (activeUnitBitSet && (changed & StateSet.R_ACTIVE_UNIT) != 0)) {
- RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + glCtx.activeTextureUnit.getValue());
- attribValueRestores++;
- attribBackendCalls++;
- }
- }
- }
-
- /**
- * After popping GLSM stacks, apply restored state to the GL driver.
- */
- private static void applyRestoredState(StateSet set, boolean blendSnapshotted) {
- final GLContextState glCtx = ctx();
- final int restore = set.restore;
- final int changed = glCtx.restoreChangedMask;
- issueRestoredBackendState(glCtx, restore);
-
- final int bump = set.bump;
- final int depth = glCtx.attribDepth;
- if ((bump & StateSet.B_LIGHTING) != 0 && glCtx.lightingGeneration != glCtx.savedLightingGen[depth]) glCtx.lightingGeneration++;
- if ((bump & StateSet.B_FRAG_FOG) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++;
- if ((bump & StateSet.B_FRAG_COLORBUF) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++;
- if ((bump & StateSet.B_FRAG_TEXTURE) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++;
- if ((bump & StateSet.B_TRANSFORM) != 0) {
- if (glCtx.mvGeneration != glCtx.savedMvGen[depth]) glCtx.mvGeneration++;
- if (glCtx.mvLinearGeneration != glCtx.savedMvLinearGen[depth]) glCtx.mvLinearGeneration++;
- if (glCtx.projGeneration != glCtx.savedProjGen[depth]) glCtx.projGeneration++;
- if (glCtx.texMatrixGeneration != glCtx.savedTexMatGen[depth]) glCtx.texMatrixGeneration++;
- }
- if ((bump & StateSet.B_CURRENT) != 0) {
- if (glCtx.colorGeneration != glCtx.savedColorGen[depth]) {
- glCtx.colorGeneration++;
- glCtx.dirtyColorAttrib = true;
- }
- if (glCtx.ffp.normalGeneration != glCtx.savedNormalGen[depth]) {
- glCtx.ffp.normalGeneration++;
- glCtx.dirtyNormalAttrib = true;
- }
- if (glCtx.ffp.texCoordGeneration != glCtx.savedTexCoordGen[depth]) {
- glCtx.ffp.texCoordGeneration++;
- glCtx.dirtyTexCoordAttrib = true;
- }
- if ((restore & StateSet.R_SECONDARY_COLOR) != 0 && (changed & StateSet.R_SECONDARY_COLOR) != 0) glCtx.fragmentGeneration++;
- }
-
- postVanillaBlendChangeIfMoved(blendSnapshotted);
-
- if ((restore & StateSet.R_PROGRAM) != 0 && (changed & StateSet.R_PROGRAM) != 0) {
- glUseProgram(glCtx.programStack.getValue());
- attribValueRestores++;
- attribBackendCalls++;
- }
- }
-
- public static void glClear(int mask) {
- rejectExitCapture();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordClear(mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (ctx().rasterizerDiscard.isEnabled() || FeedbackManager.getRenderMode() != GL11.GL_RENDER) {
- return;
- }
- if (firstClearPending && Thread.currentThread() == MainThread && getDrawFramebuffer() == 0) {
- firstClearPending = false;
- final long start = System.nanoTime();
- RENDER_BACKEND.clear(mask);
- final long end = System.nanoTime();
- if (end - start > 0) {
- firstClearBlockNanos += end - start;
- RENDER_BACKEND.recordGate(end - start, end);
- }
- return;
- }
- RENDER_BACKEND.clear(mask);
- }
-
- public static long takeFirstClearBlockNanos() {
- final long value = firstClearBlockNanos;
- firstClearBlockNanos = 0L;
- return value;
- }
-
- public static void glPushAttrib(int mask) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPushAttrib(mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- GLDebug.pushGroup("pushState");
- pushState(mask);
- }
-
- public static void glPopAttrib() {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPopAttrib();
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (ctx().attribDepth == 0) {
- rejectExitCapture();
- warnOnce("popattrib-underflow", "glPopAttrib called with an empty attrib stack; ignoring");
- return;
- }
- GLDebug.popGroup();
- GLDebug.pushGroup("popState");
- try {
- popState();
- } finally {
- GLDebug.popGroup();
- }
- }
-
- // Matrix Operations
- public static void glMatrixMode(int mode) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.MATRIX_MODE);
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- DisplayListManager.recordMatrixMode(mode);
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- }
- mod(glCtx.matrixMode).setMode(mode);
- }
-
- public static void glLoadMatrix(FloatBuffer m) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx, true);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- final Matrix4f matrix = new Matrix4f().set(m);
- m.rewind();
- DisplayListManager.recordLoadMatrix(matrix);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).set(m);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glLoadMatrix(DoubleBuffer m) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx, true);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- // Convert double buffer to float buffer for recording
- glCtx.conversionMatrix4d.set(m);
- m.rewind();
- final Matrix4f floatMatrix = new Matrix4f();
- floatMatrix.set(glCtx.conversionMatrix4d);
- DisplayListManager.recordLoadMatrix(floatMatrix);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (isCachingEnabled()) {
- glCtx.conversionMatrix4d.set(m);
- matrixStack(glCtx).set(glCtx.conversionMatrix4d);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void setModelViewMatrix(Matrix4fc m) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.matrixChange(GL11.GL_MODELVIEW, 0, true);
- if (isCachingEnabled()) {
- glCtx.modelViewMatrix.set(m);
- glCtx.mvGeneration++;
- glCtx.mvLinearGeneration++;
- }
- }
-
- public static void setTextureMatrix(int unit, Matrix4fc m) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.matrixChange(GL11.GL_TEXTURE, unit, true);
- if (unit != 0) beforeUncapturedStateChange();
- if (isCachingEnabled()) {
- glCtx.textures.getTextureUnitMatrix(unit).set(m);
- glCtx.texMatrixGeneration++;
- }
- }
-
- public static void setProjectionMatrix(Matrix4fc m) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (isCachingEnabled()) {
- glCtx.projectionMatrix.set(m);
- glCtx.projGeneration++;
- }
- }
-
- public static Matrix4fStack getMatrixStack() {
- return matrixStack(ctx());
- }
-
- private static Matrix4fStack matrixStack(GLContextState glCtx) {
- switch (glCtx.matrixMode.getMode()) {
- case GL11.GL_MODELVIEW -> {
- return glCtx.modelViewMatrix;
- }
- case GL11.GL_PROJECTION -> {
- return glCtx.projectionMatrix;
- }
- case GL11.GL_TEXTURE -> {
- return glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue());
- }
- default -> throw new IllegalStateException("Unknown matrix mode: " + glCtx.matrixMode.getMode());
- }
- }
-
- /** Bump the generation counter for the currently active matrix mode. */
- private static void bumpMatrixGeneration(GLContextState glCtx) {
- bumpMatrixGeneration(glCtx, true);
- }
-
- private static void bumpMatrixGeneration(GLContextState glCtx, boolean linearChanged) {
- switch (glCtx.matrixMode.getMode()) {
- case GL11.GL_MODELVIEW -> {
- glCtx.mvGeneration++;
- if (linearChanged) glCtx.mvLinearGeneration++;
- }
- case GL11.GL_PROJECTION -> glCtx.projGeneration++;
- case GL11.GL_TEXTURE -> glCtx.texMatrixGeneration++;
- }
- }
-
- public static void glLoadIdentity() {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx, true);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLoadIdentity();
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).identity();
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glTranslatef(float x, float y, float z) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (DisplayListManager.isRecording()) {
- DisplayListManager.applyMatrixTranslation(x, y, z);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).translate(x, y, z);
- bumpMatrixGeneration(glCtx, false);
- }
- }
-
- public static void glTranslated(double x, double y, double z) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (DisplayListManager.isRecording()) {
- DisplayListManager.applyMatrixTranslation((float) x, (float) y, (float) z);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).translate((float) x, (float) y, (float) z);
- bumpMatrixGeneration(glCtx, false);
- }
- }
-
- public static void glScalef(float x, float y, float z) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (DisplayListManager.isRecording()) {
- DisplayListManager.applyMatrixScale(x, y, z);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).scale(x, y, z);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glScaled(double x, double y, double z) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (DisplayListManager.isRecording()) {
- DisplayListManager.applyMatrixScale((float) x, (float) y, (float) z);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).scale((float) x, (float) y, (float) z);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glMultMatrix(FloatBuffer floatBuffer) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- glCtx.multMatrix.set(floatBuffer);
- final int currentMode = glCtx.matrixMode.getMode();
-
- if (DisplayListManager.isRecording()) {
- DisplayListManager.updateRelativeTransform(glCtx.multMatrix);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).mul(glCtx.multMatrix);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void applyMultMatrix(Matrix4f multMatrix) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (isCachingEnabled()) {
- matrixStack(glCtx).mul(multMatrix);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glMultMatrix(DoubleBuffer matrix) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- glCtx.conversionMatrix4d.set(matrix);
- glCtx.conversionMatrix4f.set(glCtx.conversionMatrix4d);
-
- if (DisplayListManager.isRecording()) {
- DisplayListManager.updateRelativeTransform(glCtx.conversionMatrix4f);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).mul(glCtx.conversionMatrix4f);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glRotatef(float angle, float x, float y, float z) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- final float lenSq = x * x + y * y + z * z;
- if (lenSq == 0.0f) return;
-
- // Fast way to normalize rotation
- final float scalar = 1.0f / (float) Math.sqrt(lenSq);
- x *= scalar;
- y *= scalar;
- z *= scalar;
- // Convert deg to rad
- angle = (float) Math.toRadians(angle);
-
- if (DisplayListManager.isRecording()) {
- DisplayListManager.applyMatrixRotation(angle, x, y, z);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).rotate(angle, x, y, z);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glRotated(double angle, double x, double y, double z) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- final double lenSq = x * x + y * y + z * z;
- if (lenSq == 0.0) return;
-
- // Fast way to normalize rotation
- final double scalar = 1.0 / Math.sqrt(lenSq);
- x *= scalar;
- y *= scalar;
- z *= scalar;
- // Convert deg to rad
- angle = Math.toRadians(angle);
-
- if (DisplayListManager.isRecording()) {
- DisplayListManager.applyMatrixRotation((float) angle, (float) x, (float) y, (float) z);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).rotate((float) angle, (float) x, (float) y, (float) z);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (DisplayListManager.isRecording()) {
- DisplayListManager.updateRelativeTransformOrtho(left, right, bottom, top, zNear, zFar);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).ortho((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar) {
- final GLContextState glCtx = ctx();
- beforeMatrixChange(glCtx);
- if (DisplayListManager.isRecording()) {
- DisplayListManager.updateRelativeTransformFrustum(left, right, bottom, top, zNear, zFar);
- return;
- }
- if (isCachingEnabled()) {
- matrixStack(glCtx).frustum((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar);
- bumpMatrixGeneration(glCtx);
- }
- }
-
- public static void glPushMatrix() {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.pushMatrix();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPushMatrix(); // Handles flush + relativeTransform stack
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Only track stack on main thread (splash thread has separate GL context)
- if (isCachingEnabled()) {
- try {
- matrixStack(glCtx).pushMatrix();
- } catch (IllegalStateException ignored) {
- glCtx.exitCapture.reject();
- if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack overflow ", new Throwable());
- }
- }
- }
-
- public static void glPopMatrix() {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.popMatrix();
- if (isUncapturedMatrix(glCtx)) beforeUncapturedStateChange();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPopMatrix(); // Handles flush + relativeTransform stack + lastRecordedTransform sync
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Only track stack on main thread (splash thread has separate GL context)
- if (isCachingEnabled()) {
- try {
- matrixStack(glCtx).popMatrix();
- bumpMatrixGeneration(glCtx);
- } catch (IllegalStateException ignored) {
- glCtx.exitCapture.reject();
- if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack underflow ", new Throwable());
- }
- }
- }
-
- public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) {
- final GLContextState glCtx = ctx();
- glCtx.gluMatrix.identity().perspective((float) Math.toRadians(fovy), aspect, zNear, zFar);
- glCtx.gluMatrix.get(0, glCtx.gluBuffer);
- GLStateManager.glMultMatrix(glCtx.gluBuffer);
- }
-
- public static void gluLookAt(float eyex, float eyey, float eyez, float centerx, float centery, float centerz, float upx, float upy, float upz) {
- final GLContextState glCtx = ctx();
- glCtx.gluMatrix.identity().lookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz);
- glCtx.gluMatrix.get(0, glCtx.gluBuffer);
- GLStateManager.glMultMatrix(glCtx.gluBuffer);
- }
-
- public static void gluOrtho2D(float left, float right, float bottom, float top) {
- GLStateManager.glOrtho(left, right, bottom, top, -1.0, 1.0);
- }
-
- public static void gluPickMatrix(float x, float y, float deltaX, float deltaY, IntBuffer viewport) {
- rejectExitCapture();
- if (deltaX <= 0 || deltaY <= 0) return;
- GLStateManager.glTranslatef(
- (viewport.get(viewport.position() + 2) - 2 * (x - viewport.get(viewport.position() + 0))) / deltaX,
- (viewport.get(viewport.position() + 3) - 2 * (y - viewport.get(viewport.position() + 1))) / deltaY,
- 0);
- GLStateManager.glScalef(viewport.get(viewport.position() + 2) / deltaX, viewport.get(viewport.position() + 3) / deltaY, 1.0f);
- }
-
- public static int gluBuild2DMipmaps(int target, int components, int width, int height, int format, int type, ByteBuffer data) {
- if (width < 1 || height < 1) return GLU.GLU_INVALID_VALUE;
- glTexImage2D(target, 0, components, width, height, 0, format, type, data);
- glGenerateMipmap(target);
- return 0;
- }
-
- public static String gluErrorString(int errorCode) {
- return switch (errorCode) {
- case GLU.GLU_INVALID_ENUM -> "Invalid enum (glu)";
- case GLU.GLU_INVALID_VALUE -> "Invalid value (glu)";
- case GLU.GLU_OUT_OF_MEMORY -> "Out of memory (glu)";
- case GL11.GL_NO_ERROR -> "No error";
- case GL11.GL_INVALID_ENUM -> "Invalid enum";
- case GL11.GL_INVALID_VALUE -> "Invalid value";
- case GL11.GL_INVALID_OPERATION -> "Invalid operation";
- case GL11.GL_OUT_OF_MEMORY -> "Out of memory";
- default -> "Unknown error: " + errorCode;
- };
- }
-
- public static boolean gluUnProject(float winx, float winy, float winz, FloatBuffer modelMatrix, FloatBuffer projMatrix, IntBuffer viewport, FloatBuffer obj_pos) {
- final GLContextState glCtx = ctx();
- glCtx.gluMatrix.set(projMatrix).mul(glCtx.gluMatrix2.set(modelMatrix));
- if (Math.abs(glCtx.gluMatrix.determinant()) < 1.0e-10f) return false;
- glCtx.gluMatrix.invert(glCtx.gluMatrix);
-
- float ndcX = (winx - viewport.get(viewport.position())) / viewport.get(viewport.position() + 2) * 2.0f - 1.0f;
- float ndcY = (winy - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3) * 2.0f - 1.0f;
- float ndcZ = winz * 2.0f - 1.0f;
-
- glCtx.gluVec4.set(ndcX, ndcY, ndcZ, 1.0f);
- glCtx.gluMatrix.transform(glCtx.gluVec4);
- if (glCtx.gluVec4.w == 0.0f) return false;
-
- float invW = 1.0f / glCtx.gluVec4.w;
- obj_pos.put(obj_pos.position(), glCtx.gluVec4.x * invW);
- obj_pos.put(obj_pos.position() + 1, glCtx.gluVec4.y * invW);
- obj_pos.put(obj_pos.position() + 2, glCtx.gluVec4.z * invW);
- return true;
- }
-
- public static void glViewport(int x, int y, int width, int height) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordViewport(x, y, width, height);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- RENDER_BACKEND.viewport(x, y, width, height);
- // Only update cached state when caching is enabled
- if (isCachingEnabled()) {
- mod(ctx().viewportState).setViewPort(x, y, width, height);
- }
- }
-
- public static int getActiveTextureUnit() {
- return ctx().activeTextureUnit.getValue();
- }
-
- public static int getListMode() {
- return DisplayListManager.getListMode();
- }
-
- private static boolean handleRemovedTexParam(int target, int pname, int value) {
- if (pname == GL14.GL_GENERATE_MIPMAP) {
- if (target == GL11.GL_TEXTURE_2D) {
- final TextureInfo info = getBoundTextureInfo();
- if (info != null) info.setGenerateMipmap(value != 0);
- }
- return true;
- }
- return false;
- }
-
- private static void maybeGenerateMipmap(int target, int level) {
- if (target != GL11.GL_TEXTURE_2D) return;
- final TextureInfo info = getBoundTextureInfo();
- if (info != null && info.isGenerateMipmap() && level == info.getBaseLevel() && level < info.getMaxLevel()) {
- RENDER_BACKEND.generateMipmap(target);
- }
- }
-
- public static boolean updateTexParameteriCache(int target, int texture, int pname, int param) {
- rejectExitCapture();
- if (target != GL11.GL_TEXTURE_2D) {
- return true;
- }
- return updateTexParameteriCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param);
- }
-
- static boolean updateTexParameteriCache(TextureInfo info, int pname, int param) {
- if (info == null) {
- return true;
- }
- switch (pname) {
- case GL11.GL_TEXTURE_MIN_FILTER -> {
- if (info.getMinFilter() == param && isCachingEnabled()) return false;
- info.setMinFilter(param);
- }
- case GL11.GL_TEXTURE_MAG_FILTER -> {
- if (info.getMagFilter() == param && isCachingEnabled()) return false;
- info.setMagFilter(param);
- }
- case GL11.GL_TEXTURE_WRAP_S -> {
- if (info.getWrapS() == param && isCachingEnabled()) return false;
- info.setWrapS(param);
- }
- case GL11.GL_TEXTURE_WRAP_T -> {
- if (info.getWrapT() == param && isCachingEnabled()) return false;
- info.setWrapT(param);
- }
- case GL12.GL_TEXTURE_BASE_LEVEL -> {
- if (info.getBaseLevel() == param && isCachingEnabled()) return false;
- info.setBaseLevel(param);
- }
- case GL12.GL_TEXTURE_MAX_LEVEL -> {
- if (info.getMaxLevel() == param && isCachingEnabled()) return false;
- info.setMaxLevel(param);
- }
- case GL12.GL_TEXTURE_MIN_LOD -> {
- if (info.getMinLod() == param && isCachingEnabled()) return false;
- info.setMinLod(param);
- }
- case GL12.GL_TEXTURE_MAX_LOD -> {
- if (info.getMaxLod() == param && isCachingEnabled()) return false;
- info.setMaxLod(param);
- }
- }
- return true;
- }
-
- public static void glTexParameter(int target, int pname, IntBuffer params) {
- rejectExitCapture();
- if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? params.get(params.position()) : 0)) return;
- if (params.remaining() >= 1) {
- final int val = params.get(params.position());
- final int remapped = remapTexClamp(pname, val);
- if (remapped != val) params.put(params.position(), remapped);
- if (target == GL11.GL_TEXTURE_2D) {
- updateTexParameteriCache(getBoundTextureInfo(), pname, remapped);
- }
- }
- RENDER_BACKEND.texParameteriv(target, pname, params);
- }
-
- public static void glTexParameter(int target, int pname, FloatBuffer params) {
- rejectExitCapture();
- if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? (int) params.get(params.position()) : 0)) return;
- if (params.remaining() >= 1) {
- final float val = params.get(params.position());
- final float remapped = remapTexClamp(pname, val);
- if (remapped != val) params.put(params.position(), remapped);
- if (target == GL11.GL_TEXTURE_2D) {
- updateTexParameterfCache(getBoundTextureInfo(), pname, remapped);
- }
- }
- RENDER_BACKEND.texParameterfv(target, pname, params);
- }
-
- public static void glTexParameteri(int target, int pname, int param) {
- rejectExitCapture();
- if (handleRemovedTexParam(target, pname, param)) return;
- param = remapTexClamp(pname, param);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordTexParameteri(target, pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (getActiveTextureUnit() != 0) beforeUncapturedStateChange();
- if (target != GL11.GL_TEXTURE_2D) {
- RENDER_BACKEND.texParameteri(target, pname, param);
- return;
- }
- if (!updateTexParameteriCache(getBoundTextureInfo(), pname, param)) return;
-
- RENDER_BACKEND.texParameteri(target, pname, param);
- }
-
- public static boolean updateTexParameterfCache(int target, int texture, int pname, float param) {
- rejectExitCapture();
- if (target != GL11.GL_TEXTURE_2D) {
- return true;
- }
- return updateTexParameterfCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param);
- }
-
- static boolean updateTexParameterfCache(TextureInfo info, int pname, float param) {
- if (info == null) {
- return true;
- }
- switch (pname) {
- case GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_TEXTURE_WRAP_S, GL11.GL_TEXTURE_WRAP_T -> {
- return updateTexParameteriCache(info, pname, (int) param);
- }
- case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> {
- if (info.getMaxAnisotropy() == param && isCachingEnabled()) return false;
- info.setMaxAnisotropy(param);
- }
- case GL14.GL_TEXTURE_LOD_BIAS -> {
- if (info.getLodBias() == param && isCachingEnabled()) return false;
- info.setLodBias(param);
- }
- }
- return true;
- }
-
- public static void glTexParameterf(int target, int pname, float param) {
- rejectExitCapture();
- if (handleRemovedTexParam(target, pname, param > 0 ? (int) (param + 0.5f) : (int) (param - 0.5f))) return;
- param = remapTexClamp(pname, param);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordTexParameterf(target, pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (getActiveTextureUnit() != 0) beforeUncapturedStateChange();
- if (target != GL11.GL_TEXTURE_2D) {
- RENDER_BACKEND.texParameterf(target, pname, param);
- return;
- }
- if (!updateTexParameterfCache(getBoundTextureInfo(), pname, param)) return;
-
- RENDER_BACKEND.texParameterf(target, pname, param);
- }
-
- public static final long TEX_PARAM_MISS = Long.MIN_VALUE;
-
- public static long lookupTexParameteri(TextureInfo info, int pname) {
- if (info == null) {
- if (isRecordingDisplayList()) {
- throw new IllegalStateException(
- "glGetTexParameteri called during display list recording with no cached TextureInfo. " +
- "Cannot query OpenGL state during compilation!");
- }
- return TEX_PARAM_MISS;
- }
- return switch (pname) {
- case GL11.GL_TEXTURE_MIN_FILTER -> info.getMinFilter();
- case GL11.GL_TEXTURE_MAG_FILTER -> info.getMagFilter();
- case GL11.GL_TEXTURE_WRAP_S -> info.getWrapS();
- case GL11.GL_TEXTURE_WRAP_T -> info.getWrapT();
- case GL12.GL_TEXTURE_BASE_LEVEL -> info.getBaseLevel();
- case GL12.GL_TEXTURE_MAX_LEVEL -> info.getMaxLevel();
- case GL12.GL_TEXTURE_MIN_LOD -> info.getMinLod();
- case GL12.GL_TEXTURE_MAX_LOD -> info.getMaxLod();
- case GL14.GL_GENERATE_MIPMAP -> info.isGenerateMipmap() ? GL11.GL_TRUE : GL11.GL_FALSE;
- default -> {
- if (isRecordingDisplayList()) {
- throw new IllegalStateException(String.format(
- "glGetTexParameteri called during display list recording with uncached pname 0x%s. " +
- "Cannot query OpenGL state during compilation!", Integer.toHexString(pname)));
- }
- yield TEX_PARAM_MISS;
- }
- };
- }
-
- public static int glGetTexParameteri(int target, int pname) {
- rejectExitCapture();
- if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) {
- return RENDER_BACKEND.getTexParameteri(target, pname);
- }
- final long v = lookupTexParameteri(getBoundTextureInfo(), pname);
- return v != TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTexParameteri(target, pname);
- }
-
- public static float glGetTexParameterf(int target, int pname) {
- rejectExitCapture();
- if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) {
- return RENDER_BACKEND.getTexParameterf(target, pname);
- }
- final TextureInfo info = getBoundTextureInfo();
- if(info == null) {
- if (isRecordingDisplayList()) {
- throw new IllegalStateException(
- "glGetTexParameterf called during display list recording with no cached TextureInfo. " +
- "Cannot query OpenGL state during compilation!");
- }
- return RENDER_BACKEND.getTexParameterf(target, pname);
- }
-
- return switch (pname) {
- case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> info.getMaxAnisotropy();
- case GL14.GL_TEXTURE_LOD_BIAS -> info.getLodBias();
- default -> {
- if (isRecordingDisplayList()) {
- throw new IllegalStateException(String.format(
- "glGetTexParameterf called during display list recording with uncached pname 0x%s. " +
- "Cannot query OpenGL state during compilation!", Integer.toHexString(pname)));
- }
- yield RENDER_BACKEND.getTexParameterf(target, pname);
- }
- };
- }
-
- private static int mipLevelSize(int base, int level) {
- if (base <= 0 || level < 0 || level >= Integer.SIZE - 1) return 1;
- return Math.max(base >> level, 1);
- }
-
- public static int glGetTexLevelParameteri(int target, int level, int pname) {
- rejectExitCapture();
- if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) {
- return RENDER_BACKEND.getTexLevelParameteri(target, level, pname);
- }
- final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState());
- if (info == null) {
- if (isRecordingDisplayList()) {
- throw new IllegalStateException(String.format(
- "glGetTexLevelParameteri called during display list recording with no cached TextureInfo for texture %d. " +
- "Cannot query OpenGL state during compilation!", getBoundTextureForServerState()));
- }
- return RENDER_BACKEND.getTexLevelParameteri(target, level, pname);
- }
- return switch (pname) {
- case GL11.GL_TEXTURE_WIDTH -> mipLevelSize(info.getWidth(), level);
- case GL11.GL_TEXTURE_HEIGHT -> mipLevelSize(info.getHeight(), level);
- case GL11.GL_TEXTURE_INTERNAL_FORMAT -> {
- if (info.needsInternalFormatResolve() && isRecordingDisplayList()) {
- throw new IllegalStateException(String.format("glGetTexLevelParameteri(GL_TEXTURE_INTERNAL_FORMAT) needs to resolve a generic compressed format for texture %d during display list recording", getBoundTextureForServerState()));
- }
- yield info.getResolvedInternalFormat();
- }
- default -> {
- if (isRecordingDisplayList()) {
- throw new IllegalStateException(String.format(
- "glGetTexLevelParameteri called during display list recording with uncached pname 0x%s for texture %d. " +
- "Cannot query OpenGL state during compilation!", Integer.toHexString(pname), getBoundTextureForServerState()));
- }
- yield RENDER_BACKEND.getTexLevelParameteri(target, level, pname);
- }
- };
- }
-
- public static void glGetTexImage(int target, int level, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- if (RenderSystem.isGLES()) {
- getTexImageViaFboReadPixels(target, level, format, type, pixels);
- return;
- }
- suspendPixelPackBuffer();
- RENDER_BACKEND.getTexImage(target, level, format, type, pixels);
- restorePixelPackBuffer();
- }
- public static void glGetTexImage(int target, int level, int format, int type, IntBuffer pixels) {
- rejectExitCapture();
- if (RenderSystem.isGLES()) {
- getTexImageViaFboReadPixels(target, level, format, type, pixels);
- return;
- }
- suspendPixelPackBuffer();
- RENDER_BACKEND.getTexImage(target, level, format, type, pixels);
- restorePixelPackBuffer();
- }
-
- private static void getTexImageViaFboReadPixels(int target, int level, int format, int type, Buffer pixels) {
- if (target != GL11.GL_TEXTURE_2D) {
- LOGGER.warn("glGetTexImage ES: unsupported target 0x{}", Integer.toHexString(target));
- return;
- }
- final int texId = getBoundTextureForServerState();
- if (texId == 0) return;
- final int width = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_WIDTH);
- final int height = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_HEIGHT);
- if (width <= 0 || height <= 0) return;
-
- final int prevReadFb = RENDER_BACKEND.getInteger(GL30.GL_READ_FRAMEBUFFER_BINDING);
- final int fbo = RENDER_BACKEND.genFramebuffers();
- try {
- RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo);
- RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, target, texId, level);
- final int status = RENDER_BACKEND.checkFramebufferStatus(GL30.GL_READ_FRAMEBUFFER);
- if (status != GL30.GL_FRAMEBUFFER_COMPLETE) {
- LOGGER.warn("glGetTexImage ES: FBO incomplete (0x{})", Integer.toHexString(status));
- return;
- }
- final int esType = remapPixelTypeForGLES(format, type);
- final boolean bgra = format == GL12.GL_BGRA;
- final int esFormat = bgra ? GL11.GL_RGBA : format;
- suspendPixelPackBuffer();
- try {
- if (pixels instanceof ByteBuffer bb) {
- RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, bb);
- } else if (pixels instanceof IntBuffer ib) {
- RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, ib);
- }
- if (bgra) swapRedBlueInPlace(pixels);
- } finally {
- restorePixelPackBuffer();
- }
- } finally {
- RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, prevReadFb);
- RENDER_BACKEND.deleteFramebuffers(fbo);
- }
- }
-
- private static void swapRedBlueInPlace(Buffer pixels) {
- if (pixels instanceof ByteBuffer bb) {
- final int p = bb.position();
- final int lim = bb.limit();
- for (int i = p; i + 3 < lim; i += 4) {
- final byte r = bb.get(i);
- bb.put(i, bb.get(i + 2));
- bb.put(i + 2, r);
- }
- } else if (pixels instanceof IntBuffer ib) {
- final int p = ib.position();
- final int lim = ib.limit();
- for (int i = p; i < lim; i++) {
- final int w = ib.get(i);
- ib.put(i, (w & 0xFF00FF00) | ((w & 0xFF) << 16) | ((w >> 16) & 0xFF));
- }
- }
- }
-
- public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- type = remapPixelTypeForGLES(format, type);
- suspendPixelPackBuffer();
- RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
- restorePixelPackBuffer();
- }
- public static void glReadPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) {
- rejectExitCapture();
- type = remapPixelTypeForGLES(format, type);
- suspendPixelPackBuffer();
- RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
- restorePixelPackBuffer();
- }
- public static void glReadPixels(int x, int y, int width, int height, int format, int type, IntBuffer pixels) {
- rejectExitCapture();
- type = remapPixelTypeForGLES(format, type);
- suspendPixelPackBuffer();
- RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
- restorePixelPackBuffer();
- }
- public static void glTexStorage2D(int target, int levels, int internalFormat, int width, int height) {
- rejectExitCapture();
- RENDER_BACKEND.texStorage2D(target, levels, internalFormat, width, height);
- TextureInfoCache.INSTANCE.onTexStorage2D(target, internalFormat, width, height);
- }
- public static void glClearTexImage(int texture, int level, int format, int type, ByteBuffer data) {
- rejectExitCapture();
- RENDER_BACKEND.clearTexImage(texture, level, format, type);
- if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture);
- }
-
- public static int glGenSamplers() {
- requireContext("glGenSamplers");
- return RENDER_BACKEND.genSamplers();
- }
-
- public static void glGenSamplers(IntBuffer samplers) {
- requireContext("glGenSamplers");
- for (int i = samplers.position(); i < samplers.limit(); i++) samplers.put(i, RENDER_BACKEND.genSamplers());
- }
-
- public static void glGenSamplers(int[] samplers) {
- requireContext("glGenSamplers");
- for (int i = 0; i < samplers.length; i++) samplers[i] = RENDER_BACKEND.genSamplers();
- }
-
- public static void glDeleteSamplers(int sampler) {
- rejectExitCapture();
- if (sampler == 0) return;
- ctx().samplerUnits.unbindEverywhere(sampler);
- RENDER_BACKEND.deleteSamplers(sampler);
- }
-
- public static void glDeleteSamplers(IntBuffer samplers) {
- for (int i = samplers.position(); i < samplers.limit(); i++) glDeleteSamplers(samplers.get(i));
- }
-
- public static void glDeleteSamplers(int[] samplers) {
- for (int sampler : samplers) glDeleteSamplers(sampler);
- }
-
- public static void glBindSampler(int unit, int sampler) {
- bindSampler(ctx().samplerUnits, unit, sampler);
- }
-
- private static void bindSampler(SamplerUnitArray units, int unit, int sampler) {
- rejectExitCapture();
- if (isCachingEnabled() && unit >= 0 && unit < units.size() && units.get(unit) == sampler) return;
- beforeUncapturedStateChange();
- if (!units.set(unit, sampler)) {
- warnOnce("samplerUnitRange", "glBindSampler unit {} exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS {}", unit, units.size());
- }
- RENDER_BACKEND.bindSampler(unit, sampler);
- }
-
- public static void unbindAllSamplers() {
- final SamplerUnitArray units = ctx().samplerUnits;
- if (units.getHighestBoundUnit() < 0) return;
- beforeUncapturedStateChange();
- for (int unit = units.getHighestBoundUnit(); unit >= 0; unit = units.getHighestBoundUnit()) {
- units.set(unit, 0);
- RENDER_BACKEND.bindSampler(unit, 0);
- }
- }
-
- public static void glBindSamplers(int first, int count, IntBuffer samplers) {
- if (samplers == null) {
- for (int i = 0; i < count; i++) glBindSampler(first + i, 0);
- return;
- }
- requireRemaining(samplers, count);
- final int base = samplers.position();
- for (int i = 0; i < count; i++) glBindSampler(first + i, samplers.get(base + i));
- }
-
- private static void requireRemaining(IntBuffer buffer, int count) {
- if (buffer.remaining() < count) throw new IllegalArgumentException("Number of remaining buffer elements is " + buffer.remaining() + ", must be at least " + count);
- }
-
- public static void glBindSamplers(int first, IntBuffer samplers) {
- if (samplers != null) glBindSamplers(first, samplers.remaining(), samplers);
- }
-
- public static void glBindSamplers(int first, int[] samplers) {
- if (samplers == null) return;
- for (int i = 0; i < samplers.length; i++) glBindSampler(first + i, samplers[i]);
- }
-
- public static int getSamplerBinding(int unit) { return ctx().samplerUnits.get(unit); }
- public static int getSamplerUnitCount() { return ctx().samplerUnits.size(); }
- public static void glSamplerParameteri(int sampler, int pname, int param) { rejectExitCapture(); RENDER_BACKEND.samplerParameteri(sampler, pname, param); }
- public static void glSamplerParameterf(int sampler, int pname, float param) { rejectExitCapture(); RENDER_BACKEND.samplerParameterf(sampler, pname, param); }
-
- private static boolean glMaterialFront(int pname, FloatBuffer params) {
- final GLContextState glCtx = ctx();
- mod(glCtx.frontMaterial);
- return switch (pname) {
- case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params);
- case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params);
- case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params);
- case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params);
- case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params);
- case GL11.GL_AMBIENT_AND_DIFFUSE -> {
- final boolean a = glCtx.frontMaterial.setAmbient(params);
- final boolean d = glCtx.frontMaterial.setDiffuse(params);
- yield a || d;
- }
- case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params);
- default -> false;
- };
- }
-
- private static boolean glMaterialBack(int pname, FloatBuffer params) {
- final GLContextState glCtx = ctx();
- mod(glCtx.backMaterial);
- return switch (pname) {
- case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params);
- case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params);
- case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params);
- case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params);
- case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params);
- case GL11.GL_AMBIENT_AND_DIFFUSE -> {
- final boolean a = glCtx.backMaterial.setAmbient(params);
- final boolean d = glCtx.backMaterial.setDiffuse(params);
- yield a || d;
- }
- case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params);
- default -> false;
- };
- }
-
- private static boolean glMaterialFront(int pname, IntBuffer params) {
- final GLContextState glCtx = ctx();
- mod(glCtx.frontMaterial);
- return switch (pname) {
- case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params);
- case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params);
- case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params);
- case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params);
- case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params);
- case GL11.GL_AMBIENT_AND_DIFFUSE -> {
- final boolean a = glCtx.frontMaterial.setAmbient(params);
- final boolean d = glCtx.frontMaterial.setDiffuse(params);
- yield a || d;
- }
- case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params);
- default -> false;
- };
- }
-
- private static boolean glMaterialBack(int pname, IntBuffer params) {
- final GLContextState glCtx = ctx();
- mod(glCtx.backMaterial);
- return switch (pname) {
- case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params);
- case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params);
- case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params);
- case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params);
- case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params);
- case GL11.GL_AMBIENT_AND_DIFFUSE -> {
- final boolean a = glCtx.backMaterial.setAmbient(params);
- final boolean d = glCtx.backMaterial.setDiffuse(params);
- yield a || d;
- }
- case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params);
- default -> false;
- };
- }
-
- public static void glMaterial(int face, int pname, FloatBuffer params) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.material(face, pname);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordMaterial(face, pname, params);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- boolean changed = false;
- if (face == GL11.GL_FRONT) {
- changed = glMaterialFront(pname, params);
- } else if (face == GL11.GL_BACK) {
- changed = glMaterialBack(pname, params);
- } else if (face == GL11.GL_FRONT_AND_BACK) {
- final boolean f = glMaterialFront(pname, params);
- final boolean b = glMaterialBack(pname, params);
- changed = f || b;
- } else {
- throw new RuntimeException("Unsupported face value for glMaterial: " + face);
- }
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glMaterial(int face, int pname, IntBuffer params) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.material(face, pname);
- // For IntBuffer version, we need to convert to float for recording
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- // Convert int params to float for recording
- final float[] floatParams = new float[params.remaining()];
- params.mark();
- for (int i = 0; i < floatParams.length; i++) {
- floatParams[i] = GLStateManager.i2f(params.get());
- }
- params.reset();
- DisplayListManager.recordMaterial(face, pname, FloatBuffer.wrap(floatParams));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- boolean changed = false;
- if (face == GL11.GL_FRONT) {
- changed = glMaterialFront(pname, params);
- } else if (face == GL11.GL_BACK) {
- changed = glMaterialBack(pname, params);
- } else if (face == GL11.GL_FRONT_AND_BACK) {
- final boolean f = glMaterialFront(pname, params);
- final boolean b = glMaterialBack(pname, params);
- changed = f || b;
- } else {
- throw new RuntimeException("Unsupported face value for glMaterial: " + face);
- }
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glMaterialf(int face, int pname, float val) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordMaterialf(face, pname, val);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- if (pname != GL11.GL_SHININESS) {
- // it is only valid to call glMaterialf for the GL_SHININESS parameter
- return;
- }
-
- boolean changed = false;
- if (face == GL11.GL_FRONT) {
- mod(glCtx.frontMaterial);
- changed = glCtx.frontMaterial.setShininess(val);
- } else if (face == GL11.GL_BACK) {
- mod(glCtx.backMaterial);
- changed = glCtx.backMaterial.setShininess(val);
- } else if (face == GL11.GL_FRONT_AND_BACK) {
- mod(glCtx.frontMaterial);
- mod(glCtx.backMaterial);
- final boolean f = glCtx.frontMaterial.setShininess(val);
- final boolean b = glCtx.backMaterial.setShininess(val);
- changed = f || b;
- } else {
- throw new RuntimeException("Unsupported face value for glMaterial: " + face);
- }
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glMateriali(int face, int pname, int val) {
- // This will end up no-opping if pname != GL_SHININESS, it is invalid to call this with another pname
- // Command recording happens in glMaterialf
- glMaterialf(face, pname, (float) val);
- }
-
- public static void glLight(int light, int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLight(light, pname, params);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
- mod(lightState);
- final boolean changed = switch (pname) {
- case GL11.GL_AMBIENT -> lightState.setAmbient(params);
- case GL11.GL_DIFFUSE -> lightState.setDiffuse(params);
- case GL11.GL_SPECULAR -> lightState.setSpecular(params);
- case GL11.GL_POSITION -> lightState.setPosition(params);
- case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params);
- case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params);
- case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params);
- case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params);
- case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params);
- case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glLight(int light, int pname, IntBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- // For IntBuffer version, we need to convert to float for recording
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- // Convert int params to float for recording
- final float[] floatParams = new float[params.remaining()];
- params.mark();
- for (int i = 0; i < floatParams.length; i++) {
- floatParams[i] = GLStateManager.i2f(params.get());
- }
- params.reset();
- DisplayListManager.recordLight(light, pname, FloatBuffer.wrap(floatParams));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
- mod(lightState);
- final boolean changed = switch (pname) {
- case GL11.GL_AMBIENT -> lightState.setAmbient(params);
- case GL11.GL_DIFFUSE -> lightState.setDiffuse(params);
- case GL11.GL_SPECULAR -> lightState.setSpecular(params);
- case GL11.GL_POSITION -> lightState.setPosition(params);
- case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params);
- case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params);
- case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params);
- case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params);
- case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params);
- case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glLightf(int light, int pname, float param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLightf(light, pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
- mod(lightState);
- final boolean changed = switch (pname) {
- case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param);
- case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param);
- case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param);
- case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param);
- case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glLighti(int light, int pname, int param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLighti(light, pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0];
- mod(lightState);
- final boolean changed = switch (pname) {
- case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param);
- case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param);
- case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param);
- case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param);
- case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glLightModel(int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLightModel(pname, params);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- mod(glCtx.lightModel);
- final boolean changed = switch (pname) {
- case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params);
- case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params);
- case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glLightModel(int pname, IntBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- // For IntBuffer version, we need to convert to float for recording
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- // Convert int params to float for recording
- final float[] floatParams = new float[params.remaining()];
- params.mark();
- for (int i = 0; i < floatParams.length; i++) {
- floatParams[i] = GLStateManager.i2f(params.get());
- }
- params.reset();
- DisplayListManager.recordLightModel(pname, FloatBuffer.wrap(floatParams));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- mod(glCtx.lightModel);
- final boolean changed = switch (pname) {
- case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params);
- case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(params);
- case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params);
- case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static void glLightModelf(int pname, float param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLightModelf(pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
-
- if (isCachingEnabled()) {
- mod(glCtx.lightModel);
- final boolean changed = switch (pname) {
- case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param);
- case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
- }
-
- public static void glLightModeli(int pname, int param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLightModeli(pname, param);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
-
- if (isCachingEnabled()) {
- mod(glCtx.lightModel);
- final boolean changed = switch (pname) {
- case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(param);
- case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param);
- case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param);
- default -> false;
- };
- if (changed) glCtx.lightingGeneration++;
- }
- }
-
- public static void glColorMaterial(int face, int mode) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.COLOR_MATERIAL_SETTINGS);
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- DisplayListManager.recordColorMaterial(face, mode);
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.colorMaterialFace.getValue() != face || glCtx.colorMaterialParameter.getValue() != mode) {
- mod(glCtx.colorMaterialFace).setValue(face);
- mod(glCtx.colorMaterialParameter).setValue(mode);
- glCtx.lightingGeneration++;
- }
- }
-
- public static void glDepthRange(double near, double far) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled() || glCtx.viewportState.depthRangeNear != near || glCtx.viewportState.depthRangeFar != far) beforeUncapturedStateChange();
- if (isCachingEnabled()) mod(glCtx.viewportState).setDepthRange(near, far);
- RENDER_BACKEND.depthRange(near, far);
- }
-
- public static void glUseProgram(int program) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordUseProgram(program);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
-
- final ShaderManager ffp = glCtx.ffp;
- if (program == 0 && ffp.isEnabled()) {
- final int prev = glCtx.activeProgram;
- final boolean changed = prev != 0;
- if (changed) glCtx.programGeneration++;
- glCtx.activeProgram = 0; // Track that FFP was requested
- if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
- GLSMHooks.programChangeEvent.previousProgram = prev;
- GLSMHooks.programChangeEvent.newProgram = 0;
- GLSMHooks.programChangeEvent.postBind = false;
- GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
- }
- ffp.activate();
- if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
- GLSMHooks.programChangeEvent.previousProgram = prev;
- GLSMHooks.programChangeEvent.newProgram = 0;
- GLSMHooks.programChangeEvent.postBind = true;
- GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
- }
- return;
- }
-
- // Non-zero program or FFP emulation not enabled
- if (program == 0) {
- warnOnce("useprogram-zero-ffp-disabled",
- "[FFP] glUseProgram(0) reached the driver because emulation is disabled");
- }
- if (ffp.isActive()) {
- ffp.deactivate();
- }
-
- final boolean caching = isCachingEnabled();
- if (!caching || program != glCtx.activeProgram) {
- if (Tracy.ENABLED) programSwitches++;
- glCtx.programGeneration++;
- final int prev = glCtx.activeProgram;
- glCtx.activeProgram = program;
- if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
- GLSMHooks.programChangeEvent.previousProgram = prev;
- GLSMHooks.programChangeEvent.newProgram = program;
- GLSMHooks.programChangeEvent.postBind = false;
- GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
- }
- if (initConfig != null && initConfig.isLwjglDebug()) {
- final String programName = GLDebug.getObjectLabel(KHRDebug.GL_PROGRAM, program);
- GLDebug.debugMessage("Activating Program - " + program + ":" + programName);
- }
- RENDER_BACKEND.useProgram(program);
- if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
- GLSMHooks.programChangeEvent.previousProgram = prev;
- GLSMHooks.programChangeEvent.newProgram = program;
- GLSMHooks.programChangeEvent.postBind = true;
- GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
- }
- }
- }
-
- // Missing GL commands from Mesa cross-check
- public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexImage1D");
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage1D(target, level, internalformat, width, border, format, type, pixels);
- restorePixelUnpackBuffer();
- }
-
- public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexImage3D");
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
- restorePixelUnpackBuffer();
- }
-
- public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) {
- rejectExitCapture();
- internalformat = changeFormatIfDeprecated(internalformat);
- type = remapPixelTypeForGLES(format, type);
- type = remapTypeForRemappedInternalFormat(internalformat, type);
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexImage3D");
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
- restorePixelUnpackBuffer();
- }
-
- public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexSubImage1D");
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texSubImage1D(target, level, xoffset, width, format, type, pixels);
- restorePixelUnpackBuffer();
- }
-
- public static void glLineWidth(float width) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLineWidth(width);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.lineState.getWidth() != width) {
- mod(glCtx.lineState).setWidth(width);
- RENDER_BACKEND.lineWidth(Math.clamp(width, lineWidthMin, lineWidthMax));
- }
- }
-
- public static boolean ffpWidensLineQuads() {
- final GLContextState glCtx = ctx();
- return wideLineEmulationEnabled && glCtx.activeProgram == 0 && glCtx.lineState.getWidth() > 1.0f
- && !DisplayListManager.isRecording();
- }
-
- private static boolean widensLineDraw(int mode, int count) {
- return LineQuads.isLineMode(mode) && LineQuads.segmentCount(mode, count) > 0 && ffpWidensLineQuads();
- }
-
- private static void drawLinesAsQuads(GLContextState glCtx, DirectTessellator lines) {
- if (lines == null) return;
- if (readsBufferObject(glCtx.vaos)) {
- warnOnce("line-readback", "Wide GL_LINES drawn from a buffer object; widening them reads the buffer back, which waits for the GPU");
- }
- final int vao = glCtx.boundVAO;
- final int vbo = glCtx.boundVBO;
- TessellatorStreamingDrawer.drawDirect(lines);
- glBindVertexArray(vao);
- glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- }
-
- private static DirectTessellator lineElementsFromBuffer(GLContextState glCtx, int mode, int count, int type, long offset) {
- if (glCtx.vaos.boundEBO == 0) return null;
- final ByteBuffer indices = MemoryUtilities.memAlloc(count * GLTypes.sizeBytes(type));
- try {
- glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, offset, indices);
- return ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress0(indices));
- } finally {
- MemoryUtilities.memFree(indices);
- }
- }
-
- private static void warnIfInstancedWideLines(int mode) {
- if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) {
- warnOnce("instanced-wide-lines", "Instanced wide GL_LINES are not widened and draw 1 px wide");
- }
- }
-
- private static boolean readsBufferObject(VAOManager vaos) {
- for (int i = 0; i < VAOManager.MAX_ATTRIBS; i++) {
- final VAOManager.Attrib attrib = vaos.attrib(i);
- if (attrib != null && attrib.enabled && attrib.vboId != 0) return true;
- }
- return false;
- }
-
- private static void prepareLineEmulation(GLContextState glCtx, int drawMode) {
- setLineStippleActive(glCtx, (LineQuads.isLineMode(drawMode) || glCtx.lineQuadsActive) && glCtx.lineStippleState.isEnabled());
- }
-
- private static void setLineStippleActive(GLContextState glCtx, boolean active) {
- if (glCtx.lineStippleActive == active) return;
- glCtx.lineStippleActive = active;
- RENDER_BACKEND.provokingVertex(active ? GL32.GL_FIRST_VERTEX_CONVENTION : GL32.GL_LAST_VERTEX_CONVENTION);
- }
-
- public static void glFlush() {
- rejectExitCapture();
- RENDER_BACKEND.flush();
- }
-
- public static void glFinish() {
- rejectExitCapture();
- RENDER_BACKEND.finish();
- }
-
public static void setVSyncEnabled(boolean enabled) {
RENDER_BACKEND.setVSyncEnabled(enabled);
}
@@ -7157,1297 +681,6 @@ public class GLStateManager {
RENDER_BACKEND.pumpDisplayMessages();
}
- public static int glGetError() {
- rejectExitCapture();
- if (!RENDER_BACKEND.hasContext()) return 0;
- if (initConfig.isNoErrorChecks()) return 0;
- return RENDER_BACKEND.getError();
- }
-
- public static void checkGLError() {
- final int error = glGetError();
- if (error != GL11.GL_NO_ERROR) GLErrorReporter.reportError(error);
- }
-
- public static String glGetString(int pname) {
- rejectExitCapture();
- if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context";
- return RENDER_BACKEND.getString(pname);
- }
-
- public static String glGetStringi(int name, int index) {
- rejectExitCapture();
- if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context";
- return RENDER_BACKEND.getStringi(name, index);
- }
-
- public static void glShaderSource(int shader, CharSequence source) {
- rejectExitCapture();
- String src = source.toString();
- // Always rename reserved words for the target GLSL version (e.g. 'sampler' at 460)
- src = GlslTransformUtils.renameReservedWords(src, RENDER_BACKEND.getMinGLSLVersion());
- if (ShaderManager.isEnabled()) {
- final int shaderType = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE);
- src = CompatShaderTransformer.transform(src, shaderType, shaderType == GL20.GL_FRAGMENT_SHADER);
- }
- RENDER_BACKEND.shaderSource(shader, src);
- }
-
- public static void nglShaderSource(int shader, int count, long strings, long lengths) {
- rejectExitCapture();
- if (count <= 0) return;
- final CharSequence source;
- if (count == 1) {
- source = decodeShaderSourceString(strings, lengths, 0);
- } else {
- final StringBuilder sb = new StringBuilder();
- for (int i = 0; i < count; i++) sb.append(decodeShaderSourceString(strings, lengths, i));
- source = sb.toString();
- }
- glShaderSource(shader, source);
- }
-
- private static String decodeShaderSourceString(long strings, long lengths, int i) {
- final long strAddr = MemoryUtilities.memGetAddress(strings + (long) i * Pointer.POINTER_SIZE);
- final int len = lengths == MemoryUtilities.NULL ? -1 : MemoryUtilities.memGetInt(lengths + (long) i * 4);
- return len < 0 ? MemoryUtilities.memUTF8(strAddr) : MemoryUtilities.memUTF8(strAddr, len);
- }
-
- public static void glShaderSource(int shader, ByteBuffer source) {
- final byte[] bytes = new byte[source.remaining()];
- final int pos = source.position();
- source.get(bytes);
- source.position(pos);
- glShaderSource(shader, new String(bytes, StandardCharsets.UTF_8));
- }
-
- public static void glShaderSource(int shader, CharSequence[] sources) {
- int totalLen = 0;
- for (CharSequence s : sources) totalLen += s.length();
- final StringBuilder sb = new StringBuilder(totalLen);
- for (CharSequence s : sources) sb.append(s);
- glShaderSource(shader, sb.toString());
- }
-
- /** Check shader type to determine if fragment output transformation is needed. */
- private static boolean isFragmentShader(int shader) {
- return RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE) == GL20.GL_FRAGMENT_SHADER;
- }
-
- // Texture commands
- public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- type = remapPixelTypeForGLES(format, type);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromByteBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
- restorePixelUnpackBuffer();
- TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) {
- rejectExitCapture();
- type = remapPixelTypeForGLES(format, type);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromIntBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState));
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
- restorePixelUnpackBuffer();
- TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) {
- rejectExitCapture();
- type = remapPixelTypeForGLES(format, type);
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexSubImage2D with buffer offset");
- }
- RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset);
- TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
- maybeGenerateMipmap(target, level);
- }
-
- public static TextureStaging beginTextureStaging(int level, int x, int y, int width, int height) {
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("beginTextureStaging");
- }
- if (!ctx().pixelUnpackState.isDefault()) {
- return null;
- }
- return RENDER_BACKEND.beginTextureStaging(level, x, y, width, height);
- }
-
- public static boolean commitTextureStaging(TextureStaging staging) {
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("commitTextureStaging");
- }
- suspendPixelUnpackBuffer();
- final boolean committed;
- try {
- committed = RENDER_BACKEND.commitTextureStaging(staging);
- } finally {
- restorePixelUnpackBuffer();
- }
- if (committed) {
- TextureInfoCache.INSTANCE.onTexSubImage2D(GL11.GL_TEXTURE_2D, staging.level());
- maybeGenerateMipmap(GL11.GL_TEXTURE_2D, staging.level());
- }
- return committed;
- }
-
- public static void abandonTextureStaging(TextureStaging staging) {
- RENDER_BACKEND.abandonTextureStaging(staging);
- }
-
- public static void trimTextureStaging() {
- RENDER_BACKEND.trimTextureStaging();
- }
-
- public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glTexSubImage3D");
- }
- suspendPixelUnpackBuffer();
- RENDER_BACKEND.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
- restorePixelUnpackBuffer();
- }
-
- public static void glCopyTexImage1D(int target, int level, int internalFormat, int x, int y, int width, int border) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glCopyTexImage1D");
- }
- RENDER_BACKEND.copyTexImage1D(target, level, internalFormat, x, y, width, border);
- }
-
- public static void glCopyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) {
- rejectExitCapture();
- internalFormat = changeFormatIfDeprecated(internalFormat);
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glCopyTexImage2D");
- }
- RENDER_BACKEND.copyTexImage2D(target, level, internalFormat, x, y, width, height, border);
- TextureInfoCache.INSTANCE.onCopyTexImage2D(target, level, internalFormat, width, height);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glCopyTexSubImage1D(int target, int level, int xoffset, int x, int y, int width) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glCopyTexSubImage1D");
- }
- RENDER_BACKEND.copyTexSubImage1D(target, level, xoffset, x, y, width);
- }
-
- public static void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glCopyTexSubImage2D");
- }
- RENDER_BACKEND.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
- TextureInfoCache.INSTANCE.onTexSubImage2D(target, level);
- maybeGenerateMipmap(target, level);
- }
-
- public static void glCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glCopyTexSubImage3D");
- }
- RENDER_BACKEND.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
- }
-
- // State commands
- public static void glCullFace(int mode) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.CULL_FACE);
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- DisplayListManager.recordCullFace(mode);
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.polygonState.getCullFaceMode() != mode) {
- mod(glCtx.polygonState).setCullFaceMode(mode);
- RENDER_BACKEND.cullFace(mode);
- }
- }
-
- public static void glFrontFace(int mode) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.FRONT_FACE);
- final RecordMode recordMode = DisplayListManager.getRecordMode();
- if (recordMode != RecordMode.NONE) {
- DisplayListManager.recordFrontFace(mode);
- if (recordMode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.polygonState.getFrontFace() != mode) {
- mod(glCtx.polygonState).setFrontFace(mode);
- RENDER_BACKEND.frontFace(mode);
- }
- }
-
- public static void glHint(int target, int hint) {
- rejectExitCapture();
- if (hint != GL11.GL_NICEST && hint != GL11.GL_FASTEST && hint != GL11.GL_DONT_CARE) {
- return;
- }
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordHint(target, hint);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final int shift = hintShift(target);
- if (shift >= 0) {
- final IntegerStateStack hints = ctx().hintState;
- final int code = hint == GL11.GL_FASTEST ? 1 : hint == GL11.GL_NICEST ? 2 : 0;
- final int packed = hints.getValue() & ~(3 << shift) | code << shift;
- if (packed != hints.getValue()) mod(hints).setValue(packed);
- }
- if (!isLegacyHint(target)) {
- RENDER_BACKEND.hint(target, hint);
- }
- }
-
- public static void glLineStipple(int factor, short pattern) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordLineStipple(factor, pattern);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- mod(glCtx.lineState);
- glCtx.lineState.setStippleFactor(factor);
- glCtx.lineState.setStipplePattern(pattern);
- }
-
- public static void glPointSize(float size) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPointSize(size);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.pointState.getSize() != size) {
- mod(glCtx.pointState).setSize(size);
- RENDER_BACKEND.pointSize(size);
- }
- }
-
- public static void glPolygonMode(int face, int polygonMode) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPolygonMode(face, polygonMode);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- // Track front/back separately in cache (Mesa compat semantics), but always issue GL_FRONT_AND_BACK to the driver (core profile constraint).
- final boolean caching = isCachingEnabled();
- final boolean front = face != GL11.GL_BACK;
- final boolean back = face != GL11.GL_FRONT;
- final boolean needsUpdate = !caching
- || (front && glCtx.polygonState.getFrontMode() != polygonMode)
- || (back && glCtx.polygonState.getBackMode() != polygonMode);
- if (!needsUpdate) return;
- beforeUncapturedStateChange();
- if (caching) {
- mod(glCtx.polygonState);
- if (front) glCtx.polygonState.setFrontMode(polygonMode);
- if (back) glCtx.polygonState.setBackMode(polygonMode);
- }
- RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, polygonMode);
- }
-
- public static void glPolygonOffset(float factor, float units) {
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordPolygonOffset(factor, units);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
-
- if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != 0.0f) {
- mod(glCtx.polygonState);
- glCtx.polygonState.setOffsetFactor(factor);
- glCtx.polygonState.setOffsetUnits(units);
- glCtx.polygonState.setOffsetClamp(0.0f);
- RENDER_BACKEND.polygonOffset(factor, units);
- }
- }
-
- public static void glPolygonOffsetClamp(float factor, float units, float clamp) {
- if (clamp == 0.0f) {
- glPolygonOffset(factor, units);
- return;
- }
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glPolygonOffsetClamp");
- }
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES);
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != clamp) {
- mod(glCtx.polygonState);
- glCtx.polygonState.setOffsetFactor(factor);
- glCtx.polygonState.setOffsetUnits(units);
- glCtx.polygonState.setOffsetClamp(clamp);
- RENDER_BACKEND.polygonOffsetClamp(factor, units, clamp);
- }
- }
-
- public static void glMultiDrawArraysIndirectCount(int mode, long indirect, long drawcount, int maxdrawcount, int stride) {
- rejectExitCapture();
- RENDER_BACKEND.multiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);
- }
-
- public static void glMultiDrawElementsIndirectCount(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride) {
- rejectExitCapture();
- RENDER_BACKEND.multiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride);
- }
-
- public static void glSpecializeShader(int shader, CharSequence entryPoint, IntBuffer constantIndex, IntBuffer constantValue) {
- rejectExitCapture();
- RENDER_BACKEND.specializeShader(shader, entryPoint, constantIndex, constantValue);
- }
-
- public static void glReadBuffer(int mode) {
- rejectExitCapture();
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glReadBuffer");
- }
- RENDER_BACKEND.readBuffer(mode);
- }
-
- public static void glScissor(int x, int y, int width, int height) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordScissor(x, y, width, height);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- RENDER_BACKEND.scissor(x, y, width, height);
- if (isCachingEnabled()) {
- mod(ctx().scissorState).setScissor(x, y, width, height);
- }
- }
-
- public static void glStencilFunc(int func, int ref, int mask) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStencilFunc(func, ref, mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final int clampedMask = mask & glCtx.stencilBitMask;
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask) {
- beforeUncapturedStateChange();
- mod(glCtx.stencilState).setFunc(func, ref, clampedMask);
- RENDER_BACKEND.stencilFunc(func, ref, clampedMask);
- }
- }
-
- public static void glStencilMask(int mask) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStencilMask(mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final int clampedMask = mask & glCtx.stencilBitMask;
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.stencilState.getWriteMaskFront() != clampedMask) {
- beforeUncapturedStateChange();
- mod(glCtx.stencilState).setWriteMask(clampedMask);
- RENDER_BACKEND.stencilMask(clampedMask);
- }
- }
-
- public static void glStencilOp(int fail, int zfail, int zpass) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStencilOp(fail, zfail, zpass);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.stencilState.getFailOpFront() != fail || glCtx.stencilState.getZFailOpFront() != zfail || glCtx.stencilState.getZPassOpFront() != zpass) {
- beforeUncapturedStateChange();
- mod(glCtx.stencilState).setOp(fail, zfail, zpass);
- RENDER_BACKEND.stencilOp(fail, zfail, zpass);
- }
- }
-
- // glPixelStore* isn'tcompiled into display lists, it executes immediately
- public static void glPixelStorei(int pname, int param) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (isCachingEnabled()) {
- if (PixelStoreState.isPack(pname)) {
- glCtx.pixelPackState = glCtx.pixelPackState.with(pname, param);
- } else {
- glCtx.pixelUnpackState = glCtx.pixelUnpackState.with(pname, param);
- }
- }
- RENDER_BACKEND.pixelStorei(pname, param);
- }
-
- public static void glPixelStoref(int pname, float param) {
- glPixelStorei(pname, param < 0 ? -Math.round(-param) : Math.round(param));
- }
-
- // Display List Commands
- public static void glCallLists(IntBuffer lists) {
- while (lists.hasRemaining()) {
- final int listId = lists.get() + ctx().listBase;
- glCallList(listId);
- }
- }
-
- public static void glCallLists(ShortBuffer lists) {
- while (lists.hasRemaining()) {
- final int listId = (lists.get() & 0xFFFF) + ctx().listBase;
- glCallList(listId);
- }
- }
-
- public static void glCallLists(ByteBuffer lists) {
- while (lists.hasRemaining()) {
- final int listId = (lists.get() & 0xFF) + ctx().listBase;
- glCallList(listId);
- }
- }
-
- public static void glListBase(int base) {
- rejectExitCapture();
- ctx().listBase = base;
- }
-
- // Clip Plane Commands
- public static void glClipPlane(int plane, DoubleBuffer equation) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (DisplayListManager.isRecording()) {
- final int pos = equation.position();
- DisplayListManager.recordClipPlane(plane, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3));
- return;
- }
- final int index = plane - GL11.GL_CLIP_PLANE0;
- if (index < 0 || index >= MAX_CLIP_PLANES) return;
- final int pos = equation.position();
- beforeUncapturedStateChange();
- glCtx.clipPlaneState.setPlane(index, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3), glCtx.modelViewMatrix);
- glCtx.clipPlaneGeneration++;
- }
-
- /** Returns true if any GL_CLIP_PLANE0..7 is currently enabled. */
- public static boolean anyClipPlaneEnabled() {
- return anyClipPlaneEnabled(ctx());
- }
-
- public static boolean anyClipPlaneEnabled(GLContextState glCtx) {
- return glCtx.clipPlaneEnabledMask != 0;
- }
-
- // Clear Commands
- public static void glClearStencil(int s) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordClearStencil(s);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- final boolean caching = isCachingEnabled();
- if (!caching || glCtx.stencilState.getClearValue() != s) {
- mod(glCtx.stencilState).setClearValue(s);
- RENDER_BACKEND.clearStencil(s);
- }
- }
-
- // Draw Buffer Commands (GL 2.0+)
- public static void glDrawBuffers(int buffer) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDrawBuffers(1, buffer);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- RENDER_BACKEND.drawBuffers(buffer);
- }
-
- public static void glDrawBuffers(IntBuffer bufs) {
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordDrawBuffers(bufs.remaining(), bufs);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- RENDER_BACKEND.drawBuffers(bufs);
- }
-
- // Multisample Commands
- public static void glSampleCoverage(float value, boolean invert) {
- if (DisplayListManager.isRecording()) {
- throw DisplayListManager.unsupportedInList("glSampleCoverage");
- }
- beforeUncapturedStateChange();
- RENDER_BACKEND.sampleCoverage(value, invert);
- }
-
- // Stencil Separate Functions (GL 2.0+)
- public static void glStencilFuncSeparate(int face, int func, int ref, int mask) {
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStencilFuncSeparate(face, func, ref, mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- final int clampedMask = mask & glCtx.stencilBitMask;
- final boolean caching = isCachingEnabled();
- boolean needsUpdate = !caching;
- if (!needsUpdate) {
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- needsUpdate = glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask;
- }
- if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) {
- needsUpdate = glCtx.stencilState.getFuncBack() != func || glCtx.stencilState.getRefBack() != ref || glCtx.stencilState.getValueMaskBack() != clampedMask;
- }
- }
- if (needsUpdate) {
- mod(glCtx.stencilState);
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- glCtx.stencilState.setFuncFront(func);
- glCtx.stencilState.setRefFront(ref);
- glCtx.stencilState.setValueMaskFront(clampedMask);
- }
- if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
- glCtx.stencilState.setFuncBack(func);
- glCtx.stencilState.setRefBack(ref);
- glCtx.stencilState.setValueMaskBack(clampedMask);
- }
- RENDER_BACKEND.stencilFuncSeparate(face, func, ref, clampedMask);
- }
- }
-
- public static void glStencilMaskSeparate(int face, int mask) {
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStencilMaskSeparate(face, mask);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- final int clampedMask = mask & glCtx.stencilBitMask;
- final boolean caching = isCachingEnabled();
- boolean needsUpdate = !caching;
- if (!needsUpdate) {
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- needsUpdate = glCtx.stencilState.getWriteMaskFront() != clampedMask;
- }
- if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) {
- needsUpdate = glCtx.stencilState.getWriteMaskBack() != clampedMask;
- }
- }
- if (needsUpdate) {
- mod(glCtx.stencilState);
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- glCtx.stencilState.setWriteMaskFront(clampedMask);
- }
- if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
- glCtx.stencilState.setWriteMaskBack(clampedMask);
- }
- RENDER_BACKEND.stencilMaskSeparate(face, clampedMask);
- }
- }
-
- public static void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) {
- final GLContextState glCtx = ctx();
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStencilOpSeparate(face, sfail, dpfail, dppass);
- if (mode == RecordMode.COMPILE) {
- return;
- }
- }
- beforeUncapturedStateChange();
- final boolean caching = isCachingEnabled();
- boolean needsUpdate = !caching;
- if (!needsUpdate) {
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- needsUpdate = glCtx.stencilState.getFailOpFront() != sfail || glCtx.stencilState.getZFailOpFront() != dpfail || glCtx.stencilState.getZPassOpFront() != dppass;
- }
- if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) {
- needsUpdate = glCtx.stencilState.getFailOpBack() != sfail || glCtx.stencilState.getZFailOpBack() != dpfail || glCtx.stencilState.getZPassOpBack() != dppass;
- }
- }
- if (needsUpdate) {
- mod(glCtx.stencilState);
- if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) {
- glCtx.stencilState.setFailOpFront(sfail);
- glCtx.stencilState.setZFailOpFront(dpfail);
- glCtx.stencilState.setZPassOpFront(dppass);
- }
- if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) {
- glCtx.stencilState.setFailOpBack(sfail);
- glCtx.stencilState.setZFailOpBack(dpfail);
- glCtx.stencilState.setZPassOpBack(dppass);
- }
- RENDER_BACKEND.stencilOpSeparate(face, sfail, dpfail, dppass);
- }
- }
-
- public static void glDeleteBuffers(int buffer) {
- rejectExitCapture();
- if (buffer == 0) return;
- invalidateDeletedBuffer(buffer);
- RENDER_BACKEND.deleteBuffers(buffer);
- }
-
- public static void glDeleteSync(long sync) {
- rejectExitCapture();
- RENDER_BACKEND.deleteSync(sync);
- }
-
- public static long glFenceSync(int condition, int flags) { rejectExitCapture(); return RENDER_BACKEND.fenceSync(condition, flags); }
- public static int glClientWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); return RENDER_BACKEND.clientWaitSync(sync, flags, timeout); }
- public static void glWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); RENDER_BACKEND.waitSync(sync, flags, timeout); }
- public static int glGetSynci(long sync, int pname, IntBuffer length) { rejectExitCapture(); return RENDER_BACKEND.getSynci(sync, pname, length); }
-
- public static void glDeleteBuffers(IntBuffer buffers) {
- rejectExitCapture();
- for (int i = buffers.position(); i < buffers.limit(); i++) {
- invalidateDeletedBuffer(buffers.get(i));
- }
- RENDER_BACKEND.deleteBuffers(buffers);
- }
-
- public static void glDeleteBuffers(int[] buffers) {
- for (int buffer : buffers) {
- glDeleteBuffers(buffer);
- }
- }
-
- private static void invalidateDeletedBuffer(int buffer) {
- final GLContextState glCtx = ctx();
- if (buffer == 0) return;
- final boolean locked = acquireDrawLock();
- try {
- FfpExtendedAttribs.onDeleteBuffer(glCtx, buffer);
- if (glCtx.boundVBO == buffer) glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- if (glCtx.vaos.boundEBO == buffer) glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
- if (glCtx.boundPixelUnpackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
- if (glCtx.boundPixelPackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
- if (glCtx.boundCopyReadBuffer == buffer) glBindBuffer(GL31.GL_COPY_READ_BUFFER, 0);
- if (glCtx.boundCopyWriteBuffer == buffer) glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, 0);
- for (Int2IntMap.Entry e : glCtx.boundOtherBuffers.int2IntEntrySet()) {
- if (e.getIntValue() != buffer) continue;
- e.setValue(0);
- RENDER_BACKEND.bindBuffer(e.getIntKey(), 0);
- }
- for (int i = 0; i < INDEXED_BUFFER_SLOTS; i++) {
- if (glCtx.uniformBufferBindings[i] == buffer) glCtx.uniformBufferBindings[i] = 0;
- if (glCtx.storageBufferBindings[i] == buffer) glCtx.storageBufferBindings[i] = 0;
- }
- writeMappedBuffers.remove(buffer);
-
- glCtx.vaos.onDeleteBuffer(buffer);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- /** glBindBufferBase/Range also set the generic binding point, so they share this. */
- private static void trackBufferBinding(GLContextState glCtx, int target, int buffer) {
- if (target == GL15.GL_ARRAY_BUFFER) {
- // if (boundVBO == buffer) return; TODO figure out why this breaks switching async occlusion mode
- glCtx.boundVBO = buffer;
- } else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) {
- glCtx.vaos.onBindEBO(buffer);
- } else if (target == GL21.GL_PIXEL_UNPACK_BUFFER) {
- glCtx.boundPixelUnpackBuffer = buffer;
- } else if (target == GL21.GL_PIXEL_PACK_BUFFER) {
- glCtx.boundPixelPackBuffer = buffer;
- } else if (target == GL31.GL_COPY_READ_BUFFER) {
- glCtx.boundCopyReadBuffer = buffer;
- } else if (target == GL31.GL_COPY_WRITE_BUFFER) {
- glCtx.boundCopyWriteBuffer = buffer;
- } else {
- glCtx.boundOtherBuffers.put(target, buffer);
- }
- }
-
- public static void glBindBuffer(int target, int buffer) {
- rejectExitCapture();
- final boolean locked = acquireDrawLock();
- try {
- trackBufferBinding(ctx(), target, buffer);
- RENDER_BACKEND.bindBuffer(target, buffer);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void forcePixelUnpackState(PixelStoreState target) {
- PixelStoreState.applyDiff(ctx().pixelUnpackState, target, false);
- }
-
- public static void restorePixelUnpackState(PixelStoreState applied) {
- PixelStoreState.applyDiff(applied, ctx().pixelUnpackState, false);
- }
-
- private static boolean warnedUntrackedPixelBuffer;
-
- private static void warnUntrackedPixelBuffer(int binding, String name) {
- if (warnedUntrackedPixelBuffer || initConfig == null || !initConfig.isLwjglDebug()) return;
- final int actual = RENDER_BACKEND.getInteger(binding);
- if (actual == 0) return;
- warnedUntrackedPixelBuffer = true;
- LOGGER.warn("{} is bound to {} but GLSM's cache says 0; a call site bypassed GLStateManager.glBindBuffer", name, actual, new Throwable());
- }
-
- static void suspendPixelUnpackBuffer() {
- if (ctx().boundPixelUnpackBuffer != 0) {
- RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
- } else {
- warnUntrackedPixelBuffer(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING, "GL_PIXEL_UNPACK_BUFFER");
- }
- }
-
- static void restorePixelUnpackBuffer() {
- final GLContextState glCtx = ctx();
- if (glCtx.boundPixelUnpackBuffer != 0) {
- RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, glCtx.boundPixelUnpackBuffer);
- }
- }
-
- static void suspendPixelPackBuffer() {
- if (ctx().boundPixelPackBuffer != 0) {
- RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
- } else {
- warnUntrackedPixelBuffer(GL21.GL_PIXEL_PACK_BUFFER_BINDING, "GL_PIXEL_PACK_BUFFER");
- }
- }
-
- static void restorePixelPackBuffer() {
- final GLContextState glCtx = ctx();
- if (glCtx.boundPixelPackBuffer != 0) {
- RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, glCtx.boundPixelPackBuffer);
- }
- }
-
- public static int glGenBuffers() {
- requireContext("glGenBuffers");
- return RENDER_BACKEND.genBuffers();
- }
-
- public static void glGenBuffers(IntBuffer buffers) {
- requireContext("glGenBuffers");
- for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.genBuffers());
- }
-
- public static void glGenBuffers(int[] buffers) {
- requireContext("glGenBuffers");
- for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.genBuffers();
- }
-
- public static int glCreateBuffers() {
- requireContext("glCreateBuffers");
- return RENDER_BACKEND.createBuffers();
- }
-
- public static void glCreateBuffers(IntBuffer buffers) {
- requireContext("glCreateBuffers");
- for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.createBuffers());
- }
-
- public static void glCreateBuffers(int[] buffers) {
- requireContext("glCreateBuffers");
- for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.createBuffers();
- }
-
- private static final int MAP_PERSISTENT_BIT = 0x40;
-
- private static int bufferForTarget(GLContextState glCtx, int target) {
- if (target == GL15.GL_ARRAY_BUFFER) return glCtx.boundVBO;
- if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) return glCtx.vaos.boundEBO;
- if (target == GL31.GL_COPY_READ_BUFFER) return glCtx.boundCopyReadBuffer;
- if (target == GL31.GL_COPY_WRITE_BUFFER) return glCtx.boundCopyWriteBuffer;
- if (target == GL21.GL_PIXEL_UNPACK_BUFFER) return glCtx.boundPixelUnpackBuffer;
- if (target == GL21.GL_PIXEL_PACK_BUFFER) return glCtx.boundPixelPackBuffer;
- return glCtx.boundOtherBuffers.get(target);
- }
-
- private static void onBufferRespec(int target) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final int buffer = bufferForTarget(glCtx, target);
- if (buffer != 0) onNamedBufferRespec(glCtx, buffer);
- }
-
- private static void onNamedBufferRespec(GLContextState glCtx, int buffer) {
- rejectExitCapture();
- final boolean locked = acquireDrawLock();
- try {
- if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- private static void onBufferMap(int target, int access) {
- if (access == GL15.GL_READ_ONLY) return;
- onBufferWriteMap(target);
- }
-
- private static void onBufferMapRange(int target, int access) {
- if ((access & GL30.GL_MAP_WRITE_BIT) == 0) return;
- if ((access & MAP_PERSISTENT_BIT) != 0) {
- markPersistentlyMapped(target);
- return;
- }
- onBufferWriteMap(target);
- }
-
- private static void onBufferWriteMap(int target) {
- final GLContextState glCtx = ctx();
- final int buffer = bufferForTarget(glCtx, target);
- if (buffer == 0) return;
- final boolean locked = acquireDrawLock();
- try {
- writeMappedBuffers.add(buffer);
- if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- private static void onBufferUnmap(int target) {
- final GLContextState glCtx = ctx();
- final int buffer = bufferForTarget(glCtx, target);
- if (buffer == 0) return;
- final boolean locked = acquireDrawLock();
- try {
- if (writeMappedBuffers.remove(buffer) && !FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- private static void onBufferStorage(int target, int flags) {
- rejectExitCapture();
- if ((flags & MAP_PERSISTENT_BIT) != 0) {
- if (!RENDER_BACKEND.isBufferImmutable(bufferForTarget(ctx(), target))) markPersistentlyMapped(target);
- return;
- }
- onBufferRespec(target);
- }
-
- private static void markPersistentlyMapped(int target) {
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- FfpExtendedAttribs.markPersistent(glCtx, bufferForTarget(glCtx, target));
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glBufferData(int target, long size, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, size, usage); }
- public static void glBufferData(int target, ByteBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, ShortBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, IntBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, FloatBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, DoubleBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, LongBuffer data, int usage) { glBufferData(target, MemoryUtilities.memByteBuffer(data), usage); }
- public static void glBufferData(int target, int[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, float[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); }
- public static void glBufferData(int target, short[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glBufferData(target, copy, usage);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferData(int target, long[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glBufferData(target, copy, usage);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferData(int target, double[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glBufferData(target, copy, usage);
- MemoryUtilities.memFree(copy);
- }
-
- public static void nglBufferData(int target, long size, long data, int usage) {
- if (data == 0L) {
- glBufferData(target, size, usage);
- return;
- }
- glBufferData(target, MemoryUtilities.memByteBuffer(data, checkedSize(size)), usage);
- }
-
- public static void glBufferSubData(int target, long offset, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
- public static void glBufferSubData(int target, long offset, ShortBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
- public static void glBufferSubData(int target, long offset, IntBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
- public static void glBufferSubData(int target, long offset, FloatBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
- public static void glBufferSubData(int target, long offset, DoubleBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); }
- public static void glBufferSubData(int target, long offset, LongBuffer data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glBufferSubData(int target, long offset, short[] data) {
- final ByteBuffer copy = copyOf(data);
- glBufferSubData(target, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferSubData(int target, long offset, int[] data) {
- final ByteBuffer copy = copyOf(data);
- glBufferSubData(target, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferSubData(int target, long offset, long[] data) {
- final ByteBuffer copy = copyOf(data);
- glBufferSubData(target, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferSubData(int target, long offset, float[] data) {
- final ByteBuffer copy = copyOf(data);
- glBufferSubData(target, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferSubData(int target, long offset, double[] data) {
- final ByteBuffer copy = copyOf(data);
- glBufferSubData(target, offset, copy);
- MemoryUtilities.memFree(copy);
- }
-
- public static void nglBufferSubData(int target, long offset, long size, long data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); }
-
- public static ByteBuffer glMapBuffer(int target, int access) {
- rejectExitCapture();
- final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access);
- if (buf != null) onBufferMap(target, access);
- return buf;
- }
- public static ByteBuffer glMapBuffer(int target, int access, ByteBuffer old_buffer) { return glMapBuffer(target, access); }
- public static ByteBuffer glMapBuffer(int target, int access, long length, ByteBuffer old_buffer) {
- rejectExitCapture();
- final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access, length, old_buffer);
- if (buf != null) onBufferMap(target, access);
- return buf;
- }
- public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access) {
- rejectExitCapture();
- final ByteBuffer buf = RENDER_BACKEND.mapBufferRange(target, offset, length, access);
- if (buf != null) onBufferMapRange(target, access);
- return buf;
- }
- public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { return glMapBufferRange(target, offset, length, access); }
- public static long glMapBufferRangeAddress(int target, long offset, long length, int access) {
- rejectExitCapture();
- final long address = RENDER_BACKEND.mapBufferRangeAddress(target, offset, length, access);
- if (address != 0L) onBufferMapRange(target, access);
- return address;
- }
- public static void glFlushMappedBufferRange(int target, long offset, long length) { rejectExitCapture(); RENDER_BACKEND.flushMappedBufferRange(target, offset, length); }
- public static boolean glUnmapBuffer(int target) {
- rejectExitCapture();
- onBufferUnmap(target);
- return RENDER_BACKEND.unmapBuffer(target);
- }
-
- public static void glGetBufferSubData(int target, long offset, ByteBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
- public static void glGetBufferSubData(int target, long offset, ShortBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
- public static void glGetBufferSubData(int target, long offset, IntBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
- public static void glGetBufferSubData(int target, long offset, FloatBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
- public static void glGetBufferSubData(int target, long offset, DoubleBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); }
- public static void glGetBufferSubData(int target, long offset, LongBuffer data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glGetBufferSubData(int target, long offset, short[] data) {
- final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 1);
- glGetBufferSubData(target, offset, copy);
- copy.asShortBuffer().get(data);
- MemoryUtilities.memFree(copy);
- }
- public static void glGetBufferSubData(int target, long offset, int[] data) {
- final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2);
- glGetBufferSubData(target, offset, copy);
- copy.asIntBuffer().get(data);
- MemoryUtilities.memFree(copy);
- }
- public static void glGetBufferSubData(int target, long offset, long[] data) {
- final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3);
- glGetBufferSubData(target, offset, copy);
- copy.asLongBuffer().get(data);
- MemoryUtilities.memFree(copy);
- }
- public static void glGetBufferSubData(int target, long offset, float[] data) {
- final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2);
- glGetBufferSubData(target, offset, copy);
- copy.asFloatBuffer().get(data);
- MemoryUtilities.memFree(copy);
- }
- public static void glGetBufferSubData(int target, long offset, double[] data) {
- final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3);
- glGetBufferSubData(target, offset, copy);
- copy.asDoubleBuffer().get(data);
- MemoryUtilities.memFree(copy);
- }
-
- public static void nglGetBufferSubData(int target, long offset, long size, long data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); }
-
- public static int glGetBufferParameteri(int target, int pname) { rejectExitCapture(); return RENDER_BACKEND.getBufferParameteri(target, pname); }
- public static int glGetBufferParameter(int target, int pname) { return glGetBufferParameteri(target, pname); }
- public static void glGetBufferParameter(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); }
- public static void glGetBufferParameteriv(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); }
- public static void glGetBufferParameteriv(int target, int pname, int[] params) { params[0] = glGetBufferParameteri(target, pname); }
-
- public static void glBufferStorage(int target, long size, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, size, flags); }
- public static void glBufferStorage(int target, ByteBuffer data, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, data, flags); }
- public static void glBufferStorage(int target, ShortBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
- public static void glBufferStorage(int target, IntBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
- public static void glBufferStorage(int target, FloatBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
- public static void glBufferStorage(int target, DoubleBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); }
- public static void glBufferStorage(int target, short[] data, int flags) {
- final ByteBuffer copy = copyOf(data);
- glBufferStorage(target, copy, flags);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferStorage(int target, int[] data, int flags) {
- final ByteBuffer copy = copyOf(data);
- glBufferStorage(target, copy, flags);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferStorage(int target, float[] data, int flags) {
- final ByteBuffer copy = copyOf(data);
- glBufferStorage(target, copy, flags);
- MemoryUtilities.memFree(copy);
- }
- public static void glBufferStorage(int target, double[] data, int flags) {
- final ByteBuffer copy = copyOf(data);
- glBufferStorage(target, copy, flags);
- MemoryUtilities.memFree(copy);
- }
-
- public static void glNamedBufferData(int buffer, long size, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, size, usage); }
- public static void glNamedBufferData(int buffer, ByteBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); }
- public static void glNamedBufferData(int buffer, FloatBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); }
- public static void glNamedBufferData(int buffer, ShortBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
- public static void glNamedBufferData(int buffer, IntBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
- public static void glNamedBufferData(int buffer, LongBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
- public static void glNamedBufferData(int buffer, DoubleBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); }
- public static void glNamedBufferData(int buffer, short[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferData(buffer, copy, usage);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferData(int buffer, int[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferData(buffer, copy, usage);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferData(int buffer, long[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferData(buffer, copy, usage);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferData(int buffer, float[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferData(buffer, copy, usage);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferData(int buffer, double[] data, int usage) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferData(buffer, copy, usage);
- MemoryUtilities.memFree(copy);
- }
-
- public static void glNamedBufferSubData(int buffer, long offset, ByteBuffer data) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferSubData(buffer, offset, data); }
- public static void glNamedBufferSubData(int buffer, long offset, ShortBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glNamedBufferSubData(int buffer, long offset, IntBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glNamedBufferSubData(int buffer, long offset, LongBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glNamedBufferSubData(int buffer, long offset, FloatBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glNamedBufferSubData(int buffer, long offset, DoubleBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); }
- public static void glNamedBufferSubData(int buffer, long offset, short[] data) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferSubData(buffer, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferSubData(int buffer, long offset, int[] data) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferSubData(buffer, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferSubData(int buffer, long offset, long[] data) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferSubData(buffer, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferSubData(int buffer, long offset, float[] data) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferSubData(buffer, offset, copy);
- MemoryUtilities.memFree(copy);
- }
- public static void glNamedBufferSubData(int buffer, long offset, double[] data) {
- final ByteBuffer copy = copyOf(data);
- glNamedBufferSubData(buffer, offset, copy);
- MemoryUtilities.memFree(copy);
- }
-
- public static void glClearBufferSubData(int target, int internalFormat, long offset, long size, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferSubData(target, internalFormat, offset, size, format, type, data); }
- public static void glClearBufferData(int target, int internalformat, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferData(target, internalformat, format, type, data); }
- public static boolean glIsBuffer(int buffer) { rejectExitCapture(); return RENDER_BACKEND.isBuffer(buffer); }
- public static boolean glIsTexture(int texture) { rejectExitCapture(); return !isDeferredDelete(texture) && RENDER_BACKEND.isTexture(texture); }
- public static boolean glIsFramebuffer(int framebuffer) { rejectExitCapture(); return RENDER_BACKEND.isFramebuffer(framebuffer); }
- public static boolean glIsRenderbuffer(int renderbuffer) { rejectExitCapture(); return RENDER_BACKEND.isRenderbuffer(renderbuffer); }
- public static boolean glIsSampler(int sampler) { rejectExitCapture(); return RENDER_BACKEND.isSampler(sampler); }
- public static boolean glIsQuery(int query) { rejectExitCapture(); return RENDER_BACKEND.isQuery(query); }
- public static void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset, long size) { onBufferRespec(writeTarget); RENDER_BACKEND.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); }
-
- private static int checkedSize(long size) {
- if (size < 0 || size > Integer.MAX_VALUE) {
- throw new IllegalArgumentException("Buffer range does not fit a ByteBuffer wrapper: " + size);
- }
- return (int) size;
- }
-
- private static ByteBuffer copyOf(short[] data) {
- final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 1);
- bb.asShortBuffer().put(data);
- return bb;
- }
-
- private static ByteBuffer copyOf(int[] data) {
- final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2);
- bb.asIntBuffer().put(data);
- return bb;
- }
-
- private static ByteBuffer copyOf(long[] data) {
- final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3);
- bb.asLongBuffer().put(data);
- return bb;
- }
-
- private static ByteBuffer copyOf(float[] data) {
- final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2);
- bb.asFloatBuffer().put(data);
- return bb;
- }
-
- private static ByteBuffer copyOf(double[] data) {
- final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3);
- bb.asDoubleBuffer().put(data);
- return bb;
- }
-
- public static void glBindVertexArray(int array) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (DisplayListManager.isRecording()) {
- DisplayListManager.recordBindVAO(array);
- // Since the vao needs to be bound to do stuff like state setup & data upload, it'll still execute the bind call.
- // This is technically wrong, but I'm not sure if there's a better solution here.
- }
- bindVertexArrayInternal(glCtx, array == 0 ? glCtx.defaultVAO : array);
- }
-
- private static void bindVertexArrayInternal(GLContextState glCtx, int array) {
- final boolean locked = acquireDrawLock();
- try {
- if (glCtx.boundVAO != array) {
- glCtx.boundVAO = array;
- glCtx.vaos.onBindVertexArrayPre(array);
- RENDER_BACKEND.bindVertexArray(array);
- }
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glDeleteVertexArrays(int array) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final boolean locked = acquireDrawLock();
- try {
- glCtx.vaos.onDeleteVertexArray(array);
- if (array == glCtx.boundVAO) {
- // Deleting the bound VAO implicitly unbinds it. Rebind the default VAO.
- bindVertexArrayInternal(glCtx, glCtx.defaultVAO);
- }
- RENDER_BACKEND.deleteVertexArrays(array);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static int glGenVertexArrays() {
- requireContext("glGenVertexArrays");
- return RENDER_BACKEND.genVertexArrays();
- }
-
- public static boolean glIsVertexArray(int array) {
- rejectExitCapture();
- return RENDER_BACKEND.isVertexArray(array);
- }
-
- public static void glBindVertexArrayAPPLE(int array) {
- glBindVertexArray(array);
- }
-
public static boolean vendorIsAMD() {
return VENDOR == AMD;
}
@@ -8464,390 +697,6 @@ public class GLStateManager {
return VENDOR == NVIDIA;
}
- public static void glBindFramebuffer(int target, int framebuffer) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (target == GL30.GL_FRAMEBUFFER) {
- if (glCtx.drawFramebuffer == framebuffer && glCtx.readFramebuffer == framebuffer) return;
- if (glCtx.drawFramebuffer != framebuffer) glCtx.drawFramebufferGeneration++;
- glCtx.drawFramebuffer = framebuffer;
- glCtx.readFramebuffer = framebuffer;
- } else if (target == GL30.GL_DRAW_FRAMEBUFFER) {
- if (glCtx.drawFramebuffer == framebuffer) return;
- glCtx.drawFramebufferGeneration++;
- glCtx.drawFramebuffer = framebuffer;
- } else if (target == GL30.GL_READ_FRAMEBUFFER) {
- if (glCtx.readFramebuffer == framebuffer) return;
- glCtx.readFramebuffer = framebuffer;
- }
- RENDER_BACKEND.bindFramebuffer(target, framebuffer);
- }
-
- public static void glDeleteFramebuffers(int framebuffer) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (glCtx.drawFramebuffer == framebuffer) { glCtx.drawFramebuffer = 0; glCtx.drawFramebufferGeneration++; }
- if (glCtx.readFramebuffer == framebuffer) glCtx.readFramebuffer = 0;
- final int[] slots = glCtx.framebufferTextures.remove(framebuffer);
- if (slots != null) {
- for (int slot = 0; slot < slots.length; slot++) setFramebufferSlot(slots, slot, 0);
- }
- RENDER_BACKEND.deleteFramebuffers(framebuffer);
- }
-
- public static void glDeleteFramebuffers(IntBuffer framebuffers) {
- for (int i = framebuffers.position(); i < framebuffers.limit(); i++) glDeleteFramebuffers(framebuffers.get(i));
- }
-
- public static void glDeleteFramebuffers(int[] framebuffers) {
- for (int framebuffer : framebuffers) glDeleteFramebuffers(framebuffer);
- }
-
- public static int glGenFramebuffers() {
- requireContext("glGenFramebuffers");
- return RENDER_BACKEND.genFramebuffers();
- }
-
- public static int glCheckFramebufferStatus(int target) {
- rejectExitCapture();
- return RENDER_BACKEND.checkFramebufferStatus(target);
- }
-
- public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) {
- rejectExitCapture();
- return RENDER_BACKEND.getFramebufferAttachmentParameteri(target, attachment, pname);
- }
-
- public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) {
- rejectExitCapture();
- if (!beginAttach(target, attachment, texture)) return;
- RENDER_BACKEND.framebufferTexture2D(target, attachment, textarget, texture, level);
- }
-
- public static void glFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level) {
- rejectExitCapture();
- if (!beginAttach(target, attachment, texture)) return;
- RENDER_BACKEND.framebufferTexture1D(target, attachment, textarget, texture, level);
- }
-
- public static void glFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int zoffset) {
- rejectExitCapture();
- if (!beginAttach(target, attachment, texture)) return;
- RENDER_BACKEND.framebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
- }
-
- public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) {
- rejectExitCapture();
- if (!beginAttach(target, attachment, texture)) return;
- RENDER_BACKEND.framebufferTextureLayer(target, attachment, texture, level, layer);
- }
-
- public static void glFramebufferTexture(int target, int attachment, int texture, int level) {
- rejectExitCapture();
- if (!beginAttach(target, attachment, texture)) return;
- RENDER_BACKEND.framebufferTexture(target, attachment, texture, level);
- }
-
- public static void glFramebufferTextureFace(int target, int attachment, int texture, int level, int face) {
- glFramebufferTexture2D(target, attachment, face, texture, level);
- }
-
- public static void glNamedFramebufferTexture(int framebuffer, int attachment, int texture, int level) {
- rejectExitCapture();
- if (!beginAttach(ctx(), framebuffer, attachment, texture)) return;
- RENDER_BACKEND.namedFramebufferTexture(framebuffer, attachment, texture, level);
- }
-
- private static int swapDrawFramebuffer(int framebuffer) {
- final GLContextState glCtx = ctx();
- final int previous = glCtx.drawFramebuffer;
- glCtx.drawFramebuffer = framebuffer;
- RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer);
- return previous;
- }
-
- public static void glNamedFramebufferTextureLayer(int framebuffer, int attachment, int texture, int level, int layer) {
- final int previous = swapDrawFramebuffer(framebuffer);
- glFramebufferTextureLayer(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level, layer);
- swapDrawFramebuffer(previous);
- }
-
- public static void glNamedFramebufferRenderbuffer(int framebuffer, int attachment, int renderbuffertarget, int renderbuffer) {
- final int previous = swapDrawFramebuffer(framebuffer);
- glFramebufferRenderbuffer(GL30.GL_DRAW_FRAMEBUFFER, attachment, renderbuffertarget, renderbuffer);
- swapDrawFramebuffer(previous);
- }
-
- public static void glNamedFramebufferTexture1DEXT(int framebuffer, int attachment, int textarget, int texture, int level) {
- final int previous = swapDrawFramebuffer(framebuffer);
- glFramebufferTexture1D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level);
- swapDrawFramebuffer(previous);
- }
-
- public static void glNamedFramebufferTexture2DEXT(int framebuffer, int attachment, int textarget, int texture, int level) {
- final int previous = swapDrawFramebuffer(framebuffer);
- glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level);
- swapDrawFramebuffer(previous);
- }
-
- public static void glNamedFramebufferTexture3DEXT(int framebuffer, int attachment, int textarget, int texture, int level, int zoffset) {
- final int previous = swapDrawFramebuffer(framebuffer);
- glFramebufferTexture3D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level, zoffset);
- swapDrawFramebuffer(previous);
- }
-
- public static void glNamedFramebufferTextureEXT(int framebuffer, int attachment, int texture, int level) {
- final int previous = swapDrawFramebuffer(framebuffer);
- glFramebufferTexture(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level);
- swapDrawFramebuffer(previous);
- }
-
- public static void glNamedFramebufferTextureFaceEXT(int framebuffer, int attachment, int texture, int level, int face) {
- glNamedFramebufferTexture2DEXT(framebuffer, attachment, face, texture, level);
- }
-
- public static void attachTextureForReading(int attachment, int texture) {
- if (isDeferredDelete(texture)) return;
- final GLContextState glCtx = ctx();
- trackFramebufferAttachment(glCtx, glCtx.readFramebuffer, attachment, texture);
- RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, attachment, GL11.GL_TEXTURE_2D, texture, 0);
- }
-
- public static int glGenRenderbuffers() {
- requireContext("glGenRenderbuffers");
- return RENDER_BACKEND.genRenderbuffers();
- }
- public static void glDeleteRenderbuffers(int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.deleteRenderbuffers(renderbuffer); }
- public static void glBindRenderbuffer(int target, int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.bindRenderbuffer(target, renderbuffer); }
- public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorage(target, internalformat, width, height); }
- public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorageMultisample(target, samples, internalformat, width, height); }
- public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) {
- rejectExitCapture();
- beginAttach(target, attachment, 0);
- RENDER_BACKEND.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
- }
-
- public static void glGenQueries(IntBuffer ids) {
- requireContext("glGenQueries");
- RENDER_BACKEND.genQueries(ids);
- }
- public static int glGenQueries() {
- requireContext("glGenQueries");
- return RENDER_BACKEND.genQueries();
- }
- public static void glDeleteQueries(int id) { rejectExitCapture(); RENDER_BACKEND.deleteQueries(id); }
- public static void glBeginQuery(int target, int id) { rejectExitCapture(); RENDER_BACKEND.beginQuery(target, id); }
- public static void glEndQuery(int target) { rejectExitCapture(); RENDER_BACKEND.endQuery(target); }
- public static void glGetQueryObjectui(int id, int pname, IntBuffer params) { rejectExitCapture(); RENDER_BACKEND.getQueryObjectui(id, pname, params); }
- public static int glGetQueryObjecti(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjecti(id, pname); }
-
- public static void glBindBufferBase(int target, int index, int buffer) {
- rejectExitCapture();
- final boolean locked = acquireDrawLock();
- try {
- final GLContextState glCtx = ctx();
- trackBufferBinding(glCtx, target, buffer);
- trackIndexedBufferBinding(glCtx, target, index, buffer);
- RENDER_BACKEND.bindBufferBase(target, index, buffer);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) {
- rejectExitCapture();
- final boolean locked = acquireDrawLock();
- try {
- final GLContextState glCtx = ctx();
- trackBufferBinding(glCtx, target, buffer);
- trackIndexedBufferBinding(glCtx, target, index, buffer);
- RENDER_BACKEND.bindBufferRange(target, index, buffer, offset, size);
- } finally {
- if (locked) releaseDrawLock();
- }
- }
-
- private static int[] indexedBufferBindings(GLContextState glCtx, int target, int index) {
- if (index < 0 || index >= INDEXED_BUFFER_SLOTS) return null;
- if (target == GL31.GL_UNIFORM_BUFFER) return glCtx.uniformBufferBindings;
- if (target == GL43.GL_SHADER_STORAGE_BUFFER) return glCtx.storageBufferBindings;
- return null;
- }
-
- private static void trackIndexedBufferBinding(GLContextState glCtx, int target, int index, int buffer) {
- final int[] bindings = indexedBufferBindings(glCtx, target, index);
- if (bindings != null) bindings[index] = buffer;
- }
-
- public static int getIndexedBufferBinding(int target, int index) {
- if (isCachingEnabled()) {
- final int[] bindings = indexedBufferBindings(ctx(), target, index);
- if (bindings != null) return bindings[index];
- }
- return RENDER_BACKEND.getIndexedBufferBinding(target, index);
- }
-
- public static int glGetUniformBlockIndex(int program, CharSequence name) { rejectExitCapture(); return RENDER_BACKEND.getUniformBlockIndex(program, name); }
- public static void glUniformBlockBinding(int program, int blockIndex, int binding) { rejectExitCapture(); RENDER_BACKEND.uniformBlockBinding(program, blockIndex, binding); }
- public static void glBindFragDataLocation(int program, int colorNumber, CharSequence name) { rejectExitCapture(); RENDER_BACKEND.bindFragDataLocation(program, colorNumber, name); }
- public static void glQueryCounter(int id, int target) { rejectExitCapture(); RENDER_BACKEND.queryCounter(id, target); }
- public static long glGetQueryObjectui64(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjectui64(id, pname); }
- public static void glUniform3(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform3fv(location, values); }
- public static void glUniform4(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform4fv(location, values); }
-
- public static void glGetInteger(int pname, int[] params) {
- rejectExitCapture();
- if (!isCachingEnabled() || params.length == 0) {
- RENDER_BACKEND.getInteger(pname, params);
- return;
- }
-
- switch (pname) {
- case GL11.GL_VIEWPORT -> {
- if (params.length < 4) {
- RENDER_BACKEND.getInteger(pname, params);
- } else {
- ctx().viewportState.get(params);
- }
- }
- case GL11.GL_SCISSOR_BOX -> {
- if (params.length < 4) {
- RENDER_BACKEND.getInteger(pname, params);
- } else {
- ctx().scissorState.get(params);
- }
- }
- case GL11.GL_POLYGON_MODE -> {
- final PolygonState polygon = ctx().polygonState;
- params[0] = polygon.getFrontMode();
- if (params.length > 1) params[1] = polygon.getBackMode();
- }
- default -> {
- final GLContextState glCtx = ctx();
- if (!HAS_MULTIPLE_SET.contains(pname)) {
- params[0] = glGetInteger(glCtx, pname);
- } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) {
- RENDER_BACKEND.getInteger(pname, params);
- }
- }
- }
- }
- public static long nglMapBuffer(int target, int access) {
- rejectExitCapture();
- final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access);
- if (buf != null) onBufferMap(target, access);
- return buf == null ? 0L : MemoryUtilities.memAddress0(buf);
- }
- public static void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int primcount, long basevertex) {
- rejectExitCapture();
- RENDER_BACKEND.multiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex);
- }
-
- public static void glObjectLabel(int identifier, int name, CharSequence label) { RENDER_BACKEND.objectLabel(identifier, name, label); }
- public static String glGetObjectLabel(int identifier, int name, int bufSize) { rejectExitCapture(); return RENDER_BACKEND.getObjectLabel(identifier, name); }
- public static void glPushDebugGroup(int source, int id, CharSequence message) { RENDER_BACKEND.pushDebugGroup(source, id, message); }
- public static void glPopDebugGroup() { RENDER_BACKEND.popDebugGroup(); }
- public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { RENDER_BACKEND.debugMessageInsert(source, type, id, severity, buf); }
- public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { RENDER_BACKEND.debugMessageControl(source, type, severity, ids, enabled); }
-
- public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) {
- rejectExitCapture();
- return RENDER_BACKEND.getDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog);
- }
-
- public static void registerDebugMessageListener(GLDebugMessageListener listener, long userParam) {
- RENDER_BACKEND.debugMessageCallback(listener, userParam);
- }
-
- public static void glDebugMessageCallback(KHRDebugCallback callback) {
- RENDER_BACKEND.debugMessageCallback(GLDebug.adaptDebugCallback(callback), 0L);
- }
-
- public static void glGenerateMipmap(int target) {
- rejectExitCapture();
- RENDER_BACKEND.generateMipmap(target);
- }
-
- public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) {
- rejectExitCapture();
- RENDER_BACKEND.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
- }
-
- public static void setActiveTexture(int textureUnit) {
- glActiveTexture(textureUnit);
- }
-
- public static void glMultiTexCoord2f(int target, float s, float t) {
- final GLContextState glCtx = ctx();
- if (target == GL13.GL_TEXTURE0) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setTexCoord(s, t);
- return;
- }
- glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f);
- glCtx.dirtyTexCoordAttrib = true;
- } else if (target == GL13.GL_TEXTURE1) {
- if (ImmediateModeRecorder.isDrawing()) {
- ImmediateModeRecorder.setLightmapCoord(s, t);
- return;
- }
- setLightmapTextureCoords(target, s, t);
- } else {
- final int unit = target - GL13.GL_TEXTURE0;
- if (unit >= 2 && unit < 4) {
- if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
- glCtx.unit23TexCoordSetDuringDraw = true;
- }
- beforeUncapturedStateChange();
- glCtx.ffp.setTexCoord(unit, s, t, 0.0f, 1.0f);
- } else {
- glCtx.exitCapture.reject();
- }
- }
- }
-
- public static void glMultiTexCoord2d(int target, double s, double t) {
- glMultiTexCoord2f(target, (float) s, (float) t);
- }
-
- public static void glMultiTexCoord2s(int target, short s, short t) {
- glMultiTexCoord2f(target, s, t);
- }
-
- public static void setLightmapTextureCoords(int unit, float x, float y) {
- if (unit != GL13.GL_TEXTURE1) {
- rejectExitCapture();
- return;
- }
- final GLContextState glCtx = ctx();
- glCtx.exitCapture.write(ExitStateCapture.LIGHTMAP);
- final RecordMode mode = DisplayListManager.getRecordMode();
- if (mode != RecordMode.NONE) {
- DisplayListManager.recordStateCommand(() -> setLightmapTextureCoords(unit, x, y));
- if (mode == RecordMode.COMPILE) return;
- }
- glCtx.lastBrightnessX = x;
- glCtx.lastBrightnessY = y;
- glCtx.dirtyLightmapAttrib = true;
- if (GLSMHooks.LIGHTMAP_COORDS.hasListeners()) {
- GLSMHooks.lightmapCoordsEvent.x = x;
- GLSMHooks.lightmapCoordsEvent.y = y;
- GLSMHooks.LIGHTMAP_COORDS.post(GLSMHooks.lightmapCoordsEvent);
- }
- }
-
- private static void checkMismatch(int cap) {
- final int cached = GLStateManager.glGetInteger(cap);
- final int actual = RENDER_BACKEND.getInteger(cap);
- if (actual != cached) {
- throw new IllegalStateException("GLSM Mismatch! cap=" + cap + " cached=" + cached + " actual=" + actual);
- }
- }
-
- public static boolean isFramebufferEnabled() {
- return true;
- }
-
/**
* Guards against FFP features not supported in core profile.
@@ -8855,7 +704,7 @@ public class GLStateManager {
* With {@code -Dangelica.ffp.warnOnUnsupported=true}: warns once per function (diagnostic mode).
* @return true (always - caller should skip the GL call)
*/
- private static boolean guardUnsupportedFFP(String function, String explanation) {
+ static boolean guardUnsupportedFFP(String function, String explanation) {
rejectExitCapture();
if (!SystemProperties.FFP_WARN_ON_UNSUPPORTED) {
throw new UnsupportedOperationException(function + ": " + explanation);
@@ -8866,1476 +715,10 @@ public class GLStateManager {
return true;
}
- /**
- * In core profile, GL_CLAMP (0x2900) is removed. Remap to GL_CLAMP_TO_EDGE for wrap modes. Semantically equivalent when texture border is not used (border
- * textures are also removed in core).
- */
- public static int remapTexClamp(int pname, int param) {
- if (param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) {
- return GL12.GL_CLAMP_TO_EDGE;
- }
- return param;
- }
-
- public static float remapTexClamp(int pname, float param) {
- if ((int) param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) {
- return (float) GL12.GL_CLAMP_TO_EDGE;
- }
- return param;
- }
-
- public static void remapTexClampBuffer(int pname, IntBuffer params) {
- if (params.remaining() >= 1) {
- final int val = params.get(params.position());
- final int remapped = remapTexClamp(pname, val);
- if (remapped != val) params.put(params.position(), remapped);
- }
- }
-
- public static void glTexEnvi(int target, int pname, int param) {
- handleTexEnvScalar(target, pname, param);
- }
-
- public static void glTexEnvf(int target, int pname, float param) {
- handleTexEnvScalar(target, pname, param);
- }
-
- public static void glTexEnv(int target, int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (target == GL11.GL_TEXTURE_ENV && pname == GL11.GL_TEXTURE_ENV_COLOR && params.remaining() >= 4) {
- beforeUncapturedStateChange();
- final int pos = params.position();
- final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
- envState.beforeModify();
- envState.envColorR = params.get(pos);
- envState.envColorG = params.get(pos + 1);
- envState.envColorB = params.get(pos + 2);
- envState.envColorA = params.get(pos + 3);
- glCtx.fragmentGeneration++;
- return;
- }
- if (target == GL14.GL_TEXTURE_FILTER_CONTROL) {
- guardUnsupportedFFP(
- "glTexEnv",
- "LOD bias via buffer glTexEnv is not supported; use glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value) instead.");
- return;
- }
- // Silently ignore other buffer glTexEnv calls (some mods pass combine params via buffers)
- }
-
- public static void glTexEnv(int target, int pname, IntBuffer params) {
- rejectExitCapture();
- if (target == GL11.GL_TEXTURE_ENV) {
- handleTexEnvScalar(target, pname, (float) params.get(params.position()));
- }
- }
-
- /**
- * Scalar glTexEnvi/glTexEnvf dispatch. glTexEnv is removed in core profile. GL_TEXTURE_FILTER_CONTROL (LOD bias) is remapped to glTexParameterf. All
- * GL_TEXTURE_ENV parameters including GL_COMBINE sub-params are tracked in per-unit TexEnvState.
- */
- private static void handleTexEnvScalar(int target, int pname, float param) {
- beforeUncapturedStateChange();
- final GLContextState glCtx = ctx();
- if (target == GL14.GL_TEXTURE_FILTER_CONTROL) {
- // LOD bias via legacy glTexEnv path - remap to core-profile glTexParameterf
- glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, param);
- return;
- }
- if (target != GL11.GL_TEXTURE_ENV) return;
-
- final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
- envState.beforeModify();
- final int iparam = (int) param;
-
- switch (pname) {
- case GL11.GL_TEXTURE_ENV_MODE -> {
- envState.mode = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_COMBINE_RGB -> {
- envState.combineRgb = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_COMBINE_ALPHA -> {
- envState.combineAlpha = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_SOURCE0_RGB -> {
- envState.sourceRgb[0] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_SOURCE1_RGB -> {
- envState.sourceRgb[1] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_SOURCE2_RGB -> {
- envState.sourceRgb[2] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_SOURCE0_ALPHA -> {
- envState.sourceAlpha[0] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_SOURCE1_ALPHA -> {
- envState.sourceAlpha[1] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_SOURCE2_ALPHA -> {
- envState.sourceAlpha[2] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_OPERAND0_RGB -> {
- envState.operandRgb[0] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_OPERAND1_RGB -> {
- envState.operandRgb[1] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_OPERAND2_RGB -> {
- envState.operandRgb[2] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_OPERAND0_ALPHA -> {
- envState.operandAlpha[0] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_OPERAND1_ALPHA -> {
- envState.operandAlpha[1] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_OPERAND2_ALPHA -> {
- envState.operandAlpha[2] = iparam;
- glCtx.fragmentGeneration++;
- }
- case GL13.GL_RGB_SCALE -> {
- envState.scaleRgb = param;
- glCtx.fragmentGeneration++;
- }
- case GL11.GL_ALPHA_SCALE -> {
- envState.scaleAlpha = param;
- glCtx.fragmentGeneration++;
- }
- // Silently ignore unknown pname - other mods may pass unrecognized params
- }
- }
-
- public static float glGetTexEnvf(int target, int pname) {
- return (float) glGetTexEnvi(target, pname);
- }
-
- public static int glGetTexEnvi(int target, int pname) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (target != GL11.GL_TEXTURE_ENV) return 0;
-
- final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
- return switch (pname) {
- case GL11.GL_TEXTURE_ENV_MODE -> envState.mode;
- case GL13.GL_COMBINE_RGB -> envState.combineRgb;
- case GL13.GL_COMBINE_ALPHA -> envState.combineAlpha;
- case GL13.GL_SOURCE0_RGB -> envState.sourceRgb[0];
- case GL13.GL_SOURCE1_RGB -> envState.sourceRgb[1];
- case GL13.GL_SOURCE2_RGB -> envState.sourceRgb[2];
- case GL13.GL_SOURCE0_ALPHA -> envState.sourceAlpha[0];
- case GL13.GL_SOURCE1_ALPHA -> envState.sourceAlpha[1];
- case GL13.GL_SOURCE2_ALPHA -> envState.sourceAlpha[2];
- case GL13.GL_OPERAND0_RGB -> envState.operandRgb[0];
- case GL13.GL_OPERAND1_RGB -> envState.operandRgb[1];
- case GL13.GL_OPERAND2_RGB -> envState.operandRgb[2];
- case GL13.GL_OPERAND0_ALPHA -> envState.operandAlpha[0];
- case GL13.GL_OPERAND1_ALPHA -> envState.operandAlpha[1];
- case GL13.GL_OPERAND2_ALPHA -> envState.operandAlpha[2];
- case GL13.GL_RGB_SCALE -> (int) envState.scaleRgb;
- case GL11.GL_ALPHA_SCALE -> (int) envState.scaleAlpha;
- default -> 0;
- };
- }
-
- public static void glGetTexEnv(int target, int pname, IntBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (target != GL11.GL_TEXTURE_ENV) return;
- if (pname == GL11.GL_TEXTURE_ENV_COLOR) {
- final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
- params.put(params.position(), (int) (envState.envColorR * 2147483647.0f));
- params.put(params.position() + 1, (int) (envState.envColorG * 2147483647.0f));
- params.put(params.position() + 2, (int) (envState.envColorB * 2147483647.0f));
- params.put(params.position() + 3, (int) (envState.envColorA * 2147483647.0f));
- } else {
- params.put(params.position(), glGetTexEnvi(target, pname));
- }
- }
-
- public static void glGetTexEnv(int target, int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (target != GL11.GL_TEXTURE_ENV) return;
- if (pname == GL11.GL_TEXTURE_ENV_COLOR) {
- final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue());
- params.put(params.position(), envState.envColorR);
- params.put(params.position() + 1, envState.envColorG);
- params.put(params.position() + 2, envState.envColorB);
- params.put(params.position() + 3, envState.envColorA);
- } else {
- params.put(params.position(), (float) glGetTexEnvi(target, pname));
- }
- }
-
-
- public static void glTexGeni(int coord, int pname, int param) {
- beforeUncapturedStateChange();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) return;
- if (pname == GL11.GL_TEXTURE_GEN_MODE) {
- final int unit = glCtx.activeTextureUnit.getValue();
- glCtx.textures.getTexGenState(unit).setMode(coord, param);
- glCtx.texGenGeneration++;
- }
- }
-
- public static void glTexGenf(int coord, int pname, float param) {
- // Single-float form only valid for GL_TEXTURE_GEN_MODE
- glTexGeni(coord, pname, (int) param);
- }
-
- public static void glTexGend(int coord, int pname, double param) {
- glTexGeni(coord, pname, (int) param);
- }
-
- public static void glTexGen(int coord, int pname, FloatBuffer params) {
- beforeUncapturedStateChange();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) return;
- final int unit = glCtx.activeTextureUnit.getValue();
- final var texGenState = glCtx.textures.getTexGenState(unit);
- final int pos = params.position();
- switch (pname) {
- case GL11.GL_TEXTURE_GEN_MODE -> {
- texGenState.setMode(coord, (int) params.get(pos));
- glCtx.texGenGeneration++;
- }
- case GL11.GL_OBJECT_PLANE -> {
- glCtx.texGenTempPlane[0] = params.get(pos);
- glCtx.texGenTempPlane[1] = params.get(pos + 1);
- glCtx.texGenTempPlane[2] = params.get(pos + 2);
- glCtx.texGenTempPlane[3] = params.get(pos + 3);
- texGenState.setObjectPlane(coord, glCtx.texGenTempPlane);
- glCtx.texGenGeneration++;
- }
- case GL11.GL_EYE_PLANE -> {
- glCtx.texGenTempPlane[0] = params.get(pos);
- glCtx.texGenTempPlane[1] = params.get(pos + 1);
- glCtx.texGenTempPlane[2] = params.get(pos + 2);
- glCtx.texGenTempPlane[3] = params.get(pos + 3);
- texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix);
- glCtx.texGenGeneration++;
- }
- }
- }
-
- public static void glTexGen(int coord, int pname, DoubleBuffer params) {
- beforeUncapturedStateChange();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) return;
- final int pos = params.position();
- glCtx.texGenTempPlane[0] = (float) params.get(pos);
- glCtx.texGenTempPlane[1] = (float) params.get(pos + 1);
- glCtx.texGenTempPlane[2] = (float) params.get(pos + 2);
- glCtx.texGenTempPlane[3] = (float) params.get(pos + 3);
- final int unit = glCtx.activeTextureUnit.getValue();
- final var texGenState = glCtx.textures.getTexGenState(unit);
- switch (pname) {
- case GL11.GL_TEXTURE_GEN_MODE -> {
- texGenState.setMode(coord, (int) params.get(pos));
- glCtx.texGenGeneration++;
- }
- case GL11.GL_OBJECT_PLANE -> {
- texGenState.setObjectPlane(coord, glCtx.texGenTempPlane);
- glCtx.texGenGeneration++;
- }
- case GL11.GL_EYE_PLANE -> {
- texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix);
- glCtx.texGenGeneration++;
- }
- }
- }
-
- public static void glTexGen(int coord, int pname, IntBuffer params) {
- beforeUncapturedStateChange();
- final GLContextState glCtx = ctx();
- if (!isCachingEnabled()) return;
- if (pname == GL11.GL_TEXTURE_GEN_MODE) {
- final int unit = glCtx.activeTextureUnit.getValue();
- glCtx.textures.getTexGenState(unit).setMode(coord, params.get(params.position()));
- glCtx.texGenGeneration++;
- }
- }
-
- public static int glGetTexGeni(int coord, int pname) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- if (pname == GL11.GL_TEXTURE_GEN_MODE) {
- return glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()).getMode(coord);
- }
- return 0;
- }
-
- public static float glGetTexGenf(int coord, int pname) {
- return (float) glGetTexGeni(coord, pname);
- }
-
- public static double glGetTexGend(int coord, int pname) {
- return glGetTexGeni(coord, pname);
- }
-
- public static void glGetTexGen(int coord, int pname, IntBuffer params) {
- if (pname == GL11.GL_TEXTURE_GEN_MODE) {
- params.put(params.position(), glGetTexGeni(coord, pname));
- }
- }
-
- public static void glGetTexGen(int coord, int pname, FloatBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue());
- if (pname == GL11.GL_TEXTURE_GEN_MODE) {
- params.put(params.position(), (float) state.getMode(coord));
- } else if (pname == GL11.GL_OBJECT_PLANE) {
- final float[] plane = state.getObjectPlane(coord);
- params.put(params.position(), plane[0]);
- params.put(params.position() + 1, plane[1]);
- params.put(params.position() + 2, plane[2]);
- params.put(params.position() + 3, plane[3]);
- } else if (pname == GL11.GL_EYE_PLANE) {
- final float[] plane = state.getEyePlane(coord);
- params.put(params.position(), plane[0]);
- params.put(params.position() + 1, plane[1]);
- params.put(params.position() + 2, plane[2]);
- params.put(params.position() + 3, plane[3]);
- }
- }
-
- public static void glGetTexGen(int coord, int pname, DoubleBuffer params) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue());
- if (pname == GL11.GL_TEXTURE_GEN_MODE) {
- params.put(params.position(), state.getMode(coord));
- } else if (pname == GL11.GL_OBJECT_PLANE) {
- final float[] plane = state.getObjectPlane(coord);
- params.put(params.position(), plane[0]);
- params.put(params.position() + 1, plane[1]);
- params.put(params.position() + 2, plane[2]);
- params.put(params.position() + 3, plane[3]);
- } else if (pname == GL11.GL_EYE_PLANE) {
- final float[] plane = state.getEyePlane(coord);
- params.put(params.position(), plane[0]);
- params.put(params.position() + 1, plane[1]);
- params.put(params.position() + 2, plane[2]);
- params.put(params.position() + 3, plane[3]);
- }
- }
-
- public static void glPolygonStipple(ByteBuffer pattern) {
- guardUnsupportedFFP("glPolygonStipple", "glPolygonStipple is not available in GL 3.3 core profile.");
- }
-
- public static void glAccum(int op, float value) {
- guardUnsupportedFFP("glAccum", "The accumulation buffer is not available in GL 3.3 core profile.");
- }
-
- public static void glFeedbackBuffer(int type, FloatBuffer buffer) {
- rejectExitCapture();
- FeedbackManager.glFeedbackBuffer(type, buffer);
- }
-
- public static int glRenderMode(int mode) {
- rejectExitCapture();
- return FeedbackManager.glRenderMode(mode);
- }
-
- public static void glPassThrough(float token) {
- rejectExitCapture();
- FeedbackManager.glPassThrough(token);
- }
-
- private static boolean selectWarned = false;
-
- public static void glSelectBuffer(IntBuffer buffer) {
- rejectExitCapture();
- if (!selectWarned) {
- LOGGER.warn("glSelectBuffer: selection mode not emulated");
- selectWarned = true;
- }
- }
-
- public static void glInitNames() { /* no-op: ignored outside GL_SELECT */ }
-
- public static void glPushName(int name) { /* no-op */ }
-
- public static void glPopName() { /* no-op */ }
-
- public static void glLoadName(int name) { /* no-op */ }
-
- public static void glLinkProgram(int program) {
- rejectExitCapture();
- if (ShaderManager.isEnabled()) {
- generateVertexShaderIfNeeded(program);
- }
- if (ProgramBinaryCache.isEnabled()) {
- ProgramBinaryCache.markRetrievable(program);
- }
- RENDER_BACKEND.linkProgram(program);
- if (ShaderManager.isEnabled() && RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) {
- LOGGER.warn("Program {} failed to link: {}", program, RENDER_BACKEND.getProgramInfoLog(program));
- }
- CompatUniformManager.onLinkProgram(program);
- }
-
- public static void glProgramParameteri(int program, int pname, int value) {
- rejectExitCapture();
- RENDER_BACKEND.programParameteri(program, pname, value);
- }
-
- public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) {
- rejectExitCapture();
- RENDER_BACKEND.getProgramBinary(program, length, binaryFormat, binary);
- }
-
- public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) {
- rejectExitCapture();
- RENDER_BACKEND.programBinary(program, binaryFormat, binary);
- if (RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_TRUE) {
- CompatUniformManager.onLinkProgram(program);
- }
- }
-
- /**
- * If a program has a fragment shader but no vertex shader, generate a passthrough vertex shader from the fragment's in declarations and attach it.
- */
- private static void generateVertexShaderIfNeeded(int program) {
- final GLContextState glCtx = ctx();
- final int shaderCount = RENDER_BACKEND.getProgrami(program, GL20.GL_ATTACHED_SHADERS);
- if (shaderCount == 0 || shaderCount > glCtx.shaderBuf.capacity()) return;
-
- glCtx.shaderBuf.clear().limit(shaderCount);
- RENDER_BACKEND.getAttachedShaders(program, null, glCtx.shaderBuf);
-
- int fragmentShader = 0;
- boolean hasVertex = false;
- for (int i = 0; i < shaderCount; i++) {
- final int shader = glCtx.shaderBuf.get(i);
- final int type = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE);
- if (type == GL20.GL_VERTEX_SHADER) {
- hasVertex = true;
- break;
- } else if (type == GL20.GL_FRAGMENT_SHADER) {
- fragmentShader = shader;
- }
- }
-
- if (hasVertex || fragmentShader == 0) return;
-
- // Fragment-only program - generate a passthrough vertex shader
- final String fragSource = RENDER_BACKEND.getShaderSource(fragmentShader, 65536);
- String vertSource = CompatShaderTransformer.generatePassthroughVertexShader(fragSource);
- if (RenderSystem.isGLES()) {
- vertSource = CompatShaderTransformer.toGLES(vertSource, GL20.GL_VERTEX_SHADER, false);
- }
-
- final int vertShader = RENDER_BACKEND.createShader(GL20.GL_VERTEX_SHADER);
- RENDER_BACKEND.shaderSource(vertShader, vertSource);
- RENDER_BACKEND.compileShader(vertShader);
-
- if (RENDER_BACKEND.getShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
- final String log = RENDER_BACKEND.getShaderInfoLog(vertShader, 8192);
- LOGGER.warn("CompatShaderTransformer: Generated passthrough vertex shader failed to compile:\n{}\nSource:\n{}", log, vertSource);
- RENDER_BACKEND.deleteShader(vertShader);
- return;
- }
-
- LOGGER.debug("CompatShaderTransformer: Generated passthrough vertex shader for fragment-only program {}", program);
- RENDER_BACKEND.attachShader(program, vertShader);
- RENDER_BACKEND.deleteShader(vertShader);
- }
-
- @Getter
- private static long programLifetimeGeneration;
- private static final IntOpenHashSet programsPendingDeletion = new IntOpenHashSet();
-
- public static boolean isProgramPendingDeletion(int program) {
- return programsPendingDeletion.contains(program);
- }
-
- public static void glDeleteProgram(int program) {
- rejectExitCapture();
- if (program == 0) return;
- CompatUniformManager.onDeleteProgram(program);
-
- // GL defers deletion of a bound program until unbind; activeProgram stays set so the
- // cache matches GL_CURRENT_PROGRAM and the next glUseProgram is not skipped as redundant.
- if (GLSMHooks.PROGRAM_DELETE.hasListeners()) {
- GLSMHooks.programDeleteEvent.program = program;
- GLSMHooks.PROGRAM_DELETE.post(GLSMHooks.programDeleteEvent);
- }
- RENDER_BACKEND.deleteProgram(program);
- programsPendingDeletion.add(program);
- programsPendingDeletion.removeIf((int id) -> !RENDER_BACKEND.isProgram(id));
- programLifetimeGeneration++;
- }
-
- public static int glCreateShader(int type) {
- requireContext("glCreateShader");
- return RENDER_BACKEND.createShader(type);
- }
-
- public static void glCompileShader(int shader) {
- rejectExitCapture();
- RENDER_BACKEND.compileShader(shader);
- }
-
- public static int glCreateProgram() {
- requireContext("glCreateProgram");
- final int program = RENDER_BACKEND.createProgram();
- programsPendingDeletion.remove(program);
- programLifetimeGeneration++;
- return program;
- }
-
- public static void glAttachShader(int program, int shader) {
- rejectExitCapture();
- RENDER_BACKEND.attachShader(program, shader);
- }
-
- public static void glDetachShader(int program, int shader) {
- rejectExitCapture();
- RENDER_BACKEND.detachShader(program, shader);
- }
-
- public static void glDeleteShader(int shader) {
- rejectExitCapture();
- RENDER_BACKEND.deleteShader(shader);
- }
-
- public static void glBindAttribLocation(int program, int index, CharSequence name) {
- rejectExitCapture();
- RENDER_BACKEND.bindAttribLocation(program, index, name);
- }
-
- public static void glValidateProgram(int program) {
- rejectExitCapture();
- RENDER_BACKEND.validateProgram(program);
- }
-
- public static int glGetShaderi(int shader, int pname) {
- rejectExitCapture();
- return RENDER_BACKEND.getShaderi(shader, pname);
- }
-
- public static String glGetShaderInfoLog(int shader, int maxLength) {
- rejectExitCapture();
- return RENDER_BACKEND.getShaderInfoLog(shader, maxLength);
- }
-
- public static String glGetShaderInfoLog(int shader) {
- rejectExitCapture();
- return RENDER_BACKEND.getShaderInfoLog(shader);
- }
-
- public static int glGetProgrami(int program, int pname) {
- rejectExitCapture();
- return RENDER_BACKEND.getProgrami(program, pname);
- }
-
- public static String glGetProgramInfoLog(int program, int maxLength) {
- rejectExitCapture();
- return RENDER_BACKEND.getProgramInfoLog(program, maxLength);
- }
-
- public static String glGetProgramInfoLog(int program) {
- rejectExitCapture();
- return RENDER_BACKEND.getProgramInfoLog(program);
- }
-
- public static boolean glIsProgram(int obj) {
- rejectExitCapture();
- final boolean valid = RENDER_BACKEND.isProgram(obj);
- if (!valid) programsPendingDeletion.remove(obj);
- return valid;
- }
-
- public static boolean glIsShader(int obj) {
- rejectExitCapture();
- return RENDER_BACKEND.isShader(obj);
- }
-
- public static void glBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) {
- rejectExitCapture();
- if (isDeferredDelete(texture)) return;
- final GLContextState glCtx = ctx();
- final ImageUnitBinding binding = glCtx.imageUnits.get(unit);
- if (binding == null) {
- warnOnce("imageUnitRange", "glBindImageTexture unit {} exceeds GL_MAX_IMAGE_UNITS {}", unit, glCtx.imageUnits.size());
- } else {
- binding.setBinding(texture, level, texture != 0 && layered, texture != 0 ? layer : 0, access, format);
- if (texture != 0 && unit > glCtx.maxBoundImageUnit) glCtx.maxBoundImageUnit = unit;
- }
- if (access != GL15.GL_READ_ONLY) TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture);
- RENDER_BACKEND.bindImageTexture(unit, texture, level, layered, layer, access, format);
- }
-
- public static void glBindImageTextures(int first, int count, IntBuffer textures) {
- if (first < 0 || first + count > ctx().imageUnits.size()) return;
- if (textures == null) {
- for (int i = 0; i < count; i++) bindImageUnitByName(first + i, 0);
- return;
- }
- requireRemaining(textures, count);
- for (int i = 0; i < count; i++) bindImageUnitByName(first + i, textures.get(textures.position() + i));
- }
-
- public static void glBindImageTextures(int first, IntBuffer textures) {
- if (textures != null) glBindImageTextures(first, textures.remaining(), textures);
- }
-
- public static void glBindImageTextures(int first, int[] textures) {
- if (textures != null) glBindImageTextures(first, textures.length, IntBuffer.wrap(textures));
- }
-
- private static void bindImageUnitByName(int unit, int texture) {
- if (texture == 0) {
- glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8);
- return;
- }
- if (isDeferredDelete(texture)) return;
- final int format = TextureInfoCache.INSTANCE.getInfo(texture).getInternalFormat();
- if (!isImageFormat(format)) return;
- final boolean layered = switch (non2DTextureTargets.get(texture)) {
- case GL30.GL_TEXTURE_1D_ARRAY, GL30.GL_TEXTURE_2D_ARRAY, GL12.GL_TEXTURE_3D, GL13.GL_TEXTURE_CUBE_MAP, GL40.GL_TEXTURE_CUBE_MAP_ARRAY, GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY -> true;
- default -> false;
- };
- glBindImageTexture(unit, texture, 0, layered, 0, GL15.GL_READ_WRITE, format);
- }
-
- private static boolean isImageFormat(int format) {
- return switch (format) {
- case GL30.GL_RGBA32F, GL30.GL_RGBA16F, GL30.GL_RG32F, GL30.GL_RG16F, GL30.GL_R11F_G11F_B10F, GL30.GL_R32F, GL30.GL_R16F,
- GL30.GL_RGBA32UI, GL30.GL_RGBA16UI, GL33.GL_RGB10_A2UI, GL30.GL_RGBA8UI, GL30.GL_RG32UI, GL30.GL_RG16UI, GL30.GL_RG8UI, GL30.GL_R32UI, GL30.GL_R16UI, GL30.GL_R8UI,
- GL30.GL_RGBA32I, GL30.GL_RGBA16I, GL30.GL_RGBA8I, GL30.GL_RG32I, GL30.GL_RG16I, GL30.GL_RG8I, GL30.GL_R32I, GL30.GL_R16I, GL30.GL_R8I,
- GL11.GL_RGBA16, GL11.GL_RGB10_A2, GL11.GL_RGBA8, GL30.GL_RG16, GL30.GL_RG8, GL30.GL_R16, GL30.GL_R8,
- GL31.GL_RGBA16_SNORM, GL31.GL_RGBA8_SNORM, GL31.GL_RG16_SNORM, GL31.GL_RG8_SNORM, GL31.GL_R16_SNORM, GL31.GL_R8_SNORM -> true;
- default -> false;
- };
- }
-
- public static ImageUnitBinding getImageUnitBinding(int unit) {
- return ctx().imageUnits.get(unit);
- }
-
- private static int indexedIntegerOrBackend(int pname, int index) {
- if (pname == GL31.GL_UNIFORM_BUFFER_BINDING) return getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index);
- if (pname == GL43.GL_SHADER_STORAGE_BUFFER_BINDING) return getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, index);
- final ImageUnitBinding binding = !isCachingEnabled() ? null : ctx().imageUnits.get(index);
- if (binding == null) return RENDER_BACKEND.getIntegerIndexed(pname, index);
- return switch (pname) {
- case GL42.GL_IMAGE_BINDING_NAME -> binding.getTexture();
- case GL42.GL_IMAGE_BINDING_LEVEL -> binding.getLevel();
- case GL42.GL_IMAGE_BINDING_LAYERED -> binding.isLayered() ? GL11.GL_TRUE : GL11.GL_FALSE;
- case GL42.GL_IMAGE_BINDING_LAYER -> binding.getLayer();
- case GL42.GL_IMAGE_BINDING_ACCESS -> binding.getAccess();
- case GL42.GL_IMAGE_BINDING_FORMAT -> binding.getFormat();
- default -> RENDER_BACKEND.getIntegerIndexed(pname, index);
- };
- }
-
- public static int glGetInteger(int pname, int index) {
- rejectExitCapture();
- return indexedIntegerOrBackend(pname, index);
- }
-
- public static int glGetIntegeri(int pname, int index) {
- rejectExitCapture();
- return indexedIntegerOrBackend(pname, index);
- }
-
- public static void glGetIntegeri(int pname, int index, IntBuffer params) {
- glGetIntegeri_v(pname, index, params);
- }
-
- public static void glGetIntegeri_v(int pname, int index, IntBuffer params) {
- rejectExitCapture();
- params.put(params.position(), indexedIntegerOrBackend(pname, index));
- }
-
- public static void glGetBooleani_v(int pname, int index, ByteBuffer params) {
- rejectExitCapture();
- params.put(params.position(), (byte) (indexedIntegerOrBackend(pname, index) != 0 ? GL11.GL_TRUE : GL11.GL_FALSE));
- }
-
- public static void glGetBooleani(int pname, int index, ByteBuffer params) {
- glGetBooleani_v(pname, index, params);
- }
-
- public static void glMemoryBarrier(int barriers) { rejectExitCapture(); RENDER_BACKEND.memoryBarrier(barriers); }
- public static void glCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ,
- int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ,
- int srcWidth, int srcHeight, int srcDepth) {
- rejectExitCapture();
- RENDER_BACKEND.copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ,
- dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
- if (dstTarget != GL30.GL_RENDERBUFFER && dstLevel == 0) TextureInfoCache.INSTANCE.onContentsChanged(dstName);
- }
- public static void glDispatchCompute(int x, int y, int z) { rejectExitCapture(); RENDER_BACKEND.dispatchCompute(x, y, z); }
-
- public static int glGetUniformLocation(int program, CharSequence name) {
- rejectExitCapture();
- int loc = RENDER_BACKEND.getUniformLocation(program, name);
- if (loc == -1 && TEXTURE.contentEquals(name)) {
- loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED);
- }
- return loc;
- }
-
- public static int glGetUniformLocation(int program, ByteBuffer name) {
- rejectExitCapture();
- int loc = RENDER_BACKEND.getUniformLocation(program, name);
- if (loc == -1 && isTextureBuffer(name)) {
- loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED);
- }
- return loc;
- }
-
- public static int glGetAttribLocation(int program, CharSequence name) {
- rejectExitCapture();
- int loc = RENDER_BACKEND.getAttribLocation(program, name);
- if (loc == -1 && TEXTURE.contentEquals(name)) {
- loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED);
- }
- return loc;
- }
-
- public static int glGetAttribLocation(int program, ByteBuffer name) {
- rejectExitCapture();
- int loc = RENDER_BACKEND.getAttribLocation(program, name);
- if (loc == -1 && isTextureBuffer(name)) {
- loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED);
- }
- return loc;
- }
-
- private static final ByteBuffer TEXTURE_BYTES = ByteBuffer.wrap(TEXTURE.getBytes(StandardCharsets.US_ASCII));
-
- private static boolean isTextureBuffer(ByteBuffer buf) {
- final int len = buf.remaining();
- if (len != 7 && len != 8) return false;
- // I believe the driver accepts null terminated or not
- if (len == 8 && buf.get(buf.position() + 7) != 0) return false;
- return buf.slice(buf.position(), 7).equals(TEXTURE_BYTES);
- }
-
- public static void glDeleteObjectARB(int obj) {
- rejectExitCapture();
- if (RENDER_BACKEND.isShader(obj)) {
- RENDER_BACKEND.deleteShader(obj);
- } else {
- glDeleteProgram(obj);
- }
- }
-
- public static int glGetHandleARB(int pname) {
- rejectExitCapture();
- return pname == ARBShaderObjects.GL_PROGRAM_OBJECT_ARB ? glGetInteger(GL20.GL_CURRENT_PROGRAM) : RENDER_BACKEND.getInteger(pname);
- }
-
- public static void glGetObjectParameterARB(int obj, int pname, IntBuffer params) {
- rejectExitCapture();
- final var backend = RENDER_BACKEND;
- if (backend.isShader(obj)) {
- params.put(params.position(), backend.getShaderi(obj, pname));
- } else {
- backend.getProgramiv(obj, pname, params);
- }
- }
-
- public static void glGetObjectParameterARB(int obj, int pname, FloatBuffer params) {
- rejectExitCapture();
- final var backend = RENDER_BACKEND;
- params.put(params.position(), (float) (backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname)));
- }
-
- public static int glGetObjectParameteriARB(int obj, int pname) {
- rejectExitCapture();
- final var backend = RENDER_BACKEND;
- return backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname);
- }
-
- public static String glGetInfoLogARB(int obj, int maxLength) {
- rejectExitCapture();
- final var backend = RENDER_BACKEND;
- return backend.isShader(obj) ? backend.getShaderInfoLog(obj, maxLength) : backend.getProgramInfoLog(obj, maxLength);
- }
-
- public static void glGetInfoLogARB(int obj, IntBuffer length, ByteBuffer infoLog) {
- rejectExitCapture();
- final var backend = RENDER_BACKEND;
- if (backend.isShader(obj)) {
- backend.getShaderInfoLog(obj, length, infoLog);
- } else {
- backend.getProgramInfoLog(obj, length, infoLog);
- }
- }
-
- public static void glUniform1f(int location, float v0) {
- rejectExitCapture();
- RENDER_BACKEND.uniform1f(location, v0);
- }
-
- public static void glUniform2f(int location, float v0, float v1) {
- rejectExitCapture();
- RENDER_BACKEND.uniform2f(location, v0, v1);
- }
-
- public static void glUniform3f(int location, float v0, float v1, float v2) {
- rejectExitCapture();
- RENDER_BACKEND.uniform3f(location, v0, v1, v2);
- }
-
- public static void glUniform4f(int location, float v0, float v1, float v2, float v3) {
- rejectExitCapture();
- RENDER_BACKEND.uniform4f(location, v0, v1, v2, v3);
- }
-
- public static void glUniform1i(int location, int v0) {
- rejectExitCapture();
- RENDER_BACKEND.uniform1i(location, v0);
- }
-
- public static void glUniform2i(int location, int v0, int v1) {
- rejectExitCapture();
- RENDER_BACKEND.uniform2i(location, v0, v1);
- }
-
- public static void glUniform3i(int location, int v0, int v1, int v2) {
- rejectExitCapture();
- RENDER_BACKEND.uniform3i(location, v0, v1, v2);
- }
-
- public static void glUniform4i(int location, int v0, int v1, int v2, int v3) {
- rejectExitCapture();
- RENDER_BACKEND.uniform4i(location, v0, v1, v2, v3);
- }
-
- public static void glUniform1(int location, FloatBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform1fv(location, values);
- }
-
- public static void glUniform1(int location, IntBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform1iv(location, values);
- }
-
- public static void glUniform2(int location, FloatBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform2(location, values);
- }
-
- public static void glUniform2(int location, IntBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform2iv(location, values);
- }
-
- public static void glUniform3(int location, FloatBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform3(location, values);
- }
-
- public static void glUniform3(int location, IntBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform3iv(location, values);
- }
-
- public static void glUniform4(int location, FloatBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform4(location, values);
- }
-
- public static void glUniform4(int location, IntBuffer values) {
- rejectExitCapture();
- RENDER_BACKEND.uniform4iv(location, values);
- }
-
- public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer matrices) {
- rejectExitCapture();
- RENDER_BACKEND.uniformMatrix2(location, transpose, matrices);
- }
-
- public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer matrices) {
- rejectExitCapture();
- RENDER_BACKEND.uniformMatrix3(location, transpose, matrices);
- }
-
- public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer matrices) {
- rejectExitCapture();
- RENDER_BACKEND.uniformMatrix4(location, transpose, matrices);
- }
-
- public static void glGetActiveUniform(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) {
- rejectExitCapture();
- RENDER_BACKEND.getActiveUniform(program, index, length, size, type, name);
- }
-
- public static void glGetActiveAttrib(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) {
- rejectExitCapture();
- RENDER_BACKEND.getActiveAttrib(program, index, length, size, type, name);
- }
-
- public static String glGetActiveAttrib(int program, int index, int maxLength, IntBuffer sizeType) {
- rejectExitCapture();
- return RENDER_BACKEND.getActiveAttrib(program, index, maxLength, sizeType);
- }
-
- public static void glGetAttachedShaders(int program, IntBuffer count, IntBuffer shaders) {
- rejectExitCapture();
- RENDER_BACKEND.getAttachedShaders(program, count, shaders);
- }
-
- public static String glGetShaderSource(int shader, int maxLength) {
- rejectExitCapture();
- return RENDER_BACKEND.getShaderSource(shader, maxLength);
- }
-
- public static void glGetShaderSource(int shader, IntBuffer length, ByteBuffer source) {
- rejectExitCapture();
- RENDER_BACKEND.getShaderSource(shader, length, source);
- }
-
- public static void glGetUniform(int program, int location, FloatBuffer params) {
- rejectExitCapture();
- RENDER_BACKEND.getUniformfv(program, location, params);
- }
-
- public static void glGetUniform(int program, int location, IntBuffer params) {
- rejectExitCapture();
- RENDER_BACKEND.getUniformiv(program, location, params);
- }
- public static void glGetTexImage(int target, int level, int format, int type, long pixels) {
- rejectExitCapture();
- RENDER_BACKEND.getTexImage(target, level, format, type, pixels);
- }
- public static void glReadPixels(int x, int y, int width, int height, int format, int type, long pixels) {
- rejectExitCapture();
- RENDER_BACKEND.readPixels(x, y, width, height, format, remapPixelTypeForGLES(format, type), pixels);
- }
-
- /**
- * Draw modes that rely on the previous vertex data cannot be merged currently.
- * It is possible to merge them using Index Buffers, but currently unimplemented.
- */
- public static boolean isContinuousDraw(int drawMode) {
- return drawMode == GL11.GL_TRIANGLE_STRIP || drawMode == GL11.GL_TRIANGLE_FAN
- || drawMode == GL11.GL_LINE_STRIP || drawMode == GL11.GL_LINE_LOOP
- || drawMode == GL11.GL_QUAD_STRIP || drawMode == GL11.GL_POLYGON;
- }
-
- public static int getProgramGeneration() {
- return ctx().programGeneration;
- }
-
- public static int getDrawFramebufferGeneration() {
- return ctx().drawFramebufferGeneration;
- }
-
- public static boolean isPoppingAttributes() {
- return ctx().poppingAttributes;
- }
-
- public static int getMvGeneration() {
- return ctx().mvGeneration;
- }
-
- public static int getMvLinearGeneration() {
- return ctx().mvLinearGeneration;
- }
-
- public static int getProjGeneration() {
- return ctx().projGeneration;
- }
-
- public static int getTexMatrixGeneration() {
- return ctx().texMatrixGeneration;
- }
-
- public static int getLightingGeneration() {
- return ctx().lightingGeneration;
- }
-
public static int getFragmentGeneration() {
return ctx().fragmentGeneration;
}
- public static int getColorGeneration() {
- return ctx().colorGeneration;
- }
-
- public static int getClipPlaneGeneration() {
- return ctx().clipPlaneGeneration;
- }
-
- public static float getOverlayR() {
- return ctx().overlayR;
- }
-
- public static float getOverlayG() {
- return ctx().overlayG;
- }
-
- public static float getOverlayB() {
- return ctx().overlayB;
- }
-
- public static float getOverlayA() {
- return ctx().overlayA;
- }
-
- public static float getShaderColorR() {
- return ctx().shaderColorR;
- }
-
- public static float getShaderColorG() {
- return ctx().shaderColorG;
- }
-
- public static float getShaderColorB() {
- return ctx().shaderColorB;
- }
-
- public static float getShaderColorA() {
- return ctx().shaderColorA;
- }
-
- public static int getAttribDepth() {
- return ctx().attribDepth;
- }
-
- public static IntegerStateStack getActiveTextureUnitStack() {
- return ctx().activeTextureUnit;
- }
-
- public static IntegerStateStack getProgramStack() {
- return ctx().programStack;
- }
-
- public static IntegerStateStack getShadeModelState() {
- return ctx().shadeModelState;
- }
-
- public static TextureUnitArray getTextures() {
- return ctx().textures;
- }
-
- public static BlendStateStack getBlendState() {
- return ctx().blendState;
- }
-
- public static BooleanStateStack getBlendMode() {
- return ctx().blendMode;
- }
-
- public static BooleanStateStack getScissorTest() {
- return ctx().scissorTest;
- }
-
- public static DepthStateStack getDepthState() {
- return ctx().depthState;
- }
-
- public static BooleanStateStack getDepthTest() {
- return ctx().depthTest;
- }
-
- public static FogStateStack getFogState() {
- return ctx().fogState;
- }
-
- public static BooleanStateStack getFogMode() {
- return ctx().fogMode;
- }
-
- public static Color4Stack getColor() {
- return ctx().color;
- }
-
- public static Color4Stack getSecondaryColor() {
- return ctx().secondaryColor;
- }
-
- public static BooleanStateStack getColorSumState() {
- return ctx().colorSumState;
- }
-
- public static Color4Stack getClearColor() {
- return ctx().clearColor;
- }
-
- public static ColorMaskStack getColorMask() {
- return ctx().colorMask;
- }
-
- public static IntegerStateStack getDrawBuffer() {
- return ctx().drawBuffer;
- }
-
- public static IntegerStateStack getLogicOpMode() {
- return ctx().logicOpMode;
- }
-
- public static BooleanStateStack getCullState() {
- return ctx().cullState;
- }
-
- public static AlphaStateStack getAlphaState() {
- return ctx().alphaState;
- }
-
- public static BooleanStateStack getAlphaTest() {
- return ctx().alphaTest;
- }
-
- public static BooleanStateStack getLightingState() {
- return ctx().lightingState;
- }
-
- public static BooleanStateStack getRescaleNormalState() {
- return ctx().rescaleNormalState;
- }
-
- public static BooleanStateStack getNormalizeState() {
- return ctx().normalizeState;
- }
-
- public static BooleanStateStack getDitherState() {
- return ctx().ditherState;
- }
-
- public static BooleanStateStack getStencilTest() {
- return ctx().stencilTest;
- }
-
- public static BooleanStateStack getLineSmoothState() {
- return ctx().lineSmoothState;
- }
-
- public static BooleanStateStack getLineStippleState() {
- return ctx().lineStippleState;
- }
-
- public static BooleanStateStack getPointSmoothState() {
- return ctx().pointSmoothState;
- }
-
- public static BooleanStateStack getPolygonSmoothState() {
- return ctx().polygonSmoothState;
- }
-
- public static BooleanStateStack getPolygonStippleState() {
- return ctx().polygonStippleState;
- }
-
- public static BooleanStateStack getMultisampleState() {
- return ctx().multisampleState;
- }
-
- public static BooleanStateStack getSampleAlphaToCoverageState() {
- return ctx().sampleAlphaToCoverageState;
- }
-
- public static BooleanStateStack getSampleAlphaToOneState() {
- return ctx().sampleAlphaToOneState;
- }
-
- public static BooleanStateStack getSampleCoverageState() {
- return ctx().sampleCoverageState;
- }
-
- public static BooleanStateStack getColorLogicOpState() {
- return ctx().colorLogicOpState;
- }
-
- public static BooleanStateStack getIndexLogicOpState() {
- return ctx().indexLogicOpState;
- }
-
- public static BooleanStateStack getPolygonOffsetPointState() {
- return ctx().polygonOffsetPointState;
- }
-
- public static BooleanStateStack getPolygonOffsetLineState() {
- return ctx().polygonOffsetLineState;
- }
-
- public static BooleanStateStack getPolygonOffsetFillState() {
- return ctx().polygonOffsetFillState;
- }
-
- public static LineStateStack getLineState() {
- return ctx().lineState;
- }
-
- public static PointStateStack getPointState() {
- return ctx().pointState;
- }
-
- public static IntegerStateStack getHintState() {
- return ctx().hintState;
- }
-
- public static BooleanStateStack getPointSpriteState() {
- return ctx().pointSpriteState;
- }
-
- public static BooleanStateStack getVertexProgramTwoSideState() {
- return ctx().vertexProgramTwoSideState;
- }
-
- public static BooleanStateStack getEdgeFlagState() {
- return ctx().edgeFlagState;
- }
-
- public static PolygonStateStack getPolygonState() {
- return ctx().polygonState;
- }
-
- public static StencilStateStack getStencilState() {
- return ctx().stencilState;
- }
-
- public static BooleanStateStack getAutoNormalState() {
- return ctx().autoNormalState;
- }
-
- public static BooleanStateStack getMap1Color4State() {
- return ctx().map1Color4State;
- }
-
- public static BooleanStateStack getMap1IndexState() {
- return ctx().map1IndexState;
- }
-
- public static BooleanStateStack getMap1NormalState() {
- return ctx().map1NormalState;
- }
-
- public static BooleanStateStack getMap1TextureCoord1State() {
- return ctx().map1TextureCoord1State;
- }
-
- public static BooleanStateStack getMap1TextureCoord2State() {
- return ctx().map1TextureCoord2State;
- }
-
- public static BooleanStateStack getMap1TextureCoord3State() {
- return ctx().map1TextureCoord3State;
- }
-
- public static BooleanStateStack getMap1TextureCoord4State() {
- return ctx().map1TextureCoord4State;
- }
-
- public static BooleanStateStack getMap1Vertex3State() {
- return ctx().map1Vertex3State;
- }
-
- public static BooleanStateStack getMap1Vertex4State() {
- return ctx().map1Vertex4State;
- }
-
- public static BooleanStateStack getMap2Color4State() {
- return ctx().map2Color4State;
- }
-
- public static BooleanStateStack getMap2IndexState() {
- return ctx().map2IndexState;
- }
-
- public static BooleanStateStack getMap2NormalState() {
- return ctx().map2NormalState;
- }
-
- public static BooleanStateStack getMap2TextureCoord1State() {
- return ctx().map2TextureCoord1State;
- }
-
- public static BooleanStateStack getMap2TextureCoord2State() {
- return ctx().map2TextureCoord2State;
- }
-
- public static BooleanStateStack getMap2TextureCoord3State() {
- return ctx().map2TextureCoord3State;
- }
-
- public static BooleanStateStack getMap2TextureCoord4State() {
- return ctx().map2TextureCoord4State;
- }
-
- public static BooleanStateStack getMap2Vertex3State() {
- return ctx().map2Vertex3State;
- }
-
- public static BooleanStateStack getMap2Vertex4State() {
- return ctx().map2Vertex4State;
- }
-
- public static BooleanStateStack[] getClipPlaneStates() {
- return ctx().clipPlaneStates;
- }
-
- public static ClipPlaneState getClipPlaneState() {
- return ctx().clipPlaneState;
- }
-
- public static MatrixModeStack getMatrixMode() {
- return ctx().matrixMode;
- }
-
- public static Matrix4fStack getModelViewMatrix() {
- return ctx().modelViewMatrix;
- }
-
- public static Matrix4fStack getProjectionMatrix() {
- return ctx().projectionMatrix;
- }
-
- public static BooleanStateStack[] getLightStates() {
- return ctx().lightStates;
- }
-
- public static LightStateStack[] getLightDataStates() {
- return ctx().lightDataStates;
- }
-
- public static BooleanStateStack getColorMaterial() {
- return ctx().colorMaterial;
- }
-
- public static IntegerStateStack getColorMaterialFace() {
- return ctx().colorMaterialFace;
- }
-
- public static IntegerStateStack getColorMaterialParameter() {
- return ctx().colorMaterialParameter;
- }
-
- public static LightModelStateStack getLightModel() {
- return ctx().lightModel;
- }
-
- public static MaterialStateStack getFrontMaterial() {
- return ctx().frontMaterial;
- }
-
- public static MaterialStateStack getBackMaterial() {
- return ctx().backMaterial;
- }
-
- public static void captureLighting(LightingSnapshot out) {
- final GLContextState glCtx = ctx();
- for (int i = 0; i < out.lights.length; i++) {
- out.lightEnabled[i] = glCtx.lightStates[i].isEnabled();
- out.lights[i].set(glCtx.lightDataStates[i]);
- }
- out.lightModel.set(glCtx.lightModel);
- out.frontMaterial.set(glCtx.frontMaterial);
- out.backMaterial.set(glCtx.backMaterial);
- out.colorMaterial = glCtx.colorMaterial.isEnabled();
- out.colorMaterialFace = glCtx.colorMaterialFace.getValue();
- out.colorMaterialParameter = glCtx.colorMaterialParameter.getValue();
- out.normalize = glCtx.normalizeState.isEnabled();
- out.rescaleNormal = glCtx.rescaleNormalState.isEnabled();
- }
-
- public static void applyLighting(LightingSnapshot in) {
- rejectExitCapture();
- final GLContextState glCtx = ctx();
- boolean changed = false;
- for (int i = 0; i < in.lights.length; i++) {
- glCtx.lightStates[i].setEnabled(in.lightEnabled[i]);
- if (!glCtx.lightDataStates[i].sameAs(in.lights[i])) {
- mod(glCtx.lightDataStates[i]).set(in.lights[i]);
- changed = true;
- }
- }
- if (!glCtx.lightModel.sameAs(in.lightModel)) {
- mod(glCtx.lightModel).set(in.lightModel);
- changed = true;
- }
- if (!glCtx.frontMaterial.sameAs(in.frontMaterial)) {
- mod(glCtx.frontMaterial).set(in.frontMaterial);
- changed = true;
- }
- if (!glCtx.backMaterial.sameAs(in.backMaterial)) {
- mod(glCtx.backMaterial).set(in.backMaterial);
- changed = true;
- }
- if (glCtx.colorMaterialFace.getValue() != in.colorMaterialFace || glCtx.colorMaterialParameter.getValue() != in.colorMaterialParameter) {
- mod(glCtx.colorMaterialFace).setValue(in.colorMaterialFace);
- mod(glCtx.colorMaterialParameter).setValue(in.colorMaterialParameter);
- changed = true;
- }
- // Direct set: glEnable(GL_COLOR_MATERIAL) would bake the current color over the captured material.
- glCtx.colorMaterial.setEnabled(in.colorMaterial);
- glCtx.normalizeState.setEnabled(in.normalize);
- glCtx.rescaleNormalState.setEnabled(in.rescaleNormal);
- if (changed) glCtx.lightingGeneration++;
- }
-
- public static ViewPortStateStack getViewportState() {
- return ctx().viewportState;
- }
-
- public static ScissorStateStack getScissorState() {
- return ctx().scissorState;
- }
-
- public static int getActiveProgram() {
- return ctx().activeProgram;
- }
-
- public static int getListBase() {
- return ctx().listBase;
- }
-
- public static int getBoundVBO() {
- return ctx().boundVBO;
- }
-
- public static int getBoundCopyReadBuffer() {
- return ctx().boundCopyReadBuffer;
- }
-
- public static int getBoundCopyWriteBuffer() {
- return ctx().boundCopyWriteBuffer;
- }
-
- public static int getBoundVAO() {
- return ctx().boundVAO;
- }
-
- public static int getDrawFramebuffer() {
- return ctx().drawFramebuffer;
- }
-
- public static int getReadFramebuffer() {
- return ctx().readFramebuffer;
- }
-
- public static int getTexGenGeneration() {
- return ctx().texGenGeneration;
- }
-
public static void incrementFragmentGeneration() {
ctx().fragmentGeneration++;
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java
index a98aa2e21..76f422502 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java
@@ -25,10 +25,10 @@ public final class LTWWorkaround {
oneTexel = BufferUtils.createByteBuffer(4);
}
oneTexel.clear();
- GLStateManager.forcePixelUnpackState(PixelStoreState.DEFAULT);
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMTextures.forcePixelUnpackState(PixelStoreState.DEFAULT);
+ GLSMBuffers.suspendPixelUnpackBuffer();
RENDER_BACKEND.texSubImage2D(target, level, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, oneTexel);
- GLStateManager.restorePixelUnpackBuffer();
- GLStateManager.restorePixelUnpackState(PixelStoreState.DEFAULT);
+ GLSMBuffers.restorePixelUnpackBuffer();
+ GLSMTextures.restorePixelUnpackState(PixelStoreState.DEFAULT);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java
index d2bb50fbb..1a3212f7f 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java
@@ -88,7 +88,7 @@ final class LegacyQueries {
private static FloatBuffer fillScratch(GLContextState glCtx, int pname) {
final FloatBuffer scratch = glCtx.queryScratch;
scratch.clear();
- GLStateManager.glGetFloat(pname, scratch);
+ GLSMQueries.glGetFloat(pname, scratch);
return scratch;
}
@@ -102,9 +102,9 @@ final class LegacyQueries {
return toInt(type, fillScratch(glCtx, pname).get(0));
}
return switch (type) {
- case BOOL -> GLStateManager.glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE;
- case FLOAT -> lround(GLStateManager.glGetFloat(glCtx, pname));
- case FLOATN -> floatToInt(GLStateManager.glGetFloat(glCtx, pname));
+ case BOOL -> GLSMQueries.glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE;
+ case FLOAT -> lround(GLSMQueries.glGetFloat(glCtx, pname));
+ case FLOATN -> floatToInt(GLSMQueries.glGetFloat(glCtx, pname));
default -> throw uncached(pname);
};
}
@@ -114,8 +114,8 @@ final class LegacyQueries {
return fillScratch(glCtx, pname).get(0);
}
return switch (type(desc)) {
- case BOOL -> GLStateManager.glGetBoolean(glCtx, pname) ? 1.0f : 0.0f;
- case INT -> (float) GLStateManager.glGetInteger(glCtx, pname);
+ case BOOL -> GLSMQueries.glGetBoolean(glCtx, pname) ? 1.0f : 0.0f;
+ case INT -> (float) GLSMQueries.glGetInteger(glCtx, pname);
default -> throw uncached(pname);
};
}
@@ -125,8 +125,8 @@ final class LegacyQueries {
return fillScratch(glCtx, pname).get(0) != 0.0f;
}
return switch (type(desc)) {
- case INT -> GLStateManager.glGetInteger(glCtx, pname) != 0;
- case FLOAT, FLOATN -> GLStateManager.glGetFloat(glCtx, pname) != 0.0f;
+ case INT -> GLSMQueries.glGetInteger(glCtx, pname) != 0;
+ case FLOAT, FLOATN -> GLSMQueries.glGetFloat(glCtx, pname) != 0.0f;
default -> throw uncached(pname);
};
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java
index d0bf40b5e..b6f5b8445 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java
@@ -114,7 +114,7 @@ public final class QuadConverter {
uploadAndDraw(glCtx, dst, quadCount * 6, GL11.GL_UNSIGNED_INT, 4, primcount, instanced);
return;
}
- GLStateManager.preDraw(glCtx, GL11.GL_TRIANGLES);
+ GLSMDraws.preDraw(glCtx, GL11.GL_TRIANGLES);
final int prevEbo = glCtx.vaos.boundEBO;
ensureCapacity(first / 4 + quadCount);
RENDER_BACKEND.bindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
@@ -143,7 +143,7 @@ public final class QuadConverter {
}
private static void uploadAndDraw(GLContextState glCtx, ByteBuffer dst, int triIndexCount, int indexType, int bytesPerIndex, int primcount, boolean instanced) {
- GLStateManager.preDraw(glCtx, GL11.GL_TRIANGLES);
+ GLSMDraws.preDraw(glCtx, GL11.GL_TRIANGLES);
final int needed = triIndexCount * bytesPerIndex;
final int prevEbo = glCtx.vaos.boundEBO;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
index 170d1dcd7..208af9cf7 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
@@ -209,14 +209,14 @@ public class RenderSystem {
public static void texImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, @Nullable ByteBuffer pixels) {
GLStateManager.rejectExitCapture();
- final GLStateManager.GLESTexImageRemap remap = GLStateManager.remapTexImageForGLES(internalformat, format, type);
+ final GLSMTextures.GLESTexImageRemap remap = GLSMTextures.remapTexImageForGLES(internalformat, format, type);
internalformat = remap.internalFormat();
format = remap.format();
type = remap.type();
- GLStateManager.glBindTexture(target, texture);
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMTextures.glBindTexture(target, texture);
+ GLSMBuffers.suspendPixelUnpackBuffer();
RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
if (target == GL11.GL_TEXTURE_2D && level == 0) {
TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
}
@@ -228,7 +228,7 @@ public class RenderSystem {
}
public static void copyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) {
- GLStateManager.glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border);
+ GLSMTextures.glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border);
}
public static void uniform1f(int location, float v0) {
@@ -304,50 +304,50 @@ public class RenderSystem {
public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMBuffers.suspendPixelUnpackBuffer();
dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
TextureInfoCache.INSTANCE.onTextureImage2D(texture, target, level, internalformat, width, height);
}
public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMBuffers.suspendPixelUnpackBuffer();
dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
TextureInfoCache.INSTANCE.onTextureImage2D(texture, target, level, internalformat, width, height);
}
public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMBuffers.suspendPixelUnpackBuffer();
dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture);
}
public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMBuffers.suspendPixelUnpackBuffer();
dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture);
}
public static void texImage1D(int texture, int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.glBindTexture(target, texture);
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMTextures.glBindTexture(target, texture);
+ GLSMBuffers.suspendPixelUnpackBuffer();
RENDER_BACKEND.texImage1D(target, level, internalformat, width, border, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
}
public static void texImage3D(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.glBindTexture(target, texture);
- GLStateManager.suspendPixelUnpackBuffer();
+ GLSMTextures.glBindTexture(target, texture);
+ GLSMBuffers.suspendPixelUnpackBuffer();
RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
- GLStateManager.restorePixelUnpackBuffer();
+ GLSMBuffers.restorePixelUnpackBuffer();
}
public static String getProgramInfoLog(int program) {
@@ -377,13 +377,13 @@ public class RenderSystem {
public static void readPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) {
GLStateManager.rejectExitCapture();
- GLStateManager.suspendPixelPackBuffer();
+ GLSMBuffers.suspendPixelPackBuffer();
RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels);
- GLStateManager.restorePixelPackBuffer();
+ GLSMBuffers.restorePixelPackBuffer();
}
public static void bufferData(int target, FloatBuffer data, int usage) {
- GLStateManager.glBufferData(target, data, usage);
+ GLSMBuffers.glBufferData(target, data, usage);
}
public static int bufferStorage(int target, FloatBuffer data, int usage) {
@@ -422,7 +422,7 @@ public class RenderSystem {
}
public static void bindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) {
- GLStateManager.glBindImageTexture(unit, texture, level, layered, layer, access, format);
+ GLSMTextures.glBindImageTexture(unit, texture, level, layered, layer, access, format);
}
public static int getMaxImageUnits() {
@@ -439,9 +439,9 @@ public class RenderSystem {
}
private static boolean hasExtension(String name) {
- final int count = GLStateManager.glGetInteger(GL30.GL_NUM_EXTENSIONS);
+ final int count = GLSMQueries.glGetInteger(GL30.GL_NUM_EXTENSIONS);
for (int i = 0; i < count; i++) {
- if (name.equals(GLStateManager.glGetStringi(GL11.GL_EXTENSIONS, i))) return true;
+ if (name.equals(GLSMQueries.glGetStringi(GL11.GL_EXTENSIONS, i))) return true;
}
return false;
}
@@ -533,7 +533,7 @@ public class RenderSystem {
}
public static void bindBuffer(int target, int buffer) {
- GLStateManager.glBindBuffer(target, buffer);
+ GLSMBuffers.glBindBuffer(target, buffer);
}
public static void memoryBarrier(int barriers) {
@@ -548,52 +548,52 @@ public class RenderSystem {
}
public static void disableBufferBlend(int buffer) {
- GLStateManager.glDisablei(GL11.GL_BLEND, buffer);
+ GLSMEnable.glDisablei(GL11.GL_BLEND, buffer);
}
public static void enableBufferBlend(int buffer) {
- GLStateManager.glEnablei(GL11.GL_BLEND, buffer);
+ GLSMEnable.glEnablei(GL11.GL_BLEND, buffer);
}
public static void blendFuncSeparatei(int buffer, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
- GLStateManager.glBlendFuncSeparatei(buffer, srcRGB, dstRGB, srcAlpha, dstAlpha);
+ GLSMBlend.glBlendFuncSeparatei(buffer, srcRGB, dstRGB, srcAlpha, dstAlpha);
}
public static void bindTextureToUnit(int unit, int texture) {
if (unit == 0) GLStateManager.recordExitTextureBind(GL11.GL_TEXTURE_2D, 0);
- else if (GLStateManager.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange();
+ else if (GLSMTextures.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange();
dsaState.bindTextureToUnit(unit, texture);
}
public static void bindTextureToUnit(int target, int unit, int texture) {
if (unit == 0) GLStateManager.recordExitTextureBind(target, 0);
- else if (GLStateManager.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange();
+ else if (GLSMTextures.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange();
dsaState.bindTextureToUnit(target, unit, texture);
}
public static void setupProjectionMatrix(Matrix4f matrix) {
final FloatBuffer projectionMatrixBuffer = GLStateManager.ctx().projectionMatrixBuffer;
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
matrix.get(0, projectionMatrixBuffer);
- GLStateManager.glLoadMatrix(projectionMatrixBuffer);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadMatrix(projectionMatrixBuffer);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
public static void restoreProjectionMatrix() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
public static void blitFramebuffer(int source, int dest, int offsetX, int offsetY, int width, int height, int offsetX2, int offsetY2, int width2, int height2, int bufferChoice, int filter) {
GLStateManager.rejectExitCapture();
- final boolean scissor = GLStateManager.glIsEnabled(GL11.GL_SCISSOR_TEST);
- if (scissor) GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ final boolean scissor = GLSMEnable.glIsEnabled(GL11.GL_SCISSOR_TEST);
+ if (scissor) GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
try {
dsaState.blitFramebuffer(source, dest, offsetX, offsetY, width, height, offsetX2, offsetY2, width2, height2, bufferChoice, filter);
} finally {
- if (scissor) GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
+ if (scissor) GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
}
}
@@ -617,30 +617,30 @@ public class RenderSystem {
}
public static int createBuffers() {
- return GLStateManager.glGenBuffers();
+ return GLSMBuffers.glGenBuffers();
}
public static int getIndexedBufferBinding(int target, int index) {
GLStateManager.rejectExitCapture();
- return GLStateManager.getIndexedBufferBinding(target, index);
+ return GLSMBuffers.getIndexedBufferBinding(target, index);
}
public static void bindBufferBase(int target, int index, int buffer) {
- GLStateManager.glBindBufferBase(target, index, buffer);
+ GLSMBuffers.glBindBufferBase(target, index, buffer);
}
public static void bufferStorage(int target, long size, int flags) {
- GLStateManager.glBufferStorage(target, size, flags);
+ GLSMBuffers.glBufferStorage(target, size, flags);
}
public static void clearBufferSubData(int target, int internalFormat, long offset, long size, int format, int type, int[] data) {
final ByteBuffer buf = BufferUtils.createByteBuffer(data.length * 4);
buf.asIntBuffer().put(data);
- GLStateManager.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf);
+ GLSMBuffers.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf);
}
public static void deleteBuffers(int buffer) {
- GLStateManager.glDeleteBuffers(buffer);
+ GLSMBuffers.glDeleteBuffers(buffer);
}
public static long getVRAM() {
@@ -688,32 +688,32 @@ public class RenderSystem {
public static int genSampler() {
if (!supportsSamplerObjects) return 0;
- return GLStateManager.glGenSamplers();
+ return GLSMTextures.glGenSamplers();
}
public static void destroySampler(int sampler) {
if (!supportsSamplerObjects || sampler == 0) return;
- GLStateManager.glDeleteSamplers(sampler);
+ GLSMTextures.glDeleteSamplers(sampler);
}
public static void samplerParameteri(int sampler, int pname, int param) {
if (!supportsSamplerObjects || sampler == 0) return;
- GLStateManager.glSamplerParameteri(sampler, pname, param);
+ GLSMTextures.glSamplerParameteri(sampler, pname, param);
}
public static void samplerParameterf(int sampler, int pname, float param) {
if (!supportsSamplerObjects || sampler == 0) return;
- GLStateManager.glSamplerParameterf(sampler, pname, param);
+ GLSMTextures.glSamplerParameterf(sampler, pname, param);
}
public static void bindSamplerToUnit(int unit, int sampler) {
if (!supportsSamplerObjects) return;
- GLStateManager.glBindSampler(unit, sampler);
+ GLSMTextures.glBindSampler(unit, sampler);
}
public static void unbindAllSamplers() {
if (!supportsSamplerObjects) return;
- GLStateManager.unbindAllSamplers();
+ GLSMTextures.unbindAllSamplers();
}
/** Parse a GL version string (e.g. "4.6.0 NVIDIA ...") into concatenated digits "460". Strips
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java
index f6ec54420..439a0900b 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java
@@ -49,7 +49,7 @@ public final class StateSet {
this.restore = restore;
this.bump = bump;
this.blendSnapshot = blendSnapshot;
- this.pushCommand = () -> GLStateManager.pushStateLive(this);
+ this.pushCommand = () -> GLSMAttribStack.pushStateLive(this);
}
public boolean contains(int id) {
@@ -83,18 +83,18 @@ public final class StateSet {
private static StateSet buildBatch() {
return new StateSet(0,
ids(
- GLStateManager.getBlendState(), GLStateManager.getAlphaState(), GLStateManager.getDepthState(),
- GLStateManager.getColorMask(), GLStateManager.getPolygonState(),
- GLStateManager.getTextures().getTextureUnitBindings(0), GLStateManager.getTextures().getTextureUnitBindings(1),
- GLStateManager.getActiveTextureUnitStack(),
- GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getDepthTest(),
- GLStateManager.getLightingState(), GLStateManager.getCullState(), GLStateManager.getPolygonOffsetFillState(),
- GLStateManager.getTextures().getTextureUnitStates(0), GLStateManager.getTextures().getTextureUnitStates(1),
- GLStateManager.getLightStates()[0], GLStateManager.getLightStates()[1],
- GLStateManager.getLightDataStates()[0], GLStateManager.getLightDataStates()[1],
- GLStateManager.getColorMaterial(), GLStateManager.getColorMaterialFace(), GLStateManager.getColorMaterialParameter(),
- GLStateManager.getLightModel(), GLStateManager.getFrontMaterial(), GLStateManager.getBackMaterial(),
- GLStateManager.getNormalizeState(), GLStateManager.getRescaleNormalState()
+ GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getDepthState(),
+ GLSMBlend.getColorMask(), GLSMRasterizer.getPolygonState(),
+ GLSMTextures.getTextures().getTextureUnitBindings(0), GLSMTextures.getTextures().getTextureUnitBindings(1),
+ GLSMTextures.getActiveTextureUnitStack(),
+ GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMDepthStencilAlpha.getDepthTest(),
+ GLSMLighting.getLightingState(), GLSMRasterizer.getCullState(), GLSMRasterizer.getPolygonOffsetFillState(),
+ GLSMTextures.getTextures().getTextureUnitStates(0), GLSMTextures.getTextures().getTextureUnitStates(1),
+ GLSMLighting.getLightStates()[0], GLSMLighting.getLightStates()[1],
+ GLSMLighting.getLightDataStates()[0], GLSMLighting.getLightDataStates()[1],
+ GLSMLighting.getColorMaterial(), GLSMLighting.getColorMaterialFace(), GLSMLighting.getColorMaterialParameter(),
+ GLSMLighting.getLightModel(), GLSMLighting.getFrontMaterial(), GLSMLighting.getBackMaterial(),
+ GLSMLighting.getNormalizeState(), GLSMLighting.getRescaleNormalState()
),
R_BLEND | R_DEPTH | R_COLOR_MASK | R_POLYGON | R_TEXTURE | R_ACTIVE_UNIT,
B_FRAG_COLORBUF | B_LIGHTING,
@@ -104,13 +104,13 @@ public final class StateSet {
private static StateSet buildFont() {
return new StateSet(0,
ids(
- GLStateManager.getBlendState(), GLStateManager.getDepthState(), GLStateManager.getShadeModelState(),
- GLStateManager.getTextures().getTextureUnitBindings(0), GLStateManager.getTextures().getTextureUnitBindings(1),
- GLStateManager.getActiveTextureUnitStack(), GLStateManager.getProgramStack(),
- GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getDepthTest(),
- GLStateManager.getTextures().getTextureUnitStates(0),
- GLStateManager.getColorMask(), GLStateManager.getCullState(),
- GLStateManager.getPolygonState(), GLStateManager.getPolygonOffsetFillState()
+ GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getDepthState(), GLSMRasterizer.getShadeModelState(),
+ GLSMTextures.getTextures().getTextureUnitBindings(0), GLSMTextures.getTextures().getTextureUnitBindings(1),
+ GLSMTextures.getActiveTextureUnitStack(), GLSMPrograms.getProgramStack(),
+ GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMDepthStencilAlpha.getDepthTest(),
+ GLSMTextures.getTextures().getTextureUnitStates(0),
+ GLSMBlend.getColorMask(), GLSMRasterizer.getCullState(),
+ GLSMRasterizer.getPolygonState(), GLSMRasterizer.getPolygonOffsetFillState()
),
R_BLEND | R_DEPTH | R_COLOR_MASK | R_TEXTURE | R_ACTIVE_UNIT | R_PROGRAM | R_POLYGON,
0,
@@ -120,13 +120,13 @@ public final class StateSet {
private static StateSet buildFontPipeline() {
return new StateSet(0,
ids(
- GLStateManager.getBlendState(), GLStateManager.getDepthState(),
- GLStateManager.getTextures().getTextureUnitBindings(0), GLStateManager.getTextures().getTextureUnitBindings(1),
- GLStateManager.getActiveTextureUnitStack(),
- GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getDepthTest(),
- GLStateManager.getTextures().getTextureUnitStates(0),
- GLStateManager.getColorMask(), GLStateManager.getCullState(),
- GLStateManager.getPolygonState(), GLStateManager.getPolygonOffsetFillState()
+ GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getDepthState(),
+ GLSMTextures.getTextures().getTextureUnitBindings(0), GLSMTextures.getTextures().getTextureUnitBindings(1),
+ GLSMTextures.getActiveTextureUnitStack(),
+ GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMDepthStencilAlpha.getDepthTest(),
+ GLSMTextures.getTextures().getTextureUnitStates(0),
+ GLSMBlend.getColorMask(), GLSMRasterizer.getCullState(),
+ GLSMRasterizer.getPolygonState(), GLSMRasterizer.getPolygonOffsetFillState()
),
R_BLEND | R_DEPTH | R_COLOR_MASK | R_TEXTURE | R_ACTIVE_UNIT | R_POLYGON,
0,
@@ -136,8 +136,8 @@ public final class StateSet {
private static StateSet buildHand() {
return new StateSet(0,
ids(
- GLStateManager.getBlendState(), GLStateManager.getAlphaState(), GLStateManager.getDepthState(),
- GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getTextures().getTextureUnitStates(1)
+ GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getDepthState(),
+ GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMTextures.getTextures().getTextureUnitStates(1)
),
R_BLEND | R_DEPTH,
B_FRAG_COLORBUF,
@@ -146,7 +146,7 @@ public final class StateSet {
private static StateSet buildBlend() {
return new StateSet(0,
- ids(GLStateManager.getBlendState(), GLStateManager.getBlendMode()),
+ ids(GLSMBlend.getBlendState(), GLSMBlend.getBlendMode()),
R_BLEND,
0,
true);
@@ -154,7 +154,7 @@ public final class StateSet {
private static StateSet buildAlpha() {
return new StateSet(0,
- ids(GLStateManager.getAlphaState(), GLStateManager.getAlphaTest()),
+ ids(GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getAlphaTest()),
0,
B_FRAG_COLORBUF,
false);
@@ -162,7 +162,7 @@ public final class StateSet {
private static StateSet buildCutout() {
return new StateSet(0,
- ids(GLStateManager.getAlphaState(), GLStateManager.getAlphaTest(), GLStateManager.getTextures().getTextureUnitStates(1)),
+ ids(GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMTextures.getTextures().getTextureUnitStates(1)),
0,
B_FRAG_COLORBUF,
false);
@@ -170,7 +170,7 @@ public final class StateSet {
private static StateSet buildMasks() {
return new StateSet(0,
- ids(GLStateManager.getDepthState(), GLStateManager.getColorMask()),
+ ids(GLSMDepthStencilAlpha.getDepthState(), GLSMBlend.getColorMask()),
R_DEPTH | R_COLOR_MASK,
0,
false);
@@ -178,7 +178,7 @@ public final class StateSet {
private static StateSet buildCull() {
return new StateSet(0,
- ids(GLStateManager.getPolygonState(), GLStateManager.getCullState()),
+ ids(GLSMRasterizer.getPolygonState(), GLSMRasterizer.getCullState()),
R_POLYGON,
0,
false);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java
index b133f7459..9775bc7fb 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java
@@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.backend;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizons.angelica.glsm.GLESFormatRemap;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.texture.TextureStaging;
@@ -249,7 +250,7 @@ public abstract class RenderBackend {
public void onFrameBegin() {
if (GLStateManager.takeStateSeedPending()) {
- GLStateManager.replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java
index 5063a98a0..3e30d312c 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.compat.lwjgl;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import org.lwjgl.util.glu.Cylinder;
import static org.lwjgl.opengl.GL11.GL_LINES;
@@ -28,11 +29,11 @@ public class AngelicaCylinder extends Cylinder {
y /= mag;
z /= mag;
}
- GLStateManager.glNormal3f(x, y, z);
+ GLSMCurrentAttribs.glNormal3f(x, y, z);
}
private void emitTexCoord(float x, float y) {
- if (super.textureFlag) GLStateManager.glTexCoord2f(x, y);
+ if (super.textureFlag) GLSMCurrentAttribs.glTexCoord2f(x, y);
}
@Override
@@ -48,7 +49,7 @@ public class AngelicaCylinder extends Cylinder {
nz = (baseRadius - topRadius) / height;
if (super.drawStyle == GLU_POINT) {
- GLStateManager.glBegin(GL_POINTS);
+ GLSMDraws.glBegin(GL_POINTS);
for (int i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
@@ -57,60 +58,60 @@ public class AngelicaCylinder extends Cylinder {
z = 0.0f;
r = baseRadius;
for (int j = 0; j <= stacks; j++) {
- GLStateManager.glVertex3f(x * r, y * r, z);
+ GLSMDraws.glVertex3f(x * r, y * r, z);
z += dz;
r += dr;
}
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
} else if (super.drawStyle == GLU_LINE || super.drawStyle == GLU_SILHOUETTE) {
// Draw rings
if (super.drawStyle == GLU_LINE) {
z = 0.0f;
r = baseRadius;
for (int j = 0; j <= stacks; j++) {
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (int i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
emitNormal(x * nsign, y * nsign, nz * nsign);
- GLStateManager.glVertex3f(x * r, y * r, z);
+ GLSMDraws.glVertex3f(x * r, y * r, z);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
z += dz;
r += dr;
}
} else {
// draw one ring at each end
if (baseRadius != 0.0) {
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (int i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
emitNormal(x * nsign, y * nsign, nz * nsign);
- GLStateManager.glVertex3f(x * baseRadius, y * baseRadius, 0.0f);
+ GLSMDraws.glVertex3f(x * baseRadius, y * baseRadius, 0.0f);
}
- GLStateManager.glEnd();
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glEnd();
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (int i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
emitNormal(x * nsign, y * nsign, nz * nsign);
- GLStateManager.glVertex3f(x * topRadius, y * topRadius, height);
+ GLSMDraws.glVertex3f(x * topRadius, y * topRadius, height);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
}
// draw length lines
- GLStateManager.glBegin(GL_LINES);
+ GLSMDraws.glBegin(GL_LINES);
for (int i = 0; i < slices; i++) {
x = cos(i * da);
y = sin(i * da);
emitNormal(x * nsign, y * nsign, nz * nsign);
- GLStateManager.glVertex3f(x * baseRadius, y * baseRadius, 0.0f);
- GLStateManager.glVertex3f(x * topRadius, y * topRadius, height);
+ GLSMDraws.glVertex3f(x * baseRadius, y * baseRadius, 0.0f);
+ GLSMDraws.glVertex3f(x * topRadius, y * topRadius, height);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
} else if (super.drawStyle == GLU_FILL) {
final float ds = 1.0f / slices;
final float dt = 1.0f / stacks;
@@ -119,20 +120,20 @@ public class AngelicaCylinder extends Cylinder {
r = baseRadius;
for (int j = 0; j < stacks; j++) {
float s = 0.0f;
- GLStateManager.glBegin(GL_TRIANGLE_STRIP);
+ GLSMDraws.glBegin(GL_TRIANGLE_STRIP);
for (int i = 0; i <= slices; i++) {
final float angle = (i == slices) ? 0.0f : i * da;
x = sin(angle);
y = cos(angle);
emitNormal(x * nsign, y * nsign, nz * nsign);
emitTexCoord(s, t);
- GLStateManager.glVertex3f(x * r, y * r, z);
+ GLSMDraws.glVertex3f(x * r, y * r, z);
emitNormal(x * nsign, y * nsign, nz * nsign);
emitTexCoord(s, t + dt);
- GLStateManager.glVertex3f(x * (r + dr), y * (r + dr), z + dz);
+ GLSMDraws.glVertex3f(x * (r + dr), y * (r + dr), z + dz);
s += ds;
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
r += dr;
t += dt;
z += dz;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java
index 1c6e59dd2..7dc48d047 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.compat.lwjgl;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import org.lwjgl.util.glu.Disk;
import static org.lwjgl.opengl.GL11.GL_LINE_LOOP;
@@ -23,7 +24,7 @@ public class AngelicaDisk extends Disk {
private static final float PI = (float) Math.PI;
private void emitTexCoord(float x, float y) {
- if (super.textureFlag) GLStateManager.glTexCoord2f(x, y);
+ if (super.textureFlag) GLSMCurrentAttribs.glTexCoord2f(x, y);
}
@Override
@@ -31,7 +32,7 @@ public class AngelicaDisk extends Disk {
final float da, dr;
if (super.normals != GLU_NONE) {
- GLStateManager.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f);
}
da = 2.0f * PI / slices;
@@ -45,29 +46,29 @@ public class AngelicaDisk extends Disk {
for (int l = 0; l < loops; l++) {
final float r2 = r1 + dr;
if (super.orientation == GLU_OUTSIDE) {
- GLStateManager.glBegin(GL_TRIANGLE_STRIP);
+ GLSMDraws.glBegin(GL_TRIANGLE_STRIP);
for (int s = 0; s <= slices; s++) {
final float a = (s == slices) ? 0.0f : s * da;
sa = sin(a);
ca = cos(a);
emitTexCoord(0.5f + sa * r2 / dtc, 0.5f + ca * r2 / dtc);
- GLStateManager.glVertex2f(r2 * sa, r2 * ca);
+ GLSMDraws.glVertex2f(r2 * sa, r2 * ca);
emitTexCoord(0.5f + sa * r1 / dtc, 0.5f + ca * r1 / dtc);
- GLStateManager.glVertex2f(r1 * sa, r1 * ca);
+ GLSMDraws.glVertex2f(r1 * sa, r1 * ca);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
} else {
- GLStateManager.glBegin(GL_TRIANGLE_STRIP);
+ GLSMDraws.glBegin(GL_TRIANGLE_STRIP);
for (int s = slices; s >= 0; s--) {
final float a = (s == slices) ? 0.0f : s * da;
sa = sin(a);
ca = cos(a);
emitTexCoord(0.5f - sa * r2 / dtc, 0.5f + ca * r2 / dtc);
- GLStateManager.glVertex2f(r2 * sa, r2 * ca);
+ GLSMDraws.glVertex2f(r2 * sa, r2 * ca);
emitTexCoord(0.5f - sa * r1 / dtc, 0.5f + ca * r1 / dtc);
- GLStateManager.glVertex2f(r1 * sa, r1 * ca);
+ GLSMDraws.glVertex2f(r1 * sa, r1 * ca);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
r1 = r2;
}
@@ -76,56 +77,56 @@ public class AngelicaDisk extends Disk {
/* draw loops */
for (int l = 0; l <= loops; l++) {
final float r = innerRadius + l * dr;
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (int s = 0; s < slices; s++) {
final float a = s * da;
- GLStateManager.glVertex2f(r * sin(a), r * cos(a));
+ GLSMDraws.glVertex2f(r * sin(a), r * cos(a));
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
/* draw spokes */
for (int s = 0; s < slices; s++) {
final float a = s * da;
final float x = sin(a);
final float y = cos(a);
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int l = 0; l <= loops; l++) {
final float r = innerRadius + l * dr;
- GLStateManager.glVertex2f(r * x, r * y);
+ GLSMDraws.glVertex2f(r * x, r * y);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
}
case GLU_POINT -> {
- GLStateManager.glBegin(GL_POINTS);
+ GLSMDraws.glBegin(GL_POINTS);
for (int s = 0; s < slices; s++) {
final float a = s * da;
final float x = sin(a);
final float y = cos(a);
for (int l = 0; l <= loops; l++) {
final float r = innerRadius * l * dr;
- GLStateManager.glVertex2f(r * x, r * y);
+ GLSMDraws.glVertex2f(r * x, r * y);
}
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
case GLU_SILHOUETTE -> {
if (innerRadius != 0.0) {
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (float a = 0.0f; a < 2.0 * PI; a += da) {
final float x = innerRadius * sin(a);
final float y = innerRadius * cos(a);
- GLStateManager.glVertex2f(x, y);
+ GLSMDraws.glVertex2f(x, y);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (float a = 0; a < 2.0f * PI; a += da) {
final float x = outerRadius * sin(a);
final float y = outerRadius * cos(a);
- GLStateManager.glVertex2f(x, y);
+ GLSMDraws.glVertex2f(x, y);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
default -> {
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
index c3fcd4d2e..d00d6f779 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
@@ -1,5 +1,7 @@
package com.gtnewhorizons.angelica.glsm.compat.lwjgl;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.lwjgl.util.glu.PartialDisk;
@@ -63,7 +65,7 @@ public class AngelicaPartialDisk extends PartialDisk {
}
switch (super.normals) {
- case GLU_FLAT, GLU_SMOOTH -> GLStateManager.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f);
+ case GLU_FLAT, GLU_SMOOTH -> GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f);
default -> {
}
}
@@ -73,11 +75,11 @@ public class AngelicaPartialDisk extends PartialDisk {
if (innerRadius == .0f) {
finish = loops - 1;
/* Triangle strip for inner polygons */
- GLStateManager.glBegin(GL_TRIANGLE_FAN);
+ GLSMDraws.glBegin(GL_TRIANGLE_FAN);
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(0.5f, 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(0.5f, 0.5f);
}
- GLStateManager.glVertex3f(0.0f, 0.0f, 0.0f);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, 0.0f);
radiusLow = outerRadius - deltaRadius * ((float) (loops - 1) / loops);
if (super.textureFlag) {
texLow = radiusLow / outerRadius / 2;
@@ -86,19 +88,19 @@ public class AngelicaPartialDisk extends PartialDisk {
if (super.orientation == GLU_OUTSIDE) {
for (int i = slices; i >= 0; i--) {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
}
} else {
for (int i = 0; i <= slices; i++) {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
}
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
} else {
finish = loops;
}
@@ -110,35 +112,35 @@ public class AngelicaPartialDisk extends PartialDisk {
texHigh = radiusHigh / outerRadius / 2;
}
- GLStateManager.glBegin(GL_TRIANGLE_STRIP);
+ GLSMDraws.glBegin(GL_TRIANGLE_STRIP);
for (int i = 0; i <= slices; i++) {
if (super.orientation == GLU_OUTSIDE) {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f);
} else {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f);
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
}
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
}
case GLU_POINT -> {
- GLStateManager.glBegin(GL_POINTS);
+ GLSMDraws.glBegin(GL_POINTS);
for (int i = 0; i < slices2; i++) {
sintemp = sinCache[i];
costemp = cosCache[i];
@@ -148,24 +150,24 @@ public class AngelicaPartialDisk extends PartialDisk {
if (super.textureFlag) {
texLow = radiusLow / outerRadius / 2;
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f);
}
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
case GLU_LINE -> {
if (innerRadius == outerRadius) {
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int i = 0; i <= slices; i++) {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(sinCache[i] / 2 + 0.5f, cosCache[i] / 2 + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(sinCache[i] / 2 + 0.5f, cosCache[i] / 2 + 0.5f);
}
- GLStateManager.glVertex3f(innerRadius * sinCache[i], innerRadius * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(innerRadius * sinCache[i], innerRadius * cosCache[i], 0.0f);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
break;
}
for (int j = 0; j <= loops; j++) {
@@ -174,19 +176,19 @@ public class AngelicaPartialDisk extends PartialDisk {
texLow = radiusLow / outerRadius / 2;
}
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int i = 0; i <= slices; i++) {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
for (int i = 0; i < slices2; i++) {
sintemp = sinCache[i];
costemp = cosCache[i];
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int j = 0; j <= loops; j++) {
radiusLow = outerRadius - deltaRadius * ((float) j / loops);
if (super.textureFlag) {
@@ -194,11 +196,11 @@ public class AngelicaPartialDisk extends PartialDisk {
}
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
}
case GLU_SILHOUETTE -> {
@@ -206,17 +208,17 @@ public class AngelicaPartialDisk extends PartialDisk {
for (int i = 0; i <= slices; i += slices) {
sintemp = sinCache[i];
costemp = cosCache[i];
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int j = 0; j <= loops; j++) {
radiusLow = outerRadius - deltaRadius * ((float) j / loops);
if (super.textureFlag) {
texLow = radiusLow / outerRadius / 2;
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
}
for (int j = 0; j <= loops; j += loops) {
@@ -225,14 +227,14 @@ public class AngelicaPartialDisk extends PartialDisk {
texLow = radiusLow / outerRadius / 2;
}
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int i = 0; i <= slices; i++) {
if (super.textureFlag) {
- GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
+ GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f);
}
- GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
+ GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
if (innerRadius == outerRadius) break;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java
index deca48e9c..8697fe7c5 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.compat.lwjgl;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import org.lwjgl.util.glu.Sphere;
import static org.lwjgl.opengl.GL11.GL_LINE_LOOP;
@@ -30,11 +31,11 @@ public class AngelicaSphere extends Sphere {
y /= mag;
z /= mag;
}
- GLStateManager.glNormal3f(x, y, z);
+ GLSMCurrentAttribs.glNormal3f(x, y, z);
}
private void emitTexCoord(float x, float y) {
- if (super.textureFlag) GLStateManager.glTexCoord2f(x, y);
+ if (super.textureFlag) GLSMCurrentAttribs.glTexCoord2f(x, y);
}
@Override
@@ -54,9 +55,9 @@ public class AngelicaSphere extends Sphere {
if (super.drawStyle == GLU_FILL) {
if (!super.textureFlag) {
// draw +Z end as a triangle fan
- GLStateManager.glBegin(GL_TRIANGLE_FAN);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glVertex3f(0.0f, 0.0f, nsign * radius);
+ GLSMDraws.glBegin(GL_TRIANGLE_FAN);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, nsign * radius);
for (int j = 0; j <= slices; j++) {
theta = (j == slices) ? 0.0f : j * dtheta;
x = -sin(theta) * sin(drho);
@@ -65,9 +66,9 @@ public class AngelicaSphere extends Sphere {
if (normals) {
emitNormal(x * nsign, y * nsign, z * nsign);
}
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
ds = 1.0f / slices;
@@ -84,7 +85,7 @@ public class AngelicaSphere extends Sphere {
// draw intermediate stacks as triangle strips (GL_QUAD_STRIP removed in core profile)
for (int i = imin; i < imax; i++) {
rho = i * drho;
- GLStateManager.glBegin(GL_TRIANGLE_STRIP);
+ GLSMDraws.glBegin(GL_TRIANGLE_STRIP);
s = 0.0f;
for (int j = 0; j <= slices; j++) {
theta = (j == slices) ? 0.0f : j * dtheta;
@@ -95,7 +96,7 @@ public class AngelicaSphere extends Sphere {
emitNormal(x * nsign, y * nsign, z * nsign);
}
emitTexCoord(s, t);
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
x = -sin(theta) * sin(rho + drho);
y = cos(theta) * sin(rho + drho);
z = nsign * cos(rho + drho);
@@ -104,17 +105,17 @@ public class AngelicaSphere extends Sphere {
}
emitTexCoord(s, t - dt);
s += ds;
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
t -= dt;
}
if (!super.textureFlag) {
// draw -Z end as a triangle fan
- GLStateManager.glBegin(GL_TRIANGLE_FAN);
- GLStateManager.glNormal3f(0.0f, 0.0f, -1.0f);
- GLStateManager.glVertex3f(0.0f, 0.0f, -radius * nsign);
+ GLSMDraws.glBegin(GL_TRIANGLE_FAN);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, -1.0f);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, -radius * nsign);
rho = PI - drho;
s = 1.0f;
for (int j = slices; j >= 0; j--) {
@@ -124,46 +125,46 @@ public class AngelicaSphere extends Sphere {
z = nsign * cos(rho);
if (normals) emitNormal(x * nsign, y * nsign, z * nsign);
s -= ds;
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
} else if (super.drawStyle == GLU_LINE || super.drawStyle == GLU_SILHOUETTE) {
// draw stack lines
for (int i = 1; i < stacks; i++) {
rho = i * drho;
- GLStateManager.glBegin(GL_LINE_LOOP);
+ GLSMDraws.glBegin(GL_LINE_LOOP);
for (int j = 0; j < slices; j++) {
theta = j * dtheta;
x = cos(theta) * sin(rho);
y = sin(theta) * sin(rho);
z = cos(rho);
if (normals) emitNormal(x * nsign, y * nsign, z * nsign);
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
// draw slice lines
for (int j = 0; j < slices; j++) {
theta = j * dtheta;
- GLStateManager.glBegin(GL_LINE_STRIP);
+ GLSMDraws.glBegin(GL_LINE_STRIP);
for (int i = 0; i <= stacks; i++) {
rho = i * drho;
x = cos(theta) * sin(rho);
y = sin(theta) * sin(rho);
z = cos(rho);
if (normals) emitNormal(x * nsign, y * nsign, z * nsign);
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
} else if (super.drawStyle == GLU_POINT) {
// top and bottom-most points
- GLStateManager.glBegin(GL_POINTS);
- if (normals) GLStateManager.glNormal3f(0.0f, 0.0f, nsign);
- GLStateManager.glVertex3f(0.0f, 0.0f, radius);
- if (normals) GLStateManager.glNormal3f(0.0f, 0.0f, -nsign);
- GLStateManager.glVertex3f(0.0f, 0.0f, -radius);
+ GLSMDraws.glBegin(GL_POINTS);
+ if (normals) GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, nsign);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, radius);
+ if (normals) GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, -nsign);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, -radius);
// loop over stacks
for (int i = 1; i < stacks - 1; i++) {
@@ -174,10 +175,10 @@ public class AngelicaSphere extends Sphere {
y = sin(theta) * sin(rho);
z = cos(rho);
if (normals) emitNormal(x * nsign, y * nsign, z * nsign);
- GLStateManager.glVertex3f(x * radius, y * radius, z * radius);
+ GLSMDraws.glVertex3f(x * radius, y * radius, z * radius);
}
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java
index 02a561844..63f601b20 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java
@@ -1,5 +1,8 @@
package com.gtnewhorizons.angelica.glsm.dsa;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
import org.lwjgl.opengl.GL11;
@@ -42,23 +45,23 @@ public class DSAARB extends DSAUnsupported {
@Override
public void texParameteri(int texture, int target, int pname, int param) {
- param = GLStateManager.remapTexClamp(pname, param);
- if(!GLStateManager.updateTexParameteriCache(target, texture, pname, param)) return;
+ param = GLSMTextures.remapTexClamp(pname, param);
+ if(!GLSMTextures.updateTexParameteriCache(target, texture, pname, param)) return;
RENDER_BACKEND.textureParameteri(texture, target, pname, param);
}
@Override
public void texParameterf(int texture, int target, int pname, float param) {
- param = GLStateManager.remapTexClamp(pname, param);
- if(!GLStateManager.updateTexParameterfCache(target, texture, pname, param)) return;
+ param = GLSMTextures.remapTexClamp(pname, param);
+ if(!GLSMTextures.updateTexParameterfCache(target, texture, pname, param)) return;
RENDER_BACKEND.textureParameterf(texture, target, pname, param);
}
@Override
public void texParameteriv(int texture, int target, int pname, IntBuffer params) {
- GLStateManager.remapTexClampBuffer(pname, params);
+ GLSMTextures.remapTexClampBuffer(pname, params);
RENDER_BACKEND.textureParameteriv(texture, target, pname, params);
}
@@ -74,8 +77,8 @@ public class DSAARB extends DSAUnsupported {
@Override
public int getTexParameteri(int texture, int target, int pname) {
- final long v = GLStateManager.lookupTexParameteri(TextureInfoCache.INSTANCE.getInfo(texture), pname);
- return v != GLStateManager.TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTextureParameteri(texture, target, pname);
+ final long v = GLSMTextures.lookupTexParameteri(TextureInfoCache.INSTANCE.getInfo(texture), pname);
+ return v != GLSMTextures.TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTextureParameteri(texture, target, pname);
}
@Override
@@ -100,23 +103,23 @@ public class DSAARB extends DSAUnsupported {
@Override
public void bindTextureToUnit(int target, int unit, int texture) {
- if(GLStateManager.getBoundTextureForServerState(unit) == texture) return;
+ if(GLSMTextures.getBoundTextureForServerState(unit) == texture) return;
if (texture == 0) {
super.bindTextureToUnit(target != 0 ? target : GL11.GL_TEXTURE_2D, unit, texture);
} else {
RENDER_BACKEND.bindTextureUnit(unit, texture);
- final var binding = GLStateManager.getTextures().getTextureUnitBindings(unit);
+ final var binding = GLSMTextures.getTextures().getTextureUnitBindings(unit);
binding.beforeModify();
binding.setBinding(texture, target);
- GLStateManager.trackMaxBoundTextureUnit(unit);
+ GLSMTextures.trackMaxBoundTextureUnit(unit);
}
}
@Override
public int bufferStorage(int target, FloatBuffer data, int usage) {
- final int buffer = GLStateManager.glCreateBuffers();
- GLStateManager.glNamedBufferData(buffer, data, usage);
+ final int buffer = GLSMBuffers.glCreateBuffers();
+ GLSMBuffers.glNamedBufferData(buffer, data, usage);
return buffer;
}
@@ -128,7 +131,7 @@ public class DSAARB extends DSAUnsupported {
@Override
public void framebufferTexture2D(int fb, int fbtarget, int attachment, int target, int texture, int levels) {
- GLStateManager.glNamedFramebufferTexture(fb, attachment, texture, levels);
+ GLSMFramebuffer.glNamedFramebufferTexture(fb, attachment, texture, levels);
}
@Override
@@ -139,6 +142,6 @@ public class DSAARB extends DSAUnsupported {
@Override
public int createTexture(int target) {
- return GLStateManager.glCreateTextures(target);
+ return GLSMTextures.glCreateTextures(target);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java
index 4afbef548..1d601a212 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java
@@ -1,5 +1,8 @@
package com.gtnewhorizons.angelica.glsm.dsa;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack;
import com.gtnewhorizons.angelica.glsm.texture.TextureTargets;
@@ -17,7 +20,7 @@ public class DSAUnsupported implements DSAAccess {
@Override
public void generateMipmaps(int texture, int target) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
RENDER_BACKEND.generateMipmap(target);
}
@@ -56,40 +59,40 @@ public class DSAUnsupported implements DSAAccess {
@Override
public void texParameteri(int texture, int target, int pname, int param) {
final int previous = bindForEdit(target, texture);
- GLStateManager.glTexParameteri(target, pname, param);
+ GLSMTextures.glTexParameteri(target, pname, param);
restoreBinding(target, previous);
}
@Override
public void texParameterf(int texture, int target, int pname, float param) {
final int previous = bindForEdit(target, texture);
- GLStateManager.glTexParameterf(target, pname, param);
+ GLSMTextures.glTexParameterf(target, pname, param);
restoreBinding(target, previous);
}
@Override
public void texParameteriv(int texture, int target, int pname, IntBuffer params) {
final int previous = bindForEdit(target, texture);
- GLStateManager.glTexParameter(target, pname, params);
+ GLSMTextures.glTexParameter(target, pname, params);
restoreBinding(target, previous);
}
@Override
public void readBuffer(int framebuffer, int buffer) {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
RENDER_BACKEND.readBuffer(buffer);
}
@Override
public void drawBuffers(int framebuffer, IntBuffer buffers) {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
RENDER_BACKEND.drawBuffers(buffers);
}
@Override
public int getTexParameteri(int texture, int target, int pname) {
final int previous = bindForEdit(target, texture);
- final int result = GLStateManager.glGetTexParameteri(target, pname);
+ final int result = GLSMTextures.glGetTexParameteri(target, pname);
restoreBinding(target, previous);
return result;
}
@@ -97,7 +100,7 @@ public class DSAUnsupported implements DSAAccess {
@Override
public float getTexParameterf(int texture, int target, int pname) {
final int previous = bindForEdit(target, texture);
- final float result = GLStateManager.glGetTexParameterf(target, pname);
+ final float result = GLSMTextures.glGetTexParameterf(target, pname);
restoreBinding(target, previous);
return result;
}
@@ -114,29 +117,29 @@ public class DSAUnsupported implements DSAAccess {
@Override
public void copyTexSubImage2D(int destTexture, int target, int i, int i1, int i2, int i3, int i4, int width, int height) {
final int previous = previous2D();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, destTexture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, destTexture);
RENDER_BACKEND.copyTexSubImage2D(target, i, i1, i2, i3, i4, width, height);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previous);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previous);
}
@Override
public void bindTextureToUnit(int unit, int texture) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
}
@Override
public void bindTextureToUnit(int target, int unit, int texture) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glBindTexture(target, texture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMTextures.glBindTexture(target, texture);
}
@Override
public int bufferStorage(int target, FloatBuffer data, int usage) {
- final int buffer = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(target, buffer);
- GLStateManager.glBufferData(target, data, usage);
- GLStateManager.glBindBuffer(target, 0);
+ final int buffer = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(target, buffer);
+ GLSMBuffers.glBufferData(target, data, usage);
+ GLSMBuffers.glBindBuffer(target, 0);
return buffer;
}
@@ -144,28 +147,28 @@ public class DSAUnsupported implements DSAAccess {
@Override
public void blitFramebuffer(int source, int dest, int offsetX, int offsetY, int width, int height, int offsetX2, int offsetY2, int width2, int height2,
int bufferChoice, int filter) {
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, source);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dest);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, source);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dest);
RENDER_BACKEND.blitFramebuffer(offsetX, offsetY, width, height, offsetX2, offsetY2, width2, height2, bufferChoice, filter);
}
@Override
public void framebufferTexture2D(int fb, int fbtarget, int attachment, int target, int texture, int levels) {
- GLStateManager.glBindFramebuffer(fbtarget, fb);
- GLStateManager.glFramebufferTexture2D(fbtarget, attachment, target, texture, levels);
+ GLSMFramebuffer.glBindFramebuffer(fbtarget, fb);
+ GLSMFramebuffer.glFramebufferTexture2D(fbtarget, attachment, target, texture, levels);
}
@Override
public int createFramebuffer() {
- final int framebuffer = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
+ final int framebuffer = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
return framebuffer;
}
@Override
public int createTexture(int target) {
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(target, texture);
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(target, texture);
return texture;
}
@@ -175,7 +178,7 @@ public class DSAUnsupported implements DSAAccess {
private static int previous2D() {
if (GLStateManager.isCachingEnabled()) {
- final TextureBindingStack slot = GLStateManager.getTextures().getTextureUnitBindings(GLStateManager.getActiveTextureUnit());
+ final TextureBindingStack slot = GLSMTextures.getTextures().getTextureUnitBindings(GLSMTextures.getActiveTextureUnit());
final int t = slot.getTarget();
if (t == 0 || t == GL11.GL_TEXTURE_2D) return slot.getBinding();
}
@@ -184,13 +187,13 @@ public class DSAUnsupported implements DSAAccess {
private static int bindForEdit(int target, int texture) {
final int previous = previousBinding(target);
- if (target == GL11.GL_TEXTURE_2D) GLStateManager.glBindTexture(target, texture);
+ if (target == GL11.GL_TEXTURE_2D) GLSMTextures.glBindTexture(target, texture);
else RENDER_BACKEND.bindTexture(target, texture);
return previous;
}
private static void restoreBinding(int target, int previous) {
- if (target == GL11.GL_TEXTURE_2D) GLStateManager.glBindTexture(target, previous);
+ if (target == GL11.GL_TEXTURE_2D) GLSMTextures.glBindTexture(target, previous);
else RENDER_BACKEND.bindTexture(target, previous);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java
index 053dc99a0..532b70317 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java
@@ -1,6 +1,12 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
import org.lwjgl.opengl.GL11;
@@ -24,14 +30,14 @@ public final class CombinedGlint {
}
public static boolean begin(Matrix4fc secondTextureMatrix) {
- if (active || GLStateManager.getActiveProgram() != 0 || GLStateManager.getLightingState().isEnabled() || GLStateManager.getColorSumState().isEnabled() || !GLStateManager.glIsEnabled(GL11.GL_BLEND)) return false;
- final var blend = GLStateManager.getBlendState();
+ if (active || GLSMPrograms.getActiveProgram() != 0 || GLSMLighting.getLightingState().isEnabled() || GLSMCurrentAttribs.getColorSumState().isEnabled() || !GLSMEnable.glIsEnabled(GL11.GL_BLEND)) return false;
+ final var blend = GLSMBlend.getBlendState();
final boolean lastAlpha = blend.getSrcAlpha() == GL11.GL_ONE && blend.getDstAlpha() == GL11.GL_ZERO && blend.getEquationAlpha() == GL14.GL_FUNC_ADD;
final boolean preserveAlpha = blend.getSrcAlpha() == GL11.GL_ZERO && blend.getDstAlpha() == GL11.GL_ONE && (blend.getEquationAlpha() == GL14.GL_FUNC_ADD || blend.getEquationAlpha() == GL14.GL_FUNC_REVERSE_SUBTRACT);
if (blend.getSrcRgb() != GL11.GL_SRC_COLOR || blend.getDstRgb() != GL11.GL_ONE
|| (!lastAlpha && !preserveAlpha && (blend.getSrcAlpha() != GL11.GL_SRC_COLOR || blend.getDstAlpha() != GL11.GL_ONE || blend.getEquationAlpha() != blend.getEquationRgb()))
|| (blend.getEquationRgb() != GL14.GL_FUNC_ADD && blend.getEquationRgb() != GL14.GL_FUNC_REVERSE_SUBTRACT)) return false;
- final var textures = GLStateManager.getTextures();
+ final var textures = GLSMTextures.getTextures();
if (!textures.getTextureUnitStates(0).isEnabled() || textures.getTextureUnitBindings(0).getBinding() == 0 || textures.getTexEnvState(0).mode != GL11.GL_MODULATE) return false;
if (textures.getTextureUnitStates(1).isEnabled() && textures.getTextureUnitBindings(1).getBinding() != 0 && textures.getTexEnvState(1).mode != GL11.GL_MODULATE) return false;
for (int unit = 2; unit < 4; unit++) {
@@ -41,7 +47,7 @@ public final class CombinedGlint {
relative.set(secondTextureMatrix).mul(inverse);
if (!relative.isFinite()) return false;
savedMatrix.set(textures.getTextureUnitMatrix(3));
- GLStateManager.setTextureMatrix(3, relative);
+ GLSMMatrices.setTextureMatrix(3, relative);
replaceAlpha = lastAlpha;
active = true;
return true;
@@ -50,6 +56,6 @@ public final class CombinedGlint {
public static void end() {
if (!active) return;
active = false;
- GLStateManager.setTextureMatrix(3, savedMatrix);
+ GLSMMatrices.setTextureMatrix(3, savedMatrix);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java
index 65b24c02f..75fa183b5 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.opengl.GL11;
public final class CubeInstancedAttribs {
@@ -14,8 +14,8 @@ public final class CubeInstancedAttribs {
public static void pointInstanceAttribs(long base) {
InstancedAttribs.pointHead(base, STRIDE);
- GLStateManager.glVertexAttribPointer(LOC_LIGHTMAP_SCALE, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP_SCALE);
- GLStateManager.glVertexAttribPointer(LOC_CUBE_TEX, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CUBE_TEX);
+ GLSMVertexInput.glVertexAttribPointer(LOC_LIGHTMAP_SCALE, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP_SCALE);
+ GLSMVertexInput.glVertexAttribPointer(LOC_CUBE_TEX, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CUBE_TEX);
}
static void enableInstanceArrays() {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java
index 3b69aa371..2ad318d6c 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.states.LightState;
import com.gtnewhorizons.angelica.glsm.states.MaterialState;
import org.joml.Matrix3f;
@@ -20,23 +21,23 @@ public final class FFPVertexLighting {
public static boolean modulatesVertexColor(Vector3f destFactor) {
destFactor.set(1.0f);
- if (!GLStateManager.getLightingState().isEnabled()) return false;
- if (!GLStateManager.getColorMaterial().isEnabled()) return false;
- if (VertexKey.encodeColorMaterialMode(GLStateManager.getColorMaterialParameter().getValue()) != VertexKey.CM_AMBIENT_AND_DIFFUSE) return false;
+ if (!GLSMLighting.getLightingState().isEnabled()) return false;
+ if (!GLSMLighting.getColorMaterial().isEnabled()) return false;
+ if (VertexKey.encodeColorMaterialMode(GLSMLighting.getColorMaterialParameter().getValue()) != VertexKey.CM_AMBIENT_AND_DIFFUSE) return false;
- final MaterialState material = GLStateManager.getFrontMaterial();
+ final MaterialState material = GLSMLighting.getFrontMaterial();
if (material.emission.x != 0.0f || material.emission.y != 0.0f || material.emission.z != 0.0f)
return false;
final boolean materialHasSpecular = material.shininess > 0.0f && (material.specular.x != 0.0f || material.specular.y != 0.0f || material.specular.z != 0.0f);
- final Vector4f lightModelAmbient = GLStateManager.getLightModel().ambient;
+ final Vector4f lightModelAmbient = GLSMLighting.getLightModel().ambient;
float r = lightModelAmbient.x;
float g = lightModelAmbient.y;
float b = lightModelAmbient.z;
- final var lightEnables = GLStateManager.getLightStates();
- final var lightData = GLStateManager.getLightDataStates();
+ final var lightEnables = GLSMLighting.getLightStates();
+ final var lightData = GLSMLighting.getLightDataStates();
boolean normalReady = false;
for (int i = 0; i < VertexKey.FFP_LIGHT_COUNT; i++) {
@@ -61,12 +62,12 @@ public final class FFPVertexLighting {
}
private static void transformCurrentNormal() {
- GLStateManager.getModelViewMatrix().normal(scratchNormalMat);
+ GLSMMatrices.getModelViewMatrix().normal(scratchNormalMat);
scratchNormal.set(ShaderManager.getCurrentNormal());
scratchNormalMat.transform(scratchNormal);
- if (GLStateManager.getNormalizeState().isEnabled()) {
+ if (GLSMLighting.getNormalizeState().isEnabled()) {
scratchNormal.normalize();
- } else if (GLStateManager.getRescaleNormalState().isEnabled()) {
+ } else if (GLSMLighting.getRescaleNormalState().isEnabled()) {
scratchNormal.mul(Uniforms.rescaleFactor(scratchNormalMat, scratchVec));
}
}
@@ -75,7 +76,7 @@ public final class FFPVertexLighting {
if (light.position.w == 0.0f) {
scratchLightVec.set(light.position.x, light.position.y, light.position.z);
} else {
- scratchEyePos.set(0.0f, 0.0f, 0.0f, 1.0f).mul(GLStateManager.getModelViewMatrix());
+ scratchEyePos.set(0.0f, 0.0f, 0.0f, 1.0f).mul(GLSMMatrices.getModelViewMatrix());
scratchLightVec.set(light.position.x - scratchEyePos.x, light.position.y - scratchEyePos.y, light.position.z - scratchEyePos.z);
}
return scratchLightVec.normalize();
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java
index 40d7ed580..660e3ca2a 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java
@@ -3,6 +3,9 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.NormI8;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -213,24 +216,24 @@ public final class FfpExtendedAttribs {
final int extVbo = getOrBuild(h, pos, uv, normal, first, count, extPrim, mode);
if (extVbo == 0) return false;
- final int savedVBO = GLStateManager.getBoundVBO();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, ImmediateExtendedAttribHandler.EXT_STRIDE);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
return true;
}
public static void unbind() {
- GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX);
- GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT);
+ GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX);
+ GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT);
setNeutralCurrentValues();
}
public static void setNeutralCurrentValues() {
BatchStateGuard.suspend();
try {
- GLStateManager.glVertexAttrib2f(ImmediateExtendedAttribHandler.LOC_MID_TEX, 0.5f, 0.5f);
- GLStateManager.glVertexAttrib4f(ImmediateExtendedAttribHandler.LOC_TANGENT, 1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glVertexAttrib2f(ImmediateExtendedAttribHandler.LOC_MID_TEX, 0.5f, 0.5f);
+ GLSMCurrentAttribs.glVertexAttrib4f(ImmediateExtendedAttribHandler.LOC_TANGENT, 1.0f, 0.0f, 0.0f, 1.0f);
} finally {
BatchStateGuard.resume();
}
@@ -372,22 +375,22 @@ public final class FfpExtendedAttribs {
final int newCap = Math.min(MAX_EXT_VERTS, Math.max(neededVerts, buf.capacityVerts * 2));
beginInternalGl();
try {
- final int vbo = GLStateManager.glGenBuffers();
+ final int vbo = GLSMBuffers.glGenBuffers();
if (vbo == 0) return false;
- final int savedVBO = GLStateManager.getBoundVBO();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) newCap * extStride, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) newCap * extStride, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
if (buf.vbo != 0) {
- final int savedRead = GLStateManager.getBoundCopyReadBuffer();
- final int savedWrite = GLStateManager.getBoundCopyWriteBuffer();
- GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, buf.vbo);
- GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, vbo);
- GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0L, 0L,
+ final int savedRead = GLSMBuffers.getBoundCopyReadBuffer();
+ final int savedWrite = GLSMBuffers.getBoundCopyWriteBuffer();
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, buf.vbo);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, vbo);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0L, 0L,
(long) buf.capacityVerts * extStride);
- GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, savedRead);
- GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, savedWrite);
- GLStateManager.glDeleteBuffers(buf.vbo);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, savedRead);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, savedWrite);
+ GLSMBuffers.glDeleteBuffers(buf.vbo);
}
buf.vbo = vbo;
buf.capacityVerts = newCap;
@@ -433,11 +436,11 @@ public final class FfpExtendedAttribs {
beginInternalGl();
try {
- final int savedVBO = GLStateManager.getBoundVBO();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
ext.position(0).limit(count * extStride);
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) first * extStride, ext);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) first * extStride, ext);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
} finally {
endInternalGl();
}
@@ -454,10 +457,10 @@ public final class FfpExtendedAttribs {
final int bytes = (count - 1) * stride + elementBytes;
final ByteBuffer dst = memAlloc(bytes).order(ByteOrder.nativeOrder());
dst.position(0).limit(bytes);
- final int savedVBO = GLStateManager.getBoundVBO();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
RENDER_BACKEND.getBufferSubData(GL15.GL_ARRAY_BUFFER, a.offset + (long) first * stride, dst);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
dst.position(0).limit(bytes);
return dst;
}
@@ -484,7 +487,7 @@ public final class FfpExtendedAttribs {
beginInternalGl();
try {
for (int i = 0; i < vbos.size(); i++) {
- GLStateManager.glDeleteBuffers(vbos.getInt(i));
+ GLSMBuffers.glDeleteBuffers(vbos.getInt(i));
}
} finally {
endInternalGl();
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java
index 832f1482f..597c1db26 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.opengl.GL11;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memPutFloat;
@@ -68,20 +68,20 @@ public final class InstancedAttribs {
public static void pointHead(long base, int stride) {
for (int r = 0; r < 3; r++) {
- GLStateManager.glVertexAttribPointer(LOC_ROW0 + r, 4, GL11.GL_FLOAT, false, stride, base + OFFSET_ROWS + r * 16L);
+ GLSMVertexInput.glVertexAttribPointer(LOC_ROW0 + r, 4, GL11.GL_FLOAT, false, stride, base + OFFSET_ROWS + r * 16L);
}
- GLStateManager.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_COLOR);
- GLStateManager.glVertexAttribPointer(LOC_OVERLAY, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_OVERLAY);
+ GLSMVertexInput.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_COLOR);
+ GLSMVertexInput.glVertexAttribPointer(LOC_OVERLAY, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_OVERLAY);
pointEntityIds(LOC_ENTITY, stride, base + OFFSET_ENTITY);
}
public static void pointEntityIds(int location, int stride, long offset) {
- GLStateManager.glVertexAttribPointer(location, 4, GL11.GL_UNSIGNED_SHORT, true, stride, offset);
+ GLSMVertexInput.glVertexAttribPointer(location, 4, GL11.GL_UNSIGNED_SHORT, true, stride, offset);
}
public static void pointTemplate(long base) {
pointHead(base, STRIDE);
- GLStateManager.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP);
+ GLSMVertexInput.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP);
}
public static void enableHeadArrays() {
@@ -91,8 +91,8 @@ public final class InstancedAttribs {
}
static void enableInstanced(int loc) {
- GLStateManager.glEnableVertexAttribArray(loc);
- GLStateManager.glVertexAttribDivisor(loc, 1);
+ GLSMVertexInput.glEnableVertexAttribArray(loc);
+ GLSMVertexInput.glVertexAttribDivisor(loc, 1);
}
private InstancedAttribs() {}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java
index f3bf10ef1..95f3cc2f3 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.opengl.GL11;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memPutFloat;
@@ -20,10 +20,10 @@ public final class ParticleInstancedAttribs {
public static final int STRIDE = 48;
public static void pointInstanceAttribs(long base) {
- GLStateManager.glVertexAttribPointer(LOC_CENTER_HALF, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CENTER_HALF);
- GLStateManager.glVertexAttribPointer(LOC_UV, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_UV);
- GLStateManager.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, base + OFFSET_COLOR);
- GLStateManager.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP);
+ GLSMVertexInput.glVertexAttribPointer(LOC_CENTER_HALF, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CENTER_HALF);
+ GLSMVertexInput.glVertexAttribPointer(LOC_UV, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_UV);
+ GLSMVertexInput.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, base + OFFSET_COLOR);
+ GLSMVertexInput.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP);
}
static void enableInstanceArrays() {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java
index e06d373b9..70c158358 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java
@@ -3,7 +3,8 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.NormI8;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
@@ -76,11 +77,11 @@ public final class ParticleQuadMesh {
written = true;
write(memAddress0(staging), rotX, rotXZ, rotZ, rotYZ, rotXY);
- final int savedVBO = GLStateManager.getBoundVBO();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
staging.position(0).limit(VERTEX_COUNT * VERTEX_STRIDE);
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, staging);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, staging);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
}
private static void write(long dst, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
@@ -116,13 +117,13 @@ public final class ParticleQuadMesh {
}
private static void build() {
- final int savedVAO = GLStateManager.getBoundVAO();
- final int savedVBO = GLStateManager.getBoundVBO();
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) VERTEX_COUNT * VERTEX_STRIDE, GL15.GL_DYNAMIC_DRAW);
+ final int savedVAO = GLSMVertexInput.getBoundVAO();
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) VERTEX_COUNT * VERTEX_STRIDE, GL15.GL_DYNAMIC_DRAW);
attrib(VertexFormatElement.Usage.POSITION.getAttributeLocation(), 3, GL11.GL_FLOAT, false, OFFSET_OFFSET);
attrib(VertexFormatElement.Usage.PRIMARY_UV.getAttributeLocation(), 2, GL11.GL_FLOAT, false, OFFSET_CORNER);
@@ -130,25 +131,25 @@ public final class ParticleQuadMesh {
ParticleInstancedAttribs.enableInstanceArrays();
- GLStateManager.glBindVertexArray(savedVAO);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMVertexInput.glBindVertexArray(savedVAO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
if (staging == null) staging = memAlloc(VERTEX_COUNT * VERTEX_STRIDE);
written = false;
}
private static void attrib(int loc, int size, int type, boolean normalized, int offset) {
- GLStateManager.glEnableVertexAttribArray(loc);
- GLStateManager.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset);
+ GLSMVertexInput.glEnableVertexAttribArray(loc);
+ GLSMVertexInput.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset);
}
public static void delete() {
if (vbo != 0) {
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glDeleteBuffers(vbo);
vbo = 0;
}
if (vao != 0) {
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
vao = 0;
}
if (staging != null) {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
index 6934717ff..c6433c045 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
@@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.glsm.CompatShaderTransformer;
import com.gtnewhorizons.angelica.glsm.GLDebug;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend;
@@ -45,7 +46,7 @@ public class Program {
}
public void destroy() {
- GLStateManager.glDeleteProgram(programId);
+ GLSMPrograms.glDeleteProgram(programId);
}
/**
@@ -93,7 +94,7 @@ public class Program {
backend.uniformBlockBinding(program, blockIndex, FFPUniformBlock.BINDING_POINT);
}
- final int previousProgram = GLStateManager.getActiveProgram();
+ final int previousProgram = GLSMPrograms.getActiveProgram();
backend.useProgram(program);
for (int i = 0; i < 4; i++) {
if (ffpProgram.locSampler[i] != -1) backend.uniform1i(ffpProgram.locSampler[i], i);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
index 302574f91..81a306f0c 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
@@ -5,6 +5,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.glsm.CompatUniformManager;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -132,14 +133,14 @@ public final class ShaderManager {
lastBoundProgramId = -1;
currentVertexKeyPacked = Long.MIN_VALUE;
currentFKLen = 0;
- GLStateManager.forceAttribDefaultsDirty();
+ GLSMCurrentAttribs.forceAttribDefaultsDirty();
}
public void preDraw(GLContextState glCtx) {
GLSMHooks.resolvePendingProgram();
final DeferredBlendHandler bh = GLSMHooks.blendHandler;
if (bh != null) bh.flushDeferredBlend();
- GLStateManager.flushEntityIds(glCtx);
+ GLSMCurrentAttribs.flushEntityIds(glCtx);
// Handle FFP & Iris uniforms
final int currentProgramId = glCtx.activeProgram;
@@ -154,7 +155,7 @@ public final class ShaderManager {
final boolean hasNormal = (vertexFlags & VertexFlags.NORMAL_BIT) != 0;
final boolean hasTexCoord = (vertexFlags & VertexFlags.TEXTURE_BIT) != 0;
final boolean hasLightmap = (vertexFlags & VertexFlags.BRIGHTNESS_BIT) != 0;
- GLStateManager.flushDeferredVertexAttribs(glCtx, hasColor, hasNormal, hasTexCoord, hasLightmap);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(glCtx, hasColor, hasNormal, hasTexCoord, hasLightmap);
if (!active) return;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
index 6c4040bf0..c50225812 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState;
import com.gtnewhorizons.angelica.glsm.states.FogState;
@@ -225,7 +226,7 @@ public class Uniforms {
ring = new UniformRingBuffer(RING_CAPACITY, FFPUniformBlock.SIZE);
}
final int offset = ring.writeBlock(staging);
- GLStateManager.glBindBufferRange(GL31.GL_UNIFORM_BUFFER, FFPUniformBlock.BINDING_POINT,
+ GLSMBuffers.glBindBufferRange(GL31.GL_UNIFORM_BUFFER, FFPUniformBlock.BINDING_POINT,
ring.getBufferId(), offset, FFPUniformBlock.SIZE);
bound = true;
blockWrites++;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java
index 3b490fd34..acdf200ad 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java
@@ -3,7 +3,8 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.NormI8;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
@@ -113,19 +114,19 @@ public final class UnitCubeMesh {
}
private static void build() {
- final int savedVAO = GLStateManager.getBoundVAO();
- final int savedVBO = GLStateManager.getBoundVBO();
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ final int savedVAO = GLSMVertexInput.getBoundVAO();
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
final int bytes = VERTEX_COUNT * VERTEX_STRIDE;
final ByteBuffer data = memAlloc(bytes);
try {
write(memAddress0(data));
data.position(0).limit(bytes);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
} finally {
memFree(data);
}
@@ -139,22 +140,22 @@ public final class UnitCubeMesh {
CubeInstancedAttribs.enableInstanceArrays();
- GLStateManager.glBindVertexArray(savedVAO);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMVertexInput.glBindVertexArray(savedVAO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
}
private static void attrib(int loc, int size, int type, boolean normalized, int offset) {
- GLStateManager.glEnableVertexAttribArray(loc);
- GLStateManager.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset);
+ GLSMVertexInput.glEnableVertexAttribArray(loc);
+ GLSMVertexInput.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset);
}
public static void delete() {
if (vbo != 0) {
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glDeleteBuffers(vbo);
vbo = 0;
}
if (vao != 0) {
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
vao = 0;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java
index 888ba4430..a6e4f34f1 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
@@ -630,8 +631,8 @@ public final class VAOManager {
clientArraysVBO = RENDER_BACKEND.genBuffers();
}
- final int savedVBO = GLStateManager.getBoundVBO();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, clientArraysVBO);
+ final int savedVBO = GLSMBuffers.getBoundVBO();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, clientArraysVBO);
if (totalBytes > clientArraysVBOCapacity) {
int newCap = Math.max(4096, clientArraysVBOCapacity);
@@ -651,7 +652,7 @@ public final class VAOManager {
}
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO);
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java
index 6e0c6c0d4..6d72ef2ce 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java
@@ -3,6 +3,8 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.MatrixHelper;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.TexGenState;
import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray;
@@ -230,11 +232,11 @@ public final class VertexKey {
if (hasTexCoord) bits |= (1L << BIT_HAS_VERTEX_TEX);
if (hasLightmap) bits |= (1L << BIT_HAS_VERTEX_LIGHTMAP);
- if (GLStateManager.consumeUnit23TexCoordSetDuringDraw(glCtx) && hasTexCoord) {
+ if (GLSMCurrentAttribs.consumeUnit23TexCoordSetDuringDraw(glCtx) && hasTexCoord) {
bits |= (1L << BIT_UNIT23_UV_FROM_UNIT0);
}
- if (GLStateManager.anyClipPlaneEnabled(glCtx)) {
+ if (GLSMRasterizer.anyClipPlaneEnabled(glCtx)) {
bits |= (1L << BIT_CLIP_PLANES);
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java
index bf89b8ea5..ddf453778 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.opengl.GL11;
@@ -19,9 +19,9 @@ public final class WeatherInstancedAttribs {
public static final int STRIDE = 48;
public static void pointInstanceAttribs(long base) {
- GLStateManager.glVertexAttribPointer(LOC_COLUMN_SPAN, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_COLUMN_SPAN);
- GLStateManager.glVertexAttribPointer(LOC_JITTER, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_JITTER);
- GLStateManager.glVertexAttribPointer(LOC_PARAMS, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_PARAMS);
+ GLSMVertexInput.glVertexAttribPointer(LOC_COLUMN_SPAN, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_COLUMN_SPAN);
+ GLSMVertexInput.glVertexAttribPointer(LOC_JITTER, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_JITTER);
+ GLSMVertexInput.glVertexAttribPointer(LOC_PARAMS, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_PARAMS);
}
static void enableInstanceArrays() {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java
index 1da961984..de715ff75 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java
@@ -2,7 +2,8 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
@@ -32,37 +33,37 @@ public final class WeatherQuadMesh {
for (float corner : CORNERS) data.putFloat(corner);
data.flip();
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
final int corner = VertexFormatElement.Usage.PRIMARY_UV.getAttributeLocation();
- GLStateManager.glEnableVertexAttribArray(corner);
- GLStateManager.glVertexAttribPointer(corner, 2, GL11.GL_FLOAT, false, 2 * Float.BYTES, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(corner);
+ GLSMVertexInput.glVertexAttribPointer(corner, 2, GL11.GL_FLOAT, false, 2 * Float.BYTES, 0L);
WeatherInstancedAttribs.enableInstanceArrays();
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
return vao;
}
public static void bindInstanceBuffer(int bufferId) {
- GLStateManager.glBindVertexArray(vao());
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId);
+ GLSMVertexInput.glBindVertexArray(vao());
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId);
WeatherInstancedAttribs.pointInstanceAttribs(0L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
public static void delete() {
if (vbo != 0) {
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glDeleteBuffers(vbo);
vbo = 0;
}
if (vao != 0) {
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
vao = 0;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java
index 69e8e6e47..3266b7a20 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java
@@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.glsm.hooks;
import com.gtnewhorizons.angelica.glsm.CaptureGate;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLDebug;
+import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
@@ -26,7 +27,7 @@ public final class FrameHooks {
}
public static void frameEnd() {
- GLStateManager.onFrameEnd();
+ GLSMTextureLifetime.onFrameEnd();
popFrameGroup();
RENDER_BACKEND.onFrameEnd();
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java
index 427e8cd6b..06b60ff87 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.glsm.hooks;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
import org.lwjgl.opengl.GL11;
@@ -65,14 +65,14 @@ public interface ImmediateExtendedAttribHandler {
}
static void setupExtAttribPointers(long baseOffset, int stride) {
- GLStateManager.glEnableVertexAttribArray(LOC_MID_TEX);
- GLStateManager.glVertexAttribPointer(LOC_MID_TEX, 2, GL11.GL_FLOAT, false, stride, baseOffset);
- GLStateManager.glEnableVertexAttribArray(LOC_TANGENT);
- GLStateManager.glVertexAttribPointer(LOC_TANGENT, 4, GL11.GL_BYTE, true, stride, baseOffset + 8);
+ GLSMVertexInput.glEnableVertexAttribArray(LOC_MID_TEX);
+ GLSMVertexInput.glVertexAttribPointer(LOC_MID_TEX, 2, GL11.GL_FLOAT, false, stride, baseOffset);
+ GLSMVertexInput.glEnableVertexAttribArray(LOC_TANGENT);
+ GLSMVertexInput.glVertexAttribPointer(LOC_TANGENT, 4, GL11.GL_BYTE, true, stride, baseOffset + 8);
}
static void setupEntityIdsPointer(long offset, int stride) {
- GLStateManager.glEnableVertexAttribArray(LOC_ENTITY_IDS);
+ GLSMVertexInput.glEnableVertexAttribArray(LOC_ENTITY_IDS);
InstancedAttribs.pointEntityIds(LOC_ENTITY_IDS, stride, offset);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java
index 51b632a35..f70f3877f 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java
@@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.hooks;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
@@ -26,12 +27,12 @@ public final class TextureUtilHooks {
private TextureUtilHooks() {}
public static void setMaxLevel(int mipmapLevels) {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmapLevels);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmapLevels);
}
public static void captureBoundFilterTexture() {
final GLContextState ctx = GLStateManager.ctx();
- final int id = GLStateManager.getBoundTextureForServerState();
+ final int id = GLSMTextures.getBoundTextureForServerState();
ctx.savedFilterTextureId = id;
final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(id);
if (info != null) {
@@ -78,8 +79,8 @@ public final class TextureUtilHooks {
RenderSystem.texParameteri(id, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min);
RenderSystem.texParameteri(id, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag);
} else {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag);
}
}
@@ -88,7 +89,7 @@ public final class TextureUtilHooks {
if (id != 0 && DisplayListManager.getRecordMode() == DisplayListManager.RecordMode.NONE) {
RenderSystem.texParameterf(id, GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
} else {
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
}
}
@@ -116,7 +117,7 @@ public final class TextureUtilHooks {
/** TextureUtil.func_152777_a(false, false, 1) without using vanilla's single save slot, which the caller may hold. */
public static void forceNearestFilter() {
- final int id = GLStateManager.getBoundTextureForServerState();
+ final int id = GLSMTextures.getBoundTextureForServerState();
final TextureInfo info = id != 0 ? TextureInfoCache.INSTANCE.getInfo(id) : null;
if (info == null) {
nearestTexture = 0;
@@ -143,9 +144,9 @@ public final class TextureUtilHooks {
RenderSystem.texParameteri(id, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag);
if (anisotropic) RenderSystem.texParameterf(id, GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
} else {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag);
- if (anisotropic) GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag);
+ if (anisotropic) GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
}
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java
index 076e94f90..65e9a6df9 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.loading;
import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector;
+import com.gtnewhorizons.angelica.glsm.redirect.LegacyRewriter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
@@ -30,6 +31,14 @@ public class ModRedirector {
this.allExclusions = exclusions.toArray(new String[0]);
}
+ public void setLegacyHint(String hint) {
+ core.setLegacyHint(hint);
+ }
+
+ public void setLegacyRewriter(LegacyRewriter rewriter) {
+ core.setLegacyRewriter(rewriter);
+ }
+
public ClassDump getDump() {
return dump;
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java
index 039cc2f41..a3e3ba821 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
@@ -67,7 +68,7 @@ public final class AttribSnapshot {
public static AttribSnapshot snapshot(int firstVertex, int vertexCount) {
final AttribDesc[] out = new AttribDesc[VAOManager.MAX_ATTRIBS];
final List allocated = new ArrayList<>();
- final int prevVBO = GLStateManager.getBoundVBO();
+ final int prevVBO = GLSMBuffers.getBoundVBO();
final VAOManager vaos = GLStateManager.ctx().vaos;
boolean success = false;
@@ -133,8 +134,8 @@ public final class AttribSnapshot {
}
if (buf == null) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
- final int bufferSize = GLStateManager.glGetBufferParameteri(GL15.GL_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
+ final int bufferSize = GLSMBuffers.glGetBufferParameteri(GL15.GL_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE);
if (bufferSize <= 0) {
warnOnce("vbo-orphaned", "[AttribSnapshot] GL_BUFFER_SIZE={} for VBO {} -- skipping capture", bufferSize, a.vboId);
return null;
@@ -162,7 +163,7 @@ public final class AttribSnapshot {
}
buf = MemoryUtilities.memAlloc(rs);
- GLStateManager.glGetBufferSubData(GL15.GL_ARRAY_BUFFER, ro, buf);
+ GLSMBuffers.glGetBufferSubData(GL15.GL_ARRAY_BUFFER, ro, buf);
allocated.add(buf);
readOffset = ro;
@@ -190,7 +191,7 @@ public final class AttribSnapshot {
success = true;
return new AttribSnapshot(out, allocated);
} finally {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
if (!success) {
for (ByteBuffer b : allocated) MemoryUtilities.memFree(b);
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
index 139bfc4ee..9e2080f53 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
@@ -2,7 +2,20 @@ package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.recording.commands.DisplayListCommand;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL15;
@@ -57,77 +70,77 @@ public final class CommandBufferExecutor {
switch (cmd) {
// === Single int commands ===
case GLCommand.ENABLE -> {
- GLStateManager.glEnable(memGetInt(ptr));
+ GLSMEnable.glEnable(memGetInt(ptr));
ptr += 4;
}
case GLCommand.DISABLE -> {
- GLStateManager.glDisable(memGetInt(ptr));
+ GLSMEnable.glDisable(memGetInt(ptr));
ptr += 4;
}
case GLCommand.CLEAR -> {
- GLStateManager.glClear(memGetInt(ptr));
+ GLSMFramebuffer.glClear(memGetInt(ptr));
ptr += 4;
}
case GLCommand.CLEAR_STENCIL -> {
- GLStateManager.glClearStencil(memGetInt(ptr));
+ GLSMDepthStencilAlpha.glClearStencil(memGetInt(ptr));
ptr += 4;
}
case GLCommand.CULL_FACE -> {
- GLStateManager.glCullFace(memGetInt(ptr));
+ GLSMRasterizer.glCullFace(memGetInt(ptr));
ptr += 4;
}
case GLCommand.DEPTH_FUNC -> {
- GLStateManager.glDepthFunc(memGetInt(ptr));
+ GLSMDepthStencilAlpha.glDepthFunc(memGetInt(ptr));
ptr += 4;
}
case GLCommand.SHADE_MODEL -> {
- GLStateManager.glShadeModel(memGetInt(ptr));
+ GLSMRasterizer.glShadeModel(memGetInt(ptr));
ptr += 4;
}
case GLCommand.LOGIC_OP -> {
- GLStateManager.glLogicOp(memGetInt(ptr));
+ GLSMBlend.glLogicOp(memGetInt(ptr));
ptr += 4;
}
case GLCommand.MATRIX_MODE -> {
- GLStateManager.glMatrixMode(memGetInt(ptr));
+ GLSMMatrices.glMatrixMode(memGetInt(ptr));
ptr += 4;
}
case GLCommand.ACTIVE_TEXTURE -> {
- GLStateManager.glActiveTexture(memGetInt(ptr));
+ GLSMTextures.glActiveTexture(memGetInt(ptr));
ptr += 4;
}
case GLCommand.USE_PROGRAM -> {
final int recordedProgram = memGetInt(ptr);
- GLStateManager.glUseProgram(compiledDisplayList.resolveProgram(recordedProgram));
+ GLSMPrograms.glUseProgram(compiledDisplayList.resolveProgram(recordedProgram));
ptr += 4;
}
case GLCommand.PUSH_ATTRIB -> {
- GLStateManager.glPushAttrib(memGetInt(ptr));
+ GLSMAttribStack.glPushAttrib(memGetInt(ptr));
ptr += 4;
}
case GLCommand.POP_ATTRIB -> {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
ptr += 4; // Skip unused padding
}
case GLCommand.LOAD_IDENTITY -> {
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
}
case GLCommand.PUSH_MATRIX -> {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
}
case GLCommand.POP_MATRIX -> {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
case GLCommand.STENCIL_MASK -> {
- GLStateManager.glStencilMask(memGetInt(ptr));
+ GLSMDepthStencilAlpha.glStencilMask(memGetInt(ptr));
ptr += 4;
}
case GLCommand.DEPTH_MASK -> {
- GLStateManager.glDepthMask(memGetInt(ptr) != 0);
+ GLSMDepthStencilAlpha.glDepthMask(memGetInt(ptr) != 0);
ptr += 4;
}
case GLCommand.FRONT_FACE -> {
- GLStateManager.glFrontFace(memGetInt(ptr));
+ GLSMRasterizer.glFrontFace(memGetInt(ptr));
ptr += 4;
}
@@ -136,43 +149,43 @@ public final class CommandBufferExecutor {
final int target = memGetInt(ptr);
final int texture = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glBindTexture(target, texture);
+ GLSMTextures.glBindTexture(target, texture);
}
case GLCommand.POLYGON_MODE -> {
final int face = memGetInt(ptr);
final int mode = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glPolygonMode(face, mode);
+ GLSMRasterizer.glPolygonMode(face, mode);
}
case GLCommand.COLOR_MATERIAL -> {
final int face = memGetInt(ptr);
final int mode = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glColorMaterial(face, mode);
+ GLSMLighting.glColorMaterial(face, mode);
}
case GLCommand.LINE_STIPPLE -> {
final int factor = memGetInt(ptr);
final int pattern = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glLineStipple(factor, (short) pattern);
+ GLSMRasterizer.glLineStipple(factor, (short) pattern);
}
case GLCommand.STENCIL_MASK_SEPARATE -> {
final int face = memGetInt(ptr);
final int mask = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glStencilMaskSeparate(face, mask);
+ GLSMDepthStencilAlpha.glStencilMaskSeparate(face, mask);
}
case GLCommand.FOGI -> {
final int pname = memGetInt(ptr);
final int param = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glFogi(pname, param);
+ GLSMFog.glFogi(pname, param);
}
case GLCommand.HINT -> {
final int target = memGetInt(ptr);
final int mode = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glHint(target, mode);
+ GLSMRasterizer.glHint(target, mode);
}
// === Three int commands ===
@@ -181,21 +194,21 @@ public final class CommandBufferExecutor {
final int ref = memGetInt(ptr + 4);
final int mask = memGetInt(ptr + 8);
ptr += 12;
- GLStateManager.glStencilFunc(func, ref, mask);
+ GLSMDepthStencilAlpha.glStencilFunc(func, ref, mask);
}
case GLCommand.STENCIL_OP -> {
final int fail = memGetInt(ptr);
final int zfail = memGetInt(ptr + 4);
final int zpass = memGetInt(ptr + 8);
ptr += 12;
- GLStateManager.glStencilOp(fail, zfail, zpass);
+ GLSMDepthStencilAlpha.glStencilOp(fail, zfail, zpass);
}
case GLCommand.TEX_PARAMETERI -> {
final int target = memGetInt(ptr);
final int pname = memGetInt(ptr + 4);
final int param = memGetInt(ptr + 8);
ptr += 12;
- GLStateManager.glTexParameteri(target, pname, param);
+ GLSMTextures.glTexParameteri(target, pname, param);
}
// === Four int commands ===
@@ -205,7 +218,7 @@ public final class CommandBufferExecutor {
final int width = memGetInt(ptr + 8);
final int height = memGetInt(ptr + 12);
ptr += 16;
- GLStateManager.glViewport(x, y, width, height);
+ GLSMRasterizer.glViewport(x, y, width, height);
}
case GLCommand.SCISSOR -> {
final int x = memGetInt(ptr);
@@ -213,7 +226,7 @@ public final class CommandBufferExecutor {
final int width = memGetInt(ptr + 8);
final int height = memGetInt(ptr + 12);
ptr += 16;
- GLStateManager.glScissor(x, y, width, height);
+ GLSMRasterizer.glScissor(x, y, width, height);
}
case GLCommand.BLEND_FUNC -> {
final int srcRgb = memGetInt(ptr);
@@ -222,9 +235,9 @@ public final class CommandBufferExecutor {
final int dstAlpha = memGetInt(ptr + 12);
ptr += 16;
if (srcRgb == srcAlpha && dstRgb == dstAlpha) {
- GLStateManager.glBlendFunc(srcRgb, dstRgb);
+ GLSMBlend.glBlendFunc(srcRgb, dstRgb);
} else {
- GLStateManager.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ GLSMBlend.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha);
}
}
case GLCommand.COLOR_MASK -> {
@@ -233,7 +246,7 @@ public final class CommandBufferExecutor {
final boolean b = memGetInt(ptr + 8) != 0;
final boolean a = memGetInt(ptr + 12) != 0;
ptr += 16;
- GLStateManager.glColorMask(r, g, b, a);
+ GLSMBlend.glColorMask(r, g, b, a);
}
case GLCommand.STENCIL_FUNC_SEPARATE -> {
final int face = memGetInt(ptr);
@@ -241,7 +254,7 @@ public final class CommandBufferExecutor {
final int ref = memGetInt(ptr + 8);
final int mask = memGetInt(ptr + 12);
ptr += 16;
- GLStateManager.glStencilFuncSeparate(face, func, ref, mask);
+ GLSMDepthStencilAlpha.glStencilFuncSeparate(face, func, ref, mask);
}
case GLCommand.STENCIL_OP_SEPARATE -> {
final int face = memGetInt(ptr);
@@ -249,28 +262,28 @@ public final class CommandBufferExecutor {
final int dpfail = memGetInt(ptr + 8);
final int dppass = memGetInt(ptr + 12);
ptr += 16;
- GLStateManager.glStencilOpSeparate(face, sfail, dpfail, dppass);
+ GLSMDepthStencilAlpha.glStencilOpSeparate(face, sfail, dpfail, dppass);
}
// === Float commands ===
case GLCommand.VERTEX_ATTRIB -> {
- GLStateManager.glVertexAttrib4f(memGetInt(ptr), memGetFloat(ptr + 4), memGetFloat(ptr + 8),
+ GLSMCurrentAttribs.glVertexAttrib4f(memGetInt(ptr), memGetFloat(ptr + 4), memGetFloat(ptr + 8),
memGetFloat(ptr + 12), memGetFloat(ptr + 16));
ptr += 20;
}
case GLCommand.POINT_SIZE -> {
- GLStateManager.glPointSize(memGetFloat(ptr));
+ GLSMRasterizer.glPointSize(memGetFloat(ptr));
ptr += 4;
}
case GLCommand.LINE_WIDTH -> {
- GLStateManager.glLineWidth(memGetFloat(ptr));
+ GLSMRasterizer.glLineWidth(memGetFloat(ptr));
ptr += 4;
}
case GLCommand.POLYGON_OFFSET -> {
final float factor = memGetFloat(ptr);
final float units = memGetFloat(ptr + 4);
ptr += 8;
- GLStateManager.glPolygonOffset(factor, units);
+ GLSMRasterizer.glPolygonOffset(factor, units);
}
case GLCommand.COLOR -> {
final float r = memGetFloat(ptr);
@@ -278,14 +291,14 @@ public final class CommandBufferExecutor {
final float b = memGetFloat(ptr + 8);
final float a = memGetFloat(ptr + 12);
ptr += 16;
- GLStateManager.glColor4f(r, g, b, a);
+ GLSMCurrentAttribs.glColor4f(r, g, b, a);
}
case GLCommand.SECONDARY_COLOR -> {
final float r = memGetFloat(ptr);
final float g = memGetFloat(ptr + 4);
final float b = memGetFloat(ptr + 8);
ptr += 12;
- GLStateManager.glSecondaryColor3f(r, g, b);
+ GLSMCurrentAttribs.glSecondaryColor3f(r, g, b);
}
case GLCommand.CLEAR_COLOR -> {
final float r = memGetFloat(ptr);
@@ -293,12 +306,12 @@ public final class CommandBufferExecutor {
final float b = memGetFloat(ptr + 8);
final float a = memGetFloat(ptr + 12);
ptr += 16;
- GLStateManager.glClearColor(r, g, b, a);
+ GLSMBlend.glClearColor(r, g, b, a);
}
case GLCommand.CLEAR_DEPTH -> {
final double depth = memGetDouble(ptr);
ptr += 8;
- GLStateManager.glClearDepth(depth);
+ GLSMDepthStencilAlpha.glClearDepth(depth);
}
case GLCommand.BLEND_COLOR -> {
final float r = memGetFloat(ptr);
@@ -306,7 +319,7 @@ public final class CommandBufferExecutor {
final float b = memGetFloat(ptr + 8);
final float a = memGetFloat(ptr + 12);
ptr += 16;
- GLStateManager.glBlendColor(r, g, b, a);
+ GLSMBlend.glBlendColor(r, g, b, a);
}
// === Mixed int+float commands ===
@@ -314,53 +327,53 @@ public final class CommandBufferExecutor {
final int func = memGetInt(ptr);
final float ref = memGetFloat(ptr + 4);
ptr += 8;
- GLStateManager.glAlphaFunc(func, ref);
+ GLSMDepthStencilAlpha.glAlphaFunc(func, ref);
}
case GLCommand.FOGF -> {
final int pname = memGetInt(ptr);
final float param = memGetFloat(ptr + 4);
ptr += 8;
- GLStateManager.glFogf(pname, param);
+ GLSMFog.glFogf(pname, param);
}
case GLCommand.LIGHTF -> {
final int light = memGetInt(ptr);
final int pname = memGetInt(ptr + 4);
final float param = memGetFloat(ptr + 8);
ptr += 12;
- GLStateManager.glLightf(light, pname, param);
+ GLSMLighting.glLightf(light, pname, param);
}
case GLCommand.LIGHT_MODELF -> {
final int pname = memGetInt(ptr);
final float param = memGetFloat(ptr + 4);
ptr += 8;
- GLStateManager.glLightModelf(pname, param);
+ GLSMLighting.glLightModelf(pname, param);
}
case GLCommand.LIGHTI -> {
final int light = memGetInt(ptr);
final int pname = memGetInt(ptr + 4);
final int param = memGetInt(ptr + 8);
ptr += 12;
- GLStateManager.glLighti(light, pname, param);
+ GLSMLighting.glLighti(light, pname, param);
}
case GLCommand.LIGHT_MODELI -> {
final int pname = memGetInt(ptr);
final int param = memGetInt(ptr + 4);
ptr += 8;
- GLStateManager.glLightModeli(pname, param);
+ GLSMLighting.glLightModeli(pname, param);
}
case GLCommand.MATERIALF -> {
final int face = memGetInt(ptr);
final int pname = memGetInt(ptr + 4);
final float param = memGetFloat(ptr + 8);
ptr += 12;
- GLStateManager.glMaterialf(face, pname, param);
+ GLSMLighting.glMaterialf(face, pname, param);
}
case GLCommand.TEX_PARAMETERF -> {
final int target = memGetInt(ptr);
final int pname = memGetInt(ptr + 4);
final float param = memGetFloat(ptr + 8);
ptr += 12;
- GLStateManager.glTexParameterf(target, pname, param);
+ GLSMTextures.glTexParameterf(target, pname, param);
}
// === Matrix commands ===
@@ -372,21 +385,21 @@ public final class CommandBufferExecutor {
ptr += 4;
}
MATRIX_BUFFER.flip();
- GLStateManager.glMultMatrix(MATRIX_BUFFER);
+ GLSMMatrices.glMultMatrix(MATRIX_BUFFER);
}
case GLCommand.TRANSLATE -> {
final float x = memGetFloat(ptr);
final float y = memGetFloat(ptr + 4);
final float z = memGetFloat(ptr + 8);
ptr += 12;
- GLStateManager.glTranslatef(x, y, z);
+ GLSMMatrices.glTranslatef(x, y, z);
}
case GLCommand.SCALE -> {
final float x = memGetFloat(ptr);
final float y = memGetFloat(ptr + 4);
final float z = memGetFloat(ptr + 8);
ptr += 12;
- GLStateManager.glScalef(x, y, z);
+ GLSMMatrices.glScalef(x, y, z);
}
case GLCommand.LOAD_MATRIX -> {
MATRIX_BUFFER.clear();
@@ -395,7 +408,7 @@ public final class CommandBufferExecutor {
ptr += 4;
}
MATRIX_BUFFER.flip();
- GLStateManager.glLoadMatrix(MATRIX_BUFFER);
+ GLSMMatrices.glLoadMatrix(MATRIX_BUFFER);
}
// === Buffer commands ===
@@ -409,7 +422,7 @@ public final class CommandBufferExecutor {
ptr += 4;
}
PARAMS_BUFFER.flip();
- GLStateManager.glFog(pname, PARAMS_BUFFER);
+ GLSMFog.glFog(pname, PARAMS_BUFFER);
}
case GLCommand.LIGHT -> {
final int light = memGetInt(ptr);
@@ -422,7 +435,7 @@ public final class CommandBufferExecutor {
ptr += 4;
}
PARAMS_BUFFER.flip();
- GLStateManager.glLight(light, pname, PARAMS_BUFFER);
+ GLSMLighting.glLight(light, pname, PARAMS_BUFFER);
}
case GLCommand.LIGHT_MODEL -> {
final int pname = memGetInt(ptr);
@@ -434,7 +447,7 @@ public final class CommandBufferExecutor {
ptr += 4;
}
PARAMS_BUFFER.flip();
- GLStateManager.glLightModel(pname, PARAMS_BUFFER);
+ GLSMLighting.glLightModel(pname, PARAMS_BUFFER);
}
case GLCommand.MATERIAL -> {
final int face = memGetInt(ptr);
@@ -447,7 +460,7 @@ public final class CommandBufferExecutor {
ptr += 4;
}
PARAMS_BUFFER.flip();
- GLStateManager.glMaterial(face, pname, PARAMS_BUFFER);
+ GLSMLighting.glMaterial(face, pname, PARAMS_BUFFER);
}
case GLCommand.CLIP_PLANE -> {
@@ -460,7 +473,7 @@ public final class CommandBufferExecutor {
PARAMS_DOUBLE_BUFFER.clear();
PARAMS_DOUBLE_BUFFER.put(a).put(b).put(c).put(d);
PARAMS_DOUBLE_BUFFER.flip();
- GLStateManager.glClipPlane(plane, PARAMS_DOUBLE_BUFFER);
+ GLSMRasterizer.glClipPlane(plane, PARAMS_DOUBLE_BUFFER);
}
// === Draw commands ===
@@ -484,19 +497,19 @@ public final class CommandBufferExecutor {
final byte b = (byte) ((color >> 16) & 0xFF);
final byte g = (byte) ((color >> 8) & 0xFF);
final byte r = (byte) ((color & 0xFF));
- GLStateManager.glColor4ub(r, g, b, a);
+ GLSMCurrentAttribs.glColor4ub(r, g, b, a);
}
if ((flags & VertexFlags.NORMAL_BIT) != 0) {
final int normal = memGetInt(ptr + 12);
float nx = (byte)(normal) / 127.0f;
float ny = (byte)(normal >> 8) / 127.0f;
float nz = (byte)(normal >> 16) / 127.0f;
- GLStateManager.glNormal3f(nx, ny, nz);
+ GLSMCurrentAttribs.glNormal3f(nx, ny, nz);
}
if ((flags & VertexFlags.TEXTURE_BIT) != 0) {
final float s = memGetFloat(ptr + 16);
final float t = memGetFloat(ptr + 20);
- GLStateManager.glTexCoord2f(s, t);
+ GLSMCurrentAttribs.glTexCoord2f(s, t);
}
ptr += 24; // Skip full command size (28 - 4 for cmd already read)
}
@@ -506,7 +519,7 @@ public final class CommandBufferExecutor {
DisplayListManager.glCallList(listId);
}
case GLCommand.DRAW_BUFFER -> {
- GLStateManager.glDrawBuffer(memGetInt(ptr));
+ GLSMFramebuffer.glDrawBuffer(memGetInt(ptr));
ptr += 4;
}
case GLCommand.DRAW_BUFFERS -> {
@@ -518,16 +531,16 @@ public final class CommandBufferExecutor {
}
DRAW_BUFFERS_BUFFER.flip();
ptr += 4 * MAX_DRAW_BUFFERS;
- GLStateManager.glDrawBuffers(DRAW_BUFFERS_BUFFER);
+ GLSMFramebuffer.glDrawBuffers(DRAW_BUFFERS_BUFFER);
}
case GLCommand.BIND_VBO -> {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, memGetInt(ptr));
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, memGetInt(ptr));
ptr += 4;
}
case GLCommand.BIND_VAO -> {
final int vao = memGetInt(ptr);
ptr += 4;
- if (compiledDisplayList.replaysVertexArrayBind(vao)) GLStateManager.glBindVertexArray(vao);
+ if (compiledDisplayList.replaysVertexArrayBind(vao)) GLSMVertexInput.glBindVertexArray(vao);
}
// === Complex object reference ===
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java
index a09ec7c3c..fc4f3498a 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java
@@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.recording.commands.DisplayListCommand;
import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawBatch;
@@ -43,15 +44,15 @@ public final class CompiledDisplayList {
int resolveProgram(int program) {
if (program == 0) return 0;
- final long generation = GLStateManager.getProgramLifetimeGeneration();
+ final long generation = GLSMPrograms.getProgramLifetimeGeneration();
if (replayPrograms == null) replayPrograms = new Int2IntOpenHashMap();
if (programLifetimeGeneration != generation) {
replayPrograms.clear();
programLifetimeGeneration = generation;
}
if (replayPrograms.containsKey(program)) return replayPrograms.get(program);
- final boolean valid = GLStateManager.glIsProgram(program);
- if (!valid || !GLStateManager.isProgramPendingDeletion(program)) {
+ final boolean valid = GLSMPrograms.glIsProgram(program);
+ if (!valid || !GLSMPrograms.isProgramPendingDeletion(program)) {
replayPrograms.put(program, valid ? program : 0);
}
return valid ? program : 0;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java
index 177c00cb8..833acf891 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
import com.gtnewhorizons.angelica.glsm.streaming.LineQuads;
import org.lwjgl.opengl.GL11;
@@ -32,7 +33,7 @@ public final class DisplayListVBO {
}
if (extVbos != null) {
for (int extVbo : extVbos) {
- if (extVbo != 0) GLStateManager.glDeleteBuffers(extVbo);
+ if (extVbo != 0) GLSMBuffers.glDeleteBuffers(extVbo);
}
}
}
@@ -98,15 +99,15 @@ public final class DisplayListVBO {
public void render() {
if (vao == null) return;
- if (lineQuads != null && GLStateManager.ffpWidensLineQuads()) {
+ if (lineQuads != null && GLSMDraws.ffpWidensLineQuads()) {
renderLineQuads();
return;
}
vao.bind();
if (pendingExtVbo != 0) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, pendingExtVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, pendingExtVbo);
ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, ImmediateExtendedAttribHandler.EXT_STRIDE);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
pendingExtVbo = 0;
}
if (count <= 0) { vao.unbind(); return; }
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java
index e80c6c0e5..b1fbe3cb4 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java
@@ -9,6 +9,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vbo.IVertexBuffer;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -80,7 +82,7 @@ public final class DisplayListVBOBuilder {
final IntArrayList extCounts = wantExt ? new IntArrayList() : null;
final IntArrayList extPrims = wantExt ? new IntArrayList() : null;
// drawIndex, start, vertexCount, drawMode for each line draw
- final IntArrayList lineDraws = GLStateManager.wideLineEmulationEnabled ? new IntArrayList() : null;
+ final IntArrayList lineDraws = GLSMRasterizer.wideLineEmulationEnabled ? new IntArrayList() : null;
for (FormatData data : formatData) {
int vertexCount;
@@ -212,11 +214,11 @@ public final class DisplayListVBOBuilder {
extAddr + (long) rStart * extStride, extStride);
}
- final int extVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
+ final int extVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
ext.position(0).limit(extVerts * extStride);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
memFree(ext);
return extVbo;
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
index 3d6c36ddf..29db92159 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
@@ -4,6 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.CallbackTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import com.gtnewhorizons.angelica.glsm.QuadConverter;
@@ -77,7 +78,7 @@ public final class ImmediateModeRecorder {
/**
* Set the current lightmap coordinate as packed brightness.
- * Called by GLStateManager.glMultiTexCoord2f for unit 1 during recording/drawing.
+ * Called by GLSMCurrentAttribs.glMultiTexCoord2f for unit 1 during recording/drawing.
*/
public static void setLightmapCoord(float s, float t) {
tessellator().setBrightness(((int) t << 16) | ((int) s & 0xFFFF));
@@ -119,7 +120,7 @@ public final class ImmediateModeRecorder {
final DirectTessellator t = tessellator();
t.reset();
t.startDrawing(primitiveType);
- final var c = GLStateManager.getColor();
+ final var c = GLSMCurrentAttribs.getColor();
t.setColorRGBA((int) (c.getRed() * 255.0f), (int) (c.getGreen() * 255.0f), (int) (c.getBlue() * 255.0f), (int) (c.getAlpha() * 255.0f));
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java
index 8e571492c..0bc998ce3 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
public final class BatchedIndexedDrawCmd implements DisplayListCommand {
private IndexedDrawBatch batch;
@@ -26,7 +26,7 @@ public final class BatchedIndexedDrawCmd implements DisplayListCommand {
public void execute() {
if (batch == null) return;
batch.bind();
- GLStateManager.glDrawElements(drawMode, indexCount, indexType, indexByteOffset);
+ GLSMDraws.glDrawElements(drawMode, indexCount, indexType, indexByteOffset);
}
@Override
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java
index 76c1ac6fa..440ff3f14 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.lwjgl.opengl.GL15;
@@ -24,21 +26,21 @@ public final class IndexedDrawBatch {
public void bind() {
final GLContextState glCtx = GLStateManager.ctx();
if (vaoCtx == glCtx) {
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
return;
}
- final int prevVBO = GLStateManager.getBoundVBO();
- final int v = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(v);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO);
+ final int prevVBO = GLSMBuffers.getBoundVBO();
+ final int v = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(v);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO);
final int stride = layout.stride();
for (int i = 0; i < layout.locations.length; i++) {
final int loc = layout.locations[i];
- GLStateManager.glVertexAttribPointer(loc, layout.sizes[i], layout.types[i], layout.normalized[i], stride, layout.offset(i));
- GLStateManager.glEnableVertexAttribArray(loc);
+ GLSMVertexInput.glVertexAttribPointer(loc, layout.sizes[i], layout.types[i], layout.normalized[i], stride, layout.offset(i));
+ GLSMVertexInput.glEnableVertexAttribArray(loc);
}
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
vao = v;
vaoCtx = glCtx;
}
@@ -46,9 +48,9 @@ public final class IndexedDrawBatch {
public void delete() {
if (deleted) return;
deleted = true;
- if (vaoCtx == GLStateManager.ctx()) GLStateManager.glDeleteVertexArrays(vao);
- if (sharedVBO != 0) GLStateManager.glDeleteBuffers(sharedVBO);
- if (sharedEBO != 0) GLStateManager.glDeleteBuffers(sharedEBO);
+ if (vaoCtx == GLStateManager.ctx()) GLSMVertexInput.glDeleteVertexArrays(vao);
+ if (sharedVBO != 0) GLSMBuffers.glDeleteBuffers(sharedVBO);
+ if (sharedEBO != 0) GLSMBuffers.glDeleteBuffers(sharedEBO);
vao = sharedVBO = sharedEBO = 0;
vaoCtx = null;
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java
index 48c36273a..4dd561369 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
@@ -35,8 +36,8 @@ public final class IndexedDrawBatchBuilder {
final List out = new ArrayList<>();
if (captures.isEmpty()) return out;
- final int prevVBO = GLStateManager.getBoundVBO();
- final int prevEBO = GLStateManager.getBoundEBO();
+ final int prevVBO = GLSMBuffers.getBoundVBO();
+ final int prevEBO = GLSMVertexInput.getBoundEBO();
final List results = new ArrayList<>();
boolean success = false;
@@ -57,8 +58,8 @@ public final class IndexedDrawBatchBuilder {
if (!success) {
for (GroupResult r : results) r.batch.delete();
}
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
}
return out;
@@ -95,12 +96,12 @@ public final class IndexedDrawBatchBuilder {
final long[] indexOffsets = new long[n];
try {
- sharedVBO = GLStateManager.glGenBuffers();
- sharedEBO = GLStateManager.glGenBuffers();
+ sharedVBO = GLSMBuffers.glGenBuffers();
+ sharedEBO = GLSMBuffers.glGenBuffers();
eboData = MemoryUtilities.memAlloc((int) totalIndexBytes);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, totalVertexBytes, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, totalVertexBytes, GL15.GL_STATIC_DRAW);
int vboBytePos = 0;
int eboBytePos = 0;
@@ -110,7 +111,7 @@ public final class IndexedDrawBatchBuilder {
for (int g = 0; g < n; g++) {
final IndexedDrawCapture c = group.get(g);
final int vBytes = c.vertexCount * c.layoutKey.stride();
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, vboBytePos, c.vertexData);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, vboBytePos, c.vertexData);
final long srcIdxAddr = memAddress0(c.indexData);
final int idxBytes = c.indexCount * 4;
@@ -137,8 +138,8 @@ public final class IndexedDrawBatchBuilder {
eboData.position(0).limit((int) totalIndexBytes);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, eboData, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, eboData, GL15.GL_STATIC_DRAW);
success = true;
return new GroupResult(new IndexedDrawBatch(group.get(0).layoutKey, sharedVBO, sharedEBO),
@@ -146,8 +147,8 @@ public final class IndexedDrawBatchBuilder {
} finally {
if (eboData != null) MemoryUtilities.memFree(eboData);
if (!success) {
- if (sharedVBO != 0) GLStateManager.glDeleteBuffers(sharedVBO);
- if (sharedEBO != 0) GLStateManager.glDeleteBuffers(sharedEBO);
+ if (sharedVBO != 0) GLSMBuffers.glDeleteBuffers(sharedVBO);
+ if (sharedEBO != 0) GLSMBuffers.glDeleteBuffers(sharedEBO);
}
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java
index ea663c104..7020c1a62 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import com.gtnewhorizons.angelica.glsm.QuadConverter;
@@ -64,12 +66,12 @@ public final class IndexedDrawCapture {
final int srcIndexSize = GLTypes.sizeBytes(srcIndexType);
if (srcIndexSize <= 0) return null;
- final int prevEBO = GLStateManager.getBoundEBO();
- final int prevVBO = GLStateManager.getBoundVBO();
+ final int prevEBO = GLSMVertexInput.getBoundEBO();
+ final int prevVBO = GLSMBuffers.getBoundVBO();
ByteBuffer eboSrc = null;
try {
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
- final int eboBufferSize = GLStateManager.glGetBufferParameteri(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
+ final int eboBufferSize = GLSMBuffers.glGetBufferParameteri(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE);
if (eboBufferSize <= 0) {
GLStateManager.warnOnce("ebo-size", "[IndexedDrawCapture] GL_BUFFER_SIZE={} for EBO {}", eboBufferSize, eboId);
return null;
@@ -80,12 +82,12 @@ public final class IndexedDrawCapture {
return null;
}
eboSrc = MemoryUtilities.memAlloc((int) eboReadSize);
- GLStateManager.glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesOffset, eboSrc);
+ GLSMBuffers.glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesOffset, eboSrc);
return bake(mode, indicesCount, srcIndexType, MemoryUtilities.memAddress0(eboSrc));
} finally {
if (eboSrc != null) MemoryUtilities.memFree(eboSrc);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java
index 640207549..a82851418 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import org.jetbrains.annotations.NotNull;
import org.joml.Matrix4f;
import org.lwjgl.BufferUtils;
@@ -26,7 +26,7 @@ public record MultMatrixCmd(Matrix4f matrix, FloatBuffer buffer) implements Disp
@Override
public void execute() {
buffer.rewind();
- GLStateManager.glMultMatrix(buffer);
+ GLSMMatrices.glMultMatrix(buffer);
}
@Override
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java
index 708da6c9f..e99191711 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import com.gtnewhorizons.angelica.glsm.states.PixelStoreState;
import org.jetbrains.annotations.NotNull;
@@ -56,14 +56,14 @@ public record TexImage2DCmd(
@Override
public void execute() {
if (pixels == null) {
- GLStateManager.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ByteBuffer) null);
+ GLSMTextures.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ByteBuffer) null);
return;
}
- GLStateManager.forcePixelUnpackState(unpack);
+ GLSMTextures.forcePixelUnpackState(unpack);
try {
- GLStateManager.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ GLSMTextures.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
} finally {
- GLStateManager.restorePixelUnpackState(unpack);
+ GLSMTextures.restorePixelUnpackState(unpack);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java
index 3563a1d42..1c3686cd3 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import com.gtnewhorizons.angelica.glsm.states.PixelStoreState;
import org.jetbrains.annotations.NotNull;
@@ -56,14 +56,14 @@ public record TexSubImage2DCmd(
@Override
public void execute() {
if (pixels == null) {
- GLStateManager.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (ByteBuffer) null);
+ GLSMTextures.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (ByteBuffer) null);
return;
}
- GLStateManager.forcePixelUnpackState(unpack);
+ GLSMTextures.forcePixelUnpackState(unpack);
try {
- GLStateManager.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+ GLSMTextures.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
} finally {
- GLStateManager.restorePixelUnpackState(unpack);
+ GLSMTextures.restorePixelUnpackState(unpack);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java
new file mode 100644
index 000000000..472b0d1f7
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java
@@ -0,0 +1,174 @@
+package com.gtnewhorizons.angelica.glsm.redirect;
+
+final class GLSMOwners {
+
+ static final String[][] METHODS = {
+ {"com/gtnewhorizons/angelica/glsm/GLSMAttribStack",
+ "applyRetainedState", "getAttribDepth", "glPopAttrib", "glPopClientAttrib", "glPushAttrib",
+ "glPushClientAttrib", "isPoppingAttributes", "popState", "popStateTo", "pushState", "registerModifiedState",
+ "replayStateToBackend", "retainModifiedState"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMBlend",
+ "defaultBlendFunc", "disableBlend", "enableBlend", "getBlendMode", "getBlendState", "getClearColor",
+ "getColorLogicOpState", "getColorMask", "getEffectiveBlendState", "getEffectiveColorMask",
+ "getIndexLogicOpState", "getLogicOpMode", "glBlendColor", "glBlendEquation", "glBlendEquationSeparate",
+ "glBlendFunc", "glBlendFuncSeparate", "glBlendFuncSeparatei", "glClearColor", "glColorMask", "glLogicOp",
+ "isEffectiveBlendEnabled", "setHudCacheOverride", "tryBlendFuncSeparate"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMBuffers",
+ "getBoundCopyReadBuffer", "getBoundCopyWriteBuffer", "getBoundVBO", "getIndexedBufferBinding",
+ "glBindBuffer", "glBindBufferBase", "glBindBufferRange", "glBufferData", "glBufferStorage",
+ "glBufferSubData", "glClearBufferData", "glClearBufferSubData", "glClientWaitSync", "glCopyBufferSubData",
+ "glCreateBuffers", "glDeleteBuffers", "glDeleteSync", "glFenceSync", "glFlushMappedBufferRange",
+ "glGenBuffers", "glGetBufferParameter", "glGetBufferParameteri", "glGetBufferParameteriv",
+ "glGetBufferSubData", "glGetSynci", "glIsBuffer", "glMapBuffer", "glMapBufferRange",
+ "glMapBufferRangeAddress", "glMemoryBarrier", "glNamedBufferData", "glNamedBufferSubData", "glUnmapBuffer",
+ "glWaitSync", "nglBufferData", "nglBufferSubData", "nglGetBufferSubData", "nglMapBuffer"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs",
+ "consumeUnit23TexCoordSetDuringDraw", "flushDeferredVertexAttribs", "flushEntityIds",
+ "forceAttribDefaultsDirty", "getColor", "getColorSumState", "getOverlayA", "getOverlayB", "getOverlayG",
+ "getOverlayR", "getSecondaryColor", "getShaderColorA", "getShaderColorB", "getShaderColorG",
+ "getShaderColorR", "glColor3b", "glColor3d", "glColor3f", "glColor3ub", "glColor4b", "glColor4d",
+ "glColor4f", "glColor4ub", "glEdgeFlag", "glMultiTexCoord2d", "glMultiTexCoord2f", "glMultiTexCoord2s",
+ "glNormal3b", "glNormal3d", "glNormal3f", "glNormal3i", "glSecondaryColor3b", "glSecondaryColor3d",
+ "glSecondaryColor3f", "glSecondaryColor3ub", "glTexCoord1d", "glTexCoord1f", "glTexCoord2d", "glTexCoord2f",
+ "glTexCoord3d", "glTexCoord3f", "glTexCoord4d", "glTexCoord4f", "glVertexAttrib2f", "glVertexAttrib2s",
+ "glVertexAttrib3f", "glVertexAttrib4f", "setEntityIds", "setLightmapTextureCoords", "setOverlayColor",
+ "setShaderColor"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha",
+ "disableAlphaTest", "disableDepthTest", "enableAlphaTest", "enableDepthTest", "getAlphaState",
+ "getAlphaTest", "getDepthState", "getDepthTest", "getEffectiveAlphaState", "getStencilState",
+ "getStencilTest", "glAlphaFunc", "glClearDepth", "glClearStencil", "glDepthFunc", "glDepthMask",
+ "glDepthRange", "glStencilFunc", "glStencilFuncSeparate", "glStencilMask", "glStencilMaskSeparate",
+ "glStencilOp", "glStencilOpSeparate", "isEffectiveAlphaTestEnabled", "isEffectiveDepthMaskEnabled"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMDraws",
+ "displayListExists", "ffpWidensLineQuads", "getDisplayList", "getListMode", "glAccum", "glBegin",
+ "glCallList", "glCallLists", "glDebugMessageCallback", "glDebugMessageControl", "glDebugMessageInsert",
+ "glDeleteLists", "glDrawArrays", "glDrawArraysInstanced", "glDrawElements", "glDrawElementsBaseVertex",
+ "glDrawElementsInstanced", "glDrawRangeElements", "glDrawRangeElementsBaseVertex", "glEnd", "glEndList",
+ "glFeedbackBuffer", "glFinish", "glFlush", "glGenLists", "glGetDebugMessageLog", "glGetObjectLabel",
+ "glInitNames", "glIsList", "glListBase", "glLoadName", "glMultiDrawArrays",
+ "glMultiDrawArraysIndirectCount", "glMultiDrawElementsBaseVertex", "glMultiDrawElementsIndirect",
+ "glMultiDrawElementsIndirectCount", "glNewList", "glObjectLabel", "glPassThrough", "glPixelTransferf",
+ "glPixelTransferi", "glPopDebugGroup", "glPopName", "glPrimitiveRestartIndex", "glPushDebugGroup",
+ "glPushName", "glRasterPos2d", "glRasterPos2f", "glRasterPos2i", "glRasterPos3d", "glRasterPos3f",
+ "glRasterPos3i", "glRasterPos4d", "glRasterPos4f", "glRasterPos4i", "glRenderMode", "glSelectBuffer",
+ "glVertex2d", "glVertex2f", "glVertex2i", "glVertex3d", "glVertex3f", "glVertex3i", "isContinuousDraw",
+ "nglMultiDrawElementsBaseVertex", "preDraw", "registerDebugMessageListener"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMEnable",
+ "glDisable", "glDisablei", "glEnable", "glEnablei", "glIsEnabled"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMFog",
+ "disableFog", "enableFog", "fogColor", "getFogColor", "getFogMode", "getFogState", "glFog", "glFogf",
+ "glFogi"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMFramebuffer",
+ "attachTextureForReading", "framebufferCompletenessIsMeaningful", "getDrawBuffer", "getDrawFramebuffer",
+ "getDrawFramebufferGeneration", "getReadFramebuffer", "glBindFramebuffer", "glBindRenderbuffer",
+ "glBlitFramebuffer", "glCheckFramebufferStatus", "glClear", "glDeleteFramebuffers", "glDeleteRenderbuffers",
+ "glDrawBuffer", "glDrawBuffers", "glFramebufferRenderbuffer", "glFramebufferTexture",
+ "glFramebufferTexture1D", "glFramebufferTexture2D", "glFramebufferTexture3D", "glFramebufferTextureFace",
+ "glFramebufferTextureLayer", "glGenFramebuffers", "glGenRenderbuffers",
+ "glGetFramebufferAttachmentParameteri", "glIsFramebuffer", "glIsRenderbuffer",
+ "glNamedFramebufferRenderbuffer", "glNamedFramebufferTexture", "glNamedFramebufferTexture1DEXT",
+ "glNamedFramebufferTexture2DEXT", "glNamedFramebufferTexture3DEXT", "glNamedFramebufferTextureEXT",
+ "glNamedFramebufferTextureFaceEXT", "glNamedFramebufferTextureLayer", "glReadBuffer", "glReadPixels",
+ "glRenderbufferStorage", "glRenderbufferStorageMultisample", "isFramebufferEnabled",
+ "takeFirstClearBlockNanos"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMLighting",
+ "applyLighting", "captureLighting", "disableColorMaterial", "disableLight", "disableLighting",
+ "disableRescaleNormal", "enableColorMaterial", "enableLight", "enableLighting", "enableRescaleNormal",
+ "getBackMaterial", "getColorMaterial", "getColorMaterialFace", "getColorMaterialParameter",
+ "getFrontMaterial", "getLightDataStates", "getLightModel", "getLightStates", "getLightingGeneration",
+ "getLightingState", "getNormalizeState", "getRescaleNormalState", "glColorMaterial", "glGetLight",
+ "glGetMaterial", "glLight", "glLightModel", "glLightModelf", "glLightModeli", "glLightf", "glLighti",
+ "glMaterial", "glMaterialf", "glMateriali", "i2f"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMMatrices",
+ "applyMultMatrix", "getMatrixMode", "getMatrixStack", "getMatrixStackDepth", "getModelViewMatrix",
+ "getMvGeneration", "getMvLinearGeneration", "getProjGeneration", "getProjectionMatrix",
+ "getTexMatrixGeneration", "glFrustum", "glLoadIdentity", "glLoadMatrix", "glMatrixMode", "glMultMatrix",
+ "glOrtho", "glPopMatrix", "glPushMatrix", "glRotated", "glRotatef", "glScaled", "glScalef", "glTranslated",
+ "glTranslatef", "gluBuild2DMipmaps", "gluErrorString", "gluLookAt", "gluOrtho2D", "gluPerspective",
+ "gluPickMatrix", "gluUnProject", "setModelViewMatrix", "setProjectionMatrix", "setTextureMatrix"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMPrograms",
+ "getActiveProgram", "getProgramGeneration", "getProgramLifetimeGeneration", "getProgramStack",
+ "getVertexProgramTwoSideState", "glAttachShader", "glBindAttribLocation", "glBindFragDataLocation",
+ "glCompileShader", "glCreateProgram", "glCreateShader", "glDeleteObjectARB", "glDeleteProgram",
+ "glDeleteShader", "glDetachShader", "glDispatchCompute", "glGetActiveAttrib", "glGetActiveUniform",
+ "glGetAttachedShaders", "glGetAttribLocation", "glGetHandleARB", "glGetInfoLogARB",
+ "glGetObjectParameterARB", "glGetObjectParameteriARB", "glGetProgramBinary", "glGetProgramInfoLog",
+ "glGetProgrami", "glGetShaderInfoLog", "glGetShaderSource", "glGetShaderi", "glGetUniform",
+ "glGetUniformBlockIndex", "glGetUniformLocation", "glIsProgram", "glIsShader", "glLinkProgram",
+ "glProgramBinary", "glProgramParameteri", "glShaderSource", "glSpecializeShader", "glUniform1",
+ "glUniform1f", "glUniform1i", "glUniform2", "glUniform2f", "glUniform2i", "glUniform3", "glUniform3f",
+ "glUniform3i", "glUniform4", "glUniform4f", "glUniform4i", "glUniformBlockBinding", "glUniformMatrix2",
+ "glUniformMatrix3", "glUniformMatrix4", "glUseProgram", "glValidateProgram", "isProgramPendingDeletion",
+ "nglShaderSource", "setFfpInstancing"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMQueries",
+ "checkGLError", "glBeginQuery", "glDeleteQueries", "glEndQuery", "glGenQueries", "glGetBoolean",
+ "glGetBooleani", "glGetBooleani_v", "glGetDouble", "glGetError", "glGetFloat", "glGetInteger",
+ "glGetIntegeri", "glGetIntegeri_v", "glGetQueryObjecti", "glGetQueryObjectui", "glGetQueryObjectui64",
+ "glGetString", "glGetStringi", "glIsQuery", "glQueryCounter"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMRasterizer",
+ "anyClipPlaneEnabled", "disableCull", "disableScissorTest", "enableCull", "enableScissorTest",
+ "getAutoNormalState", "getClipPlaneState", "getClipPlaneStates", "getCullState", "getDitherState",
+ "getEdgeFlagState", "getHintState", "getLineSmoothState", "getLineState", "getLineStippleState",
+ "getMap1Color4State", "getMap1IndexState", "getMap1NormalState", "getMap1TextureCoord1State",
+ "getMap1TextureCoord2State", "getMap1TextureCoord3State", "getMap1TextureCoord4State",
+ "getMap1Vertex3State", "getMap1Vertex4State", "getMap2Color4State", "getMap2IndexState",
+ "getMap2NormalState", "getMap2TextureCoord1State", "getMap2TextureCoord2State", "getMap2TextureCoord3State",
+ "getMap2TextureCoord4State", "getMap2Vertex3State", "getMap2Vertex4State", "getMultisampleState",
+ "getPointSmoothState", "getPointSpriteState", "getPointState", "getPolygonOffsetFillState",
+ "getPolygonOffsetLineState", "getPolygonOffsetPointState", "getPolygonSmoothState", "getPolygonState",
+ "getPolygonStippleState", "getSampleAlphaToCoverageState", "getSampleAlphaToOneState",
+ "getSampleCoverageState", "getScissorState", "getScissorTest", "getShadeModelState", "getViewportState",
+ "glClipPlane", "glCullFace", "glFrontFace", "glGetClipPlane", "glHint", "glLineStipple", "glLineWidth",
+ "glPointParameter", "glPointParameterf", "glPointParameteri", "glPointSize", "glPolygonMode",
+ "glPolygonOffset", "glPolygonOffsetClamp", "glPolygonStipple", "glSampleCoverage", "glScissor",
+ "glShadeModel", "glViewport"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen",
+ "glGetTexEnv", "glGetTexEnvf", "glGetTexEnvi", "glGetTexGen", "glGetTexGend", "glGetTexGenf",
+ "glGetTexGeni", "glTexEnv", "glTexEnvf", "glTexEnvi", "glTexGen", "glTexGend", "glTexGenf", "glTexGeni"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime",
+ "deferredTexturesAwaitingRelease", "onFrameEnd"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMTextures",
+ "abandonTextureStaging", "beginTextureStaging", "commitTextureStaging", "disableTexture", "enableTexture",
+ "forcePixelUnpackState", "getActiveTextureUnit", "getActiveTextureUnitForServerState",
+ "getActiveTextureUnitStack", "getBoundTextureForServerState", "getClientActiveTextureUnit",
+ "getImageUnitBinding", "getMaxBoundTextureUnit", "getSamplerBinding", "getSamplerUnitCount", "getTextures",
+ "glActiveTexture", "glActiveTextureARB", "glBindImageTexture", "glBindImageTextures",
+ "glBindMultiTextureEXT", "glBindSampler", "glBindSamplers", "glBindTexture", "glBindTextureUnit",
+ "glBindTextures", "glClearTexImage", "glClientActiveTexture", "glCopyImageSubData", "glCopyTexImage1D",
+ "glCopyTexImage2D", "glCopyTexSubImage1D", "glCopyTexSubImage2D", "glCopyTexSubImage3D", "glCreateTextures",
+ "glDeleteSamplers", "glDeleteTextures", "glGenSamplers", "glGenTextures", "glGenerateMipmap",
+ "glGetTexImage", "glGetTexLevelParameteri", "glGetTexParameterf", "glGetTexParameteri", "glIsSampler",
+ "glIsTexture", "glPixelStoref", "glPixelStorei", "glSamplerParameterf", "glSamplerParameteri",
+ "glTexImage1D", "glTexImage2D", "glTexImage3D", "glTexParameter", "glTexParameterf", "glTexParameteri",
+ "glTexStorage2D", "glTexSubImage1D", "glTexSubImage2D", "glTexSubImage3D", "lookupTexParameteri",
+ "markTextureAsAtlas", "remapTexClamp", "remapTexClampBuffer", "remapTexImageForGLES",
+ "restorePixelUnpackState", "setActiveTexture", "setFilter", "setTextureSupersamplingSamples",
+ "trackMaxBoundTextureUnit", "trimTextureStaging", "unbindAllSamplers", "updateTexParameterfCache",
+ "updateTexParameteriCache"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMVertexInput",
+ "getBoundEBO", "getBoundVAO", "glBindVertexArray", "glBindVertexArrayAPPLE", "glBindVertexBuffer",
+ "glColorPointer", "glDeleteVertexArrays", "glDisableClientState", "glDisableVertexAttribArray",
+ "glEdgeFlagPointer", "glEnableClientState", "glEnableVertexAttribArray", "glFogCoordPointer",
+ "glGenVertexArrays", "glGetPointer", "glInterleavedArrays", "glIsVertexArray", "glNormalPointer",
+ "glSecondaryColorPointer", "glTexCoordPointer", "glVertexAttribBinding", "glVertexAttribDivisor",
+ "glVertexAttribDivisorARB", "glVertexAttribFormat", "glVertexAttribIFormat", "glVertexAttribIPointer",
+ "glVertexAttribPointer", "glVertexPointer"},
+ };
+
+ static final String[][] FIELDS = {
+ {"com/gtnewhorizons/angelica/glsm/GLSMAttribStack",
+ "attribBackendCalls", "attribDiscards", "attribPushes", "attribSlotsSaved", "attribValueRestores"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMDraws",
+ "drawCalls"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMFramebuffer",
+ "DEFAULT_DRAW_BUFFER"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMPrograms",
+ "programSwitches"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMRasterizer",
+ "wideLineEmulationEnabled"},
+ {"com/gtnewhorizons/angelica/glsm/GLSMTextures",
+ "TEX_PARAM_MISS", "texBindMisses"},
+ };
+
+ private GLSMOwners() {}
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java
index a1db2a37e..c0691bac2 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java
@@ -11,6 +11,8 @@ import org.objectweb.asm.Handle;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
@@ -21,13 +23,15 @@ import org.objectweb.asm.tree.TypeInsnNode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
/**
- * Core GL call redirector for GLSM. Rewrites bytecode so that GL calls go through {@code GLStateManager} for state tracking and backend abstraction.
+ * Core GL call redirector for GLSM. Rewrites bytecode so GL calls go through the GLSM classes for state tracking and backend abstraction.
*
* THIS CLASS MIGHT BE LOADED ON A DIFFERENT CLASS LOADER.
* IT SHOULD NOT CALL ANY CODE FROM THE MAIN MOD.
@@ -186,6 +190,12 @@ public class GLSMRedirector {
private static final Map typeRedirects = new HashMap<>();
private static final ClassConstantPoolParser cstPoolParser;
private static final String[] CONSTANT_POOL_SEARCH_STRINGS;
+ private static final Map methodOwner = new HashMap<>(512);
+ private static final Map fieldOwner = new HashMap<>(64);
+ static final String[] CORE_REWRITE_TARGETS = {"makeCurrent", "releaseContext", "swapBuffers", "updateDisplay", "isCurrent"};
+ private static final Set LEGACY_WARNED = ConcurrentHashMap.newKeySet();
+ private String legacyHint = "";
+ private LegacyRewriter legacyRewriter;
private static final String[] CORE_EXCLUSIONS = {
"org.lwjgl",
@@ -540,7 +550,9 @@ public class GLSMRedirector {
.add("glIsFramebuffer")
.add("glIsRenderbuffer")
.add("glBindBufferBase")
- .add("glBindBufferRange");
+ .add("glBindBufferRange")
+ .add("glEnablei")
+ .add("glDisablei");
final var gl31 = RedirectMap.newMap()
.add("glDrawElementsInstanced")
.add("glDrawArraysInstanced")
@@ -574,7 +586,8 @@ public class GLSMRedirector {
.add("glVertexAttribFormat")
.add("glVertexAttribIFormat")
.add("glVertexAttribBinding")
- .add("glMultiDrawElementsIndirect");
+ .add("glMultiDrawElementsIndirect")
+ .add("glCopyImageSubData");
final var gl44 = RedirectMap.newMap()
.add("glBufferStorage")
.add("glBindSamplers")
@@ -899,10 +912,34 @@ public class GLSMRedirector {
stringsToSearch.add(Drawable);
stringsToSearch.add(SharedDrawable);
stringsToSearch.add(Display);
+ stringsToSearch.add(GLStateManager);
stringsToSearch.addAll(typeRedirects.keySet());
stringsToSearch.addAll(methodRedirects.keySet());
CONSTANT_POOL_SEARCH_STRINGS = stringsToSearch.toArray(new String[0]);
cstPoolParser = new ClassConstantPoolParser(CONSTANT_POOL_SEARCH_STRINGS);
+
+ fillOwners(methodOwner, GLSMOwners.METHODS);
+ fillOwners(fieldOwner, GLSMOwners.FIELDS);
+ }
+
+ private static void fillOwners(Map owners, String[][] table) {
+ for (String[] row : table) {
+ for (int i = 1; i < row.length; i++) owners.put(row[i], row[0]);
+ }
+ }
+
+ static Set redirectTargets() {
+ final Set targets = new TreeSet<>(glMethodRedirects.values());
+ targets.addAll(glDescRedirects.values());
+ for (Map inner : methodRedirects.values()) targets.addAll(inner.values());
+ for (String cap : glCapRedirects.values()) {
+ targets.add("enable" + cap);
+ targets.add("disable" + cap);
+ }
+ targets.add("glEnable");
+ targets.add("glDisable");
+ Collections.addAll(targets, CORE_REWRITE_TARGETS);
+ return targets;
}
public String[] getCoreExclusions() {
@@ -915,9 +952,46 @@ public class GLSMRedirector {
public static String getGLPrefix() { return GL_PREFIX; }
- public static String getTargetClassName() { return GLStateManager; }
+ public static String getTargetOwner(String glsmName) { return methodOwner.getOrDefault(glsmName, GLStateManager); }
- /** Key: original method name, value: GLStateManager method name. */
+ public static List glsmClasses() {
+ final Set classes = new LinkedHashSet<>();
+ classes.add(GLStateManager);
+ for (String[] row : GLSMOwners.METHODS) classes.add(row[0]);
+ for (String[] row : GLSMOwners.FIELDS) classes.add(row[0]);
+ return List.copyOf(classes);
+ }
+
+ public void setLegacyHint(String hint) { this.legacyHint = hint; }
+
+ public void setLegacyRewriter(LegacyRewriter rewriter) { this.legacyRewriter = rewriter; }
+
+ private static String simpleName(String internalName) {
+ return internalName.substring(internalName.lastIndexOf('/') + 1);
+ }
+
+ private void warnLegacy(String transformedName, String name, String newOwner) {
+ warnLegacyUse(transformedName, name, "moved to " + simpleName(newOwner) + "." + name);
+ }
+
+ private void warnLegacyUse(String transformedName, String name, String outcome) {
+ final int dot = transformedName.lastIndexOf('.');
+ final String key = dot < 0 ? transformedName : transformedName.substring(0, dot);
+ if (LEGACY_WARNED.add(key)) {
+ LOGGER.warn("{} uses GLStateManager.{}, {}; rewritten at load.{}", transformedName, name, outcome, legacyHint.isEmpty() ? "" : " " + legacyHint);
+ }
+ }
+
+ private boolean tryLegacyRewrite(String transformedName, InsnList instructions, MethodInsnNode call) {
+ if (legacyRewriter == null) return false;
+ final String name = call.name;
+ final String replacement = legacyRewriter.rewrite(instructions, call);
+ if (replacement == null) return false;
+ warnLegacyUse(transformedName, name, "redirected to " + replacement);
+ return true;
+ }
+
+ /** @return Map from GL method name to GLSM method name. {@link #getTargetOwner} gives its class. */
public static Map getGLPrefixMethodRedirects() {
return Collections.unmodifiableMap(glMethodRedirects);
}
@@ -943,7 +1017,9 @@ public class GLSMRedirector {
if (isOpenGlHelper && (mn.name.equals("glBlendFunc") || mn.name.equals("func_148821_a"))) {
continue;
}
+ boolean rewroteLegacy = false;
for (AbstractInsnNode node : mn.instructions.toArray()) {
+ if (rewroteLegacy && !mn.instructions.contains(node)) continue;
if (node instanceof TypeInsnNode tNode) {
if (tNode.getOpcode() == Opcodes.NEW || tNode.getOpcode() == Opcodes.CHECKCAST) {
final String redirect = typeRedirects.get(tNode.desc);
@@ -955,7 +1031,29 @@ public class GLSMRedirector {
changed = true;
}
}
+ } else if (node instanceof FieldInsnNode fNode) {
+ if (fNode.owner.equals(GLStateManager) && (fNode.getOpcode() == Opcodes.GETSTATIC || fNode.getOpcode() == Opcodes.PUTSTATIC)) {
+ final String newOwner = fieldOwner.get(fNode.name);
+ if (newOwner != null) {
+ warnLegacy(transformedName, fNode.name, newOwner);
+ fNode.owner = newOwner;
+ changed = true;
+ }
+ }
} else if (node instanceof MethodInsnNode mNode) {
+ if (mNode.owner.equals(GLStateManager)) {
+ if (tryLegacyRewrite(transformedName, mn.instructions, mNode)) {
+ rewroteLegacy = true;
+ changed = true;
+ continue;
+ }
+ final String newOwner = methodOwner.get(mNode.name);
+ if (newOwner != null) {
+ warnLegacy(transformedName, mNode.name, newOwner);
+ mNode.owner = newOwner;
+ changed = true;
+ }
+ }
if (mNode.desc.equals("(I)V") && mNode.owner.startsWith(GL_PREFIX) && (mNode.name.equals("glEnable") || mNode.name.equals("glDisable"))) {
final AbstractInsnNode prevNode = node.getPrevious();
String name = null;
@@ -974,12 +1072,12 @@ public class GLSMRedirector {
if (LOG_SPAM) {
final String shortOwner = mNode.owner.substring(mNode.owner.lastIndexOf("/") + 1);
if (name == null) {
- LOGGER.info("Redirecting call in {} from {}.{}(I)V to GLStateManager.{}(I)V", transformedName, shortOwner, mNode.name, mNode.name);
+ LOGGER.info("Redirecting call in {} from {}.{}(I)V to {}.{}(I)V", transformedName, shortOwner, mNode.name, simpleName(getTargetOwner(mNode.name)), mNode.name);
} else {
- LOGGER.info("Redirecting call in {} from {}.{}(I)V to GLStateManager.{}()V", transformedName, shortOwner, mNode.name, name);
+ LOGGER.info("Redirecting call in {} from {}.{}(I)V to {}.{}()V", transformedName, shortOwner, mNode.name, simpleName(getTargetOwner(name)), name);
}
}
- mNode.owner = GLStateManager;
+ mNode.owner = getTargetOwner(name != null ? name : mNode.name);
if (name != null) {
mNode.name = name;
mNode.desc = "()V";
@@ -1039,9 +1137,9 @@ public class GLSMRedirector {
} else if (glsmName != null) {
if (LOG_SPAM) {
final String shortOwner = mNode.owner.substring(mNode.owner.lastIndexOf("/") + 1);
- LOGGER.info("Redirecting call in {} from {}.{}{} to GLStateManager.{}{}", transformedName, shortOwner, mNode.name, mNode.desc, glsmName, mNode.desc);
+ LOGGER.info("Redirecting call in {} from {}.{}{} to {}.{}{}", transformedName, shortOwner, mNode.name, mNode.desc, simpleName(getTargetOwner(glsmName)), glsmName, mNode.desc);
}
- mNode.owner = GLStateManager;
+ mNode.owner = getTargetOwner(glsmName);
mNode.name = glsmName;
changed = true;
} else if (lwjgl3Aware && mNode.owner.startsWith(LWJGL_GL_PACKAGE) && hasLwjglTypedDescriptor(mNode.desc) && !isAwareNonDispatching(mNode.owner, mNode.name)) {
@@ -1066,6 +1164,17 @@ public class GLSMRedirector {
// Redirect method handles in invokedynamic bootstrap arguments
for (int i = 0; i < dynNode.bsmArgs.length; i++) {
if (!(dynNode.bsmArgs[i] instanceof Handle handle)) continue;
+ if (handle.getOwner().equals(GLStateManager)) {
+ final int tag = handle.getTag();
+ final String newOwner = tag == Opcodes.H_INVOKESTATIC ? methodOwner.get(handle.getName())
+ : tag == Opcodes.H_GETSTATIC || tag == Opcodes.H_PUTSTATIC ? fieldOwner.get(handle.getName()) : null;
+ if (newOwner != null) {
+ warnLegacy(transformedName, handle.getName(), newOwner);
+ dynNode.bsmArgs[i] = new Handle(tag, newOwner, handle.getName(), handle.getDesc());
+ changed = true;
+ continue;
+ }
+ }
String glsmName = glDescRedirects.get(handle.getOwner() + " " + handle.getName() + handle.getDesc());
if (glsmName == null) {
final Map redirects = handle.getOwner().startsWith(GL_PREFIX) ? glMethodRedirects : methodRedirects.get(handle.getOwner());
@@ -1081,9 +1190,9 @@ public class GLSMRedirector {
}
if (LOG_SPAM) {
final String shortOwner = handle.getOwner().substring(handle.getOwner().lastIndexOf("/") + 1);
- LOGGER.info("Redirecting invokedynamic handle in {} from {}.{}{} to GLStateManager.{}{}", transformedName, shortOwner, handle.getName(), handle.getDesc(), glsmName, handle.getDesc());
+ LOGGER.info("Redirecting invokedynamic handle in {} from {}.{}{} to {}.{}{}", transformedName, shortOwner, handle.getName(), handle.getDesc(), simpleName(getTargetOwner(glsmName)), glsmName, handle.getDesc());
}
- dynNode.bsmArgs[i] = new Handle(handle.getTag(), GLStateManager, glsmName, handle.getDesc());
+ dynNode.bsmArgs[i] = new Handle(handle.getTag(), getTargetOwner(glsmName), glsmName, handle.getDesc());
changed = true;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java
new file mode 100644
index 000000000..1880d29e9
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java
@@ -0,0 +1,10 @@
+package com.gtnewhorizons.angelica.glsm.redirect;
+
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.MethodInsnNode;
+
+public interface LegacyRewriter {
+
+ /** Replaces {@code call} in place and returns the replacement's name for the legacy warning, or null to leave it alone. */
+ String rewrite(InsnList instructions, MethodInsnNode call);
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java
index cfdc8a0c4..fe0de5c71 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm.shader;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.threading.AngelicaWorkers;
@@ -73,7 +73,7 @@ public final class ProgramBinaryCache {
}
public static void markRetrievable(int program) {
- GLStateManager.glProgramParameteri(program, GL41.GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL11.GL_TRUE);
+ GLSMPrograms.glProgramParameteri(program, GL41.GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL11.GL_TRUE);
}
public static int load(Key key) {
@@ -87,16 +87,16 @@ public final class ProgramBinaryCache {
ShaderDiskCache.remove(diskKey);
return 0;
}
- final int program = GLStateManager.glCreateProgram();
+ final int program = GLSMPrograms.glCreateProgram();
final ByteBuffer data = MemoryUtilities.memAlloc(blob.data().length);
try {
data.put(blob.data()).flip();
- GLStateManager.glProgramBinary(program, format, data);
+ GLSMPrograms.glProgramBinary(program, format, data);
} finally {
MemoryUtilities.memFree(data);
}
- if (GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
- GLStateManager.glDeleteProgram(program);
+ if (GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
+ GLSMPrograms.glDeleteProgram(program);
ShaderDiskCache.remove(diskKey);
if (rejectWarned.compareAndSet(false, true)) LOGGER.error("Driver rejected a saved shader program!! Recompiling rejected programs from source");
return 0;
@@ -112,13 +112,13 @@ public final class ProgramBinaryCache {
}
private static boolean saveBinary(Key key, int program) {
- final int length = GLStateManager.glGetProgrami(program, GL41.GL_PROGRAM_BINARY_LENGTH);
+ final int length = GLSMPrograms.glGetProgrami(program, GL41.GL_PROGRAM_BINARY_LENGTH);
if (length <= 0) return false;
final ByteBuffer data = MemoryUtilities.memAlloc(length);
final IntBuffer written = MemoryUtilities.memAllocInt(1);
final IntBuffer format = MemoryUtilities.memAllocInt(1);
try {
- GLStateManager.glGetProgramBinary(program, written, format, data);
+ GLSMPrograms.glGetProgramBinary(program, written, format, data);
if (written.get(0) <= 0) return false;
data.limit(written.get(0));
final byte[] binary = ShaderCacheIO.toHeap(data);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java
index 08077daf4..137fdf8ff 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.stacks;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.hooks.VanillaBooleanLayer;
import com.gtnewhorizons.angelica.glsm.states.BooleanState;
@@ -90,7 +91,7 @@ public class BooleanStateStack extends BooleanState implements CowStateStack extends IStateStack {
final int depth = o.attribDepth;
if (depth == 0 || d.claimedAt(depth) || !o.savesState(d.id)) return;
captureSlot(d.claim(depth));
- GLStateManager.registerModifiedState(o, d.id);
+ GLSMAttribStack.registerModifiedState(o, d.id);
}
@Override
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java
index 1fe1912b2..6ce73d29c 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java
@@ -1,5 +1,6 @@
package com.gtnewhorizons.angelica.glsm.stacks;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -50,7 +51,7 @@ public final class TextureUnitBooleanStateStack extends BooleanStateStack {
}
if (!ffpStateOnly) {
- final int currentUnit = GLStateManager.getActiveTextureUnit();
+ final int currentUnit = GLSMTextures.getActiveTextureUnit();
final boolean needsSwitch = currentUnit != unitIndex;
if (needsSwitch) BackendManager.RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + unitIndex);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java
index f3e8ce45f..669488c99 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java
@@ -1,5 +1,6 @@
package com.gtnewhorizons.angelica.glsm.states;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import lombok.Getter;
import org.lwjgl.opengl.GL11;
@@ -45,7 +46,7 @@ public class BooleanState implements ISettableState {
public void setEnabled(boolean enabled) {
final boolean bypass = !GLStateManager.isCachingEnabled();
- if (stateUnknown || bypass || enabled != this.enabled || (this.glCap == GL11.GL_BLEND && GLStateManager.vendorIsAMD() && GLStateManager.isPoppingAttributes())) {
+ if (stateUnknown || bypass || enabled != this.enabled || (this.glCap == GL11.GL_BLEND && GLStateManager.vendorIsAMD() && GLSMAttribStack.isPoppingAttributes())) {
GLStateManager.beforeUncapturedCapabilityChange(glCap);
stateUnknown = false;
this.enabled = enabled;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java
index 7c5e6d739..754b9159f 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java
@@ -8,7 +8,7 @@ import org.lwjgl.opengl.GL12;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.i2f;
+import static com.gtnewhorizons.angelica.glsm.GLSMLighting.i2f;
public class LightModelState implements ISettableState {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java
index 191aa380e..a78d4ba80 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java
@@ -1,5 +1,6 @@
package com.gtnewhorizons.angelica.glsm.states;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.joml.Matrix3f;
import org.joml.Vector3f;
@@ -11,7 +12,7 @@ import org.lwjgl.opengl.GL11;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.i2f;
+import static com.gtnewhorizons.angelica.glsm.GLSMLighting.i2f;
public class LightState implements ISettableState {
@@ -73,14 +74,14 @@ public class LightState implements ISettableState {
this.rawPosition = new Vector4f(position);
this.position = position;
- this.position.mul(GLStateManager.getModelViewMatrix());
- this.posMvGeneration = GLStateManager.getMvGeneration();
+ this.position.mul(GLSMMatrices.getModelViewMatrix());
+ this.posMvGeneration = GLSMMatrices.getMvGeneration();
this.rawSpotDirection = new Vector3f(spotDirection);
this.spotDirection = spotDirection;
- GLStateManager.getModelViewMatrix().get3x3(matrix3f);
+ GLSMMatrices.getModelViewMatrix().get3x3(matrix3f);
this.spotDirection.mul(matrix3f);
- this.spotDirLinearGeneration = GLStateManager.getMvLinearGeneration();
+ this.spotDirLinearGeneration = GLSMMatrices.getMvLinearGeneration();
}
public boolean setAmbient(FloatBuffer newBuffer) {
@@ -152,12 +153,12 @@ public class LightState implements ISettableState {
}
private boolean applyPosition(Vector4f raw) {
- final int mvGen = GLStateManager.getMvGeneration();
+ final int mvGen = GLSMMatrices.getMvGeneration();
if (!GLStateManager.isCachingEnabled() || this.posMvGeneration != mvGen || !this.rawPosition.equals(raw)) {
this.rawPosition.set(raw);
this.posMvGeneration = mvGen;
this.position.set(raw);
- this.position.mul(GLStateManager.getModelViewMatrix());
+ this.position.mul(GLSMMatrices.getModelViewMatrix());
return true;
}
return false;
@@ -175,11 +176,11 @@ public class LightState implements ISettableState {
}
private boolean applySpotDirection(Vector3f raw) {
- final int mvLinearGen = GLStateManager.getMvLinearGeneration();
+ final int mvLinearGen = GLSMMatrices.getMvLinearGeneration();
if (!GLStateManager.isCachingEnabled() || this.spotDirLinearGeneration != mvLinearGen || !this.rawSpotDirection.equals(raw)) {
this.rawSpotDirection.set(raw);
this.spotDirLinearGeneration = mvLinearGen;
- GLStateManager.getModelViewMatrix().get3x3(matrix3f);
+ GLSMMatrices.getModelViewMatrix().get3x3(matrix3f);
this.spotDirection.set(raw);
this.spotDirection.mul(matrix3f);
return true;
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java
index c031354bc..ab98c1af9 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java
@@ -9,7 +9,7 @@ import org.joml.Vector4i;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.i2f;
+import static com.gtnewhorizons.angelica.glsm.GLSMLighting.i2f;
public class MaterialState implements ISettableState {
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java
index d2dd77ea3..420e3593d 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.streaming;
import com.gtnewhorizons.angelica.config.SystemProperties;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.lwjgl.opengl.GL30;
@@ -50,15 +51,15 @@ final class GlStreamingRing {
static GlStreamingRing create(int target, int capacity, boolean forceOrphan) {
if (forceOrphan || !RenderSystem.supportsBufferStorage()) return null;
- final int id = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(target, id);
+ final int id = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(target, id);
final int storageFlags = GL44.GL_MAP_PERSISTENT_BIT | GL30.GL_MAP_WRITE_BIT | GL44.GL_MAP_COHERENT_BIT | GL44.GL_CLIENT_STORAGE_BIT;
RenderSystem.bufferStorage(target, capacity, storageFlags);
final int mapFlags = GL44.GL_MAP_PERSISTENT_BIT | GL30.GL_MAP_WRITE_BIT | GL44.GL_MAP_COHERENT_BIT;
- final ByteBuffer mapped = GLStateManager.glMapBufferRange(target, 0, capacity, mapFlags);
- GLStateManager.glBindBuffer(target, 0);
+ final ByteBuffer mapped = GLSMBuffers.glMapBufferRange(target, 0, capacity, mapFlags);
+ GLSMBuffers.glBindBuffer(target, 0);
if (mapped == null) {
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
GLStateManager.LOGGER.warn("Persistent map failed for streaming ring (target=0x{}, {} bytes)", Integer.toHexString(target), capacity);
return null;
}
@@ -102,7 +103,7 @@ final class GlStreamingRing {
private void fence() {
if (pendingBytes > 0) {
- fences.enqueue(GLStateManager.glFenceSync(GL32.GL_SYNC_GPU_COMMANDS_COMPLETE, 0), pendingBytes);
+ fences.enqueue(GLSMBuffers.glFenceSync(GL32.GL_SYNC_GPU_COMMANDS_COMPLETE, 0), pendingBytes);
pendingBytes = 0;
fencesIssued++;
totalFencesIssued++;
@@ -116,8 +117,8 @@ final class GlStreamingRing {
private void reclaim() {
while (!fences.isEmpty()) {
final long fenceId = fences.firstId();
- if (!signaled(GLStateManager.glClientWaitSync(fenceId, 0, 0L))) break;
- GLStateManager.glDeleteSync(fenceId);
+ if (!signaled(GLSMBuffers.glClientWaitSync(fenceId, 0, 0L))) break;
+ GLSMBuffers.glDeleteSync(fenceId);
remaining += fences.firstBytes();
fences.dequeue();
}
@@ -132,14 +133,14 @@ final class GlStreamingRing {
long remainingNanos = SYNC_WAIT_TOTAL_NANOS;
int status;
do {
- status = GLStateManager.glClientWaitSync(fenceId, GL32.GL_SYNC_FLUSH_COMMANDS_BIT,
+ status = GLSMBuffers.glClientWaitSync(fenceId, GL32.GL_SYNC_FLUSH_COMMANDS_BIT,
Math.min(SYNC_WAIT_SLICE_NANOS, remainingNanos));
remainingNanos = deadline - System.nanoTime();
} while (status == GL32.GL_TIMEOUT_EXPIRED && remainingNanos > 0);
if (!signaled(status)) {
GLStateManager.LOGGER.warn("Streaming ring fence wait did not signal (status=0x{}); reclaiming anyway", Integer.toHexString(status));
}
- GLStateManager.glDeleteSync(fenceId);
+ GLSMBuffers.glDeleteSync(fenceId);
remaining += bytes;
reclaim();
}
@@ -161,14 +162,14 @@ final class GlStreamingRing {
void destroy() {
while (!fences.isEmpty()) {
- GLStateManager.glDeleteSync(fences.firstId());
+ GLSMBuffers.glDeleteSync(fences.firstId());
fences.dequeue();
}
if (bufferId != 0) {
- GLStateManager.glBindBuffer(target, bufferId);
- GLStateManager.glUnmapBuffer(target);
- GLStateManager.glBindBuffer(target, 0);
- GLStateManager.glDeleteBuffers(bufferId);
+ GLSMBuffers.glBindBuffer(target, bufferId);
+ GLSMBuffers.glUnmapBuffer(target);
+ GLSMBuffers.glBindBuffer(target, 0);
+ GLSMBuffers.glDeleteBuffers(bufferId);
bufferId = 0;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java
index 1b30770c7..fe00582ec 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java
@@ -4,6 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
import org.lwjgl.opengl.GL11;
@@ -60,16 +61,16 @@ public final class LineQuads {
}
public static boolean disableCulling() {
- final boolean wasEnabled = GLStateManager.getCullState().isEnabled();
+ final boolean wasEnabled = GLSMRasterizer.getCullState().isEnabled();
if (wasEnabled) {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
}
return wasEnabled;
}
public static void restoreCulling(boolean wasEnabled) {
if (wasEnabled) {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java
index 1def3853a..203e3893a 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.streaming;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import org.lwjgl.opengl.GL15;
import java.nio.ByteBuffer;
@@ -14,19 +14,19 @@ public final class OrphanStreamingBuffer {
private int capacity;
public OrphanStreamingBuffer() {
- this.bufferId = GLStateManager.glGenBuffers();
+ this.bufferId = GLSMBuffers.glGenBuffers();
}
public void upload(ByteBuffer data) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId);
capacity = StreamingUploader.upload(data, capacity);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
void upload(StreamingUploader.UploadStrategy strategy, ByteBuffer data) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId);
capacity = StreamingUploader.upload(strategy, data, capacity);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
public int getCapacity() {
@@ -39,7 +39,7 @@ public final class OrphanStreamingBuffer {
public void destroy() {
if (bufferId != 0) {
- GLStateManager.glDeleteBuffers(bufferId);
+ GLSMBuffers.glDeleteBuffers(bufferId);
bufferId = 0;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
index cd6baf990..6303719f0 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
@@ -1,5 +1,6 @@
package com.gtnewhorizons.angelica.glsm.streaming;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL30;
@@ -27,30 +28,30 @@ public final class StreamingUploader {
public static int upload(UploadStrategy strategy, ByteBuffer data, int capacity) {
switch (strategy) {
case BUFFER_DATA -> {
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
return data.remaining();
}
case BUFFER_SUB_DATA -> {
if (data.remaining() > capacity) {
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
return data.remaining();
}
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, data);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, data);
return capacity;
}
case MAP_BUFFER_RANGE -> {
if (data.remaining() > capacity) {
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
return data.remaining();
}
final int dataSize = data.remaining();
- final long dst = GLStateManager.glMapBufferRangeAddress(GL15.GL_ARRAY_BUFFER, 0, dataSize, MAP_WRITE_INVALIDATE_BUFFER);
+ final long dst = GLSMBuffers.glMapBufferRangeAddress(GL15.GL_ARRAY_BUFFER, 0, dataSize, MAP_WRITE_INVALIDATE_BUFFER);
if (dst == 0L) {
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
return data.remaining();
}
memCopy(memAddress0(data), dst, dataSize);
- GLStateManager.glUnmapBuffer(GL15.GL_ARRAY_BUFFER);
+ GLSMBuffers.glUnmapBuffer(GL15.GL_ARRAY_BUFFER);
return capacity;
}
default -> throw new UnsupportedOperationException();
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java
index f5ae36377..e27a7a01d 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java
@@ -7,6 +7,10 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.QuadConverter;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
@@ -179,7 +183,7 @@ public class TessellatorStreamingDrawer {
final int[] rawBuffer = tess.rawBuffer;
final int defaultColor;
if (!tess.hasColor) {
- final var c = GLStateManager.getColor();
+ final var c = GLSMCurrentAttribs.getColor();
defaultColor = ((int)(clamp(0f, 1f, c.getAlpha()) * 255) << 24) | ((int)(clamp(0f, 1f, c.getBlue()) * 255) << 16)
| ((int)(clamp(0f, 1f, c.getGreen()) * 255) << 8) | (int)(clamp(0f, 1f, c.getRed()) * 255);
} else {
@@ -367,10 +371,10 @@ public class TessellatorStreamingDrawer {
final boolean fromRing = firstVertex >= 0;
if (fromRing) {
- GLStateManager.glBindVertexArray(persistentVAOs[flags]);
+ GLSMVertexInput.glBindVertexArray(persistentVAOs[flags]);
} else {
if (Tracy.ENABLED && persistentBuffer != null) orphanFallbacks++;
- GLStateManager.glBindVertexArray(orphanVAOs[flags]);
+ GLSMVertexInput.glBindVertexArray(orphanVAOs[flags]);
orphanBuffers[flags].upload(packed);
firstVertex = 0;
}
@@ -382,7 +386,7 @@ public class TessellatorStreamingDrawer {
}
drawWithQuadConversion(glCtx, drawMode, firstVertex, vertexCount);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
} finally {
if (locked) GLStateManager.releaseDrawLock();
Tracy.endZone();
@@ -403,7 +407,7 @@ public class TessellatorStreamingDrawer {
}
return true;
}
- if (GLStateManager.ffpWidensLineQuads()) {
+ if (GLSMDraws.ffpWidensLineQuads()) {
final GLContextState glCtx = GLStateManager.ctx();
glCtx.lineQuadsActive = true;
try {
@@ -463,10 +467,10 @@ public class TessellatorStreamingDrawer {
FfpExtendedAttribs.beginInternalDraw();
try {
if (drawMode == GL11.GL_QUADS) {
- GLStateManager.drawCalls++;
+ GLSMDraws.drawCalls++;
QuadConverter.drawQuadsAsTriangles(glCtx, firstVertex, vertexCount);
} else {
- GLStateManager.glDrawArrays(drawMode, firstVertex, vertexCount);
+ GLSMDraws.glDrawArrays(drawMode, firstVertex, vertexCount);
}
} finally {
FfpExtendedAttribs.endInternalDraw();
@@ -486,36 +490,36 @@ public class TessellatorStreamingDrawer {
}
if (firstVertex >= 0) {
- GLStateManager.glBindVertexArray(vaos.extendedPersistent(layout)[flags]);
+ GLSMVertexInput.glBindVertexArray(vaos.extendedPersistent(layout)[flags]);
} else {
- GLStateManager.glBindVertexArray(vaos.extendedOrphan(layout)[flags]);
+ GLSMVertexInput.glBindVertexArray(vaos.extendedOrphan(layout)[flags]);
orphanBuffers[flags].upload(combined);
firstVertex = 0;
}
drawWithQuadConversion(glCtx, drawMode, firstVertex, vertexCount);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
private static void ensureExtendedVAOs(StreamingVaos vaos, int flags, VertexFormat format, int layout) {
final int[] extendedOrphanVAOs = vaos.extendedOrphan(layout);
final int[] extendedPersistentVAOs = vaos.extendedPersistent(layout);
if (extendedOrphanVAOs[flags] == 0) {
- extendedOrphanVAOs[flags] = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(extendedOrphanVAOs[flags]);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId());
+ extendedOrphanVAOs[flags] = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(extendedOrphanVAOs[flags]);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId());
setupExtendedBufferState(format, layout);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
}
if (persistentBuffer != null && extendedPersistentVAOs[flags] == 0) {
- extendedPersistentVAOs[flags] = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(extendedPersistentVAOs[flags]);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId());
+ extendedPersistentVAOs[flags] = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(extendedPersistentVAOs[flags]);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId());
setupExtendedBufferState(format, layout);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
}
}
@@ -606,19 +610,19 @@ public class TessellatorStreamingDrawer {
if (orphanBuffers[flags] == null) orphanBuffers[flags] = new OrphanStreamingBuffer();
if (orphanVAOs[flags] == 0) {
- orphanVAOs[flags] = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(orphanVAOs[flags]);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId());
+ orphanVAOs[flags] = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(orphanVAOs[flags]);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId());
format.setupBufferState(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
if (persistentBuffer != null && persistentVAOs[flags] == 0) {
- persistentVAOs[flags] = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(persistentVAOs[flags]);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId());
+ persistentVAOs[flags] = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(persistentVAOs[flags]);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId());
format.setupBufferState(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java
index 43aeb0c24..c8de05b65 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm.streaming;
import com.gtnewhorizons.angelica.config.SystemProperties;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL30;
import org.lwjgl.opengl.GL31;
@@ -34,10 +34,10 @@ public final class UniformRingBuffer {
this.stride = (blockSize + OFFSET_ALIGNMENT - 1) & -OFFSET_ALIGNMENT;
this.ring = GlStreamingRing.create(GL31.GL_UNIFORM_BUFFER, capacity, forceOrphan);
if (ring == null) {
- orphanBufferId = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId);
- GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW);
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0);
+ orphanBufferId = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId);
+ GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0);
}
}
@@ -55,20 +55,20 @@ public final class UniformRingBuffer {
}
private int writeOrphan(long srcAddress) {
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId);
int offset = writePos;
if (offset + stride > capacity) {
- GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW);
offset = 0;
orphanWraps++;
}
- final long dst = GLStateManager.glMapBufferRangeAddress(GL31.GL_UNIFORM_BUFFER, offset, blockSize, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT | GL30.GL_MAP_UNSYNCHRONIZED_BIT);
+ final long dst = GLSMBuffers.glMapBufferRangeAddress(GL31.GL_UNIFORM_BUFFER, offset, blockSize, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT | GL30.GL_MAP_UNSYNCHRONIZED_BIT);
if (dst == 0L) {
throw new IllegalStateException("mapBufferRange failed on uniform ring (offset=" + offset + ")");
}
memCopy(srcAddress, dst, blockSize);
- GLStateManager.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER);
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0);
+ GLSMBuffers.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0);
writePos = offset + stride;
return offset;
}
@@ -91,7 +91,7 @@ public final class UniformRingBuffer {
if (ring != null) {
ring.destroy();
} else if (orphanBufferId != 0) {
- GLStateManager.glDeleteBuffers(orphanBufferId);
+ GLSMBuffers.glDeleteBuffers(orphanBufferId);
orphanBufferId = 0;
}
}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java
index 05cb16954..ea5e3e359 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.texture;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import lombok.Getter;
import lombok.Setter;
@@ -126,14 +126,14 @@ public class TextureInfo {
}
private int queryParameteri(int pname) {
- if (GLStateManager.getBoundTextureForServerState() == id) {
+ if (GLSMTextures.getBoundTextureForServerState() == id) {
return RENDER_BACKEND.getTexParameteri(target, pname);
}
return RENDER_BACKEND.getTextureParameteri(id, target, pname);
}
private float queryParameterf(int pname) {
- if (GLStateManager.getBoundTextureForServerState() == id) {
+ if (GLSMTextures.getBoundTextureForServerState() == id) {
return RENDER_BACKEND.getTexParameterf(target, pname);
}
return RENDER_BACKEND.getTextureParameterf(id, target, pname);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java
index 6cf835311..5ce59d198 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java
@@ -1,5 +1,6 @@
package com.gtnewhorizons.angelica.glsm.texture;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -86,15 +87,15 @@ public class TextureInfoCache {
}
public void onTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, @Nullable Buffer pixels) {
- if (isTrackedTarget(target) && level == 0) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height);
+ if (isTrackedTarget(target) && level == 0) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height);
}
public void onTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) {
- if (isTrackedTarget(target) && level == 0) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height);
+ if (isTrackedTarget(target) && level == 0) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height);
}
public void onCopyTexImage2D(int target, int level, int internalformat, int width, int height) {
- if (isTrackedTarget(target) && level == 0) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height);
+ if (isTrackedTarget(target) && level == 0) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height);
}
public void onTextureImage2D(int texture, int target, int level, int internalformat, int width, int height) {
@@ -102,11 +103,11 @@ public class TextureInfoCache {
}
public void onTexStorage2D(int target, int internalformat, int width, int height) {
- if (isTrackedTarget(target)) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height);
+ if (isTrackedTarget(target)) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height);
}
public void onTexSubImage2D(int target, int level) {
- if (isTrackedTarget(target) && level == 0) onContentsChanged(GLStateManager.getBoundTextureForServerState());
+ if (isTrackedTarget(target) && level == 0) onContentsChanged(GLSMTextures.getBoundTextureForServerState());
}
public static boolean isGenericCompressedInternalFormat(int internalFormat) {
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java
index f6130ee01..e1f9712b1 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java
@@ -29,7 +29,7 @@ class ArrayUniformUploadGLTest {
for (int i = 0; i < 20; i++) buf.put(i + 1.0f); // 1..20, all distinct, all non-zero
buf.flip();
- GLStateManager.glUniform2(GL20.glGetUniformLocation(p, "cosmicuvs"), buf);
+ GLSMPrograms.glUniform2(GL20.glGetUniformLocation(p, "cosmicuvs"), buf);
final FloatBuffer read = BufferUtils.createFloatBuffer(2);
for (int i = 0; i < 10; i++) {
@@ -42,7 +42,7 @@ class ArrayUniformUploadGLTest {
}
} finally {
GL20.glUseProgram(0);
- GLStateManager.glDeleteProgram(p);
+ GLSMPrograms.glDeleteProgram(p);
}
}
@@ -59,7 +59,7 @@ class ArrayUniformUploadGLTest {
final IntBuffer buf = BufferUtils.createIntBuffer(4);
buf.put(11).put(22).put(33).put(44).flip();
- GLStateManager.glUniform1(GL20.glGetUniformLocation(p, "vals"), buf);
+ GLSMPrograms.glUniform1(GL20.glGetUniformLocation(p, "vals"), buf);
final IntBuffer read = BufferUtils.createIntBuffer(1);
final int[] expect = {11, 22, 33, 44};
@@ -72,7 +72,7 @@ class ArrayUniformUploadGLTest {
}
} finally {
GL20.glUseProgram(0);
- GLStateManager.glDeleteProgram(p);
+ GLSMPrograms.glDeleteProgram(p);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
index f328cd9ad..fb4031d7c 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
@@ -21,7 +21,7 @@ class CompatUniformManagerTest {
void cleanup() {
if (program != 0) {
GL20.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
program = 0;
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java
index 73e2ad043..100cd380a 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java
@@ -19,15 +19,15 @@ class DisplayListCompilationParityTest {
enum Caller {
GLSM {
- void newList(int list, int mode) { GLStateManager.glNewList(list, mode); }
- void endList() { GLStateManager.glEndList(); }
- void callList(int list) { GLStateManager.glCallList(list); }
- void enable(int cap) { GLStateManager.glEnable(cap); }
- void translate(float x, float y, float z) { GLStateManager.glTranslatef(x, y, z); }
- void pushMatrix() { GLStateManager.glPushMatrix(); }
- void popMatrix() { GLStateManager.glPopMatrix(); }
- void matrixMode(int mode) { GLStateManager.glMatrixMode(mode); }
- void getFloat(int pname, FloatBuffer dst) { GLStateManager.glGetFloat(pname, dst); }
+ void newList(int list, int mode) { GLSMDraws.glNewList(list, mode); }
+ void endList() { GLSMDraws.glEndList(); }
+ void callList(int list) { GLSMDraws.glCallList(list); }
+ void enable(int cap) { GLSMEnable.glEnable(cap); }
+ void translate(float x, float y, float z) { GLSMMatrices.glTranslatef(x, y, z); }
+ void pushMatrix() { GLSMMatrices.glPushMatrix(); }
+ void popMatrix() { GLSMMatrices.glPopMatrix(); }
+ void matrixMode(int mode) { GLSMMatrices.glMatrixMode(mode); }
+ void getFloat(int pname, FloatBuffer dst) { GLSMQueries.glGetFloat(pname, dst); }
void flushMatrix() { DisplayListManager.flushMatrix(); }
},
RAW {
@@ -68,35 +68,35 @@ class DisplayListCompilationParityTest {
@BeforeEach
void setup() {
if (DisplayListManager.isRecording()) {
- try { GLStateManager.glEndList(); } catch (Exception ignored) {}
+ try { GLSMDraws.glEndList(); } catch (Exception ignored) {}
}
- GLStateManager.disableBlend();
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
GL11.glDisable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
@AfterEach
void cleanup() {
if (DisplayListManager.isRecording()) {
- try { GLStateManager.glEndList(); } catch (Exception ignored) {}
+ try { GLSMDraws.glEndList(); } catch (Exception ignored) {}
}
if (testList > 0) {
- GLStateManager.glDeleteLists(testList, 1);
+ GLSMDraws.glDeleteLists(testList, 1);
testList = -1;
}
- GLStateManager.disableBlend();
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
GL11.glDisable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
@ParameterizedTest
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java
index ebdd08eab..e4c73acfe 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java
@@ -21,73 +21,73 @@ class DisplayListCompilationTest {
@BeforeEach
void setup() {
if (DisplayListManager.isRecording()) {
- try { GLStateManager.glEndList(); } catch (Exception ignored) {}
+ try { GLSMDraws.glEndList(); } catch (Exception ignored) {}
}
- GLStateManager.disableBlend();
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
@AfterEach
void cleanup() {
if (DisplayListManager.isRecording()) {
- try { GLStateManager.glEndList(); } catch (Exception ignored) {}
+ try { GLSMDraws.glEndList(); } catch (Exception ignored) {}
}
if (testList > 0) {
- GLStateManager.glDeleteLists(testList, 1);
+ GLSMDraws.glDeleteLists(testList, 1);
testList = -1;
}
- GLStateManager.disableBlend();
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
@Test
void glsm_compileAndExecute_matrixModeWithTransforms() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE);
- GLStateManager.glTranslatef(10, 0, 0);
- GLStateManager.glRotatef(45, 0, 1, 0);
+ GLSMMatrices.glTranslatef(10, 0, 0);
+ GLSMMatrices.glRotatef(45, 0, 1, 0);
DisplayListManager.flushMatrix();
assertNotEquals(0.0f, matrix(GL11.GL_MODELVIEW_MATRIX).get(12), "After transforms: applied immediately");
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
assertEquals(0.0f, matrix(GL11.GL_PROJECTION_MATRIX).get(12), 0.001f, "PROJECTION still identity");
- GLStateManager.glEndList();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMDraws.glEndList();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
@Test
void glsm_unsupportedOpInList_abortsCleanly() {
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
assertTrue(DisplayListManager.isRecording(), "recording after glNewList");
- assertThrows(UnsupportedOperationException.class, () -> GLStateManager.glReadBuffer(GL11.GL_FRONT));
+ assertThrows(UnsupportedOperationException.class, () -> GLSMFramebuffer.glReadBuffer(GL11.GL_FRONT));
assertFalse(DisplayListManager.isRecording(), "recording state must be reset after an in-list throw");
assertEquals(DisplayListManager.RecordMode.NONE, DisplayListManager.getRecordMode());
- assertDoesNotThrow(() -> GLStateManager.glReadBuffer(GL11.GL_FRONT));
- assertDoesNotThrow(GLStateManager::glEndList);
- GLStateManager.glReadBuffer(GL11.GL_BACK);
+ assertDoesNotThrow(() -> GLSMFramebuffer.glReadBuffer(GL11.GL_FRONT));
+ assertDoesNotThrow(GLSMDraws::glEndList);
+ GLSMFramebuffer.glReadBuffer(GL11.GL_BACK);
}
@Test
void glsm_abortIfLeaked_recoversOpenList() {
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
assertTrue(DisplayListManager.isRecording());
DisplayListManager.abortIfLeaked();
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java
index 5d5219529..81bb4c774 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java
@@ -19,14 +19,14 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
for (int target : new int[] { GL11.GL_MODELVIEW, GL11.GL_PROJECTION, GL11.GL_TEXTURE }) {
resetMatrices();
int list = newList();
- GLStateManager.glNewList(list, compileMode);
- GLStateManager.glMatrixMode(target);
- GLStateManager.glScalef(-2, 3, -4);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, compileMode);
+ GLSMMatrices.glMatrixMode(target);
+ GLSMMatrices.glScalef(-2, 3, -4);
+ GLSMDraws.glEndList();
resetMatrices();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
FloatBuffer matrix = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(switch (target) {
+ GLSMQueries.glGetFloat(switch (target) {
case GL11.GL_PROJECTION -> GL11.GL_PROJECTION_MATRIX;
case GL11.GL_TEXTURE -> GL11.GL_TEXTURE_MATRIX;
default -> GL11.GL_MODELVIEW_MATRIX;
@@ -42,15 +42,15 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
@AfterEach
void resetMatrices() {
for (int unit = 0; unit < 2; unit++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
private static float translation(int target) {
@@ -62,23 +62,23 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
for (int mask : new int[] { GL11.GL_TRANSFORM_BIT, GL11.GL_ALL_ATTRIB_BITS }) {
for (int compileMode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) {
int list = newList();
- GLStateManager.glNewList(list, compileMode);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPushAttrib(mask);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(3, 0, 0);
- GLStateManager.glPopAttrib();
- GLStateManager.glLoadIdentity();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, compileMode);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMAttribStack.glPushAttrib(mask);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(3, 0, 0);
+ GLSMAttribStack.glPopAttrib();
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glEndList();
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(9, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(5, 0, 0);
- GLStateManager.glCallList(list);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(9, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(5, 0, 0);
+ GLSMDraws.glCallList(list);
assertEquals(3f, translation(GL11.GL_MODELVIEW_MATRIX));
assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX));
}
@@ -88,46 +88,46 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
@Test
void nestedAttributesRestoreInheritedCallerMode() {
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopAttrib();
- GLStateManager.glLoadIdentity();
- GLStateManager.glPopAttrib();
- GLStateManager.glLoadIdentity();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMAttribStack.glPopAttrib();
+ GLSMMatrices.glLoadIdentity();
+ GLSMAttribStack.glPopAttrib();
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glEndList();
- GLStateManager.glTranslatef(5, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glTranslatef(7, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(9, 0, 0);
- GLStateManager.glCallList(list);
+ GLSMMatrices.glTranslatef(5, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glTranslatef(7, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(9, 0, 0);
+ GLSMDraws.glCallList(list);
assertEquals(5f, translation(GL11.GL_MODELVIEW_MATRIX));
assertEquals(0f, translation(GL11.GL_PROJECTION_MATRIX));
assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX));
- assertEquals(GL11.GL_TEXTURE, GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE));
+ assertEquals(GL11.GL_TEXTURE, GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE));
}
@Test
void implicitMatrixCommandsAndEmptyListsInheritCallerTarget() {
int empty = newList();
- GLStateManager.glNewList(empty, GL11.GL_COMPILE);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(empty, GL11.GL_COMPILE);
+ GLSMDraws.glEndList();
int load = newList();
- GLStateManager.glNewList(load, GL11.GL_COMPILE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glEndList();
- GLStateManager.glTranslatef(5, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(9, 0, 0);
- GLStateManager.glCallList(empty);
- assertEquals(GL11.GL_TEXTURE, GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE));
+ GLSMDraws.glNewList(load, GL11.GL_COMPILE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glEndList();
+ GLSMMatrices.glTranslatef(5, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(9, 0, 0);
+ GLSMDraws.glCallList(empty);
+ assertEquals(GL11.GL_TEXTURE, GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE));
assertEquals(9f, translation(GL11.GL_TEXTURE_MATRIX));
- GLStateManager.glCallList(load);
- assertEquals(GL11.GL_TEXTURE, GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE));
+ GLSMDraws.glCallList(load);
+ assertEquals(GL11.GL_TEXTURE, GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE));
assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX));
assertEquals(5f, translation(GL11.GL_MODELVIEW_MATRIX));
}
@@ -135,14 +135,14 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
@Test
void explicitInitialModelviewSurvivesReplayFromTexture() {
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glEndList();
- GLStateManager.glTranslatef(5, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(9, 0, 0);
- GLStateManager.glCallList(list);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glEndList();
+ GLSMMatrices.glTranslatef(5, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(9, 0, 0);
+ GLSMDraws.glCallList(list);
assertEquals(0f, translation(GL11.GL_MODELVIEW_MATRIX));
assertEquals(9f, translation(GL11.GL_TEXTURE_MATRIX));
}
@@ -153,16 +153,16 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
for (int compileMode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) {
resetMatrices();
int list = newList();
- GLStateManager.glNewList(list, compileMode);
- GLStateManager.glTranslatef(5, 0, 0);
- GLStateManager.glMatrixMode(explicitTarget);
- GLStateManager.glTranslatef(7, 0, 0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, compileMode);
+ GLSMMatrices.glTranslatef(5, 0, 0);
+ GLSMMatrices.glMatrixMode(explicitTarget);
+ GLSMMatrices.glTranslatef(7, 0, 0);
+ GLSMDraws.glEndList();
for (int callerTarget : new int[] { GL11.GL_MODELVIEW, GL11.GL_PROJECTION, GL11.GL_TEXTURE }) {
resetMatrices();
- GLStateManager.glMatrixMode(callerTarget);
- GLStateManager.glCallList(list);
+ GLSMMatrices.glMatrixMode(callerTarget);
+ GLSMDraws.glCallList(list);
String context = "compileMode=" + compileMode + ", callerTarget=" + callerTarget;
assertEquals((callerTarget == GL11.GL_MODELVIEW ? 5f : 0f) + (explicitTarget == GL11.GL_MODELVIEW ? 7f : 0f),
translation(GL11.GL_MODELVIEW_MATRIX), context);
@@ -180,27 +180,27 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
for (int compileMode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) {
resetMatrices();
int list = newList();
- GLStateManager.glNewList(list, compileMode);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glPushAttrib(mask);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(7, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glTranslatef(3, 0, 0);
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glPopAttrib();
- GLStateManager.glPopAttrib();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, compileMode);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMAttribStack.glPushAttrib(mask);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(7, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glTranslatef(3, 0, 0);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
+ GLSMDraws.glEndList();
resetMatrices();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
String context = "compileMode=" + compileMode;
- assertEquals(GL13.GL_TEXTURE0, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE), context);
+ assertEquals(GL13.GL_TEXTURE0, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE), context);
assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), context);
assertEquals(3f, translation(GL11.GL_MODELVIEW_MATRIX), context);
assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX), context);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(7f, translation(GL11.GL_TEXTURE_MATRIX), context);
}
}
@@ -208,38 +208,38 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture {
@Test
void pendingTextureTransformStaysOnOriginalUnit() {
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(7, 0, 0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glEndList();
- GLStateManager.glCallList(list);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(7, 0, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMDraws.glEndList();
+ GLSMDraws.glCallList(list);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
assertEquals(7f, translation(GL11.GL_TEXTURE_MATRIX));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX));
}
@Test
void explicitModeAfterNestedListIsNotDeduplicated() {
int child = newList();
- GLStateManager.glNewList(child, GL11.GL_COMPILE);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glTranslatef(5, 0, 0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(child, GL11.GL_COMPILE);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glTranslatef(5, 0, 0);
+ GLSMDraws.glEndList();
int parent = newList();
- GLStateManager.glNewList(parent, GL11.GL_COMPILE);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glCallList(child);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glEndList();
- GLStateManager.glCallList(parent);
+ GLSMDraws.glNewList(parent, GL11.GL_COMPILE);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glCallList(child);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glEndList();
+ GLSMDraws.glCallList(parent);
assertEquals(5f, translation(GL11.GL_MODELVIEW_MATRIX));
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java
index f1f5d7a92..bedbb2555 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java
@@ -62,9 +62,9 @@ public final class DisplayListTestHelper {
public static CompiledDisplayList createDisplayList(Runnable runnable) {
int list = GL11.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
runnable.run();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
CompiledDisplayList compiled = DisplayListManager.getDisplayList(list);
assertNotNull(compiled, "Display list should be compiled");
return compiled;
@@ -72,13 +72,13 @@ public final class DisplayListTestHelper {
/** Calls {@code list} on an identity modelview and returns the resulting matrix. The caller's matrix is restored. */
public static FloatBuffer modelviewAfterCall(int list) {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
try {
- GLStateManager.glLoadIdentity();
- GLStateManager.glCallList(list);
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glCallList(list);
return GlTestSupport.modelview();
} finally {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
}
@@ -96,12 +96,12 @@ public final class DisplayListTestHelper {
/** Immediate-mode quad from the origin to (size, size) at z = 0. */
public static void immediateQuad(float size) {
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glVertex3f(0.0f, 0.0f, 0.0f);
- GLStateManager.glVertex3f(size, 0.0f, 0.0f);
- GLStateManager.glVertex3f(size, size, 0.0f);
- GLStateManager.glVertex3f(0.0f, size, 0.0f);
- GLStateManager.glEnd();
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, 0.0f);
+ GLSMDraws.glVertex3f(size, 0.0f, 0.0f);
+ GLSMDraws.glVertex3f(size, size, 0.0f);
+ GLSMDraws.glVertex3f(0.0f, size, 0.0f);
+ GLSMDraws.glEnd();
}
/** Textured quad written straight into the vanilla Tessellator's raw buffer and handed to the draw interceptor. */
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
index fb2956ab0..5ebc5630f 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
@@ -120,28 +120,28 @@ class FeedbackManagerTest {
}
private static int feedbackDraw(int mode, float... verts) {
- GLStateManager.getModelViewMatrix().identity();
- GLStateManager.getProjectionMatrix().identity();
- GLStateManager.getViewportState().setViewPort(0, 0, 800, 600);
- GLStateManager.getViewportState().setDepthRange(0.0, 1.0);
+ GLSMMatrices.getModelViewMatrix().identity();
+ GLSMMatrices.getProjectionMatrix().identity();
+ GLSMRasterizer.getViewportState().setViewPort(0, 0, 800, 600);
+ GLSMRasterizer.getViewportState().setDepthRange(0.0, 1.0);
final int vao = GL30.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
final FloatBuffer vertBuf = BufferUtils.createFloatBuffer(verts.length);
vertBuf.put(verts).flip();
final int vbo = GL15.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuf, GL15.GL_STATIC_DRAW);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0);
- GLStateManager.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
try {
FeedbackManager.processDrawArrays(mode, 0, verts.length / 3);
return FeedbackManager.glRenderMode(GL11.GL_RENDER);
} finally {
- GLStateManager.glDisableVertexAttribArray(0);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glDisableVertexAttribArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
GL15.glDeleteBuffers(vbo);
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java
index 40b41a1c3..902b0ce1d 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java
@@ -27,13 +27,13 @@ class GLSM_BlendFuncUnknownState_GLTest {
@AfterEach
void restoreDefaultBlendFunc() {
if (!RenderSystem.supportsBufferBlending()) return;
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
}
private static void seedVanillaSeparate() {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE);
+ GLSMBlend.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
}
private static void overrideBufferZero() {
@@ -52,7 +52,7 @@ class GLSM_BlendFuncUnknownState_GLTest {
for (int buffer = 0; buffer < 2; buffer++) {
assertBufferBlend(buffer, VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
}
- assertFalse(GLStateManager.getBlendState().isFuncUnknown(), "forward must clear the unknown flag");
+ assertFalse(GLSMBlend.getBlendState().isFuncUnknown(), "forward must clear the unknown flag");
}
@Test
@@ -60,34 +60,34 @@ class GLSM_BlendFuncUnknownState_GLTest {
seedVanillaSeparate();
overrideBufferZero();
- GLStateManager.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
+ GLSMBlend.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
assertVanillaOnBothBuffers();
}
@Test
void glBlendFuncForwardsAfterIndexedOverride() {
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
overrideBufferZero();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
for (int buffer = 0; buffer < 2; buffer++) {
assertBufferBlend(buffer, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
}
- assertFalse(GLStateManager.getBlendState().isFuncUnknown(), "forward must clear the unknown flag");
+ assertFalse(GLSMBlend.getBlendState().isFuncUnknown(), "forward must clear the unknown flag");
}
@Test
void popAttribForwardsAfterIndexedOverride() {
seedVanillaSeparate();
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
try {
overrideBufferZero();
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
assertVanillaOnBothBuffers();
@@ -95,20 +95,20 @@ class GLSM_BlendFuncUnknownState_GLTest {
@Test
void displayListReplayForwardsAfterIndexedOverride() {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMBlend.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA);
+ GLSMDraws.glEndList();
seedVanillaSeparate();
overrideBufferZero();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertVanillaOnBothBuffers();
} finally {
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
index f9ba711cc..ad0f56e8b 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
@@ -33,20 +33,20 @@ class GLSM_BlendUnknownState_UnitTest {
@Test
void testSetUnknownStateForcesCacheBypass() {
// Enable blend via GLSM — both cache and GL should agree
- GLStateManager.enableBlend();
+ GLSMBlend.enableBlend();
assertTrue(GL11.glIsEnabled(GL11.GL_BLEND), "GL blend should be enabled");
- assertTrue(GLStateManager.getBlendMode().isEnabled(), "GLSM blend cache should be enabled");
+ assertTrue(GLSMBlend.getBlendMode().isEnabled(), "GLSM blend cache should be enabled");
// Simulate a per-buffer disable that bypasses the cache (as glDisablei does)
GL30.glDisablei(GL11.GL_BLEND, 0);
- GLStateManager.getBlendMode().setUnknownState();
+ GLSMBlend.getBlendMode().setUnknownState();
// Cache still says enabled, but GL state for buffer 0 is now disabled
- assertTrue(GLStateManager.getBlendMode().isEnabled(), "GLSM cache should still say enabled");
+ assertTrue(GLSMBlend.getBlendMode().isEnabled(), "GLSM cache should still say enabled");
// Re-enable blend via GLSM — without setUnknownState, this would be a no-op
// because the cache thinks blend is already enabled
- GLStateManager.enableBlend();
+ GLSMBlend.enableBlend();
// Per GL spec, glEnable(GL_BLEND) enables blend for ALL draw buffers,
// overriding any per-buffer disables
@@ -72,9 +72,9 @@ class GLSM_BlendUnknownState_UnitTest {
private static void setBlend(boolean enabled) {
if (enabled) {
- GLStateManager.enableBlend();
+ GLSMBlend.enableBlend();
} else {
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java
index 0e5e2d40b..d1c258ce6 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java
@@ -42,17 +42,17 @@ public class GLSM_ClientArrays_GLTest {
@BeforeEach
void bindFreshVertexArray() {
- savedVao = GLStateManager.getBoundVAO();
- vao = GLStateManager.glGenVertexArrays();
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindVertexArray(vao);
+ savedVao = GLSMVertexInput.getBoundVAO();
+ vao = GLSMVertexInput.glGenVertexArrays();
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMVertexInput.glBindVertexArray(vao);
}
@AfterEach
void deleteVertexArray() {
- GLStateManager.glBindVertexArray(savedVao);
- GLStateManager.glDeleteVertexArrays(vao);
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMVertexInput.glBindVertexArray(savedVao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
+ GLSMBuffers.glDeleteBuffers(vbo);
}
private static boolean attribHasSize3(Usage usage) {
@@ -76,10 +76,10 @@ public class GLSM_ClientArrays_GLTest {
}
private static void assertClientArray(String name, int sizePname, int size, int typePname, int type, int stridePname, int stride, int bindingPname, int binding) {
- if (sizePname != 0) assertEquals(size, GLStateManager.glGetInteger(sizePname), name + " size");
- if (typePname != 0) assertEquals(type, GLStateManager.glGetInteger(typePname), name + " type");
- assertEquals(stride, GLStateManager.glGetInteger(stridePname), name + " stride");
- assertEquals(binding, GLStateManager.glGetInteger(bindingPname), name + " buffer binding");
+ if (sizePname != 0) assertEquals(size, GLSMQueries.glGetInteger(sizePname), name + " size");
+ if (typePname != 0) assertEquals(type, GLSMQueries.glGetInteger(typePname), name + " type");
+ assertEquals(stride, GLSMQueries.glGetInteger(stridePname), name + " stride");
+ assertEquals(binding, GLSMQueries.glGetInteger(bindingPname), name + " buffer binding");
}
private static void assertVertexArray(String name, int size, int type, int stride, int binding) {
@@ -95,79 +95,79 @@ public class GLSM_ClientArrays_GLTest {
void vertexArrayStateRestoredOnlyWithVertexArrayBit() {
final int position = Usage.POSITION.getAttributeLocation();
try {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
final int flagsBefore = GLStateManager.ctx().vaos.getVertexFlags();
assertFalse(positionArrayEnabled());
assertFalse(colorArrayEnabled());
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
assertTrue(positionArrayEnabled());
assertTrue(colorArrayEnabled());
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPopClientAttrib();
assertFalse(positionArrayEnabled(), "pop disables an array enabled inside the push");
assertEquals(GL11.GL_FALSE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
assertFalse(colorArrayEnabled());
assertEquals(flagsBefore, GLStateManager.ctx().vaos.getVertexFlags());
- assertEquals(0, GLStateManager.getClientActiveTextureUnit());
+ assertEquals(0, GLSMTextures.getClientActiveTextureUnit());
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glPopClientAttrib();
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMAttribStack.glPopClientAttrib();
assertTrue(positionArrayEnabled(), "pop re-enables an array disabled inside the push");
assertEquals(GL11.GL_TRUE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMAttribStack.glPopClientAttrib();
assertTrue(positionArrayEnabled(), "a pixel-store push must not restore array enables");
assertTrue(colorArrayEnabled());
- assertEquals(1, GLStateManager.getClientActiveTextureUnit());
+ assertEquals(1, GLSMTextures.getClientActiveTextureUnit());
} finally {
drainClientAttribStack();
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY);
}
}
@Test
void clientActiveTextureRoundTrips() {
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLStateManager.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS));
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLSMQueries.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
- GLStateManager.glClientActiveTexture(0);
- assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS);
- assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS);
- assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE), "units past GL_MAX_TEXTURE_COORDS are rejected");
- assertEquals(1, GLStateManager.getClientActiveTextureUnit());
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ GLSMTextures.glClientActiveTexture(0);
+ assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS);
+ assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS);
+ assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE), "units past GL_MAX_TEXTURE_COORDS are rejected");
+ assertEquals(1, GLSMTextures.getClientActiveTextureUnit());
- GLStateManager.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0L);
+ GLSMVertexInput.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0L);
final VAOManager.Attrib attrib = GLStateManager.ctx().vaos.attrib(Usage.SECONDARY_UV.getAttributeLocation());
assertNotNull(attrib);
assertEquals(2, attrib.size);
assumeTrue(GLStateManager.MAX_TEXTURE_COORDS > 5);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE5);
- assertEquals(GL13.GL_TEXTURE5, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
- GLStateManager.glTexCoordPointer(3, GL11.GL_FLOAT, 0, 0L);
- assertEquals(3, GLStateManager.glGetInteger(GL11.GL_TEXTURE_COORD_ARRAY_SIZE));
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE5);
+ assertEquals(GL13.GL_TEXTURE5, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ GLSMVertexInput.glTexCoordPointer(3, GL11.GL_FLOAT, 0, 0L);
+ assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_COORD_ARRAY_SIZE));
assertFalse(attribHasSize3(Usage.PRIMARY_UV));
assertFalse(attribHasSize3(Usage.SECONDARY_UV));
} finally {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@@ -175,22 +175,22 @@ public class GLSM_ClientArrays_GLTest {
void conventionalPointerSurvivesGenericOverride() {
final int position = Usage.POSITION.getAttributeLocation();
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 4L);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 4L);
assertEquals(3, VAOManager.get(position).size, "disabled generic pointer must not displace an enabled conventional array");
assertEquals(3, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE));
- GLStateManager.glEnableVertexAttribArray(position);
+ GLSMVertexInput.glEnableVertexAttribArray(position);
assertEquals(2, VAOManager.get(position).size, "enabled generic attribute wins");
assertTrue(VAOManager.get(position).genericPointer);
assertEquals(2, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE));
assertEquals(8, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_STRIDE));
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDisableVertexAttribArray(position);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
assertEquals(3, VAOManager.get(position).size, "conventional pointer must come back when the generic attribute is disabled");
assertEquals(12, VAOManager.get(position).stride);
assertFalse(VAOManager.get(position).genericPointer);
@@ -198,12 +198,12 @@ public class GLSM_ClientArrays_GLTest {
assertEquals(12, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_STRIDE));
assertEquals(vbo, driverAttrib(position, GL15.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING));
assertEquals(GL11.GL_TRUE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED), "conventional array stays enabled at draw level");
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_VERTEX_ARRAY));
- assertEquals(0, GLStateManager.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), "repoint must restore the array buffer binding");
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_VERTEX_ARRAY));
+ assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), "repoint must restore the array buffer binding");
} finally {
- GLStateManager.glDisableVertexAttribArray(position);
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@@ -211,55 +211,55 @@ public class GLSM_ClientArrays_GLTest {
void conventionalPointerSetUnderEnabledGenericAppliesOnceGenericIsDisabled() {
final int position = Usage.POSITION.getAttributeLocation();
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L);
- GLStateManager.glEnableVertexAttribArray(position);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(position);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
assertEquals(2, VAOManager.get(position).size);
assertEquals(2, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE));
- GLStateManager.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
assertEquals(3, VAOManager.get(position).size);
assertEquals(3, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE));
assertEquals(GL11.GL_TRUE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
assertEquals(GL11.GL_FALSE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
assertFalse(positionArrayEnabled());
} finally {
- GLStateManager.glDisableVertexAttribArray(position);
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@Test
void drawVertexFlagsDoNotAnswerClientArrayEnables() {
try {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
VAOManager.setCurrentVertexFlags(VertexFlags.COLOR_BIT | VertexFlags.NORMAL_BIT | VertexFlags.TEXTURE_BIT);
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY));
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_NORMAL_ARRAY));
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_NORMAL_ARRAY));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY));
- GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY);
VAOManager.setCurrentVertexFlags(0);
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY));
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY));
} finally {
- GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY);
VAOManager.setCurrentVertexFlags(0);
}
}
@Test
void clientArrayPointerQueriesAreAnsweredFromCache() {
- final int vaoB = GLStateManager.glGenVertexArrays();
+ final int vaoB = GLSMVertexInput.glGenVertexArrays();
final IntBuffer ints = BufferUtils.createIntBuffer(16);
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
assertVertexArray("default vertex", 4, GL11.GL_FLOAT, 0, 0);
assertClientArray("default normal", 0, 0, GL11.GL_NORMAL_ARRAY_TYPE, GL11.GL_FLOAT, GL11.GL_NORMAL_ARRAY_STRIDE, 0, GL15.GL_NORMAL_ARRAY_BUFFER_BINDING, 0);
@@ -271,15 +271,15 @@ public class GLSM_ClientArrays_GLTest {
assertClientArray("default index", 0, 0, GL11.GL_INDEX_ARRAY_TYPE, GL11.GL_FLOAT, GL11.GL_INDEX_ARRAY_STRIDE, 0, GL15.GL_INDEX_ARRAY_BUFFER_BINDING, 0);
assertClientArray("default edge flag", 0, 0, 0, 0, GL11.GL_EDGE_FLAG_ARRAY_STRIDE, 0, GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING, 0);
assertTexCoordArray("default texcoord", 4, GL11.GL_FLOAT, 0, 0);
- assertNull(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4));
+ assertNull(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4));
- GLStateManager.glVertexPointer(3, GL11.GL_SHORT, 20, 8L);
- GLStateManager.glNormalPointer(GL11.GL_BYTE, 16, 4L);
- GLStateManager.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L);
- GLStateManager.glSecondaryColorPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L);
- GLStateManager.glEdgeFlagPointer(7, 0L);
- GLStateManager.glTexCoordPointer(2, GL11.GL_FLOAT, 8, 0L);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_SHORT, 20, 8L);
+ GLSMVertexInput.glNormalPointer(GL11.GL_BYTE, 16, 4L);
+ GLSMVertexInput.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L);
+ GLSMVertexInput.glSecondaryColorPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L);
+ GLSMVertexInput.glEdgeFlagPointer(7, 0L);
+ GLSMVertexInput.glTexCoordPointer(2, GL11.GL_FLOAT, 8, 0L);
assertVertexArray("vertex", 3, GL11.GL_SHORT, 20, vbo);
assertClientArray("normal", 0, 0, GL11.GL_NORMAL_ARRAY_TYPE, GL11.GL_BYTE, GL11.GL_NORMAL_ARRAY_STRIDE, 16, GL15.GL_NORMAL_ARRAY_BUFFER_BINDING, vbo);
@@ -292,98 +292,98 @@ public class GLSM_ClientArrays_GLTest {
assertClientArray("edge flag", 0, 0, 0, 0, GL11.GL_EDGE_FLAG_ARRAY_STRIDE, 7, GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING, vbo);
assertTexCoordArray("texcoord unit 0", 2, GL11.GL_FLOAT, 8, vbo);
- assertEquals(3.0f, GLStateManager.glGetFloat(GL11.GL_VERTEX_ARRAY_SIZE));
- GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE, ints);
+ assertEquals(3.0f, GLSMQueries.glGetFloat(GL11.GL_VERTEX_ARRAY_SIZE));
+ GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE, ints);
assertEquals(20, ints.get(0));
- assertEquals(8L, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)));
- assertEquals(12L, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4)));
+ assertEquals(8L, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)));
+ assertEquals(12L, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4)));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS - 1);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS - 1);
assertTexCoordArray("unset texcoord unit", 4, GL11.GL_FLOAT, 0, 0);
- GLStateManager.glTexCoordPointer(3, GL11.GL_SHORT, 6, 0L);
+ GLSMVertexInput.glTexCoordPointer(3, GL11.GL_SHORT, 6, 0L);
assertTexCoordArray("last texcoord unit", 3, GL11.GL_SHORT, 6, vbo);
assertFalse(attribHasSize3(Usage.PRIMARY_UV));
assertFalse(attribHasSize3(Usage.SECONDARY_UV));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
assertTexCoordArray("texcoord unit 0 again", 2, GL11.GL_FLOAT, 8, vbo);
- GLStateManager.glBindVertexArray(vaoB);
+ GLSMVertexInput.glBindVertexArray(vaoB);
assertVertexArray("other vao", 4, GL11.GL_FLOAT, 0, 0);
final FloatBuffer client = BufferUtils.createFloatBuffer(12);
- GLStateManager.glVertexPointer(2, 0, client);
+ GLSMVertexInput.glVertexPointer(2, 0, client);
assertVertexArray("client pointer", 2, GL11.GL_FLOAT, 0, 0);
- assertEquals(MemoryUtilities.memAddress(client), MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)));
- GLStateManager.glBindVertexArray(vao);
+ assertEquals(MemoryUtilities.memAddress(client), MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)));
+ GLSMVertexInput.glBindVertexArray(vao);
assertVertexArray("first vao again", 3, GL11.GL_SHORT, 20, vbo);
} finally {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteVertexArrays(vaoB);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDeleteVertexArrays(vaoB);
}
}
@Test
void interleavedArraysSetClientStateWithoutAnActiveFfpProgram() {
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
assumeFalse(GLStateManager.ctx().ffp.isActive());
- GLStateManager.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, 0L);
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_VERTEX_ARRAY));
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY));
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_NORMAL_ARRAY));
+ GLSMVertexInput.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, 0L);
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_VERTEX_ARRAY));
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_NORMAL_ARRAY));
assertVertexArray("interleaved vertex", 3, GL11.GL_FLOAT, 16, vbo);
- assertEquals(GL11.GL_UNSIGNED_BYTE, GLStateManager.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE));
+ assertEquals(GL11.GL_UNSIGNED_BYTE, GLSMQueries.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE));
} finally {
for (final int cap : CLIENT_ARRAY_CAPS) {
- GLStateManager.glDisableClientState(cap);
+ GLSMVertexInput.glDisableClientState(cap);
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@Test
void clientVertexArrayBitRestoresPointersEnablesAndBindings() {
- final int vaoB = GLStateManager.glGenVertexArrays();
- final int vbo2 = GLStateManager.glGenBuffers();
- final int ebo = GLStateManager.glGenBuffers();
+ final int vaoB = GLSMVertexInput.glGenVertexArrays();
+ final int vbo2 = GLSMBuffers.glGenBuffers();
+ final int ebo = GLSMBuffers.glGenBuffers();
final int position = Usage.POSITION.getAttributeLocation();
final int color = Usage.COLOR.getAttributeLocation();
final int normal = Usage.NORMAL.getAttributeLocation();
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L);
- GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L);
+ GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2);
- GLStateManager.glVertexPointer(2, GL11.GL_SHORT, 4, 4L);
- GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 8, 0L);
- GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY);
- GLStateManager.glEnableClientState(GL11.GL_NORMAL_ARRAY);
- GLStateManager.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L);
- GLStateManager.glEnableVertexAttribArray(5);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2);
+ GLSMVertexInput.glVertexPointer(2, GL11.GL_SHORT, 4, 4L);
+ GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 8, 0L);
+ GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_NORMAL_ARRAY);
+ GLSMVertexInput.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(5);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMAttribStack.glPopClientAttrib();
- assertEquals(vao, GLStateManager.getBoundVAO());
- assertEquals(vbo, GLStateManager.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING));
- assertEquals(ebo, GLStateManager.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING));
+ assertEquals(vao, GLSMVertexInput.getBoundVAO());
+ assertEquals(vbo, GLSMQueries.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING));
+ assertEquals(ebo, GLSMQueries.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING));
assertEquals(ebo, GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING));
- assertEquals(GL13.GL_TEXTURE0, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ assertEquals(GL13.GL_TEXTURE0, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
assertVertexArray("restored vertex", 3, GL11.GL_FLOAT, 12, vbo);
- assertEquals(4, GLStateManager.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE));
- assertEquals(vbo, GLStateManager.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING));
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY));
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_NORMAL_ARRAY));
+ assertEquals(4, GLSMQueries.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE));
+ assertEquals(vbo, GLSMQueries.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING));
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_NORMAL_ARRAY));
assertTrue(colorArrayEnabled());
assertEquals(3, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE));
@@ -395,24 +395,24 @@ public class GLSM_ClientArrays_GLTest {
assertEquals(GL11.GL_FALSE, driverAttrib(normal, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
assertEquals(GL11.GL_FALSE, driverAttrib(5, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glDeleteVertexArrays(vaoB);
- GLStateManager.glPopClientAttrib();
- assertEquals(vao, GLStateManager.getBoundVAO(), "a deleted VAO must not be restored");
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vaoB);
+ GLSMAttribStack.glPopClientAttrib();
+ assertEquals(vao, GLSMVertexInput.getBoundVAO(), "a deleted VAO must not be restored");
assertVertexArray("after dead-vao pop", 3, GL11.GL_FLOAT, 12, vbo);
} finally {
drainClientAttribStack();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
for (final int cap : CLIENT_ARRAY_CAPS) {
- GLStateManager.glDisableClientState(cap);
+ GLSMVertexInput.glDisableClientState(cap);
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteVertexArrays(vaoB);
- GLStateManager.glDeleteBuffers(vbo2);
- GLStateManager.glDeleteBuffers(ebo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDeleteVertexArrays(vaoB);
+ GLSMBuffers.glDeleteBuffers(vbo2);
+ GLSMBuffers.glDeleteBuffers(ebo);
}
}
@@ -420,150 +420,150 @@ public class GLSM_ClientArrays_GLTest {
void enabledGenericAttributeWinsWithoutAPointer() {
final int position = Usage.POSITION.getAttributeLocation();
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
assertFalse(VAOManager.get(position).genericPointer);
- GLStateManager.glEnableVertexAttribArray(position);
+ GLSMVertexInput.glEnableVertexAttribArray(position);
assertTrue(VAOManager.get(position).genericPointer, "generic 0 supersedes position on its enable bit alone");
- GLStateManager.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
assertFalse(VAOManager.get(position).genericPointer);
assertEquals(3, VAOManager.get(position).size);
} finally {
- GLStateManager.glDisableVertexAttribArray(position);
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@Test
void deletedBufferIsDetachedFromTheBoundVertexArray() {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 4L);
- GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L);
- assertEquals(vbo, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 4L);
+ GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L);
+ assertEquals(vbo, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
- GLStateManager.glDeleteBuffers(vbo);
- assertEquals(0, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
- assertEquals(0, GLStateManager.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING));
- assertEquals(12, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE), "offset and stride survive the detach");
- assertEquals(3, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE));
+ GLSMBuffers.glDeleteBuffers(vbo);
+ assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
+ assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING));
+ assertEquals(12, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE), "offset and stride survive the detach");
+ assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE));
}
@Test
void shadowedPointerIsNotRepointedAtAReusedBufferName() {
- final int other = GLStateManager.glGenVertexArrays();
- final int conventional = GLStateManager.glGenBuffers();
- final int generic = GLStateManager.glGenBuffers();
+ final int other = GLSMVertexInput.glGenVertexArrays();
+ final int conventional = GLSMBuffers.glGenBuffers();
+ final int generic = GLSMBuffers.glGenBuffers();
final int position = Usage.POSITION.getAttributeLocation();
int reused = 0;
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, conventional);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, generic);
- GLStateManager.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L);
- GLStateManager.glEnableVertexAttribArray(position);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, conventional);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, generic);
+ GLSMVertexInput.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(position);
- GLStateManager.glBindVertexArray(other);
- GLStateManager.glDeleteBuffers(conventional);
- reused = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, reused);
+ GLSMVertexInput.glBindVertexArray(other);
+ GLSMBuffers.glDeleteBuffers(conventional);
+ reused = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, reused);
assumeTrue(reused == conventional, "driver did not reuse the buffer name");
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
assertEquals(generic, driverAttrib(position, GL15.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING), "a pointer set before the delete must not attach to the new buffer");
} finally {
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glDisableVertexAttribArray(position);
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteVertexArrays(other);
- GLStateManager.glDeleteBuffers(generic);
- if (reused != 0) GLStateManager.glDeleteBuffers(reused);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMVertexInput.glDisableVertexAttribArray(position);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDeleteVertexArrays(other);
+ GLSMBuffers.glDeleteBuffers(generic);
+ if (reused != 0) GLSMBuffers.glDeleteBuffers(reused);
}
}
@Test
void popKeepsCurrentArraysWhenTheSavedArrayBufferWasDeleted() {
- final int vbo2 = GLStateManager.glGenBuffers();
+ final int vbo2 = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2);
- GLStateManager.glVertexPointer(2, GL11.GL_SHORT, 4, 0L);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDeleteBuffers(vbo);
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2);
+ GLSMVertexInput.glVertexPointer(2, GL11.GL_SHORT, 4, 0L);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMBuffers.glDeleteBuffers(vbo);
+ GLSMAttribStack.glPopClientAttrib();
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "array state is not restored once its array buffer is gone");
- assertEquals(vbo2, GLStateManager.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING));
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "array state is not restored once its array buffer is gone");
+ assertEquals(vbo2, GLSMQueries.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING));
assertEquals(vbo2, GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING));
- assertEquals(GL13.GL_TEXTURE0, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ assertEquals(GL13.GL_TEXTURE0, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
} finally {
drainClientAttribStack();
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteBuffers(vbo2);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(vbo2);
}
}
@Test
void clientAttribStackIsNotCompiledIntoDisplayLists() {
- final int other = GLStateManager.glGenVertexArrays();
- final int list = GLStateManager.glGenLists(1);
+ final int other = GLSMVertexInput.glGenVertexArrays();
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glPopClientAttrib();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMAttribStack.glPopClientAttrib();
+ GLSMDraws.glEndList();
- GLStateManager.glBindVertexArray(other);
- GLStateManager.glCallList(list);
- assertEquals(other, GLStateManager.getBoundVAO(), "replaying the list must not rebind the vertex array that was bound while compiling");
+ GLSMVertexInput.glBindVertexArray(other);
+ GLSMDraws.glCallList(list);
+ assertEquals(other, GLSMVertexInput.getBoundVAO(), "replaying the list must not rebind the vertex array that was bound while compiling");
assertEquals(other, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING), "driver vertex array unchanged by replay");
} finally {
drainClientAttribStack();
- GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glDeleteVertexArrays(other);
+ GLSMDraws.glDeleteLists(list, 1);
+ GLSMVertexInput.glDeleteVertexArrays(other);
}
}
@Test
void popRestoresDivisorAndStateWithoutAnAttributeLocation() {
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMAttribStack.glPopClientAttrib();
assertEquals(0, driverAttrib(5, GL33.GL_VERTEX_ATTRIB_ARRAY_DIVISOR));
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glVertexAttribDivisor(5, 3);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glVertexAttribDivisor(5, 3);
assertEquals(3, driverAttrib(5, GL33.GL_VERTEX_ATTRIB_ARRAY_DIVISOR));
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPopClientAttrib();
assertEquals(0, driverAttrib(5, GL33.GL_VERTEX_ATTRIB_ARRAY_DIVISOR));
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
- GLStateManager.glPopClientAttrib();
- assertFalse(GLStateManager.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY));
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
+ GLSMAttribStack.glPopClientAttrib();
+ assertFalse(GLSMEnable.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY));
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glEnableVertexAttribArray(5);
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glEnableVertexAttribArray(5);
+ GLSMAttribStack.glPopClientAttrib();
assertEquals(GL11.GL_FALSE, driverAttrib(5, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED));
} finally {
drainClientAttribStack();
- GLStateManager.glDisableVertexAttribArray(5);
- GLStateManager.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glDisableVertexAttribArray(5);
+ GLSMVertexInput.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@@ -572,21 +572,21 @@ public class GLSM_ClientArrays_GLTest {
final FloatBuffer data = BufferUtils.createFloatBuffer(64);
final int position = Usage.POSITION.getAttributeLocation();
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
data.position(2);
- GLStateManager.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, data);
+ GLSMVertexInput.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, data);
final long base = MemoryUtilities.memAddress(data);
assertNotNull(VAOManager.get(position).clientPointer);
assertEquals(base + 4, MemoryUtilities.memAddress(VAOManager.get(position).clientPointer));
- assertEquals(base + 4, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)));
- assertEquals(base, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4)));
- assertEquals(0, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
- assertEquals(16, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE));
+ assertEquals(base + 4, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)));
+ assertEquals(base, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4)));
+ assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
+ assertEquals(16, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE));
assertTrue(GLStateManager.ctx().vaos.hasAnyClientSideEnabledAttrib());
} finally {
for (final int cap : CLIENT_ARRAY_CAPS) {
- GLStateManager.glDisableClientState(cap);
+ GLSMVertexInput.glDisableClientState(cap);
}
}
}
@@ -594,82 +594,82 @@ public class GLSM_ClientArrays_GLTest {
@Test
void enableAndDisableRouteClientArrayCapsToClientState() {
for (final int cap : CLIENT_ARRAY_CAPS) {
- GLStateManager.glEnable(cap);
- assertTrue(GLStateManager.glIsEnabled(cap), hex(cap));
- GLStateManager.glDisable(cap);
- assertFalse(GLStateManager.glIsEnabled(cap), hex(cap));
+ GLSMEnable.glEnable(cap);
+ assertTrue(GLSMEnable.glIsEnabled(cap), hex(cap));
+ GLSMEnable.glDisable(cap);
+ assertFalse(GLSMEnable.glIsEnabled(cap), hex(cap));
}
- GLStateManager.glEnable(GL11.GL_VERTEX_ARRAY);
+ GLSMEnable.glEnable(GL11.GL_VERTEX_ARRAY);
assertTrue(positionArrayEnabled());
- GLStateManager.glDisable(GL11.GL_VERTEX_ARRAY);
+ GLSMEnable.glDisable(GL11.GL_VERTEX_ARRAY);
}
@Test
void illegalPointerArgumentsAreIgnored() {
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glNormalPointer(GL11.GL_FLOAT, 12, 0L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L);
+ GLSMVertexInput.glNormalPointer(GL11.GL_FLOAT, 12, 0L);
- GLStateManager.glVertexPointer(1, GL11.GL_FLOAT, 4, 0L);
- GLStateManager.glVertexPointer(3, GL11.GL_UNSIGNED_BYTE, 3, 0L);
- GLStateManager.glNormalPointer(GL11.GL_UNSIGNED_BYTE, 3, 0L);
+ GLSMVertexInput.glVertexPointer(1, GL11.GL_FLOAT, 4, 0L);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_UNSIGNED_BYTE, 3, 0L);
+ GLSMVertexInput.glNormalPointer(GL11.GL_UNSIGNED_BYTE, 3, 0L);
assertVertexArray("vertex after illegal calls", 3, GL11.GL_FLOAT, 12, vbo);
- assertEquals(GL11.GL_FLOAT, GLStateManager.glGetInteger(GL11.GL_NORMAL_ARRAY_TYPE));
+ assertEquals(GL11.GL_FLOAT, GLSMQueries.glGetInteger(GL11.GL_NORMAL_ARRAY_TYPE));
- GLStateManager.glColorPointer(GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, 4, 0L);
- assertEquals(GL12.GL_BGRA, GLStateManager.glGetInteger(GL11.GL_COLOR_ARRAY_SIZE));
- GLStateManager.glColorPointer(GL12.GL_BGRA, GL11.GL_FLOAT, 16, 0L);
- assertEquals(GL11.GL_UNSIGNED_BYTE, GLStateManager.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE));
+ GLSMVertexInput.glColorPointer(GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, 4, 0L);
+ assertEquals(GL12.GL_BGRA, GLSMQueries.glGetInteger(GL11.GL_COLOR_ARRAY_SIZE));
+ GLSMVertexInput.glColorPointer(GL12.GL_BGRA, GL11.GL_FLOAT, 16, 0L);
+ assertEquals(GL11.GL_UNSIGNED_BYTE, GLSMQueries.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE));
- GLStateManager.glVertexAttribPointer(VAOManager.MAX_ATTRIBS, 3, GL11.GL_FLOAT, false, 0, 0L);
- GLStateManager.glEnableVertexAttribArray(VAOManager.MAX_ATTRIBS);
- GLStateManager.glDisableVertexAttribArray(VAOManager.MAX_ATTRIBS);
- GLStateManager.glVertexAttribPointer(5, 5, GL11.GL_FLOAT, false, 0, 0L);
+ GLSMVertexInput.glVertexAttribPointer(VAOManager.MAX_ATTRIBS, 3, GL11.GL_FLOAT, false, 0, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(VAOManager.MAX_ATTRIBS);
+ GLSMVertexInput.glDisableVertexAttribArray(VAOManager.MAX_ATTRIBS);
+ GLSMVertexInput.glVertexAttribPointer(5, 5, GL11.GL_FLOAT, false, 0, 0L);
assertNull(VAOManager.get(5));
} finally {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
}
@Test
void clientArrayEnablesAreAnsweredFromCache() {
- final int vaoB = GLStateManager.glGenVertexArrays();
+ final int vaoB = GLSMVertexInput.glGenVertexArrays();
try {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
for (final int cap : CLIENT_ARRAY_CAPS) {
- assertFalse(GLStateManager.glIsEnabled(cap), "default isEnabled " + hex(cap));
+ assertFalse(GLSMEnable.glIsEnabled(cap), "default isEnabled " + hex(cap));
assertEnableRoundTrip(cap, true);
}
- GLStateManager.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY), "texcoord array enable is per client texture unit");
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY));
- GLStateManager.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY), "texcoord array enable is per client texture unit");
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY));
+ GLSMVertexInput.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
- GLStateManager.glEnableClientState(GL11.GL_INDEX_ARRAY);
- GLStateManager.glBindVertexArray(vaoB);
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_INDEX_ARRAY), "array enables are per vertex array object");
- GLStateManager.glBindVertexArray(vao);
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_INDEX_ARRAY));
- GLStateManager.glDisableClientState(GL11.GL_INDEX_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_INDEX_ARRAY);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_INDEX_ARRAY), "array enables are per vertex array object");
+ GLSMVertexInput.glBindVertexArray(vao);
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_INDEX_ARRAY));
+ GLSMVertexInput.glDisableClientState(GL11.GL_INDEX_ARRAY);
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glEnableVertexAttribArray(0);
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_VERTEX_ARRAY), "an enabled generic attribute 0 is not GL_VERTEX_ARRAY");
- GLStateManager.glDisableVertexAttribArray(0);
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_VERTEX_ARRAY), "an enabled generic attribute 0 is not GL_VERTEX_ARRAY");
+ GLSMVertexInput.glDisableVertexAttribArray(0);
+ GLSMVertexInput.glBindVertexArray(vao);
} finally {
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glDisableVertexAttribArray(0);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMVertexInput.glDisableVertexAttribArray(0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
for (final int cap : CLIENT_ARRAY_CAPS) {
- GLStateManager.glDisableClientState(cap);
+ GLSMVertexInput.glDisableClientState(cap);
}
- GLStateManager.glDeleteVertexArrays(vaoB);
+ GLSMVertexInput.glDeleteVertexArrays(vaoB);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java
index 28fb18981..18cada7d9 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java
@@ -52,7 +52,7 @@ public class GLSM_CoreRemovedCaps_GLTest {
private static void assertSecondaryColor(float red, float green, float blue) {
final FloatBuffer params = BufferUtils.createFloatBuffer(4);
- GLStateManager.glGetFloat(GL14.GL_CURRENT_SECONDARY_COLOR, params);
+ GLSMQueries.glGetFloat(GL14.GL_CURRENT_SECONDARY_COLOR, params);
assertEquals(red, params.get(0), "red must round-trip through the cache");
assertEquals(green, params.get(1), "green must round-trip through the cache");
assertEquals(blue, params.get(2), "blue must round-trip through the cache");
@@ -67,15 +67,15 @@ public class GLSM_CoreRemovedCaps_GLTest {
@MethodSource("removedCaps")
void enableDisableIsCacheOnly(String name, int cap) {
try {
- GLStateManager.glEnable(cap);
+ GLSMEnable.glEnable(cap);
assertNoGlError("glEnable(" + name + ")");
- assertTrue(GLStateManager.glIsEnabled(cap), name + " must still round-trip through the cache");
+ assertTrue(GLSMEnable.glIsEnabled(cap), name + " must still round-trip through the cache");
- GLStateManager.glDisable(cap);
+ GLSMEnable.glDisable(cap);
assertNoGlError("glDisable(" + name + ")");
- assertFalse(GLStateManager.glIsEnabled(cap));
+ assertFalse(GLSMEnable.glIsEnabled(cap));
} finally {
- GLStateManager.glDisable(cap);
+ GLSMEnable.glDisable(cap);
}
}
@@ -83,80 +83,80 @@ public class GLSM_CoreRemovedCaps_GLTest {
@MethodSource("removedCaps")
void pushPopAttribIsCacheOnly(String name, int cap) {
try {
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glEnable(cap);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMEnable.glEnable(cap);
+ GLSMAttribStack.glPopAttrib();
assertNoGlError("glPushAttrib/glEnable(" + name + ")/glPopAttrib");
- assertFalse(GLStateManager.glIsEnabled(cap));
+ assertFalse(GLSMEnable.glIsEnabled(cap));
} finally {
- GLStateManager.glDisable(cap);
+ GLSMEnable.glDisable(cap);
}
}
@Test
void secondaryColorIsRestoredByPopAttrib() {
try {
- GLStateManager.glSecondaryColor3f(0.125F, 0.25F, 0.375F);
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
- GLStateManager.glSecondaryColor3f(1.0F, 1.0F, 1.0F);
- GLStateManager.glPopAttrib();
+ GLSMCurrentAttribs.glSecondaryColor3f(0.125F, 0.25F, 0.375F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMCurrentAttribs.glSecondaryColor3f(1.0F, 1.0F, 1.0F);
+ GLSMAttribStack.glPopAttrib();
assertNoGlError("glPushAttrib/glSecondaryColor3f/glPopAttrib");
assertSecondaryColor(0.125F, 0.25F, 0.375F);
} finally {
- GLStateManager.glSecondaryColor3f(0.0F, 0.0F, 0.0F);
+ GLSMCurrentAttribs.glSecondaryColor3f(0.0F, 0.0F, 0.0F);
}
}
@Test
void colorSumIsRestoredByFogBitPopAttrib() {
try {
- GLStateManager.glPushAttrib(GL11.GL_FOG_BIT);
- GLStateManager.glEnable(GL14.GL_COLOR_SUM);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_FOG_BIT);
+ GLSMEnable.glEnable(GL14.GL_COLOR_SUM);
+ GLSMAttribStack.glPopAttrib();
assertNoGlError("glPushAttrib(GL_FOG_BIT)/glEnable(GL_COLOR_SUM)/glPopAttrib");
- assertFalse(GLStateManager.glIsEnabled(GL14.GL_COLOR_SUM));
+ assertFalse(GLSMEnable.glIsEnabled(GL14.GL_COLOR_SUM));
} finally {
- GLStateManager.glDisable(GL14.GL_COLOR_SUM);
+ GLSMEnable.glDisable(GL14.GL_COLOR_SUM);
}
}
@Test
void secondaryColorReplaysFromDisplayList() {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glSecondaryColor3f(0.5F, 0.625F, 0.75F);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMCurrentAttribs.glSecondaryColor3f(0.5F, 0.625F, 0.75F);
+ GLSMDraws.glEndList();
assertNoGlError("glSecondaryColor3f display list compile");
- GLStateManager.glSecondaryColor3f(0.0F, 0.0F, 0.0F);
- GLStateManager.glCallList(list);
+ GLSMCurrentAttribs.glSecondaryColor3f(0.0F, 0.0F, 0.0F);
+ GLSMDraws.glCallList(list);
assertNoGlError("glSecondaryColor3f display list replay");
assertSecondaryColor(0.5F, 0.625F, 0.75F);
} finally {
- GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glSecondaryColor3f(0.0F, 0.0F, 0.0F);
+ GLSMDraws.glDeleteLists(list, 1);
+ GLSMCurrentAttribs.glSecondaryColor3f(0.0F, 0.0F, 0.0F);
}
}
@Test
void displayListReplayIsCacheOnly() {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glEnable(GL11.GL_LINE_STIPPLE);
- GLStateManager.glLineStipple(2, (short) 0xF0F0);
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE);
+ GLSMRasterizer.glLineStipple(2, (short) 0xF0F0);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMDraws.glEndList();
assertNoGlError("display list compile");
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertNoGlError("display list replay");
} finally {
- GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMDraws.glDeleteLists(list, 1);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java
index 7f1d06003..c4d09f1d3 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java
@@ -22,26 +22,26 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
@GLCoreTest
public class GLSM_DeferredTextureDelete_GLTest {
- private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLStateManager.class, "RELEASE_DELAY_FRAMES");
+ private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLSMTextureLifetime.class, "RELEASE_DELAY_FRAMES");
private static final int SIZE = 4;
private static final int LEVELS = 3;
private static int immutableTexture() {
assumeTrue(GLStateManager.capabilities.OpenGL42, "no glTexStorage2D on this context");
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R8, 4, 4);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R8, 4, 4);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return tex;
}
private static int mipmappedTexture() {
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
for (int level = 0; level < LEVELS; level++) {
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, SIZE >> level, SIZE >> level, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, SIZE >> level, SIZE >> level, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
}
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return tex;
}
@@ -54,11 +54,11 @@ public class GLSM_DeferredTextureDelete_GLTest {
}
private static int cachedBinding(int unit) {
- return GLStateManager.getTextures().getTextureUnitBindings(unit).getBinding();
+ return GLSMTextures.getTextures().getTextureUnitBindings(unit).getBinding();
}
private static void framesPass(int frames) {
- for (int i = 0; i < frames; i++) GLStateManager.onFrameEnd();
+ for (int i = 0; i < frames; i++) GLSMTextureLifetime.onFrameEnd();
}
enum Attachment {
@@ -67,17 +67,17 @@ public class GLSM_DeferredTextureDelete_GLTest {
},
FRAMEBUFFER {
@Override int attach(int tex) {
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
return fbo;
}
},
NAMED_EXT {
@Override int attach(int tex) {
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glNamedFramebufferTexture2DEXT(fbo, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glNamedFramebufferTexture2DEXT(fbo, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
assertEquals(0, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "named attach must restore the draw binding");
return fbo;
}
@@ -90,30 +90,30 @@ public class GLSM_DeferredTextureDelete_GLTest {
@EnumSource(Attachment.class)
void storageIsReleasedOnlyAfterTheDelayFramesUnattached(Attachment attachment) {
framesPass(RELEASE_DELAY_FRAMES);
- final int before = GLStateManager.deferredTexturesAwaitingRelease();
+ final int before = GLSMTextureLifetime.deferredTexturesAwaitingRelease();
final int tex = mipmappedTexture();
final int fbo = attachment.attach(tex);
- GLStateManager.glDeleteTextures(tex);
- assertEquals(before + 1, GLStateManager.deferredTexturesAwaitingRelease());
+ GLSMTextures.glDeleteTextures(tex);
+ assertEquals(before + 1, GLSMTextureLifetime.deferredTexturesAwaitingRelease());
framesPass(RELEASE_DELAY_FRAMES - 1);
assertEquals(SIZE, levelWidth(tex, 0), "storage must outlive the delete by the delay frames");
if (fbo != 0) {
framesPass(RELEASE_DELAY_FRAMES);
assertEquals(SIZE, levelWidth(tex, 0), "an attached texture keeps its storage");
- assertEquals(before + 1, GLStateManager.deferredTexturesAwaitingRelease());
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glDeleteTextures(GLStateManager.glGenTextures());
+ assertEquals(before + 1, GLSMTextureLifetime.deferredTexturesAwaitingRelease());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMTextures.glDeleteTextures(GLSMTextures.glGenTextures());
assertEquals(tex, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME), "a flush must not delete an attached texture");
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(BufferUtils.createIntBuffer(1).put(fbo).flip());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(BufferUtils.createIntBuffer(1).put(fbo).flip());
framesPass(RELEASE_DELAY_FRAMES - 1);
assertEquals(SIZE, levelWidth(tex, 0), "storage must outlive the detach by the delay frames");
}
framesPass(1);
for (int level = 0; level < LEVELS; level++) assertEquals(0, levelWidth(tex, level), "level " + level);
- assertEquals(before, GLStateManager.deferredTexturesAwaitingRelease(), "released storage leaves nothing awaiting release");
+ assertEquals(before, GLSMTextureLifetime.deferredTexturesAwaitingRelease(), "released storage leaves nothing awaiting release");
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
}
@@ -124,66 +124,66 @@ public class GLSM_DeferredTextureDelete_GLTest {
void deletedNamesAreRejected(Rejection rejection) {
final int tex = mipmappedTexture();
final int other = mipmappedTexture();
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
try {
switch (rejection) {
case ATTACH -> {
- final int fbo = GLStateManager.glGenFramebuffers();
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
try {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
assertEquals(GL11.GL_NONE, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE));
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
}
}
case BIND_TEXTURE_UNIT -> {
- GLStateManager.glBindTextureUnit(2, other);
- GLStateManager.glBindTextureUnit(2, tex);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glBindTextureUnit(2, other);
+ GLSMTextures.glBindTextureUnit(2, tex);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
assertEquals(other, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "driver binding");
- assertEquals(other, GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "cached binding");
+ assertEquals(other, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "cached binding");
}
}
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTextureUnit(2, 0);
- GLStateManager.glDeleteTextures(other);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTextureUnit(2, 0);
+ GLSMTextures.glDeleteTextures(other);
}
}
@Test
void bindTexturesBindsEachTextureToItsTarget() {
final int t2d = mipmappedTexture();
- final int t3d = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ final int t3d = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
try {
- GLStateManager.glBindTextures(1, new int[] {t2d, t3d});
+ GLSMTextures.glBindTextures(1, new int[] {t2d, t3d});
assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "active unit unchanged");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "unit 1 driver binding");
- assertEquals(t2d, GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "unit 1 cached binding");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ assertEquals(t2d, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "unit 1 cached binding");
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "unit 2 driver binding");
assertEquals(t3d, cachedBinding(2), "unit 2 cached binding");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
final int unit0 = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
- GLStateManager.glBindTextures(GLStateManager.MAX_TEXTURE_UNITS - 1, new int[] {t3d, t2d});
+ GLSMTextures.glBindTextures(GLStateManager.MAX_TEXTURE_UNITS - 1, new int[] {t3d, t2d});
assertEquals(unit0, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "an out-of-range multi-bind must not land on the active unit");
- GLStateManager.glDeleteTextures(t2d);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glDeleteTextures(t2d);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(0, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "delete unbinds a multi-bound texture");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTextures(1, new int[] {0, 0});
- GLStateManager.glDeleteTextures(t3d);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTextures(1, new int[] {0, 0});
+ GLSMTextures.glDeleteTextures(t3d);
}
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
}
@@ -191,22 +191,22 @@ public class GLSM_DeferredTextureDelete_GLTest {
@Test
void dsaCreated3DTextureIsBoundAs3D() {
final int tex = RenderSystem.createTexture(GL12.GL_TEXTURE_3D);
- final int other = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, other);
+ final int other = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, other);
RenderSystem.texImage3D(tex, GL12.GL_TEXTURE_3D, 0, GL11.GL_RGBA8, SIZE, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
assertEquals(tex, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "texImage3D binds the texture as 3D");
assertEquals(tex, cachedBinding(0), "cached 3D binding");
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glDeleteTextures(tex);
- GLStateManager.glDeleteTextures(other);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(other);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
}
@Test
void createdNon2DTextureIsNotReleasedAs2D() {
assumeTrue(GLStateManager.capabilities.OpenGL45, "no glCreateTextures on this context");
- final int tex = GLStateManager.glCreateTextures(GL12.GL_TEXTURE_3D);
- GLStateManager.glDeleteTextures(tex);
+ final int tex = GLSMTextures.glCreateTextures(GL12.GL_TEXTURE_3D);
+ GLSMTextures.glDeleteTextures(tex);
framesPass(RELEASE_DELAY_FRAMES);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
}
@@ -217,17 +217,17 @@ public class GLSM_DeferredTextureDelete_GLTest {
final int unbound = Attachment.FRAMEBUFFER.attach(tex);
final int bound = Attachment.FRAMEBUFFER.attach(tex);
try {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, bound);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, bound);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
assertEquals(GL11.GL_NONE, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE));
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, unbound);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, unbound);
assertEquals(tex, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME));
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(bound);
- GLStateManager.glDeleteFramebuffers(unbound);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(bound);
+ GLSMFramebuffer.glDeleteFramebuffers(unbound);
}
}
@@ -237,21 +237,21 @@ public class GLSM_DeferredTextureDelete_GLTest {
@EnumSource(Rescue.class)
void rescuedTextureIsEmptyWithDefaultParameters(Rescue rescue) {
final int tex = mipmappedTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_BASE_LEVEL, 1);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_GREEN);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 1.5f);
- GLStateManager.glTexParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BORDER_COLOR, (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] {1, 1, 1, 1}).flip());
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_BASE_LEVEL, 1);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_GREEN);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 1.5f);
+ GLSMTextures.glTexParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BORDER_COLOR, (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] {1, 1, 1, 1}).flip());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
final int fbo = rescue == Rescue.ATTACHED ? Attachment.FRAMEBUFFER.attach(tex) : 0;
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
if (rescue != Rescue.PENDING) framesPass(RELEASE_DELAY_FRAMES);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
try {
assertEquals(rescue == Rescue.ATTACHED ? SIZE : 0, levelWidth(tex, 0), "only an attached texture keeps its storage");
final int[][] defaults = {
@@ -264,7 +264,7 @@ public class GLSM_DeferredTextureDelete_GLTest {
};
for (int[] pair : defaults) {
assertEquals(pair[1], GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, pair[0]), "driver pname 0x" + Integer.toHexString(pair[0]));
- assertEquals(pair[1], GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, pair[0]), "cached pname 0x" + Integer.toHexString(pair[0]));
+ assertEquals(pair[1], GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, pair[0]), "cached pname 0x" + Integer.toHexString(pair[0]));
}
assertEquals(0.0f, GL11.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS));
final FloatBuffer border = BufferUtils.createFloatBuffer(16);
@@ -272,22 +272,22 @@ public class GLSM_DeferredTextureDelete_GLTest {
assertEquals(0.0f, border.get(0) + border.get(1) + border.get(2) + border.get(3), "border color");
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(tex);
- if (fbo != 0) GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(tex);
+ if (fbo != 0) GLSMFramebuffer.glDeleteFramebuffers(fbo);
}
}
@Test
void rescuingWithADifferentTargetLeavesTheBoundTextureAlone() {
- final int t3d = GLStateManager.glGenTextures();
+ final int t3d = GLSMTextures.glGenTextures();
final int tex = mipmappedTexture();
try {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
- GLStateManager.glTexParameteri(GL12.GL_TEXTURE_3D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
+ GLSMTextures.glTexParameteri(GL12.GL_TEXTURE_3D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glDeleteTextures(tex);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, tex);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, tex);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "GLSM drops the bind");
assertEquals(t3d, cachedBinding(0), "cached 3D binding");
@@ -296,28 +296,28 @@ public class GLSM_DeferredTextureDelete_GLTest {
assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "the release must not unbind the 3D texture");
assertEquals(0, levelWidth(tex, 0), "the mismatched bind must leave the texture deferred");
} finally {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glDeleteTextures(t3d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glDeleteTextures(t3d);
}
}
@Test
void deletingAStaleNameKeepsTheBoundTexture() {
final int live = mipmappedTexture();
- final int stale = GLStateManager.glGenTextures();
+ final int stale = GLSMTextures.glGenTextures();
try {
- GLStateManager.glDeleteTextures(stale);
- GLStateManager.glDeleteTextures(GLStateManager.glGenTextures());
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, live);
+ GLSMTextures.glDeleteTextures(stale);
+ GLSMTextures.glDeleteTextures(GLSMTextures.glGenTextures());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, live);
- GLStateManager.glDeleteTextures(stale);
+ GLSMTextures.glDeleteTextures(stale);
framesPass(RELEASE_DELAY_FRAMES);
assertEquals(SIZE, levelWidth(live, 0), "a stale delete must not empty the bound texture");
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(live);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(live);
}
}
@@ -325,7 +325,7 @@ public class GLSM_DeferredTextureDelete_GLTest {
void deletingAnImmutableTextureRaisesNoError() {
final int tex = immutableTexture();
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
}
@@ -333,14 +333,14 @@ public class GLSM_DeferredTextureDelete_GLTest {
@Test
void rescuedImmutableTextureResetsParametersAndDeletesAgain() {
final int tex = immutableTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(tex);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
assertEquals(GL11.GL_NEAREST_MIPMAP_LINEAR, GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER));
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
}
@@ -348,23 +348,23 @@ public class GLSM_DeferredTextureDelete_GLTest {
@ParameterizedTest
@ValueSource(booleans = {true, false})
void deletingA2DTextureWhileA3DTextureIsBound(boolean deletedIsHidden2D) {
- final int t2d = GLStateManager.glGenTextures();
- final int t3d = GLStateManager.glGenTextures();
- final int other = GLStateManager.glGenTextures();
+ final int t2d = GLSMTextures.glGenTextures();
+ final int t3d = GLSMTextures.glGenTextures();
+ final int other = GLSMTextures.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
- GLStateManager.glDeleteTextures(deletedIsHidden2D ? t2d : other);
+ GLSMTextures.glDeleteTextures(deletedIsHidden2D ? t2d : other);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
assertEquals(deletedIsHidden2D ? 0 : t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "only the deleted texture leaves the hidden 2D binding");
assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D));
} finally {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(t3d);
- GLStateManager.glDeleteTextures(deletedIsHidden2D ? other : t2d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(t3d);
+ GLSMTextures.glDeleteTextures(deletedIsHidden2D ? other : t2d);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java
index 1eb527ed1..ecaa42f5b 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java
@@ -15,14 +15,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
public class GLSM_DeletedBufferBinding_GLTest {
private static int makeBoundBuffer(int target) {
- final int buffer = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(target, buffer);
- GLStateManager.glBufferData(target, 64L, GL15.GL_STREAM_DRAW);
+ final int buffer = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(target, buffer);
+ GLSMBuffers.glBufferData(target, 64L, GL15.GL_STREAM_DRAW);
return buffer;
}
private static void assertUnboundAfterDelete(int target, int binding, int buffer) {
- GLStateManager.glDeleteBuffers(buffer);
+ GLSMBuffers.glDeleteBuffers(buffer);
assertEquals(0, GL11.glGetInteger(binding), "GL unbinds a deleted buffer; the cache must not be the only place that knows");
}
@@ -31,12 +31,12 @@ public class GLSM_DeletedBufferBinding_GLTest {
final int pbo = makeBoundBuffer(GL21.GL_PIXEL_UNPACK_BUFFER);
assertUnboundAfterDelete(GL21.GL_PIXEL_UNPACK_BUFFER, GL21.GL_PIXEL_UNPACK_BUFFER_BINDING, pbo);
- final int tex = GLStateManager.glGenTextures();
+ final int tex = GLSMTextures.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 1, 1, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4));
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 1, 1, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4));
} finally {
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
}
@@ -66,12 +66,12 @@ public class GLSM_DeletedBufferBinding_GLTest {
void deletedIndexedUniformBufferIsNotRestoredFromCache() {
final int index = 3;
final int ubo = makeBoundBuffer(GL31.GL_UNIFORM_BUFFER);
- GLStateManager.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, index, ubo);
- assertEquals(ubo, GLStateManager.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index));
+ GLSMBuffers.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, index, ubo);
+ assertEquals(ubo, GLSMBuffers.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index));
- GLStateManager.glDeleteBuffers(ubo);
+ GLSMBuffers.glDeleteBuffers(ubo);
assertEquals(0, GL30.glGetInteger(GL31.GL_UNIFORM_BUFFER_BINDING, index));
- assertEquals(0, GLStateManager.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index));
+ assertEquals(0, GLSMBuffers.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index));
}
@Test
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java
index dd6363156..f11bc60bf 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java
@@ -14,127 +14,127 @@ public class GLSM_DirtyTracking_UnitTest {
@BeforeEach
void pushTrackedState() {
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_FOG_BIT | GL11.GL_CURRENT_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_FOG_BIT | GL11.GL_CURRENT_BIT);
}
@AfterEach
void popTrackedState() {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
@Test
void materialBumpsOnlyOnChange() {
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F));
- final int gen = GLStateManager.getLightingGeneration();
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F));
+ final int gen = GLSMLighting.getLightingGeneration();
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F));
- assertEquals(gen, GLStateManager.getLightingGeneration(), "identical material must not bump lightingGeneration");
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F));
+ assertEquals(gen, GLSMLighting.getLightingGeneration(), "identical material must not bump lightingGeneration");
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.9F, 0.2F, 0.3F, 0.4F));
- assertEquals(gen + 1, GLStateManager.getLightingGeneration(), "changed material must bump lightingGeneration once");
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.9F, 0.2F, 0.3F, 0.4F));
+ assertEquals(gen + 1, GLSMLighting.getLightingGeneration(), "changed material must bump lightingGeneration once");
}
@Test
void lightModelBumpsOnlyOnChange() {
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F));
- final int gen = GLStateManager.getLightingGeneration();
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F));
+ final int gen = GLSMLighting.getLightingGeneration();
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F));
- assertEquals(gen, GLStateManager.getLightingGeneration(), "identical light model ambient must not bump");
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F));
+ assertEquals(gen, GLSMLighting.getLightingGeneration(), "identical light model ambient must not bump");
}
@Test
void lightColorBumpsOnlyOnChange() {
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F));
- final int gen = GLStateManager.getLightingGeneration();
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F));
+ final int gen = GLSMLighting.getLightingGeneration();
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F));
- assertEquals(gen, GLStateManager.getLightingGeneration(), "identical light diffuse must not bump");
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F));
+ assertEquals(gen, GLSMLighting.getLightingGeneration(), "identical light diffuse must not bump");
}
@Test
void lightPositionDirtySkipsUnderSameModelview() {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(1.0F, 2.0F, 3.0F);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(1.0F, 2.0F, 3.0F);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F));
- final int gen = GLStateManager.getLightingGeneration();
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F));
+ final int gen = GLSMLighting.getLightingGeneration();
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F));
- assertEquals(gen, GLStateManager.getLightingGeneration(), "same position under same modelview must not bump");
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F));
+ assertEquals(gen, GLSMLighting.getLightingGeneration(), "same position under same modelview must not bump");
- GLStateManager.glTranslatef(5.0F, 0.0F, 0.0F);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F));
- assertEquals(gen + 1, GLStateManager.getLightingGeneration(), "same raw position under changed modelview must bump");
+ GLSMMatrices.glTranslatef(5.0F, 0.0F, 0.0F);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F));
+ assertEquals(gen + 1, GLSMLighting.getLightingGeneration(), "same raw position under changed modelview must bump");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
@Test
void translationDoesNotBumpLinearGeneration() {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
- final int mv = GLStateManager.getMvGeneration();
- final int lin = GLStateManager.getMvLinearGeneration();
+ final int mv = GLSMMatrices.getMvGeneration();
+ final int lin = GLSMMatrices.getMvLinearGeneration();
- GLStateManager.glTranslatef(1.0F, 2.0F, 3.0F);
- assertEquals(mv + 1, GLStateManager.getMvGeneration(), "translate must bump mvGeneration");
- assertEquals(lin, GLStateManager.getMvLinearGeneration(), "translate must NOT bump mvLinearGeneration");
+ GLSMMatrices.glTranslatef(1.0F, 2.0F, 3.0F);
+ assertEquals(mv + 1, GLSMMatrices.getMvGeneration(), "translate must bump mvGeneration");
+ assertEquals(lin, GLSMMatrices.getMvLinearGeneration(), "translate must NOT bump mvLinearGeneration");
- GLStateManager.glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
- assertEquals(mv + 2, GLStateManager.getMvGeneration(), "rotate must bump mvGeneration");
- assertEquals(lin + 1, GLStateManager.getMvLinearGeneration(), "rotate must bump mvLinearGeneration");
+ GLSMMatrices.glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
+ assertEquals(mv + 2, GLSMMatrices.getMvGeneration(), "rotate must bump mvGeneration");
+ assertEquals(lin + 1, GLSMMatrices.getMvLinearGeneration(), "rotate must bump mvLinearGeneration");
- GLStateManager.glScalef(2.0F, 2.0F, 2.0F);
- assertEquals(lin + 2, GLStateManager.getMvLinearGeneration(), "scale must bump mvLinearGeneration");
+ GLSMMatrices.glScalef(2.0F, 2.0F, 2.0F);
+ assertEquals(lin + 2, GLSMMatrices.getMvLinearGeneration(), "scale must bump mvLinearGeneration");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
@Test
void fogBumpsOnlyOnChange() {
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5F);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5F);
final int gen = GLStateManager.getFragmentGeneration();
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5F);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5F);
assertEquals(gen, GLStateManager.getFragmentGeneration(), "identical fog density must not bump fragmentGeneration");
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.7F);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.7F);
assertEquals(gen + 1, GLStateManager.getFragmentGeneration(), "changed fog density must bump fragmentGeneration");
}
@Test
void spotDirectionDirtySkipsUnderTranslationOnly() {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F));
- final int gen = GLStateManager.getLightingGeneration();
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F));
+ final int gen = GLSMLighting.getLightingGeneration();
- GLStateManager.glTranslatef(5.0F, 0.0F, 0.0F);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F));
- assertEquals(gen, GLStateManager.getLightingGeneration(), "spot direction under translation-only must not bump");
+ GLSMMatrices.glTranslatef(5.0F, 0.0F, 0.0F);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F));
+ assertEquals(gen, GLSMLighting.getLightingGeneration(), "spot direction under translation-only must not bump");
- GLStateManager.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F));
- assertEquals(gen + 1, GLStateManager.getLightingGeneration(), "same raw spot direction under changed 3x3 must bump");
+ GLSMMatrices.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F));
+ assertEquals(gen + 1, GLSMLighting.getLightingGeneration(), "same raw spot direction under changed 3x3 must bump");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
@Test
void colorMaterialFreezesLastColorOnDisable() {
- GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
- GLStateManager.glColor4f(1.0F, 0.0F, 0.0F, 1.0F); // enable-time color
- GLStateManager.enableColorMaterial();
- GLStateManager.glColor4f(0.0F, 0.0F, 1.0F, 1.0F); // last color while enabled
- GLStateManager.disableColorMaterial();
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMCurrentAttribs.glColor4f(1.0F, 0.0F, 0.0F, 1.0F); // enable-time color
+ GLSMLighting.enableColorMaterial();
+ GLSMCurrentAttribs.glColor4f(0.0F, 0.0F, 1.0F, 1.0F); // last color while enabled
+ GLSMLighting.disableColorMaterial();
- final Vector4f diffuse = GLStateManager.getFrontMaterial().diffuse;
+ final Vector4f diffuse = GLSMLighting.getFrontMaterial().diffuse;
assertEquals(0.0F, diffuse.x, "diffuse must freeze at last color (blue), not enable-time red");
assertEquals(0.0F, diffuse.y, "green channel must be 0");
assertEquals(1.0F, diffuse.z, "blue channel must be 1");
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java
index 4bbefb56f..5186e9210 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java
@@ -78,9 +78,9 @@ class GLSM_DisplayList_Batching_Test {
void testDifferentTransformsSameFormatShareVBO() {
CompiledDisplayList compiled = createDisplayList(() -> {
createSimpleDraw();
- GLStateManager.glTranslatef(1, 0, 0);
+ GLSMMatrices.glTranslatef(1, 0, 0);
createSimpleDraw();
- GLStateManager.glTranslatef(2, 0, 0);
+ GLSMMatrices.glTranslatef(2, 0, 0);
createSimpleDraw();
});
@@ -107,9 +107,9 @@ class GLSM_DisplayList_Batching_Test {
// has a different transform, so they can't all be merged.
CompiledDisplayList compiled = createDisplayList(() -> {
createSimpleDraw();
- GLStateManager.glTranslatef(0.5f, 0, 0);
+ GLSMMatrices.glTranslatef(0.5f, 0, 0);
createSimpleDraw();
- GLStateManager.glTranslatef(-0.5f, 0, 0);
+ GLSMMatrices.glTranslatef(-0.5f, 0, 0);
createSimpleDraw();
});
@@ -125,8 +125,8 @@ class GLSM_DisplayList_Batching_Test {
@Test
void testDrawsWithSameTransformProduceSingleDrawRangeCmd() {
CompiledDisplayList compiled = createDisplayList(() -> {
- GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f);
- GLStateManager.glScalef(2, 1, 3);
+ GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f);
+ GLSMMatrices.glScalef(2, 1, 3);
createSimpleDraw();
createSimpleDraw();
createSimpleDraw();
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java
index 2fda795c1..3e2be1058 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java
@@ -29,61 +29,61 @@ public class GLSM_DisplayList_CompileAndExecuteArrays_GLTest {
@BeforeEach
void setUp() {
- final ViewportState vp = GLStateManager.getViewportState();
+ final ViewportState vp = GLSMRasterizer.getViewportState();
savedX = vp.x;
savedY = vp.y;
savedW = vp.width;
savedH = vp.height;
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
final ByteBuffer verts = ByteBuffer.allocateDirect(3 * 12).order(ByteOrder.nativeOrder());
verts.putFloat(0f).putFloat(0.5f).putFloat(0f).putFloat(W).putFloat(0.5f).putFloat(0f).flip();
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW);
- GLStateManager.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L);
- GLStateManager.glEnableVertexAttribArray(POSITION_LOC);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(POSITION_LOC);
- GLStateManager.glViewport(0, 0, W, 1);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(0, W, 0, 1, -1, 1);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glColor4f(1f, 1f, 1f, 1f);
+ GLSMRasterizer.glViewport(0, 0, W, 1);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(0, W, 0, 1, -1, 1);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f);
}
@AfterEach
void tearDown() {
- if (list > 0) GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
- GLStateManager.glViewport(savedX, savedY, savedW, savedH);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
+ if (list > 0) GLSMDraws.glDeleteLists(list, 1);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMRasterizer.glViewport(savedX, savedY, savedW, savedH);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
while (GL11.glGetError() != GL11.GL_NO_ERROR) {}
}
private void clear() {
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
private boolean[] readCoverage() {
pixels.clear();
- GLStateManager.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMFramebuffer.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "GL error during readback");
final boolean[] covered = new boolean[W];
@@ -101,13 +101,13 @@ public class GLSM_DisplayList_CompileAndExecuteArrays_GLTest {
/** The scale is issued inside the list, after the push that flushed everything before it - AE2 monitor's shape. */
private void compileScaledDraw(int mode) {
- list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, mode);
- GLStateManager.glPushMatrix();
- GLStateManager.glScalef(0.5f, 1f, 1f);
- GLStateManager.glDrawArrays(GL11.GL_LINES, 0, 2);
- GLStateManager.glPopMatrix();
- GLStateManager.glEndList();
+ list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, mode);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glScalef(0.5f, 1f, 1f);
+ GLSMDraws.glDrawArrays(GL11.GL_LINES, 0, 2);
+ GLSMMatrices.glPopMatrix();
+ GLSMDraws.glEndList();
}
// Replay is not asserted here: a compiled list plays back through FFP client arrays, which this core context lacks,
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java
index 594df85a9..4bcc36402 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java
@@ -21,13 +21,13 @@ class GLSM_DisplayList_FormatOptimization_Test {
@AfterEach
void cleanup() {
if (displayList > 0) {
- GLStateManager.glDeleteLists(displayList, 1);
+ GLSMDraws.glDeleteLists(displayList, 1);
displayList = -1;
}
// Reset GL state to avoid test pollution
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glTexCoord2f(0.0f, 0.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glTexCoord2f(0.0f, 0.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
}
private static final float[][] CORNERS = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};
@@ -37,20 +37,20 @@ class GLSM_DisplayList_FormatOptimization_Test {
@ValueSource(booleans = {false, true})
void colorTextureFormatLeavesLastColorCurrent(boolean normals) {
displayList = GL11.glGenLists(1);
- GLStateManager.glNewList(displayList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(displayList, GL11.GL_COMPILE);
- GLStateManager.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
for (int i = 0; i < 4; i++) {
- if (normals) GLStateManager.glNormal3f(0, 0, 1);
- GLStateManager.glColor4f(COLORS[i][0], COLORS[i][1], COLORS[i][2], COLORS[i][3]);
- GLStateManager.glTexCoord2f(CORNERS[i][0], CORNERS[i][1]);
- GLStateManager.glVertex3f(CORNERS[i][0], CORNERS[i][1], 0);
+ if (normals) GLSMCurrentAttribs.glNormal3f(0, 0, 1);
+ GLSMCurrentAttribs.glColor4f(COLORS[i][0], COLORS[i][1], COLORS[i][2], COLORS[i][3]);
+ GLSMCurrentAttribs.glTexCoord2f(CORNERS[i][0], CORNERS[i][1]);
+ GLSMDraws.glVertex3f(CORNERS[i][0], CORNERS[i][1], 0);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
- GLStateManager.glCallList(displayList);
+ GLSMDraws.glCallList(displayList);
verifyState(GL11.GL_CURRENT_COLOR, new float[]{0f, 0f, 1f, 1f},
"After playback, color should be blue (last color in immediate mode block)");
}
@@ -59,40 +59,40 @@ class GLSM_DisplayList_FormatOptimization_Test {
void testMultipleDrawsInDisplayList() {
// Test a display list with multiple draws with different formats
displayList = GL11.glGenLists(1);
- GLStateManager.glNewList(displayList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(displayList, GL11.GL_COMPILE);
// First draw: position only
DisplayListTestHelper.immediateQuad(1.0f);
// Second draw: position + color
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glColor4f(1, 0, 0, 1);
- GLStateManager.glVertex3f(2, 0, 0);
- GLStateManager.glColor4f(0, 1, 0, 1);
- GLStateManager.glVertex3f(3, 0, 0);
- GLStateManager.glColor4f(0, 0, 1, 1);
- GLStateManager.glVertex3f(3, 1, 0);
- GLStateManager.glColor4f(1, 1, 0, 1);
- GLStateManager.glVertex3f(2, 1, 0);
- GLStateManager.glEnd();
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMCurrentAttribs.glColor4f(1, 0, 0, 1);
+ GLSMDraws.glVertex3f(2, 0, 0);
+ GLSMCurrentAttribs.glColor4f(0, 1, 0, 1);
+ GLSMDraws.glVertex3f(3, 0, 0);
+ GLSMCurrentAttribs.glColor4f(0, 0, 1, 1);
+ GLSMDraws.glVertex3f(3, 1, 0);
+ GLSMCurrentAttribs.glColor4f(1, 1, 0, 1);
+ GLSMDraws.glVertex3f(2, 1, 0);
+ GLSMDraws.glEnd();
// Third draw: position + texture
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glTexCoord2f(0, 0);
- GLStateManager.glVertex3f(4, 0, 0);
- GLStateManager.glTexCoord2f(1, 0);
- GLStateManager.glVertex3f(5, 0, 0);
- GLStateManager.glTexCoord2f(1, 1);
- GLStateManager.glVertex3f(5, 1, 0);
- GLStateManager.glTexCoord2f(0, 1);
- GLStateManager.glVertex3f(4, 1, 0);
- GLStateManager.glEnd();
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMCurrentAttribs.glTexCoord2f(0, 0);
+ GLSMDraws.glVertex3f(4, 0, 0);
+ GLSMCurrentAttribs.glTexCoord2f(1, 0);
+ GLSMDraws.glVertex3f(5, 0, 0);
+ GLSMCurrentAttribs.glTexCoord2f(1, 1);
+ GLSMDraws.glVertex3f(5, 1, 0);
+ GLSMCurrentAttribs.glTexCoord2f(0, 1);
+ GLSMDraws.glVertex3f(4, 1, 0);
+ GLSMDraws.glEnd();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Call the list and verify color is restored to last value from second draw (yellow)
// Third draw has no color, so doesn't affect GL_CURRENT_COLOR
- GLStateManager.glCallList(displayList);
+ GLSMDraws.glCallList(displayList);
verifyState(GL11.GL_CURRENT_COLOR, new float[]{1f, 1f, 0f, 1f},
"After playback, color should be yellow (last color from second draw)");
}
@@ -104,26 +104,26 @@ class GLSM_DisplayList_FormatOptimization_Test {
@Test
void testColorRestoredAfterImmediateModeVBOPlayback() {
// Set initial color to white
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
verifyState(GL11.GL_CURRENT_COLOR, new float[]{1f, 1f, 1f, 1f}, "Initial color should be white");
// Create display list with immediate mode that sets color to BLUE (0, 0, 1, 1)
displayList = GL11.glGenLists(1);
- GLStateManager.glNewList(displayList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(displayList, GL11.GL_COMPILE);
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); // Blue
- GLStateManager.glVertex3f(0, 0, 0);
- GLStateManager.glVertex3f(1, 0, 0);
- GLStateManager.glVertex3f(1, 1, 0);
- GLStateManager.glVertex3f(0, 1, 0);
- GLStateManager.glEnd();
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMCurrentAttribs.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); // Blue
+ GLSMDraws.glVertex3f(0, 0, 0);
+ GLSMDraws.glVertex3f(1, 0, 0);
+ GLSMDraws.glVertex3f(1, 1, 0);
+ GLSMDraws.glVertex3f(0, 1, 0);
+ GLSMDraws.glEnd();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Call the display list
- GLStateManager.glCallList(displayList);
+ GLSMDraws.glCallList(displayList);
// After playback, GL_CURRENT_COLOR should be blue (the last color in the display list)
// AND the GLSM cache should also be blue (synced with GL)
@@ -131,7 +131,7 @@ class GLSM_DisplayList_FormatOptimization_Test {
"After display list playback, color should be blue (last color in the list)");
// Now set color to red - this should ACTUALLY change the color
- GLStateManager.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
verifyState(GL11.GL_CURRENT_COLOR, new float[]{1f, 0f, 0f, 1f},
"After setting color to red, color should be red");
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java
index dc918c36e..61857968c 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java
@@ -25,37 +25,37 @@ class GLSM_DisplayList_Nesting_Test {
@AfterEach
void cleanup() {
if (parentList > 0) {
- GLStateManager.glDeleteLists(parentList, 1);
+ GLSMDraws.glDeleteLists(parentList, 1);
parentList = -1;
}
if (childList > 0) {
- GLStateManager.glDeleteLists(childList, 1);
+ GLSMDraws.glDeleteLists(childList, 1);
childList = -1;
}
// Reset GL state
- GLStateManager.glLoadIdentity();
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMMatrices.glLoadIdentity();
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
@Test
void testNestedDisplayListWithParentTransform() {
// Create child list: just a simple quad at origin
childList = GL11.glGenLists(1);
- GLStateManager.glNewList(childList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(childList, GL11.GL_COMPILE);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex3f(0, 0, 0);
GL11.glVertex3f(1, 0, 0);
GL11.glVertex3f(1, 1, 0);
GL11.glVertex3f(0, 1, 0);
GL11.glEnd();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Create parent list: translate then call child
parentList = GL11.glGenLists(1);
- GLStateManager.glNewList(parentList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform
- GLStateManager.glCallList(childList); // Should render child at (10,0,0)
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(parentList, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform
+ GLSMDraws.glCallList(childList); // Should render child at (10,0,0)
+ GLSMDraws.glEndList();
DisplayListTestHelper.assertModelviewAfterCall(parentList, new Matrix4f().translate(10.0f, 0.0f, 0.0f), "parent transform applies to the child");
}
@@ -73,8 +73,8 @@ class GLSM_DisplayList_Nesting_Test {
try {
for (int depth = chain.length - 1; depth >= 0; depth--) {
lists[depth] = GL11.glGenLists(1);
- GLStateManager.glNewList(lists[depth], GL11.GL_COMPILE);
- GLStateManager.glTranslatef(chain[depth], 0.0f, 0.0f);
+ GLSMDraws.glNewList(lists[depth], GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(chain[depth], 0.0f, 0.0f);
if (depth == chain.length - 1) {
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex3f(0, 0, 0);
@@ -83,14 +83,14 @@ class GLSM_DisplayList_Nesting_Test {
GL11.glVertex3f(0, 1, 0);
GL11.glEnd();
} else {
- GLStateManager.glCallList(lists[depth + 1]);
+ GLSMDraws.glCallList(lists[depth + 1]);
}
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
DisplayListTestHelper.assertModelviewAfterCall(lists[0], new Matrix4f().translate(expectedX, 0.0f, 0.0f), "nested translations");
} finally {
for (int list : lists) {
- if (list > 0) GLStateManager.glDeleteLists(list, 1);
+ if (list > 0) GLSMDraws.glDeleteLists(list, 1);
}
}
}
@@ -99,24 +99,24 @@ class GLSM_DisplayList_Nesting_Test {
void testNestedDisplayListWithPushPop() {
// Create child list with push/pop (shouldn't affect parent's matrix)
childList = GL11.glGenLists(1);
- GLStateManager.glNewList(childList, GL11.GL_COMPILE);
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); // Child transform
+ GLSMDraws.glNewList(childList, GL11.GL_COMPILE);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // Child transform
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex3f(0, 0, 0);
GL11.glVertex3f(1, 0, 0);
GL11.glVertex3f(1, 1, 0);
GL11.glVertex3f(0, 1, 0);
GL11.glEnd();
- GLStateManager.glPopMatrix(); // Restore matrix to parent's state
- GLStateManager.glEndList();
+ GLSMMatrices.glPopMatrix(); // Restore matrix to parent's state
+ GLSMDraws.glEndList();
// Create parent list
parentList = GL11.glGenLists(1);
- GLStateManager.glNewList(parentList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform
- GLStateManager.glCallList(childList); // Child uses push/pop
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(parentList, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform
+ GLSMDraws.glCallList(childList); // Child uses push/pop
+ GLSMDraws.glEndList();
DisplayListTestHelper.assertModelviewAfterCall(parentList, new Matrix4f().translate(10.0f, 0.0f, 0.0f), "child push/pop leaves only the parent transform");
}
@@ -127,38 +127,38 @@ class GLSM_DisplayList_Nesting_Test {
// This is a uncommon but technically valid per the spec.
// Get initial stack depth
- int initialDepth = GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH);
+ int initialDepth = GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH);
// Create a display list that only pushes the matrix
int matrixPushList = GL11.glGenLists(1);
- GLStateManager.glNewList(matrixPushList, GL11.GL_COMPILE);
- GLStateManager.glPushMatrix();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(matrixPushList, GL11.GL_COMPILE);
+ GLSMMatrices.glPushMatrix();
+ GLSMDraws.glEndList();
// Create a display list that only pops the matrix
int matrixPopList = GL11.glGenLists(1);
- GLStateManager.glNewList(matrixPopList, GL11.GL_COMPILE);
- GLStateManager.glPopMatrix();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(matrixPopList, GL11.GL_COMPILE);
+ GLSMMatrices.glPopMatrix();
+ GLSMDraws.glEndList();
// Verify initial stack depth hasn't changed after compilation
- assertEquals(initialDepth, GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH), "Stack depth should be unchanged after compiling display lists");
+ assertEquals(initialDepth, GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH), "Stack depth should be unchanged after compiling display lists");
// Call the push list - should increase stack depth
- GLStateManager.glCallList(matrixPushList);
- int depthAfterPush = GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH);
+ GLSMDraws.glCallList(matrixPushList);
+ int depthAfterPush = GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH);
assertEquals(initialDepth + 1, depthAfterPush, "Stack depth should increase by 1 after calling push list");
// Optionally do some operations here that would benefit from the pushed matrix
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f);
// Call the pop list - should restore stack depth
- GLStateManager.glCallList(matrixPopList);
- int depthAfterPop = GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH);
+ GLSMDraws.glCallList(matrixPopList);
+ int depthAfterPop = GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH);
assertEquals(initialDepth, depthAfterPop, "Stack depth should return to initial after calling pop list");
// Cleanup
- GLStateManager.glDeleteLists(matrixPushList, 1);
- GLStateManager.glDeleteLists(matrixPopList, 1);
+ GLSMDraws.glDeleteLists(matrixPushList, 1);
+ GLSMDraws.glDeleteLists(matrixPopList, 1);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java
index dffb7a157..91198fc4d 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java
@@ -21,13 +21,13 @@ public class GLSM_DisplayList_PixelStore_Test {
TEX_SUB_IMAGE_2D {
@Override
void run(ByteBuffer src) {
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
}
},
TEX_IMAGE_2D {
@Override
void run(ByteBuffer src) {
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SUB, SUB, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SUB, SUB, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
}
};
@@ -36,14 +36,14 @@ public class GLSM_DisplayList_PixelStore_Test {
@AfterEach
void resetUnpackState() {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
setUnpack(0, 0, 0);
}
private static void setUnpack(int rowLength, int skipRows, int skipPixels) {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, rowLength);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, skipRows);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, skipPixels);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, rowLength);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, skipRows);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, skipPixels);
}
private static void setStridedUnpack() {
@@ -61,15 +61,15 @@ public class GLSM_DisplayList_PixelStore_Test {
}
private static int makeTexture(int size, ByteBuffer pixels) {
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
return tex;
}
private static ByteBuffer readback(int size) {
final ByteBuffer out = ByteBuffer.allocateDirect(size * size * 4).order(ByteOrder.nativeOrder());
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
return out;
}
@@ -101,18 +101,18 @@ public class GLSM_DisplayList_PixelStore_Test {
@Test
void pixelStoreExecutesImmediatelyAndIsNotRecorded() {
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 7);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 7);
assertEquals(7, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH), "must execute immediately during recording");
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(7, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH), "must persist after glEndList");
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
- GLStateManager.glCallList(list);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
+ GLSMDraws.glCallList(list);
assertEquals(0, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH), "must not have been recorded into the list");
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
@ParameterizedTest
@@ -123,21 +123,21 @@ public class GLSM_DisplayList_PixelStore_Test {
setStridedUnpack();
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
upload.run(src);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(0, red(readback(SUB), SUB, 0, 0), "GL_COMPILE must not execute the upload");
setUnpack(0, 0, 0);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertStridedSubImage(readback(SUB));
assertUnpack(0, 0, 0);
- GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glDeleteTextures(tex);
+ GLSMDraws.glDeleteLists(list, 1);
+ GLSMTextures.glDeleteTextures(tex);
}
@Test
@@ -148,22 +148,22 @@ public class GLSM_DisplayList_PixelStore_Test {
setStridedUnpack();
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
- GLStateManager.glEndList();
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
+ GLSMDraws.glEndList();
assertStridedSubImage(readback(SUB));
setUnpack(0, 0, 0);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zeros);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zeros);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertStridedSubImage(readback(SUB));
assertUnpack(0, 0, 0);
- GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glDeleteTextures(tex);
+ GLSMDraws.glDeleteLists(list, 1);
+ GLSMTextures.glDeleteTextures(tex);
}
@ParameterizedTest
@@ -172,20 +172,20 @@ public class GLSM_DisplayList_PixelStore_Test {
final int tex = makeTexture(SUB, ByteBuffer.allocateDirect(SUB * SUB * 4).order(ByteOrder.nativeOrder()));
final ByteBuffer src = makeSource(SUB);
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
upload.run(src);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
setStridedUnpack();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertTightSubImage(readback(SUB));
assertEquals(1, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT), "live state must survive replay");
assertUnpack(SRC, 1, 2);
- GLStateManager.glDeleteLists(list, 1);
- GLStateManager.glDeleteTextures(tex);
+ GLSMDraws.glDeleteLists(list, 1);
+ GLSMTextures.glDeleteTextures(tex);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java
index 73f82e6b6..750fa495b 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java
@@ -21,18 +21,18 @@ class GLSM_DisplayList_RawTessellatorTransform_Test {
@AfterEach
void cleanup() {
if (testList > 0) {
- GLStateManager.glDeleteLists(testList, 1);
+ GLSMDraws.glDeleteLists(testList, 1);
testList = -1;
}
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
}
private CompiledDisplayList compileHalfScaled(Runnable body) {
- testList = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glScalef(0.5f, 0.5f, 0.5f);
+ testList = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
+ GLSMMatrices.glScalef(0.5f, 0.5f, 0.5f);
body.run();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
final CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
assertNotNull(compiled);
@@ -85,15 +85,15 @@ class GLSM_DisplayList_RawTessellatorTransform_Test {
@Test
void aRawDrawDoesNotFlushWhileBakedGeometryIsPending() {
final CompiledDisplayList compiled = compileHalfScaled(() -> {
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glVertex3f(0.0f, 0.0f, 0.0f);
- GLStateManager.glVertex3f(1.0f, 0.0f, 0.0f);
- GLStateManager.glVertex3f(1.0f, 1.0f, 0.0f);
- GLStateManager.glVertex3f(0.0f, 1.0f, 0.0f);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glVertex3f(0.0f, 0.0f, 0.0f);
+ GLSMDraws.glVertex3f(1.0f, 0.0f, 0.0f);
+ GLSMDraws.glVertex3f(1.0f, 1.0f, 0.0f);
+ GLSMDraws.glVertex3f(0.0f, 1.0f, 0.0f);
rawQuad(1.0f);
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
});
final IntList opcodes = compiled.getCommandOpcodes();
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java
index 9ad701022..e353881eb 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java
@@ -25,40 +25,40 @@ public class GLSM_DisplayList_StateSet_GLTest {
@AfterEach
void cleanup() {
DisplayListManager.abortCompilation();
- while (GLStateManager.getAttribDepth() > 0) {
- GLStateManager.popState();
+ while (GLSMAttribStack.getAttribDepth() > 0) {
+ GLSMAttribStack.popState();
}
for (int id : listsToDelete) {
- GLStateManager.glDeleteLists(id, 1);
+ GLSMDraws.glDeleteLists(id, 1);
}
listsToDelete.clear();
- GLStateManager.disableBlend();
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBlend.disableBlend();
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private int newList() {
- final int id = GLStateManager.glGenLists(1);
+ final int id = GLSMDraws.glGenLists(1);
listsToDelete.add(id);
return id;
}
private int recordCutoutBracket(int mode) {
final int list = newList();
- GLStateManager.glNewList(list, mode);
- final int d = GLStateManager.pushState(StateSet.CUTOUT);
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.popStateTo(d);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, mode);
+ final int d = GLSMAttribStack.pushState(StateSet.CUTOUT);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMAttribStack.popStateTo(d);
+ GLSMDraws.glEndList();
return list;
}
@@ -70,22 +70,22 @@ public class GLSM_DisplayList_StateSet_GLTest {
@Test
void compileBracketDoesNotThrowAndLeavesLiveStateUntouched() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
- final int func0 = GLStateManager.getAlphaState().getFunction();
- final float ref0 = GLStateManager.getAlphaState().getReference();
- final int unit0 = GLStateManager.getActiveTextureUnit();
- final int depth0 = GLStateManager.getAttribDepth();
+ final int func0 = GLSMDepthStencilAlpha.getAlphaState().getFunction();
+ final float ref0 = GLSMDepthStencilAlpha.getAlphaState().getReference();
+ final int unit0 = GLSMTextures.getActiveTextureUnit();
+ final int depth0 = GLSMAttribStack.getAttribDepth();
final int list = recordCutoutBracket(GL11.GL_COMPILE);
verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "cache alpha test enable unchanged after COMPILE-only bracket");
- assertEquals(func0, GLStateManager.getAlphaState().getFunction(), "cache alpha func unchanged after COMPILE-only bracket");
- assertEquals(ref0, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref unchanged after COMPILE-only bracket");
- assertEquals(unit0, GLStateManager.getActiveTextureUnit(), "cache active unit unchanged after COMPILE-only bracket");
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after COMPILE-only bracket");
+ assertEquals(func0, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func unchanged after COMPILE-only bracket");
+ assertEquals(ref0, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref unchanged after COMPILE-only bracket");
+ assertEquals(unit0, GLSMTextures.getActiveTextureUnit(), "cache active unit unchanged after COMPILE-only bracket");
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after COMPILE-only bracket");
assertEquals(2, commandCounts(list).getOrDefault(GLCommand.COMPLEX_REF, 0), "push and pop each record one COMPLEX_REF");
}
@@ -93,149 +93,149 @@ public class GLSM_DisplayList_StateSet_GLTest {
void compiledBracketReplayRestoresState() {
final int list = recordCutoutBracket(GL11.GL_COMPILE);
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.9f);
- GLStateManager.disableAlphaTest();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int depth0 = GLStateManager.getAttribDepth();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.9f);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int depth0 = GLSMAttribStack.getAttribDepth();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
- assertEquals(GL11.GL_LESS, GLStateManager.getAlphaState().getFunction(), "cache alpha func restored by replay");
- assertEquals(0.9f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored by replay");
+ assertEquals(GL11.GL_LESS, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func restored by replay");
+ assertEquals(0.9f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored by replay");
verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "cache alpha test restored disabled by replay");
- assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored by replay");
+ assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored by replay");
assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored by replay");
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged by balanced replay");
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged by balanced replay");
}
@Test
void compileAndExecuteBracketIsBalanced() {
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.9f);
- GLStateManager.disableAlphaTest();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int depth0 = GLStateManager.getAttribDepth();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.9f);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int depth0 = GLSMAttribStack.getAttribDepth();
final int list = recordCutoutBracket(GL11.GL_COMPILE_AND_EXECUTE);
- assertEquals(GL11.GL_LESS, GLStateManager.getAlphaState().getFunction(), "cache alpha func restored after GL_COMPILE_AND_EXECUTE bracket");
- assertEquals(0.9f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after GL_COMPILE_AND_EXECUTE bracket");
+ assertEquals(GL11.GL_LESS, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func restored after GL_COMPILE_AND_EXECUTE bracket");
+ assertEquals(0.9f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after GL_COMPILE_AND_EXECUTE bracket");
verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "cache alpha test restored disabled after GL_COMPILE_AND_EXECUTE bracket");
- assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored after GL_COMPILE_AND_EXECUTE bracket");
+ assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored after GL_COMPILE_AND_EXECUTE bracket");
assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored after GL_COMPILE_AND_EXECUTE bracket");
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after balanced GL_COMPILE_AND_EXECUTE bracket");
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after balanced GL_COMPILE_AND_EXECUTE bracket");
- GLStateManager.glCallList(list);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
+ GLSMDraws.glCallList(list);
- assertEquals(GL11.GL_LESS, GLStateManager.getAlphaState().getFunction(), "cache alpha func restored after replay");
- assertEquals(0.9f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after replay");
+ assertEquals(GL11.GL_LESS, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func restored after replay");
+ assertEquals(0.9f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after replay");
verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "cache alpha test restored disabled after replay");
- assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored after replay");
+ assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored after replay");
assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored after replay");
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after replay");
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after replay");
}
@Test
void nestedListsPushInBothLevels() {
- GLStateManager.enableBlend();
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- final boolean cull0 = GLStateManager.glIsEnabled(GL11.GL_CULL_FACE);
- final int depth0 = GLStateManager.getAttribDepth();
+ GLSMBlend.enableBlend();
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ final boolean cull0 = GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE);
+ final int depth0 = GLSMAttribStack.getAttribDepth();
final int parent = newList();
final int child = newList();
- GLStateManager.glNewList(parent, GL11.GL_COMPILE);
- final int dParent = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.glNewList(child, GL11.GL_COMPILE);
- final int dChild = GLStateManager.pushState(StateSet.CULL);
+ GLSMDraws.glNewList(parent, GL11.GL_COMPILE);
+ final int dParent = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMDraws.glNewList(child, GL11.GL_COMPILE);
+ final int dChild = GLSMAttribStack.pushState(StateSet.CULL);
if (cull0) {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
} else {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
}
- GLStateManager.popStateTo(dChild);
- GLStateManager.glEndList();
- GLStateManager.disableBlend();
- GLStateManager.popStateTo(dParent);
- GLStateManager.glEndList();
+ GLSMAttribStack.popStateTo(dChild);
+ GLSMDraws.glEndList();
+ GLSMBlend.disableBlend();
+ GLSMAttribStack.popStateTo(dParent);
+ GLSMDraws.glEndList();
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged by nested COMPILE-only bracket");
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged by nested COMPILE-only bracket");
- GLStateManager.glCallList(parent);
+ GLSMDraws.glCallList(parent);
verifyIsEnabled(GL11.GL_BLEND, true, "blend enable restored by the parent BLEND bracket after parent replay");
verifyIsEnabled(GL11.GL_CULL_FACE, cull0, "cull enable restored after parent replay");
- GLStateManager.glCallList(child);
+ GLSMDraws.glCallList(child);
verifyIsEnabled(GL11.GL_CULL_FACE, cull0, "cull enable restored after child replay");
}
@Test
void nestedCompileAndExecuteChildInsideCompileParent() {
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- final boolean cull0 = GLStateManager.glIsEnabled(GL11.GL_CULL_FACE);
- final int depth0 = GLStateManager.getAttribDepth();
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ final boolean cull0 = GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE);
+ final int depth0 = GLSMAttribStack.getAttribDepth();
final int parent = newList();
final int child = newList();
- GLStateManager.glNewList(parent, GL11.GL_COMPILE);
- final int dParent = GLStateManager.pushState(StateSet.BLEND);
+ GLSMDraws.glNewList(parent, GL11.GL_COMPILE);
+ final int dParent = GLSMAttribStack.pushState(StateSet.BLEND);
- GLStateManager.glNewList(child, GL11.GL_COMPILE_AND_EXECUTE);
- final int dChild = GLStateManager.pushState(StateSet.CULL);
+ GLSMDraws.glNewList(child, GL11.GL_COMPILE_AND_EXECUTE);
+ final int dChild = GLSMAttribStack.pushState(StateSet.CULL);
if (cull0) {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
} else {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
}
- GLStateManager.popStateTo(dChild);
- GLStateManager.glEndList();
+ GLSMAttribStack.popStateTo(dChild);
+ GLSMDraws.glEndList();
verifyIsEnabled(GL11.GL_CULL_FACE, cull0, "cull enable restored live immediately after the COMPILE_AND_EXECUTE child bracket closes");
- GLStateManager.popStateTo(dParent);
- GLStateManager.glEndList();
+ GLSMAttribStack.popStateTo(dParent);
+ GLSMDraws.glEndList();
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after balanced nested bracket");
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after balanced nested bracket");
assertEquals(2, commandCounts(parent).getOrDefault(GLCommand.COMPLEX_REF, 0), "parent list records exactly the BLEND push and pop");
assertEquals(2, commandCounts(child).getOrDefault(GLCommand.COMPLEX_REF, 0), "child list records exactly the CULL push and pop");
}
@Test
void unbalancedBracketIsClosedAtEndList() {
- GLStateManager.enableBlend();
- final boolean blend0 = GLStateManager.glIsEnabled(GL11.GL_BLEND);
- final int depth0 = GLStateManager.getAttribDepth();
+ GLSMBlend.enableBlend();
+ final boolean blend0 = GLSMEnable.glIsEnabled(GL11.GL_BLEND);
+ final int depth0 = GLSMAttribStack.getAttribDepth();
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.pushState(StateSet.BATCH);
- GLStateManager.disableBlend();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMAttribStack.pushState(StateSet.BATCH);
+ GLSMBlend.disableBlend();
+ GLSMDraws.glEndList();
assertEquals(2, commandCounts(list).getOrDefault(GLCommand.COMPLEX_REF, 0), "glEndList closes the unbalanced push, recording a matching pop");
- GLStateManager.glCallList(list);
- assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after replaying an auto-closed bracket");
+ GLSMDraws.glCallList(list);
+ assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after replaying an auto-closed bracket");
verifyIsEnabled(GL11.GL_BLEND, blend0, "blend enable unchanged after replaying an auto-closed bracket");
final int other = newList();
assertDoesNotThrow(() -> {
- GLStateManager.glNewList(other, GL11.GL_COMPILE);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(other, GL11.GL_COMPILE);
+ GLSMDraws.glEndList();
}, "an unrelated list must compile normally after an auto-closed bracket");
}
@Test
void glPushAttribRecordsExactlyOnce() {
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glPopAttrib();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPopAttrib();
+ GLSMDraws.glEndList();
final Int2IntMap counts = commandCounts(list);
assertEquals(1, counts.getOrDefault(GLCommand.PUSH_ATTRIB, 0), "glPushAttrib records exactly one PUSH_ATTRIB opcode");
@@ -245,50 +245,50 @@ public class GLSM_DisplayList_StateSet_GLTest {
@Test
void livePushStraddlesOpenList() {
- GLStateManager.enableBlend();
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.disableBlend();
+ GLSMBlend.enableBlend();
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.disableBlend();
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glEndList();
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(d, GLStateManager.getAttribDepth(), "live attrib depth restored to the pre-bracket value");
+ assertEquals(d, GLSMAttribStack.getAttribDepth(), "live attrib depth restored to the pre-bracket value");
verifyIsEnabled(GL11.GL_BLEND, true, "blend enable restored by the live pop that straddled the open-then-closed list");
}
@Test
void livePopInsideOpenListPopsLiveAndRecordsNothing() {
- GLStateManager.enableBlend();
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.disableBlend();
+ GLSMBlend.enableBlend();
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.disableBlend();
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.popStateTo(d);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMAttribStack.popStateTo(d);
+ GLSMDraws.glEndList();
- assertEquals(d, GLStateManager.getAttribDepth(), "live attrib depth restored by the live pop performed inside the open list");
+ assertEquals(d, GLSMAttribStack.getAttribDepth(), "live attrib depth restored by the live pop performed inside the open list");
verifyIsEnabled(GL11.GL_BLEND, true, "blend enable restored live by the pop of a pre-list push");
assertEquals(0, commandCounts(list).getOrDefault(GLCommand.COMPLEX_REF, 0), "popping a pre-existing live push records nothing into the list");
}
@Test
void virtualDepthOverflowThrowsAtRecordTime() {
- final int startDepth = GLStateManager.getAttribDepth();
+ final int startDepth = GLSMAttribStack.getAttribDepth();
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
final int pushes = GLStateManager.MAX_ATTRIB_STACK_DEPTH - startDepth;
for (int i = 0; i < pushes; i++) {
- GLStateManager.pushState(StateSet.CUTOUT);
+ GLSMAttribStack.pushState(StateSet.CUTOUT);
}
- assertThrows(IllegalStateException.class, () -> GLStateManager.pushState(StateSet.CUTOUT), "virtual depth overflow beyond MAX_ATTRIB_STACK_DEPTH must throw at record time");
+ assertThrows(IllegalStateException.class, () -> GLSMAttribStack.pushState(StateSet.CUTOUT), "virtual depth overflow beyond MAX_ATTRIB_STACK_DEPTH must throw at record time");
DisplayListManager.abortCompilation();
- assertEquals(startDepth, GLStateManager.getAttribDepth(), "aborting the overflowed compilation leaves live attrib depth untouched");
+ assertEquals(startDepth, GLSMAttribStack.getAttribDepth(), "aborting the overflowed compilation leaves live attrib depth untouched");
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java
index 66b802891..9636941e5 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java
@@ -33,11 +33,11 @@ class GLSM_DisplayList_Stress_Test {
void cleanup() {
for (int list : testLists) {
if (list > 0) {
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
testLists.clear();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
}
private int createAndTrackList() {
@@ -53,12 +53,12 @@ class GLSM_DisplayList_Stress_Test {
for (int i = 0; i < numLists; i++) {
int list = createAndTrackList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
// Each list has a unique transform
- GLStateManager.glTranslatef(i * 0.1f, 0, 0);
+ GLSMMatrices.glTranslatef(i * 0.1f, 0, 0);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify each list was compiled
assertTrue(DisplayListManager.displayListExists(list),
@@ -78,20 +78,20 @@ class GLSM_DisplayList_Stress_Test {
final int numTransforms = 1000;
int list = createAndTrackList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
// Many push/pop pairs with transforms
for (int i = 0; i < numTransforms; i++) {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(i * 0.001f, 0, 0);
- GLStateManager.glRotatef(i * 0.36f, 0, 1, 0);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(i * 0.001f, 0, 0);
+ GLSMMatrices.glRotatef(i * 0.36f, 0, 1, 0);
+ GLSMMatrices.glPopMatrix();
}
// Final transform that should be the result
- GLStateManager.glTranslatef(42.0f, 0, 0);
+ GLSMMatrices.glTranslatef(42.0f, 0, 0);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(42.0f, modelviewAfterCall(list).get(12), 0.0001f, "After many push/pop pairs, only final transform should remain");
}
@@ -104,12 +104,12 @@ class GLSM_DisplayList_Stress_Test {
for (int cycle = 0; cycle < cycles; cycle++) {
int list = GL11.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(cycle, 0, 0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(cycle, 0, 0);
+ GLSMDraws.glEndList();
// Immediately delete
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
// Verify it's gone
assertFalse(DisplayListManager.displayListExists(list),
@@ -126,16 +126,16 @@ class GLSM_DisplayList_Stress_Test {
// Create from innermost to outermost
for (int i = 0; i < chainLength; i++) {
chain[i] = createAndTrackList();
- GLStateManager.glNewList(chain[i], GL11.GL_COMPILE);
+ GLSMDraws.glNewList(chain[i], GL11.GL_COMPILE);
// Each list translates by 1 and calls the previous list (if any)
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
if (i > 0) {
- GLStateManager.glCallList(chain[i - 1]);
+ GLSMDraws.glCallList(chain[i - 1]);
}
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
assertModelviewAfterCall(chain[chainLength - 1], new Matrix4f().translate(chainLength, 0.0f, 0.0f), "chain of " + chainLength + " lists");
@@ -145,24 +145,24 @@ class GLSM_DisplayList_Stress_Test {
void testManyPushPopOperations() {
// Stress test push/pop stack operations
int list = createAndTrackList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
// Go deep into the stack
final int stackDepth = 30; // GL minimum is 32
for (int i = 0; i < stackDepth; i++) {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
}
// Pop all the way back
for (int i = 0; i < stackDepth; i++) {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
// Add final known transform
- GLStateManager.glTranslatef(99.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(99.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(99.0f, modelviewAfterCall(list).get(12), 0.0001f, "After balanced push/pop, only final transform should remain");
}
@@ -176,9 +176,9 @@ class GLSM_DisplayList_Stress_Test {
// Create all lists with unique transforms
for (int i = 0; i < numLists; i++) {
lists[i] = createAndTrackList();
- GLStateManager.glNewList(lists[i], GL11.GL_COMPILE);
- GLStateManager.glTranslatef(i + 1, 0, 0); // List i translates by (i+1)
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(lists[i], GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(i + 1, 0, 0); // List i translates by (i+1)
+ GLSMDraws.glEndList();
}
// Rapidly switch between calling different lists
@@ -195,16 +195,16 @@ class GLSM_DisplayList_Stress_Test {
int list = createAndTrackList();
// First compilation
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f);
+ GLSMDraws.glEndList();
assertEquals(5.0f, modelviewAfterCall(list).get(12), 0.0001f, "First compilation should translate by 5");
// Recompile with different transform
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f);
+ GLSMDraws.glEndList();
assertEquals(10.0f, modelviewAfterCall(list).get(12), 0.0001f, "Recompilation should translate by 10");
}
@@ -213,23 +213,23 @@ class GLSM_DisplayList_Stress_Test {
void testComplexTransformSequence() {
// Test a complex sequence of transforms that could expose numerical issues
int list = createAndTrackList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
// Apply transforms that together should result in a known value
- GLStateManager.glTranslatef(100.0f, 0.0f, 0.0f);
- GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glTranslatef(50.0f, 0.0f, 0.0f); // This goes in Y direction after rotate
- GLStateManager.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); // Cancel the rotation
- GLStateManager.glTranslatef(25.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(100.0f, 0.0f, 0.0f);
+ GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glTranslatef(50.0f, 0.0f, 0.0f); // This goes in Y direction after rotate
+ GLSMMatrices.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); // Cancel the rotation
+ GLSMMatrices.glTranslatef(25.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glCallList(list);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMDraws.glCallList(list);
FloatBuffer actualBuf = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf);
// Build expected with JOML
Matrix4f expected = new Matrix4f()
@@ -247,6 +247,6 @@ class GLSM_DisplayList_Stress_Test {
String.format("Matrix[%d] mismatch in complex transform", i));
}
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java
index 58550cafa..3765347de 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java
@@ -34,14 +34,14 @@ class GLSM_DisplayList_TransformCollapsing_Test {
@AfterEach
void cleanup() {
if (testList > 0) {
- GLStateManager.glDeleteLists(testList, 1);
+ GLSMDraws.glDeleteLists(testList, 1);
testList = -1;
}
if (nestedList > 0) {
- GLStateManager.glDeleteLists(nestedList, 1);
+ GLSMDraws.glDeleteLists(nestedList, 1);
nestedList = -1;
}
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
}
// ==================== Transform Collapsing Tests ====================
@@ -50,16 +50,16 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testConsecutiveTransformsCollapseToSingleMultMatrix() {
// Multiple consecutive transforms should collapse to one MultMatrix in optimized list
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
// 5 consecutive transforms
- GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f);
- GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glScalef(2.0f, 2.0f, 2.0f);
- GLStateManager.glTranslatef(-0.5f, -0.5f, -0.5f);
- GLStateManager.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f);
+ GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f);
+ GLSMMatrices.glTranslatef(-0.5f, -0.5f, -0.5f);
+ GLSMMatrices.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify optimization: should have collapsed to 1 MultMatrix
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -92,16 +92,16 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testPushPopPreservesStackSemantics() {
// Push/Pop should maintain proper stack semantics with collapsed transforms
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Outer translate
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); // Inner translate (isolated)
- GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glPopMatrix();
- GLStateManager.glTranslatef(0.0f, 3.0f, 0.0f); // After pop
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Outer translate
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); // Inner translate (isolated)
+ GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glTranslatef(0.0f, 3.0f, 0.0f); // After pop
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify optimization: should have Push, Pop, and collapsed MultMatrix commands
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -129,19 +129,19 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testNestedPushPopWithTransforms() {
// Nested push/pop with transforms at each level
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); // Level 0
- GLStateManager.glPushMatrix(); // Enter level 1
- GLStateManager.glTranslatef(2.0f, 0.0f, 0.0f);
- GLStateManager.glPushMatrix(); // Enter level 2
- GLStateManager.glTranslatef(3.0f, 0.0f, 0.0f);
- GLStateManager.glPopMatrix(); // Back to level 1
- GLStateManager.glTranslatef(4.0f, 0.0f, 0.0f); // At level 1
- GLStateManager.glPopMatrix(); // Back to level 0
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); // At level 0
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // Level 0
+ GLSMMatrices.glPushMatrix(); // Enter level 1
+ GLSMMatrices.glTranslatef(2.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix(); // Enter level 2
+ GLSMMatrices.glTranslatef(3.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPopMatrix(); // Back to level 1
+ GLSMMatrices.glTranslatef(4.0f, 0.0f, 0.0f); // At level 1
+ GLSMMatrices.glPopMatrix(); // Back to level 0
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); // At level 0
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify behavioral correctness
final FloatBuffer actualBuf = modelviewAfterCall(testList);
@@ -163,20 +163,20 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testCallListFlushesTransform() {
// Create a nested display list
nestedList = GL11.glGenLists(1);
- GLStateManager.glNewList(nestedList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(100.0f, 0.0f, 0.0f); // Large translate to verify it's applied
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(nestedList, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(100.0f, 0.0f, 0.0f); // Large translate to verify it's applied
+ GLSMDraws.glEndList();
// Create parent list that transforms then calls nested list
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Before CallList
- GLStateManager.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glCallList(nestedList); // Barrier - should flush transforms
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); // After CallList
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Before CallList
+ GLSMMatrices.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ GLSMDraws.glCallList(nestedList); // Barrier - should flush transforms
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // After CallList
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify optimization: MultMatrix should be emitted before CallList
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -209,13 +209,13 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testIdentityTransformNotEmitted() {
// A display list with only identity-equivalent transforms should not emit MultMatrix
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
// These cancel out to identity
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f);
- GLStateManager.glTranslatef(-5.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(-5.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -233,11 +233,11 @@ class GLSM_DisplayList_TransformCollapsing_Test {
static Stream discardedByLoadIdentity() {
return Stream.of(
- Arguments.of("accumulated translate", (Runnable) () -> GLStateManager.glTranslatef(100.0f, 100.0f, 100.0f)),
+ Arguments.of("accumulated translate", (Runnable) () -> GLSMMatrices.glTranslatef(100.0f, 100.0f, 100.0f)),
Arguments.of("loaded matrix", (Runnable) () -> {
final FloatBuffer loadBuf = BufferUtils.createFloatBuffer(16);
new Matrix4f().translate(50.0f, 60.0f, 70.0f).rotate((float) Math.toRadians(45.0f), 1.0f, 1.0f, 0.0f).get(loadBuf);
- GLStateManager.glLoadMatrix(loadBuf);
+ GLSMMatrices.glLoadMatrix(loadBuf);
}));
}
@@ -245,13 +245,13 @@ class GLSM_DisplayList_TransformCollapsing_Test {
@MethodSource("discardedByLoadIdentity")
void testLoadIdentityDiscardsEarlierTransforms(String name, Runnable earlier) {
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
earlier.run();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
final FloatBuffer actualBuf = modelviewAfterCall(testList);
@@ -264,20 +264,20 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testMultMatrixAccumulation() {
// MultMatrix should be accumulated like other transforms
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
// Create a rotation matrix and multiply
Matrix4f rotMatrix = new Matrix4f().rotate((float) Math.toRadians(90.0f), 0.0f, 1.0f, 0.0f);
FloatBuffer rotBuf = BufferUtils.createFloatBuffer(16);
rotMatrix.get(rotBuf);
rotBuf.rewind();
- GLStateManager.glMultMatrix(rotBuf);
+ GLSMMatrices.glMultMatrix(rotBuf);
- GLStateManager.glTranslatef(2.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(2.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify optimization: should collapse to 1 MultMatrix
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -305,10 +305,10 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testLoadMatrixSetsAbsoluteTransform() {
// LoadMatrix should set an absolute matrix, not multiply
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
// First, apply a large transform
- GLStateManager.glTranslatef(100.0f, 200.0f, 300.0f);
+ GLSMMatrices.glTranslatef(100.0f, 200.0f, 300.0f);
// Then load a specific matrix (should replace, not multiply)
Matrix4f loadedMatrix = new Matrix4f()
@@ -317,9 +317,9 @@ class GLSM_DisplayList_TransformCollapsing_Test {
FloatBuffer loadBuf = BufferUtils.createFloatBuffer(16);
loadedMatrix.get(loadBuf);
loadBuf.rewind();
- GLStateManager.glLoadMatrix(loadBuf);
+ GLSMMatrices.glLoadMatrix(loadBuf);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify the LOAD_MATRIX command is present
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -341,7 +341,7 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testLoadMatrixResetsRelativeTransform() {
// After LoadMatrix, subsequent transforms should be relative to the loaded matrix
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
// Load a rotation matrix
Matrix4f loadedMatrix = new Matrix4f()
@@ -349,12 +349,12 @@ class GLSM_DisplayList_TransformCollapsing_Test {
FloatBuffer loadBuf = BufferUtils.createFloatBuffer(16);
loadedMatrix.get(loadBuf);
loadBuf.rewind();
- GLStateManager.glLoadMatrix(loadBuf);
+ GLSMMatrices.glLoadMatrix(loadBuf);
// Then translate - this should be relative to the loaded matrix
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify behavioral correctness
final FloatBuffer actualBuf = modelviewAfterCall(testList);
@@ -368,23 +368,23 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testMultipleLoadMatrixCalls() {
// Multiple LoadMatrix calls should each be recorded
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
// First load
Matrix4f matrix1 = new Matrix4f().translate(10.0f, 0.0f, 0.0f);
FloatBuffer buf1 = BufferUtils.createFloatBuffer(16);
matrix1.get(buf1);
buf1.rewind();
- GLStateManager.glLoadMatrix(buf1);
+ GLSMMatrices.glLoadMatrix(buf1);
// Second load (replaces first)
Matrix4f matrix2 = new Matrix4f().translate(0.0f, 20.0f, 0.0f);
FloatBuffer buf2 = BufferUtils.createFloatBuffer(16);
matrix2.get(buf2);
buf2.rewind();
- GLStateManager.glLoadMatrix(buf2);
+ GLSMMatrices.glLoadMatrix(buf2);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify: final state should be matrix2
final FloatBuffer actualBuf = modelviewAfterCall(testList);
@@ -399,15 +399,15 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testImmediateModeDrawCommandStructure() {
// Verifies MultMatrix emitted before DrawRange, push/pop ordering correct
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glPushMatrix();
- GLStateManager.glScalef(0.25f, 0.25f, 0.25f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glScalef(0.25f, 0.25f, 0.25f);
immediateQuad(2.0f);
- GLStateManager.glPopMatrix();
- GLStateManager.glEndList();
+ GLSMMatrices.glPopMatrix();
+ GLSMDraws.glEndList();
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
assertNotNull(compiled);
@@ -425,14 +425,14 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testImmediateModeDrawMatrixValues() {
// Verifies matrix values correct after playback with translate + scale
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(100.0f, 50.0f, 0.0f);
- GLStateManager.glScalef(0.5f, 0.5f, 1.0f);
+ GLSMMatrices.glTranslatef(100.0f, 50.0f, 0.0f);
+ GLSMMatrices.glScalef(0.5f, 0.5f, 1.0f);
immediateQuad(16.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
// Verify transforms collapsed
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
@@ -457,56 +457,56 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testTransformsAcrossMatrixModeSwitch() {
// Transforms must not leak across matrix mode boundaries
// Compute expected results via GLSM (same path as display list playback)
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
- GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glScalef(2.0f, 2.0f, 2.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glTranslatef(3.0f, 0.0f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glTranslatef(3.0f, 0.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
FloatBuffer expectedMV = BufferUtils.createFloatBuffer(16);
FloatBuffer expectedProj = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedMV);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glGetFloat(GL11.GL_PROJECTION_MATRIX, expectedProj);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedMV);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMQueries.glGetFloat(GL11.GL_PROJECTION_MATRIX, expectedProj);
// Reset and test via display list
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
- GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glScalef(2.0f, 2.0f, 2.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glTranslatef(3.0f, 0.0f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glTranslatef(3.0f, 0.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMDraws.glEndList();
- GLStateManager.glCallList(testList);
+ GLSMDraws.glCallList(testList);
FloatBuffer actualMV = BufferUtils.createFloatBuffer(16);
FloatBuffer actualProj = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualMV);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glGetFloat(GL11.GL_PROJECTION_MATRIX, actualProj);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualMV);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMQueries.glGetFloat(GL11.GL_PROJECTION_MATRIX, actualProj);
for (int i = 0; i < 16; i++) {
assertEquals(expectedMV.get(i), actualMV.get(i), 0.0001f, "MODELVIEW[" + i + "]");
@@ -514,11 +514,11 @@ class GLSM_DisplayList_TransformCollapsing_Test {
}
// Cleanup
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
@Test
@@ -526,24 +526,24 @@ class GLSM_DisplayList_TransformCollapsing_Test {
// State commands between transform and draw must not break transform capture
for (int mode : new int[]{GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) {
if (testList > 0) {
- GLStateManager.glDeleteLists(testList, 1);
+ GLSMDraws.glDeleteLists(testList, 1);
}
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, mode);
+ GLSMDraws.glNewList(testList, mode);
- GLStateManager.glScalef(0.5f, 0.5f, 1.0f);
- GLStateManager.glTranslatef(2, 2, 2);
+ GLSMMatrices.glScalef(0.5f, 0.5f, 1.0f);
+ GLSMMatrices.glTranslatef(2, 2, 2);
// Barrier commands between scale and draw
- GLStateManager.glDepthMask(true);
- GLStateManager.disableLighting();
- GLStateManager.enableTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMLighting.disableLighting();
+ GLSMTextures.enableTexture();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
immediateQuad(1.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
assertNotNull(compiled);
@@ -565,13 +565,13 @@ class GLSM_DisplayList_TransformCollapsing_Test {
@Test
void testRawTessellatorDrawPlaysBackWithTheTransform() {
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glScalef(0.5f, 0.5f, 0.5f);
+ GLSMMatrices.glScalef(0.5f, 0.5f, 0.5f);
rawQuad(1.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
assertNotNull(compiled);
@@ -587,22 +587,22 @@ class GLSM_DisplayList_TransformCollapsing_Test {
void testOptimizerResetsAfterPushMatrix() {
// Optimizer must reset after PUSH_MATRIX to avoid spurious inverse transform emission
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
// T1: transforms before push (collapsed)
- GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f);
- GLStateManager.glScalef(2.0f, 2.0f, 2.0f);
+ GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f);
+ GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
// T2: transforms after push (collapsed separately)
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f);
- GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f);
+ GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
immediateQuad(1.0f);
- GLStateManager.glPopMatrix();
- GLStateManager.glEndList();
+ GLSMMatrices.glPopMatrix();
+ GLSMDraws.glEndList();
CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList);
assertNotNull(compiled);
@@ -649,33 +649,33 @@ class GLSM_DisplayList_TransformCollapsing_Test {
final float tx2 = -1.0f, ty2 = 4.0f, tz2 = 0.5f;
// Execute directly via GLSM
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(tx1, ty1, tz1);
- GLStateManager.glRotatef(angle1, 0.0f, 1.0f, 0.0f); // Y-axis rotation
- GLStateManager.glScalef(sx, sy, sz);
- GLStateManager.glRotatef(angle2, 1.0f, 0.0f, 0.0f); // X-axis rotation
- GLStateManager.glTranslatef(tx2, ty2, tz2);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(tx1, ty1, tz1);
+ GLSMMatrices.glRotatef(angle1, 0.0f, 1.0f, 0.0f); // Y-axis rotation
+ GLSMMatrices.glScalef(sx, sy, sz);
+ GLSMMatrices.glRotatef(angle2, 1.0f, 0.0f, 0.0f); // X-axis rotation
+ GLSMMatrices.glTranslatef(tx2, ty2, tz2);
FloatBuffer expectedBuf = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedBuf);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedBuf);
// Reset and execute via display list
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
testList = GL11.glGenLists(1);
- GLStateManager.glNewList(testList, GL11.GL_COMPILE);
- GLStateManager.glTranslatef(tx1, ty1, tz1);
- GLStateManager.glRotatef(angle1, 0.0f, 1.0f, 0.0f);
- GLStateManager.glScalef(sx, sy, sz);
- GLStateManager.glRotatef(angle2, 1.0f, 0.0f, 0.0f);
- GLStateManager.glTranslatef(tx2, ty2, tz2);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(testList, GL11.GL_COMPILE);
+ GLSMMatrices.glTranslatef(tx1, ty1, tz1);
+ GLSMMatrices.glRotatef(angle1, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glScalef(sx, sy, sz);
+ GLSMMatrices.glRotatef(angle2, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(tx2, ty2, tz2);
+ GLSMDraws.glEndList();
- GLStateManager.glCallList(testList);
+ GLSMDraws.glCallList(testList);
FloatBuffer actualBuf = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf);
// Verify equivalence
for (int i = 0; i < 16; i++) {
@@ -683,6 +683,6 @@ class GLSM_DisplayList_TransformCollapsing_Test {
String.format("Matrix[%d]: collapsed transform must equal sequential execution", i));
}
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
index ab3a51cc0..e32bc9b68 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
@@ -24,7 +24,7 @@ class GLSM_DisplayList_UnitTest {
}
private static double lighting() {
- final boolean enabled = GLStateManager.glIsEnabled(GL11.GL_LIGHTING);
+ final boolean enabled = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING);
verifyState(GL11.GL_LIGHTING, enabled, "driver must agree with the GLSM cache");
return enabled ? 1.0 : 0.0;
}
@@ -37,19 +37,19 @@ class GLSM_DisplayList_UnitTest {
static Stream states() {
return Stream.of(
- state("glEnable(GL_LIGHTING)", () -> GLStateManager.glEnable(GL11.GL_LIGHTING), () -> GLStateManager.glDisable(GL11.GL_LIGHTING),
+ state("glEnable(GL_LIGHTING)", () -> GLSMEnable.glEnable(GL11.GL_LIGHTING), () -> GLSMEnable.glDisable(GL11.GL_LIGHTING),
GLSM_DisplayList_UnitTest::lighting, 1.0),
- state("glCullFace", () -> GLStateManager.glCullFace(GL11.GL_FRONT), () -> GLStateManager.glCullFace(GL11.GL_BACK),
+ state("glCullFace", () -> GLSMRasterizer.glCullFace(GL11.GL_FRONT), () -> GLSMRasterizer.glCullFace(GL11.GL_BACK),
() -> GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), GL11.GL_FRONT),
- state("glLogicOp", () -> GLStateManager.glLogicOp(GL11.GL_XOR), () -> GLStateManager.glLogicOp(GL11.GL_COPY),
+ state("glLogicOp", () -> GLSMBlend.glLogicOp(GL11.GL_XOR), () -> GLSMBlend.glLogicOp(GL11.GL_COPY),
() -> GL11.glGetInteger(GL11.GL_LOGIC_OP_MODE), GL11.GL_XOR),
- state("glClearDepth", () -> GLStateManager.glClearDepth(0.5), () -> GLStateManager.glClearDepth(1.0),
+ state("glClearDepth", () -> GLSMDepthStencilAlpha.glClearDepth(0.5), () -> GLSMDepthStencilAlpha.glClearDepth(1.0),
() -> GL11.glGetDouble(GL11.GL_DEPTH_CLEAR_VALUE), 0.5),
- state("glBlendColor", () -> GLStateManager.glBlendColor(0.5f, 0.4f, 0.6f, 0.8f), () -> GLStateManager.glBlendColor(0f, 0f, 0f, 0f),
+ state("glBlendColor", () -> GLSMBlend.glBlendColor(0.5f, 0.4f, 0.6f, 0.8f), () -> GLSMBlend.glBlendColor(0f, 0f, 0f, 0f),
GLSM_DisplayList_UnitTest::blendColorRed, 0.5),
- state("glFrontFace", () -> GLStateManager.glFrontFace(GL11.GL_CW), () -> GLStateManager.glFrontFace(GL11.GL_CCW),
+ state("glFrontFace", () -> GLSMRasterizer.glFrontFace(GL11.GL_CW), () -> GLSMRasterizer.glFrontFace(GL11.GL_CCW),
() -> GL11.glGetInteger(GL11.GL_FRONT_FACE), GL11.GL_CW),
- state("glHint", () -> GLStateManager.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST), () -> GLStateManager.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_DONT_CARE),
+ state("glHint", () -> GLSMRasterizer.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST), () -> GLSMRasterizer.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_DONT_CARE),
() -> GL11.glGetInteger(GL11.GL_LINE_SMOOTH_HINT), GL11.GL_NICEST));
}
@@ -59,16 +59,16 @@ class GLSM_DisplayList_UnitTest {
final double initial = driver.getAsDouble();
final int list = GL11.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
apply.run();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(initial, driver.getAsDouble(), 0.0001, name + " must not execute under GL_COMPILE");
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(applied, driver.getAsDouble(), 0.0001, name + " must apply when the list is called");
} finally {
reset.run();
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
@@ -77,34 +77,34 @@ class GLSM_DisplayList_UnitTest {
void compileAndExecuteAppliesStateChangeImmediately(String name, Runnable apply, Runnable reset, DoubleSupplier driver, double applied) {
final int list = GL11.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
apply.run();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(applied, driver.getAsDouble(), 0.0001, name + " must apply under GL_COMPILE_AND_EXECUTE");
} finally {
reset.run();
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
@Test
void testMultipleStateChangesInDisplayList() {
int list = GL11.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.glLogicOp(GL11.GL_AND);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMBlend.glLogicOp(GL11.GL_AND);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMDraws.glEndList();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(GL11.GL_FRONT, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "CullFace should be GL_FRONT");
assertEquals(GL11.GL_AND, GL11.glGetInteger(GL11.GL_LOGIC_OP_MODE), "LogicOp should be GL_AND");
verifyState(GL11.GL_LIGHTING, true, "GL_LIGHTING should be enabled");
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glLogicOp(GL11.GL_COPY);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDeleteLists(list, 1);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMBlend.glLogicOp(GL11.GL_COPY);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java
index c0cf59aba..e96f13148 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java
@@ -1,22 +1,16 @@
package com.gtnewhorizons.angelica.glsm;
import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector;
+import com.gtnewhorizons.angelica.glsm.testutil.GlsmClasses;
import org.junit.jupiter.api.Test;
-import org.objectweb.asm.ClassReader;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
-import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UncheckedIOException;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
@@ -25,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
class GLSM_ExitCaptureCoverage_UnitTest {
private static final String PACKAGE = "com/gtnewhorizons/angelica/glsm/";
- private static final String MANAGER = PACKAGE + "GLStateManager";
private static final String RENDER_SYSTEM = PACKAGE + "RenderSystem";
private static final String CAPTURE = PACKAGE + "ExitStateCapture";
@@ -45,7 +38,6 @@ class GLSM_ExitCaptureCoverage_UnitTest {
// Others
"glInitNames", "glPushName", "glPopName", "glLoadName", "isFramebufferEnabled", "gluUnProject", "gluErrorString");
- private final Map classes = new HashMap<>();
private final Set reaching = new HashSet<>();
private final Set notReaching = new HashSet<>();
private Set counted = RECORDING;
@@ -54,7 +46,11 @@ class GLSM_ExitCaptureCoverage_UnitTest {
void everyEntryPointRejectsOrRecordsTheExitCapture() {
final Set entryPoints = new HashSet<>(GLSMRedirector.getGLPrefixMethodRedirects().values());
GLSMRedirector.getNamedClassMethodRedirects().values().forEach(redirects -> entryPoints.addAll(redirects.values()));
- final List missing = missing(MANAGER, name -> name.startsWith("gl") || entryPoints.contains(name), method -> reachesCapture(MANAGER, method));
+ final List missing = new ArrayList<>();
+ for (String owner : GlsmClasses.classes()) {
+ missing.addAll(missing(owner, name -> name.startsWith("gl") || entryPoints.contains(name), method -> reachesCapture(owner, method)));
+ }
+ missing.sort(null);
assertTrue(missing.isEmpty(), "Entry points that neither reject nor record an exit capture:\n " + String.join("\n ", missing));
}
@@ -66,13 +62,13 @@ class GLSM_ExitCaptureCoverage_UnitTest {
final List missing = missing(RENDER_SYSTEM, name -> !name.equals("initRenderer") && !name.equals("getVRAM")
&& !name.matches("(supports|has|is|getMax|getGl|parse|probe).*"), method -> reachesCapture(RENDER_SYSTEM, method)
&& (!calls(method, owner -> owner.startsWith(PACKAGE + "backend/") || owner.startsWith(PACKAGE + "dsa/"))
- || calls(method, owner -> owner.equals(MANAGER), "rejectExitCapture", "beforeUncapturedStateChange")));
+ || calls(method, GlsmClasses.classes()::contains, "rejectExitCapture", "beforeUncapturedStateChange")));
assertTrue(missing.isEmpty(), "RenderSystem methods that do not reject an exit capture:\n " + String.join("\n ", missing));
}
private List missing(String owner, Predicate checked, Predicate covered) {
final List missing = new ArrayList<>();
- for (MethodNode method : load(owner).methods) {
+ for (MethodNode method : GlsmClasses.load(owner).methods) {
if ((method.access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC)) != (Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC)) continue;
if ((method.access & Opcodes.ACC_SYNTHETIC) != 0) continue;
if (!checked.test(method.name) || IGNORED.contains(method.name)) continue;
@@ -114,38 +110,9 @@ class GLSM_ExitCaptureCoverage_UnitTest {
continue;
}
if (!call.owner.startsWith(PACKAGE)) continue;
- final String[] declaring = new String[1];
- final MethodNode target = resolve(call.owner, call.name, call.desc, declaring);
- if (target != null && search(declaring[0], target, visited)) return true;
+ final GlsmClasses.Resolved target = GlsmClasses.resolve(call.owner, call.name, call.desc);
+ if (target != null && search(target.owner(), target.method(), visited)) return true;
}
return false;
}
-
- private MethodNode resolve(String owner, String name, String desc, String[] declaring) {
- for (String type = owner; type != null && type.startsWith(PACKAGE); ) {
- final ClassNode node = load(type);
- for (MethodNode method : node.methods) {
- if (method.name.equals(name) && method.desc.equals(desc)) {
- if (method.instructions.size() == 0) return null;
- declaring[0] = type;
- return method;
- }
- }
- type = node.superName;
- }
- return null;
- }
-
- private ClassNode load(String internalName) {
- return classes.computeIfAbsent(internalName, name -> {
- try (InputStream in = GLSM_ExitCaptureCoverage_UnitTest.class.getClassLoader().getResourceAsStream(name + ".class")) {
- if (in == null) throw new IllegalStateException("Missing class file for " + name);
- final ClassNode node = new ClassNode();
- new ClassReader(in).accept(node, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
- return node;
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
- });
- }
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java
index 278819366..3322ccd0a 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java
@@ -51,166 +51,166 @@ class GLSM_ExitState_GLTest {
extendedHandler = GLSMHooks.immediateExtendedHandler;
blendHandler = GLSMHooks.blendHandler;
clientActiveUnit = context.clientActiveTextureUnit;
- outer = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.setTextureMatrix(0, new Matrix4f());
- GLStateManager.glColor4f(1, 1, 1, 1);
- GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
- GLStateManager.disableColorMaterial();
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(2, 3);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ outer = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.setTextureMatrix(0, new Matrix4f());
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMLighting.disableColorMaterial();
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(2, 3);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
}
@AfterEach
void tearDown() {
GLStateManager.cancelExitCapture();
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + clientActiveUnit);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + clientActiveUnit);
GLSMHooks.blendHandler = blendHandler;
GLSMHooks.immediateExtendedHandler = extendedHandler;
- GLStateManager.getBlendMode().setVanillaLayer(null);
- GLStateManager.getBlendState().setVanillaLayer(null);
- GLStateManager.setModelViewMatrix(modelView);
- GLStateManager.setProjectionMatrix(projection);
- GLStateManager.setTextureMatrix(0, texture);
- GLStateManager.setOverlayColor(overlay.x, overlay.y, overlay.z, overlay.w);
- GLStateManager.setShaderColor(shaderColor.x, shaderColor.y, shaderColor.z, shaderColor.w);
- GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, lightmapX, lightmapY);
- GLStateManager.popStateTo(outer);
+ GLSMBlend.getBlendMode().setVanillaLayer(null);
+ GLSMBlend.getBlendState().setVanillaLayer(null);
+ GLSMMatrices.setModelViewMatrix(modelView);
+ GLSMMatrices.setProjectionMatrix(projection);
+ GLSMMatrices.setTextureMatrix(0, texture);
+ GLSMCurrentAttribs.setOverlayColor(overlay.x, overlay.y, overlay.z, overlay.w);
+ GLSMCurrentAttribs.setShaderColor(shaderColor.x, shaderColor.y, shaderColor.z, shaderColor.w);
+ GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, lightmapX, lightmapY);
+ GLSMAttribStack.popStateTo(outer);
}
@Test
void unchangedWritesStillApplyAndLeaveOtherPolygonStateAlone() {
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(7, 11);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(7, 11);
assertTrue(GLStateManager.canApplyExitState(state));
GLStateManager.applyExitState(state);
- assertTrue(GLStateManager.getCullState().isEnabled());
- assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode());
- assertTrue(GLStateManager.getPolygonOffsetFillState().isEnabled());
- assertEquals(7, GLStateManager.getPolygonState().getOffsetFactor());
- assertEquals(11, GLStateManager.getPolygonState().getOffsetUnits());
+ assertTrue(GLSMRasterizer.getCullState().isEnabled());
+ assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode());
+ assertTrue(GLSMRasterizer.getPolygonOffsetFillState().isEnabled());
+ assertEquals(7, GLSMRasterizer.getPolygonState().getOffsetFactor());
+ assertEquals(11, GLSMRasterizer.getPolygonState().getOffsetUnits());
}
@Test
void attribPopUndoesTheWritesItRestores() {
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
assertEquals(ExitState.POLYGON_OFFSET_ENABLE_WRITTEN, GLStateManager.getExitPolygonOffsetWrites());
- GLStateManager.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_CURRENT_BIT);
- GLStateManager.glPolygonOffset(5, 6);
- GLStateManager.disableCull();
- GLStateManager.glColor4f(0, 0, 0, 1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_CURRENT_BIT);
+ GLSMRasterizer.glPolygonOffset(5, 6);
+ GLSMRasterizer.disableCull();
+ GLSMCurrentAttribs.glColor4f(0, 0, 0, 1);
assertEquals(3, GLStateManager.getExitPolygonOffsetWrites());
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
assertEquals(ExitState.POLYGON_OFFSET_ENABLE_WRITTEN, GLStateManager.getExitPolygonOffsetWrites());
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.disableCull();
- GLStateManager.glColor4f(0.25F, 0.5F, 0.75F, 1);
- GLStateManager.glPolygonOffset(8, 9);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.disableCull();
+ GLSMCurrentAttribs.glColor4f(0.25F, 0.5F, 0.75F, 1);
+ GLSMRasterizer.glPolygonOffset(8, 9);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
GLStateManager.applyExitState(state);
- assertFalse(GLStateManager.getCullState().isEnabled());
- assertEquals(0.25F, GLStateManager.getColor().getRed());
- assertEquals(8, GLStateManager.getPolygonState().getOffsetFactor());
- assertTrue(GLStateManager.getPolygonOffsetFillState().isEnabled());
+ assertFalse(GLSMRasterizer.getCullState().isEnabled());
+ assertEquals(0.25F, GLSMCurrentAttribs.getColor().getRed());
+ assertEquals(8, GLSMRasterizer.getPolygonState().getOffsetFactor());
+ assertTrue(GLSMRasterizer.getPolygonOffsetFillState().isEnabled());
}
@ParameterizedTest
@ValueSource(booleans = {false, true})
void drawsDependOnTheAlphaFunctionOnlyWhenTheyReadItFromState(boolean materialFromState) {
- GLStateManager.enableAlphaTest();
+ GLSMDepthStencilAlpha.enableAlphaTest();
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glColor4f(1, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
GLStateManager.requireExitDrawState(materialFromState);
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glColor4f(0, 0, 0, 1);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.6F);
+ GLSMCurrentAttribs.glColor4f(0, 0, 0, 1);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.6F);
assertEquals(!materialFromState, GLStateManager.canApplyExitState(state));
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
assertTrue(GLStateManager.canApplyExitState(state));
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
assertFalse(GLStateManager.canApplyExitState(state));
}
@ParameterizedTest
@ValueSource(ints = {0, 1, 2})
void blendAndAlphaFunctionsMatterOnlyToDrawsWithThemEnabled(int mode) {
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
GLStateManager.requireExitDrawState(true);
if (mode != 0) {
if (mode == 2) {
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
}
- GLStateManager.enableBlend();
- GLStateManager.enableAlphaTest();
+ GLSMBlend.enableBlend();
+ GLSMDepthStencilAlpha.enableAlphaTest();
GLStateManager.requireExitDrawState(true);
}
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
assertEquals(mode != 1, GLStateManager.canApplyExitState(state));
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5F);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5F);
assertEquals(mode != 1, GLStateManager.canApplyExitState(state));
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
assertTrue(GLStateManager.canApplyExitState(state));
}
@Test
void settingTheClientTextureUnitToItsCurrentValueIsStillRecorded() {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMAttribStack.glPopAttrib();
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
assertTrue(GLStateManager.canApplyExitState(state));
GLStateManager.applyExitState(state);
- assertEquals(0, GLStateManager.getClientActiveTextureUnit());
+ assertEquals(0, GLSMTextures.getClientActiveTextureUnit());
GLStateManager.beginExitCapture(state);
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
GLStateManager.applyExitState(state);
- assertEquals(1, GLStateManager.getClientActiveTextureUnit());
+ assertEquals(1, GLSMTextures.getClientActiveTextureUnit());
}
@Test
void drawAfterAnAttribPopDependsOnTheOriginalCullState() {
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.disableCull();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMRasterizer.disableCull();
GLStateManager.requireExitDrawState(false);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
GLStateManager.requireExitDrawState(false);
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
assertFalse(GLStateManager.canApplyExitState(state));
}
@@ -219,23 +219,23 @@ class GLSM_ExitState_GLTest {
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
assertFalse(GLStateManager.isExitLightingWritten());
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.enableLighting();
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.enableLighting();
assertTrue(GLStateManager.isExitLightingWritten());
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
assertFalse(GLStateManager.isExitLightingWritten());
GLStateManager.requireExitDrawState(false);
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.getLightingState().setEnabled(!GLStateManager.getLightingState().isEnabled());
- GLStateManager.getNormalizeState().setEnabled(!GLStateManager.getNormalizeState().isEnabled());
- GLStateManager.getRescaleNormalState().setEnabled(!GLStateManager.getRescaleNormalState().isEnabled());
- GLStateManager.getLightStates()[0].setEnabled(!GLStateManager.getLightStates()[0].isEnabled());
- GLStateManager.getLightStates()[1].setEnabled(!GLStateManager.getLightStates()[1].isEnabled());
- GLStateManager.glShadeModel(GLStateManager.getShadeModelState().getValue() == GL11.GL_FLAT ? GL11.GL_SMOOTH : GL11.GL_FLAT);
- GLStateManager.setShaderColor(0.1F, 0.2F, 0.3F, 0.4F);
- GLStateManager.glNormal3f(0.5F, 0.25F, 0.75F);
- GLStateManager.glTexCoord2f(0.75F, 0.25F);
+ GLSMLighting.getLightingState().setEnabled(!GLSMLighting.getLightingState().isEnabled());
+ GLSMLighting.getNormalizeState().setEnabled(!GLSMLighting.getNormalizeState().isEnabled());
+ GLSMLighting.getRescaleNormalState().setEnabled(!GLSMLighting.getRescaleNormalState().isEnabled());
+ GLSMLighting.getLightStates()[0].setEnabled(!GLSMLighting.getLightStates()[0].isEnabled());
+ GLSMLighting.getLightStates()[1].setEnabled(!GLSMLighting.getLightStates()[1].isEnabled());
+ GLSMRasterizer.glShadeModel(GLSMRasterizer.getShadeModelState().getValue() == GL11.GL_FLAT ? GL11.GL_SMOOTH : GL11.GL_FLAT);
+ GLSMCurrentAttribs.setShaderColor(0.1F, 0.2F, 0.3F, 0.4F);
+ GLSMCurrentAttribs.glNormal3f(0.5F, 0.25F, 0.75F);
+ GLSMCurrentAttribs.glTexCoord2f(0.75F, 0.25F);
assertTrue(GLStateManager.canApplyExitState(state));
}
@@ -250,8 +250,8 @@ class GLSM_ExitState_GLTest {
tess.hasTexture = mode != 2;
tess.hasColor = tess.hasBrightness = true;
GLSMHooks.immediateExtendedHandler = mode == 3 ? new FaceNormals() : null;
- GLStateManager.glNormal3f(0, 1, 0);
- GLStateManager.glTexCoord2f(0.25F, 0.5F);
+ GLSMCurrentAttribs.glNormal3f(0, 1, 0);
+ GLSMCurrentAttribs.glTexCoord2f(0.25F, 0.5F);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
TessellatorStreamingDrawer.fillMissingAttributes(tess);
@@ -259,45 +259,45 @@ class GLSM_ExitState_GLTest {
if (mode == 1) assertEquals(0x7F00, tess.rawBuffer[6]);
if (mode == 2) assertEquals(Float.floatToRawIntBits(0.25F), tess.rawBuffer[3]);
if (mode == 3) assertEquals(0x7F, tess.rawBuffer[6]);
- GLStateManager.glNormal3f(1, 0, 0);
- GLStateManager.glTexCoord2f(0.75F, 0.5F);
+ GLSMCurrentAttribs.glNormal3f(1, 0, 0);
+ GLSMCurrentAttribs.glTexCoord2f(0.75F, 0.5F);
assertEquals(mode == 0 || mode == 3, GLStateManager.canApplyExitState(state));
}
@ParameterizedTest
@ValueSource(booleans = {false, true})
void deletingTheBoundTextureBlocksApplyingEvenIfTheCaptureUnboundIt(boolean explicitlyUnbound) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- if (explicitlyUnbound) GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ if (explicitlyUnbound) GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
assertTrue(GLStateManager.finishExitCapture(state));
assertTrue(GLStateManager.canApplyExitState(state));
- GLStateManager.glDeleteTextures(id);
+ GLSMTextures.glDeleteTextures(id);
assertFalse(GLStateManager.canApplyExitState(state));
}
@ParameterizedTest
@ValueSource(booleans = {false, true})
void textureMatrixMustMatchOnlyWhenTheCaptureMultipliedOntoIt(boolean absolute) {
- GLStateManager.setTextureMatrix(0, new Matrix4f().translation(1, 2, 0));
+ GLSMMatrices.setTextureMatrix(0, new Matrix4f().translation(1, 2, 0));
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPushMatrix();
- if (absolute) GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(3, 4, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPushMatrix();
+ if (absolute) GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(3, 4, 0);
GLStateManager.requireExitDrawState(false);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertTrue(GLStateManager.finishExitCapture(state));
final Matrix4f mainTexture = new Matrix4f().translation(8, 9, 0);
- GLStateManager.setTextureMatrix(0, mainTexture);
+ GLSMMatrices.setTextureMatrix(0, mainTexture);
assertEquals(absolute, GLStateManager.canApplyExitState(state));
if (absolute) {
GLStateManager.applyExitState(state);
- assertEquals(mainTexture, GLStateManager.getTextures().getTextureUnitMatrix(0));
+ assertEquals(mainTexture, GLSMTextures.getTextures().getTextureUnitMatrix(0));
}
}
@@ -305,25 +305,25 @@ class GLSM_ExitState_GLTest {
void changedOrUnbalancedViewMatricesReject() {
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glTranslatef(1, 0, 0);
+ GLSMMatrices.glTranslatef(1, 0, 0);
assertFalse(GLStateManager.finishExitCapture(state));
- GLStateManager.setModelViewMatrix(modelView);
+ GLSMMatrices.setModelViewMatrix(modelView);
GLStateManager.beginExitCapture(state);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
assertFalse(GLStateManager.finishExitCapture(state));
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
GLStateManager.beginExitCapture(state);
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(2, 3, 4);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(2, 3, 4);
+ GLSMMatrices.glPopMatrix();
assertTrue(GLStateManager.finishExitCapture(state));
GLStateManager.beginExitCapture(state);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glPopMatrix();
assertFalse(GLStateManager.finishExitCapture(state));
}
@@ -331,17 +331,17 @@ class GLSM_ExitState_GLTest {
@ValueSource(ints = {0, 1, 2, 3, 4, 5})
void untrackedCallsAndStateQueriesReject(int operation) {
final ExitState state = new ExitState();
- final int program = GLStateManager.getActiveProgram();
+ final int program = GLSMPrograms.getActiveProgram();
GLStateManager.beginExitCapture(state);
switch (operation) {
- case 0 -> GLStateManager.glIsEnabled(GL11.GL_CULL_FACE);
- case 1 -> GLStateManager.glGetInteger(GL11.GL_DEPTH_FUNC);
- case 2 -> GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- case 3 -> GLStateManager.glUseProgram(program);
- case 4 -> GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD);
- case 5 -> GLStateManager.fogColor((float) GLStateManager.getFogState().getFogColor().x,
- (float) GLStateManager.getFogState().getFogColor().y, (float) GLStateManager.getFogState().getFogColor().z,
- GLStateManager.getFogState().getFogAlpha());
+ case 0 -> GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE);
+ case 1 -> GLSMQueries.glGetInteger(GL11.GL_DEPTH_FUNC);
+ case 2 -> GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ case 3 -> GLSMPrograms.glUseProgram(program);
+ case 4 -> GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD);
+ case 5 -> GLSMFog.fogColor((float) GLSMFog.getFogState().getFogColor().x,
+ (float) GLSMFog.getFogState().getFogColor().y, (float) GLSMFog.getFogState().getFogColor().z,
+ GLSMFog.getFogState().getFogAlpha());
default -> throw new AssertionError();
}
assertFalse(GLStateManager.finishExitCapture(state));
@@ -354,11 +354,11 @@ class GLSM_ExitState_GLTest {
final boolean suspended = GLStateManager.suspendExitCapture();
try {
assertFalse(GLStateManager.isExitCaptureActive());
- GLStateManager.glIsEnabled(GL11.GL_CULL_FACE);
- GLStateManager.glColor4f(0, 0, 0, 1);
+ GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE);
+ GLSMCurrentAttribs.glColor4f(0, 0, 0, 1);
BatchStateGuard.suspend();
try {
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
} finally {
BatchStateGuard.resume();
}
@@ -368,62 +368,62 @@ class GLSM_ExitState_GLTest {
BatchStateGuard.suspend();
try {
assertFalse(GLStateManager.isExitCaptureActive());
- GLStateManager.glGetInteger(GL11.GL_DEPTH_FUNC);
+ GLSMQueries.glGetInteger(GL11.GL_DEPTH_FUNC);
} finally {
BatchStateGuard.resume();
}
assertTrue(GLStateManager.isExitCaptureActive());
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glColor4f(0.5F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.5F, 1, 1, 1);
GLStateManager.applyExitState(state);
- assertEquals(0.5F, GLStateManager.getColor().getRed());
+ assertEquals(0.5F, GLSMCurrentAttribs.getColor().getRed());
}
@Test
void attribPushedWhileSuspendedRestoresThatCapturesWrites() {
final ExitState earlier = new ExitState();
GLStateManager.beginExitCapture(earlier);
- GLStateManager.glColor4f(0.5F, 1, 1, 1);
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
- GLStateManager.glPopAttrib();
+ GLSMCurrentAttribs.glColor4f(0.5F, 1, 1, 1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMAttribStack.glPopAttrib();
assertTrue(GLStateManager.finishExitCapture(earlier));
- GLStateManager.glColor4f(0.25F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.25F, 1, 1, 1);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
final boolean suspended = GLStateManager.suspendExitCapture();
try {
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
} finally {
GLStateManager.resumeExitCapture(suspended);
}
- GLStateManager.glColor4f(0, 0, 0, 1);
- GLStateManager.glPopAttrib();
+ GLSMCurrentAttribs.glColor4f(0, 0, 0, 1);
+ GLSMAttribStack.glPopAttrib();
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glColor4f(0.75F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.75F, 1, 1, 1);
GLStateManager.applyExitState(state);
- assertEquals(0.75F, GLStateManager.getColor().getRed(), "the pop restored color, so the capture leaves it alone");
+ assertEquals(0.75F, GLSMCurrentAttribs.getColor().getRed(), "the pop restored color, so the capture leaves it alone");
}
@Test
void attribPoppedWhileSuspendedUndoesTheCapturesWrites() {
- GLStateManager.glColor4f(0.25F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.25F, 1, 1, 1);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
- GLStateManager.glColor4f(0, 0, 0, 1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMCurrentAttribs.glColor4f(0, 0, 0, 1);
final boolean suspended = GLStateManager.suspendExitCapture();
try {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
} finally {
GLStateManager.resumeExitCapture(suspended);
}
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glColor4f(0.75F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.75F, 1, 1, 1);
GLStateManager.applyExitState(state);
- assertEquals(0.75F, GLStateManager.getColor().getRed(), "the pop restored color, so the capture leaves it alone");
+ assertEquals(0.75F, GLSMCurrentAttribs.getColor().getRed(), "the pop restored color, so the capture leaves it alone");
}
@Test
@@ -431,93 +431,93 @@ class GLSM_ExitState_GLTest {
final ExitState first = new ExitState();
final ExitState second = new ExitState();
GLStateManager.beginExitCapture(first);
- GLStateManager.glColor4f(0.25F, 1, 1, 1);
- GLStateManager.setOverlayColor(0.1F, 0.2F, 0.3F, 0.4F);
+ GLSMCurrentAttribs.glColor4f(0.25F, 1, 1, 1);
+ GLSMCurrentAttribs.setOverlayColor(0.1F, 0.2F, 0.3F, 0.4F);
assertTrue(GLStateManager.finishExitCapture(first));
GLStateManager.beginExitCapture(second);
- GLStateManager.glColor4f(0.75F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.75F, 1, 1, 1);
assertTrue(GLStateManager.finishExitCapture(second));
GLStateManager.applyExitState(first);
- assertEquals(0.25F, GLStateManager.getColor().getRed());
- assertEquals(0.4F, GLStateManager.getOverlayA());
+ assertEquals(0.25F, GLSMCurrentAttribs.getColor().getRed());
+ assertEquals(0.4F, GLSMCurrentAttribs.getOverlayA());
GLStateManager.applyExitState(second);
- assertEquals(0.75F, GLStateManager.getColor().getRed());
+ assertEquals(0.75F, GLSMCurrentAttribs.getColor().getRed());
first.clear();
assertFalse(GLStateManager.canApplyExitState(first));
GLStateManager.beginExitCapture(first);
assertTrue(GLStateManager.finishExitCapture(first));
- GLStateManager.glColor4f(0.5F, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.5F, 1, 1, 1);
GLStateManager.applyExitState(first);
- assertEquals(0.5F, GLStateManager.getColor().getRed());
+ assertEquals(0.5F, GLSMCurrentAttribs.getColor().getRed());
}
@ParameterizedTest
@ValueSource(booleans = {false, true})
void toggledColorMaterialKeepsItsMaterialWritesUnlessAnAttribPopUndoesThem(boolean scoped) {
- GLStateManager.enableColorMaterial();
- GLStateManager.disableColorMaterial();
+ GLSMLighting.enableColorMaterial();
+ GLSMLighting.disableColorMaterial();
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glColor4f(1, 1, 1, 1);
- if (scoped) GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.enableColorMaterial();
- GLStateManager.disableColorMaterial();
- if (scoped) GLStateManager.glPopAttrib();
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ if (scoped) GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.enableColorMaterial();
+ GLSMLighting.disableColorMaterial();
+ if (scoped) GLSMAttribStack.glPopAttrib();
assertTrue(GLStateManager.finishExitCapture(state));
final var changed = BufferUtils.createFloatBuffer(4);
changed.put(new float[]{0.2F, 0.3F, 0.4F, 1}).flip();
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, changed);
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, changed);
assertTrue(GLStateManager.canApplyExitState(state));
GLStateManager.applyExitState(state);
- assertEquals(scoped ? 0.2F : 1, GLStateManager.getFrontMaterial().ambient.x);
- assertEquals(scoped ? 0.2F : 1, GLStateManager.getBackMaterial().diffuse.x);
- assertFalse(GLStateManager.getColorMaterial().isEnabled());
+ assertEquals(scoped ? 0.2F : 1, GLSMLighting.getFrontMaterial().ambient.x);
+ assertEquals(scoped ? 0.2F : 1, GLSMLighting.getBackMaterial().diffuse.x);
+ assertFalse(GLSMLighting.getColorMaterial().isEnabled());
}
@Test
void colorMaterialSettingsTheCaptureNeverTouchedAreLeftAlone() {
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glColor4f(1, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION);
- GLStateManager.enableColorMaterial();
+ GLSMLighting.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION);
+ GLSMLighting.enableColorMaterial();
assertTrue(GLStateManager.canApplyExitState(state));
GLStateManager.applyExitState(state);
- assertTrue(GLStateManager.getColorMaterial().isEnabled());
- assertEquals(GL11.GL_BACK, GLStateManager.getColorMaterialFace().getValue());
- assertEquals(GL11.GL_EMISSION, GLStateManager.getColorMaterialParameter().getValue());
+ assertTrue(GLSMLighting.getColorMaterial().isEnabled());
+ assertEquals(GL11.GL_BACK, GLSMLighting.getColorMaterialFace().getValue());
+ assertEquals(GL11.GL_EMISSION, GLSMLighting.getColorMaterialParameter().getValue());
}
@ParameterizedTest
@ValueSource(booleans = {false, true})
void colorMaterialFaceMustMatchOnlyWhenTheCaptureDidNotSetIt(boolean establishesContext) {
- GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.glColor4f(1, 1, 1, 1);
- if (establishesContext) GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE);
- GLStateManager.enableColorMaterial();
- GLStateManager.disableColorMaterial();
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ if (establishesContext) GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE);
+ GLSMLighting.enableColorMaterial();
+ GLSMLighting.disableColorMaterial();
assertTrue(GLStateManager.finishExitCapture(state));
- GLStateManager.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION);
+ GLSMLighting.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION);
assertEquals(establishesContext, GLStateManager.canApplyExitState(state));
}
@Test
void writesUnderALockedIrisOverrideRecordAndApplyTheVanillaValues() {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.getBlendMode().beforeModify();
- GLStateManager.getBlendState().beforeModify();
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.getBlendMode().beforeModify();
+ GLSMBlend.getBlendState().beforeModify();
final LockedBlend lock = new LockedBlend();
GLSMHooks.blendHandler = lock;
- GLStateManager.getBlendMode().setVanillaLayer(lock);
- GLStateManager.getBlendState().setVanillaLayer(lock);
+ GLSMBlend.getBlendMode().setVanillaLayer(lock);
+ GLSMBlend.getBlendState().setVanillaLayer(lock);
final ExitState state = new ExitState();
GLStateManager.beginExitCapture(state);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
assertTrue(GLStateManager.finishExitCapture(state));
lock.enabled = false;
lock.blend.setAll(GL11.GL_DST_COLOR, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE);
@@ -525,9 +525,9 @@ class GLSM_ExitState_GLTest {
GLStateManager.applyExitState(state);
assertTrue(lock.enabled);
assertEquals(GL11.GL_SRC_ALPHA, lock.blend.getSrcRgb());
- assertFalse(GLStateManager.getBlendMode().isEnabled());
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb());
- assertEquals(GL11.GL_ZERO, GLStateManager.getBlendState().getDstRgb());
+ assertFalse(GLSMBlend.getBlendMode().isEnabled());
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb());
+ assertEquals(GL11.GL_ZERO, GLSMBlend.getBlendState().getDstRgb());
}
private static final class LockedBlend implements DeferredBlendHandler, VanillaBooleanLayer, VanillaStateLayer {
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java
index d3150231b..a138a4b29 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java
@@ -24,23 +24,23 @@ class GLSM_ExitTextureFilter_GLTest {
@BeforeEach
void setUp() {
- outer = GLStateManager.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- texture = GLStateManager.glGenTextures();
- otherTexture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ outer = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ texture = GLSMTextures.glGenTextures();
+ otherTexture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
}
@AfterEach
void tearDown() {
GLStateManager.cancelExitCapture();
TextureUtilHooks.clearSavedFilterTexture();
- GLStateManager.glDeleteTextures(texture);
- GLStateManager.glDeleteTextures(otherTexture);
- GLStateManager.popStateTo(outer);
+ GLSMTextures.glDeleteTextures(texture);
+ GLSMTextures.glDeleteTextures(otherTexture);
+ GLSMAttribStack.popStateTo(outer);
}
@Test
@@ -56,8 +56,8 @@ class GLSM_ExitTextureFilter_GLTest {
assertFilters(GL11.GL_LINEAR_MIPMAP_LINEAR, GL11.GL_LINEAR);
assertEquals(0, GLStateManager.ctx().savedFilterTextureId);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
assertTrue(GLStateManager.canApplyExitState(state));
GLStateManager.applyExitState(state);
assertFilters(GL11.GL_LINEAR, GL11.GL_NEAREST);
@@ -91,9 +91,9 @@ class GLSM_ExitTextureFilter_GLTest {
GLStateManager.beginExitCapture(state);
save(false, false, 1);
switch (operation) {
- case 0 -> GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
- case 1 -> GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- case 2 -> GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ case 0 -> GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ case 1 -> GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ case 2 -> GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
default -> throw new AssertionError();
}
restore();
@@ -168,14 +168,14 @@ class GLSM_ExitTextureFilter_GLTest {
private boolean save(boolean blurred, boolean mipmap, float aniso) {
final boolean captured = TextureUtilHooks.beginFilterSave(blurred, mipmap, aniso);
try {
- savedMin = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
- savedMag = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER);
- savedAniso = GLStateManager.glGetTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
+ savedMin = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ savedMag = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER);
+ savedAniso = GLSMTextures.glGetTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
blurred ? (mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_LINEAR)
: (mipmap ? GL11.GL_NEAREST_MIPMAP_LINEAR : GL11.GL_NEAREST));
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, blurred ? GL11.GL_LINEAR : GL11.GL_NEAREST);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, blurred ? GL11.GL_LINEAR : GL11.GL_NEAREST);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
if (failOperation) throw new IllegalStateException("filter save failed");
} catch (RuntimeException | Error failure) {
TextureUtilHooks.filterFailed(captured);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
index 9dff72f92..f61620ba4 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
@@ -39,27 +39,27 @@ public class GLSM_GLU_UnitTest {
@Test
void gluPerspective_accumulates() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glScalef(2.0f, 1.0f, 1.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glScalef(2.0f, 1.0f, 1.0f);
- GLStateManager.gluPerspective(90.0f, 1.0f, 1.0f, 100.0f);
+ GLSMMatrices.gluPerspective(90.0f, 1.0f, 1.0f, 100.0f);
Matrix4f expected = new Matrix4f()
.scale(2.0f, 1.0f, 1.0f)
.perspective((float) Math.toRadians(90.0f), 1.0f, 1.0f, 100.0f);
assertMatrixEquals(expected, getProjectionMatrix(), "gluPerspective after scale");
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
@Test
void gluLookAt_accumulates() {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f);
- GLStateManager.gluLookAt(
+ GLSMMatrices.gluLookAt(
0.0f, 0.0f, 5.0f,
0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f);
@@ -74,15 +74,15 @@ public class GLSM_GLU_UnitTest {
@Test
void gluOrtho2D_matchesJOML() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
- GLStateManager.gluOrtho2D(0.0f, 800.0f, 0.0f, 600.0f);
+ GLSMMatrices.gluOrtho2D(0.0f, 800.0f, 0.0f, 600.0f);
Matrix4f expected = new Matrix4f().ortho(0.0f, 800.0f, 0.0f, 600.0f, -1.0f, 1.0f);
assertMatrixEquals(expected, getProjectionMatrix(), "gluOrtho2D");
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
@ParameterizedTest(name = "{0}")
@@ -91,36 +91,36 @@ public class GLSM_GLU_UnitTest {
"gluPickMatrix off-center viewport, 100, 50, 640, 480, 200, 150, 10",
})
void gluPickMatrix_matchesManual(String label, int vx, int vy, int vw, int vh, float x, float y, float delta) {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
IntBuffer viewport = BufferUtils.createIntBuffer(4);
viewport.put(0, vx).put(1, vy).put(2, vw).put(3, vh);
- GLStateManager.gluPickMatrix(x, y, delta, delta, viewport);
+ GLSMMatrices.gluPickMatrix(x, y, delta, delta, viewport);
Matrix4f expected = new Matrix4f()
.translate((vw - 2 * (x - vx)) / delta, (vh - 2 * (y - vy)) / delta, 0.0f)
.scale(vw / delta, vh / delta, 1.0f);
assertMatrixEquals(expected, getProjectionMatrix(), label);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
@Test
void gluPickMatrix_zeroSize_noOp() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
IntBuffer viewport = BufferUtils.createIntBuffer(4);
viewport.put(0, 0).put(1, 0).put(2, 800).put(3, 600);
- GLStateManager.gluPickMatrix(400.0f, 300.0f, 0.0f, 5.0f, viewport);
+ GLSMMatrices.gluPickMatrix(400.0f, 300.0f, 0.0f, 5.0f, viewport);
// deltaX <= 0 should be a no-op, matrix stays identity
assertMatrixEquals(new Matrix4f(), getProjectionMatrix(), "gluPickMatrix zero deltaX is no-op");
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
static Stream errorStrings() {
@@ -139,7 +139,7 @@ public class GLSM_GLU_UnitTest {
@ParameterizedTest(name = "{1}")
@MethodSource("errorStrings")
void gluErrorString(int code, String expected) {
- assertEquals(expected, GLStateManager.gluErrorString(code));
+ assertEquals(expected, GLSMMatrices.gluErrorString(code));
}
static Stream gluUnProject_roundTrips() {
@@ -167,7 +167,7 @@ public class GLSM_GLU_UnitTest {
viewport.put(0, 0).put(1, 0).put(2, 800).put(3, 600);
FloatBuffer result = BufferUtils.createFloatBuffer(3);
- assertTrue(GLStateManager.gluUnProject(winX, winY, winZ, modelBuf, projBuf, viewport, result), "gluUnProject should succeed");
+ assertTrue(GLSMMatrices.gluUnProject(winX, winY, winZ, modelBuf, projBuf, viewport, result), "gluUnProject should succeed");
assertEquals(0.0f, result.get(0), tolerance, "X should unproject back to 0");
assertEquals(0.0f, result.get(1), tolerance, "Y should unproject back to 0");
assertEquals(0.0f, result.get(2), tolerance, "Z should unproject back to 0");
@@ -186,14 +186,14 @@ public class GLSM_GLU_UnitTest {
viewport.put(0, 0).put(1, 0).put(2, 800).put(3, 600);
FloatBuffer result = BufferUtils.createFloatBuffer(3);
- assertFalse(GLStateManager.gluUnProject(400, 300, 0.5f, model, proj, viewport, result));
+ assertFalse(GLSMMatrices.gluUnProject(400, 300, 0.5f, model, proj, viewport, result));
}
@Test
void gluBuild2DMipmaps_invalidSize() {
- assertEquals(100901, GLStateManager.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 0, 10, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1)));
- assertEquals(100901, GLStateManager.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 10, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1)));
+ assertEquals(100901, GLSMMatrices.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 0, 10, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1)));
+ assertEquals(100901, GLSMMatrices.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 10, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1)));
}
@Test
@@ -205,7 +205,7 @@ public class GLSM_GLU_UnitTest {
for (int i = 0; i < 4 * 4 * 4; i++) pixels.put((byte) 0xFF);
pixels.flip();
- int result = GLStateManager.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 4, 4, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ int result = GLSMMatrices.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 4, 4, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
assertEquals(0, result, "gluBuild2DMipmaps should return 0 on success");
assertEquals(4, GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH));
assertEquals(1, GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 2, GL11.GL_TEXTURE_WIDTH));
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java
new file mode 100644
index 000000000..6443cac51
--- /dev/null
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java
@@ -0,0 +1,126 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector;
+import com.gtnewhorizons.angelica.glsm.testutil.GlsmClasses;
+import org.junit.jupiter.api.Test;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class GLSM_Groups_UnitTest {
+
+ private static final String PACKAGE = "com/gtnewhorizons/angelica/glsm/";
+ private static final String CORE = PACKAGE + "GLStateManager";
+
+ private static boolean counted(int access, String name) {
+ return (access & Opcodes.ACC_SYNTHETIC) == 0 && name.indexOf('$') < 0;
+ }
+
+ private static String simple(String internalName) {
+ return internalName.substring(internalName.lastIndexOf('/') + 1);
+ }
+
+ @Test
+ void memberNamesDeclaredOnce() {
+ final Map> methods = new TreeMap<>();
+ final Map> fields = new TreeMap<>();
+ collect(GlsmClasses.classes(), methods, fields);
+ final List offenders = offenders(methods, fields);
+ assertTrue(offenders.isEmpty(), "Member names declared in more than one class:\n " + String.join("\n ", offenders));
+ }
+
+ private static void collect(Collection classes, Map> methods, Map> fields) {
+ for (String type : classes) {
+ final ClassNode node = GlsmClasses.load(type);
+ for (MethodNode method : node.methods) {
+ if (!counted(method.access, method.name) || method.name.equals("") || method.name.equals("")) continue;
+ methods.computeIfAbsent(method.name, k -> new TreeSet<>()).add(simple(type));
+ }
+ for (FieldNode field : node.fields) {
+ if (!counted(field.access, field.name)) continue;
+ fields.computeIfAbsent(field.name, k -> new TreeSet<>()).add(simple(type));
+ }
+ }
+ }
+
+ private static List offenders(Map> methods, Map> fields) {
+ final List offenders = new ArrayList<>();
+ methods.forEach((name, declaring) -> {
+ if (declaring.size() > 1) offenders.add("method " + name + " declared in " + declaring);
+ });
+ fields.forEach((name, declaring) -> {
+ if (declaring.size() > 1) offenders.add("field " + name + " declared in " + declaring);
+ });
+ return offenders;
+ }
+
+ @Test
+ void staticInitReachesOnlyOwnClassAndCore() {
+ final Set classes = new HashSet<>(GlsmClasses.classes());
+ final List failures = new ArrayList<>();
+ for (String type : classes) {
+ final MethodNode clinit = findMethod(GlsmClasses.load(type), "");
+ if (clinit == null) continue;
+ final Set visited = new HashSet<>();
+ final Deque pending = new ArrayDeque<>();
+ visited.add(type + "." + clinit.desc);
+ pending.add(new GlsmClasses.Resolved(type, clinit));
+ while (!pending.isEmpty()) {
+ final GlsmClasses.Resolved current = pending.poll();
+ final String currentOwner = current.owner();
+ final MethodNode body = current.method();
+ for (AbstractInsnNode insn : body.instructions) {
+ final String owner;
+ final String what;
+ if (insn instanceof MethodInsnNode call) {
+ owner = call.owner;
+ what = call.name;
+ if (owner.startsWith(PACKAGE)) {
+ final GlsmClasses.Resolved target = GlsmClasses.resolve(owner, call.name, call.desc);
+ if (target != null && visited.add(target.owner() + "." + call.name + call.desc)) pending.add(target);
+ }
+ } else if (insn instanceof FieldInsnNode field) {
+ owner = field.owner;
+ what = field.name;
+ } else {
+ continue;
+ }
+ if (!classes.contains(owner) || owner.equals(type)) continue;
+ if (owner.equals(CORE) && !type.equals(CORE)) continue;
+ failures.add(simple(type) + ". via " + simple(currentOwner) + "." + body.name + ": " + simple(owner) + "." + what);
+ }
+ }
+ }
+ assertTrue(failures.isEmpty(), "Static initializers may reach only their own class and GLStateManager:\n " + String.join("\n ", new TreeSet<>(failures)));
+ }
+
+ @Test
+ void classListMatchesPackage() {
+ assertEquals(GlsmClasses.packageClasses(), new TreeSet<>(GLSMRedirector.glsmClasses()));
+ }
+
+ private static MethodNode findMethod(ClassNode node, String name) {
+ for (MethodNode method : node.methods) {
+ if (method.name.equals(name)) return method;
+ }
+ return null;
+ }
+}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java
index c1d559d58..2bd1a9a57 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java
@@ -17,67 +17,67 @@ public class GLSM_HudCacheBlendOverride_GLTest {
}
private static void assertCachedFunc(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) {
- assertEquals(srcRgb, GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_RGB));
- assertEquals(dstRgb, GLStateManager.glGetInteger(GL14.GL_BLEND_DST_RGB));
- assertEquals(srcAlpha, GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_ALPHA));
- assertEquals(dstAlpha, GLStateManager.glGetInteger(GL14.GL_BLEND_DST_ALPHA));
+ assertEquals(srcRgb, GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_RGB));
+ assertEquals(dstRgb, GLSMQueries.glGetInteger(GL14.GL_BLEND_DST_RGB));
+ assertEquals(srcAlpha, GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_ALPHA));
+ assertEquals(dstAlpha, GLSMQueries.glGetInteger(GL14.GL_BLEND_DST_ALPHA));
}
@Test
void overrideChangesTheDriverFuncButNotTheCache() {
try {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.setHudCacheOverride(true);
+ GLSMBlend.setHudCacheOverride(true);
assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_SRC_ALPHA, GL11.GL_ONE);
assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE);
assertCachedFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE);
assertDriverFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.setHudCacheOverride(false);
+ GLSMBlend.setHudCacheOverride(false);
assertCachedFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE);
assertDriverFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE);
} finally {
- GLStateManager.setHudCacheOverride(false);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.setHudCacheOverride(false);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
}
}
@Test
void popUnderOverrideKeepsTheOverriddenAlphaOnTheDriver() {
try {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.setHudCacheOverride(true);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.popStateTo(d);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.setHudCacheOverride(true);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMAttribStack.popStateTo(d);
assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.setHudCacheOverride(false);
+ GLSMBlend.setHudCacheOverride(false);
assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
} finally {
- GLStateManager.setHudCacheOverride(false);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.setHudCacheOverride(false);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
}
}
@Test
void separateAlphaIsForcedEvenWhenDstAlphaAlreadyMatches() {
try {
- GLStateManager.setHudCacheOverride(true);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.setHudCacheOverride(true);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_ALPHA);
assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_ALPHA);
assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
} finally {
- GLStateManager.setHudCacheOverride(false);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.setHudCacheOverride(false);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java
index 59708145c..fe56562ab 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java
@@ -19,24 +19,24 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
public class GLSM_ImageUnitBindingCache_UnitTest {
private static void unbind(int unit) {
- GLStateManager.glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8);
+ GLSMTextures.glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8);
}
@Test
void bindThenQueryReturnsFullTuple() {
final int tex = GL11.glGenTextures();
try {
- GLStateManager.glBindImageTexture(2, tex, 1, false, 3, GL15.GL_READ_ONLY, GL30.GL_RGBA32UI);
+ GLSMTextures.glBindImageTexture(2, tex, 1, false, 3, GL15.GL_READ_ONLY, GL30.GL_RGBA32UI);
- assertEquals(tex, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 2));
- assertEquals(1, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 2));
- assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2));
- assertEquals(3, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2));
- assertEquals(GL15.GL_READ_ONLY, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 2));
- assertEquals(GL30.GL_RGBA32UI, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 2));
+ assertEquals(tex, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 2));
+ assertEquals(1, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 2));
+ assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2));
+ assertEquals(3, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2));
+ assertEquals(GL15.GL_READ_ONLY, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 2));
+ assertEquals(GL30.GL_RGBA32UI, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 2));
} finally {
unbind(2);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
}
@@ -45,24 +45,24 @@ public class GLSM_ImageUnitBindingCache_UnitTest {
final int a = GL11.glGenTextures();
final int b = GL11.glGenTextures();
try {
- GLStateManager.glBindImageTexture(0, a, 2, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI);
- final ImageUnitBinding live = GLStateManager.getImageUnitBinding(0);
+ GLSMTextures.glBindImageTexture(0, a, 2, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI);
+ final ImageUnitBinding live = GLSMTextures.getImageUnitBinding(0);
assertNotNull(live);
final ImageUnitBinding saved = live.copy();
- GLStateManager.glBindImageTexture(0, b, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8);
- assertEquals(b, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
+ GLSMTextures.glBindImageTexture(0, b, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8);
+ assertEquals(b, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
- GLStateManager.glBindImageTexture(0, saved.getTexture(), saved.getLevel(), saved.isLayered(), saved.getLayer(), saved.getAccess(), saved.getFormat());
+ GLSMTextures.glBindImageTexture(0, saved.getTexture(), saved.getLevel(), saved.isLayered(), saved.getLayer(), saved.getAccess(), saved.getFormat());
- assertTrue(saved.sameAs(GLStateManager.getImageUnitBinding(0)), "restore must reproduce every field");
- assertEquals(a, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
- assertEquals(2, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0));
- assertEquals(GL15.GL_READ_WRITE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 0));
+ assertTrue(saved.sameAs(GLSMTextures.getImageUnitBinding(0)), "restore must reproduce every field");
+ assertEquals(a, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
+ assertEquals(2, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0));
+ assertEquals(GL15.GL_READ_WRITE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 0));
} finally {
unbind(0);
- GLStateManager.glDeleteTextures(a);
- GLStateManager.glDeleteTextures(b);
+ GLSMTextures.glDeleteTextures(a);
+ GLSMTextures.glDeleteTextures(b);
}
}
@@ -70,14 +70,14 @@ public class GLSM_ImageUnitBindingCache_UnitTest {
void resetToZeroIsNotARestore() {
final int tex = GL11.glGenTextures();
try {
- GLStateManager.glBindImageTexture(0, tex, 1, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI);
- GLStateManager.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8);
+ GLSMTextures.glBindImageTexture(0, tex, 1, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI);
+ GLSMTextures.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8);
- assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
- assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0));
+ assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
+ assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0));
} finally {
unbind(0);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
}
@@ -85,21 +85,21 @@ public class GLSM_ImageUnitBindingCache_UnitTest {
void deletingTheBoundTextureClearsTheImageUnit() {
final boolean driverHasImages = GLStateManager.capabilities != null && GLStateManager.capabilities.OpenGL42;
final int tex = GL11.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
try {
- GLStateManager.glBindImageTexture(1, tex, 0, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI);
- assertEquals(tex, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1));
+ GLSMTextures.glBindImageTexture(1, tex, 0, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI);
+ assertEquals(tex, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1));
if (driverHasImages) assertEquals(tex, GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1));
- GLStateManager.glDeleteTextures(tex);
- assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), "GL unbinds a deleted texture from every image unit");
+ GLSMTextures.glDeleteTextures(tex);
+ assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), "GL unbinds a deleted texture from every image unit");
if (driverHasImages) assertEquals(0, GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), "driver unbinds a deleted texture from every image unit");
- assertEquals(GL15.GL_READ_ONLY, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1));
- assertEquals(GL30.GL_R8, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1));
+ assertEquals(GL15.GL_READ_ONLY, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1));
+ assertEquals(GL30.GL_R8, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1));
if (driverHasImages) {
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1));
}
} finally {
unbind(1);
@@ -111,18 +111,18 @@ public class GLSM_ImageUnitBindingCache_UnitTest {
final int a = GL11.glGenTextures();
final int b = GL11.glGenTextures();
try {
- GLStateManager.glBindImageTexture(0, a, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
- GLStateManager.glBindImageTexture(3, b, 1, false, 2, GL15.GL_WRITE_ONLY, GL30.GL_RGBA32UI);
+ GLSMTextures.glBindImageTexture(0, a, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
+ GLSMTextures.glBindImageTexture(3, b, 1, false, 2, GL15.GL_WRITE_ONLY, GL30.GL_RGBA32UI);
- assertEquals(a, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
- assertEquals(b, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3));
- assertEquals(GL11.GL_TRUE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 0));
- assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 3));
+ assertEquals(a, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
+ assertEquals(b, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3));
+ assertEquals(GL11.GL_TRUE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 0));
+ assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 3));
} finally {
unbind(0);
unbind(3);
- GLStateManager.glDeleteTextures(a);
- GLStateManager.glDeleteTextures(b);
+ GLSMTextures.glDeleteTextures(a);
+ GLSMTextures.glDeleteTextures(b);
}
}
@@ -130,19 +130,19 @@ public class GLSM_ImageUnitBindingCache_UnitTest {
void outOfRangeUnitDoesNotCorruptNeighbours() {
final int tex = GL11.glGenTextures();
try {
- GLStateManager.glBindImageTexture(0, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
- final int beyond = GLStateManager.getImageUnitBinding(0) == null ? 0 : Integer.MAX_VALUE - 1;
+ GLSMTextures.glBindImageTexture(0, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
+ final int beyond = GLSMTextures.getImageUnitBinding(0) == null ? 0 : Integer.MAX_VALUE - 1;
assertFalse(beyond == 0, "unit 0 must resolve for this test to mean anything");
- GLStateManager.glBindImageTexture(beyond, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
+ GLSMTextures.glBindImageTexture(beyond, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
// Without image load/store the backend drops the call, so the driver never sees the unit.
final ContextCapabilities caps = GLStateManager.capabilities;
final boolean reachesDriver = caps.OpenGL42 || caps.GL_ARB_shader_image_load_store || caps.GL_EXT_shader_image_load_store;
assertEquals(reachesDriver ? GL11.GL_INVALID_VALUE : GL11.GL_NO_ERROR, GL11.glGetError(), "driver must reject the out-of-range unit");
- assertEquals(tex, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
+ assertEquals(tex, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0));
} finally {
unbind(0);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
}
@@ -152,36 +152,36 @@ public class GLSM_ImageUnitBindingCache_UnitTest {
drainErrors();
final int tex = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R32UI, 4, 4);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R32UI, 4, 4);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glBindImageTexture(1, tex, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
+ GLSMTextures.glBindImageTexture(1, tex, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI);
drainErrors();
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3));
} finally {
unbind(1);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
}
@Test
void bindingTextureZeroClearsLayeredAndLayer() {
try {
- GLStateManager.glBindImageTexture(2, 0, 0, true, 3, GL15.GL_READ_WRITE, GL11.GL_RGBA8);
+ GLSMTextures.glBindImageTexture(2, 0, 0, true, 3, GL15.GL_READ_WRITE, GL11.GL_RGBA8);
- assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2));
- assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2));
+ assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2));
+ assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2));
if (GLStateManager.capabilities != null && GLStateManager.capabilities.OpenGL42) {
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2));
- assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2));
+ assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2));
}
} finally {
unbind(2);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java
index 274f137ac..ab2cc2d9d 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java
@@ -48,32 +48,32 @@ public class GLSM_LegacyStackQueries_GLTest {
}
private static int pushToLimit(int depthPname, int maxPname) {
- final int max = GLStateManager.glGetInteger(maxPname);
+ final int max = GLSMQueries.glGetInteger(maxPname);
for (int i = 0; i < max + 4; i++) {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
}
- return GLStateManager.glGetInteger(depthPname);
+ return GLSMQueries.glGetInteger(depthPname);
}
private static void popToBase(int depthPname) {
- for (int i = 0; i < 128 && GLStateManager.glGetInteger(depthPname) > 1; i++) {
- GLStateManager.glPopMatrix();
+ for (int i = 0; i < 128 && GLSMQueries.glGetInteger(depthPname) > 1; i++) {
+ GLSMMatrices.glPopMatrix();
}
}
@Test
void attribDepthTracksPushAndPop() {
- final int base = GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH);
+ final int base = GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH);
try {
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- assertEquals(base + 1, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
- assertEquals(base + 2, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- GLStateManager.glPopAttrib();
- assertEquals(base + 1, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- GLStateManager.glPopAttrib();
- assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- assertEquals(GLStateManager.MAX_ATTRIB_STACK_DEPTH, GLStateManager.glGetInteger(GL11.GL_MAX_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ assertEquals(base + 1, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ assertEquals(base + 2, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPopAttrib();
+ assertEquals(base + 1, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPopAttrib();
+ assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ assertEquals(GLStateManager.MAX_ATTRIB_STACK_DEPTH, GLSMQueries.glGetInteger(GL11.GL_MAX_ATTRIB_STACK_DEPTH));
} finally {
popAttribTo(base);
}
@@ -82,23 +82,23 @@ public class GLSM_LegacyStackQueries_GLTest {
@Test
void clientAttribDepthTracksPushAndPop() {
try {
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
- GLStateManager.glPopClientAttrib();
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
- GLStateManager.glPopClientAttrib();
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
- GLStateManager.glPopClientAttrib();
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPopClientAttrib();
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPopClientAttrib();
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPopClientAttrib();
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
- final int max = GLStateManager.glGetInteger(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH);
+ final int max = GLSMQueries.glGetInteger(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH);
for (int i = 0; i < max + 2; i++) {
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
}
- assertEquals(max, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
+ assertEquals(max, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH));
} finally {
drainClientAttribStack();
}
@@ -107,24 +107,24 @@ public class GLSM_LegacyStackQueries_GLTest {
@Test
void textureStackDepthIsPerActiveUnit() {
try {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glPushMatrix();
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
- GLStateManager.glPopMatrix();
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glPushMatrix();
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
+ GLSMMatrices.glPopMatrix();
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH));
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
popToBase(GL11.GL_TEXTURE_STACK_DEPTH);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
}
@@ -139,21 +139,21 @@ public class GLSM_LegacyStackQueries_GLTest {
@MethodSource("matrixStacks")
void maxMatrixStackDepthIsExactlyReachable(String name, int mode, int depthPname, int maxPname) {
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(mode);
- assertEquals(1, GLStateManager.glGetInteger(depthPname));
- assertEquals(GLStateManager.glGetInteger(maxPname), pushToLimit(depthPname, maxPname));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(mode);
+ assertEquals(1, GLSMQueries.glGetInteger(depthPname));
+ assertEquals(GLSMQueries.glGetInteger(maxPname), pushToLimit(depthPname, maxPname));
} finally {
- GLStateManager.glMatrixMode(mode);
+ GLSMMatrices.glMatrixMode(mode);
popToBase(depthPname);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
}
@Test
void constantQueriesReportEmulatedLimits() {
- assertEquals(Math.min(VertexKey.MAX_UNITS, GLStateManager.MAX_TEXTURE_UNITS), GLStateManager.glGetInteger(GL13.GL_MAX_TEXTURE_UNITS));
- assertEquals(8, GLStateManager.glGetInteger(GL11.GL_MAX_LIGHTS));
+ assertEquals(Math.min(VertexKey.MAX_UNITS, GLStateManager.MAX_TEXTURE_UNITS), GLSMQueries.glGetInteger(GL13.GL_MAX_TEXTURE_UNITS));
+ assertEquals(8, GLSMQueries.glGetInteger(GL11.GL_MAX_LIGHTS));
}
@Test
@@ -162,16 +162,16 @@ public class GLSM_LegacyStackQueries_GLTest {
final int savedDraw = glCtx.drawFramebuffer;
final int savedRead = glCtx.readFramebuffer;
try {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
assertEquals(
GL30.glGetFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, GL11.GL_STENCIL, GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE),
- GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS));
+ GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS));
assertEquals(
GL30.glGetFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, GL11.GL_DEPTH, GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE),
- GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS));
+ GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS));
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead);
}
}
@@ -180,94 +180,94 @@ public class GLSM_LegacyStackQueries_GLTest {
final GLContextState glCtx = GLStateManager.ctx();
final int savedDraw = glCtx.drawFramebuffer;
final int savedRead = glCtx.readFramebuffer;
- final int fbo = GLStateManager.glGenFramebuffers();
- final int depthOnly = GLStateManager.glGenRenderbuffers();
- final int depthStencil = GLStateManager.glGenRenderbuffers();
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ final int depthOnly = GLSMFramebuffer.glGenRenderbuffers();
+ final int depthStencil = GLSMFramebuffer.glGenRenderbuffers();
try {
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthOnly);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT24, 16, 16);
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthStencil);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, 16, 16);
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, 0);
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthOnly);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT24, 16, 16);
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthStencil);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, 16, 16);
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, 0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS));
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS));
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS));
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS));
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthOnly);
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS));
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthOnly);
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS));
final int depthOnlyBits = GL30.glGetFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE);
assertTrue(depthOnlyBits >= 24, "driver depth size " + depthOnlyBits);
- assertEquals(depthOnlyBits, GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS));
+ assertEquals(depthOnlyBits, GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS));
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil);
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil);
- assertEquals(8, GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS));
- assertEquals(24, GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS));
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil);
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil);
+ assertEquals(8, GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS));
+ assertEquals(24, GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS));
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead);
- GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteRenderbuffers(depthOnly);
- GLStateManager.glDeleteRenderbuffers(depthStencil);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glDeleteRenderbuffers(depthOnly);
+ GLSMFramebuffer.glDeleteRenderbuffers(depthStencil);
}
}
@Test
void attribDepthUnchangedWhileCompilingDisplayList() {
- final int base = GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH);
- final int list = GLStateManager.glGenLists(1);
+ final int base = GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH);
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- GLStateManager.glPopAttrib();
- assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- GLStateManager.glEndList();
- assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ GLSMAttribStack.glPopAttrib();
+ assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ GLSMDraws.glEndList();
+ assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
} finally {
if (DisplayListManager.isRecording()) {
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
@Test
void popAttribOnEmptyStackIsIgnored() {
popAttribTo(0);
- assertEquals(0, GLStateManager.getAttribDepth());
- assertDoesNotThrow(GLStateManager::glPopAttrib);
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
- assertDoesNotThrow(GLStateManager::glPopAttrib);
- assertEquals(0, GLStateManager.getAttribDepth());
+ assertEquals(0, GLSMAttribStack.getAttribDepth());
+ assertDoesNotThrow(GLSMAttribStack::glPopAttrib);
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH));
+ assertDoesNotThrow(GLSMAttribStack::glPopAttrib);
+ assertEquals(0, GLSMAttribStack.getAttribDepth());
}
@Test
void pixelStoreBitRestoresPixelStoreAndPboBindings() {
final GLContextState glCtx = GLStateManager.ctx();
- final int unpackBuffer = GLStateManager.glGenBuffers();
- final int packBuffer = GLStateManager.glGenBuffers();
+ final int unpackBuffer = GLSMBuffers.glGenBuffers();
+ final int packBuffer = GLSMBuffers.glGenBuffers();
try {
// Pack and unpack start from different values, so a pop that crosses them is caught
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 2);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 8);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 5);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 2);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 8);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 5);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
final PixelStoreState unpackBefore = glCtx.pixelUnpackState;
final PixelStoreState packBefore = glCtx.pixelPackState;
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 6);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 7);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 7);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 6);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 7);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 7);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer);
assertEquals(1, glCtx.pixelUnpackState.alignment());
assertEquals(4, glCtx.pixelPackState.alignment());
assertEquals(6, glCtx.pixelUnpackState.skipRows());
@@ -276,14 +276,14 @@ public class GLSM_LegacyStackQueries_GLTest {
assertEquals(4, GL11.glGetInteger(GL11.GL_PACK_ALIGNMENT));
assertEquals(6, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS));
assertEquals(7, GL11.glGetInteger(GL11.GL_PACK_SKIP_ROWS));
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPopClientAttrib();
assertSame(unpackBefore, glCtx.pixelUnpackState);
assertSame(packBefore, glCtx.pixelPackState);
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
- assertEquals(8, GLStateManager.glGetInteger(GL11.GL_PACK_ALIGNMENT));
- assertEquals(0, GLStateManager.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING));
- assertEquals(0, GLStateManager.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING));
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
+ assertEquals(8, GLSMQueries.glGetInteger(GL11.GL_PACK_ALIGNMENT));
+ assertEquals(0, GLSMQueries.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING));
+ assertEquals(0, GLSMQueries.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING));
assertEquals(2, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
assertEquals(8, GL11.glGetInteger(GL11.GL_PACK_ALIGNMENT));
assertEquals(3, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS));
@@ -293,52 +293,52 @@ public class GLSM_LegacyStackQueries_GLTest {
assertEquals(0, GL11.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING));
} finally {
drainClientAttribStack();
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
- GLStateManager.glDeleteBuffers(unpackBuffer);
- GLStateManager.glDeleteBuffers(packBuffer);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(unpackBuffer);
+ GLSMBuffers.glDeleteBuffers(packBuffer);
}
}
@Test
void pixelStoreIsNotRestoredWithoutPixelStoreBit() {
final GLContextState glCtx = GLStateManager.ctx();
- final int unpackBuffer = GLStateManager.glGenBuffers();
- final int packBuffer = GLStateManager.glGenBuffers();
+ final int unpackBuffer = GLSMBuffers.glGenBuffers();
+ final int packBuffer = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 2);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer);
- GLStateManager.glPopClientAttrib();
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 2);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer);
+ GLSMAttribStack.glPopClientAttrib();
assertEquals(1, glCtx.pixelUnpackState.alignment());
assertEquals(2, glCtx.pixelPackState.alignment());
- assertEquals(unpackBuffer, GLStateManager.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING));
- assertEquals(packBuffer, GLStateManager.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING));
+ assertEquals(unpackBuffer, GLSMQueries.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING));
+ assertEquals(packBuffer, GLSMQueries.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING));
assertEquals(1, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
assertEquals(2, GL11.glGetInteger(GL11.GL_PACK_ALIGNMENT));
assertEquals(unpackBuffer, GL11.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING));
assertEquals(packBuffer, GL11.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING));
} finally {
drainClientAttribStack();
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
- GLStateManager.glDeleteBuffers(unpackBuffer);
- GLStateManager.glDeleteBuffers(packBuffer);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(unpackBuffer);
+ GLSMBuffers.glDeleteBuffers(packBuffer);
}
}
@@ -346,25 +346,25 @@ public class GLSM_LegacyStackQueries_GLTest {
void pixelStoreWithReturnsSameInstanceForUnchangedValue() {
final GLContextState glCtx = GLStateManager.ctx();
try {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11);
final PixelStoreState unpack = glCtx.pixelUnpackState;
final PixelStoreState pack = glCtx.pixelPackState;
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpack.alignment());
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SWAP_BYTES, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, pack.alignment());
- GLStateManager.glPixelStorei(GL11.GL_PACK_LSB_FIRST, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpack.alignment());
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SWAP_BYTES, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, pack.alignment());
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_LSB_FIRST, 0);
assertSame(unpack, glCtx.pixelUnpackState);
assertSame(pack, glCtx.pixelPackState);
assertSame(unpack, unpack.with(GL11.GL_UNPACK_ROW_LENGTH, 9));
assertSame(pack, pack.with(GL11.GL_PACK_ROW_LENGTH, 11));
} finally {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
}
}
@@ -375,28 +375,28 @@ public class GLSM_LegacyStackQueries_GLTest {
final FloatBuffer savedDirection = BufferUtils.createFloatBuffer(16);
final FloatBuffer savedCutoff = BufferUtils.createFloatBuffer(16);
final FloatBuffer savedAttenuation = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation);
final IntBuffer ints = BufferUtils.createIntBuffer(16);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
try {
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
final FloatBuffer values = BufferUtils.createFloatBuffer(4);
values.put(0, 0.25f).put(1, 0.5f).put(2, 1.0f).put(3, -0.5f);
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, values);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, values);
values.put(0, 3.9f).put(1, -2.7f).put(2, 0.5f).put(3, 1.0f);
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, values);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, values);
values.put(0, 2.5f).put(1, -1.5f).put(2, -3.9f).put(3, 0.0f);
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, values);
- GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, 45.75f);
- GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, 2.5f);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, values);
+ GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, 45.75f);
+ GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, 2.5f);
ints.position(2);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, ints);
assertEquals(2, ints.position());
assertEquals(536870911, ints.get(2));
assertEquals(1073741823, ints.get(3));
@@ -404,42 +404,42 @@ public class GLSM_LegacyStackQueries_GLTest {
assertEquals(-1073741823, ints.get(5));
ints.position(0);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, ints);
assertEquals(3, ints.get(0));
assertEquals(-2, ints.get(1));
assertEquals(0, ints.get(2));
assertEquals(1, ints.get(3));
ints.put(3, -777);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, ints);
assertEquals(2, ints.get(0));
assertEquals(-1, ints.get(1));
assertEquals(-3, ints.get(2));
assertEquals(-777, ints.get(3));
ints.put(1, -777);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, ints);
assertEquals(45, ints.get(0));
assertEquals(-777, ints.get(1));
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, ints);
assertEquals(2, ints.get(0));
ints.put(0, -777);
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_EMISSION, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_EMISSION, ints);
assertEquals(-777, ints.get(0));
- GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SHININESS, ints);
+ GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SHININESS, ints);
assertEquals(-777, ints.get(0));
} finally {
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
savedDiffuse.limit(4);
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse);
savedPosition.limit(4);
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition);
savedDirection.limit(4);
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection);
- GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff.get(0));
- GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation.get(0));
- GLStateManager.glPopMatrix();
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection);
+ GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff.get(0));
+ GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation.get(0));
+ GLSMMatrices.glPopMatrix();
}
}
@@ -448,20 +448,20 @@ public class GLSM_LegacyStackQueries_GLTest {
final FloatBuffer savedSpecular = BufferUtils.createFloatBuffer(16);
final FloatBuffer savedShininess = BufferUtils.createFloatBuffer(16);
final FloatBuffer savedIndexes = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular);
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess);
- GLStateManager.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess);
+ GLSMLighting.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes);
final IntBuffer ints = BufferUtils.createIntBuffer(16);
try {
final FloatBuffer values = BufferUtils.createFloatBuffer(4);
values.put(0, 0.5f).put(1, 0.75f).put(2, 1.0f).put(3, 0.0f);
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, values);
- GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 12.6f);
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, values);
+ GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 12.6f);
values.put(0, 2.5f).put(1, -2.5f).put(2, 7.4f).put(3, 0.0f);
- GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, values);
+ GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, values);
ints.position(1);
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, ints);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, ints);
assertEquals(1, ints.position());
assertEquals(1073741823, ints.get(1));
assertEquals(1610612735, ints.get(2));
@@ -470,28 +470,28 @@ public class GLSM_LegacyStackQueries_GLTest {
ints.position(0);
ints.put(1, -777);
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, ints);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, ints);
assertEquals(13, ints.get(0));
assertEquals(-777, ints.get(1));
ints.put(3, -777);
- GLStateManager.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, ints);
+ GLSMLighting.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, ints);
assertEquals(3, ints.get(0));
assertEquals(-3, ints.get(1));
assertEquals(7, ints.get(2));
assertEquals(-777, ints.get(3));
ints.put(0, -777);
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_POSITION, ints);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_POSITION, ints);
assertEquals(-777, ints.get(0));
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPOT_CUTOFF, ints);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPOT_CUTOFF, ints);
assertEquals(-777, ints.get(0));
} finally {
savedSpecular.limit(4);
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular);
- GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess.get(0));
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular);
+ GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess.get(0));
savedIndexes.limit(4);
- GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes);
+ GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes);
}
}
@@ -501,21 +501,21 @@ public class GLSM_LegacyStackQueries_GLTest {
final float[][] saved = new float[4][4];
try {
for (int unit = 0; unit < 4; unit++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf);
for (int i = 0; i < 4; i++) {
saved[unit][i] = buf.get(i);
}
}
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f);
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE1, 240.0f, 16.0f);
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE2, 0.75f, 0.125f);
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE3, 0.375f, 0.625f);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE1, 240.0f, 16.0f);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE2, 0.75f, 0.125f);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE3, 0.375f, 0.625f);
final float[][] expected = { { 0.25f, 0.5f }, { 240.0f, 16.0f }, { 0.75f, 0.125f }, { 0.375f, 0.625f } };
for (int unit = 0; unit < 4; unit++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf);
assertEquals(expected[unit][0], buf.get(0), "s of unit " + unit);
assertEquals(expected[unit][1], buf.get(1), "t of unit " + unit);
assertEquals(0.0f, buf.get(2), "r of unit " + unit);
@@ -523,9 +523,9 @@ public class GLSM_LegacyStackQueries_GLTest {
}
} finally {
for (int unit = 0; unit < 4; unit++) {
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0 + unit, saved[unit][0], saved[unit][1]);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0 + unit, saved[unit][0], saved[unit][1]);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
@@ -534,26 +534,26 @@ public class GLSM_LegacyStackQueries_GLTest {
final FloatBuffer buf = BufferUtils.createFloatBuffer(16);
final int unit = GLStateManager.ctx().ffp.currentTexCoords.length + 1;
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
for (int i = 0; i < 4; i++) {
buf.put(i, -7.0f);
}
- GLStateManager.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf);
assertEquals(0.0f, buf.get(0));
assertEquals(0.0f, buf.get(1));
assertEquals(0.0f, buf.get(2));
assertEquals(1.0f, buf.get(3));
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.0f, 0.0f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.0f, 0.0f);
}
}
@Test
void legacyQueriesNeverReachTheDriver() {
- final int base = GLStateManager.getAttribDepth();
+ final int base = GLSMAttribStack.getAttribDepth();
final IntBuffer ints = BufferUtils.createIntBuffer(16);
final FloatBuffer floats = BufferUtils.createFloatBuffer(16);
final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(16);
@@ -562,29 +562,29 @@ public class GLSM_LegacyStackQueries_GLTest {
final float[] floatArray = new float[16];
final double[] doubleArray = new double[16];
try {
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
assumeDriverRejectsLegacyPnames();
for (final int pname : LEGACY_PNAMES) {
drainErrors();
- final int scalar = GLStateManager.glGetInteger(pname);
- GLStateManager.glGetFloat(pname);
- GLStateManager.glGetBoolean(pname);
- GLStateManager.glIsEnabled(pname);
+ final int scalar = GLSMQueries.glGetInteger(pname);
+ GLSMQueries.glGetFloat(pname);
+ GLSMQueries.glGetBoolean(pname);
+ GLSMEnable.glIsEnabled(pname);
ints.clear();
ints.put(0, -12345);
- GLStateManager.glGetInteger(pname, ints);
+ GLSMQueries.glGetInteger(pname, ints);
floats.clear();
- GLStateManager.glGetFloat(pname, floats);
+ GLSMQueries.glGetFloat(pname, floats);
doubles.clear();
- GLStateManager.glGetDouble(pname, doubles);
+ GLSMQueries.glGetDouble(pname, doubles);
bytes.clear();
- GLStateManager.glGetBoolean(pname, bytes);
+ GLSMQueries.glGetBoolean(pname, bytes);
intArray[0] = -12345;
- GLStateManager.glGetInteger(pname, intArray);
- GLStateManager.glGetFloat(pname, floatArray);
- GLStateManager.glGetDouble(pname, doubleArray);
+ GLSMQueries.glGetInteger(pname, intArray);
+ GLSMQueries.glGetFloat(pname, floatArray);
+ GLSMQueries.glGetDouble(pname, doubleArray);
if (LegacyQueries.count(LegacyQueries.desc(pname)) == 1) {
assertEquals(scalar, ints.get(0), "IntBuffer overload for " + hex(pname));
assertEquals(scalar, intArray[0], "int[] overload for " + hex(pname));
@@ -592,7 +592,7 @@ public class GLSM_LegacyStackQueries_GLTest {
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "driver error after querying " + hex(pname));
}
} finally {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
drainClientAttribStack();
popAttribTo(base);
}
@@ -605,33 +605,33 @@ public class GLSM_LegacyStackQueries_GLTest {
final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(16);
final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16);
final FloatBuffer savedNormal = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_NORMAL, savedNormal);
- final int savedFunc = GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC);
- final float savedRef = GLStateManager.glGetFloat(GL11.GL_ALPHA_TEST_REF);
- final float savedStart = GLStateManager.glGetFloat(GL11.GL_FOG_START);
- final float savedEnd = GLStateManager.glGetFloat(GL11.GL_FOG_END);
- final float savedDensity = GLStateManager.glGetFloat(GL11.GL_FOG_DENSITY);
- final boolean savedLighting = GLStateManager.glIsEnabled(GL11.GL_LIGHTING);
- final boolean savedFog = GLStateManager.glIsEnabled(GL11.GL_FOG);
- final int savedShade = GLStateManager.glGetInteger(GL11.GL_SHADE_MODEL);
- final int savedHint = GLStateManager.glGetInteger(GL11.GL_FOG_HINT);
- final float savedMinSize = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_NORMAL, savedNormal);
+ final int savedFunc = GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC);
+ final float savedRef = GLSMQueries.glGetFloat(GL11.GL_ALPHA_TEST_REF);
+ final float savedStart = GLSMQueries.glGetFloat(GL11.GL_FOG_START);
+ final float savedEnd = GLSMQueries.glGetFloat(GL11.GL_FOG_END);
+ final float savedDensity = GLSMQueries.glGetFloat(GL11.GL_FOG_DENSITY);
+ final boolean savedLighting = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING);
+ final boolean savedFog = GLSMEnable.glIsEnabled(GL11.GL_FOG);
+ final int savedShade = GLSMQueries.glGetInteger(GL11.GL_SHADE_MODEL);
+ final int savedHint = GLSMQueries.glGetInteger(GL11.GL_FOG_HINT);
+ final float savedMinSize = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
try {
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.glFogf(GL11.GL_FOG_START, -1.5f);
- GLStateManager.glFogf(GL11.GL_FOG_END, 2.5f);
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.25f);
- GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1f);
- GLStateManager.glNormal3f(0f, -0.5f, 1f);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_FOG);
- GLStateManager.glShadeModel(GL11.GL_FLAT);
- GLStateManager.glHint(GL11.GL_FOG_HINT, GL11.GL_NICEST);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.5f);
- GLStateManager.glTranslatef(1.5f, -2.5f, 3f);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_START, -1.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 2.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.25f);
+ GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1f);
+ GLSMCurrentAttribs.glNormal3f(0f, -0.5f, 1f);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_FOG);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
+ GLSMRasterizer.glHint(GL11.GL_FOG_HINT, GL11.GL_NICEST);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.5f);
+ GLSMMatrices.glTranslatef(1.5f, -2.5f, 3f);
for (final int pname : LEGACY_PNAMES) {
final int desc = LegacyQueries.desc(pname);
final int type = LegacyQueries.type(desc);
@@ -639,47 +639,47 @@ public class GLSM_LegacyStackQueries_GLTest {
final String name = hex(pname);
if (count == 1) {
if (type == LegacyQueries.BOOL) {
- final boolean b = GLStateManager.glGetBoolean(pname);
- assertEquals(b ? 1 : 0, GLStateManager.glGetInteger(pname), "int of bool " + name);
- assertEquals(b ? 1.0f : 0.0f, GLStateManager.glGetFloat(pname), "float of bool " + name);
+ final boolean b = GLSMQueries.glGetBoolean(pname);
+ assertEquals(b ? 1 : 0, GLSMQueries.glGetInteger(pname), "int of bool " + name);
+ assertEquals(b ? 1.0f : 0.0f, GLSMQueries.glGetFloat(pname), "float of bool " + name);
} else if (type == LegacyQueries.INT) {
- final int i = GLStateManager.glGetInteger(pname);
- assertEquals((float) i, GLStateManager.glGetFloat(pname), "float of int " + name);
- assertEquals(i != 0, GLStateManager.glGetBoolean(pname), "bool of int " + name);
+ final int i = GLSMQueries.glGetInteger(pname);
+ assertEquals((float) i, GLSMQueries.glGetFloat(pname), "float of int " + name);
+ assertEquals(i != 0, GLSMQueries.glGetBoolean(pname), "bool of int " + name);
} else {
- final float f = GLStateManager.glGetFloat(pname);
- assertEquals(LegacyQueries.toInt(type, f), GLStateManager.glGetInteger(pname), "int of float " + name);
- assertEquals(f != 0.0f, GLStateManager.glGetBoolean(pname), "bool of float " + name);
+ final float f = GLSMQueries.glGetFloat(pname);
+ assertEquals(LegacyQueries.toInt(type, f), GLSMQueries.glGetInteger(pname), "int of float " + name);
+ assertEquals(f != 0.0f, GLSMQueries.glGetBoolean(pname), "bool of float " + name);
}
} else {
floats.clear();
- GLStateManager.glGetFloat(pname, floats);
+ GLSMQueries.glGetFloat(pname, floats);
ints.clear();
- GLStateManager.glGetInteger(pname, ints);
+ GLSMQueries.glGetInteger(pname, ints);
doubles.clear();
- GLStateManager.glGetDouble(pname, doubles);
+ GLSMQueries.glGetDouble(pname, doubles);
for (int i = 0; i < count; i++) {
final float f = floats.get(i);
assertEquals(LegacyQueries.toInt(type, f), ints.get(i), "int element " + i + " of " + name);
assertEquals((double) f, doubles.get(i), "double element " + i + " of " + name);
}
- assertEquals(floats.get(0), GLStateManager.glGetFloat(pname), "scalar float of " + name);
+ assertEquals(floats.get(0), GLSMQueries.glGetFloat(pname), "scalar float of " + name);
}
}
} finally {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, savedMinSize);
- GLStateManager.glHint(GL11.GL_FOG_HINT, savedHint);
- GLStateManager.glShadeModel(savedShade);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, savedMinSize);
+ GLSMRasterizer.glHint(GL11.GL_FOG_HINT, savedHint);
+ GLSMRasterizer.glShadeModel(savedShade);
setEnabled(GL11.GL_FOG, savedFog);
setEnabled(GL11.GL_LIGHTING, savedLighting);
- GLStateManager.glNormal3f(savedNormal.get(0), savedNormal.get(1), savedNormal.get(2));
- GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, savedDensity);
- GLStateManager.glFogf(GL11.GL_FOG_END, savedEnd);
- GLStateManager.glFogf(GL11.GL_FOG_START, savedStart);
- GLStateManager.glAlphaFunc(savedFunc, savedRef);
+ GLSMCurrentAttribs.glNormal3f(savedNormal.get(0), savedNormal.get(1), savedNormal.get(2));
+ GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, savedDensity);
+ GLSMFog.glFogf(GL11.GL_FOG_END, savedEnd);
+ GLSMFog.glFogf(GL11.GL_FOG_START, savedStart);
+ GLSMDepthStencilAlpha.glAlphaFunc(savedFunc, savedRef);
}
}
@@ -695,34 +695,34 @@ public class GLSM_LegacyStackQueries_GLTest {
@Test
void edgeFlagIsCompiledIntoDisplayLists() {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glEdgeFlag(true);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glEdgeFlag(false);
- GLStateManager.glEndList();
- assertTrue(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG), "compiling must not change the live edge flag");
- GLStateManager.glCallList(list);
- assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG));
+ GLSMCurrentAttribs.glEdgeFlag(true);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMCurrentAttribs.glEdgeFlag(false);
+ GLSMDraws.glEndList();
+ assertTrue(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG), "compiling must not change the live edge flag");
+ GLSMDraws.glCallList(list);
+ assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG));
} finally {
- GLStateManager.glEdgeFlag(true);
- GLStateManager.glDeleteLists(list, 1);
+ GLSMCurrentAttribs.glEdgeFlag(true);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
@Test
void textureBitRestoresPerUnitTextureEnables() {
- final int base = GLStateManager.getAttribDepth();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final boolean cube = GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP);
- final boolean texture2d = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_2D);
+ final int base = GLSMAttribStack.getAttribDepth();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final boolean cube = GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP);
+ final boolean texture2d = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_2D);
try {
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
setEnabled(GL13.GL_TEXTURE_CUBE_MAP, !cube);
setEnabled(GL11.GL_TEXTURE_2D, !texture2d);
- GLStateManager.glPopAttrib();
- assertEquals(cube, GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
- assertEquals(texture2d, GLStateManager.glIsEnabled(GL11.GL_TEXTURE_2D));
+ GLSMAttribStack.glPopAttrib();
+ assertEquals(cube, GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
+ assertEquals(texture2d, GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_2D));
} finally {
popAttribTo(base);
setEnabled(GL13.GL_TEXTURE_CUBE_MAP, cube);
@@ -733,49 +733,49 @@ public class GLSM_LegacyStackQueries_GLTest {
@Test
void crossTypeQueriesConvert() {
final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
- final int savedFunc = GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC);
- final float savedRef = GLStateManager.glGetFloat(GL11.GL_ALPHA_TEST_REF);
- final float savedStart = GLStateManager.glGetFloat(GL11.GL_FOG_START);
- final boolean savedLighting = GLStateManager.glIsEnabled(GL11.GL_LIGHTING);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
+ final int savedFunc = GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC);
+ final float savedRef = GLSMQueries.glGetFloat(GL11.GL_ALPHA_TEST_REF);
+ final float savedStart = GLSMQueries.glGetFloat(GL11.GL_FOG_START);
+ final boolean savedLighting = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING);
final IntBuffer ints = BufferUtils.createIntBuffer(16);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
try {
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- assertEquals(1073741823, GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_REF));
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ assertEquals(1073741823, GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_REF));
- assertEquals((float) GLStateManager.glGetInteger(GL11.GL_FOG_MODE), GLStateManager.glGetFloat(GL11.GL_FOG_MODE));
+ assertEquals((float) GLSMQueries.glGetInteger(GL11.GL_FOG_MODE), GLSMQueries.glGetFloat(GL11.GL_FOG_MODE));
- GLStateManager.glFogf(GL11.GL_FOG_START, -1.5f);
- assertEquals(-2, GLStateManager.glGetInteger(GL11.GL_FOG_START));
+ GLSMFog.glFogf(GL11.GL_FOG_START, -1.5f);
+ assertEquals(-2, GLSMQueries.glGetInteger(GL11.GL_FOG_START));
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_LIGHTING));
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- assertEquals(0, GLStateManager.glGetInteger(GL11.GL_LIGHTING));
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_LIGHTING));
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_LIGHTING));
- GLStateManager.glColor4f(1f, 0.5f, 0f, 1f);
+ GLSMCurrentAttribs.glColor4f(1f, 0.5f, 0f, 1f);
ints.clear();
- GLStateManager.glGetInteger(GL11.GL_CURRENT_COLOR, ints);
+ GLSMQueries.glGetInteger(GL11.GL_CURRENT_COLOR, ints);
assertEquals(2147483647, ints.get(0));
assertEquals(1073741823, ints.get(1));
assertEquals(0, ints.get(2));
assertEquals(2147483647, ints.get(3));
- GLStateManager.glLoadIdentity();
- GLStateManager.glGetInteger(GL11.GL_MODELVIEW_MATRIX, ints);
+ GLSMMatrices.glLoadIdentity();
+ GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_MATRIX, ints);
assertEquals(2147483647, ints.get(0), "matrix elements scale like normalized floats");
assertEquals(0, ints.get(1));
assertEquals(2147483647, ints.get(15));
- assertEquals(2147483647, GLStateManager.glGetInteger(GL11.GL_MODELVIEW_MATRIX));
- assertEquals(1.0f, GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX));
+ assertEquals(2147483647, GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_MATRIX));
+ assertEquals(1.0f, GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX));
} finally {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
- GLStateManager.glFogf(GL11.GL_FOG_START, savedStart);
- GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
- GLStateManager.glAlphaFunc(savedFunc, savedRef);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMFog.glFogf(GL11.GL_FOG_START, savedStart);
+ GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
+ GLSMDepthStencilAlpha.glAlphaFunc(savedFunc, savedRef);
setEnabled(GL11.GL_LIGHTING, savedLighting);
}
}
@@ -798,8 +798,8 @@ public class GLSM_LegacyStackQueries_GLTest {
final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(32);
final FloatBuffer reference = BufferUtils.createFloatBuffer(32);
final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
- final float savedStart = GLStateManager.glGetFloat(GL11.GL_FOG_START);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
+ final float savedStart = GLSMQueries.glGetFloat(GL11.GL_FOG_START);
try {
for (int i = 0; i < 32; i++) {
ints.put(i, -777);
@@ -808,14 +808,14 @@ public class GLSM_LegacyStackQueries_GLTest {
}
ints.position(4);
- GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE, ints);
- assertEquals(GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE), ints.get(4));
+ GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE, ints);
+ assertEquals(GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE), ints.get(4));
assertEquals(-777, ints.get(0));
floats.position(4);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, floats);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, floats);
reference.clear();
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, reference);
+ GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, reference);
for (int i = 0; i < 16; i++) {
assertEquals(reference.get(i), floats.get(4 + i), "modelview element " + i);
}
@@ -824,18 +824,18 @@ public class GLSM_LegacyStackQueries_GLTest {
for (int i = 0; i < 32; i++) {
ints.put(i, -777);
}
- GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1f);
+ GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1f);
ints.position(4);
- GLStateManager.glGetInteger(GL11.GL_CURRENT_COLOR, ints);
+ GLSMQueries.glGetInteger(GL11.GL_CURRENT_COLOR, ints);
assertEquals(536870911, ints.get(4));
assertEquals(1073741823, ints.get(5));
assertEquals(1610612735, ints.get(6));
assertEquals(2147483647, ints.get(7));
assertEquals(-777, ints.get(0));
- GLStateManager.glFogf(GL11.GL_FOG_START, 3.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 3.5f);
doubles.position(4);
- GLStateManager.glGetDouble(GL11.GL_FOG_START, doubles);
+ GLSMQueries.glGetDouble(GL11.GL_FOG_START, doubles);
assertEquals(3.5, doubles.get(4));
assertEquals(-777.0, doubles.get(0));
@@ -843,16 +843,16 @@ public class GLSM_LegacyStackQueries_GLTest {
floats.put(i, -777f);
}
floats.position(4);
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, floats);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, floats);
reference.clear();
- GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, reference);
+ GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, reference);
for (int i = 0; i < 4; i++) {
assertEquals(reference.get(i), floats.get(4 + i), "diffuse element " + i);
}
assertEquals(-777f, floats.get(0));
} finally {
- GLStateManager.glFogf(GL11.GL_FOG_START, savedStart);
- GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
+ GLSMFog.glFogf(GL11.GL_FOG_START, savedStart);
+ GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
}
}
@@ -863,53 +863,53 @@ public class GLSM_LegacyStackQueries_GLTest {
@Test
void hintsRoundTripAndFollowHintBit() {
- final int base = GLStateManager.getAttribDepth();
+ final int base = GLSMAttribStack.getAttribDepth();
final int[] saved = new int[HINT_TARGETS.length];
for (int i = 0; i < HINT_TARGETS.length; i++) {
- saved[i] = GLStateManager.glGetInteger(HINT_TARGETS[i]);
+ saved[i] = GLSMQueries.glGetInteger(HINT_TARGETS[i]);
}
try {
for (final int target : HINT_TARGETS) {
final String name = hex(target);
- assertEquals(GL11.GL_DONT_CARE, GLStateManager.glGetInteger(target), "default " + name);
- GLStateManager.glHint(target, GL11.GL_NICEST);
- assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "nicest " + name);
+ assertEquals(GL11.GL_DONT_CARE, GLSMQueries.glGetInteger(target), "default " + name);
+ GLSMRasterizer.glHint(target, GL11.GL_NICEST);
+ assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "nicest " + name);
if (isDriverHint(target)) assertEquals(GL11.GL_NICEST, GL11.glGetInteger(target), "driver nicest " + name);
- GLStateManager.glHint(target, 12345);
- assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "invalid mode " + name);
+ GLSMRasterizer.glHint(target, 12345);
+ assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "invalid mode " + name);
if (isDriverHint(target)) assertEquals(GL11.GL_NICEST, GL11.glGetInteger(target), "driver invalid mode " + name);
}
- GLStateManager.glPushAttrib(GL11.GL_HINT_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_HINT_BIT);
for (final int target : HINT_TARGETS) {
- GLStateManager.glHint(target, GL11.GL_FASTEST);
- assertEquals(GL11.GL_FASTEST, GLStateManager.glGetInteger(target), "fastest " + hex(target));
+ GLSMRasterizer.glHint(target, GL11.GL_FASTEST);
+ assertEquals(GL11.GL_FASTEST, GLSMQueries.glGetInteger(target), "fastest " + hex(target));
if (isDriverHint(target)) assertEquals(GL11.GL_FASTEST, GL11.glGetInteger(target), "driver fastest " + hex(target));
}
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
for (final int target : HINT_TARGETS) {
- assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "restored " + hex(target));
+ assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "restored " + hex(target));
if (isDriverHint(target)) assertEquals(GL11.GL_NICEST, GL11.glGetInteger(target), "driver restored " + hex(target));
}
- assertEquals(GL11.GL_RENDER, GLStateManager.glGetInteger(GL11.GL_RENDER_MODE));
+ assertEquals(GL11.GL_RENDER, GLSMQueries.glGetInteger(GL11.GL_RENDER_MODE));
} finally {
popAttribTo(base);
for (int i = 0; i < HINT_TARGETS.length; i++) {
- GLStateManager.glHint(HINT_TARGETS[i], saved[i]);
+ GLSMRasterizer.glHint(HINT_TARGETS[i], saved[i]);
}
}
}
@Test
void pointParametersRoundTripAndFollowPointBit() {
- final int base = GLStateManager.getAttribDepth();
+ final int base = GLSMAttribStack.getAttribDepth();
final FloatBuffer attenuation = BufferUtils.createFloatBuffer(16);
final FloatBuffer savedAttenuation = BufferUtils.createFloatBuffer(16);
- final float savedMin = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN);
- final float savedMax = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX);
- final float savedFade = GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE);
- final int savedOrigin = GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN);
- GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, savedAttenuation);
- GLStateManager.glPushAttrib(GL11.GL_POINT_BIT);
+ final float savedMin = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN);
+ final float savedMax = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX);
+ final float savedFade = GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE);
+ final int savedOrigin = GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN);
+ GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, savedAttenuation);
+ GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT);
try {
assertEquals(0f, savedMin);
assertEquals(driverMaxPointSize(), savedMax);
@@ -919,120 +919,120 @@ public class GLSM_LegacyStackQueries_GLTest {
assertEquals(0f, savedAttenuation.get(2));
assertEquals(GL20.GL_UPPER_LEFT, savedOrigin);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 0.5f);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 2.5f);
- GLStateManager.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 4.5f);
- assertEquals(0.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN));
- assertEquals(2.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX));
- assertEquals(4.5f, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 0.5f);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 2.5f);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 4.5f);
+ assertEquals(0.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN));
+ assertEquals(2.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX));
+ assertEquals(4.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
assertEquals(4.5f, GL11.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, -1f);
- assertEquals(0.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN));
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, -1f);
+ assertEquals(0.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN));
attenuation.put(0, 0.5f).put(1, 0.25f).put(2, 0.125f);
attenuation.position(0).limit(3);
- GLStateManager.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
+ GLSMRasterizer.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
attenuation.clear();
for (int i = 0; i < 16; i++) {
attenuation.put(i, -777f);
}
- GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
+ GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
assertEquals(0.5f, attenuation.get(0));
assertEquals(0.25f, attenuation.get(1));
assertEquals(0.125f, attenuation.get(2));
- GLStateManager.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT);
- assertEquals(GL20.GL_LOWER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
+ GLSMRasterizer.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT);
+ assertEquals(GL20.GL_LOWER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
assertEquals(GL20.GL_LOWER_LEFT, GL11.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
- GLStateManager.glPushAttrib(GL11.GL_POINT_BIT);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 1f);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 3f);
- GLStateManager.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 2f);
+ GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 1f);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 3f);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 2f);
attenuation.put(0, 1f).put(1, 1f).put(2, 1f);
attenuation.position(0).limit(3);
- GLStateManager.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
- GLStateManager.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_UPPER_LEFT);
- assertEquals(1f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN));
- assertEquals(GL20.GL_UPPER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
+ GLSMRasterizer.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
+ GLSMRasterizer.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_UPPER_LEFT);
+ assertEquals(1f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN));
+ assertEquals(GL20.GL_UPPER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
assertEquals(GL20.GL_UPPER_LEFT, GL11.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, Float.NaN);
- assertTrue(Float.isNaN(GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)));
- GLStateManager.glPopAttrib();
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, Float.NaN);
+ assertTrue(Float.isNaN(GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)));
+ GLSMAttribStack.glPopAttrib();
- assertEquals(0.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN));
- assertEquals(2.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX));
- assertEquals(4.5f, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
+ assertEquals(0.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN));
+ assertEquals(2.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX));
+ assertEquals(4.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
assertEquals(4.5f, GL11.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
- assertEquals(GL20.GL_LOWER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
+ assertEquals(GL20.GL_LOWER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
assertEquals(GL20.GL_LOWER_LEFT, GL11.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
attenuation.clear();
- GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
+ GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
assertEquals(0.5f, attenuation.get(0));
assertEquals(0.25f, attenuation.get(1));
assertEquals(0.125f, attenuation.get(2));
} finally {
popAttribTo(base);
- assertEquals(savedMax, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX));
+ assertEquals(savedMax, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX));
}
}
@Test
void cacheOnlyEnablesRoundTrip() {
- final int base = GLStateManager.getAttribDepth();
- final boolean savedSprite = GLStateManager.glIsEnabled(GL20.GL_POINT_SPRITE);
- final boolean savedTwoSide = GLStateManager.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE);
- final boolean savedEdge = GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final boolean savedCube0 = GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- final boolean savedCube1 = GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ final int base = GLSMAttribStack.getAttribDepth();
+ final boolean savedSprite = GLSMEnable.glIsEnabled(GL20.GL_POINT_SPRITE);
+ final boolean savedTwoSide = GLSMEnable.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE);
+ final boolean savedEdge = GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final boolean savedCube0 = GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ final boolean savedCube1 = GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
try {
assertEnableRoundTrip(GL20.GL_POINT_SPRITE, false);
assertEnableRoundTrip(GL20.GL_VERTEX_PROGRAM_TWO_SIDE, false);
assertEnableRoundTrip(GL13.GL_TEXTURE_CUBE_MAP, false);
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glEnable(GL20.GL_POINT_SPRITE);
- GLStateManager.glEnable(GL20.GL_VERTEX_PROGRAM_TWO_SIDE);
- GLStateManager.glEnable(GL13.GL_TEXTURE_CUBE_MAP);
- assertTrue(GLStateManager.glIsEnabled(GL20.GL_POINT_SPRITE));
- assertTrue(GLStateManager.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE));
- assertTrue(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
- GLStateManager.glPopAttrib();
- assertFalse(GLStateManager.glIsEnabled(GL20.GL_POINT_SPRITE));
- assertFalse(GLStateManager.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE));
- assertFalse(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMEnable.glEnable(GL20.GL_POINT_SPRITE);
+ GLSMEnable.glEnable(GL20.GL_VERTEX_PROGRAM_TWO_SIDE);
+ GLSMEnable.glEnable(GL13.GL_TEXTURE_CUBE_MAP);
+ assertTrue(GLSMEnable.glIsEnabled(GL20.GL_POINT_SPRITE));
+ assertTrue(GLSMEnable.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE));
+ assertTrue(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
+ GLSMAttribStack.glPopAttrib();
+ assertFalse(GLSMEnable.glIsEnabled(GL20.GL_POINT_SPRITE));
+ assertFalse(GLSMEnable.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE));
+ assertFalse(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDisable(GL13.GL_TEXTURE_CUBE_MAP);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEnable(GL13.GL_TEXTURE_CUBE_MAP);
- assertTrue(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- assertFalse(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
- assertFalse(GLStateManager.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- assertTrue(GLStateManager.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP));
- GLStateManager.glDisable(GL13.GL_TEXTURE_CUBE_MAP);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glDisable(GL13.GL_TEXTURE_CUBE_MAP);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glEnable(GL13.GL_TEXTURE_CUBE_MAP);
+ assertTrue(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ assertFalse(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP));
+ assertFalse(GLSMQueries.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ assertTrue(GLSMQueries.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP));
+ GLSMEnable.glDisable(GL13.GL_TEXTURE_CUBE_MAP);
assertTrue(savedEdge);
- GLStateManager.glEdgeFlag(false);
- assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG));
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
- GLStateManager.glEdgeFlag(true);
- assertTrue(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG));
- GLStateManager.glPopAttrib();
- assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG));
+ GLSMCurrentAttribs.glEdgeFlag(false);
+ assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG));
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMCurrentAttribs.glEdgeFlag(true);
+ assertTrue(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG));
+ GLSMAttribStack.glPopAttrib();
+ assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG));
} finally {
popAttribTo(base);
- GLStateManager.glEdgeFlag(savedEdge);
+ GLSMCurrentAttribs.glEdgeFlag(savedEdge);
setEnabled(GL20.GL_POINT_SPRITE, savedSprite);
setEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE, savedTwoSide);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
setEnabled(GL13.GL_TEXTURE_CUBE_MAP, savedCube1);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
setEnabled(GL13.GL_TEXTURE_CUBE_MAP, savedCube0);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
index 1b5b713c0..0531a703f 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
@@ -15,20 +15,20 @@ public class GLSM_Lighting_UnitTest {
@Test
void testLightEnablement() {
verifyState(GL11.GL_LIGHT0, false, "GL_LIGHT0 Initial State");
- GLStateManager.glEnable(GL11.GL_LIGHT0);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
verifyState(GL11.GL_LIGHT0, true, "GL_LIGHT0 Enabled");
verifyState(GL11.GL_LIGHT1, false, "GL_LIGHT1 Initial State");
- GLStateManager.glEnable(GL11.GL_LIGHT1);
+ GLSMEnable.glEnable(GL11.GL_LIGHT1);
verifyState(GL11.GL_LIGHT1, true, "GL_LIGHT1 Enabled State");
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT1);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT1);
}
@Test
void testLightValues() {
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0F, 0F, 0F, 1F}, "GL_LIGHT0 Initial Ambient");
verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{1F, 1F, 1F, 1F}, "GL_LIGHT0 Initial Diffuse");
@@ -40,176 +40,176 @@ public class GLSM_Lighting_UnitTest {
verifyLightState(GL11.GL_LIGHT1, GL11.GL_SPECULAR, new float[]{0F, 0F, 0F, 1F}, "GL_LIGHT1 Initial Specular");
verifyLightState(GL11.GL_LIGHT1, GL11.GL_POSITION, new float[]{0F, 0F, 1F, 0F}, "GL_LIGHT1 Initial Position");
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.25F, 0.5F, 0.25F, 0.5F));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.25F, 0.5F, 0.25F, 0.5F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 Ambient Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.3F, 0.4F, 0.5F, 0.6F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.3F, 0.4F, 0.5F, 0.6F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0.3F, 0.4F, 0.5F, 0.6F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 attrib pop state check");
// The position is stored in eye coordinates, so we're moving around the modelview matrix before changing them
// That way we can test that the client side transformation of them via GLSM is working and matches the OpenGL
// transformation. This doesn't seem like float precision should break this test, but it may be possible for it
// to need tweaked a bit more.
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(25.0F, 25.0F, 25.0F);
- GLStateManager.glRotatef(35.0F, 10.0F, 15.0F, 20.0F);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.25F, 0.5F, 0.25F, 0.0F));
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(25.0F, 25.0F, 25.0F);
+ GLSMMatrices.glRotatef(35.0F, 10.0F, 15.0F, 20.0F);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.25F, 0.5F, 0.25F, 0.0F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_POSITION, new float[]{0.1090F, 0.5189F, 0.3062F, 0.0F}, "GL_LIGHT0 Position Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.3F, 0.4F, 0.5F, 0.0F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.3F, 0.4F, 0.5F, 0.0F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_POSITION, new float[]{0.2824F, 0.4200F, 0.4937F, 0.0F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_POSITION, new float[]{0.1090F, 0.5189F, 0.3062F, 0.0F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.25F, 0.5F));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.25F, 0.5F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 Diffuse Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3F, 0.4F, 0.5F, 0.6F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3F, 0.4F, 0.5F, 0.6F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{0.3F, 0.4F, 0.5F, 0.6F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.25F, 0.5F, 0.25F, 0.5F));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.25F, 0.5F, 0.25F, 0.5F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPECULAR, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 Specular Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.3F, 0.4F, 0.5F, 0.6F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.3F, 0.4F, 0.5F, 0.6F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPECULAR, new float[]{0.3F, 0.4F, 0.5F, 0.6F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPECULAR, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(25.0F, 25.0F, 25.0F);
- GLStateManager.glRotatef(35.0F, 10.0F, 15.0F, 20.0F);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.25F, 0.5F, 0.25F, 0.0F));
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(25.0F, 25.0F, 25.0F);
+ GLSMMatrices.glRotatef(35.0F, 10.0F, 15.0F, 20.0F);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.25F, 0.5F, 0.25F, 0.0F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, new float[]{0.1090F, 0.5189F, 0.3062F}, "GL_LIGHT0 Spot Direction Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.3F, 0.4F, 0.5F, 0.0F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.3F, 0.4F, 0.5F, 0.0F));
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, new float[]{0.2824F, 0.4200F, 0.4937F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, new float[]{0.1090F, 0.5189F, 0.3062F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 1.0F);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 1.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, new float[]{1.0F}, "GL_LIGHT0 Spot Exponent Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 2.0F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 2.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, new float[]{2.0F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, new float[]{1.0F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 20.0F);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 20.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, new float[]{20.0F}, "GL_LIGHT0 Spot Cutoff Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 40.0F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 40.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, new float[]{40.0F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, new float[]{20.0F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 10.0F);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 10.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 Constant Attenuation Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 20.0F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 20.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, new float[]{20.0F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 10.0F);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 10.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 Linear Attenuation Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 20.0F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 20.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, new float[]{20.0F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 10.0F);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 10.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 Quadratic Attenuation Changed State");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 20.0F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 20.0F);
verifyLightState(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, new float[]{20.0F}, "GL_LIGHT0 attrib push state changed check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyLightState(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 attrib pop state check");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
@Test
void testLightModel() {
verifyState(GL11.GL_LIGHT_MODEL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "GL_LIGHT_MODEL_AMBIENT initial state");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F));
verifyState(GL11.GL_LIGHT_MODEL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "GL_LIGHT_MODEL_AMBIENT changed state");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_LIGHT_MODEL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F});
verifyState(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SINGLE_COLOR);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR);
verifyState(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SINGLE_COLOR);
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 0.8F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 0.8F);
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, true);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false);
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, true);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false);
verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 0.8F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 0.8F);
verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, true);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false);
verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glLightModeli(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glLightModeli(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1);
verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, true);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false);
}
@Test
void testColorMaterial() {
verifyState(GL11.GL_COLOR_MATERIAL, false);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_CURRENT_BIT);
- GLStateManager.glColor4f(0.8F, 0.6F, 0.4F, 0.2F);
- GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT);
- GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_CURRENT_BIT);
+ GLSMCurrentAttribs.glColor4f(0.8F, 0.6F, 0.4F, 0.2F);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT);
+ GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL);
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
- GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL);
+ GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL);
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
verifyState(GL11.GL_COLOR_MATERIAL, false);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_COLOR_MATERIAL, false);
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT_AND_BACK);
verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE);
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE);
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT);
verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE);
- GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR);
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT);
verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_SPECULAR);
- GLStateManager.glColorMaterial(GL11.GL_BACK, GL11.GL_DIFFUSE);
+ GLSMLighting.glColorMaterial(GL11.GL_BACK, GL11.GL_DIFFUSE);
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_BACK);
verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_DIFFUSE);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT_AND_BACK);
verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE);
}
@@ -217,65 +217,65 @@ public class GLSM_Lighting_UnitTest {
@Test
void testMaterial() {
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F));
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F));
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
verifyMaterialState(GL11.GL_FRONT, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, floats(0.8F, 0.6F, 0.4F, 0.2F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, floats(0.8F, 0.6F, 0.4F, 0.2F));
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
verifyMaterialState(GL11.GL_FRONT, GL11.GL_DIFFUSE, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_DIFFUSE, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "");
verifyMaterialState(GL11.GL_FRONT, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_SPECULAR, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_SPECULAR, floats(0.8F, 0.6F, 0.4F, 0.2F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_SPECULAR, floats(0.8F, 0.6F, 0.4F, 0.2F));
verifyMaterialState(GL11.GL_BACK, GL11.GL_SPECULAR, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_BACK, GL11.GL_SPECULAR, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, "");
verifyMaterialState(GL11.GL_BACK, GL11.GL_EMISSION, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_EMISSION, floats(0.8F, 0.6F, 0.4F, 0.2F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_EMISSION, floats(0.8F, 0.6F, 0.4F, 0.2F));
verifyMaterialState(GL11.GL_BACK, GL11.GL_EMISSION, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_BACK, GL11.GL_EMISSION, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, "");
verifyMaterialState(GL11.GL_FRONT, GL11.GL_SHININESS, new float[]{0.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 5.5F);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 5.5F);
verifyMaterialState(GL11.GL_FRONT, GL11.GL_SHININESS, new float[]{5.5F}, "");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_FRONT, GL11.GL_SHININESS, new float[]{0.0F}, "");
verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.0F, 1.0F, 1.0F}, "");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, floats(0.8F, 0.6F, 0.4F, 0.0F));
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, floats(0.8F, 0.6F, 0.4F, 0.0F));
if (GLStateManager.vendorIsNVIDIA()) {
verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.8F, 0.4F, 0.6F}, "");
} else {
verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.8F, 0.6F, 0.4F}, "");
}
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.0F, 1.0F, 1.0F}, "");
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java
index 4115eb40d..e80f79957 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java
@@ -34,48 +34,48 @@ public class GLSM_LineStipple_GLTest {
@BeforeEach
void setUp() {
- final ViewportState vp = GLStateManager.getViewportState();
+ final ViewportState vp = GLSMRasterizer.getViewportState();
savedX = vp.x;
savedY = vp.y;
savedW = vp.width;
savedH = vp.height;
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L);
- GLStateManager.glEnableVertexAttribArray(POSITION_LOC);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(POSITION_LOC);
- GLStateManager.glViewport(0, 0, W, 1);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(0, W, 0, 1, -1, 1);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glColor4f(1f, 1f, 1f, 1f);
+ GLSMRasterizer.glViewport(0, 0, W, 1);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(0, W, 0, 1, -1, 1);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f);
}
@AfterEach
void tearDown() {
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
- GLStateManager.glLineStipple(1, (short) 0xFFFF);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
- GLStateManager.glViewport(savedX, savedY, savedW, savedH);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMRasterizer.glLineStipple(1, (short) 0xFFFF);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMRasterizer.glViewport(savedX, savedY, savedW, savedH);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
}
private boolean[] renderLine(float x0, float x1) {
@@ -88,18 +88,18 @@ public class GLSM_LineStipple_GLTest {
verts.clear();
for (float x : xs) verts.putFloat(x).putFloat(0.5f).putFloat(0f);
verts.flip();
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STREAM_DRAW);
- GLStateManager.glDrawArrays(xs.length == 2 ? GL11.GL_LINES : GL11.GL_LINE_STRIP, 0, xs.length);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STREAM_DRAW);
+ GLSMDraws.glDrawArrays(xs.length == 2 ? GL11.GL_LINES : GL11.GL_LINE_STRIP, 0, xs.length);
}
private void clear() {
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
private boolean[] readCoverage() {
pixels.clear();
- GLStateManager.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMFramebuffer.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "GL error during readback");
final boolean[] covered = new boolean[W];
@@ -116,8 +116,8 @@ public class GLSM_LineStipple_GLTest {
}
private static void stipple(int factor, int pattern) {
- GLStateManager.glEnable(GL11.GL_LINE_STIPPLE);
- GLStateManager.glLineStipple(factor, (short) pattern);
+ GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE);
+ GLSMRasterizer.glLineStipple(factor, (short) pattern);
}
static Stream patterns() {
@@ -136,11 +136,11 @@ public class GLSM_LineStipple_GLTest {
@ParameterizedTest(name = "{0}")
@MethodSource("patterns")
void patternSelectsTheCoveredPixels(String name, boolean enabled, int factor, int pattern, IntPredicate on) {
- GLStateManager.glLineStipple(factor, (short) pattern);
+ GLSMRasterizer.glLineStipple(factor, (short) pattern);
if (enabled) {
- GLStateManager.glEnable(GL11.GL_LINE_STIPPLE);
+ GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE);
} else {
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
}
assertArrayEquals(expected(on), renderLine(0f, W));
}
@@ -175,7 +175,7 @@ public class GLSM_LineStipple_GLTest {
stipple(1, 0xAAAA);
renderLine(0f, W);
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
assertArrayEquals(expected(i -> true), renderLine(0f, W));
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
index 361656cef..0b1670208 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
@@ -18,7 +18,7 @@ public class GLSM_MatrixStack_UnitTest {
Matrix4f getMatrix(int matrix, boolean cached) {
buffer.clear();
if(cached) {
- GLStateManager.glGetFloat(matrix, buffer);
+ GLSMQueries.glGetFloat(matrix, buffer);
} else {
GL11.glGetFloat(matrix, buffer);
}
@@ -60,28 +60,28 @@ public class GLSM_MatrixStack_UnitTest {
@ParameterizedTest
@EnumSource(MatrixMode.class)
void validateMatrixOperations(MatrixMode matrix) {
- GLStateManager.glMatrixMode(matrix.mode);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(matrix.mode);
+ GLSMMatrices.glLoadIdentity();
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
Matrix4fStack testMatrix = new Matrix4fStack(2);
validateMatrix(testMatrix, matrix.getEnum, "Identity " + matrix.name + " Matrix");
- GLStateManager.glScalef(2.0f, 2.0f, 2.0f);
+ GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f);
testMatrix.scale(2.0f);
validateMatrix(testMatrix, matrix.getEnum, "Scaled " + matrix.name + " Matrix");
- GLStateManager.glTranslatef(2.0f, 2.0f, 2.0f);
+ GLSMMatrices.glTranslatef(2.0f, 2.0f, 2.0f);
testMatrix.translate(2.0f, 2.0f, 2.0f);
validateMatrix(testMatrix, matrix.getEnum, "Translated " + matrix.name + " Matrix");
- GLStateManager.glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
testMatrix.rotate((float) Math.toRadians(180.0f), 0.0f, 0.0f, 1.0f);
validateMatrix(testMatrix, matrix.getEnum, "Rotated " + matrix.name + " Matrix");
- GLStateManager.glOrtho(0, 800, 0, 600, -1, 1);
+ GLSMMatrices.glOrtho(0, 800, 0, 600, -1, 1);
testMatrix.ortho(0, 800, 0, 600, -1, 1);
validateMatrix(testMatrix, matrix.getEnum, "Ortho " + matrix.name + " Matrix");
@@ -90,13 +90,13 @@ public class GLSM_MatrixStack_UnitTest {
testLoad.m12(12f);
testLoad.get(buffer);
- GLStateManager.glLoadMatrix(buffer);
+ GLSMMatrices.glLoadMatrix(buffer);
validateMatrix(testLoad, matrix.getEnum, "Loaded " + matrix.name + " Matrix");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
testMatrix.identity();
validateMatrix(testMatrix, matrix.getEnum, "Popped " + matrix.name + " Matrix");
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java
index a317c4f18..2eb82c2a7 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java
@@ -13,23 +13,23 @@ public class GLSM_MaxBoundTextureUnit_UnitTest {
void testHighWaterMarkTracksNonZeroBindsOnly() {
final int texId = GL11.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE5);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- assertTrue(GLStateManager.getMaxBoundTextureUnit() >= 5);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE5);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ assertTrue(GLSMTextures.getMaxBoundTextureUnit() >= 5);
- final int before = GLStateManager.getMaxBoundTextureUnit();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + before + 3);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- assertEquals(before, GLStateManager.getMaxBoundTextureUnit(), "binding 0 must not raise the mark");
+ final int before = GLSMTextures.getMaxBoundTextureUnit();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + before + 3);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ assertEquals(before, GLSMTextures.getMaxBoundTextureUnit(), "binding 0 must not raise the mark");
- GLStateManager.trackMaxBoundTextureUnit(before + 7);
- assertEquals(before + 7, GLStateManager.getMaxBoundTextureUnit());
- GLStateManager.trackMaxBoundTextureUnit(0);
- assertEquals(before + 7, GLStateManager.getMaxBoundTextureUnit(), "mark is monotonic");
+ GLSMTextures.trackMaxBoundTextureUnit(before + 7);
+ assertEquals(before + 7, GLSMTextures.getMaxBoundTextureUnit());
+ GLSMTextures.trackMaxBoundTextureUnit(0);
+ assertEquals(before + 7, GLSMTextures.getMaxBoundTextureUnit(), "mark is monotonic");
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE5);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE5);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glDeleteTextures(texId);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java
index 1b7987e36..8df9a05dd 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java
@@ -31,24 +31,24 @@ public class GLSM_OffContextCreation_GLTest {
private static Map creationCalls() {
final Map calls = new LinkedHashMap<>();
- calls.put("glGenTextures()", GLStateManager::glGenTextures);
- calls.put("glGenTextures(IntBuffer)", () -> GLStateManager.glGenTextures(BufferUtils.createIntBuffer(1)));
- calls.put("glGenSamplers()", GLStateManager::glGenSamplers);
- calls.put("glGenSamplers(IntBuffer)", () -> GLStateManager.glGenSamplers(BufferUtils.createIntBuffer(1)));
- calls.put("glGenSamplers(int[])", () -> GLStateManager.glGenSamplers(new int[1]));
- calls.put("glGenBuffers()", GLStateManager::glGenBuffers);
- calls.put("glGenBuffers(IntBuffer)", () -> GLStateManager.glGenBuffers(BufferUtils.createIntBuffer(1)));
- calls.put("glGenBuffers(int[])", () -> GLStateManager.glGenBuffers(new int[1]));
- calls.put("glCreateBuffers()", GLStateManager::glCreateBuffers);
- calls.put("glCreateBuffers(IntBuffer)", () -> GLStateManager.glCreateBuffers(BufferUtils.createIntBuffer(1)));
- calls.put("glCreateBuffers(int[])", () -> GLStateManager.glCreateBuffers(new int[1]));
- calls.put("glGenVertexArrays()", GLStateManager::glGenVertexArrays);
- calls.put("glGenFramebuffers()", GLStateManager::glGenFramebuffers);
- calls.put("glGenRenderbuffers()", GLStateManager::glGenRenderbuffers);
- calls.put("glGenQueries()", GLStateManager::glGenQueries);
- calls.put("glGenQueries(IntBuffer)", () -> GLStateManager.glGenQueries(BufferUtils.createIntBuffer(1)));
- calls.put("glCreateShader", () -> GLStateManager.glCreateShader(GL20.GL_VERTEX_SHADER));
- calls.put("glCreateProgram", GLStateManager::glCreateProgram);
+ calls.put("glGenTextures()", GLSMTextures::glGenTextures);
+ calls.put("glGenTextures(IntBuffer)", () -> GLSMTextures.glGenTextures(BufferUtils.createIntBuffer(1)));
+ calls.put("glGenSamplers()", GLSMTextures::glGenSamplers);
+ calls.put("glGenSamplers(IntBuffer)", () -> GLSMTextures.glGenSamplers(BufferUtils.createIntBuffer(1)));
+ calls.put("glGenSamplers(int[])", () -> GLSMTextures.glGenSamplers(new int[1]));
+ calls.put("glGenBuffers()", GLSMBuffers::glGenBuffers);
+ calls.put("glGenBuffers(IntBuffer)", () -> GLSMBuffers.glGenBuffers(BufferUtils.createIntBuffer(1)));
+ calls.put("glGenBuffers(int[])", () -> GLSMBuffers.glGenBuffers(new int[1]));
+ calls.put("glCreateBuffers()", GLSMBuffers::glCreateBuffers);
+ calls.put("glCreateBuffers(IntBuffer)", () -> GLSMBuffers.glCreateBuffers(BufferUtils.createIntBuffer(1)));
+ calls.put("glCreateBuffers(int[])", () -> GLSMBuffers.glCreateBuffers(new int[1]));
+ calls.put("glGenVertexArrays()", GLSMVertexInput::glGenVertexArrays);
+ calls.put("glGenFramebuffers()", GLSMFramebuffer::glGenFramebuffers);
+ calls.put("glGenRenderbuffers()", GLSMFramebuffer::glGenRenderbuffers);
+ calls.put("glGenQueries()", GLSMQueries::glGenQueries);
+ calls.put("glGenQueries(IntBuffer)", () -> GLSMQueries.glGenQueries(BufferUtils.createIntBuffer(1)));
+ calls.put("glCreateShader", () -> GLSMPrograms.glCreateShader(GL20.GL_VERTEX_SHADER));
+ calls.put("glCreateProgram", GLSMPrograms::glCreateProgram);
calls.put("RenderSystem.createTexture", () -> RenderSystem.createTexture(GL11.GL_TEXTURE_2D));
calls.put("RenderSystem.createFramebuffer", RenderSystem::createFramebuffer);
return calls;
@@ -67,9 +67,9 @@ public class GLSM_OffContextCreation_GLTest {
void creationOnSharedContextThreadPasses() throws Exception {
sharedDrawable = new SharedDrawable(Display.getDrawable());
DrawableContexts.run(sharedDrawable, "glsm-shared-context", () -> {
- final int texture = GLStateManager.glGenTextures();
+ final int texture = GLSMTextures.glGenTextures();
assertNotEquals(0, texture, "no texture name on a thread that owns a shared context");
- GLStateManager.glDeleteTextures(texture);
+ GLSMTextures.glDeleteTextures(texture);
});
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java
index bc54b7809..1e6b38bea 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java
@@ -93,16 +93,16 @@ public class GLSM_PerThread_UnitTest {
GLStateManager.enterWorkerContext();
try {
final int count = tid + 1;
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- final int gen0 = GLStateManager.getMvGeneration();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ final int gen0 = GLSMMatrices.getMvGeneration();
- for (int k = 0; k < count; k++) GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ for (int k = 0; k < count; k++) GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
barrier.await();
- assertEquals(gen0 + count, GLStateManager.getMvGeneration(), "mvGeneration must advance only by this thread's own translate count");
- final Matrix4f m = new Matrix4f(GLStateManager.getModelViewMatrix());
+ assertEquals(gen0 + count, GLSMMatrices.getMvGeneration(), "mvGeneration must advance only by this thread's own translate count");
+ final Matrix4f m = new Matrix4f(GLSMMatrices.getModelViewMatrix());
assertEquals((float) count, m.m30(), 1e-6f, "accumulated X translation must reflect only this thread's ops");
} finally {
GLStateManager.exitWorkerContext();
@@ -116,14 +116,14 @@ public class GLSM_PerThread_UnitTest {
runThreaded(n, (tid, barrier) -> {
GLStateManager.enterWorkerContext();
try {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(5.0f + tid, 0.0f, 0.0f);
- assertEquals(5.0f + tid, new Matrix4f(GLStateManager.getModelViewMatrix()).m30(), 1e-6f, "translation must apply within the pushed scope");
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(5.0f + tid, 0.0f, 0.0f);
+ assertEquals(5.0f + tid, new Matrix4f(GLSMMatrices.getModelViewMatrix()).m30(), 1e-6f, "translation must apply within the pushed scope");
barrier.await();
- GLStateManager.glPopMatrix();
- assertEquals(0.0f, new Matrix4f(GLStateManager.getModelViewMatrix()).m30(), 1e-6f, "pop must restore this thread's matrix independent of other threads");
+ GLSMMatrices.glPopMatrix();
+ assertEquals(0.0f, new Matrix4f(GLSMMatrices.getModelViewMatrix()).m30(), 1e-6f, "pop must restore this thread's matrix independent of other threads");
} finally {
GLStateManager.exitWorkerContext();
}
@@ -149,18 +149,18 @@ public class GLSM_PerThread_UnitTest {
runThreaded(n, (tid, barrier) -> {
final GLContextState c = GLStateManager.enterWorkerContext();
try {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
barrier.await();
for (int i = 0; i < iterations; i++) {
c.activeProgram = tid;
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
- GLStateManager.glPopMatrix();
- if (GLStateManager.getActiveProgram() != tid) mismatches.incrementAndGet();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPopMatrix();
+ if (GLSMPrograms.getActiveProgram() != tid) mismatches.incrementAndGet();
if (c.activeProgram != tid) mismatches.incrementAndGet();
}
- assertEquals(0.0f, new Matrix4f(GLStateManager.getModelViewMatrix()).m30(), 1e-6f, "balanced push/pop must leave this thread's matrix at identity");
+ assertEquals(0.0f, new Matrix4f(GLSMMatrices.getModelViewMatrix()).m30(), 1e-6f, "balanced push/pop must leave this thread's matrix at identity");
} finally {
GLStateManager.exitWorkerContext();
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java
index 6c7ef44fb..d2fca995c 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java
@@ -13,7 +13,7 @@ public class GLSM_PolygonOffsetClamp_UnitTest {
@AfterEach
void reset() {
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
}
private static float cachedClamp() {
@@ -22,7 +22,7 @@ public class GLSM_PolygonOffsetClamp_UnitTest {
@Test
void zeroClampTakesThePlainPath() {
- GLStateManager.glPolygonOffsetClamp(1.5f, 2.5f, 0.0f);
+ GLSMRasterizer.glPolygonOffsetClamp(1.5f, 2.5f, 0.0f);
assertEquals(1.5f, GLStateManager.ctx().polygonState.getOffsetFactor());
assertEquals(2.5f, GLStateManager.ctx().polygonState.getOffsetUnits());
assertEquals(1.5f, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR));
@@ -33,13 +33,13 @@ public class GLSM_PolygonOffsetClamp_UnitTest {
@Test
void plainOffsetClearsTheCachedClamp() {
GLStateManager.ctx().polygonState.setOffsetClamp(0.25f);
- GLStateManager.glPolygonOffset(1.0f, 1.0f);
+ GLSMRasterizer.glPolygonOffset(1.0f, 1.0f);
assertEquals(0.0f, cachedClamp());
}
@Test
void nonZeroClampFailsByNameOnTheGLBackend() {
- final UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> GLStateManager.glPolygonOffsetClamp(1.0f, 1.0f, 0.5f));
+ final UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> GLSMRasterizer.glPolygonOffsetClamp(1.0f, 1.0f, 0.5f));
assertTrue(e.getMessage().contains("polygon offset clamp"), e::getMessage);
assertTrue(e.getMessage().indexOf(':') > 0, () -> "message must name the backend: " + e.getMessage());
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java
index e54817739..e8a003fea 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java
@@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
public class GLSM_PopAttribMaskFidelity_GLTest {
private static int scanClipPlaneMask() {
- final BooleanStateStack[] planes = GLStateManager.getClipPlaneStates();
+ final BooleanStateStack[] planes = GLSMRasterizer.getClipPlaneStates();
int mask = 0;
for (int i = 0; i < planes.length; i++) {
if (planes[i].isEnabled()) mask |= (1 << i);
@@ -29,7 +29,7 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
private static void verifyClipPlaneMask(String message) {
final int scanned = scanClipPlaneMask();
assertEquals(scanned, GLStateManager.ctx().clipPlaneEnabledMask, message + " - mask mismatch");
- assertEquals(scanned != 0, GLStateManager.anyClipPlaneEnabled(), message + " - anyClipPlaneEnabled mismatch");
+ assertEquals(scanned != 0, GLSMRasterizer.anyClipPlaneEnabled(), message + " - anyClipPlaneEnabled mismatch");
}
@Test
@@ -37,13 +37,13 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Initial");
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - Not a GL_COLOR_BUFFER_BIT member, must stay toggled");
} finally {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
}
}
@@ -52,18 +52,18 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - After enable inside inner bracket");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - Inner pop is not a member, must stay toggled");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Outer pop is a member, must restore to pre-inner value");
} finally {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
}
}
@@ -72,18 +72,18 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - After enable at outer depth");
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - Inner pop is not a member, must stay toggled");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Outer pop is a member, must restore");
} finally {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
}
}
@@ -92,16 +92,16 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial");
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After multiple toggles at one depth");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - GL_COLOR_BUFFER_BIT member, must restore original");
} finally {
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
}
}
@@ -111,18 +111,18 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - Initial");
verifyIsEnabled(GL11.GL_LIGHT0, false, "Light0 - Initial");
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_LIGHT0);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
verifyIsEnabled(GL11.GL_LIGHTING, true, "Lighting - After enable");
verifyIsEnabled(GL11.GL_LIGHT0, true, "Light0 - After enable");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - GL_LIGHTING_BIT member, must restore");
verifyIsEnabled(GL11.GL_LIGHT0, false, "Light0 - GL_LIGHTING_BIT member, must restore");
} finally {
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
}
}
@@ -131,15 +131,15 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyClipPlaneMask("Initial");
- GLStateManager.glEnable(GL11.GL_CLIP_PLANE0);
+ GLSMEnable.glEnable(GL11.GL_CLIP_PLANE0);
verifyIsEnabled(GL11.GL_CLIP_PLANE0, true, "Clip0 - After enable");
verifyClipPlaneMask("After enable");
- GLStateManager.glDisable(GL11.GL_CLIP_PLANE0);
+ GLSMEnable.glDisable(GL11.GL_CLIP_PLANE0);
verifyIsEnabled(GL11.GL_CLIP_PLANE0, false, "Clip0 - After disable");
verifyClipPlaneMask("After disable");
} finally {
- GLStateManager.glDisable(GL11.GL_CLIP_PLANE0);
+ GLSMEnable.glDisable(GL11.GL_CLIP_PLANE0);
}
}
@@ -155,16 +155,16 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyClipPlaneMask("Initial");
- GLStateManager.glPushAttrib(bit);
- GLStateManager.glEnable(plane);
+ GLSMAttribStack.glPushAttrib(bit);
+ GLSMEnable.glEnable(plane);
verifyIsEnabled(plane, true, "After enable inside " + bitName);
verifyClipPlaneMask("After enable inside " + bitName);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(plane, !member, member ? bitName + " member, must restore" : "Not a " + bitName + " member, must stay toggled");
verifyClipPlaneMask("After " + bitName + " pop");
} finally {
- GLStateManager.glDisable(plane);
+ GLSMEnable.glDisable(plane);
}
}
@@ -173,29 +173,29 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
final int[] boxA = { 10, 20, 100, 200 };
final int[] boxB = { 30, 40, 50, 60 };
try {
- GLStateManager.glScissor(boxA[0], boxA[1], boxA[2], boxA[3]);
- GLStateManager.disableScissorTest();
+ GLSMRasterizer.glScissor(boxA[0], boxA[1], boxA[2], boxA[3]);
+ GLSMRasterizer.disableScissorTest();
verifyState(GL11.GL_SCISSOR_BOX, boxA, "Scissor box - Initial");
verifyIsEnabled(GL11.GL_SCISSOR_TEST, false, "Scissor - Initial");
- GLStateManager.glPushAttrib(GL11.GL_SCISSOR_BIT);
- GLStateManager.enableScissorTest();
- GLStateManager.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_SCISSOR_BIT);
+ GLSMRasterizer.enableScissorTest();
+ GLSMRasterizer.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]);
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_SCISSOR_BOX, boxA, "Scissor box - GL_SCISSOR_BIT member, must restore");
verifyIsEnabled(GL11.GL_SCISSOR_TEST, false, "Scissor - GL_SCISSOR_BIT member, must restore");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableScissorTest();
- GLStateManager.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMRasterizer.enableScissorTest();
+ GLSMRasterizer.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]);
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_SCISSOR_BOX, boxB, "Scissor box - Not a GL_ENABLE_BIT member, must stay changed");
verifyIsEnabled(GL11.GL_SCISSOR_TEST, false, "Scissor - GL_ENABLE_BIT member, must restore");
} finally {
- GLStateManager.disableScissorTest();
- GLStateManager.glScissor(0, 0, 800, 600);
+ GLSMRasterizer.disableScissorTest();
+ GLSMRasterizer.glScissor(0, 0, 800, 600);
}
}
@@ -204,27 +204,27 @@ public class GLSM_PopAttribMaskFidelity_GLTest {
try {
verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, false, "RasterizerDiscard - Initial");
- GLStateManager.glEnable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMEnable.glEnable(GL30.GL_RASTERIZER_DISCARD);
verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, true, "RasterizerDiscard - After enable");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD);
verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, false, "RasterizerDiscard - After disable inside GL_ENABLE_BIT");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, false, "RasterizerDiscard - Not a GL_ENABLE_BIT member, must stay disabled");
} finally {
- GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD);
}
}
@Test
void clearDepthIsClamped() {
try {
- GLStateManager.glClearDepth(2.0);
+ GLSMDepthStencilAlpha.glClearDepth(2.0);
verifyState(GL11.GL_DEPTH_CLEAR_VALUE, 1.0f, "Depth clear value - glClearDepth(2.0) must clamp to 1.0");
} finally {
- GLStateManager.glClearDepth(1.0);
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
index 095cea57e..b962084ea 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
@@ -54,9 +54,9 @@ class GLSM_PushPop_UnitTest {
for (GLBit bit : bits) {
verifyState(bit.glEnum(), bit.initial(), bit.name() + " Initial State");
if (bit.initial()) {
- GLStateManager.glDisable(bit.glEnum());
+ GLSMEnable.glDisable(bit.glEnum());
} else {
- GLStateManager.glEnable(bit.glEnum());
+ GLSMEnable.glEnable(bit.glEnum());
}
verifyState(bit.glEnum(), !bit.initial(), bit.name() + " Toggle State");
}
@@ -71,7 +71,7 @@ class GLSM_PushPop_UnitTest {
@Test
void testPushPopColorBufferBit() {
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
/*
* GL_COLOR_BUFFER_BIT
* GL_ALPHA_TEST enable bit
@@ -89,20 +89,20 @@ class GLSM_PushPop_UnitTest {
* Color mode and index mode writemasks
*/
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_NEVER, 1f);
- GLStateManager.enableBlend();
- GLStateManager.glDisable(GL11.GL_DITHER);
- GLStateManager.glEnable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glEnable(GL11.GL_INDEX_LOGIC_OP);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glBlendColor(1f, 1f, 1f, 1f);
- GLStateManager.glBlendEquationSeparate(GL14.GL_FUNC_REVERSE_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT);
- GLStateManager.glDrawBuffer(GL11.GL_FRONT_AND_BACK);
- GLStateManager.glLogicOp(GL11.GL_OR);
- GLStateManager.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); // This should not be reset
- GLStateManager.glColorMask(false, false, false, false);
- GLStateManager.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_NEVER, 1f);
+ GLSMBlend.enableBlend();
+ GLSMEnable.glDisable(GL11.GL_DITHER);
+ GLSMEnable.glEnable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMEnable.glEnable(GL11.GL_INDEX_LOGIC_OP);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.glBlendColor(1f, 1f, 1f, 1f);
+ GLSMBlend.glBlendEquationSeparate(GL14.GL_FUNC_REVERSE_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT);
+ GLSMFramebuffer.glDrawBuffer(GL11.GL_FRONT_AND_BACK);
+ GLSMBlend.glLogicOp(GL11.GL_OR);
+ GLSMCurrentAttribs.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); // This should not be reset
+ GLSMBlend.glColorMask(false, false, false, false);
+ GLSMBlend.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "Alpha Test Enable");
@@ -124,7 +124,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_COLOR_CLEAR_VALUE, FLOAT_ARRAY_4_POINT_5, "Color Clear Value");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "Alpha Test Enable - Reset");
verifyState(GL11.GL_ALPHA_TEST_FUNC, GL11.GL_ALWAYS, "Alpha Test Function - Reset");
verifyState(GL11.GL_ALPHA_TEST_REF, 0f, "Alpha Test Reference - Reset");
@@ -135,7 +135,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL14.GL_BLEND_EQUATION, GL14.GL_FUNC_ADD, "Blend Equation - Reset");
verifyState(GL20.GL_BLEND_EQUATION_ALPHA, GL14.GL_FUNC_ADD, "Blend Equation Alpha - Reset");
verifyIsEnabled(GL11.GL_DITHER, true, "Dither Enable - Reset");
- verifyState(GL11.GL_DRAW_BUFFER, GLStateManager.DEFAULT_DRAW_BUFFER, "Draw Buffer - Reset");
+ verifyState(GL11.GL_DRAW_BUFFER, GLSMFramebuffer.DEFAULT_DRAW_BUFFER, "Draw Buffer - Reset");
verifyIsEnabled(GL11.GL_COLOR_LOGIC_OP, false, "Color Logic Op Enable - Reset");
verifyIsEnabled(GL11.GL_INDEX_LOGIC_OP, false, "Index Logic Op Enable - Reset");
verifyState(GL11.GL_LOGIC_OP_MODE, GL11.GL_COPY, "Logic Op Mode - Reset");
@@ -149,10 +149,10 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "Initial Color State"); // Verify no state leakage from other tests
verifyState(GL11.GL_CURRENT_TEXTURE_COORDS, FLOAT_ARRAY_4_0001, "Initial Texture Coordinates");
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
- GLStateManager.glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
- GLStateManager.glNormal3f(0.5f, 0.5f, 0.5f);
- GLStateManager.glTexCoord4f(0.5f, 0.5f, 0.5f, 0.5f);
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMCurrentAttribs.glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
+ GLSMCurrentAttribs.glNormal3f(0.5f, 0.5f, 0.5f);
+ GLSMCurrentAttribs.glTexCoord4f(0.5f, 0.5f, 0.5f, 0.5f);
verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_POINT_5, "Current Color");
@@ -160,7 +160,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_CURRENT_TEXTURE_COORDS, FLOAT_ARRAY_4_POINT_5, "Texture coordinates");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "Current Color - reset");
verifyState(GL11.GL_CURRENT_NORMAL, FLOAT_ARRAY_3_001, "Current normal - reset");
verifyState(GL11.GL_CURRENT_TEXTURE_COORDS, FLOAT_ARRAY_4_0001, "Texture coordinates - reset");
@@ -170,18 +170,18 @@ class GLSM_PushPop_UnitTest {
void testPushPopDepthBufferBit() {
verifyState(GL11.GL_DEPTH_WRITEMASK, true, "GL_DEPTH_WRITEMASK Initial State");
- GLStateManager.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_NEVER);
- GLStateManager.glClearDepth(0.5f); // Not currently Implemented in GLSM
- GLStateManager.glDepthMask(false);
+ GLSMAttribStack.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_NEVER);
+ GLSMDepthStencilAlpha.glClearDepth(0.5f); // Not currently Implemented in GLSM
+ GLSMDepthStencilAlpha.glDepthMask(false);
verifyState(GL11.GL_DEPTH_TEST, true, "Depth Test");
verifyState(GL11.GL_DEPTH_FUNC, GL11.GL_NEVER, "Depth Function");
verifyState(GL11.GL_DEPTH_CLEAR_VALUE, 0.5f, "Depth Clear Value");
verifyState(GL11.GL_DEPTH_WRITEMASK, false, "Depth Write Mask");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_DEPTH_TEST, false, "Depth Test - Reset");
verifyState(GL11.GL_DEPTH_FUNC, GL11.GL_LESS, "Depth Function - Reset");
verifyState(GL11.GL_DEPTH_CLEAR_VALUE, 1f, "Depth Clear Value - Reset");
@@ -259,10 +259,10 @@ class GLSM_PushPop_UnitTest {
bits.add(new GLBit(GL11.GL_TEXTURE_GEN_R, "Texture Gen R", false));
bits.add(new GLBit(GL11.GL_TEXTURE_GEN_Q, "Texture Gen Q", false));
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
toggleAndVerify(bits);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyReset(bits);
}
@@ -270,15 +270,15 @@ class GLSM_PushPop_UnitTest {
@Test
void testPushPopFogBit() {
final FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(16);
- GLStateManager.glPushAttrib(GL11.GL_FOG_BIT);
- GLStateManager.glEnable(GL11.GL_FOG);
+ GLSMAttribStack.glPushAttrib(GL11.GL_FOG_BIT);
+ GLSMEnable.glEnable(GL11.GL_FOG);
floatBuffer.put(FLOAT_ARRAY_4_POINT_5).flip();
- GLStateManager.glFog(GL11.GL_FOG_COLOR, floatBuffer);
+ GLSMFog.glFog(GL11.GL_FOG_COLOR, floatBuffer);
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5f);
- GLStateManager.glFogf(GL11.GL_FOG_END, 0.5f);
- GLStateManager.glFogf(GL11.GL_FOG_START, 0.5f);
- GLStateManager.glFogf(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 0.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 0.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
// Fog index not tracked by GLSM (MC 1.7.10 never uses it)
verifyIsEnabled(GL11.GL_FOG, true, "Fog Enable");
@@ -288,7 +288,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_FOG_START, 0.5f, "Fog Start");
verifyState(GL11.GL_FOG_MODE, GL11.GL_LINEAR, "Fog Mode");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_FOG, false, "Fog Enable - Reset");
verifyState(GL11.GL_FOG_COLOR, FLOAT_ARRAY_4_0, "Fog Color - Reset");
verifyState(GL11.GL_FOG_DENSITY, 1f, "Fog Density - Reset");
@@ -308,23 +308,23 @@ class GLSM_PushPop_UnitTest {
bits.add(new GLBit(GL11.GL_LIGHT0 + i, "Light " + i, false));
}
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT);
// Ambient scene color ??
- GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1f);
- GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1f);
+ GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1f);
+ GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1f);
floatBuffer.put(FLOAT_ARRAY_4_POINT_5).flip();
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floatBuffer);
- GLStateManager.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floatBuffer);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floatBuffer);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floatBuffer);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floatBuffer);
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floatBuffer);
+ GLSMLighting.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floatBuffer);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floatBuffer);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floatBuffer);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floatBuffer);
floatBuffer.put(FLOAT_ARRAY_4_0010).flip();
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floatBuffer);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floatBuffer);
floatBuffer.put(FLOAT_ARRAY_4_0).flip();
- GLStateManager.glShadeModel(GL11.GL_FLAT);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT, "Color Material Face");
@@ -342,7 +342,7 @@ class GLSM_PushPop_UnitTest {
toggleAndVerify(bits);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT_AND_BACK, "Color Material Face - Reset");
verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE, "Color Material Parameter - Reset");
verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false, "Light Model Local Viewer - Reset");
@@ -372,38 +372,38 @@ class GLSM_PushPop_UnitTest {
final int tex1 = GL11.glGenTextures();
final int tex2 = GL11.glGenTextures();
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 0");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture");
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding - Unit 1 - Switch");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex2);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex2);
verifyState(GL11.GL_TEXTURE_BINDING_2D, tex2, "Texture Binding - Unit 1 - Set");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture");
verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 0");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture");
verifyState(GL11.GL_TEXTURE_BINDING_2D, tex2, "Texture Binding - Unit 1");
toggleAndVerify(bits);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture Unit 0 - Reset");
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Unit 0 - Reset");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Unit 1 - Reset");
verifyReset(bits);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(tex1);
- GLStateManager.glDeleteTextures(tex2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(tex1);
+ GLSMTextures.glDeleteTextures(tex2);
}
@Test
@@ -414,34 +414,34 @@ class GLSM_PushPop_UnitTest {
final int tex1 = GL11.glGenTextures();
final int tex2 = GL11.glGenTextures();
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1);
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture");
verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 1");
- GLStateManager.glDeleteTextures(tex2);
+ GLSMTextures.glDeleteTextures(tex2);
verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 1");
- GLStateManager.glDeleteTextures(tex1);
+ GLSMTextures.glDeleteTextures(tex1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 1");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 0");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture - Reset 1");
// After pop, binding a deleted texture is driver-specific:
// - Mesa: calls bindTexture_no_error which recreates the texture, returns tex1
// - Nvidia: refuses to bind deleted texture, returns 0
int binding = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
assertTrue(binding == 0 || binding == tex1, "Texture Binding after pop with deleted texture - Unit 1: expected 0 or " + tex1 + ", got " + binding);
- GLStateManager.glDeleteTextures(tex1);
+ GLSMTextures.glDeleteTextures(tex1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 1");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 0");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture - Reset 2");
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding - Reset 2");
}
@@ -452,16 +452,16 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_NORMALIZE, false, "Initial Normalize");
verifyState(GL12.GL_RESCALE_NORMAL, false, "Initial Rescale Normal");
- GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glEnable(GL11.GL_NORMALIZE);
- GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMEnable.glEnable(GL11.GL_NORMALIZE);
+ GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL);
verifyState(GL11.GL_MATRIX_MODE, GL11.GL_PROJECTION, "Matrix Mode");
verifyState(GL11.GL_NORMALIZE, true, "Normalize");
verifyState(GL12.GL_RESCALE_NORMAL, true, "Rescale Normal");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_MATRIX_MODE, GL11.GL_MODELVIEW, "Matrix Mode - Reset");
verifyState(GL11.GL_NORMALIZE, false, "Normalize - Reset");
verifyState(GL12.GL_RESCALE_NORMAL, false, "Rescale Normal - Reset");
@@ -469,18 +469,18 @@ class GLSM_PushPop_UnitTest {
@Test
void testPushPopViewportBit() {
- GLStateManager.glViewport(0, 0, 800, 600);
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
verifyState(GL11.GL_VIEWPORT, new int[] { 0, 0, 800, 600 }, "Viewport - Initial");
verifyState(GL11.GL_DEPTH_RANGE, new float[] { 0.0f, 1.0f }, "Depth Range - Initial");
- GLStateManager.glPushAttrib(GL11.GL_VIEWPORT_BIT);
- GLStateManager.glViewport(1, 1, 100, 100);
- GLStateManager.glDepthRange(0.5, 1.0);
+ GLSMAttribStack.glPushAttrib(GL11.GL_VIEWPORT_BIT);
+ GLSMRasterizer.glViewport(1, 1, 100, 100);
+ GLSMDepthStencilAlpha.glDepthRange(0.5, 1.0);
verifyState(GL11.GL_VIEWPORT, new int[] { 1, 1, 100, 100 }, "Viewport");
verifyState(GL11.GL_DEPTH_RANGE, new float[] { 0.5f, 1.0f }, "Depth Range");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_VIEWPORT, new int[] { 0, 0, 800, 600 }, "Viewport - Reset");
verifyState(GL11.GL_DEPTH_RANGE, new float[] { 0.0f, 1.0f }, "Depth Range - Reset");
}
@@ -492,16 +492,16 @@ class GLSM_PushPop_UnitTest {
verifyIsEnabled(GL11.GL_LINE_SMOOTH, false, "Line Smooth - Initial");
verifyIsEnabled(GL11.GL_LINE_STIPPLE, false, "Line Stipple - Initial");
- GLStateManager.glPushAttrib(GL11.GL_LINE_BIT);
- GLStateManager.glLineWidth(2.5f);
- GLStateManager.glEnable(GL11.GL_LINE_SMOOTH);
- GLStateManager.glEnable(GL11.GL_LINE_STIPPLE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_LINE_BIT);
+ GLSMRasterizer.glLineWidth(2.5f);
+ GLSMEnable.glEnable(GL11.GL_LINE_SMOOTH);
+ GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE);
verifyState(GL11.GL_LINE_WIDTH, 2.5f, "Line Width");
verifyIsEnabled(GL11.GL_LINE_SMOOTH, true, "Line Smooth");
verifyIsEnabled(GL11.GL_LINE_STIPPLE, true, "Line Stipple");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_LINE_WIDTH, 1.0f, "Line Width - Reset");
verifyIsEnabled(GL11.GL_LINE_SMOOTH, false, "Line Smooth - Reset");
verifyIsEnabled(GL11.GL_LINE_STIPPLE, false, "Line Stipple - Reset");
@@ -517,14 +517,14 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_POINT_SIZE, 1.0f, "Point Size - Initial");
verifyIsEnabled(GL11.GL_POINT_SMOOTH, false, "Point Smooth - Initial");
- GLStateManager.glPushAttrib(GL11.GL_POINT_BIT);
- GLStateManager.glPointSize(5.0f);
- GLStateManager.glEnable(GL11.GL_POINT_SMOOTH);
+ GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT);
+ GLSMRasterizer.glPointSize(5.0f);
+ GLSMEnable.glEnable(GL11.GL_POINT_SMOOTH);
verifyState(GL11.GL_POINT_SIZE, 5.0f, "Point Size");
verifyIsEnabled(GL11.GL_POINT_SMOOTH, true, "Point Smooth");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_POINT_SIZE, 1.0f, "Point Size - Reset");
verifyIsEnabled(GL11.GL_POINT_SMOOTH, false, "Point Smooth - Reset");
}
@@ -557,17 +557,17 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_POLYGON_OFFSET_FACTOR, 0.0f, "Polygon Offset Factor - Initial");
verifyState(GL11.GL_POLYGON_OFFSET_UNITS, 0.0f, "Polygon Offset Units - Initial");
- GLStateManager.glPushAttrib(GL11.GL_POLYGON_BIT);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.glFrontFace(GL11.GL_CW);
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
- GLStateManager.glEnable(GL11.GL_POLYGON_SMOOTH);
- GLStateManager.glEnable(GL11.GL_POLYGON_STIPPLE);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_LINE);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_POINT);
- GLStateManager.glPolygonOffset(1.5f, 2.0f);
+ GLSMAttribStack.glPushAttrib(GL11.GL_POLYGON_BIT);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMRasterizer.glFrontFace(GL11.GL_CW);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_SMOOTH);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_STIPPLE);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_LINE);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_POINT);
+ GLSMRasterizer.glPolygonOffset(1.5f, 2.0f);
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull Face");
verifyState(GL11.GL_CULL_FACE_MODE, GL11.GL_FRONT, "Cull Face Mode");
@@ -581,7 +581,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_POLYGON_OFFSET_FACTOR, 1.5f, "Polygon Offset Factor");
verifyState(GL11.GL_POLYGON_OFFSET_UNITS, 2.0f, "Polygon Offset Units");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull Face - Reset");
verifyState(GL11.GL_CULL_FACE_MODE, GL11.GL_BACK, "Cull Face Mode - Reset");
verifyState(GL11.GL_FRONT_FACE, GL11.GL_CCW, "Front Face - Reset");
@@ -621,12 +621,12 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_STENCIL_CLEAR_VALUE, 0, "Stencil Clear Value - Initial");
verifyState(GL11.GL_STENCIL_WRITEMASK, initialWriteMask, "Stencil Write Mask - Initial");
- GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(GL11.GL_LESS, 127, 0x7F);
- GLStateManager.glStencilOp(GL11.GL_INCR, GL11.GL_DECR, GL11.GL_REPLACE);
- GLStateManager.glStencilMask(0x0F);
- GLStateManager.glClearStencil(64);
+ GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_LESS, 127, 0x7F);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_INCR, GL11.GL_DECR, GL11.GL_REPLACE);
+ GLSMDepthStencilAlpha.glStencilMask(0x0F);
+ GLSMDepthStencilAlpha.glClearStencil(64);
verifyIsEnabled(GL11.GL_STENCIL_TEST, true, "Stencil Test");
verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_LESS, "Stencil Func");
@@ -638,7 +638,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_STENCIL_CLEAR_VALUE, 64, "Stencil Clear Value");
verifyState(GL11.GL_STENCIL_WRITEMASK, 0x0F, "Stencil Write Mask");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_STENCIL_TEST, false, "Stencil Test - Reset");
verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_ALWAYS, "Stencil Func - Reset");
verifyState(GL11.GL_STENCIL_REF, 0, "Stencil Ref - Reset");
@@ -671,14 +671,14 @@ class GLSM_PushPop_UnitTest {
verifyState(GL20.GL_STENCIL_BACK_PASS_DEPTH_PASS, GL11.GL_KEEP, "Stencil Back Pass Depth Pass - Initial");
verifyState(GL20.GL_STENCIL_BACK_WRITEMASK, initialBackWriteMask, "Stencil Back Write Mask - Initial");
- GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
// Use separate functions to set different front/back state
- GLStateManager.glStencilFuncSeparate(GL11.GL_FRONT, GL11.GL_LESS, 10, 0x0A);
- GLStateManager.glStencilFuncSeparate(GL11.GL_BACK, GL11.GL_GREATER, 20, 0x0B);
- GLStateManager.glStencilOpSeparate(GL11.GL_FRONT, GL11.GL_INCR, GL11.GL_DECR, GL11.GL_ZERO);
- GLStateManager.glStencilOpSeparate(GL11.GL_BACK, GL11.GL_KEEP, GL11.GL_INVERT, GL11.GL_REPLACE);
- GLStateManager.glStencilMaskSeparate(GL11.GL_FRONT, 0x11);
- GLStateManager.glStencilMaskSeparate(GL11.GL_BACK, 0x22);
+ GLSMDepthStencilAlpha.glStencilFuncSeparate(GL11.GL_FRONT, GL11.GL_LESS, 10, 0x0A);
+ GLSMDepthStencilAlpha.glStencilFuncSeparate(GL11.GL_BACK, GL11.GL_GREATER, 20, 0x0B);
+ GLSMDepthStencilAlpha.glStencilOpSeparate(GL11.GL_FRONT, GL11.GL_INCR, GL11.GL_DECR, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glStencilOpSeparate(GL11.GL_BACK, GL11.GL_KEEP, GL11.GL_INVERT, GL11.GL_REPLACE);
+ GLSMDepthStencilAlpha.glStencilMaskSeparate(GL11.GL_FRONT, 0x11);
+ GLSMDepthStencilAlpha.glStencilMaskSeparate(GL11.GL_BACK, 0x22);
// Verify front state
verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_LESS, "Stencil Front Func");
@@ -698,7 +698,7 @@ class GLSM_PushPop_UnitTest {
verifyState(GL20.GL_STENCIL_BACK_PASS_DEPTH_PASS, GL11.GL_REPLACE, "Stencil Back Pass Depth Pass");
verifyState(GL20.GL_STENCIL_BACK_WRITEMASK, 0x22, "Stencil Back Write Mask");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
// Verify front state reset
verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_ALWAYS, "Stencil Front Func - Reset");
verifyState(GL11.GL_STENCIL_REF, 0, "Stencil Front Ref - Reset");
@@ -726,21 +726,21 @@ class GLSM_PushPop_UnitTest {
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial");
verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableBlend();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.enableBlend();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After first enable");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.disableBlend();
- GLStateManager.enableLighting();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.disableBlend();
+ GLSMLighting.enableLighting();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After second push disable");
verifyIsEnabled(GL11.GL_LIGHTING, true, "Lighting - After enable at depth 2");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After first pop (should restore to depth 1 value)");
verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - After first pop (should restore to depth 1 value)");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After second pop (should restore to initial)");
verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - After second pop (should restore to initial)");
}
@@ -750,17 +750,17 @@ class GLSM_PushPop_UnitTest {
// Test: modify state only at depth 2, not at depth 1
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
// Don't modify blend at depth 1
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableBlend();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.enableBlend();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After enable at depth 2");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 1 (should restore)");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 0 (should still be false)");
}
@@ -769,18 +769,18 @@ class GLSM_PushPop_UnitTest {
// Test: modify state only at depth 1, not at depth 2
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableBlend();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.enableBlend();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After enable at depth 1");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
// Don't modify blend at depth 2
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - At depth 2 (unchanged)");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After pop to depth 1 (should still be true)");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 0 (should restore to initial)");
}
@@ -789,13 +789,13 @@ class GLSM_PushPop_UnitTest {
// Test: multiple modifications to same state at same depth should only save once
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableBlend(); // First modification - should save false
- GLStateManager.disableBlend(); // Second modification - should NOT save again
- GLStateManager.enableBlend(); // Third modification - should NOT save again
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.enableBlend(); // First modification - should save false
+ GLSMBlend.disableBlend(); // Second modification - should NOT save again
+ GLSMBlend.enableBlend(); // Third modification - should NOT save again
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After multiple toggles");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop (should restore original false)");
}
@@ -804,23 +804,23 @@ class GLSM_PushPop_UnitTest {
// Test: three levels of nesting
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial");
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableBlend();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.enableBlend();
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.disableBlend();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.disableBlend();
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
- GLStateManager.enableBlend();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMBlend.enableBlend();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - At depth 3");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 2");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After pop to depth 1");
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 0");
}
@@ -843,48 +843,48 @@ class GLSM_PushPop_UnitTest {
final int texB = GL11.glGenTextures();
final int texC = GL11.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA);
verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "Initial binding unit 0");
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Initial active unit");
// Verify unit 1 starts with no texture and TEXTURE_2D disabled
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Initial binding unit 1");
verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "Initial TEXTURE_2D state unit 1");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
// Create display list that changes texture state on multiple units
final int listId = GL11.glGenLists(1);
- GLStateManager.glNewList(listId, GL11.GL_COMPILE);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texC);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(listId, GL11.GL_COMPILE);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texC);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMDraws.glEndList();
// === Begin pattern ===
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
// Switch to TEXTURE1, enable GL_TEXTURE_2D, switch back
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "TEXTURE_2D enabled on unit 1");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
// Call display list (simulates calling vanilla model/entity display lists)
DisplayListManager.glCallList(listId);
// Verify state changed by display list
verifyState(GL11.GL_TEXTURE_BINDING_2D, texB, "After display list - unit 0 binding");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, texC, "After display list - unit 1 binding");
verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "After display list - TEXTURE_2D still enabled on unit 1");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
// Pop attrib - should restore all state
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
// === CRITICAL VERIFICATIONS ===
// If any of these fail, we've found the bug
@@ -896,19 +896,19 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "After pop - unit 0 binding");
// Unit 1 state should be fully restored
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After pop - unit 1 binding");
verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "After pop - TEXTURE_2D disabled on unit 1");
// Cleanup - reset all state to defaults
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texA);
- GLStateManager.glDeleteTextures(texB);
- GLStateManager.glDeleteTextures(texC);
- GLStateManager.glDeleteLists(listId, 1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texA);
+ GLSMTextures.glDeleteTextures(texB);
+ GLSMTextures.glDeleteTextures(texC);
+ GLSMDraws.glDeleteLists(listId, 1);
}
@Test
@@ -922,23 +922,23 @@ class GLSM_PushPop_UnitTest {
final int texA = GL11.glGenTextures();
final int texB = GL11.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA);
verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "Initial binding");
// Create display list with its own push/pop
final int listId = GL11.glGenLists(1);
- GLStateManager.glNewList(listId, GL11.GL_COMPILE);
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB);
- GLStateManager.glPopAttrib();
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(listId, GL11.GL_COMPILE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB);
+ GLSMAttribStack.glPopAttrib();
+ GLSMDraws.glEndList();
// Outer push
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
// Change texture
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After unbind in outer push");
// Call display list with nested push/pop
@@ -948,16 +948,16 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After display list with nested push/pop");
// Outer pop
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
// Should restore to original texA
verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "After outer pop");
// Cleanup - reset state to defaults
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texA);
- GLStateManager.glDeleteTextures(texB);
- GLStateManager.glDeleteLists(listId, 1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texA);
+ GLSMTextures.glDeleteTextures(texB);
+ GLSMDraws.glDeleteLists(listId, 1);
}
@Test
@@ -970,53 +970,53 @@ class GLSM_PushPop_UnitTest {
final int texC = GL11.glGenTextures();
// Initial state: texA on unit 0, nothing on unit 1
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA);
// Create display list that only modifies unit 0
final int listId = GL11.glGenLists(1);
- GLStateManager.glNewList(listId, GL11.GL_COMPILE);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texC);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(listId, GL11.GL_COMPILE);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texC);
+ GLSMDraws.glEndList();
// Push, then work on unit 1
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
// Call display list - modifies unit 0 while we're "on" unit 1
DisplayListManager.glCallList(listId);
// Verify: unit 0 changed, unit 1 unchanged
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
verifyState(GL11.GL_TEXTURE_BINDING_2D, texC, "After list - unit 0 changed to texC");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, texB, "After list - unit 1 still texB");
verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "After list - unit 1 still enabled");
// Pop
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
// Both units should be restored
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "After pop - active unit");
verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "After pop - unit 0 restored to texA");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After pop - unit 1 restored to 0");
verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "After pop - unit 1 disabled");
// Cleanup - reset all state to defaults
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texA);
- GLStateManager.glDeleteTextures(texB);
- GLStateManager.glDeleteTextures(texC);
- GLStateManager.glDeleteLists(listId, 1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texA);
+ GLSMTextures.glDeleteTextures(texB);
+ GLSMTextures.glDeleteTextures(texC);
+ GLSMDraws.glDeleteLists(listId, 1);
}
@Test
@@ -1028,15 +1028,15 @@ class GLSM_PushPop_UnitTest {
// Create display list that sets color to red
final int listId = GL11.glGenLists(1);
- GLStateManager.glNewList(listId, GL11.GL_COMPILE);
- GLStateManager.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(listId, GL11.GL_COMPILE);
+ GLSMCurrentAttribs.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMDraws.glEndList();
// Push (note: GL_CURRENT_BIT includes color)
- GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT);
// Set color to green
- GLStateManager.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
verifyState(GL11.GL_CURRENT_COLOR, new float[]{0.0f, 1.0f, 0.0f, 1.0f}, "After setting green");
// Call display list - sets to red
@@ -1044,12 +1044,12 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_CURRENT_COLOR, new float[]{1.0f, 0.0f, 0.0f, 1.0f}, "After display list - red");
// Pop - should restore to white (initial state before push)
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "After pop - restored to white");
// Cleanup - ensure color is reset to white
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glDeleteLists(listId, 1);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMDraws.glDeleteLists(listId, 1);
}
@Test
@@ -1064,17 +1064,17 @@ class GLSM_PushPop_UnitTest {
// Create display list that enables blend with specific function
final int listId = GL11.glGenLists(1);
- GLStateManager.glNewList(listId, GL11.GL_COMPILE);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(listId, GL11.GL_COMPILE);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMDraws.glEndList();
// Push
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
// Set different blend state
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
// Call display list - changes blend function
DisplayListManager.glCallList(listId);
@@ -1083,15 +1083,15 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_BLEND_DST, GL11.GL_ONE, "After list - blend dst ONE");
// Pop
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_BLEND, false, "After pop - blend disabled");
verifyState(GL11.GL_BLEND_SRC, GL11.GL_ONE, "After pop - blend src restored");
verifyState(GL11.GL_BLEND_DST, GL11.GL_ZERO, "After pop - blend dst restored");
// Cleanup - ensure blend is reset to defaults
- GLStateManager.disableBlend();
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDeleteLists(listId, 1);
+ GLSMBlend.disableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDraws.glDeleteLists(listId, 1);
// Verify GLSM cache matches actual GL state (exposes cache sync bugs)
verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "color should still be white");
@@ -1100,67 +1100,67 @@ class GLSM_PushPop_UnitTest {
@Test
void testTextureUnitPopAttribRestoresCorrectUnit() {
// Setup: Unit 0 ENABLED, Unit 1 disabled
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "Initial - Unit 0 enabled");
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
// Modify ONLY unit 1
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
// Unit 0 should still be enabled - bug causes it to be disabled
verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "After pop - Unit 0 still enabled");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "After pop - Unit 1 disabled");
// Cleanup
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
}
@Test
void testBlendFuncGL11AliasesMatchGL14() {
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
verifyState(GL11.GL_BLEND_SRC, GL11.GL_SRC_ALPHA, "Blend Source");
verifyState(GL14.GL_BLEND_SRC_RGB, GL11.GL_SRC_ALPHA, "Blend Source RGB");
verifyState(GL11.GL_BLEND_DST, GL11.GL_ONE_MINUS_SRC_ALPHA, "Blend Destination");
verifyState(GL14.GL_BLEND_DST_RGB, GL11.GL_ONE_MINUS_SRC_ALPHA, "Blend Destination RGB");
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
}
@Test
void testBlendFuncSeparateGL11AliasesTrackRgb() {
- GLStateManager.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
verifyState(GL11.GL_BLEND_SRC, GL11.GL_SRC_ALPHA, "Blend Source");
verifyState(GL11.GL_BLEND_DST, GL11.GL_ONE_MINUS_SRC_ALPHA, "Blend Destination");
verifyState(GL14.GL_BLEND_SRC_ALPHA, GL11.GL_ONE, "Blend Source Alpha");
verifyState(GL14.GL_BLEND_DST_ALPHA, GL11.GL_ZERO, "Blend Destination Alpha");
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
}
@Test
void testUntouchedPushPopRoundTripLeavesStateIdentical() {
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glLineWidth(3.0f);
- GLStateManager.glViewport(2, 2, 640, 480);
- GLStateManager.glCullFace(GL11.GL_FRONT);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMRasterizer.glLineWidth(3.0f);
+ GLSMRasterizer.glViewport(2, 2, 640, 480);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPopAttrib();
verifyState(GL11.GL_DEPTH_FUNC, GL11.GL_LEQUAL, "Depth Func - untouched round trip");
verifyState(GL11.GL_BLEND_SRC, GL11.GL_SRC_ALPHA, "Blend Source - untouched round trip");
@@ -1170,10 +1170,10 @@ class GLSM_PushPop_UnitTest {
verifyState(GL11.GL_CULL_FACE_MODE, GL11.GL_FRONT, "Cull Face Mode - untouched round trip");
verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture - untouched round trip");
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glLineWidth(1.0f);
- GLStateManager.glViewport(0, 0, 800, 600);
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.glLineWidth(1.0f);
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java
index f5921ab8e..49a0a0c0b 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java
@@ -18,59 +18,59 @@ public class GLSM_RetainedState_GLTest {
private static final StateSet ALL = StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS);
private static void baseline() {
- GLStateManager.enableCull();
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthMask(true);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMRasterizer.enableCull();
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
private static void mutate(int texture) {
- GLStateManager.disableCull();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.glDepthMask(false);
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glAlphaFunc(GL11.GL_GEQUAL, 0.5F);
- GLStateManager.glColor4f(0.25F, 0.5F, 0.75F, 0.5F);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMRasterizer.disableCull();
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ONE);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GEQUAL, 0.5F);
+ GLSMCurrentAttribs.glColor4f(0.25F, 0.5F, 0.75F, 0.5F);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
}
private static void assertBaseline() {
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE));
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE));
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE));
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_BLEND));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_BLEND));
assertFalse(GL11.glIsEnabled(GL11.GL_BLEND));
assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB));
assertEquals(GL11.GL_ZERO, GL11.glGetInteger(GL14.GL_BLEND_DST_ALPHA));
assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK));
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC));
- assertEquals(GL11.GL_GREATER, GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC));
- assertEquals(1.0F, GLStateManager.getColor().getRed(), 0.0F);
+ assertEquals(GL11.GL_GREATER, GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC));
+ assertEquals(1.0F, GLSMCurrentAttribs.getColor().getRed(), 0.0F);
assertEquals(0, driverTextureBinding(0));
}
private static void assertMutated(int texture) {
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE));
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE));
assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE));
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_BLEND));
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_BLEND));
assertTrue(GL11.glIsEnabled(GL11.GL_BLEND));
assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB));
assertEquals(GL11.GL_ZERO, GL11.glGetInteger(GL14.GL_BLEND_DST_RGB));
assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_SRC_ALPHA));
assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_DST_ALPHA));
- assertEquals(GL11.GL_DST_COLOR, GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_RGB));
+ assertEquals(GL11.GL_DST_COLOR, GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_RGB));
assertFalse(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK));
assertEquals(GL11.GL_ALWAYS, GL11.glGetInteger(GL11.GL_DEPTH_FUNC));
- assertEquals(GL11.GL_GEQUAL, GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC));
- assertEquals(0.25F, GLStateManager.getColor().getRed(), 0.0F);
- assertEquals(0.5F, GLStateManager.getColor().getAlpha(), 0.0F);
+ assertEquals(GL11.GL_GEQUAL, GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC));
+ assertEquals(0.25F, GLSMCurrentAttribs.getColor().getRed(), 0.0F);
+ assertEquals(0.5F, GLSMCurrentAttribs.getColor().getAlpha(), 0.0F);
assertEquals(texture, driverTextureBinding(0));
- assertEquals(texture, GLStateManager.getBoundTextureForServerState(0));
+ assertEquals(texture, GLSMTextures.getBoundTextureForServerState(0));
}
@Test
@@ -79,18 +79,18 @@ public class GLSM_RetainedState_GLTest {
final RetainedState retained = new RetainedState();
try {
baseline();
- final int d = GLStateManager.pushState(ALL);
+ final int d = GLSMAttribStack.pushState(ALL);
mutate(texture);
- GLStateManager.retainModifiedState(d, retained);
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.retainModifiedState(d, retained);
+ GLSMAttribStack.popStateTo(d);
assertBaseline();
- GLStateManager.applyRetainedState(retained);
+ GLSMAttribStack.applyRetainedState(retained);
assertMutated(texture);
baseline();
assertBaseline();
- GLStateManager.applyRetainedState(retained);
+ GLSMAttribStack.applyRetainedState(retained);
assertMutated(texture);
} finally {
baseline();
@@ -104,15 +104,15 @@ public class GLSM_RetainedState_GLTest {
final RetainedState retained = new RetainedState();
try {
baseline();
- final int d = GLStateManager.pushState(ALL);
+ final int d = GLSMAttribStack.pushState(ALL);
mutate(texture);
- GLStateManager.retainModifiedState(d, retained);
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.retainModifiedState(d, retained);
+ GLSMAttribStack.popStateTo(d);
- final int outer = GLStateManager.pushState(ALL);
- GLStateManager.applyRetainedState(retained);
+ final int outer = GLSMAttribStack.pushState(ALL);
+ GLSMAttribStack.applyRetainedState(retained);
assertMutated(texture);
- GLStateManager.popStateTo(outer);
+ GLSMAttribStack.popStateTo(outer);
assertBaseline();
} finally {
baseline();
@@ -125,18 +125,18 @@ public class GLSM_RetainedState_GLTest {
final RetainedState retained = new RetainedState();
try {
baseline();
- final int d = GLStateManager.pushState(ALL);
- GLStateManager.enableBlend();
- final int nested = GLStateManager.pushState(ALL);
- GLStateManager.disableCull();
- GLStateManager.popStateTo(nested);
- GLStateManager.retainModifiedState(d, retained);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(ALL);
+ GLSMBlend.enableBlend();
+ final int nested = GLSMAttribStack.pushState(ALL);
+ GLSMRasterizer.disableCull();
+ GLSMAttribStack.popStateTo(nested);
+ GLSMAttribStack.retainModifiedState(d, retained);
+ GLSMAttribStack.popStateTo(d);
- GLStateManager.applyRetainedState(retained);
+ GLSMAttribStack.applyRetainedState(retained);
assertTrue(GL11.glIsEnabled(GL11.GL_BLEND));
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE));
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE));
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE));
} finally {
baseline();
}
@@ -148,26 +148,26 @@ public class GLSM_RetainedState_GLTest {
final RetainedState retained = new RetainedState();
try {
baseline();
- final int d = GLStateManager.pushState(ALL);
+ final int d = GLSMAttribStack.pushState(ALL);
mutate(texture);
- GLStateManager.retainModifiedState(d, retained);
- GLStateManager.popStateTo(d);
- GLStateManager.applyRetainedState(retained);
+ GLSMAttribStack.retainModifiedState(d, retained);
+ GLSMAttribStack.popStateTo(d);
+ GLSMAttribStack.applyRetainedState(retained);
final GLContextState glCtx = GLStateManager.ctx();
- final long backendCalls = GLStateManager.attribBackendCalls;
+ final long backendCalls = GLSMAttribStack.attribBackendCalls;
final int colorGen = glCtx.colorGeneration;
final int fragmentGen = glCtx.fragmentGeneration;
final int batchGen = glCtx.batchStateGeneration;
- GLStateManager.applyRetainedState(retained);
- assertEquals(backendCalls, GLStateManager.attribBackendCalls);
+ GLSMAttribStack.applyRetainedState(retained);
+ assertEquals(backendCalls, GLSMAttribStack.attribBackendCalls);
assertEquals(colorGen, glCtx.colorGeneration);
assertEquals(fragmentGen, glCtx.fragmentGeneration);
assertEquals(batchGen, glCtx.batchStateGeneration);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.applyRetainedState(retained);
- assertEquals(backendCalls + 3, GLStateManager.attribBackendCalls);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMAttribStack.applyRetainedState(retained);
+ assertEquals(backendCalls + 3, GLSMAttribStack.attribBackendCalls);
assertMutated(texture);
} finally {
baseline();
@@ -181,20 +181,20 @@ public class GLSM_RetainedState_GLTest {
final RetainedState second = new RetainedState();
try {
baseline();
- int d = GLStateManager.pushState(ALL);
- GLStateManager.enableBlend();
- GLStateManager.retainModifiedState(d, first);
- GLStateManager.popStateTo(d);
+ int d = GLSMAttribStack.pushState(ALL);
+ GLSMBlend.enableBlend();
+ GLSMAttribStack.retainModifiedState(d, first);
+ GLSMAttribStack.popStateTo(d);
- d = GLStateManager.pushState(ALL);
- GLStateManager.disableCull();
- GLStateManager.retainModifiedState(d, second);
- GLStateManager.popStateTo(d);
+ d = GLSMAttribStack.pushState(ALL);
+ GLSMRasterizer.disableCull();
+ GLSMAttribStack.retainModifiedState(d, second);
+ GLSMAttribStack.popStateTo(d);
- GLStateManager.applyRetainedState(first);
+ GLSMAttribStack.applyRetainedState(first);
assertFalse(GL11.glIsEnabled(GL11.GL_BLEND));
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE));
- GLStateManager.applyRetainedState(second);
+ GLSMAttribStack.applyRetainedState(second);
assertFalse(GL11.glIsEnabled(GL11.GL_BLEND));
assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE));
} finally {
@@ -207,21 +207,21 @@ public class GLSM_RetainedState_GLTest {
final RetainedState retained = new RetainedState();
try {
baseline();
- GLStateManager.glClearColor(0.25F, 0.5F, 0.75F, 1.0F);
- final int outer = GLStateManager.pushState(ALL);
- GLStateManager.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
- final int inner = GLStateManager.pushState(ALL);
- GLStateManager.enableBlend();
- GLStateManager.retainModifiedState(inner, retained);
- GLStateManager.popStateTo(outer);
+ GLSMBlend.glClearColor(0.25F, 0.5F, 0.75F, 1.0F);
+ final int outer = GLSMAttribStack.pushState(ALL);
+ GLSMBlend.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
+ final int inner = GLSMAttribStack.pushState(ALL);
+ GLSMBlend.enableBlend();
+ GLSMAttribStack.retainModifiedState(inner, retained);
+ GLSMAttribStack.popStateTo(outer);
- GLStateManager.applyRetainedState(retained);
+ GLSMAttribStack.applyRetainedState(retained);
assertTrue(GL11.glIsEnabled(GL11.GL_BLEND));
- assertEquals(0.25F, GLStateManager.getClearColor().getRed(), 0.0F);
- assertEquals(1.0F, GLStateManager.getClearColor().getAlpha(), 0.0F);
+ assertEquals(0.25F, GLSMBlend.getClearColor().getRed(), 0.0F);
+ assertEquals(1.0F, GLSMBlend.getClearColor().getAlpha(), 0.0F);
} finally {
baseline();
- GLStateManager.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
+ GLSMBlend.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
}
}
@@ -231,18 +231,18 @@ public class GLSM_RetainedState_GLTest {
final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
try {
baseline();
- final int d = GLStateManager.pushState(ALL);
- GLStateManager.glUseProgram(program);
- GLStateManager.retainModifiedState(d, retained);
- GLStateManager.popStateTo(d);
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
+ final int d = GLSMAttribStack.pushState(ALL);
+ GLSMPrograms.glUseProgram(program);
+ GLSMAttribStack.retainModifiedState(d, retained);
+ GLSMAttribStack.popStateTo(d);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
drainErrors();
- GLStateManager.applyRetainedState(retained);
- assertEquals(0, GLStateManager.getActiveProgram());
+ GLSMAttribStack.applyRetainedState(retained);
+ assertEquals(0, GLSMPrograms.getActiveProgram());
} finally {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
baseline();
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java
index dd732c800..d19970eda 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java
@@ -32,10 +32,10 @@ class GLSM_SamplerBinding_GLTest {
void unbindTestUnits() {
if (!RenderSystem.supportsSamplerObjects()) return;
for (int unit = 0; unit < UNITS; unit++) {
- GLStateManager.glBindSampler(unit, 0);
+ GLSMTextures.glBindSampler(unit, 0);
GL33.glBindSampler(unit, 0);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private static int driverBinding(int unit) {
@@ -48,7 +48,7 @@ class GLSM_SamplerBinding_GLTest {
private static void assertUnits(String context, int... expected) {
for (int unit = 0; unit < expected.length; unit++) {
- assertEquals(expected[unit], GLStateManager.getSamplerBinding(unit), context + ": cache unit " + unit);
+ assertEquals(expected[unit], GLSMTextures.getSamplerBinding(unit), context + ": cache unit " + unit);
assertEquals(expected[unit], driverBinding(unit), context + ": driver unit " + unit);
}
}
@@ -64,7 +64,7 @@ class GLSM_SamplerBinding_GLTest {
final int sampler = RenderSystem.genSampler();
try {
RenderSystem.bindSamplerToUnit(0, sampler);
- GLStateManager.glBindSampler(0, 0);
+ GLSMTextures.glBindSampler(0, 0);
assertEquals(0, driverBinding(0), "setup: GLSM unbind must reach the driver");
RenderSystem.bindSamplerToUnit(0, sampler);
@@ -78,16 +78,16 @@ class GLSM_SamplerBinding_GLTest {
@Test
void deleteClearsEveryUnitAndTheNextBindReachesDriver() {
final int sampler = RenderSystem.genSampler();
- GLStateManager.glBindSampler(1, sampler);
- GLStateManager.glBindSampler(3, sampler);
+ GLSMTextures.glBindSampler(1, sampler);
+ GLSMTextures.glBindSampler(3, sampler);
- GLStateManager.glDeleteSamplers(sampler);
+ GLSMTextures.glDeleteSamplers(sampler);
assertUnits("after delete", 0, 0, 0, 0);
final int next = RenderSystem.genSampler();
try {
- GLStateManager.glBindSampler(1, next);
+ GLSMTextures.glBindSampler(1, next);
assertEquals(next, driverBinding(1), "bind after delete never reached the driver");
} finally {
RenderSystem.destroySampler(next);
@@ -98,17 +98,17 @@ class GLSM_SamplerBinding_GLTest {
void samplerBindingQueryAnswersForTheActiveUnit() {
final int sampler = RenderSystem.genSampler();
try {
- GLStateManager.glBindSampler(1, sampler);
+ GLSMTextures.glBindSampler(1, sampler);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(GL11.glGetInteger(GL33.GL_SAMPLER_BINDING),
- GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING));
- assertEquals(sampler, GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING));
+ GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING));
+ assertEquals(sampler, GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
assertEquals(GL11.glGetInteger(GL33.GL_SAMPLER_BINDING),
- GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING));
- assertEquals(0, GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING));
+ GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING));
+ assertEquals(0, GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING));
} finally {
RenderSystem.destroySampler(sampler);
}
@@ -120,8 +120,8 @@ class GLSM_SamplerBinding_GLTest {
final Runnable previousFlush = BatchStateGuard.flush;
final AtomicInteger flushes = new AtomicInteger();
try {
- GLStateManager.glBindSampler(1, sampler);
- GLStateManager.glBindSampler(3, sampler);
+ GLSMTextures.glBindSampler(1, sampler);
+ GLSMTextures.glBindSampler(3, sampler);
BatchStateGuard.flush = () -> {
assertEquals(sampler, driverBinding(1), "deferred draws must see the original bindings");
assertEquals(sampler, driverBinding(3), "deferred draws must see the original bindings");
@@ -134,8 +134,8 @@ class GLSM_SamplerBinding_GLTest {
assertEquals(1, flushes.get(), "bulk unbind should drain deferred draws once");
assertEquals(0, driverBinding(1), "unit 1 still bound on the driver");
assertEquals(0, driverBinding(3), "unit 3 still bound on the driver");
- assertEquals(0, GLStateManager.getSamplerBinding(1));
- assertEquals(0, GLStateManager.getSamplerBinding(3));
+ assertEquals(0, GLSMTextures.getSamplerBinding(1));
+ assertEquals(0, GLSMTextures.getSamplerBinding(3));
} finally {
BatchStateGuard.flush = previousFlush;
RenderSystem.destroySampler(sampler);
@@ -147,14 +147,14 @@ class GLSM_SamplerBinding_GLTest {
final int highUnit = RenderSystem.getMaxCombinedTextureImageUnits() - 1;
final int sampler = RenderSystem.genSampler();
try {
- GLStateManager.glBindSampler(2, sampler);
- GLStateManager.glBindSampler(highUnit, sampler);
+ GLSMTextures.glBindSampler(2, sampler);
+ GLSMTextures.glBindSampler(highUnit, sampler);
GL33.glBindSampler(2, 0);
GL33.glBindSampler(highUnit, 0);
assertEquals(0, driverBinding(2), "setup failed to diverge the driver");
assertEquals(0, driverBinding(highUnit), "setup failed to diverge the driver");
- GLStateManager.replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
assertEquals(sampler, driverBinding(2), "replay dropped a cached sampler binding");
assertEquals(sampler, driverBinding(highUnit), "replay skipped the highest bound unit");
@@ -169,16 +169,16 @@ class GLSM_SamplerBinding_GLTest {
final int low = RenderSystem.genSampler();
final int high = RenderSystem.genSampler();
try {
- GLStateManager.glBindSampler(1, low);
- GLStateManager.glBindSampler(3, high);
- GLStateManager.glBindSampler(highUnit, high);
+ GLSMTextures.glBindSampler(1, low);
+ GLSMTextures.glBindSampler(3, high);
+ GLSMTextures.glBindSampler(highUnit, high);
assertEquals(highUnit, GLStateManager.ctx().samplerUnits.getHighestBoundUnit());
- GLStateManager.glBindSampler(highUnit, 0);
+ GLSMTextures.glBindSampler(highUnit, 0);
assertEquals(3, GLStateManager.ctx().samplerUnits.getHighestBoundUnit());
assertEquals(0, driverBinding(highUnit));
- GLStateManager.glBindSampler(highUnit, high);
+ GLSMTextures.glBindSampler(highUnit, high);
RenderSystem.destroySampler(high);
assertEquals(1, GLStateManager.ctx().samplerUnits.getHighestBoundUnit());
assertEquals(0, driverBinding(highUnit));
@@ -188,7 +188,7 @@ class GLSM_SamplerBinding_GLTest {
assertEquals(-1, GLStateManager.ctx().samplerUnits.getHighestBoundUnit());
assertEquals(0, driverBinding(1));
- GLStateManager.glBindSampler(highUnit, low);
+ GLSMTextures.glBindSampler(highUnit, low);
RenderSystem.unbindAllSamplers();
RenderSystem.unbindAllSamplers();
assertEquals(-1, GLStateManager.ctx().samplerUnits.getHighestBoundUnit());
@@ -203,7 +203,7 @@ class GLSM_SamplerBinding_GLTest {
void intBufferGenFillsFromPositionWithBindableSamplers() {
final IntBuffer buf = ints(-1, 0, 0);
buf.position(1);
- GLStateManager.glGenSamplers(buf);
+ GLSMTextures.glGenSamplers(buf);
final int a = buf.get(1);
final int b = buf.get(2);
try {
@@ -213,15 +213,15 @@ class GLSM_SamplerBinding_GLTest {
assertNotEquals(0, b);
assertNotEquals(a, b);
- GLStateManager.glBindSampler(0, a);
- GLStateManager.glBindSampler(1, b);
+ GLSMTextures.glBindSampler(0, a);
+ GLSMTextures.glBindSampler(1, b);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "generated name rejected by the driver");
assertEquals(a, driverBinding(0));
assertEquals(b, driverBinding(1));
} finally {
- GLStateManager.glDeleteSamplers(a);
- GLStateManager.glDeleteSamplers(b);
+ GLSMTextures.glDeleteSamplers(a);
+ GLSMTextures.glDeleteSamplers(b);
}
}
@@ -233,22 +233,22 @@ class GLSM_SamplerBinding_GLTest {
final IntBuffer buf = ints(-1, a, b);
buf.position(1);
- GLStateManager.glBindSamplers(1, 2, buf);
+ GLSMTextures.glBindSamplers(1, 2, buf);
assertEquals(1, buf.position(), "count form must not move the buffer position");
assertUnits("count form", 0, a, b, 0);
- GLStateManager.glBindSampler(1, 0);
- GLStateManager.glBindSampler(2, 0);
+ GLSMTextures.glBindSampler(1, 0);
+ GLSMTextures.glBindSampler(2, 0);
buf.position(1);
- GLStateManager.glBindSamplers(1, buf);
+ GLSMTextures.glBindSamplers(1, buf);
assertEquals(1, buf.position(), "remaining form must not move the buffer position");
assertUnits("remaining form", 0, a, b, 0);
- GLStateManager.glBindSamplers(1, (IntBuffer) null);
+ GLSMTextures.glBindSamplers(1, (IntBuffer) null);
assertUnits("null remaining form", 0, a, b, 0);
- GLStateManager.glBindSamplers(2, new int[]{a, b});
+ GLSMTextures.glBindSamplers(2, new int[]{a, b});
assertUnits("int[] form", 0, a, a, b);
} finally {
RenderSystem.destroySampler(a);
@@ -261,16 +261,16 @@ class GLSM_SamplerBinding_GLTest {
final int prior = RenderSystem.genSampler();
final int next = RenderSystem.genSampler();
try {
- for (int unit = 0; unit < UNITS; unit++) GLStateManager.glBindSampler(unit, prior);
+ for (int unit = 0; unit < UNITS; unit++) GLSMTextures.glBindSampler(unit, prior);
- GLStateManager.glBindSamplers(1, 2, (IntBuffer) null);
+ GLSMTextures.glBindSamplers(1, 2, (IntBuffer) null);
assertUnits("null count form", prior, 0, 0, prior);
- for (int unit = 0; unit < UNITS; unit++) GLStateManager.glBindSampler(unit, prior);
+ for (int unit = 0; unit < UNITS; unit++) GLSMTextures.glBindSampler(unit, prior);
final IntBuffer buf = ints(next, next);
- assertThrows(IllegalArgumentException.class, () -> GLStateManager.glBindSamplers(0, UNITS, buf));
+ assertThrows(IllegalArgumentException.class, () -> GLSMTextures.glBindSamplers(0, UNITS, buf));
assertEquals(0, buf.position());
assertUnits("short buffer", prior, prior, prior, prior);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
index 0d3d98567..58085f7f8 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
@@ -244,12 +244,12 @@ public class GLSM_ServerSideState_UnitTest {
static Stream texParams() {
return Stream.of(
new TexParam("glTexParameteri MIN_FILTER", GL11.GL_LINEAR, GL11.GL_NEAREST,
- v -> GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, (int) v),
- () -> GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER),
+ v -> GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, (int) v),
+ () -> GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER),
() -> GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER)),
new TexParam("glTexParameterf LOD_BIAS", 0.0f, 1.5f,
- v -> GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, v),
- () -> GLStateManager.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS),
+ v -> GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, v),
+ () -> GLSMTextures.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS),
() -> GL11.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS)));
}
@@ -262,14 +262,14 @@ public class GLSM_ServerSideState_UnitTest {
int texId = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
param.set.accept(param.initial);
assertEquals(param.initial, param.glsm.get(), 0.001f, "Initial GLSM value");
assertEquals(param.initial, param.driver.get(), 0.001f, "Initial GL value");
executeOnSharedDrawable(() -> {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
int boundTex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
assertEquals(texId, boundTex, "SharedDrawable should have texId bound");
@@ -280,14 +280,14 @@ public class GLSM_ServerSideState_UnitTest {
assertEquals(param.changed, param.driver.get(), 0.001f, "SharedDrawable GL value");
});
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
assertEquals(param.changed, param.glsm.get(), 0.001f, "Main thread GLSM value");
assertEquals(param.changed, param.driver.get(), 0.001f, "Main thread GL value");
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texId);
}
}
@@ -302,59 +302,59 @@ public class GLSM_ServerSideState_UnitTest {
int texIdB = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdB);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdB);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
- int initialA_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
+ int initialA_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
int initialA_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
assertEquals(GL11.GL_LINEAR, initialA_GLSM, "texIdA initial GLSM should be LINEAR");
assertEquals(GL11.GL_LINEAR, initialA_GL, "texIdA initial GL should be LINEAR");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdB);
- int initialB_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdB);
+ int initialB_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
int initialB_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, initialB_GLSM, "texIdB initial GLSM should be LINEAR_MIPMAP_LINEAR");
assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, initialB_GL, "texIdB initial GL should be LINEAR_MIPMAP_LINEAR");
- assertEquals(texIdB, GLStateManager.getBoundTextureForServerState(), "Main thread should have texIdB bound");
+ assertEquals(texIdB, GLSMTextures.getBoundTextureForServerState(), "Main thread should have texIdB bound");
// SharedDrawable: bind texIdA and change its MIN_FILTER to NEAREST
// Main thread has texIdB bound, but SharedDrawable should correctly update texIdA's params, not texIdB's
executeOnSharedDrawable(() -> {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
int bound = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
assertEquals(texIdA, bound, "SharedDrawable should have texIdA bound");
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- int glsmValue = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ int glsmValue = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
assertEquals(GL11.GL_NEAREST, glsmValue, "SharedDrawable GLSM should return NEAREST for texIdA");
int glValue = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
assertEquals(GL11.GL_NEAREST, glValue, "SharedDrawable GL should be NEAREST for texIdA");
});
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
- int finalA_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA);
+ int finalA_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
int finalA_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
assertEquals(GL11.GL_NEAREST, finalA_GLSM, "texIdA final GLSM should be NEAREST (SharedDrawable's update)");
assertEquals(GL11.GL_NEAREST, finalA_GL, "texIdA final GL should be NEAREST");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdB);
- int finalB_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdB);
+ int finalB_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
int finalB_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, finalB_GLSM, "texIdB should NOT be modified by SharedDrawable");
assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, finalB_GL, "texIdB GL should NOT be modified");
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texIdA);
- GLStateManager.glDeleteTextures(texIdB);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texIdA);
+ GLSMTextures.glDeleteTextures(texIdB);
}
}
@@ -367,24 +367,24 @@ public class GLSM_ServerSideState_UnitTest {
int texId2 = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId1);
- assertEquals(texId1, GLStateManager.getBoundTextureForServerState(), "Main thread cache should show texId1 bound");
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId1);
+ assertEquals(texId1, GLSMTextures.getBoundTextureForServerState(), "Main thread cache should show texId1 bound");
executeOnSharedDrawable(() -> {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId2);
- assertEquals(texId2, GLStateManager.getBoundTextureForServerState(), "SharedDrawable cache should show texId2 bound");
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId2);
+ assertEquals(texId2, GLSMTextures.getBoundTextureForServerState(), "SharedDrawable cache should show texId2 bound");
assertEquals(texId2, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "SharedDrawable actual GL binding should be texId2");
});
- assertEquals(texId1, GLStateManager.getBoundTextureForServerState(), "Main thread cache should still show texId1 (client-side state is per-context)");
+ assertEquals(texId1, GLSMTextures.getBoundTextureForServerState(), "Main thread cache should still show texId1 (client-side state is per-context)");
int actualBinding = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
assertEquals(texId1, actualBinding, "Main thread actual GL binding should still be texId1");
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texId1);
- GLStateManager.glDeleteTextures(texId2);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texId1);
+ GLSMTextures.glDeleteTextures(texId2);
}
}
@@ -396,21 +396,21 @@ public class GLSM_ServerSideState_UnitTest {
int texId = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- int initialWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
- int initialHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
+ int initialWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
+ int initialHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
assertEquals(64, initialWidth, "Initial width should be 64");
assertEquals(64, initialHeight, "Initial height should be 64");
// SharedDrawable: re-upload with different dimensions
executeOnSharedDrawable(() -> {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 128, 256, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 128, 256, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- int sharedWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
- int sharedHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
+ int sharedWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
+ int sharedHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
assertEquals(128, sharedWidth, "SharedDrawable GLSM width should be 128");
assertEquals(256, sharedHeight, "SharedDrawable GLSM height should be 256");
@@ -420,10 +420,10 @@ public class GLSM_ServerSideState_UnitTest {
assertEquals(256, glHeight, "SharedDrawable GL height should be 256");
});
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- int finalWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
- int finalHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
+ int finalWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
+ int finalHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
assertEquals(128, finalWidth, "Main thread GLSM width should be 128");
assertEquals(256, finalHeight, "Main thread GLSM height should be 256");
@@ -433,44 +433,44 @@ public class GLSM_ServerSideState_UnitTest {
assertEquals(256, glHeight, "Main thread GL height should be 256");
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texId);
}
}
@Test
void testDeleteTexturesFromSharedDrawable() throws InterruptedException {
- final int texId = GLStateManager.glGenTextures();
+ final int texId = GLSMTextures.glGenTextures();
int flushGen = 0;
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 32, 32, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 32, 32, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- assertEquals(GL11.GL_LINEAR, GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER), "Cache should have LINEAR before delete");
+ assertEquals(GL11.GL_LINEAR, GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER), "Cache should have LINEAR before delete");
assertTrue(GL11.glIsTexture(texId), "Texture should exist before delete");
executeOnSharedDrawable(() -> {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- GLStateManager.glDeleteTextures(texId);
- assertEquals(0, GLStateManager.getBoundTextureForServerState(), "Delete should unbind from the deleting context");
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glDeleteTextures(texId);
+ assertEquals(0, GLSMTextures.getBoundTextureForServerState(), "Delete should unbind from the deleting context");
assertTrue(GL11.glIsTexture(texId), "Texture name should still be valid (deferred delete)");
});
- assertEquals(texId, GLStateManager.getBoundTextureForServerState(), "Main thread binding should survive until the flush");
+ assertEquals(texId, GLSMTextures.getBoundTextureForServerState(), "Main thread binding should survive until the flush");
- final int deferredGen = GLStateManager.glGenTextures();
+ final int deferredGen = GLSMTextures.glGenTextures();
GL11.glDeleteTextures(deferredGen);
assertTrue(GL11.glIsTexture(texId), "Delete should stay deferred while the splash is not complete");
SplashWindow.setSplashComplete(true);
- flushGen = GLStateManager.glGenTextures();
+ flushGen = GLSMTextures.glGenTextures();
assertFalse(GL11.glIsTexture(texId), "Texture should be gone after the post-splash flush");
- assertEquals(0, GLStateManager.getBoundTextureForServerState(), "Flush should scrub the main thread binding");
+ assertEquals(0, GLSMTextures.getBoundTextureForServerState(), "Flush should scrub the main thread binding");
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
if (flushGen != 0) GL11.glDeleteTextures(flushGen);
if (GL11.glIsTexture(texId)) {
GL11.glDeleteTextures(texId);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java
index c9b121933..b2dbfde38 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java
@@ -45,9 +45,9 @@ public class GLSM_SharedDrawableContext_GLTest {
@AfterEach
void cleanup() {
- if (indexedList != 0) GLStateManager.glDeleteLists(indexedList, 1);
- if (listVbo != 0) GLStateManager.glDeleteBuffers(listVbo);
- if (listEbo != 0) GLStateManager.glDeleteBuffers(listEbo);
+ if (indexedList != 0) GLSMDraws.glDeleteLists(indexedList, 1);
+ if (listVbo != 0) GLSMBuffers.glDeleteBuffers(listVbo);
+ if (listEbo != 0) GLSMBuffers.glDeleteBuffers(listEbo);
if (sharedDrawable != null) {
DrawableContexts.destroy(sharedDrawable);
sharedDrawable = null;
@@ -109,52 +109,52 @@ public class GLSM_SharedDrawableContext_GLTest {
@Test
void foreignThreadCannotFinishOrRecordIntoActiveList() throws Exception {
sharedDrawable = new SharedDrawable(Display.getDrawable());
- final int existing = GLStateManager.glGenLists(1);
- final int active = GLStateManager.glGenLists(1);
- final int rejected = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(existing, GL11.GL_COMPILE);
- GLStateManager.enableBlend();
- GLStateManager.glEndList();
- GLStateManager.disableBlend();
+ final int existing = GLSMDraws.glGenLists(1);
+ final int active = GLSMDraws.glGenLists(1);
+ final int rejected = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(existing, GL11.GL_COMPILE);
+ GLSMBlend.enableBlend();
+ GLSMDraws.glEndList();
+ GLSMBlend.disableBlend();
final CountDownLatch started = new CountDownLatch(1);
final CountDownLatch finish = new CountDownLatch(1);
final TestThreads.Worker worker = DrawableContexts.start(sharedDrawable, "SharedDrawableContext-List-Thread", () -> {
- GLStateManager.glNewList(active, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(active, GL11.GL_COMPILE);
started.countDown();
if (!finish.await(5, TimeUnit.SECONDS)) throw new AssertionError("finish timed out");
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
});
try {
try {
assertTrue(started.await(5, TimeUnit.SECONDS));
- assertThrows(IllegalStateException.class, () -> GLStateManager.glNewList(rejected, GL11.GL_COMPILE));
- assertThrows(IllegalStateException.class, GLStateManager::glEndList);
- assertEquals(0, GLStateManager.getListMode());
+ assertThrows(IllegalStateException.class, () -> GLSMDraws.glNewList(rejected, GL11.GL_COMPILE));
+ assertThrows(IllegalStateException.class, GLSMDraws::glEndList);
+ assertEquals(0, GLSMDraws.getListMode());
DisplayListManager.abortIfLeaked();
assertThrows(IllegalStateException.class, DisplayListManager::abortCompilation);
- GLStateManager.glCallList(existing);
- assertTrue(GLStateManager.glIsEnabled(GL11.GL_BLEND));
- assertEquals(0, GLStateManager.getListMode());
+ GLSMDraws.glCallList(existing);
+ assertTrue(GLSMEnable.glIsEnabled(GL11.GL_BLEND));
+ assertEquals(0, GLSMDraws.getListMode());
} finally {
finish.countDown();
worker.join();
}
assertTrue(DisplayListManager.displayListExists(active));
- GLStateManager.glCallList(active);
+ GLSMDraws.glCallList(active);
} finally {
- GLStateManager.glDeleteLists(existing, 1);
- GLStateManager.glDeleteLists(active, 1);
- GLStateManager.glDeleteLists(rejected, 1);
- GLStateManager.disableBlend();
+ GLSMDraws.glDeleteLists(existing, 1);
+ GLSMDraws.glDeleteLists(active, 1);
+ GLSMDraws.glDeleteLists(rejected, 1);
+ GLSMBlend.disableBlend();
}
}
@Test
void simultaneousListStartsClaimOneOwner() throws Exception {
sharedDrawable = new SharedDrawable(Display.getDrawable());
- final int first = GLStateManager.glGenLists(1);
- final int second = GLStateManager.glGenLists(1);
+ final int first = GLSMDraws.glGenLists(1);
+ final int second = GLSMDraws.glGenLists(1);
final CyclicBarrier start = new CyclicBarrier(2);
final CountDownLatch attempted = new CountDownLatch(2);
final AtomicInteger completed = new AtomicInteger();
@@ -162,7 +162,7 @@ public class GLSM_SharedDrawableContext_GLTest {
final TestThreads.Worker worker = DrawableContexts.start(sharedDrawable, "SharedDrawableContext-List-Race-Thread", () -> {
start.await();
try {
- GLStateManager.glNewList(second, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(second, GL11.GL_COMPILE);
} catch (IllegalStateException expected) {
rejected.incrementAndGet();
attempted.countDown();
@@ -170,27 +170,27 @@ public class GLSM_SharedDrawableContext_GLTest {
}
attempted.countDown();
if (!attempted.await(5, TimeUnit.SECONDS)) throw new AssertionError("attempts timed out");
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
completed.incrementAndGet();
});
try {
start.await();
try {
- GLStateManager.glNewList(first, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(first, GL11.GL_COMPILE);
} catch (IllegalStateException expected) {
rejected.incrementAndGet();
attempted.countDown();
}
- if (GLStateManager.getListMode() != 0) {
+ if (GLSMDraws.getListMode() != 0) {
attempted.countDown();
assertTrue(attempted.await(5, TimeUnit.SECONDS));
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
completed.incrementAndGet();
}
worker.join();
} finally {
- GLStateManager.glDeleteLists(first, 1);
- GLStateManager.glDeleteLists(second, 1);
+ GLSMDraws.glDeleteLists(first, 1);
+ GLSMDraws.glDeleteLists(second, 1);
}
assertEquals(1, completed.get());
assertEquals(1, rejected.get());
@@ -208,23 +208,23 @@ public class GLSM_SharedDrawableContext_GLTest {
final FloatBuffer vertices = BufferUtils.createFloatBuffer(9);
vertices.put(new float[] { -0.5f, -0.5f, 0f, 0.5f, -0.5f, 0f, 0f, 0.5f, 0f });
vertices.flip();
- final int vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
+ final int vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 12, 0);
VAOManager.setCurrentVertexFlags(0);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
GLStateManager.releaseContext(sharedDrawable);
GLStateManager.makeCurrent(sharedDrawable);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
assertNotEquals(0, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "invalidateProgram must force a rebind after replay clears the program to 0");
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(vbo);
} finally {
sm.deactivate();
}
@@ -241,20 +241,20 @@ public class GLSM_SharedDrawableContext_GLTest {
indices.putShort((short) 0).putShort((short) 1).putShort((short) 2);
indices.flip();
- listVbo = GLStateManager.glGenBuffers();
- listEbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindVertexArray(GLStateManager.glGenVertexArrays());
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, listVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, listEbo);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
+ listVbo = GLSMBuffers.glGenBuffers();
+ listEbo = GLSMBuffers.glGenBuffers();
+ GLSMVertexInput.glBindVertexArray(GLSMVertexInput.glGenVertexArrays());
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, listVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, listEbo);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
- indexedList = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(indexedList, GL11.GL_COMPILE);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glEndList();
+ indexedList = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(indexedList, GL11.GL_COMPILE);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMDraws.glEndList();
final IndexedDrawBatch batch = indexedBatch();
batch.bind();
@@ -274,13 +274,13 @@ public class GLSM_SharedDrawableContext_GLTest {
ShaderManager.enable();
sm.activate();
try {
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
indexedBatch().bind();
assertEquals(indexedBatch().getSharedEBO(), GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING));
} finally {
sm.deactivate();
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
}
@@ -289,63 +289,63 @@ public class GLSM_SharedDrawableContext_GLTest {
final int list = compileIndexedListOnSharedDrawable();
final IntBuffer made = BufferUtils.createIntBuffer(4096);
while (!GL30.glIsVertexArray(sharedContextVao) && made.hasRemaining()) {
- final int v = GLStateManager.glGenVertexArrays();
+ final int v = GLSMVertexInput.glGenVertexArrays();
made.put(v);
- if (v == sharedContextVao) GLStateManager.glBindVertexArray(v);
+ if (v == sharedContextVao) GLSMVertexInput.glBindVertexArray(v);
}
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
assumeTrue(GL30.glIsVertexArray(sharedContextVao));
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
indexedList = 0;
assertTrue(GL30.glIsVertexArray(sharedContextVao));
made.flip();
- while (made.hasRemaining()) GLStateManager.glDeleteVertexArrays(made.get());
+ while (made.hasRemaining()) GLSMVertexInput.glDeleteVertexArrays(made.get());
}
@Test
void recordedVaoBindReplaysOnlyOnItsCompileContext() throws Exception {
- final int bound = GLStateManager.glGenVertexArrays();
- final int local = GLStateManager.glGenVertexArrays();
- final int localList = GLStateManager.glGenLists(1);
- final int foreignList = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(localList, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(local);
- GLStateManager.glEndList();
+ final int bound = GLSMVertexInput.glGenVertexArrays();
+ final int local = GLSMVertexInput.glGenVertexArrays();
+ final int localList = GLSMDraws.glGenLists(1);
+ final int foreignList = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(localList, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(local);
+ GLSMDraws.glEndList();
sharedDrawable = new SharedDrawable(Display.getDrawable());
DrawableContexts.run(sharedDrawable, "SharedDrawableContext-VaoBind-Thread", () -> {
int foreign;
- do foreign = GLStateManager.glGenVertexArrays(); while (foreign == bound);
- GLStateManager.glNewList(foreignList, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(foreign);
- GLStateManager.glEndList();
+ do foreign = GLSMVertexInput.glGenVertexArrays(); while (foreign == bound);
+ GLSMDraws.glNewList(foreignList, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(foreign);
+ GLSMDraws.glEndList();
});
- GLStateManager.glBindVertexArray(bound);
- GLStateManager.glCallList(foreignList);
- assertEquals(bound, GLStateManager.getBoundVAO());
+ GLSMVertexInput.glBindVertexArray(bound);
+ GLSMDraws.glCallList(foreignList);
+ assertEquals(bound, GLSMVertexInput.getBoundVAO());
assertEquals(bound, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING));
- GLStateManager.glCallList(localList);
- assertEquals(local, GLStateManager.getBoundVAO());
+ GLSMDraws.glCallList(localList);
+ assertEquals(local, GLSMVertexInput.getBoundVAO());
assertEquals(local, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING));
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glDeleteVertexArrays(bound);
- GLStateManager.glDeleteVertexArrays(local);
- GLStateManager.glDeleteLists(localList, 1);
- GLStateManager.glDeleteLists(foreignList, 1);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMVertexInput.glDeleteVertexArrays(bound);
+ GLSMVertexInput.glDeleteVertexArrays(local);
+ GLSMDraws.glDeleteLists(localList, 1);
+ GLSMDraws.glDeleteLists(foreignList, 1);
}
@Test
void deferredTextureDeletesWaitForSplashAndScrubDrawableContexts() throws Exception {
sharedDrawable = new SharedDrawable(Display.getDrawable());
- final int t = GLStateManager.glGenTextures();
+ final int t = GLSMTextures.glGenTextures();
final AtomicReference workerCtxRef = new AtomicReference<>();
DrawableContexts.run(sharedDrawable, "SharedDrawableContext-DeferredDelete-Thread", () -> {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t);
workerCtxRef.set(GLStateManager.ctx());
});
@@ -355,14 +355,14 @@ public class GLSM_SharedDrawableContext_GLTest {
try {
SplashWindow.setSplashComplete(false);
- GLStateManager.glDeleteTextures(t);
- deferredGen = GLStateManager.glGenTextures();
+ GLSMTextures.glDeleteTextures(t);
+ deferredGen = GLSMTextures.glGenTextures();
assertTrue(GL11.glIsTexture(t), "delete must stay deferred while the splash is not complete");
assertEquals(t, workerCtx.textures.getTextureUnitBindings(0).getBinding(), "worker ctx binding must survive until the flush");
SplashWindow.setSplashComplete(true);
- flushGen = GLStateManager.glGenTextures();
+ flushGen = GLSMTextures.glGenTextures();
assertFalse(GL11.glIsTexture(t), "the flush must delete the texture once the splash is complete");
assertEquals(0, workerCtx.textures.getTextureUnitBindings(0).getBinding(), "the flush must scrub the drawable context's binding");
@@ -384,21 +384,21 @@ public class GLSM_SharedDrawableContext_GLTest {
workerCtxRef.set(GLStateManager.ctx());
barrier.await();
for (int i = 0; i < 20000; i++) {
- final int t = GLStateManager.pushState(StateSet.FONT);
- GLStateManager.glNormal3f(0.1f, 0.2f, 0.3f);
- GLStateManager.popStateTo(t);
+ final int t = GLSMAttribStack.pushState(StateSet.FONT);
+ GLSMCurrentAttribs.glNormal3f(0.1f, 0.2f, 0.3f);
+ GLSMAttribStack.popStateTo(t);
}
- GLStateManager.glNormal3f(0.1f, 0.2f, 0.3f);
+ GLSMCurrentAttribs.glNormal3f(0.1f, 0.2f, 0.3f);
});
try {
barrier.await();
for (int i = 0; i < 20000; i++) {
- final int t = GLStateManager.pushState(StateSet.FONT);
- GLStateManager.glNormal3f(0.25f, 0.5f, 0.75f);
- GLStateManager.popStateTo(t);
+ final int t = GLSMAttribStack.pushState(StateSet.FONT);
+ GLSMCurrentAttribs.glNormal3f(0.25f, 0.5f, 0.75f);
+ GLSMAttribStack.popStateTo(t);
}
- GLStateManager.glNormal3f(0.25f, 0.5f, 0.75f);
+ GLSMCurrentAttribs.glNormal3f(0.25f, 0.5f, 0.75f);
worker.join();
final GLContextState workerCtx = workerCtxRef.get();
@@ -412,7 +412,7 @@ public class GLSM_SharedDrawableContext_GLTest {
assertEquals(0.2f, workerCtx.ffp.currentNormal.y, 0.0f);
assertEquals(0.3f, workerCtx.ffp.currentNormal.z, 0.0f);
} finally {
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java
index 1ed94343c..cceac5dd7 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java
@@ -29,21 +29,21 @@ public class GLSM_SplashCachingCoverage_UnitTest {
@AfterEach
void leaveSplashWindow() throws IllegalAccessException {
SplashWindow.leave();
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
}
@Test
void popAttribDoesNotRevertDepthFuncSetDuringSplash() throws IllegalAccessException {
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
SplashWindow.setSplashComplete(true);
GLStateManager.setDrawableGLHolder(Thread.currentThread());
- GLStateManager.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMAttribStack.glPopAttrib();
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "popAttrib reverted to the stale default");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "popAttrib reverted to the stale default");
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC));
}
@@ -77,26 +77,26 @@ public class GLSM_SplashCachingCoverage_UnitTest {
@Test
void replayPushesCachedStateWithoutDisturbingIt() {
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glCullFace(GL11.GL_FRONT);
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache write dropped while caching=false");
- assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "cache write dropped while caching=false");
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache write dropped while caching=false");
+ assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache write dropped while caching=false");
- GLStateManager.replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "replay must not mutate the cache");
- assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "replay must not mutate the cache");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "replay must not mutate the cache");
+ assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "replay must not mutate the cache");
}
@Test
void replayPushesDepthFuncToRealGL() {
assertNotNull(BackendManager.RENDER_BACKEND, "no backend: replay would no-op and this test would pass vacuously");
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
GL11.glDepthFunc(GL11.GL_LESS);
assertEquals(GL11.GL_LESS, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "setup failed to diverge real GL");
- GLStateManager.replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "cached depth func never reached real GL; GUI draws at equal depth would be rejected");
}
@@ -105,7 +105,7 @@ public class GLSM_SplashCachingCoverage_UnitTest {
void firstFrameAfterSplashSeedsRealGL() throws IllegalAccessException {
assertNotNull(BackendManager.RENDER_BACKEND, "no backend: this test would pass vacuously");
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
GL11.glDepthFunc(GL11.GL_LESS);
SplashWindow.setSplashComplete(false);
@@ -123,7 +123,7 @@ public class GLSM_SplashCachingCoverage_UnitTest {
@Test
void splashCompleteRequestsSeedOnceAndIssuesNoGLItself() throws IllegalAccessException {
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
GL11.glDepthFunc(GL11.GL_LESS);
SplashWindow.setSplashComplete(false);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java
index f3416b7ba..2b9bd8236 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java
@@ -22,64 +22,64 @@ public class GLSM_StateQueryRoundTrip_UnitTest {
@Test
void activeTextureRoundTrips() {
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- assertEquals(GL13.GL_TEXTURE3, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "must return the GL_TEXTURE# enum, not the unit index");
- assertEquals(GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ assertEquals(GL13.GL_TEXTURE3, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "must return the GL_TEXTURE# enum, not the unit index");
+ assertEquals(GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
@Test
void invalidTextureUnitIsIgnored() {
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glActiveTexture(0);
- assertEquals(GL13.GL_TEXTURE2, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
+ GLSMTextures.glActiveTexture(0);
+ assertEquals(GL13.GL_TEXTURE2, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
assertEquals(GL13.GL_TEXTURE2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS);
- assertEquals(GL13.GL_TEXTURE2, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS);
+ assertEquals(GL13.GL_TEXTURE2, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
assertEquals(GL13.GL_TEXTURE2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
@Test
void depthWriteMaskRoundTripsAsInteger() {
try {
- GLStateManager.glDepthMask(false);
- assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
assertEquals(GL11.GL_FALSE, GL11.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
- GLStateManager.glDepthMask(true);
- assertEquals(GL11.GL_TRUE, GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ assertEquals(GL11.GL_TRUE, GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
assertEquals(GL11.GL_TRUE, GL11.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
} finally {
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(true);
}
}
@Test
void cullFaceModeRoundTrips() {
try {
- GLStateManager.glCullFace(GL11.GL_FRONT);
- assertEquals(GL11.GL_FRONT, GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE));
- assertEquals(GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE));
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ assertEquals(GL11.GL_FRONT, GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE));
+ assertEquals(GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE));
} finally {
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
}
}
@Test
void polygonModeRoundTripsBothFaces() {
try {
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
- assertEquals(GL11.GL_LINE, GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE));
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
+ assertEquals(GL11.GL_LINE, GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE));
final IntBuffer params = BufferUtils.createIntBuffer(2);
- GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE, params);
+ GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE, params);
assertEquals(GL11.GL_LINE, params.get(0), "front mode");
assertEquals(GL11.GL_LINE, params.get(1), "back mode");
@@ -87,41 +87,41 @@ public class GLSM_StateQueryRoundTrip_UnitTest {
assertEquals(GL11.GL_LINE, driver.get(0), "driver front mode");
assertEquals(GL11.GL_LINE, driver.get(1), "driver back mode");
} finally {
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
}
}
@Test
void pixelUnpackStateRoundTrips() {
try {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 64);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 2);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 64);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 2);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
- assertEquals(64, GLStateManager.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH));
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS));
- assertEquals(3, GLStateManager.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS));
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
+ assertEquals(64, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH));
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS));
+ assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS));
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
assertEquals(64, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH));
assertEquals(2, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS));
assertEquals(3, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS));
assertEquals(1, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
} finally {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
}
}
@Test
void viewportFillsAllFourComponentsViaIntArray() {
- GLStateManager.glViewport(3, 5, 17, 23);
+ GLSMRasterizer.glViewport(3, 5, 17, 23);
final int[] params = new int[4];
- GLStateManager.glGetInteger(GL11.GL_VIEWPORT, params);
+ GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, params);
assertEquals(3, params[0]);
assertEquals(5, params[1]);
assertEquals(17, params[2]);
@@ -136,13 +136,13 @@ public class GLSM_StateQueryRoundTrip_UnitTest {
@Test
void saveDisturbRestoreIsIdentity() {
- final int activeTexture = GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE);
- final int depthWriteMask = GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK);
- final int cullMode = GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE);
- final int polygonMode = GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE);
- final int unpackAlignment = GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT);
+ final int activeTexture = GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE);
+ final int depthWriteMask = GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK);
+ final int cullMode = GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE);
+ final int polygonMode = GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE);
+ final int unpackAlignment = GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT);
final int[] viewport = new int[4];
- GLStateManager.glGetInteger(GL11.GL_VIEWPORT, viewport);
+ GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, viewport);
final int driverActiveTexture = GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE);
final int driverDepthWriteMask = GL11.glGetInteger(GL11.GL_DEPTH_WRITEMASK);
final int driverCullMode = GL11.glGetInteger(GL11.GL_CULL_FACE_MODE);
@@ -150,27 +150,27 @@ public class GLSM_StateQueryRoundTrip_UnitTest {
final int driverUnpackAlignment = GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT);
final IntBuffer driverViewport = driverInts(GL11.GL_VIEWPORT);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 4);
- GLStateManager.glDepthMask(false);
- GLStateManager.glCullFace(GL11.GL_FRONT_AND_BACK);
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_POINT);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 8);
- GLStateManager.glViewport(1, 1, 2, 2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 4);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT_AND_BACK);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_POINT);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 8);
+ GLSMRasterizer.glViewport(1, 1, 2, 2);
- GLStateManager.glActiveTexture(activeTexture);
- GLStateManager.glDepthMask(depthWriteMask == GL11.GL_TRUE);
- GLStateManager.glCullFace(cullMode);
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, polygonMode);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpackAlignment);
- GLStateManager.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+ GLSMTextures.glActiveTexture(activeTexture);
+ GLSMDepthStencilAlpha.glDepthMask(depthWriteMask == GL11.GL_TRUE);
+ GLSMRasterizer.glCullFace(cullMode);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, polygonMode);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpackAlignment);
+ GLSMRasterizer.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
- assertEquals(activeTexture, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
- assertEquals(depthWriteMask, GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
- assertEquals(cullMode, GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE));
- assertEquals(polygonMode, GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE));
- assertEquals(unpackAlignment, GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
+ assertEquals(activeTexture, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
+ assertEquals(depthWriteMask, GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK));
+ assertEquals(cullMode, GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE));
+ assertEquals(polygonMode, GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE));
+ assertEquals(unpackAlignment, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT));
final int[] restored = new int[4];
- GLStateManager.glGetInteger(GL11.GL_VIEWPORT, restored);
+ GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, restored);
assertEquals(viewport[0], restored[0]);
assertEquals(viewport[1], restored[1]);
assertEquals(viewport[2], restored[2]);
@@ -189,16 +189,16 @@ public class GLSM_StateQueryRoundTrip_UnitTest {
@Test
void uncachedTexParameterFallsThroughToTheDriver() {
- final int tex = GLStateManager.glGenTextures();
+ final int tex = GLSMTextures.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R, GL12.GL_CLAMP_TO_EDGE);
- assertEquals(GL12.GL_CLAMP_TO_EDGE, GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must fall through to the driver");
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R, GL12.GL_CLAMP_TO_EDGE);
+ assertEquals(GL12.GL_CLAMP_TO_EDGE, GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must fall through to the driver");
assertEquals(GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R),
- GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must match the driver");
+ GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must match the driver");
} finally {
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java
index 25cb827c3..d422ac9c8 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java
@@ -24,29 +24,29 @@ public class GLSM_StateSet_GLTest {
@AfterEach
void resetState() {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f);
- GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD);
- GLStateManager.disableLighting();
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
- GLStateManager.disableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
- GLStateManager.disableColorMaterial();
- GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD);
+ GLSMLighting.disableLighting();
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
+ GLSMLighting.disableColorMaterial();
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
}
private static boolean[] driverColorWriteMask() {
@@ -57,53 +57,53 @@ public class GLSM_StateSet_GLTest {
@Test
void batchRestoresBlendAxisAndLightingBooleanButNotStencil() {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.disableLighting();
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMLighting.disableLighting();
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
- final int d = GLStateManager.pushState(StateSet.BATCH);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.enableLighting();
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.BATCH);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMLighting.enableLighting();
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored by BATCH pop");
assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb");
assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_DST_RGB), "driver blend dst rgb");
- assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb");
- assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLStateManager.getBlendState().getDstRgb(), "cache blend dst rgb");
+ assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb");
+ assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLSMBlend.getBlendState().getDstRgb(), "cache blend dst rgb");
verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting enable - restored by BATCH pop");
verifyIsEnabled(GL11.GL_STENCIL_TEST, true, "Stencil test - not a BATCH member, must stay toggled");
}
@Test
void fontRestoresDepthAxisShadeModelAndPolygonOffsetButNotStencil() {
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
- final int d = GLStateManager.pushState(StateSet.FONT);
- GLStateManager.disableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glShadeModel(GL11.GL_FLAT);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(-10.0f, -10.0f);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(-10.0f, -10.0f);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_DEPTH_TEST, true, "Depth test enable - restored by FONT pop");
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache depth func");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache depth func");
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func");
- assertEquals(GL11.GL_SMOOTH, GLStateManager.getShadeModelState().getValue(), "cache shade model");
+ assertEquals(GL11.GL_SMOOTH, GLSMRasterizer.getShadeModelState().getValue(), "cache shade model");
verifyIsEnabled(GL11.GL_POLYGON_OFFSET_FILL, false, "Polygon offset fill - restored by FONT pop");
- assertEquals(0.0f, GLStateManager.getPolygonState().getOffsetFactor(), "cache polygon offset factor");
+ assertEquals(0.0f, GLSMRasterizer.getPolygonState().getOffsetFactor(), "cache polygon offset factor");
assertEquals(0.0f, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR), "driver polygon offset factor");
- assertEquals(0.0f, GLStateManager.getPolygonState().getOffsetUnits(), "cache polygon offset units");
+ assertEquals(0.0f, GLSMRasterizer.getPolygonState().getOffsetUnits(), "cache polygon offset units");
assertEquals(0.0f, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_UNITS), "driver polygon offset units");
verifyIsEnabled(GL11.GL_STENCIL_TEST, false, "Stencil test - not a FONT member, must stay toggled");
}
@@ -113,442 +113,442 @@ public class GLSM_StateSet_GLTest {
final int p0 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
final int p1 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
try {
- GLStateManager.glUseProgram(p0);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMPrograms.glUseProgram(p0);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
- final int d = GLStateManager.pushState(StateSet.FONT_PIPELINE);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glUseProgram(p1);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT_PIPELINE);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMPrograms.glUseProgram(p1);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored by FONT_PIPELINE pop");
+ assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored by FONT_PIPELINE pop");
assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - restored by FONT_PIPELINE pop");
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache depth func - restored by FONT_PIPELINE pop");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache depth func - restored by FONT_PIPELINE pop");
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func - restored by FONT_PIPELINE pop");
- assertEquals(p1, GLStateManager.getActiveProgram(), "program - not a FONT_PIPELINE member, must stay toggled");
+ assertEquals(p1, GLSMPrograms.getActiveProgram(), "program - not a FONT_PIPELINE member, must stay toggled");
- GLStateManager.glUseProgram(p0);
+ GLSMPrograms.glUseProgram(p0);
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(p0);
- GLStateManager.glDeleteProgram(p1);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(p0);
+ GLSMPrograms.glDeleteProgram(p1);
}
}
@Test
void handRestoresBlendAxisAndUnit1TexturingButNotColorMask() {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
- final int d = GLStateManager.pushState(StateSet.HAND);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.glColorMask(false, false, false, false);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.HAND);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMBlend.glColorMask(false, false, false, false);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored by HAND pop");
- assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb");
+ assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb");
assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb");
- assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by HAND pop");
+ assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by HAND pop");
final boolean[] driverMask = driverColorWriteMask();
assertFalse(driverMask[0] || driverMask[1] || driverMask[2] || driverMask[3], "driver color mask - not a HAND member, must stay toggled");
- assertFalse(GLStateManager.getColorMask().red || GLStateManager.getColorMask().green
- || GLStateManager.getColorMask().blue || GLStateManager.getColorMask().alpha, "cache color mask - not a HAND member, must stay toggled");
+ assertFalse(GLSMBlend.getColorMask().red || GLSMBlend.getColorMask().green
+ || GLSMBlend.getColorMask().blue || GLSMBlend.getColorMask().alpha, "cache color mask - not a HAND member, must stay toggled");
}
@Test
void masksRestoresDepthMaskAndColorMaskButNotDepthTestEnable() {
- GLStateManager.glDepthMask(true);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glColorMask(true, false, true, false);
- GLStateManager.disableDepthTest();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMBlend.glColorMask(true, false, true, false);
+ GLSMDepthStencilAlpha.disableDepthTest();
- final int d = GLStateManager.pushState(StateSet.MASKS);
- GLStateManager.glDepthMask(false);
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glColorMask(false, true, false, true);
- GLStateManager.enableDepthTest();
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.MASKS);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMBlend.glColorMask(false, true, false, true);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMAttribStack.popStateTo(d);
assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth write mask - restored by MASKS pop");
- assertTrue(GLStateManager.getDepthState().isEnabled(), "cache depth write mask - restored by MASKS pop");
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache depth func");
+ assertTrue(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "cache depth write mask - restored by MASKS pop");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache depth func");
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func");
final boolean[] driverMask = driverColorWriteMask();
assertTrue(driverMask[0] && !driverMask[1] && driverMask[2] && !driverMask[3], "driver color mask - restored by MASKS pop");
- assertTrue(GLStateManager.getColorMask().red && !GLStateManager.getColorMask().green
- && GLStateManager.getColorMask().blue && !GLStateManager.getColorMask().alpha, "cache color mask - restored by MASKS pop");
+ assertTrue(GLSMBlend.getColorMask().red && !GLSMBlend.getColorMask().green
+ && GLSMBlend.getColorMask().blue && !GLSMBlend.getColorMask().alpha, "cache color mask - restored by MASKS pop");
verifyIsEnabled(GL11.GL_DEPTH_TEST, true, "Depth test enable - not a MASKS member, must stay toggled");
}
@Test
void cullRestoresPolygonAxisAndCullEnableButNotBlendFunc() {
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.CULL);
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.CULL);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull enable - restored by CULL pop");
- assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode");
+ assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode");
assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode");
verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - not a CULL member, must stay toggled");
- assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not a CULL member, must stay toggled");
+ assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not a CULL member, must stay toggled");
assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - not a CULL member, must stay toggled");
}
@Test
void blendRestoresBlendAxisButNotCull() {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored by BLEND pop");
- assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb");
+ assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb");
assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb");
verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull enable - not a BLEND member, must stay toggled");
- assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - not a BLEND member, must stay toggled");
+ assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - not a BLEND member, must stay toggled");
assertEquals(GL11.GL_FRONT, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - not a BLEND member, must stay toggled");
}
@Test
void alphaRestoresAlphaAxisButNotBlend() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "Alpha test enable - restored by ALPHA pop");
- assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "cache alpha func");
- assertEquals(0.5f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref");
+ assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func");
+ assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref");
verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - not an ALPHA member, must stay toggled");
- assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not an ALPHA member, must stay toggled");
+ assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not an ALPHA member, must stay toggled");
assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - not an ALPHA member, must stay toggled");
}
@Test
void cutoutRestoresAlphaAxisAndUnit1TexturingButNotBlend() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.CUTOUT);
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ final int d = GLSMAttribStack.pushState(StateSet.CUTOUT);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
final int fragBefore = GLStateManager.ctx().fragmentGeneration;
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
assertEquals(fragBefore + 1, GLStateManager.ctx().fragmentGeneration, "CUTOUT pop must bump fragment generation once when the value changed inside the bracket");
verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "Alpha test enable - restored by CUTOUT pop");
- assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "cache alpha func");
- assertEquals(0.5f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref");
- assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by CUTOUT pop");
+ assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func");
+ assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref");
+ assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by CUTOUT pop");
verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - not a CUTOUT member, must stay toggled");
- assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled");
+ assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled");
assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - not a CUTOUT member, must stay toggled");
}
@Test
void nonMemberMutationsInsideBracketSaveAndDiscardNothing() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
- final int d = GLStateManager.pushState(StateSet.CUTOUT);
- final long discardsBefore = GLStateManager.attribDiscards;
+ final int d = GLSMAttribStack.pushState(StateSet.CUTOUT);
+ final long discardsBefore = GLSMAttribStack.attribDiscards;
try {
- final long savedBefore = GLStateManager.attribSlotsSaved;
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- assertEquals(savedBefore, GLStateManager.attribSlotsSaved, "non-member mutations must not save slots");
+ final long savedBefore = GLSMAttribStack.attribSlotsSaved;
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ assertEquals(savedBefore, GLSMAttribStack.attribSlotsSaved, "non-member mutations must not save slots");
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
- assertEquals(discardsBefore, GLStateManager.attribDiscards, "non-member mutations must not leave slots to discard");
- assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled");
+ assertEquals(discardsBefore, GLSMAttribStack.attribDiscards, "non-member mutations must not leave slots to discard");
+ assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled");
}
@Test
void unchangedSettersSaveNothing() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f);
- GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f);
+ GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
try {
- final long savedBefore = GLStateManager.attribSlotsSaved;
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f);
- GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD);
- GLStateManager.glBlendEquationSeparate(GL14.GL_FUNC_ADD, GL14.GL_FUNC_ADD);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- assertEquals(1, GLStateManager.attribSlotsSaved - savedBefore, "only the active unit change may save a slot");
+ final long savedBefore = GLSMAttribStack.attribSlotsSaved;
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f);
+ GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD);
+ GLSMBlend.glBlendEquationSeparate(GL14.GL_FUNC_ADD, GL14.GL_FUNC_ADD);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ assertEquals(1, GLSMAttribStack.attribSlotsSaved - savedBefore, "only the active unit change may save a slot");
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- final int d2 = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ final int d2 = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
try {
- final long savedBefore = GLStateManager.attribSlotsSaved;
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- assertEquals(0, GLStateManager.attribSlotsSaved - savedBefore, "unchanged glBlendFunc must not save a slot");
+ final long savedBefore = GLSMAttribStack.attribSlotsSaved;
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ assertEquals(0, GLSMAttribStack.attribSlotsSaved - savedBefore, "unchanged glBlendFunc must not save a slot");
} finally {
- GLStateManager.popStateTo(d2);
+ GLSMAttribStack.popStateTo(d2);
}
}
@Test
void bracketDoesNotInheritMembersOfAnEarlierBracketAtItsDepth() {
for (boolean nested : new boolean[] {false, true}) {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- final int outer = nested ? GLStateManager.pushState(StateSet.CULL) : GLStateManager.getAttribDepth();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ final int outer = nested ? GLSMAttribStack.pushState(StateSet.CULL) : GLSMAttribStack.getAttribDepth();
try {
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.glPopAttrib();
- final int d = GLStateManager.pushState(StateSet.CUTOUT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPopAttrib();
+ final int d = GLSMAttribStack.pushState(StateSet.CUTOUT);
try {
- final long savedBefore = GLStateManager.attribSlotsSaved;
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- assertEquals(savedBefore, GLStateManager.attribSlotsSaved, "nested=" + nested);
+ final long savedBefore = GLSMAttribStack.attribSlotsSaved;
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ assertEquals(savedBefore, GLSMAttribStack.attribSlotsSaved, "nested=" + nested);
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
} finally {
- GLStateManager.popStateTo(outer);
+ GLSMAttribStack.popStateTo(outer);
}
}
}
@Test
void cullFaceModeRestoredThroughBatchBracketRegression2117() {
- GLStateManager.glCullFace(GL11.GL_BACK);
- final int d = GLStateManager.pushState(StateSet.BATCH);
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.popStateTo(d);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ final int d = GLSMAttribStack.pushState(StateSet.BATCH);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode");
+ assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode");
assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode");
}
@Test
void batchRestoresUnit0And1BindingsAndActiveUnitButNotUnit2() {
if (GLStateManager.MAX_TEXTURE_UNITS < 3) return;
- final int tex0Base = GLStateManager.glGenTextures();
- final int tex1Base = GLStateManager.glGenTextures();
- final int tex2Base = GLStateManager.glGenTextures();
- final int tex0Dirty = GLStateManager.glGenTextures();
- final int tex1Dirty = GLStateManager.glGenTextures();
- final int tex2Dirty = GLStateManager.glGenTextures();
+ final int tex0Base = GLSMTextures.glGenTextures();
+ final int tex1Base = GLSMTextures.glGenTextures();
+ final int tex2Base = GLSMTextures.glGenTextures();
+ final int tex0Dirty = GLSMTextures.glGenTextures();
+ final int tex1Dirty = GLSMTextures.glGenTextures();
+ final int tex2Dirty = GLSMTextures.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex0Base);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1Base);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex2Base);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex0Base);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1Base);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex2Base);
- final int d = GLStateManager.pushState(StateSet.BATCH);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex0Dirty);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1Dirty);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex2Dirty);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.BATCH);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex0Dirty);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1Dirty);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex2Dirty);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(2, GLStateManager.getActiveTextureUnit(), "cache active unit - restored by BATCH pop");
+ assertEquals(2, GLSMTextures.getActiveTextureUnit(), "cache active unit - restored by BATCH pop");
assertEquals(GL13.GL_TEXTURE0 + 2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit - restored by BATCH pop");
- assertEquals(tex0Base, GLStateManager.getTextures().getTextureUnitBindings(0).getBinding(), "cache unit 0 binding - restored by BATCH pop");
+ assertEquals(tex0Base, GLSMTextures.getTextures().getTextureUnitBindings(0).getBinding(), "cache unit 0 binding - restored by BATCH pop");
assertEquals(tex0Base, driverTextureBinding(0), "driver unit 0 binding - restored by BATCH pop");
- assertEquals(tex1Base, GLStateManager.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding - restored by BATCH pop");
+ assertEquals(tex1Base, GLSMTextures.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding - restored by BATCH pop");
assertEquals(tex1Base, driverTextureBinding(1), "driver unit 1 binding - restored by BATCH pop");
- assertEquals(tex2Dirty, GLStateManager.getTextures().getTextureUnitBindings(2).getBinding(), "cache unit 2 binding - not a BATCH member, must stay toggled");
+ assertEquals(tex2Dirty, GLSMTextures.getTextures().getTextureUnitBindings(2).getBinding(), "cache unit 2 binding - not a BATCH member, must stay toggled");
assertEquals(tex2Dirty, driverTextureBinding(2), "driver unit 2 binding - not a BATCH member, must stay toggled");
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(tex0Base);
- GLStateManager.glDeleteTextures(tex1Base);
- GLStateManager.glDeleteTextures(tex2Base);
- GLStateManager.glDeleteTextures(tex0Dirty);
- GLStateManager.glDeleteTextures(tex1Dirty);
- GLStateManager.glDeleteTextures(tex2Dirty);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(tex0Base);
+ GLSMTextures.glDeleteTextures(tex1Base);
+ GLSMTextures.glDeleteTextures(tex2Base);
+ GLSMTextures.glDeleteTextures(tex0Dirty);
+ GLSMTextures.glDeleteTextures(tex1Dirty);
+ GLSMTextures.glDeleteTextures(tex2Dirty);
}
}
@Test
void popStateToRepairsUnbalancedInnerPush() {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.pushState(StateSet.CULL);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.popStateTo(d);
- assertEquals(d, GLStateManager.getAttribDepth());
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "popStateTo repairs the unbalanced non-member push and carries the change through to the BLEND member pop, restoring the pre-bracket baseline");
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMAttribStack.pushState(StateSet.CULL);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMAttribStack.popStateTo(d);
+ assertEquals(d, GLSMAttribStack.getAttribDepth());
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "popStateTo repairs the unbalanced non-member push and carries the change through to the BLEND member pop, restoring the pre-bracket baseline");
assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb");
}
@Test
void popStateToToleratesUnbalancedInnerPop() {
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.popState();
- assertEquals(d, GLStateManager.getAttribDepth());
- GLStateManager.popStateTo(d);
- assertEquals(d, GLStateManager.getAttribDepth());
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMAttribStack.popState();
+ assertEquals(d, GLSMAttribStack.getAttribDepth());
+ GLSMAttribStack.popStateTo(d);
+ assertEquals(d, GLSMAttribStack.getAttribDepth());
}
@Test
void exceptionMidBracketLeavesDepthAndStateCorrectViaFinally() {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- final int depthBefore = GLStateManager.getAttribDepth();
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ final int depthBefore = GLSMAttribStack.getAttribDepth();
final RuntimeException thrown = assertThrows(RuntimeException.class, () -> {
- final int d = GLStateManager.pushState(StateSet.BLEND);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
try {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
throw new RuntimeException("boom");
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
});
assertEquals("boom", thrown.getMessage());
- assertEquals(depthBefore, GLStateManager.getAttribDepth());
+ assertEquals(depthBefore, GLSMAttribStack.getAttribDepth());
verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored despite exception");
- assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored despite exception");
+ assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored despite exception");
}
@Test
void allAttribBitsNestedInsideInternalBracketRestoresBothLevels() {
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMAttribStack.glPopAttrib();
verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull enable - restored by inner GL_ALL_ATTRIB_BITS pop");
- assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by inner GL_ALL_ATTRIB_BITS pop");
+ assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by inner GL_ALL_ATTRIB_BITS pop");
assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - restored by inner GL_ALL_ATTRIB_BITS pop");
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - restored by outer BLEND pop");
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored by outer BLEND pop");
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored by outer BLEND pop");
}
@Test
void internalBracketNestedInsideAllAttribBitsRestoresBothLevels() {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try {
- GLStateManager.glCullFace(GL11.GL_FRONT);
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMAttribStack.popStateTo(d);
verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - restored by inner BLEND pop");
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored by inner BLEND pop");
- assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - change survives, not a BLEND member");
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored by inner BLEND pop");
+ assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - change survives, not a BLEND member");
assertEquals(GL11.GL_FRONT, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - change survives, not a BLEND member");
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
- assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by outer GL_ALL_ATTRIB_BITS pop");
+ assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by outer GL_ALL_ATTRIB_BITS pop");
assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - restored by outer GL_ALL_ATTRIB_BITS pop");
}
@@ -557,19 +557,19 @@ public class GLSM_StateSet_GLTest {
final int p0 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
final int p1 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
try {
- GLStateManager.glUseProgram(p0);
+ GLSMPrograms.glUseProgram(p0);
- final int d = GLStateManager.pushState(StateSet.FONT);
- GLStateManager.glUseProgram(p1);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT);
+ GLSMPrograms.glUseProgram(p1);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(p0, GLStateManager.getActiveProgram(), "cache active program restored");
+ assertEquals(p0, GLSMPrograms.getActiveProgram(), "cache active program restored");
assertEquals(p0, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "driver current program restored");
assertFalse(ShaderManager.getInstance().isActive(), "FFP must stay inactive when a real program was bound before the bracket");
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(p0);
- GLStateManager.glDeleteProgram(p1);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(p0);
+ GLSMPrograms.glDeleteProgram(p1);
}
}
@@ -577,34 +577,34 @@ public class GLSM_StateSet_GLTest {
void rProgramFontReactivatesFfpAfterBracket() {
final int p1 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
try {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
assertTrue(ShaderManager.getInstance().isActive(), "FFP must be active before the bracket");
- final int d = GLStateManager.pushState(StateSet.FONT);
- GLStateManager.glUseProgram(p1);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT);
+ GLSMPrograms.glUseProgram(p1);
assertFalse(ShaderManager.getInstance().isActive(), "FFP must deactivate once a real program binds");
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(0, GLStateManager.getActiveProgram(), "cache active program restored to the FFP sentinel");
+ assertEquals(0, GLSMPrograms.getActiveProgram(), "cache active program restored to the FFP sentinel");
assertTrue(ShaderManager.getInstance().isActive(), "FFP must be active again after the pop");
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(p1);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(p1);
}
}
@Test
void blendPopDoesNotBumpFragmentOrLightingGeneration() {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO);
final int fragBefore = GLStateManager.ctx().fragmentGeneration;
final int lightBefore = GLStateManager.ctx().lightingGeneration;
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
assertEquals(fragBefore, GLStateManager.ctx().fragmentGeneration, "BLEND pop must not bump fragment generation");
assertEquals(lightBefore, GLStateManager.ctx().lightingGeneration, "BLEND pop must not bump lighting generation");
@@ -612,113 +612,113 @@ public class GLSM_StateSet_GLTest {
@Test
void alphaPopBumpsFragmentGenerationWhenChanged() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- final int d = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f);
+ final int d = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f);
final int fragBefore = GLStateManager.ctx().fragmentGeneration;
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
assertEquals(fragBefore + 1, GLStateManager.ctx().fragmentGeneration, "ALPHA pop must bump fragment generation once when the value changed inside the bracket");
}
@Test
void textureBitBracketRestoresUnit1BindingAndActiveUnit() {
- final int texBase = GLStateManager.glGenTextures();
- final int texDirty = GLStateManager.glGenTextures();
+ final int texBase = GLSMTextures.glGenTextures();
+ final int texDirty = GLSMTextures.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texBase);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texDirty);
- GLStateManager.popStateTo(d);
- assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored by GL_TEXTURE_BIT pop");
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texBase);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT));
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texDirty);
+ GLSMAttribStack.popStateTo(d);
+ assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored by GL_TEXTURE_BIT pop");
assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored by GL_TEXTURE_BIT pop");
- assertEquals(texBase, GLStateManager.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding restored by GL_TEXTURE_BIT pop");
+ assertEquals(texBase, GLSMTextures.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding restored by GL_TEXTURE_BIT pop");
assertEquals(texBase, driverTextureBinding(1), "driver unit 1 binding restored by GL_TEXTURE_BIT pop");
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(texBase);
- GLStateManager.glDeleteTextures(texDirty);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(texBase);
+ GLSMTextures.glDeleteTextures(texDirty);
}
}
@Test
void textureBitBracketRestoresTexEnvModeAndColor() {
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
final FloatBuffer zero = BufferUtils.createFloatBuffer(4);
zero.put(0.0f).put(0.0f).put(0.0f).put(0.0f).flip();
- GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, zero);
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT));
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL);
+ GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, zero);
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT));
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL);
final FloatBuffer dirty = BufferUtils.createFloatBuffer(4);
dirty.put(0.1f).put(0.2f).put(0.3f).put(0.4f).flip();
- GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, dirty);
- GLStateManager.popStateTo(d);
- assertEquals(GL11.GL_MODULATE, GLStateManager.getTextures().getTexEnvState(0).mode, "cache tex env mode restored by GL_TEXTURE_BIT pop");
- assertEquals(0.0f, GLStateManager.getTextures().getTexEnvState(0).envColorR, 0.0001f, "cache tex env color restored by GL_TEXTURE_BIT pop");
+ GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, dirty);
+ GLSMAttribStack.popStateTo(d);
+ assertEquals(GL11.GL_MODULATE, GLSMTextures.getTextures().getTexEnvState(0).mode, "cache tex env mode restored by GL_TEXTURE_BIT pop");
+ assertEquals(0.0f, GLSMTextures.getTextures().getTexEnvState(0).envColorR, 0.0001f, "cache tex env color restored by GL_TEXTURE_BIT pop");
}
@Test
void lightingBitBracketRestoresBakedFrontMaterialAfterColorMaterialToggle() {
- GLStateManager.glColor4f(0.9f, 0.9f, 0.9f, 0.9f);
- GLStateManager.enableColorMaterial();
- GLStateManager.disableColorMaterial();
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_LIGHTING_BIT));
- GLStateManager.glColor4f(0.1f, 0.2f, 0.3f, 0.4f);
- GLStateManager.enableColorMaterial();
- GLStateManager.popStateTo(d);
- assertEquals(0.9f, GLStateManager.getFrontMaterial().ambient.x, 0.0001f, "cache front material ambient restored by GL_LIGHTING_BIT pop");
- assertEquals(0.9f, GLStateManager.getFrontMaterial().diffuse.x, 0.0001f, "cache front material diffuse restored by GL_LIGHTING_BIT pop");
+ GLSMCurrentAttribs.glColor4f(0.9f, 0.9f, 0.9f, 0.9f);
+ GLSMLighting.enableColorMaterial();
+ GLSMLighting.disableColorMaterial();
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_LIGHTING_BIT));
+ GLSMCurrentAttribs.glColor4f(0.1f, 0.2f, 0.3f, 0.4f);
+ GLSMLighting.enableColorMaterial();
+ GLSMAttribStack.popStateTo(d);
+ assertEquals(0.9f, GLSMLighting.getFrontMaterial().ambient.x, 0.0001f, "cache front material ambient restored by GL_LIGHTING_BIT pop");
+ assertEquals(0.9f, GLSMLighting.getFrontMaterial().diffuse.x, 0.0001f, "cache front material diffuse restored by GL_LIGHTING_BIT pop");
}
@Test
void batchAppliesPassLightingAndRestoresLiveLighting() {
- final boolean lightmapWas = GLStateManager.getTextures().getTextureUnitStates(1).isEnabled();
+ final boolean lightmapWas = GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled();
final LightingSnapshot pass = new LightingSnapshot();
try {
- GLStateManager.glEnable(GL11.GL_LIGHT0);
- GLStateManager.glEnable(GL11.GL_LIGHT1);
- GLStateManager.enableColorMaterial();
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f);
- GLStateManager.captureLighting(pass);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
+ GLSMEnable.glEnable(GL11.GL_LIGHT1);
+ GLSMLighting.enableColorMaterial();
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f);
+ GLSMLighting.captureLighting(pass);
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT1);
- GLStateManager.disableColorMaterial();
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f);
- GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(false);
- final int liveGeneration = GLStateManager.getLightingGeneration();
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT1);
+ GLSMLighting.disableColorMaterial();
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f);
+ GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(false);
+ final int liveGeneration = GLSMLighting.getLightingGeneration();
- final int d = GLStateManager.pushState(StateSet.BATCH);
- GLStateManager.applyLighting(pass);
- GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(true);
- assertTrue(GLStateManager.getLightStates()[0].isEnabled(), "light 0 from the pass");
- assertTrue(GLStateManager.getLightStates()[1].isEnabled(), "light 1 from the pass");
- assertTrue(GLStateManager.getColorMaterial().isEnabled(), "color material from the pass");
- assertEquals(2.0f, GLStateManager.getLightDataStates()[0].constantAttenuation, "light 0 data from the pass");
- assertTrue(GLStateManager.getLightingGeneration() != liveGeneration, "lighting uniforms marked dirty");
- final int passGeneration = GLStateManager.getLightingGeneration();
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.BATCH);
+ GLSMLighting.applyLighting(pass);
+ GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(true);
+ assertTrue(GLSMLighting.getLightStates()[0].isEnabled(), "light 0 from the pass");
+ assertTrue(GLSMLighting.getLightStates()[1].isEnabled(), "light 1 from the pass");
+ assertTrue(GLSMLighting.getColorMaterial().isEnabled(), "color material from the pass");
+ assertEquals(2.0f, GLSMLighting.getLightDataStates()[0].constantAttenuation, "light 0 data from the pass");
+ assertTrue(GLSMLighting.getLightingGeneration() != liveGeneration, "lighting uniforms marked dirty");
+ final int passGeneration = GLSMLighting.getLightingGeneration();
+ GLSMAttribStack.popStateTo(d);
- assertFalse(GLStateManager.getLightStates()[0].isEnabled(), "light 0 restored by BATCH pop");
- assertFalse(GLStateManager.getLightStates()[1].isEnabled(), "light 1 restored by BATCH pop");
- assertFalse(GLStateManager.getColorMaterial().isEnabled(), "color material restored by BATCH pop");
- assertEquals(1.0f, GLStateManager.getLightDataStates()[0].constantAttenuation, "light 0 data restored by BATCH pop");
- assertFalse(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(), "lightmap enable restored by BATCH pop");
- assertTrue(GLStateManager.getLightingGeneration() != passGeneration, "lighting uniforms marked dirty after pop");
+ assertFalse(GLSMLighting.getLightStates()[0].isEnabled(), "light 0 restored by BATCH pop");
+ assertFalse(GLSMLighting.getLightStates()[1].isEnabled(), "light 1 restored by BATCH pop");
+ assertFalse(GLSMLighting.getColorMaterial().isEnabled(), "color material restored by BATCH pop");
+ assertEquals(1.0f, GLSMLighting.getLightDataStates()[0].constantAttenuation, "light 0 data restored by BATCH pop");
+ assertFalse(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(), "lightmap enable restored by BATCH pop");
+ assertTrue(GLSMLighting.getLightingGeneration() != passGeneration, "lighting uniforms marked dirty after pop");
} finally {
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT1);
- GLStateManager.disableColorMaterial();
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f);
- GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(lightmapWas);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT1);
+ GLSMLighting.disableColorMaterial();
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f);
+ GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(lightmapWas);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java
index 0e842718f..7a5ef76e4 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java
@@ -15,24 +15,24 @@ public class GLSM_TextureBindingTargetCache_UnitTest {
final int t3d = GL11.glGenTextures();
final int t2d = GL11.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
- assertEquals(t3d, GLStateManager.getBoundTextureForServerState(3), "cache must track a 3D bind");
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
+ assertEquals(t3d, GLSMTextures.getBoundTextureForServerState(3), "cache must track a 3D bind");
assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "3D bind must reach the driver");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
- assertEquals(t2d, GLStateManager.getBoundTextureForServerState(3), "cache must track the 2D bind after a 3D bind");
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
+ assertEquals(t2d, GLSMTextures.getBoundTextureForServerState(3), "cache must track the 2D bind after a 3D bind");
assertEquals(t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D));
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
- assertEquals(t3d, GLStateManager.getBoundTextureForServerState(3), "cache must track the 3D re-bind");
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
+ assertEquals(t3d, GLSMTextures.getBoundTextureForServerState(3), "cache must track the 3D re-bind");
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
} finally {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(t3d);
- GLStateManager.glDeleteTextures(t2d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(t3d);
+ GLSMTextures.glDeleteTextures(t2d);
}
}
@@ -40,19 +40,19 @@ public class GLSM_TextureBindingTargetCache_UnitTest {
void proxyTargetBindIsNeitherForwardedNorCached() {
final int t2d = GL11.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE5);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE5);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
- GLStateManager.glBindTexture(GL11.GL_PROXY_TEXTURE_2D, 0);
- GLStateManager.glBindTexture(GL12.GL_PROXY_TEXTURE_3D, t2d);
+ GLSMTextures.glBindTexture(GL11.GL_PROXY_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL12.GL_PROXY_TEXTURE_3D, t2d);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "a proxy target must never reach the driver");
- assertEquals(t2d, GLStateManager.getBoundTextureForServerState(5), "a proxy bind must not disturb the cache");
+ assertEquals(t2d, GLSMTextures.getBoundTextureForServerState(5), "a proxy bind must not disturb the cache");
assertEquals(t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D));
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(t2d);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(t2d);
}
}
@@ -61,22 +61,22 @@ public class GLSM_TextureBindingTargetCache_UnitTest {
final int t3d = GL11.glGenTextures();
final int t2d = GL11.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d);
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
+ GLSMAttribStack.glPopAttrib();
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "restore must not re-bind a 3D texture as 2D");
- assertEquals(t3d, GLStateManager.getBoundTextureForServerState(2), "cache must restore the pre-push binding");
+ assertEquals(t3d, GLSMTextures.getBoundTextureForServerState(2), "cache must restore the pre-push binding");
assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "restore must use the recorded target");
} finally {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(t3d);
- GLStateManager.glDeleteTextures(t2d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(t3d);
+ GLSMTextures.glDeleteTextures(t2d);
}
}
@@ -84,14 +84,14 @@ public class GLSM_TextureBindingTargetCache_UnitTest {
void unbindIsNotElidedAcrossTargets() {
final int t2d = GL11.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE4);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE4);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
assertEquals(0, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "2D unbind after a 3D unbind must reach the driver");
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(t2d);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(t2d);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
index 04c2273ce..9226a756f 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
@@ -48,9 +48,9 @@ public class GLSM_TextureInfoCache_UnitTest {
void testNonGenericUploadCachesWithoutRoundtrip() {
int texId = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
ByteBuffer pixels = BufferUtils.createByteBuffer(64 * 64 * 4);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texId);
assertFalse(info.needsInternalFormatResolve());
@@ -66,9 +66,9 @@ public class GLSM_TextureInfoCache_UnitTest {
void testGenericCompressedPreservesAsPassedInternalFormat() {
int texId = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
ByteBuffer pixels = BufferUtils.createByteBuffer(64 * 64 * 4);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texId);
assertEquals(GL13.GL_COMPRESSED_RGBA, info.getInternalFormat());
@@ -83,15 +83,15 @@ public class GLSM_TextureInfoCache_UnitTest {
void testRepeatedQueryAfterResolveUsesCache() {
int texId = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
ByteBuffer pixels = BufferUtils.createByteBuffer(64 * 64 * 4);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texId);
assertTrue(info.needsInternalFormatResolve());
- int first = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT);
+ int first = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT);
assertFalse(info.needsInternalFormatResolve());
- int second = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT);
+ int second = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT);
assertEquals(GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT), second);
assertEquals(first, second);
} finally {
@@ -137,7 +137,7 @@ public class GLSM_TextureInfoCache_UnitTest {
GLStateManager.setDrawableGLHolder(null); // Current thread != null, so caching disabled
assertFalse(GLStateManager.isCachingEnabled());
- GLStateManager.glDeleteTextures(texId);
+ GLSMTextures.glDeleteTextures(texId);
SplashWindow.setSplashComplete(true);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java
index ecd0fbf4b..65ff8eda7 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java
@@ -16,9 +16,9 @@ import static org.junit.jupiter.api.Assertions.assertNotSame;
public class GLSM_TextureUploadGeneration_GLTest {
private static int allocate(int size) {
- final int texId = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(size * size * 4));
+ final int texId = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(size * size * 4));
return texId;
}
@@ -26,14 +26,14 @@ public class GLSM_TextureUploadGeneration_GLTest {
void aLevelBeyondTheShiftWidthClampsToOne() {
final int texId = allocate(64);
try {
- assertEquals(64, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH));
- assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 6, GL11.GL_TEXTURE_WIDTH));
- assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 31, GL11.GL_TEXTURE_WIDTH));
- assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 32, GL11.GL_TEXTURE_WIDTH));
- assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 64, GL11.GL_TEXTURE_HEIGHT));
+ assertEquals(64, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH));
+ assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 6, GL11.GL_TEXTURE_WIDTH));
+ assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 31, GL11.GL_TEXTURE_WIDTH));
+ assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 32, GL11.GL_TEXTURE_WIDTH));
+ assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 64, GL11.GL_TEXTURE_HEIGHT));
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texId);
}
}
@@ -46,13 +46,13 @@ public class GLSM_TextureUploadGeneration_GLTest {
TextureInfoCache.INSTANCE.onDeleteTexture(texId);
final ByteBuffer pixels = BufferUtils.createByteBuffer(4 * 4 * 4);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
final TextureInfo second = TextureInfoCache.INSTANCE.getInfo(texId);
assertNotSame(first, second, "a deleted id drops its entry, so the replacement must be a distinct instance");
assertEquals(firstGeneration, second.getUploadGeneration(), "generations alias across a delete/recreate cycle, which is exactly why identity has to carry the distinction");
} finally {
- GLStateManager.glDeleteTextures(texId);
+ GLSMTextures.glDeleteTextures(texId);
}
}
@@ -64,16 +64,16 @@ public class GLSM_TextureUploadGeneration_GLTest {
final int afterAlloc = info.getUploadGeneration();
assertNotEquals(0, afterAlloc);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(2 * 2 * 4));
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(2 * 2 * 4));
assertNotEquals(afterAlloc, info.getUploadGeneration(), "content changed, so anything caching the pixels is stale");
final int afterSub = info.getUploadGeneration();
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4));
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4));
assertEquals(afterSub, info.getUploadGeneration(), "only level 0 is tracked");
// Level 1 was never allocated, so the driver rejects that upload.
assertEquals(GL11.GL_INVALID_OPERATION, GL11.glGetError());
} finally {
- GLStateManager.glDeleteTextures(texId);
+ GLSMTextures.glDeleteTextures(texId);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
index d81e1b83d..404cd8f9e 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
@@ -23,7 +23,7 @@ public class GLSM_VAO_UnitTest {
@AfterEach
void resetClientArrayState() {
UniversalVAO.bindVertexArray(0);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
GLSMUtil.setClientState(GL11.GL_NORMAL_ARRAY, false);
}
@@ -48,14 +48,14 @@ public class GLSM_VAO_UnitTest {
final int vaoVertexType = GL11.GL_INT;
final int vaoVertexStride = vaoVertexSize * 4;
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
verifyState(GL13.GL_CLIENT_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "GL_CLIENT_ACTIVE_TEXTURE - Setup");
// Set the vertex attrib to a defined state
int vbo = GL15.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexPointer(defaultVertexSize, defaultVertexType, defaultVertexStride, 0L);
+ GLSMVertexInput.glVertexPointer(defaultVertexSize, defaultVertexType, defaultVertexStride, 0L);
GLSMUtil.setClientState(GL11.GL_NORMAL_ARRAY, true);
verifyState(GL11.GL_NORMAL_ARRAY, true, "GL_NORMAL_ARRAY - Enabled");
@@ -64,7 +64,7 @@ public class GLSM_VAO_UnitTest {
verifyState(GL11.GL_VERTEX_ARRAY_TYPE, defaultVertexType, "GL_VERTEX_ARRAY_TYPE - Setup");
verifyState(GL11.GL_VERTEX_ARRAY_STRIDE, defaultVertexStride, "GL_VERTEX_ARRAY_STRIDE - Setup");
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
// Verify VAO & VBO creation
int vao = UniversalVAO.genVertexArrays();
@@ -73,7 +73,7 @@ public class GLSM_VAO_UnitTest {
UniversalVAO.bindVertexArray(vao);
verifyState(GL30.GL_VERTEX_ARRAY_BINDING, vao, "GL_VERTEX_ARRAY_BINDING - Bound");
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
verifyState(GL15.GL_ARRAY_BUFFER_BINDING, vbo, "GL_ARRAY_BUFFER_BINDING - Bound");
verifyState(GL13.GL_CLIENT_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "GL_CLIENT_ACTIVE_TEXTURE - Preserved");
@@ -86,13 +86,13 @@ public class GLSM_VAO_UnitTest {
GLSMUtil.setClientState(GL11.GL_VERTEX_ARRAY, vaoVertexEnabled);
verifyState(GL11.GL_VERTEX_ARRAY, vaoVertexEnabled, "GL_VERTEX_ARRAY - Enabled");
- GLStateManager.glVertexPointer(vaoVertexSize, vaoVertexType, vaoVertexStride, 0L);
+ GLSMVertexInput.glVertexPointer(vaoVertexSize, vaoVertexType, vaoVertexStride, 0L);
verifyState(GL11.GL_VERTEX_ARRAY_SIZE, vaoVertexSize, "GL_VERTEX_ARRAY_SIZE - Set");
verifyState(GL11.GL_VERTEX_ARRAY_TYPE, vaoVertexType, "GL_VERTEX_ARRAY_TYPE - Set");
verifyState(GL11.GL_VERTEX_ARRAY_STRIDE, vaoVertexStride, "GL_VERTEX_ARRAY_STRIDE - Set");
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
// Check if everything got reset to default
UniversalVAO.bindVertexArray(0);
@@ -116,64 +116,64 @@ public class GLSM_VAO_UnitTest {
UniversalVAO.bindVertexArray(0);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
UniversalVAO.bindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
verifyState(GL30.GL_VERTEX_ARRAY_BINDING, vao, "GL_VERTEX_ARRAY_BINDING - Not affected by glPushAttrib");
verifyState(GL15.GL_ARRAY_BUFFER_BINDING, vbo, "GL_ARRAY_BUFFER_BINDING - Not affected by glPushAttrib");
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
UniversalVAO.bindVertexArray(0);
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glDeleteBuffers(vbo);
UniversalVAO.deleteVertexArrays(vao);
}
@Test
void testGenericAttributeSupersedesFfpConventional() {
withVaoAndVbo(() -> {
- GLStateManager.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
+ GLSMVertexInput.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
Assertions.assertEquals(1, VAOManager.get(0).size, "enabled generic attribute must supersede the FFP conventional array at the same location");
Assertions.assertEquals(1, driverAttrib0Size());
Assertions.assertTrue(VAOManager.get(0).genericPointer, "location must remain generic-sourced");
- GLStateManager.glDisableVertexAttribArray(0);
+ GLSMVertexInput.glDisableVertexAttribArray(0);
});
}
@Test
void testGenericAttributeWinsRegardlessOfOrder() {
withVaoAndVbo(() -> {
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
- GLStateManager.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L);
- GLStateManager.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
+ GLSMVertexInput.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
Assertions.assertEquals(1, VAOManager.get(0).size, "generic attribute set after the FFP conventional array must still win");
Assertions.assertEquals(1, driverAttrib0Size());
Assertions.assertTrue(VAOManager.get(0).genericPointer, "location must remain generic-sourced");
- GLStateManager.glDisableVertexAttribArray(0);
+ GLSMVertexInput.glDisableVertexAttribArray(0);
});
}
@Test
void testFfpConventionalAppliesWithoutGenericAttribute() {
withVaoAndVbo(() -> {
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
Assertions.assertEquals(3, VAOManager.get(0).size, "plain FFP conventional array must apply when no generic attribute occupies the location");
Assertions.assertEquals(3, driverAttrib0Size());
Assertions.assertFalse(VAOManager.get(0).genericPointer, "location must be conventional-sourced");
- GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY);
});
}
@@ -187,13 +187,13 @@ public class GLSM_VAO_UnitTest {
final int vao = UniversalVAO.genVertexArrays();
UniversalVAO.bindVertexArray(vao);
final int vbo = GL15.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
try {
body.run();
} finally {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
UniversalVAO.bindVertexArray(0);
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glDeleteBuffers(vbo);
UniversalVAO.deleteVertexArrays(vao);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java
index f257d9b30..27666bc26 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java
@@ -29,8 +29,8 @@ public class GLSM_ValueStackCow_GLTest {
private static void ensureFixtureTextures() {
if (fixtureTexA == -1) {
- fixtureTexA = GLStateManager.glGenTextures();
- fixtureTexB = GLStateManager.glGenTextures();
+ fixtureTexA = GLSMTextures.glGenTextures();
+ fixtureTexB = GLSMTextures.glGenTextures();
final int bound = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexB);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, bound);
@@ -39,8 +39,8 @@ public class GLSM_ValueStackCow_GLTest {
@AfterAll
static void deleteFixtureTextures() {
- if (fixtureTexA > 0) GLStateManager.glDeleteTextures(fixtureTexA);
- if (fixtureTexB > 0) GLStateManager.glDeleteTextures(fixtureTexB);
+ if (fixtureTexA > 0) GLSMTextures.glDeleteTextures(fixtureTexA);
+ if (fixtureTexB > 0) GLSMTextures.glDeleteTextures(fixtureTexB);
fixtureTexA = fixtureTexB = -1;
}
@@ -59,97 +59,97 @@ public class GLSM_ValueStackCow_GLTest {
};
private static final Runnable[] MUTATIONS = {
- () -> GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f),
- () -> GLStateManager.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO),
- () -> GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO),
- () -> GLStateManager.glBlendEquation(GL14.GL_FUNC_SUBTRACT),
- () -> GLStateManager.glBlendEquationSeparate(GL14.GL_FUNC_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT),
- () -> GLStateManager.glBlendColor(0.5f, 0.6f, 0.7f, 0.8f),
- () -> GLStateManager.glColorMask(false, true, false, true),
- () -> GLStateManager.glClearColor(1.0f, 0.5f, 0.25f, 0.75f),
- () -> GLStateManager.glDrawBuffer(GL11.GL_NONE),
- () -> GLStateManager.glLogicOp(GL11.GL_XOR),
- () -> GLStateManager.glDepthFunc(GL11.GL_ALWAYS),
- () -> GLStateManager.glDepthMask(false),
- () -> GLStateManager.glClearDepth(0.25),
- () -> GLStateManager.glStencilFunc(GL11.GL_NOTEQUAL, 3, 0x0F),
- () -> GLStateManager.glStencilOp(GL11.GL_REPLACE, GL11.GL_INCR, GL11.GL_DECR),
- () -> GLStateManager.glStencilMask(0x0F),
- () -> GLStateManager.glClearStencil(9),
- () -> GLStateManager.glViewport(1, 2, 3, 4),
- () -> GLStateManager.glScissor(1, 2, 3, 4),
- () -> GLStateManager.glDepthRange(0.2, 0.8),
- () -> GLStateManager.glLineWidth(3.0f),
- () -> GLStateManager.glLineStipple(3, (short) 0x00FF),
- () -> GLStateManager.glPointSize(4.0f),
- () -> GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE),
- () -> GLStateManager.glCullFace(GL11.GL_FRONT),
- () -> GLStateManager.glFrontFace(GL11.GL_CW),
- () -> GLStateManager.glPolygonOffset(3.0f, 4.0f),
- () -> GLStateManager.fogColor(0.5f, 0.6f, 0.7f, 0.8f),
- () -> GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5f),
- () -> GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR),
- () -> GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 12.0f),
- () -> GLStateManager.glLighti(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 45),
- () -> GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, buf4(1.0f, 2.0f, 3.0f, 1.0f)),
- () -> GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f),
- () -> GLStateManager.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR),
- () -> GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, buf4(0.5f, 0.6f, 0.7f, 0.8f)),
- () -> GLStateManager.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32.0f),
- () -> GLStateManager.glMateriali(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32),
- () -> GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, buf4(0.1f, 0.2f, 0.3f, 0.4f)),
- () -> GLStateManager.glShadeModel(GL11.GL_FLAT),
- () -> GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR),
- () -> GLStateManager.glMatrixMode(GL11.GL_PROJECTION),
- () -> GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2),
+ () -> GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f),
+ () -> GLSMBlend.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO),
+ () -> GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO),
+ () -> GLSMBlend.glBlendEquation(GL14.GL_FUNC_SUBTRACT),
+ () -> GLSMBlend.glBlendEquationSeparate(GL14.GL_FUNC_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT),
+ () -> GLSMBlend.glBlendColor(0.5f, 0.6f, 0.7f, 0.8f),
+ () -> GLSMBlend.glColorMask(false, true, false, true),
+ () -> GLSMBlend.glClearColor(1.0f, 0.5f, 0.25f, 0.75f),
+ () -> GLSMFramebuffer.glDrawBuffer(GL11.GL_NONE),
+ () -> GLSMBlend.glLogicOp(GL11.GL_XOR),
+ () -> GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS),
+ () -> GLSMDepthStencilAlpha.glDepthMask(false),
+ () -> GLSMDepthStencilAlpha.glClearDepth(0.25),
+ () -> GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_NOTEQUAL, 3, 0x0F),
+ () -> GLSMDepthStencilAlpha.glStencilOp(GL11.GL_REPLACE, GL11.GL_INCR, GL11.GL_DECR),
+ () -> GLSMDepthStencilAlpha.glStencilMask(0x0F),
+ () -> GLSMDepthStencilAlpha.glClearStencil(9),
+ () -> GLSMRasterizer.glViewport(1, 2, 3, 4),
+ () -> GLSMRasterizer.glScissor(1, 2, 3, 4),
+ () -> GLSMDepthStencilAlpha.glDepthRange(0.2, 0.8),
+ () -> GLSMRasterizer.glLineWidth(3.0f),
+ () -> GLSMRasterizer.glLineStipple(3, (short) 0x00FF),
+ () -> GLSMRasterizer.glPointSize(4.0f),
+ () -> GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE),
+ () -> GLSMRasterizer.glCullFace(GL11.GL_FRONT),
+ () -> GLSMRasterizer.glFrontFace(GL11.GL_CW),
+ () -> GLSMRasterizer.glPolygonOffset(3.0f, 4.0f),
+ () -> GLSMFog.fogColor(0.5f, 0.6f, 0.7f, 0.8f),
+ () -> GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5f),
+ () -> GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR),
+ () -> GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 12.0f),
+ () -> GLSMLighting.glLighti(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 45),
+ () -> GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, buf4(1.0f, 2.0f, 3.0f, 1.0f)),
+ () -> GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f),
+ () -> GLSMLighting.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR),
+ () -> GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, buf4(0.5f, 0.6f, 0.7f, 0.8f)),
+ () -> GLSMLighting.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32.0f),
+ () -> GLSMLighting.glMateriali(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32),
+ () -> GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, buf4(0.1f, 0.2f, 0.3f, 0.4f)),
+ () -> GLSMRasterizer.glShadeModel(GL11.GL_FLAT),
+ () -> GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR),
+ () -> GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION),
+ () -> GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2),
() -> {
ensureFixtureTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
},
- () -> GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL),
- () -> GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, buf4(0.1f, 0.2f, 0.3f, 0.4f)),
- () -> GLStateManager.glSecondaryColor3ub((byte) 255, (byte) 128, (byte) 64),
+ () -> GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL),
+ () -> GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, buf4(0.1f, 0.2f, 0.3f, 0.4f)),
+ () -> GLSMCurrentAttribs.glSecondaryColor3ub((byte) 255, (byte) 128, (byte) 64),
() -> {
- GLStateManager.disableBlend();
- GLStateManager.enableBlend();
+ GLSMBlend.disableBlend();
+ GLSMBlend.enableBlend();
},
() -> {
- GLStateManager.disableAlphaTest();
- GLStateManager.enableAlphaTest();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.enableAlphaTest();
},
() -> {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
},
() -> {
assumeTrue(GLStateManager.capabilities.GL_ARB_direct_state_access, "test requires GL_ARB_direct_state_access");
ensureFixtureTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
new DSAARB().bindTextureToUnit(1, fixtureTexB);
}
};
@Test
void everyMutationSiteReachesTheSaveHook() {
- final int entryDepth = GLStateManager.getAttribDepth();
+ final int entryDepth = GLSMAttribStack.getAttribDepth();
try {
for (int i = 0; i < MUTATIONS.length; i++) {
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS));
try {
- final long before = GLStateManager.attribSlotsSaved;
+ final long before = GLSMAttribStack.attribSlotsSaved;
MUTATIONS[i].run();
- assertTrue(GLStateManager.attribSlotsSaved - before >= 1, NAMES[i] + ": mutation site did not reach the save hook");
+ assertTrue(GLSMAttribStack.attribSlotsSaved - before >= 1, NAMES[i] + ": mutation site did not reach the save hook");
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
}
} finally {
- GLStateManager.popStateTo(entryDepth);
+ GLSMAttribStack.popStateTo(entryDepth);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java
index 203b747e0..72884530a 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java
@@ -18,16 +18,16 @@ public class GLSM_WorkerContextStacks_GLTest {
void enableBitBracketRestoresOnWorkerContext() {
GLStateManager.enterWorkerContext();
try {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT));
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT));
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMAttribStack.popStateTo(d);
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE), "cull face restored on the worker context");
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE), "cull face restored on the worker context");
verifyIsEnabled(GL11.GL_CULL_FACE, false, "driver cull face restored on the worker context");
} finally {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
GLStateManager.exitWorkerContext();
}
}
@@ -36,44 +36,44 @@ public class GLSM_WorkerContextStacks_GLTest {
void colorBufferBitBracketRestoresOnWorkerContext() {
GLStateManager.enterWorkerContext();
try {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_COLOR_BUFFER_BIT));
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_COLOR_BUFFER_BIT));
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMAttribStack.popStateTo(d);
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_BLEND), "blend enable restored on the worker context");
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_BLEND), "blend enable restored on the worker context");
verifyIsEnabled(GL11.GL_BLEND, false, "driver blend enable restored on the worker context");
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "blend src rgb restored on the worker context");
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "blend src rgb restored on the worker context");
assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb restored on the worker context");
} finally {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
GLStateManager.exitWorkerContext();
}
}
@Test
void workerResetLeavesPrimaryContextUntouched() {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- final int primaryDepthBefore = GLStateManager.getAttribDepth();
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ final int primaryDepthBefore = GLSMAttribStack.getAttribDepth();
GLStateManager.enterWorkerContext();
try {
- GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT));
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT));
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
GLStateManager.reset();
- assertEquals(0, GLStateManager.getAttribDepth(), "worker attrib depth drained by its own reset");
+ assertEquals(0, GLSMAttribStack.getAttribDepth(), "worker attrib depth drained by its own reset");
} finally {
GLStateManager.exitWorkerContext();
}
- assertEquals(primaryDepthBefore, GLStateManager.getAttribDepth(), "primary context depth untouched by the worker reset");
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE), "primary context cull face untouched by the worker reset");
+ assertEquals(primaryDepthBefore, GLSMAttribStack.getAttribDepth(), "primary context depth untouched by the worker reset");
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE), "primary context cull face untouched by the worker reset");
}
@Test
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java
index 31b714590..0c62de5da 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java
@@ -49,12 +49,12 @@ class ImmediateModeThreadIsolationTest {
final TestThreads.Body spam = () -> {
start.await();
while (!stop.get()) {
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glVertex3f(0, 0, 0);
- GLStateManager.glVertex3f(1, 0, 0);
- GLStateManager.glVertex3f(1, 1, 0);
- GLStateManager.glVertex3f(0, 1, 0);
- GLStateManager.glEnd();
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glVertex3f(0, 0, 0);
+ GLSMDraws.glVertex3f(1, 0, 0);
+ GLSMDraws.glVertex3f(1, 1, 0);
+ GLSMDraws.glVertex3f(0, 1, 0);
+ GLSMDraws.glEnd();
}
};
final TestThreads.Worker t1 = TestThreads.start("iso-spam-1", spam);
@@ -64,15 +64,15 @@ class ImmediateModeThreadIsolationTest {
final List lists = new ArrayList<>();
try {
for (int i = 0; i < 50; i++) {
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glVertex3f(0, 0, 0);
- GLStateManager.glVertex3f(1, 0, 0);
- GLStateManager.glVertex3f(1, 1, 0);
- GLStateManager.glVertex3f(0, 1, 0);
- GLStateManager.glEnd();
- GLStateManager.glEndList();
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glVertex3f(0, 0, 0);
+ GLSMDraws.glVertex3f(1, 0, 0);
+ GLSMDraws.glVertex3f(1, 1, 0);
+ GLSMDraws.glVertex3f(0, 1, 0);
+ GLSMDraws.glEnd();
+ GLSMDraws.glEndList();
lists.add(list);
}
} finally {
@@ -85,7 +85,7 @@ class ImmediateModeThreadIsolationTest {
final CompiledDisplayList compiled = DisplayListManager.getDisplayList(list);
assertNotNull(compiled, "list " + list + " should be compiled");
assertEquals(1, compiled.getCommandCounts().getOrDefault(GLCommand.DRAW_RANGE, 0), "list " + list + " should contain exactly the main thread's draw");
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java
index 9f78c17c8..06ed3fde4 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java
@@ -29,43 +29,43 @@ class InstancedQuadDrawGLTest {
@BeforeEach
void setup() {
program = GlTestSupport.program(VS, FS);
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
final FloatBuffer verts = BufferUtils.createFloatBuffer(8);
verts.put(new float[] {0, 0, 1, 0, 1, 1, 0, 1}).flip();
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0L);
- GLStateManager.glEnableVertexAttribArray(0);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
final IntBuffer idx = BufferUtils.createIntBuffer(4);
idx.put(new int[] {0, 1, 2, 3}).flip();
- ebo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, idx, GL15.GL_STATIC_DRAW);
+ ebo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, idx, GL15.GL_STATIC_DRAW);
}
@AfterEach
void cleanup() {
- GLStateManager.glUseProgram(0);
- if (program != 0) GLStateManager.glDeleteProgram(program);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (ebo != 0) GLStateManager.glDeleteBuffers(ebo);
+ GLSMPrograms.glUseProgram(0);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (ebo != 0) GLSMBuffers.glDeleteBuffers(ebo);
}
static Stream draws() {
return Stream.of(
- draw("GL_QUADS instanced array draw must be emulated, not rejected", ebo -> GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, 3)),
+ draw("GL_QUADS instanced array draw must be emulated, not rejected", ebo -> GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, 3)),
draw("non-quad instanced array draw passes through cleanly", ebo -> {
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
- GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 3);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 3);
}),
draw("GL_QUADS instanced element draw must be emulated, not rejected", ebo -> {
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElementsInstanced(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_INT, 0L, 3);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElementsInstanced(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_INT, 0L, 3);
}));
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
index d454e7329..2874aaf1a 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
@@ -34,24 +34,24 @@ class VertexAttribDefaultBridgeTest {
@Test
void testGlColor4fSetsVertexAttrib() {
- GLStateManager.glColor4f(0.5f, 0.25f, 0.75f, 0.8f);
- GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
+ GLSMCurrentAttribs.glColor4f(0.5f, 0.25f, 0.75f, 0.8f);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
assertAttrib(COLOR_ATTRIB, "color", 0.5f, 0.25f, 0.75f, 0.8f);
}
@Test
void testGlNormal3fSetsVertexAttrib() {
- GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f);
- GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
assertAttrib(NORMAL_ATTRIB, "normal", 0.0f, 1.0f, 0.0f);
}
@Test
void testSetLightmapTextureCoordsOnUnit1SetsVertexAttrib() {
- GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, 240.0f, 128.0f);
- GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
+ GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, 240.0f, 128.0f);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
assertAttrib(SECONDARY_UV_ATTRIB, "lightmap", 240.0f, 128.0f, 0.0f, 1.0f);
}
@@ -59,37 +59,37 @@ class VertexAttribDefaultBridgeTest {
@Test
void testGlTexCoord2fSetsVertexAttrib() {
// glTexCoord2f outside recording → sets default vertex attrib 2 (PRIMARY_UV)
- GLStateManager.glTexCoord2f(0.5f, 0.75f);
- GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
+ GLSMCurrentAttribs.glTexCoord2f(0.5f, 0.75f);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
assertAttrib(PRIMARY_UV_ATTRIB, "texcoord", 0.5f, 0.75f);
}
@Test
void testCacheDedup_SameColorTwice_AttribStillCorrect() {
- GLStateManager.glColor4f(0.3f, 0.6f, 0.9f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(0.3f, 0.6f, 0.9f, 1.0f);
// Second call is a cache hit — changeColor not called.
// Vertex attrib should still hold the correct value from the first call.
- GLStateManager.glColor4f(0.3f, 0.6f, 0.9f, 1.0f);
- GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
+ GLSMCurrentAttribs.glColor4f(0.3f, 0.6f, 0.9f, 1.0f);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
assertAttrib(COLOR_ATTRIB, "color after dedup", 0.3f, 0.6f, 0.9f, 1.0f);
}
@Test
void testCompileMode_DoesNotSetVertexAttrib() {
- GLStateManager.glColor4f(0.1f, 0.2f, 0.3f, 1.0f);
- GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
+ GLSMCurrentAttribs.glColor4f(0.1f, 0.2f, 0.3f, 1.0f);
+ GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false);
- int listId = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(listId, GL11.GL_COMPILE);
+ int listId = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(listId, GL11.GL_COMPILE);
// Color during COMPILE should NOT reach changeColor (early return)
- GLStateManager.glColor4f(0.9f, 0.8f, 0.7f, 0.6f);
+ GLSMCurrentAttribs.glColor4f(0.9f, 0.8f, 0.7f, 0.6f);
assertAttrib(COLOR_ATTRIB, "color unchanged during COMPILE", 0.1f, 0.2f, 0.3f, 1.0f);
- GLStateManager.glEndList();
- GLStateManager.glDeleteLists(listId, 1);
+ GLSMDraws.glEndList();
+ GLSMDraws.glDeleteLists(listId, 1);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java
index 3c935ab52..1b84e797d 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm.dsa;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.Test;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
@@ -19,11 +19,11 @@ public class DSAUnsupportedBindingTest {
@Test
void nonTwoDParameterEditsRestoreTheTargetBinding() {
- final int a = GLStateManager.glGenTextures();
+ final int a = GLSMTextures.glGenTextures();
final int c = GL11.glGenTextures();
final int d = GL11.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, a);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, a);
for (int tex : new int[] { c, d }) {
GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, tex);
for (int i = 0; i < 6; i++) {
@@ -39,39 +39,39 @@ public class DSAUnsupportedBindingTest {
GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, 0);
GL11.glDeleteTextures(c);
GL11.glDeleteTextures(d);
- GLStateManager.glDeleteTextures(a);
+ GLSMTextures.glDeleteTextures(a);
}
}
@Test
void twoDParameterEditRestoresTheCachedBinding() {
- final int a = GLStateManager.glGenTextures();
- final int b = GLStateManager.glGenTextures();
+ final int a = GLSMTextures.glGenTextures();
+ final int b = GLSMTextures.glGenTextures();
try {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, a);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, a);
dsa.texParameteri(b, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- assertEquals(a, GLStateManager.getBoundTextureForServerState());
+ assertEquals(a, GLSMTextures.getBoundTextureForServerState());
assertEquals(a, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D));
GL11.glBindTexture(GL11.GL_TEXTURE_2D, b);
assertEquals(GL11.GL_NEAREST, GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER));
GL11.glBindTexture(GL11.GL_TEXTURE_2D, a);
} finally {
- GLStateManager.glDeleteTextures(a);
- GLStateManager.glDeleteTextures(b);
+ GLSMTextures.glDeleteTextures(a);
+ GLSMTextures.glDeleteTextures(b);
}
}
@Test
void twoDEditWithANonTwoDTextureBoundRestoresTheDriverTwoDBinding() {
- final int y = GLStateManager.glGenTextures();
- final int t = GLStateManager.glGenTextures();
+ final int y = GLSMTextures.glGenTextures();
+ final int t = GLSMTextures.glGenTextures();
final int x = GL11.glGenTextures();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, y);
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, x);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, y);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, x);
drainErrors();
dsa.texParameteri(t, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
@@ -79,17 +79,17 @@ public class DSAUnsupportedBindingTest {
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
assertEquals(y, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D));
assertEquals(x, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D));
- assertEquals(y, GLStateManager.getBoundTextureForServerState());
+ assertEquals(y, GLSMTextures.getBoundTextureForServerState());
GL11.glBindTexture(GL11.GL_TEXTURE_2D, t);
assertEquals(GL11.GL_NEAREST, GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER));
GL11.glBindTexture(GL11.GL_TEXTURE_2D, y);
} finally {
GL11.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(y);
- GLStateManager.glDeleteTextures(t);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(y);
+ GLSMTextures.glDeleteTextures(t);
GL11.glDeleteTextures(x);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java
index da7ff82af..ca98e8091 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCompatTest;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.TexEnvState;
import org.junit.jupiter.api.AfterEach;
@@ -42,14 +45,14 @@ class FFPCombineShaderTest {
// Reset texture units to defaults (unbind so a later test does not see a stale binding)
for (int i = 3; i >= 0; i--) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.getTextures().getTexEnvState(i).reset();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.getTextures().getTexEnvState(i).reset();
if (i > 0) {
- GLStateManager.getTextures().getTextureUnitStates(i).disable();
+ GLSMTextures.getTextures().getTextureUnitStates(i).disable();
}
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
for (int t : texturesToDelete) GL11.glDeleteTextures(t);
texturesToDelete.clear();
}
@@ -57,23 +60,23 @@ class FFPCombineShaderTest {
private int bindUnitTexture() {
final int tex = GL11.glGenTextures();
texturesToDelete.add(tex);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
return tex;
}
@Test
void testTexEnvStateTracking() {
// Unit 0: COMBINE mode, SUBTRACT RGB, REPLACE alpha
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL13.GL_SUBTRACT);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_ONE_MINUS_SRC_COLOR);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL13.GL_SUBTRACT);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_ONE_MINUS_SRC_COLOR);
- TexEnvState env0 = GLStateManager.getTextures().getTexEnvState(0);
+ TexEnvState env0 = GLSMTextures.getTextures().getTexEnvState(0);
assertEquals(GL13.GL_COMBINE, env0.mode);
assertEquals(GL13.GL_SUBTRACT, env0.combineRgb);
assertEquals(GL11.GL_REPLACE, env0.combineAlpha);
@@ -83,11 +86,11 @@ class FFPCombineShaderTest {
assertEquals(GL11.GL_ONE_MINUS_SRC_COLOR, env0.operandRgb[1]);
// Unit 2: independent state
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_ADD);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_ADD);
- TexEnvState env2 = GLStateManager.getTextures().getTexEnvState(2);
+ TexEnvState env2 = GLSMTextures.getTextures().getTexEnvState(2);
assertEquals(GL13.GL_COMBINE, env2.mode);
assertEquals(GL11.GL_ADD, env2.combineRgb);
@@ -179,22 +182,22 @@ class FFPCombineShaderTest {
enableCombineUnit(GL13.GL_TEXTURE0, glFunc, GL11.GL_REPLACE);
// Set up appropriate sources
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);
if (numArgs >= 2) {
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_ALPHA, GL13.GL_PREVIOUS);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_ALPHA, GL13.GL_PREVIOUS);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA);
}
if (numArgs >= 3) {
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_RGB, GL13.GL_PREVIOUS);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_ALPHA, GL13.GL_PREVIOUS);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_RGB, GL13.GL_PREVIOUS);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_ALPHA, GL13.GL_PREVIOUS);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA);
}
FragmentKey fk = FragmentKey.fromState();
@@ -231,7 +234,7 @@ class FFPCombineShaderTest {
void testMultiTexCoordRoutesToShaderManager() {
// Not in immediate mode or display list recording, so should go to ShaderManager.currentTexCoord
GLStateManager.ctx().ffp.setTexCoord(0.0f, 0.0f, 0.0f, 1.0f); // reset
- GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.5f, 0.75f);
+ GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.5f, 0.75f);
var texCoord = ShaderManager.getCurrentTexCoord();
assertEquals(0.5f, texCoord.x, 1e-6f, "s coordinate should be 0.5");
@@ -241,7 +244,7 @@ class FFPCombineShaderTest {
@Test
void testMultiTexCoord2dDelegatesToFloat() {
GLStateManager.ctx().ffp.setTexCoord(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glMultiTexCoord2d(GL13.GL_TEXTURE0, 0.5, 0.75);
+ GLSMCurrentAttribs.glMultiTexCoord2d(GL13.GL_TEXTURE0, 0.5, 0.75);
var texCoord = ShaderManager.getCurrentTexCoord();
assertEquals(0.5f, texCoord.x, 1e-6f, "double 0.5 should arrive as float 0.5");
@@ -256,43 +259,43 @@ class FFPCombineShaderTest {
* Unit 3: MODULATE (simple)
*/
private void enableCombineUnit(int unit, int rgbFunc, int alphaFunc) {
- GLStateManager.glActiveTexture(unit);
- GLStateManager.enableTexture();
+ GLSMTextures.glActiveTexture(unit);
+ GLSMTextures.enableTexture();
bindUnitTexture();
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, rgbFunc);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, alphaFunc);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, rgbFunc);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, alphaFunc);
}
private void setupXaeroState() {
// Unit 0: COMBINE / SUBTRACT
enableCombineUnit(GL13.GL_TEXTURE0, GL13.GL_SUBTRACT, GL11.GL_REPLACE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);
// Unit 1: disabled (skip — default is disabled)
// Unit 2: COMBINE / ADD
enableCombineUnit(GL13.GL_TEXTURE2, GL11.GL_ADD, GL11.GL_REPLACE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PREVIOUS);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PREVIOUS);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA);
// Unit 3: simple MODULATE
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- GLStateManager.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ GLSMTextures.enableTexture();
bindUnitTexture();
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
// Restore active unit
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private int compileShader(String source, int type) {
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java
index 9a1cfaf95..f05f62e86 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.lwjgl.opengl.GL11;
@@ -21,11 +21,11 @@ class FFPUnboundTextureUnitTest {
@AfterEach
void cleanup() {
for (int i = 3; i >= 0; i--) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- if (i > 0) GLStateManager.getTextures().getTextureUnitStates(i).disable();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ if (i > 0) GLSMTextures.getTextures().getTextureUnitStates(i).disable();
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
for (int t : texturesToDelete) GL11.glDeleteTextures(t);
texturesToDelete.clear();
}
@@ -33,19 +33,19 @@ class FFPUnboundTextureUnitTest {
private void bindUnitTexture() {
final int tex = GL11.glGenTextures();
texturesToDelete.add(tex);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
}
@Test
void enabledUnitWithoutTextureIsExcluded() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
bindUnitTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.enableTexture(); // enabled, nothing bound
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- GLStateManager.enableTexture(); // enabled, nothing bound
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.enableTexture(); // enabled, nothing bound
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ GLSMTextures.enableTexture(); // enabled, nothing bound
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
final FragmentKey fk = FragmentKey.fromState();
assertEquals(1, fk.nrEnabledUnits(), "units 2/3 have no texture bound -> excluded -> only unit 0");
@@ -55,13 +55,13 @@ class FFPUnboundTextureUnitTest {
@Test
void enabledUnitsWithTextureAreCounted() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
bindUnitTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.enableTexture();
bindUnitTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
final FragmentKey fk = FragmentKey.fromState();
assertTrue(fk.unitEnabled(0));
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java
index e2617b805..9890f6636 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.junit.jupiter.api.Test;
import org.lwjgl.BufferUtils;
@@ -19,26 +23,26 @@ class FFPUniformValuesTest {
@Test
void uploadedValuesMatchState() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f);
- GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1.0f);
- GLStateManager.enableFog();
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
- GLStateManager.glFogf(GL11.GL_FOG_START, 10.0f);
- GLStateManager.glFogf(GL11.GL_FOG_END, 20.0f);
+ GLSMFog.enableFog();
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 10.0f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 20.0f);
final FloatBuffer fogColor = BufferUtils.createFloatBuffer(4);
fogColor.put(0.1f).put(0.2f).put(0.3f).put(0.4f).flip();
- GLStateManager.glFog(GL11.GL_FOG_COLOR, fogColor);
+ GLSMFog.glFog(GL11.GL_FOG_COLOR, fogColor);
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.35f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.35f);
final VertexKey vk = VertexKey.fromState(false, false, false, false, 0);
final FragmentKey fk = FragmentKey.fromState();
@@ -77,14 +81,14 @@ class FFPUniformValuesTest {
program.destroy();
uniforms.destroy();
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
- GLStateManager.disableFog();
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
+ GLSMFog.disableFog();
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java
index e1b377956..1da47dc8f 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java
@@ -2,7 +2,18 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.joml.Vector3f;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -43,81 +54,81 @@ class FFPVertexLightingGLTest {
@BeforeEach
void setUpState() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glViewport(0, 0, 800, 600);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.disableBlend();
- GLStateManager.disableTexture();
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMBlend.disableBlend();
+ GLSMTextures.disableTexture();
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
standardItemLighting();
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 0.0f);
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 0.0f);
}
@AfterEach
void cleanup() {
- GLStateManager.glDisable(GL11.GL_NORMALIZE);
- GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT1);
- GLStateManager.glDisable(GL11.GL_LIGHT2);
- GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL);
+ GLSMEnable.glDisable(GL11.GL_NORMALIZE);
+ GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT1);
+ GLSMEnable.glDisable(GL11.GL_LIGHT2);
+ GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL);
final ShaderManager sm = ShaderManager.getInstance();
if (sm.isActive()) sm.deactivate();
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
if (vbo != 0) {
- GLStateManager.glDeleteBuffers(vbo);
+ GLSMBuffers.glDeleteBuffers(vbo);
vbo = 0;
}
if (vao != 0) {
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
vao = 0;
}
}
private static void standardItemLighting() {
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_LIGHT0);
- GLStateManager.glEnable(GL11.GL_LIGHT1);
- GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f));
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
+ GLSMEnable.glEnable(GL11.GL_LIGHT1);
+ GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f));
light(GL11.GL_LIGHT0, 0.2f, 1.0f, -0.7f);
light(GL11.GL_LIGHT1, -0.2f, 1.0f, 0.7f);
}
private static void light(int light, float x, float y, float z) {
- GLStateManager.glLight(light, GL11.GL_POSITION, floats(x, y, z, 0.0f));
- GLStateManager.glLight(light, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f));
- GLStateManager.glLight(light, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glLight(light, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glLight(light, GL11.GL_POSITION, floats(x, y, z, 0.0f));
+ GLSMLighting.glLight(light, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f));
+ GLSMLighting.glLight(light, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glLight(light, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
}
private static String gateState() {
- final var material = GLStateManager.getFrontMaterial();
- return "lighting=" + GLStateManager.getLightingState().isEnabled()
- + " colorMaterial=" + GLStateManager.getColorMaterial().isEnabled()
- + " cmParam=0x" + Integer.toHexString(GLStateManager.getColorMaterialParameter().getValue())
+ final var material = GLSMLighting.getFrontMaterial();
+ return "lighting=" + GLSMLighting.getLightingState().isEnabled()
+ + " colorMaterial=" + GLSMLighting.getColorMaterial().isEnabled()
+ + " cmParam=0x" + Integer.toHexString(GLSMLighting.getColorMaterialParameter().getValue())
+ " emission=" + material.emission
+ " specular=" + material.specular
+ " shininess=" + material.shininess
- + " lmAmbient=" + GLStateManager.getLightModel().ambient
- + " light0=" + GLStateManager.getLightStates()[0].isEnabled()
- + " light1=" + GLStateManager.getLightStates()[1].isEnabled();
+ + " lmAmbient=" + GLSMLighting.getLightModel().ambient
+ + " light0=" + GLSMLighting.getLightStates()[0].isEnabled()
+ + " light1=" + GLSMLighting.getLightStates()[1].isEnabled();
}
private void buildTriangle() {
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
final ByteBuffer data = BufferUtils.createByteBuffer(3 * STRIDE);
putVertex(data, -0.9f, -0.9f);
@@ -125,13 +136,13 @@ class FFPVertexLightingGLTest {
putVertex(data, 0.0f, 0.9f);
data.flip();
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(POSITION_LOC);
- GLStateManager.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, STRIDE, 0L);
- GLStateManager.glEnableVertexAttribArray(COLOR_LOC);
- GLStateManager.glVertexAttribPointer(COLOR_LOC, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 12L);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glEnableVertexAttribArray(POSITION_LOC);
+ GLSMVertexInput.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, STRIDE, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(COLOR_LOC);
+ GLSMVertexInput.glVertexAttribPointer(COLOR_LOC, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 12L);
VAOManager.setCurrentVertexFlags(COLOR_BIT);
}
@@ -148,9 +159,9 @@ class FFPVertexLightingGLTest {
ShaderManager.enable();
sm.activate();
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "FFP draw must not raise a GL error");
final int[] pixel = FfpFixture.readPixel(400, 200);
@@ -177,24 +188,24 @@ class FFPVertexLightingGLTest {
@ParameterizedTest(name = "{0}")
@MethodSource("normals")
void normalMatchesGeneratedShader(String name, float x, float y, float z, float factorCeiling) {
- GLStateManager.glNormal3f(x, y, z);
+ GLSMCurrentAttribs.glNormal3f(x, y, z);
assertSolverMatchesShader(name);
assertTrue(factor.x < factorCeiling, name + ": factor must stay below " + factorCeiling + ", got " + factor.x);
}
@Test
void rescaleNormalMatchesGeneratedShader() {
- GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL);
- GLStateManager.glScalef(1.0f, 2.0f, 1.0f);
- GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f);
+ GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL);
+ GLSMMatrices.glScalef(1.0f, 2.0f, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f);
assertSolverMatchesShader("rescale normal");
}
@Test
void normalizeMatchesGeneratedShader() {
- GLStateManager.glEnable(GL11.GL_NORMALIZE);
- GLStateManager.glScalef(1.0f, 2.0f, 1.0f);
- GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f);
+ GLSMEnable.glEnable(GL11.GL_NORMALIZE);
+ GLSMMatrices.glScalef(1.0f, 2.0f, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f);
assertSolverMatchesShader("normalize");
assertTrue(factor.x > 1.2f, "normalize restores the unit normal, which must pick up more diffuse than rescale's 0.5-long one, got " + factor.x);
}
@@ -202,14 +213,14 @@ class FFPVertexLightingGLTest {
static Stream unrepresentableStates() {
return Stream.of(
unrepresentable("emission is additive, so the lit colour is not vertexColor * factor",
- () -> GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.1f, 0.1f, 0.1f, 1.0f))),
+ () -> GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.1f, 0.1f, 0.1f, 1.0f))),
unrepresentable("specular is additive, so the lit colour is not vertexColor * factor", () -> {
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f));
- GLStateManager.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 16.0f);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f));
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f));
+ GLSMLighting.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 16.0f);
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f));
}),
unrepresentable("only AMBIENT_AND_DIFFUSE makes the lit colour scale with the vertex colour",
- () -> GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION)));
+ () -> GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION)));
}
private static Arguments unrepresentable(String reason, Runnable state) {
@@ -230,7 +241,7 @@ class FFPVertexLightingGLTest {
final Vector3f twoLights = new Vector3f(factor);
light(GL11.GL_LIGHT2, 0.0f, 0.0f, 1.0f);
- GLStateManager.glEnable(GL11.GL_LIGHT2);
+ GLSMEnable.glEnable(GL11.GL_LIGHT2);
assertTrue(FFPVertexLighting.modulatesVertexColor(factor), FFPVertexLightingGLTest::gateState);
assertEquals(twoLights, factor, "VertexShaderGenerator emits only GL_LIGHT0/GL_LIGHT1, so text must not see GL_LIGHT2 either");
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java
index dcab77a52..e1553bc3f 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java
@@ -1,6 +1,13 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
@@ -32,28 +39,28 @@ class FfpUniformBlockDedupTest {
}
private static void resetState() {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glLineWidth(1.0f);
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glTexCoord2f(0.0f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMRasterizer.glLineWidth(1.0f);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glTexCoord2f(0.0f, 0.0f);
GLStateManager.ctx().lastBrightnessX = 0.0f;
GLStateManager.ctx().lastBrightnessY = 0.0f;
- GLStateManager.glFog(GL11.GL_FOG_COLOR, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 1.0f);
- GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.0f, 0.0f, 0.0f, 0.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(1.0f, 1.0f, 1.0f, 1.0f));
- GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 0.0f);
- GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1.0f, 0.0f, 0.0f, 0.0f));
- GLStateManager.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 0.0, 0.0, 0.0));
- GLStateManager.glLineStipple(1, (short) 0xFFFF);
- GLStateManager.glViewport(0, 0, 854, 480);
+ GLSMFog.glFog(GL11.GL_FOG_COLOR, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 1.0f);
+ GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.0f, 0.0f, 0.0f, 0.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(1.0f, 1.0f, 1.0f, 1.0f));
+ GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 0.0f);
+ GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1.0f, 0.0f, 0.0f, 0.0f));
+ GLSMRasterizer.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 0.0, 0.0, 0.0));
+ GLSMRasterizer.glLineStipple(1, (short) 0xFFFF);
+ GLSMRasterizer.glViewport(0, 0, 854, 480);
}
@Test
@@ -65,13 +72,13 @@ class FfpUniformBlockDedupTest {
assertEquals(1, uniforms.blockWrites, "first upload always writes");
final int firstOffset = boundRangeStart();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
uniforms.upload(GLStateManager.ctx());
assertEquals(1, uniforms.blockWrites, "a dirty generation with unchanged bytes must not write");
assertEquals(1, uniforms.blockSkips, "and must be counted as a skip");
assertEquals(firstOffset, boundRangeStart(), "the skipped write must not advance the ring or rebind");
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
uniforms.upload(GLStateManager.ctx());
assertEquals(2, uniforms.blockWrites, "a changed matrix must write");
assertEquals(1, uniforms.blockSkips, "a write is not a skip");
@@ -123,33 +130,33 @@ class FfpUniformBlockDedupTest {
@TestFactory
List everyStagingCategoryForcesAWrite() {
final List tests = new ArrayList<>();
- addCategory(tests, "modelViewMatrix", () -> GLStateManager.glTranslatef(0.0f, 3.0f, 0.0f));
+ addCategory(tests, "modelViewMatrix", () -> GLSMMatrices.glTranslatef(0.0f, 3.0f, 0.0f));
addCategory(tests, "projectionMatrix", () -> {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glTranslatef(0.0f, 0.0f, 5.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glTranslatef(0.0f, 0.0f, 5.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
});
- addCategory(tests, "normalMatrix", () -> GLStateManager.glRotatef(35.0f, 0.0f, 1.0f, 0.0f));
+ addCategory(tests, "normalMatrix", () -> GLSMMatrices.glRotatef(35.0f, 0.0f, 1.0f, 0.0f));
addCategory(tests, "textureMatrix", () -> {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(0.5f, 0.25f, 0.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(0.5f, 0.25f, 0.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
});
- addCategory(tests, "lighting", () -> GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3f, 0.6f, 0.9f, 1.0f)));
- addCategory(tests, "materialShininess", () -> GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 42.0f));
- addCategory(tests, "currentColor", () -> GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1.0f));
- addCategory(tests, "currentNormal", () -> GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f));
- addCategory(tests, "currentTexCoord", () -> GLStateManager.glTexCoord2f(0.125f, 0.375f));
+ addCategory(tests, "lighting", () -> GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3f, 0.6f, 0.9f, 1.0f)));
+ addCategory(tests, "materialShininess", () -> GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 42.0f));
+ addCategory(tests, "currentColor", () -> GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1.0f));
+ addCategory(tests, "currentNormal", () -> GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f));
+ addCategory(tests, "currentTexCoord", () -> GLSMCurrentAttribs.glTexCoord2f(0.125f, 0.375f));
addCategory(tests, "lightmapCoord", () -> GLStateManager.ctx().lastBrightnessX = 96.0f);
- addCategory(tests, "texGenPlane", () -> GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0.5f, 0.0f, 0.0f, 0.25f)));
- addCategory(tests, "clipPlane", () -> GLStateManager.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 1.0, 0.0, 7.0)));
- addCategory(tests, "alphaRef", () -> GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.35f));
- addCategory(tests, "fogColor", () -> GLStateManager.glFog(GL11.GL_FOG_COLOR, floats(0.1f, 0.2f, 0.3f, 0.4f)));
- addCategory(tests, "fogDensity", () -> GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.75f));
- addCategory(tests, "texEnvColor", () -> GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.9f, 0.8f, 0.7f, 0.6f)));
- addCategory(tests, "lineWidth", () -> GLStateManager.glLineWidth(3.0f));
- addCategory(tests, "lineStipple", () -> GLStateManager.glLineStipple(2, (short) 0x00FF));
- addCategory(tests, "viewport", () -> GLStateManager.glViewport(0, 0, 640, 480));
+ addCategory(tests, "texGenPlane", () -> GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0.5f, 0.0f, 0.0f, 0.25f)));
+ addCategory(tests, "clipPlane", () -> GLSMRasterizer.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 1.0, 0.0, 7.0)));
+ addCategory(tests, "alphaRef", () -> GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.35f));
+ addCategory(tests, "fogColor", () -> GLSMFog.glFog(GL11.GL_FOG_COLOR, floats(0.1f, 0.2f, 0.3f, 0.4f)));
+ addCategory(tests, "fogDensity", () -> GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.75f));
+ addCategory(tests, "texEnvColor", () -> GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.9f, 0.8f, 0.7f, 0.6f)));
+ addCategory(tests, "lineWidth", () -> GLSMRasterizer.glLineWidth(3.0f));
+ addCategory(tests, "lineStipple", () -> GLSMRasterizer.glLineStipple(2, (short) 0x00FF));
+ addCategory(tests, "viewport", () -> GLSMRasterizer.glViewport(0, 0, 640, 480));
return tests;
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java
index fc08cbc49..4f3f6626d 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java
@@ -1,6 +1,16 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -90,9 +100,9 @@ class InstancedFFPDrawGLTest {
CubeParityFixture.disableDirectionalLight();
CubeParityFixture.deleteResources();
ParticleParityFixture.deleteResources();
- if (templateVbo != 0) { GLStateManager.glDeleteBuffers(templateVbo); templateVbo = 0; }
- if (instanceVbo != 0) { GLStateManager.glDeleteBuffers(instanceVbo); instanceVbo = 0; }
- if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; }
+ if (templateVbo != 0) { GLSMBuffers.glDeleteBuffers(templateVbo); templateVbo = 0; }
+ if (instanceVbo != 0) { GLSMBuffers.glDeleteBuffers(instanceVbo); instanceVbo = 0; }
+ if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; }
}
@Test
@@ -100,7 +110,7 @@ class InstancedFFPDrawGLTest {
GLSMHooks.pendingProgramSelection = LOGGING_SELECTION;
GLSMHooks.blendHandler = new LoggingBlendHandler();
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 0);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 0);
drainErrors();
assertEquals(List.of("resolve", "flush"), log);
@@ -109,12 +119,12 @@ class InstancedFFPDrawGLTest {
@Test
void resolveIsSuppressedWhileDisplayListIsRecording() {
GLSMHooks.pendingProgramSelection = LOGGING_SELECTION;
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
GLSMHooks.resolvePendingProgram();
assertTrue(log.isEmpty());
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
GLSMHooks.resolvePendingProgram();
assertEquals(List.of("resolve"), log);
@@ -144,7 +154,7 @@ class InstancedFFPDrawGLTest {
}
private void assertCubeParity(boolean lightmap, boolean lit) {
- GLStateManager.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE);
+ GLSMRasterizer.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE);
CubeParityFixture.setupScene(lightmap, lit);
FfpFixture.activateFfp();
@@ -167,7 +177,7 @@ class InstancedFFPDrawGLTest {
@Test
void particleUnit0TextureMatrixMatchesReference() {
final ParticleParityFixture.Rotation rot = ParticleParityFixture.Rotation.of(35f, -12f, false);
- GLStateManager.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE);
+ GLSMRasterizer.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE);
ParticleParityFixture.setupScene(true);
FfpFixture.activateFfp();
@@ -188,14 +198,14 @@ class InstancedFFPDrawGLTest {
@Test
void entityAttribSelectsColorPerInstance() {
- GLStateManager.glViewport(0, 0, INTEGER_WIDTH, INTEGER_HEIGHT);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
+ GLSMRasterizer.glViewport(0, 0, INTEGER_WIDTH, INTEGER_HEIGHT);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
FfpFixture.EntityIdInstances.build(0.66f);
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
FfpFixture.EntityIdInstances.draw();
@@ -219,9 +229,9 @@ class InstancedFFPDrawGLTest {
@Test
void instancedSourceUsesInstanceAttribs() {
- GLStateManager.setFfpInstancing(Instancing.TEMPLATE);
+ GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE);
final VertexKey key = VertexKey.fromState(true, true, false, false, 0b10);
- GLStateManager.setFfpInstancing(Instancing.NONE);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
final String source = VertexShaderGenerator.generate(key);
assertTrue(source.contains("a_InstRow0"), "instance matrix attribs declared");
@@ -235,8 +245,8 @@ class InstancedFFPDrawGLTest {
void twoInstancesDrawWithDistinctTransformsAndColors() {
prepareTwoInstances(0xFF0000FF, 0, 0xFF00FF00, 0);
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
drawInstances();
@@ -251,14 +261,14 @@ class InstancedFFPDrawGLTest {
@Test
void instancedAlphaTestDiscardsLowAlphaInstance() {
prepareTwoInstances(0xFF0000FF, 0, 0x0D0000FF, 0);
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
drawInstances();
- GLStateManager.disableAlphaTest();
+ GLSMDepthStencilAlpha.disableAlphaTest();
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
final int[] left = FfpFixture.readPixel(200, 300);
@@ -269,35 +279,35 @@ class InstancedFFPDrawGLTest {
@Test
void equalDepthOverlayBlendsOnlyOverBase() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glViewport(0, 0, 800, 600);
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.disableCull();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMRasterizer.disableCull();
buildTemplate();
uploadInstances(0xFF0000FF, 0, 0xFF00FF00, 0);
FfpFixture.activateFfp();
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
drawInstances();
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glColor4f(1f, 1f, 1f, 1f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f);
uploadInstances(0x800000FF, 0, 0x8000FF00, 0);
drawInstances();
- GLStateManager.disableBlend();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.disableDepthTest();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.disableDepthTest();
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
final int[] left = FfpFixture.readPixel(200, 300);
@@ -310,12 +320,12 @@ class InstancedFFPDrawGLTest {
void perInstanceOverlayMixesOnlyTintedInstances() {
prepareTwoInstances(0xFFFFFFFF, 0, 0xFFFFFFFF, 0xFF0000FF);
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.setOverlayColor(0f, 1f, 0f, 1f);
+ GLSMCurrentAttribs.setOverlayColor(0f, 1f, 0f, 1f);
drawInstances();
- GLStateManager.setOverlayColor(0f, 0f, 0f, 0f);
+ GLSMCurrentAttribs.setOverlayColor(0f, 0f, 0f, 0f);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "instanced overlay draw must not raise a GL error");
@@ -326,13 +336,13 @@ class InstancedFFPDrawGLTest {
}
private void prepareTwoInstances(int leftColor, int leftOverlay, int rightColor, int rightOverlay) {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glViewport(0, 0, 800, 600);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
buildTemplate();
uploadInstances(leftColor, leftOverlay, rightColor, rightOverlay);
FfpFixture.activateFfp();
@@ -345,18 +355,18 @@ class InstancedFFPDrawGLTest {
instances.flip();
final boolean first = instanceVbo == 0;
- if (first) instanceVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW);
+ if (first) instanceVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW);
if (first) {
pointAndEnableInstanceAttribs();
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private void buildTemplate() {
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
final ByteBuffer template = BufferUtils.createByteBuffer(3 * TEMPLATE_STRIDE);
putVertex(template, -0.4f, -0.4f);
@@ -364,15 +374,15 @@ class InstancedFFPDrawGLTest {
putVertex(template, 0.0f, 0.4f);
template.flip();
- templateVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, template, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, 20L);
- GLStateManager.glEnableVertexAttribArray(4);
- GLStateManager.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, 24L);
+ templateVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, template, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMVertexInput.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, 20L);
+ GLSMVertexInput.glEnableVertexAttribArray(4);
+ GLSMVertexInput.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, 24L);
VAOManager.setCurrentVertexFlags(COLOR_BIT | NORMAL_BIT);
}
@@ -399,8 +409,8 @@ class InstancedFFPDrawGLTest {
}
private static void drawInstances() {
- GLStateManager.setFfpInstancing(Instancing.TEMPLATE);
- GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 2);
- GLStateManager.setFfpInstancing(Instancing.NONE);
+ GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 2);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java
index 9ec9a4981..a5716dfed 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java
@@ -1,7 +1,10 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -18,21 +21,21 @@ class LogicOpGLTest {
void setUp() {
FfpFixture.resetFfpState();
FfpFixture.activateFfp();
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
}
@AfterEach
void tearDown() {
- GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glLogicOp(GL11.GL_COPY);
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMBlend.glLogicOp(GL11.GL_COPY);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
LogicOpFixture.deleteResources();
FfpFixture.resetFfpState();
}
@@ -50,8 +53,8 @@ class LogicOpGLTest {
@Test
void blendingIsIgnoredWhileLogicOpIsEnabled() {
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
final int[] src = LogicOpFixture.SOURCES[1];
LogicOpFixture.clearToDst();
LogicOpFixture.drawQuad(GL11.GL_XOR, src);
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java
index b768eddc5..4af1b56ab 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.junit.jupiter.api.Test;
import org.lwjgl.opengl.GL11;
@@ -25,10 +27,10 @@ class ProgramUniformTrackingTest {
final Program b = buildProgram(false);
assertNotEquals(a.getProgramId(), b.getProgramId(), "distinct vertex keys must yield distinct programs");
try {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(1.0F, 2.0F, 3.0F);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(1.0F, 2.0F, 3.0F);
GL20.glUseProgram(a.getProgramId());
uniforms.upload(GLStateManager.ctx());
@@ -40,14 +42,14 @@ class ProgramUniformTrackingTest {
uniforms.upload(GLStateManager.ctx());
assertEquals(afterFirst, uniforms.blockWrites, "program switches with unchanged state write nothing");
- GLStateManager.glTranslatef(4.0F, 0.0F, 0.0F);
+ GLSMMatrices.glTranslatef(4.0F, 0.0F, 0.0F);
uniforms.upload(GLStateManager.ctx());
assertEquals(afterFirst + 1, uniforms.blockWrites, "a gen bump writes exactly one block");
uniforms.upload(GLStateManager.ctx());
assertEquals(afterFirst + 1, uniforms.blockWrites, "clean draw writes nothing");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
} finally {
GL20.glUseProgram(0);
a.destroy();
@@ -61,26 +63,26 @@ class ProgramUniformTrackingTest {
final Uniforms uniforms = new Uniforms();
final Program a = buildProgram(true);
try {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
GL20.glUseProgram(a.getProgramId());
uniforms.upload(GLStateManager.ctx());
final int base = uniforms.blockWrites;
- GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT);
+ GLSMAttribStack.glPopAttrib();
uniforms.upload(GLStateManager.ctx());
assertEquals(base, uniforms.blockWrites, "push/pop with no change inside writes nothing");
- GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT);
- GLStateManager.glTranslatef(7.0F, 0.0F, 0.0F);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT);
+ GLSMMatrices.glTranslatef(7.0F, 0.0F, 0.0F);
+ GLSMAttribStack.glPopAttrib();
uniforms.upload(GLStateManager.ctx());
assertEquals(base + 1, uniforms.blockWrites, "pop after change stages once");
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
} finally {
GL20.glUseProgram(0);
a.destroy();
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java
index 820a1f196..9f055e951 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java
@@ -1,7 +1,16 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -52,13 +61,13 @@ class TextureSupersamplingGLTest {
}
}
pixels.flip();
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, atlasSize, atlasSize, 0,
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, atlasSize, atlasSize, 0,
GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
return texture;
}
@@ -97,33 +106,33 @@ class TextureSupersamplingGLTest {
@BeforeEach
void setup() {
FfpFixture.resetFfpState();
- GLStateManager.setTextureSupersamplingSamples(1);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_FOG);
- GLStateManager.glColor4f(1, 1, 1, 1);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(0, SIZE, SIZE, 0, -100, 100);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.setTextureSupersamplingSamples(1);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_FOG);
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(0, SIZE, SIZE, 0, -100, 100);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
FfpFixture.activateFfp();
}
@AfterEach
void cleanup() {
- GLStateManager.setTextureSupersamplingSamples(1);
+ GLSMTextures.setTextureSupersamplingSamples(1);
FfpFixture.resetFfpState();
- if (texture != 0) GLStateManager.glDeleteTextures(texture);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glViewport(0, 0, 800, 600);
+ if (texture != 0) GLSMTextures.glDeleteTextures(texture);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
}
@ParameterizedTest
@@ -133,9 +142,9 @@ class TextureSupersamplingGLTest {
final int[] nearest = drawTop(3);
assertEquals(0, countDotRegions(nearest));
- final int previous = GLStateManager.setTextureSupersamplingSamples(samples);
+ final int previous = GLSMTextures.setTextureSupersamplingSamples(samples);
assertEquals(12, countDotRegions(drawTop(3)));
- GLStateManager.setTextureSupersamplingSamples(previous);
+ GLSMTextures.setTextureSupersamplingSamples(previous);
assertArrayEquals(nearest, drawTop(3));
}
@@ -143,11 +152,11 @@ class TextureSupersamplingGLTest {
@ValueSource(ints = {4, 16})
void highResolutionCheckerboardsStaySmoothWithTheDefaultAtlasGutter(int samples) {
createAtlas(256, 16, (x, y) -> ((x ^ y) & 1) == 0 ? 0xFFFFFFFF : 0x000000FF);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4);
- GLStateManager.glGenerateMipmap(GL11.GL_TEXTURE_2D);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4);
+ GLSMTextures.glGenerateMipmap(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR);
final int[] filtered = drawFlat();
- GLStateManager.setTextureSupersamplingSamples(samples);
+ GLSMTextures.setTextureSupersamplingSamples(samples);
final int[] supersampled = drawFlat();
for (int y = 97; y <= 102; y++) {
for (int x = 97; x <= 102; x++) {
@@ -163,9 +172,9 @@ class TextureSupersamplingGLTest {
@ValueSource(ints = {4, 16})
void transparentTexelsDoNotTintPartialCoverage(int samples) {
createAtlas(16, (x, y) -> x < 8 ? 0xFF0000FF : 0x0000FF00);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.setTextureSupersamplingSamples(samples);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMTextures.setTextureSupersamplingSamples(samples);
final int[] pixels = drawTop(3);
int partialPixels = 0;
for (int pixel : pixels) {
@@ -184,26 +193,26 @@ class TextureSupersamplingGLTest {
createDotAtlas();
final int modelTexture = uploadTexture(16, 1, TextureSupersamplingGLTest::dotColor);
try {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
final int[] normal = drawTop(3);
- GLStateManager.setTextureSupersamplingSamples(16);
+ GLSMTextures.setTextureSupersamplingSamples(16);
assertArrayEquals(normal, drawTop(3));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
assertFalse(Arrays.equals(normal, drawTop(3)));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, modelTexture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, modelTexture);
assertArrayEquals(normal, drawTop(3));
} finally {
- GLStateManager.glDeleteTextures(modelTexture);
+ GLSMTextures.glDeleteTextures(modelTexture);
}
}
@Test
void atlasFetchesIgnoreSamplerFilteringAndRepeatAcrossNegativeUvs() {
createAtlas(16, 4, TextureSupersamplingGLTest::dotColor);
- GLStateManager.setTextureSupersamplingSamples(16);
+ GLSMTextures.setTextureSupersamplingSamples(16);
final int[] nearest = drawTop(3);
final int sampler = RenderSystem.genSampler();
try {
@@ -212,14 +221,14 @@ class TextureSupersamplingGLTest {
RenderSystem.samplerParameteri(sampler, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
RenderSystem.samplerParameteri(sampler, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
RenderSystem.bindSamplerToUnit(0, sampler);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(-2, 3, 0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(-2, 3, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertArrayEquals(nearest, drawTop(3));
} finally {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
RenderSystem.bindSamplerToUnit(0, 0);
RenderSystem.destroySampler(sampler);
}
@@ -234,28 +243,28 @@ class TextureSupersamplingGLTest {
final ByteBuffer pixels = BufferUtils.createByteBuffer(size * size * 4);
for (int i = 0; i < size * size; i++) pixels.putInt(0xFFFF0000);
pixels.flip();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0,
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0,
GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
}
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 6);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 6);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST);
final int[] mipFiltered = drawFlat();
assertFalse(Arrays.equals(baseLevel, mipFiltered));
- GLStateManager.setTextureSupersamplingSamples(16);
+ GLSMTextures.setTextureSupersamplingSamples(16);
assertArrayEquals(baseLevel, drawFlat());
- GLStateManager.markTextureAsAtlas(texture, 1);
+ GLSMTextures.markTextureAsAtlas(texture, 1);
assertArrayEquals(mipFiltered, drawFlat());
- GLStateManager.markTextureAsAtlas(texture, 4);
+ GLSMTextures.markTextureAsAtlas(texture, 4);
assertArrayEquals(baseLevel, drawFlat());
}
private int[] drawFlat() {
FfpFixture.clear();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(100.25f, 100.125f, 0);
- GLStateManager.glScalef(11, 11, 1);
- GLStateManager.glRotatef(90, 1, 0, 0);
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(100.25f, 100.125f, 0);
+ GLSMMatrices.glScalef(11, 11, 1);
+ GLSMMatrices.glRotatef(90, 1, 0, 0);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4);
return FfpFixture.readRegion(SIZE);
}
@@ -269,7 +278,7 @@ class TextureSupersamplingGLTest {
private void createAtlas(int spriteSize, int gutter, IntBinaryOperator color) {
texture = uploadTexture(spriteSize, gutter, color);
- GLStateManager.markTextureAsAtlas(texture, gutter);
+ GLSMTextures.markTextureAsAtlas(texture, gutter);
final int atlasSize = Integer.highestOneBit(spriteSize + 2 * gutter) << 1;
final float minUv = (gutter + 0.01f) / atlasSize;
final float maxUv = (spriteSize + gutter - 0.01f) / atlasSize;
@@ -279,11 +288,11 @@ class TextureSupersamplingGLTest {
vertex(vertices, 0.5f, 0.5f, maxUv, maxUv);
vertex(vertices, -0.5f, 0.5f, minUv, maxUv);
vertices.flip();
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 20, 0);
FfpFixture.attrib(2, 2, GL11.GL_FLOAT, false, 20, 12);
VAOManager.setCurrentVertexFlags(TEXTURE_BIT);
@@ -291,12 +300,12 @@ class TextureSupersamplingGLTest {
private int[] drawTop(int scale) {
FfpFixture.clear();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(100 + 8 * scale, 100 + 8 * scale, 0);
- GLStateManager.glScalef(10 * scale, 10 * scale, -10 * scale);
- GLStateManager.glRotatef(210, 1, 0, 0);
- GLStateManager.glRotatef(45, 0, 1, 0);
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(100 + 8 * scale, 100 + 8 * scale, 0);
+ GLSMMatrices.glScalef(10 * scale, 10 * scale, -10 * scale);
+ GLSMMatrices.glRotatef(210, 1, 0, 0);
+ GLSMMatrices.glRotatef(45, 0, 1, 0);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4);
return FfpFixture.readRegion(SIZE);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java
index 8981616dd..86e2c3173 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.junit.jupiter.api.Test;
import org.lwjgl.opengl.GL11;
@@ -19,88 +23,88 @@ class VertexKeyTexMatrixMaskTest {
@Test
void identityNonIdentityTransitionsPerUnit() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final boolean texGenS = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_S);
- final boolean texGenT = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_T);
- final boolean texGenR = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_R);
- final boolean texGenQ = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_Q);
- if (texGenS) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S);
- if (texGenT) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T);
- if (texGenR) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R);
- if (texGenQ) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final boolean texGenS = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_S);
+ final boolean texGenT = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_T);
+ final boolean texGenR = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_R);
+ final boolean texGenQ = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_Q);
+ if (texGenS) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S);
+ if (texGenT) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T);
+ if (texGenR) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R);
+ if (texGenQ) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q);
try {
for (int unit = 0; unit < VertexKey.MAX_UNITS; unit++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit), "unit " + unit + " identity");
- GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f);
+ GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f);
assertTrue(texMatEnabled(unit), "unit " + unit + " non-identity");
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit), "unit " + unit + " back to identity");
}
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- if (texGenS) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_S);
- if (texGenT) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_T);
- if (texGenR) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_R);
- if (texGenQ) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_Q);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ if (texGenS) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_S);
+ if (texGenT) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_T);
+ if (texGenR) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_R);
+ if (texGenQ) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_Q);
}
}
@Test
void pushPopMatrixRestoresIdentity() {
final int unit = 1;
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit));
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(4.0f, 5.0f, 6.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(4.0f, 5.0f, 6.0f);
assertTrue(texMatEnabled(unit));
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
assertFalse(texMatEnabled(unit), "pop must restore identity and invalidate the cached mask");
}
@Test
void transformBitPopBumpsGeneration() {
final int unit = 2;
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit));
- GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT);
try {
- GLStateManager.glTranslatef(7.0f, 8.0f, 9.0f);
+ GLSMMatrices.glTranslatef(7.0f, 8.0f, 9.0f);
assertTrue(texMatEnabled(unit));
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
assertTrue(texMatEnabled(unit), "GL_TRANSFORM_BIT pop does not restore matrix content; the pop bump must still force a correct recompute");
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit));
}
@Test
void generationUnchangedSkipsRecompute() {
final int unit = 3;
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit));
- final int genBefore = GLStateManager.getTexMatrixGeneration();
+ final int genBefore = GLSMMatrices.getTexMatrixGeneration();
GLStateManager.ctx().textures.getTextureUnitMatrix(unit).translate(10.0f, 11.0f, 12.0f);
- assertEquals(genBefore, GLStateManager.getTexMatrixGeneration(), "direct mutation of the matrix object must not bump the generation");
+ assertEquals(genBefore, GLSMMatrices.getTexMatrixGeneration(), "direct mutation of the matrix object must not bump the generation");
assertFalse(texMatEnabled(unit), "cached mask must stay stale (identity) while the generation is unchanged");
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
assertFalse(texMatEnabled(unit));
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java
index 712db9fa7..0be22024c 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java
@@ -1,7 +1,13 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -35,30 +41,30 @@ class WideLineClipGLTest {
@BeforeEach
void setUp() {
- savedEmulation = GLStateManager.wideLineEmulationEnabled;
- GLStateManager.wideLineEmulationEnabled = true;
+ savedEmulation = GLSMRasterizer.wideLineEmulationEnabled;
+ GLSMRasterizer.wideLineEmulationEnabled = true;
FfpFixture.resetFfpState();
FfpFixture.activateFfp();
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glFrustum(-NEAR, NEAR, -NEAR, NEAR, NEAR, 100.0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glLineWidth(LINE_WIDTH);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glFrustum(-NEAR, NEAR, -NEAR, NEAR, NEAR, 100.0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMRasterizer.glLineWidth(LINE_WIDTH);
}
@AfterEach
void tearDown() {
- GLStateManager.wideLineEmulationEnabled = savedEmulation;
- GLStateManager.glLineWidth(1.0f);
- if (vbo != 0) { GLStateManager.glDeleteBuffers(vbo); vbo = 0; }
- if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; }
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMRasterizer.wideLineEmulationEnabled = savedEmulation;
+ GLSMRasterizer.glLineWidth(1.0f);
+ if (vbo != 0) { GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; }
+ if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; }
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
FfpFixture.resetFfpState();
}
@@ -83,9 +89,9 @@ class WideLineClipGLTest {
}
private static void orthographic() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
private static float pixelCenter(int pixel) {
@@ -102,8 +108,8 @@ class WideLineClipGLTest {
private int[] drawLineOnce(float[] start, float[] end) {
final int[] pixels = drawLine(start, end);
- GLStateManager.glDeleteBuffers(vbo);
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMBuffers.glDeleteBuffers(vbo);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
vbo = 0;
vao = 0;
return pixels;
@@ -112,7 +118,7 @@ class WideLineClipGLTest {
@Test
void wideLineCoversItsFirstPixelButNotItsLast() {
orthographic();
- GLStateManager.glLineWidth(2.0f);
+ GLSMRasterizer.glLineWidth(2.0f);
final float y = pixelCenter(16);
final int[] pixels = drawLineOnce(new float[] { pixelCenter(40), y, 0f }, new float[] { pixelCenter(20), y, 0f });
assertEquals(2, litInColumn(pixels, 40), "first pixel of a right-to-left line");
@@ -123,16 +129,16 @@ class WideLineClipGLTest {
@Test
void cullingKeepsWideLinesInBothDirections() {
orthographic();
- GLStateManager.glLineWidth(2.0f);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMRasterizer.glLineWidth(2.0f);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
try {
final int[] rightward = drawLineOnce(new float[] { -0.8f, 0f, 0f }, new float[] { 0.8f, 0f, 0f });
final int[] leftward = drawLineOnce(new float[] { 0.8f, 0f, 0f }, new float[] { -0.8f, 0f, 0f });
assertEquals(2, litInColumn(rightward, SIZE / 2), "left-to-right line with culling on");
assertEquals(2, litInColumn(leftward, SIZE / 2), "right-to-left line with culling on");
- assertTrue(GLStateManager.getCullState().isEnabled(), "the game's cull state survives");
+ assertTrue(GLSMRasterizer.getCullState().isEnabled(), "the game's cull state survives");
} finally {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
}
}
@@ -149,21 +155,21 @@ class WideLineClipGLTest {
}
private int[] drawLine(float[] start, float[] end) {
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
final FloatBuffer positions = BufferUtils.createFloatBuffer(6);
positions.put(start).put(end).flip();
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW);
FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 12, 0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
VAOManager.setCurrentVertexFlags(0);
FfpFixture.clear();
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glDrawArrays(GL11.GL_LINES, 0, 2);
- GLStateManager.glBindVertexArray(0);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMDraws.glDrawArrays(GL11.GL_LINES, 0, 2);
+ GLSMVertexInput.glBindVertexArray(0);
return FfpFixture.readRegion(SIZE);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java
index 6e89cc32d..82ff6b230 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java
@@ -2,6 +2,9 @@ package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
import com.gtnewhorizons.angelica.glsm.recording.commands.BatchedIndexedDrawCmd;
@@ -100,12 +103,12 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
final int vao = setupPosColorVao(vbo);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 6L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 6L);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
assertEquals(1, allBatchedCmds(list).size());
@@ -148,8 +151,8 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
@Test
void emptyRecorder_producesNoBatches() {
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glEndList();
assertTrue(batchesOf(list).isEmpty(), "recorder with no draws produces no batches");
assertTrue(allBatchedCmds(list).isEmpty(), "no placeholders either");
@@ -184,24 +187,24 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
data.putFloat(tb[i][0]); data.putFloat(tb[i][1]); data.putFloat(tb[i][2]); data.putFloat(tb[i][3]);
}
data.flip();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
MemoryUtilities.memFree(data);
final int vao = newVao();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, STRIDE, 0);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, STRIDE, 8);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 16);
- GLStateManager.glEnableVertexAttribArray(2);
- GLStateManager.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, STRIDE, 20);
- GLStateManager.glEnableVertexAttribArray(3);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, STRIDE, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, STRIDE, 8);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 16);
+ GLSMVertexInput.glEnableVertexAttribArray(2);
+ GLSMVertexInput.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, STRIDE, 20);
+ GLSMVertexInput.glEnableVertexAttribArray(3);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2, 2, 3, 0);
final int list = recordSingleIndexedDraw(vao, ebo, GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_SHORT);
@@ -242,7 +245,7 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
assertTrue(GL15.glIsBuffer(sharedEBO), "shared EBO live");
assertTrue(GL30.glIsVertexArray(sharedVAO), "shared VAO live");
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
untrackList(list);
assertFalse(GL15.glIsBuffer(sharedVBO), "shared VBO freed");
@@ -263,12 +266,12 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
final int oldVBO = first.getSharedVBO();
final int oldEBO = first.getSharedEBO();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
assertFalse(GL15.glIsBuffer(oldVBO), "old shared VBO freed on re-record");
assertFalse(GL15.glIsBuffer(oldEBO), "old shared EBO freed on re-record");
@@ -292,8 +295,8 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
clientData.flip();
final int vao = newVao();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
final ByteBuffer colorSlice = clientData.duplicate().order(ByteOrder.nativeOrder());
colorSlice.position(8);
final VAOManager vaos = GLStateManager.ctx().vaos;
@@ -301,7 +304,7 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
vaos.enableAttribute(0);
vaos.setAttribute(1, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, colorSlice);
vaos.enableAttribute(1);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2);
final int list = recordSingleIndexedDraw(vao, ebo, GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT);
@@ -328,14 +331,14 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
final int vao = setupPosColorVao(vbo);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboA);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboB);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboA);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboB);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
final List cmds = allBatchedCmds(list);
assertEquals(2, cmds.size(), "two indexed draws → two batched commands");
@@ -366,14 +369,14 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
final int vaoA = setupPosColorVao(vbo);
final int vaoB = newVao();
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8);
- GLStateManager.glEnableVertexAttribArray(2);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8);
+ GLSMVertexInput.glEnableVertexAttribArray(2);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2);
@@ -399,18 +402,18 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
bData.putFloat(DEFAULT_QUAD_POSITIONS[i * 2 + 1]);
}
bData.flip();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, bData, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
MemoryUtilities.memFree(bData);
final int vaoB = newVao();
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2);
@@ -441,32 +444,32 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
arguments("byte indices", GL11.GL_COMPILE, (Runnable) () -> {
final ByteBuffer idx = BufferUtils.createByteBuffer(3);
idx.put(new byte[]{0, 1, 2}).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx);
}, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}),
arguments("short indices", GL11.GL_COMPILE, (Runnable) () -> {
final ShortBuffer idx = BufferUtils.createShortBuffer(3);
idx.put(new short[]{0, 1, 2}).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx);
}, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}),
arguments("int indices", GL11.GL_COMPILE, (Runnable) () -> {
final IntBuffer idx = BufferUtils.createIntBuffer(3);
idx.put(new int[]{0, 1, 2}).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx);
}, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}),
arguments("explicit count+type", GL11.GL_COMPILE, (Runnable) () -> {
final ByteBuffer idx = BufferUtils.createByteBuffer(3 * 2).order(ByteOrder.nativeOrder());
idx.putShort((short) 0).putShort((short) 1).putShort((short) 2).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, idx);
}, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}),
arguments("quads triangulate at record", GL11.GL_COMPILE, (Runnable) () -> {
final IntBuffer idx = BufferUtils.createIntBuffer(4);
idx.put(new int[]{0, 1, 2, 3}).flip();
- GLStateManager.glDrawElements(GL11.GL_QUADS, idx);
+ GLSMDraws.glDrawElements(GL11.GL_QUADS, idx);
}, GL11.GL_TRIANGLES, 6, new int[]{0, 1, 3, 1, 2, 3}),
arguments("compile-and-execute fires live and bakes", GL11.GL_COMPILE_AND_EXECUTE, (Runnable) () -> {
final IntBuffer idx = BufferUtils.createIntBuffer(3);
idx.put(new int[]{0, 1, 2}).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx);
}, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2})
);
}
@@ -501,16 +504,16 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
final int vao = newVao();
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
final VAOManager vaos = GLStateManager.ctx().vaos;
vaos.setAttribute(0, 3, GL11.GL_FLOAT, false, 0, clientVerts);
vaos.enableAttribute(0);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, indices);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, indices);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
final BatchedIndexedDrawCmd cmd = firstBatchedCmd(list);
assertNotNull(cmd);
@@ -534,15 +537,15 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
final int triEbo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, quadEbo);
- GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, quadEbo);
+ GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
assertTrue(DisplayListManager.isRecording(), "recording must resume after a GL_QUADS offset draw");
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, triEbo);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, triEbo);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
assertEquals(2, allBatchedCmds(list).size(), "both the QUADS draw and the following triangle draw must be recorded");
}
@@ -553,26 +556,26 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
@EnumSource(MalformedClientDraw.class)
void malformedClientDraw_skippedAndRecordingSurvives(MalformedClientDraw scenario) {
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
switch (scenario) {
case OVERSIZED_COUNT -> {
- GLStateManager.glBindVertexArray(setupPosColorVao(defaultQuadVbo()));
+ GLSMVertexInput.glBindVertexArray(setupPosColorVao(defaultQuadVbo()));
final ByteBuffer idx = BufferUtils.createByteBuffer(3 * 2).order(ByteOrder.nativeOrder());
idx.putShort((short) 0).putShort((short) 1).putShort((short) 2).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 100, GL11.GL_UNSIGNED_SHORT, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 100, GL11.GL_UNSIGNED_SHORT, idx);
}
case INDEX_PAST_VERTEX_BUFFER -> {
final int vbo = uploadPosColorVbo(new float[]{0f, 0f, 1f, 0f}, new byte[][]{{1, 1, 1, 1}, {2, 2, 2, 2}});
- GLStateManager.glBindVertexArray(setupPosColorVao(vbo));
+ GLSMVertexInput.glBindVertexArray(setupPosColorVao(vbo));
final IntBuffer idx = BufferUtils.createIntBuffer(4);
idx.put(new int[]{0, 1, 2, 3}).flip();
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx);
}
}
assertTrue(DisplayListManager.isRecording(), "recording survives a skipped malformed draw");
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
assertNull(firstBatchedCmd(list), "malformed draw must be skipped, not captured or over-read");
}
@@ -580,12 +583,12 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture {
private int recordClientIndexDraw(int listMode, Runnable draw) {
final int vao = setupPosColorVao(defaultQuadVbo());
final int list = newList();
- GLStateManager.glNewList(list, listMode);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMDraws.glNewList(list, listMode);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
draw.run();
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
return list;
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java
index 453c94b76..290dc9662 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.glsm.recording;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawBatch;
import com.gtnewhorizons.angelica.glsm.recording.support.DisplayListTestFixture;
@@ -29,22 +32,22 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture {
final int sharedEbo = batch.getSharedEBO();
final int foreignVao = newVao();
- GLStateManager.glBindVertexArray(foreignVao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEbo);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(foreignVao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEbo);
+ GLSMVertexInput.glBindVertexArray(0);
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
untrackList(list);
- GLStateManager.glBindVertexArray(foreignVao);
- assertEquals(0, GLStateManager.getBoundEBO(), "vaoEboMap still references the freed sharedEBO - non-gen crash imminent");
+ GLSMVertexInput.glBindVertexArray(foreignVao);
+ assertEquals(0, GLSMVertexInput.getBoundEBO(), "vaoEboMap still references the freed sharedEBO - non-gen crash imminent");
drainErrors();
- final int prevEbo = GLStateManager.getBoundEBO();
+ final int prevEbo = GLSMVertexInput.getBoundEBO();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEbo);
final int err = GL11.glGetError();
assertEquals(GL11.GL_NO_ERROR, err, () -> "bindBuffer(prevEbo=" + prevEbo + ") hit GL 0x" + Integer.toHexString(err) + " - cache carried a freed id through a VAO rebind");
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
@Test
@@ -55,19 +58,19 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture {
final int vaoA = newVao();
final int vaoB = newVao();
- GLStateManager.glBindVertexArray(vaoA);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glBindVertexArray(vaoB);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(vaoA);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMVertexInput.glBindVertexArray(0);
- GLStateManager.glDeleteBuffers(ebo);
+ GLSMBuffers.glDeleteBuffers(ebo);
- GLStateManager.glBindVertexArray(vaoA);
- assertEquals(0, GLStateManager.getBoundEBO(), "vaoA still references freed EBO");
- GLStateManager.glBindVertexArray(vaoB);
- assertEquals(0, GLStateManager.getBoundEBO(), "vaoB still references freed EBO");
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(vaoA);
+ assertEquals(0, GLSMVertexInput.getBoundEBO(), "vaoA still references freed EBO");
+ GLSMVertexInput.glBindVertexArray(vaoB);
+ assertEquals(0, GLSMVertexInput.getBoundEBO(), "vaoB still references freed EBO");
+ GLSMVertexInput.glBindVertexArray(0);
}
@Test
@@ -75,15 +78,15 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture {
final int prog = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
drainErrors();
- GLStateManager.glUseProgram(prog);
- assertEquals(prog, GLStateManager.getActiveProgram());
+ GLSMPrograms.glUseProgram(prog);
+ assertEquals(prog, GLSMPrograms.getActiveProgram());
- GLStateManager.glDeleteProgram(0);
+ GLSMPrograms.glDeleteProgram(0);
- assertEquals(prog, GLStateManager.getActiveProgram(), "glDeleteProgram(0) must be a silent no-op");
+ assertEquals(prog, GLSMPrograms.getActiveProgram(), "glDeleteProgram(0) must be a silent no-op");
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(prog);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(prog);
drainErrors();
}
@@ -92,15 +95,15 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture {
final int prog = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
drainErrors();
- GLStateManager.glUseProgram(prog);
- assertEquals(prog, GLStateManager.getActiveProgram());
+ GLSMPrograms.glUseProgram(prog);
+ assertEquals(prog, GLSMPrograms.getActiveProgram());
- GLStateManager.glDeleteProgram(prog);
+ GLSMPrograms.glDeleteProgram(prog);
- assertEquals(prog, GLStateManager.getActiveProgram(), "activeProgram must remain set after delete (GL spec: deletion deferred until unbind)");
+ assertEquals(prog, GLSMPrograms.getActiveProgram(), "activeProgram must remain set after delete (GL spec: deletion deferred until unbind)");
- GLStateManager.glUseProgram(0);
- assertEquals(0, GLStateManager.getActiveProgram(), "activeProgram clears once the deleted program is unbound");
+ GLSMPrograms.glUseProgram(0);
+ assertEquals(0, GLSMPrograms.getActiveProgram(), "activeProgram clears once the deleted program is unbound");
drainErrors();
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java
index 1a30d42ed..1178c729c 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java
@@ -1,7 +1,9 @@
package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.recording.commands.AttribLayoutKey;
import com.gtnewhorizons.angelica.glsm.recording.commands.BatchedIndexedDrawCmd;
import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawBatch;
@@ -46,12 +48,12 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
GL15.glBeginQuery(GL15.GL_SAMPLES_PASSED, query);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
GL15.glEndQuery(GL15.GL_SAMPLES_PASSED);
final int samples = GL15.glGetQueryObjecti(query, GL15.GL_QUERY_RESULT);
@@ -76,11 +78,11 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
final IndexedDrawBatch batch = firstBatch(list);
replay(list);
- GLStateManager.glBindVertexArray(vaoOf(batch));
- assertEquals(batch.getSharedEBO(), GLStateManager.getBoundEBO(),
+ GLSMVertexInput.glBindVertexArray(vaoOf(batch));
+ assertEquals(batch.getSharedEBO(), GLSMVertexInput.getBoundEBO(),
"batched VAO's EBO binding corrupted");
assertEquals(batch.getSharedEBO(), GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING));
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
@Test
@@ -95,8 +97,8 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
// Bind unrelated state so the baked command has to restore its own bindings.
final int distractorVao = newVao();
- GLStateManager.glBindVertexArray(distractorVao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(distractorVao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
drainErrors();
@@ -106,7 +108,7 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
assertEquals(GL11.GL_NO_ERROR, err,
() -> "replay produced GL error 0x" + Integer.toHexString(err));
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
@Test
@@ -116,18 +118,18 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
final int vao = setupPosColorVao(vbo);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMDraws.glEndList();
final List cmds = allBatchedCmds(list);
assertEquals(2, cmds.size());
final int distractor = newVao();
- GLStateManager.glBindVertexArray(distractor);
+ GLSMVertexInput.glBindVertexArray(distractor);
drainErrors();
compiledOf(list).render();
@@ -135,8 +137,8 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
assertSame(batchOf(cmds.getFirst()), batchOf(cmds.get(1)));
final int sharedVAO = vaoOf(batchOf(cmds.getFirst()));
assertNotEquals(0, sharedVAO);
- assertEquals(sharedVAO, GLStateManager.getBoundVAO());
- GLStateManager.glBindVertexArray(0);
+ assertEquals(sharedVAO, GLSMVertexInput.getBoundVAO());
+ GLSMVertexInput.glBindVertexArray(0);
}
@Test
@@ -144,8 +146,8 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
final int vbo = defaultQuadVbo();
final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2, 3);
final int vao = setupPosColorVao(vbo);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
final IndexedDrawCapture good = IndexedDrawCapture.create(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L, ebo);
assertNotNull(good);
@@ -172,7 +174,7 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
MemoryUtilities.memFree(tinyVtx);
MemoryUtilities.memFree(tinyIdx);
good.freeBuffers();
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
}
@@ -201,11 +203,11 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
final int vao = setupPosColorVao(vbo);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMDraws.glEndList();
drainErrors();
@@ -216,6 +218,6 @@ class IndexedDrawReplayTest extends DisplayListTestFixture {
assertEquals(GL11.GL_NO_ERROR, err,
() -> "double replay produced GL error 0x" + Integer.toHexString(err));
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
index fc2757ec1..2c4875d67 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
@@ -4,7 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.glsm.GLCompatTest;
import com.gtnewhorizons.angelica.glsm.GLCompatTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.lwjgl.opengl.GL11;
@@ -26,7 +26,7 @@ class RecordingDataStructuresTest {
@AfterEach
void cleanup() {
if (testList > 0) {
- GLStateManager.glDeleteLists(testList, 1);
+ GLSMDraws.glDeleteLists(testList, 1);
testList = -1;
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java
index 6160baa27..25481a26c 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java
@@ -3,7 +3,9 @@ package com.gtnewhorizons.angelica.glsm.recording.support;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLCompatTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLTypes;
import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList;
import com.gtnewhorizons.angelica.glsm.recording.commands.BatchedIndexedDrawCmd;
@@ -37,12 +39,12 @@ public abstract class DisplayListTestFixture {
@AfterEach
void cleanupFixtureResources() {
- for (int list : listsToCleanup) GLStateManager.glDeleteLists(list, 1);
+ for (int list : listsToCleanup) GLSMDraws.glDeleteLists(list, 1);
for (int buf : buffersToCleanup) {
if (GL15.glIsBuffer(buf)) GL15.glDeleteBuffers(buf);
}
for (int vao : vaosToCleanup) {
- if (GL30.glIsVertexArray(vao)) GLStateManager.glDeleteVertexArrays(vao);
+ if (GL30.glIsVertexArray(vao)) GLSMVertexInput.glDeleteVertexArrays(vao);
}
listsToCleanup.clear();
buffersToCleanup.clear();
@@ -88,9 +90,9 @@ public abstract class DisplayListTestFixture {
data.put(colors[i][3]);
}
data.flip();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
MemoryUtilities.memFree(data);
return vbo;
}
@@ -112,9 +114,9 @@ public abstract class DisplayListTestFixture {
}
}
data.flip();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
MemoryUtilities.memFree(data);
return ebo;
}
@@ -122,14 +124,14 @@ public abstract class DisplayListTestFixture {
/** VAO with loc0 = 2*FLOAT pos, loc1 = 4*UNSIGNED_BYTE norm color, stride 12. */
protected final int setupPosColorVao(int vbo) {
final int vao = newVao();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
return vao;
}
@@ -139,25 +141,25 @@ public abstract class DisplayListTestFixture {
*/
protected final int recordSingleIndexedDraw(int vao, int ebo, int drawMode, int indexCount, int indexType) {
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(drawMode, indexCount, indexType, 0L);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(drawMode, indexCount, indexType, 0L);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
return list;
}
protected final int recordTwoVaoDraws(int firstVao, int secondVao, int ebo) {
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
for (int vao : new int[] { firstVao, secondVao }) {
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L);
}
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glEndList();
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMDraws.glEndList();
return list;
}
@@ -192,7 +194,7 @@ public abstract class DisplayListTestFixture {
protected static void replay(int listId) {
compiledOf(listId).render();
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
protected static IndexedDrawBatch batchOf(BatchedIndexedDrawCmd cmd) {
@@ -205,23 +207,23 @@ public abstract class DisplayListTestFixture {
protected static ByteBuffer readBufferBytes(int target, int bufferId, int size) {
final int prev;
- if (target == GL15.GL_ARRAY_BUFFER) prev = GLStateManager.getBoundVBO();
- else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) prev = GLStateManager.getBoundEBO();
+ if (target == GL15.GL_ARRAY_BUFFER) prev = GLSMBuffers.getBoundVBO();
+ else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) prev = GLSMVertexInput.getBoundEBO();
else prev = 0;
- GLStateManager.glBindBuffer(target, bufferId);
+ GLSMBuffers.glBindBuffer(target, bufferId);
final ByteBuffer buf = MemoryUtilities.memAlloc(size).order(ByteOrder.nativeOrder());
GL15.glGetBufferSubData(target, 0, buf);
- GLStateManager.glBindBuffer(target, prev);
+ GLSMBuffers.glBindBuffer(target, prev);
return buf;
}
protected static void overwriteBufferWithGarbage(int target, int bufferId, int size) {
final ByteBuffer garbage = MemoryUtilities.memAlloc(size);
for (int i = 0; i < garbage.capacity(); i++) garbage.put(i, (byte) 0xAA);
- GLStateManager.glBindBuffer(target, bufferId);
+ GLSMBuffers.glBindBuffer(target, bufferId);
GL15.glBufferData(target, garbage, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(target, 0);
+ GLSMBuffers.glBindBuffer(target, 0);
MemoryUtilities.memFree(garbage);
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java
index 337f929a3..3468fdec2 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java
@@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.redirect;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.config.SystemProperties.UnmappedGLMode;
+import com.gtnewhorizons.angelica.glsm.testutil.GlsmClasses;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -13,6 +14,7 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.InvokeDynamicInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
@@ -21,7 +23,12 @@ import org.objectweb.asm.tree.MethodNode;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -31,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
class GLSMRedirectorTest {
- private static final String GLSM = GLSMRedirector.getTargetClassName();
+ private static final String GLSM = "com/gtnewhorizons/angelica/glsm/GLStateManager";
private static Set unmappedSeen() { return Reflect.getStatic(GLSMRedirector.class, "UNMAPPED_SEEN"); }
private static Set debugSeen() { return Reflect.getStatic(GLSMRedirector.class, "DEBUG_SEEN"); }
@@ -115,7 +122,7 @@ class GLSMRedirectorTest {
assertTrue(changed);
final Handle result = getResultHandle(cn);
- assertEquals(GLSM, result.getOwner());
+ assertEquals(GLSMRedirector.getTargetOwner(expectedName), result.getOwner());
assertEquals(expectedName, result.getName());
assertEquals(desc, result.getDesc());
assertEquals(Opcodes.H_INVOKESTATIC, result.getTag());
@@ -211,14 +218,104 @@ class GLSMRedirectorTest {
final ClassNode cn = makeClassWithMethodCall(owner, name, desc);
final boolean changed = new GLSMRedirector().transformClassNode("com.example.TestClass", cn);
assertTrue(changed, owner + "." + name + " should redirect");
- assertEquals(GLSM, firstCall(cn).owner);
+ assertEquals(GLSMRedirector.getTargetOwner(expectedName), firstCall(cn).owner);
assertEquals(expectedName, firstCall(cn).name);
assertTrue(unmappedSeen().isEmpty(), owner + "." + name + " should not be recorded");
return firstCall(cn);
}
+ @Test
+ void ownerIndexAndSearchStrings() {
+ assertFalse(GLSMRedirector.getNamedClassMethodRedirects().containsKey(GLSM));
+ assertTrue(Arrays.asList(new GLSMRedirector().getConstantPoolSearchStrings()).contains(GLSM));
+ assertEquals("com/gtnewhorizons/angelica/glsm/GLSMMatrices", GLSMRedirector.getTargetOwner("glPushMatrix"));
+ }
+
+ @Test
+ void ownerTableMatchesGlsmClasses() {
+ final Map> methods = new TreeMap<>();
+ final Map> fields = new TreeMap<>();
+ for (String type : GlsmClasses.packageClasses()) {
+ if (type.equals(GLSM)) continue;
+ final ClassNode node = GlsmClasses.load(type);
+ final List m = node.methods.stream().filter(x -> isPublicStatic(x.access)).map(x -> x.name).distinct().sorted().toList();
+ final List f = node.fields.stream().filter(x -> isPublicStatic(x.access)).map(x -> x.name).sorted().toList();
+ if (!m.isEmpty()) methods.put(type, m);
+ if (!f.isEmpty()) fields.put(type, f);
+ }
+ final String expected = renderTable("METHODS", methods) + "\n" + renderTable("FIELDS", fields);
+ final String actual = renderTable("METHODS", rows(GLSMOwners.METHODS)) + "\n" + renderTable("FIELDS", rows(GLSMOwners.FIELDS));
+ assertEquals(expected, actual, "GLSMOwners is out of date. Replace its tables with:\n" + expected);
+ }
+
+ @Test
+ void everyRedirectTargetResolves() {
+ final List missing = new ArrayList<>();
+ for (String target : GLSMRedirector.redirectTargets()) {
+ final String owner = GLSMRedirector.getTargetOwner(target);
+ if (GlsmClasses.load(owner).methods.stream().noneMatch(m -> m.name.equals(target) && isPublicStatic(m.access))) missing.add(owner + "." + target);
+ }
+ assertTrue(missing.isEmpty(), "Redirect targets not declared: " + missing);
+ for (String name : GLSMRedirector.CORE_REWRITE_TARGETS) {
+ assertEquals(GLSM, GLSMRedirector.getTargetOwner(name), name);
+ }
+ }
+
+ private static boolean isPublicStatic(int access) {
+ return (access & Opcodes.ACC_PUBLIC) != 0 && (access & Opcodes.ACC_STATIC) != 0 && (access & Opcodes.ACC_SYNTHETIC) == 0;
+ }
+
+ private static Map> rows(String[][] table) {
+ final Map> rows = new LinkedHashMap<>();
+ for (String[] row : table) rows.put(row[0], Arrays.asList(row).subList(1, row.length));
+ return rows;
+ }
+
+ private static String renderTable(String name, Map> rows) {
+ if (rows.isEmpty()) return " static final String[][] " + name + " = {};\n";
+ final StringBuilder out = new StringBuilder(" static final String[][] " + name + " = {\n");
+ for (Map.Entry> row : rows.entrySet()) {
+ out.append(" {\"").append(row.getKey()).append("\",\n");
+ StringBuilder line = new StringBuilder(" ");
+ final List names = row.getValue();
+ for (int i = 0; i < names.size(); i++) {
+ final String token = "\"" + names.get(i) + "\"" + (i == names.size() - 1 ? "}," : ",");
+ if (line.length() > 12 && line.length() + 1 + token.length() > 120) {
+ out.append(line).append('\n');
+ line = new StringBuilder(" ");
+ }
+ if (line.length() > 12) line.append(' ');
+ line.append(token);
+ }
+ out.append(line).append('\n');
+ }
+ return out.append(" };\n").toString();
+ }
+
+ @Test
+ void legacyOwnerIsRewrittenToItsGroup() {
+ final String fogStateDesc = "()Lcom/gtnewhorizons/angelica/glsm/stacks/FogStateStack;";
+ final ClassNode moved = makeClassWithMethodCall(GLSM, "getFogState", fogStateDesc);
+ assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", moved));
+ assertEquals("com/gtnewhorizons/angelica/glsm/GLSMFog", firstCall(moved).owner);
+
+ final ClassNode core = makeClassWithMethodCall(GLSM, "ctx", "()Lcom/gtnewhorizons/angelica/glsm/GLContextState;");
+ assertFalse(new GLSMRedirector().transformClassNode("com.example.TestClass", core));
+ assertEquals(GLSM, firstCall(core).owner);
+
+ final ClassNode field = makeClassWithMethodCall("java/lang/Object", "hashCode", "()I");
+ final FieldInsnNode read = new FieldInsnNode(Opcodes.GETSTATIC, GLSM, "DEFAULT_DRAW_BUFFER", "I");
+ field.methods.get(0).instructions.insert(read);
+ assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", field));
+ assertEquals("com/gtnewhorizons/angelica/glsm/GLSMFramebuffer", read.owner);
+
+ final ClassNode handle = makeClassWithInvokeDynamic(new Handle(Opcodes.H_INVOKESTATIC, GLSM, "getFogState", fogStateDesc, false));
+ assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", handle));
+ assertEquals("com/gtnewhorizons/angelica/glsm/GLSMFog", getResultHandle(handle).getOwner());
+ }
+
private static boolean glsmDeclares(String name, String desc) throws ClassNotFoundException {
- final Class> glsm = Class.forName(GLSM.replace('/', '.'), false, GLSMRedirectorTest.class.getClassLoader());
+ final Class> glsm = Class.forName(GLSMRedirector.getTargetOwner(name).replace('/', '.'), false, GLSMRedirectorTest.class.getClassLoader());
for (Method m : glsm.getDeclaredMethods()) {
final int mods = m.getModifiers();
if (!Modifier.isPublic(mods) || !Modifier.isStatic(mods) || !m.getName().equals(name)) continue;
@@ -270,7 +367,7 @@ class GLSMRedirectorTest {
})
void aliasIsRedirected(String owner, String name, String desc, String expectedName) throws ClassNotFoundException {
assertEquals(desc, assertRedirected(owner, name, desc, expectedName).desc);
- assertTrue(glsmDeclares(expectedName, desc), () -> "GLStateManager lacks " + expectedName + desc);
+ assertTrue(glsmDeclares(expectedName, desc), () -> GLSMRedirector.getTargetOwner(expectedName) + " lacks " + expectedName + desc);
assertTrue(debugSeen().isEmpty());
}
@@ -336,6 +433,11 @@ class GLSMRedirectorTest {
"org/lwjgl/opengl/EXTDirectStateAccess | glNamedFramebufferTextureFaceEXT | (IIIII)V",
"org/lwjgl/opengl/EXTDirectStateAccess | glBindMultiTextureEXT | (III)V",
"org/lwjgl/opengl/ARBShaderImageLoadStore | glBindImageTexture | (IIIZIII)V",
+ "org/lwjgl/opengl/GL30 | glEnablei | (II)V",
+ "org/lwjgl/opengl/GL30 | glDisablei | (II)V",
+ "org/lwjgl/opengl/GL33C | glEnablei | (II)V",
+ "org/lwjgl/opengl/GL33C | glDisablei | (II)V",
+ "org/lwjgl/opengl/GL43 | glCopyImageSubData | (IIIIIIIIIIIIIII)V",
})
void redirectsToADeclaredGlsmTarget(String owner, String name, String desc) throws ClassNotFoundException {
for (boolean aware : new boolean[]{false, true}) {
@@ -343,10 +445,10 @@ class GLSMRedirectorTest {
final ClassNode cn = makeClassWithMethodCall(owner, name, desc);
assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", cn, aware), call);
final MethodInsnNode target = firstCall(cn);
- assertEquals(GLSM, target.owner, call);
+ assertEquals(GLSMRedirector.getTargetOwner(name), target.owner, call);
assertEquals(name, target.name, call);
assertEquals(desc, target.desc, call);
- assertTrue(glsmDeclares(target.name, target.desc), () -> "GLStateManager lacks the target of " + call);
+ assertTrue(glsmDeclares(target.name, target.desc), () -> target.owner + " lacks the target of " + call);
}
assertTrue(unmappedSeen().isEmpty(), () -> "unexpected reports: " + unmappedSeen());
}
@@ -380,7 +482,7 @@ class GLSMRedirectorTest {
assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", cn, true));
- assertEquals(AWARE_SHIM, firstCall(cn).owner, "GLStateManager cannot carry an org.lwjgl-typed descriptor for an aware caller");
+ assertEquals(AWARE_SHIM, firstCall(cn).owner, "GLSM cannot carry an org.lwjgl-typed descriptor for an aware caller");
assertEquals(name, firstCall(cn).name);
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java
index 626edd872..fb7f25348 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.glsm.streaming;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
@@ -46,39 +47,39 @@ class StreamingBindingCacheGLTest {
@ParameterizedTest
@EnumSource(UploadStrategy.class)
void orphanUploadLeavesTheArrayBufferCacheMatchingTheDriver(UploadStrategy strategy) {
- final int other = GLStateManager.glGenBuffers();
+ final int other = GLSMBuffers.glGenBuffers();
final OrphanStreamingBuffer buf = new OrphanStreamingBuffer();
final ByteBuffer data = filled(64);
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
buf.upload(strategy, data);
- assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO(), "first upload respecifies the buffer");
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
+ assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO(), "first upload respecifies the buffer");
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
buf.upload(strategy, data);
- assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO(), "second upload takes the in-capacity path");
+ assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO(), "second upload takes the in-capacity path");
} finally {
memFree(data);
buf.destroy();
- GLStateManager.glDeleteBuffers(other);
+ GLSMBuffers.glDeleteBuffers(other);
}
}
@Test
void uniformRingOrphanPathLeavesTheUniformBufferCacheMatchingTheDriver() {
- final int other = GLStateManager.glGenBuffers();
+ final int other = GLSMBuffers.glGenBuffers();
final ByteBuffer src = filled(64);
UniformRingBuffer ring = null;
try {
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other);
ring = new UniformRingBuffer(1024, 64, true);
assertFalse(ring.isPersistent());
assertEquals(GL11.glGetInteger(GL31.GL_UNIFORM_BUFFER_BINDING), glsmUniformBufferBinding(), "constructor allocation");
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other);
ring.writeBlock(src);
assertEquals(GL11.glGetInteger(GL31.GL_UNIFORM_BUFFER_BINDING), glsmUniformBufferBinding(), "writeBlock");
} finally {
if (ring != null) ring.destroy();
- GLStateManager.glDeleteBuffers(other);
+ GLSMBuffers.glDeleteBuffers(other);
memFree(src);
}
}
@@ -86,19 +87,19 @@ class StreamingBindingCacheGLTest {
@Test
void persistentRingMarksItsOwnBufferAndLeavesTheCacheMatchingTheDriver() {
assumeTrue(RenderSystem.supportsBufferStorage(), "GL4.4+ required");
- final int other = GLStateManager.glGenBuffers();
+ final int other = GLSMBuffers.glGenBuffers();
PersistentStreamingBuffer ring = null;
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
ring = PersistentStreamingBuffer.createOrNull(4096, false);
assertNotNull(ring);
final IntSet persistent = Reflect.getStatic(FfpExtendedAttribs.class, "persistentSources");
assertTrue(persistent.contains(ring.getBufferId()), "the ring buffer is the persistent source");
assertFalse(persistent.contains(other), "the previously bound buffer is not persistent");
- assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO());
+ assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO());
} finally {
if (ring != null) ring.destroy();
- GLStateManager.glDeleteBuffers(other);
+ GLSMBuffers.glDeleteBuffers(other);
}
}
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java
index cb32f0134..36a7393b8 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java
@@ -3,7 +3,7 @@ package com.gtnewhorizons.angelica.glsm.streaming;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizons.angelica.glsm.GLCompatTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import net.minecraft.client.renderer.Tessellator;
import org.junit.jupiter.api.Test;
import org.lwjgl.opengl.GL11;
@@ -35,12 +35,12 @@ public class StreamingDrawVAOBindingTest {
final ByteBuffer data = triangle();
try {
TessellatorStreamingDrawer.drawPacked(data, GL11.GL_TRIANGLES, FLAGS, 3);
- final int afterFirst = GLStateManager.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
+ final int afterFirst = GLSMQueries.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
assertNotEquals(0, afterFirst, "a streaming draw must leave its own VAO bound, not VAO 0");
data.position(0).limit(data.capacity());
TessellatorStreamingDrawer.drawPacked(data, GL11.GL_TRIANGLES, FLAGS, 3);
- final int afterSecond = GLStateManager.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
+ final int afterSecond = GLSMQueries.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
assertEquals(afterFirst, afterSecond, "the same format must reuse the same VAO across draws");
assertEquals(afterSecond, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING), "GLSM's cached binding must match the driver's");
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java
index ed7c46a51..82f7b48f3 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java
@@ -2,7 +2,12 @@ package com.gtnewhorizons.angelica.glsm.streaming;
import com.gtnewhorizons.angelica.glsm.EntityIdsOnlyHandler;
import com.gtnewhorizons.angelica.glsm.GLCompatTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -29,20 +34,20 @@ class TessellatorEntityIdsGLTest {
void setUp() {
previousHandler = EntityIdsOnlyHandler.install();
program = GlTestSupport.program(TessellatorEntityIdsFixture.VERTEX, TessellatorEntityIdsFixture.FRAGMENT);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.glViewport(0, 0, 8, 8);
- GLStateManager.glUseProgram(program);
- GLStateManager.glClearColor(0, 0, 0, 1);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glViewport(0, 0, 8, 8);
+ GLSMPrograms.glUseProgram(program);
+ GLSMBlend.glClearColor(0, 0, 0, 1);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
@AfterEach
void tearDown() {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
- GLStateManager.glPopAttrib();
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
+ GLSMAttribStack.glPopAttrib();
GLSMHooks.immediateExtendedHandler = previousHandler;
}
diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java b/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java
index e1137c5da..07c7790e4 100644
--- a/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java
@@ -1,6 +1,17 @@
package com.gtnewhorizons.angelica.util;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
@@ -109,12 +120,12 @@ public class GLSMUtil {
if (isFFPOnly(glCap)) {
assertAll(message,
() -> assertFalse(driverBoolean(glCap, true), "GL State Mismatch - cache-only cap reached the driver"),
- () -> assertEquals(expected, GLStateManager.glIsEnabled(glCap), "GLSM State Mismatch")
+ () -> assertEquals(expected, GLSMEnable.glIsEnabled(glCap), "GLSM State Mismatch")
);
} else {
assertAll(message,
() -> assertEquals(expected, GL11.glIsEnabled(glCap), "GL State Mismatch"),
- () -> assertEquals(expected, GLStateManager.glIsEnabled(glCap), "GLSM State Mismatch")
+ () -> assertEquals(expected, GLSMEnable.glIsEnabled(glCap), "GLSM State Mismatch")
);
}
}
@@ -127,12 +138,12 @@ public class GLSMUtil {
if (isFFPOnly(glCap)) {
assertAll(message,
() -> assertFalse(driverBoolean(glCap, false), "GL State Mismatch - cache-only cap reached the driver"),
- () -> assertEquals(expected, GLStateManager.glGetBoolean(glCap), "GLSM State Mismatch")
+ () -> assertEquals(expected, GLSMQueries.glGetBoolean(glCap), "GLSM State Mismatch")
);
} else {
assertAll(message,
() -> assertEquals(expected, GL11.glGetBoolean(glCap), "GL State Mismatch"),
- () -> assertEquals(expected, GLStateManager.glGetBoolean(glCap), "GLSM State Mismatch")
+ () -> assertEquals(expected, GLSMQueries.glGetBoolean(glCap), "GLSM State Mismatch")
);
}
}
@@ -142,22 +153,22 @@ public class GLSMUtil {
}
public static void verifyState(int glCap, int expected, String message) {
if (isFFPOnly(glCap)) {
- assertEquals(expected, GLStateManager.glGetInteger(glCap), message + " - GLSM State Mismatch");
+ assertEquals(expected, GLSMQueries.glGetInteger(glCap), message + " - GLSM State Mismatch");
} else {
assertAll(message,
() -> assertEquals(expected, GL11.glGetInteger(glCap), "GL State Mismatch"),
- () -> assertEquals(expected, GLStateManager.glGetInteger(glCap), "GLSM State Mismatch")
+ () -> assertEquals(expected, GLSMQueries.glGetInteger(glCap), "GLSM State Mismatch")
);
}
}
public static void verifyState(int glCap, short expected, String message) {
if (isFFPOnly(glCap)) {
- assertEquals(expected, (short) GLStateManager.glGetInteger(glCap), message + " - GLSM State Mismatch");
+ assertEquals(expected, (short) GLSMQueries.glGetInteger(glCap), message + " - GLSM State Mismatch");
} else {
assertAll(message,
() -> assertEquals(expected, (short) GL11.glGetInteger(glCap), "GL State Mismatch"),
- () -> assertEquals(expected, (short) GLStateManager.glGetInteger(glCap), "GLSM State Mismatch")
+ () -> assertEquals(expected, (short) GLSMQueries.glGetInteger(glCap), "GLSM State Mismatch")
);
}
}
@@ -167,11 +178,11 @@ public class GLSMUtil {
}
public static void verifyState(int glCap, float expected, String message) {
if (isFFPOnly(glCap)) {
- assertEquals(expected, GLStateManager.glGetFloat(glCap), 0.0001f, message + " - GLSM State Mismatch");
+ assertEquals(expected, GLSMQueries.glGetFloat(glCap), 0.0001f, message + " - GLSM State Mismatch");
} else {
assertAll(message,
() -> assertEquals(expected, GL11.glGetFloat(glCap), 0.0001f, "GL State Mismatch"),
- () -> assertEquals(expected, GLStateManager.glGetFloat(glCap), 0.0001f, "GLSM State Mismatch")
+ () -> assertEquals(expected, GLSMQueries.glGetFloat(glCap), 0.0001f, "GLSM State Mismatch")
);
}
}
@@ -184,13 +195,13 @@ public class GLSMUtil {
public static void verifyState(int glCap, int[] expected, String message) {
if (isFFPOnly(glCap)) {
- GLStateManager.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear());
+ GLSMQueries.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear());
IntStream.range(0, expected.length).forEach(i ->
assertEquals(expected[i], glsmIntBuffer.get(i), message + " - GLSM State Mismatch: " + i)
);
} else {
GL11.glGetInteger(glCap, (IntBuffer) glIntBuffer.clear());
- GLStateManager.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear());
+ GLSMQueries.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear());
IntStream.range(0, expected.length).forEach(i -> assertAll(message,
() -> assertEquals(expected[i], glIntBuffer.get(i), "GL State Mismatch: " + i),
() -> assertEquals(expected[i], glsmIntBuffer.get(i), "GLSM State Mismatch: " + i)
@@ -208,13 +219,13 @@ public class GLSMUtil {
public static void verifyState(int glCap, float[] expected, String message) {
if (isFFPOnly(glCap)) {
- GLStateManager.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear());
+ GLSMQueries.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear());
IntStream.range(0, expected.length).forEach(i ->
assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, message + " - GLSM State Mismatch: " + i)
);
} else {
GL11.glGetFloat(glCap, (FloatBuffer) glFloatBuffer.clear());
- GLStateManager.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear());
+ GLSMQueries.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear());
IntStream.range(0, expected.length).forEach(i -> assertAll(message,
() -> assertEquals(expected[i], glFloatBuffer.get(i), 0.0001f, "GL State Mismatch: " + i),
() -> assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, "GLSM State Mismatch: " + i)
@@ -231,13 +242,13 @@ public class GLSMUtil {
public static void verifyState(int glCap, boolean[] expected, String message) {
if (isFFPOnly(glCap)) {
- GLStateManager.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear());
+ GLSMQueries.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear());
IntStream.range(0, expected.length).forEach(i ->
assertEquals(expected[i] ? GL11.GL_TRUE : GL11.GL_FALSE, glsmByteBuffer.get(i), message + " - GLSM State Mismatch: " + i)
);
} else {
GL11.glGetBoolean(glCap, (ByteBuffer) glByteBuffer.clear());
- GLStateManager.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear());
+ GLSMQueries.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear());
IntStream.range(0, expected.length).forEach(i -> assertAll(message,
() -> assertEquals(expected[i] ? GL11.GL_TRUE : GL11.GL_FALSE, glByteBuffer.get(i), "GL State Mismatch: " + i),
() -> assertEquals(expected[i] ? GL11.GL_TRUE : GL11.GL_FALSE, glsmByteBuffer.get(i), "GLSM State Mismatch: " + i)
@@ -248,7 +259,7 @@ public class GLSMUtil {
/** Light params are FFP-only — verify GLSM cache only. */
public static void verifyLightState(int glLight, int pname, float[] expected, String message) {
- GLStateManager.glGetLight(glLight, pname, (FloatBuffer) glsmFloatBuffer.clear());
+ GLSMLighting.glGetLight(glLight, pname, (FloatBuffer) glsmFloatBuffer.clear());
IntStream.range (0, expected.length).forEach(i ->
assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, message + " - GLSM State Mismatch: " + i)
);
@@ -256,7 +267,7 @@ public class GLSMUtil {
/** Material params are FFP-only — verify GLSM cache only. */
public static void verifyMaterialState(int face, int pname, float[] expected, String message) {
- GLStateManager.glGetMaterial(face, pname, (FloatBuffer) glsmFloatBuffer.clear());
+ GLSMLighting.glGetMaterial(face, pname, (FloatBuffer) glsmFloatBuffer.clear());
IntStream.range (0, expected.length).forEach(i ->
assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, message + " - GLSM State Mismatch: " + i)
);
@@ -268,122 +279,122 @@ public class GLSMUtil {
*/
public static void resetGLState() {
// Disable all enable/disable states (except those with non-false defaults)
- GLStateManager.disableAlphaTest();
- GLStateManager.glDisable(GL11.GL_AUTO_NORMAL);
- GLStateManager.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMEnable.glDisable(GL11.GL_AUTO_NORMAL);
+ GLSMBlend.disableBlend();
// Disable all clip planes (using cached MAX_CLIP_PLANES)
for(int i = 0; i < CompatLimits.MAX_CLIP_PLANES; i++) {
- GLStateManager.glDisable(GL11.GL_CLIP_PLANE0 + i);
+ GLSMEnable.glDisable(GL11.GL_CLIP_PLANE0 + i);
}
- GLStateManager.disableColorMaterial();
- GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.disableCull();
- GLStateManager.disableDepthTest();
+ GLSMLighting.disableColorMaterial();
+ GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMRasterizer.disableCull();
+ GLSMDepthStencilAlpha.disableDepthTest();
// GL_DITHER defaults to true
- GLStateManager.glEnable(GL11.GL_DITHER);
- GLStateManager.disableFog();
- GLStateManager.glDisable(GL11.GL_INDEX_LOGIC_OP);
- GLStateManager.disableLighting();
+ GLSMEnable.glEnable(GL11.GL_DITHER);
+ GLSMFog.disableFog();
+ GLSMEnable.glDisable(GL11.GL_INDEX_LOGIC_OP);
+ GLSMLighting.disableLighting();
// Disable all lights (using cached MAX_LIGHTS)
for(int i = 0; i < CompatLimits.MAX_LIGHTS; i++) {
- GLStateManager.disableLight(i);
+ GLSMLighting.disableLight(i);
}
- GLStateManager.glDisable(GL11.GL_LINE_SMOOTH);
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMEnable.glDisable(GL11.GL_LINE_SMOOTH);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
// Disable all MAP1 evaluators (DRY loop)
for(int state : MAP1_STATES) {
- GLStateManager.glDisable(state);
+ GLSMEnable.glDisable(state);
}
// Disable all MAP2 evaluators (DRY loop)
for(int state : MAP2_STATES) {
- GLStateManager.glDisable(state);
+ GLSMEnable.glDisable(state);
}
// GL_MULTISAMPLE defaults to true (but may vary by driver)
// We'll query the actual default rather than assume
if(GL11.glIsEnabled(GL13.GL_MULTISAMPLE)) {
- GLStateManager.glEnable(GL13.GL_MULTISAMPLE);
+ GLSMEnable.glEnable(GL13.GL_MULTISAMPLE);
} else {
- GLStateManager.glDisable(GL13.GL_MULTISAMPLE);
+ GLSMEnable.glDisable(GL13.GL_MULTISAMPLE);
}
- GLStateManager.glDisable(GL11.GL_NORMALIZE);
- GLStateManager.glDisable(GL11.GL_POINT_SMOOTH);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_POINT);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_LINE);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glDisable(GL11.GL_POLYGON_SMOOTH);
- GLStateManager.glDisable(GL11.GL_POLYGON_STIPPLE);
- GLStateManager.disableRescaleNormal();
- GLStateManager.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE);
- GLStateManager.glDisable(GL13.GL_SAMPLE_ALPHA_TO_ONE);
- GLStateManager.glDisable(GL13.GL_SAMPLE_COVERAGE);
- GLStateManager.disableScissorTest();
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMEnable.glDisable(GL11.GL_NORMALIZE);
+ GLSMEnable.glDisable(GL11.GL_POINT_SMOOTH);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_POINT);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_LINE);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_SMOOTH);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_STIPPLE);
+ GLSMLighting.disableRescaleNormal();
+ GLSMEnable.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE);
+ GLSMEnable.glDisable(GL13.GL_SAMPLE_ALPHA_TO_ONE);
+ GLSMEnable.glDisable(GL13.GL_SAMPLE_COVERAGE);
+ GLSMRasterizer.disableScissorTest();
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
// Reset texture state for all units (using cached MAX_TEXTURE_UNITS)
for(int i = 0; i < CompatLimits.MAX_TEXTURE_UNITS; i++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glDisable(GL11.GL_TEXTURE_1D);
- GLStateManager.disableTexture(); // GL_TEXTURE_2D
- GLStateManager.glDisable(GL12.GL_TEXTURE_3D);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_1D);
+ GLSMTextures.disableTexture(); // GL_TEXTURE_2D
+ GLSMEnable.glDisable(GL12.GL_TEXTURE_3D);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q);
}
// Reset to texture unit 0
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
// Reset matrix mode to default
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
// Reset color to white
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
// Reset material colors to defaults (fixes GL_COLOR_MATERIAL side effects)
FloatBuffer materialBuffer = BufferUtils.createFloatBuffer(4);
materialBuffer.put(0.2F).put(0.2F).put(0.2F).put(1.0F).flip();
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, materialBuffer);
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, materialBuffer);
materialBuffer.clear();
materialBuffer.put(0.8F).put(0.8F).put(0.8F).put(1.0F).flip();
- GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_DIFFUSE, materialBuffer);
+ GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_DIFFUSE, materialBuffer);
// Reset draw buffer
- GLStateManager.glDrawBuffer(GLStateManager.DEFAULT_DRAW_BUFFER);
+ GLSMFramebuffer.glDrawBuffer(GLSMFramebuffer.DEFAULT_DRAW_BUFFER);
// Reset line state
- GLStateManager.glLineWidth(1.0f);
+ GLSMRasterizer.glLineWidth(1.0f);
// Reset point state
- GLStateManager.glPointSize(1.0f);
+ GLSMRasterizer.glPointSize(1.0f);
// Reset polygon state
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glFrontFace(GL11.GL_CCW);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
// Reset stencil state
- GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 0, 0xFFFFFFFF);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
- GLStateManager.glStencilMask(0xFFFFFFFF);
- GLStateManager.glClearStencil(0);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 0, 0xFFFFFFFF);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
+ GLSMDepthStencilAlpha.glStencilMask(0xFFFFFFFF);
+ GLSMDepthStencilAlpha.glClearStencil(0);
}
public static void setClientState(int glCap, boolean state) {
if (state) {
- GLStateManager.glEnableClientState(glCap);
+ GLSMVertexInput.glEnableClientState(glCap);
} else {
- GLStateManager.glDisableClientState(glCap);
+ GLSMVertexInput.glDisableClientState(glCap);
}
}
}
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java
index 042637f7f..763f317af 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java
@@ -14,7 +14,7 @@ public final class EntityIdsOnlyHandler implements ImmediateExtendedAttribHandle
@Override public boolean wantsExtended() { return false; }
@Override public boolean wantsTangent() { return false; }
- @Override public boolean wantsEntityIds() { return GLStateManager.getActiveProgram() != 0; }
+ @Override public boolean wantsEntityIds() { return GLSMPrograms.getActiveProgram() != 0; }
@Override public boolean wantsExtendedCapture() { return false; }
@Override public boolean wantsFaceNormals() { return false; }
@Override public void writeFaceNormals(int[] rawBuffer, int vertexCount) {}
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java
index 29e3710d8..4c75ca694 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java
@@ -149,7 +149,7 @@ public class GLSMExtension implements BeforeAllCallback, BeforeEachCallback, Aft
// Force-sync VAO binding. Tests may unbind via raw GL, desynchronizing GLSM's cache.
// Invalidate the cache so glBindVertexArray(0) actually issues the GL call.
GLStateManager.ctx().boundVAO = -1;
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
while (GL11.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH) > EXPECTED_MODELVIEW_STACK_DEPTH) {
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java
index a4247160b..dace7e8ec 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java
@@ -23,24 +23,24 @@ public final class GlTestSupport {
}
public static int compile(int type, String source) {
- final int shader = GLStateManager.glCreateShader(type);
- GLStateManager.glShaderSource(shader, source);
- GLStateManager.glCompileShader(shader);
- if (GLStateManager.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == 0) {
- fail("test shader failed to compile:\n" + GLStateManager.glGetShaderInfoLog(shader, 4096) + "\n\n" + source);
+ final int shader = GLSMPrograms.glCreateShader(type);
+ GLSMPrograms.glShaderSource(shader, source);
+ GLSMPrograms.glCompileShader(shader);
+ if (GLSMPrograms.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == 0) {
+ fail("test shader failed to compile:\n" + GLSMPrograms.glGetShaderInfoLog(shader, 4096) + "\n\n" + source);
}
return shader;
}
/** Links and deletes the two shaders. */
public static int link(int vs, int fs) {
- final int p = GLStateManager.glCreateProgram();
- GLStateManager.glAttachShader(p, vs);
- GLStateManager.glAttachShader(p, fs);
- GLStateManager.glLinkProgram(p);
- assertNotEquals(0, GLStateManager.glGetProgrami(p, GL20.GL_LINK_STATUS), () -> "test program must link: " + GLStateManager.glGetProgramInfoLog(p, 4096));
- GLStateManager.glDeleteShader(vs);
- GLStateManager.glDeleteShader(fs);
+ final int p = GLSMPrograms.glCreateProgram();
+ GLSMPrograms.glAttachShader(p, vs);
+ GLSMPrograms.glAttachShader(p, fs);
+ GLSMPrograms.glLinkProgram(p);
+ assertNotEquals(0, GLSMPrograms.glGetProgrami(p, GL20.GL_LINK_STATUS), () -> "test program must link: " + GLSMPrograms.glGetProgramInfoLog(p, 4096));
+ GLSMPrograms.glDeleteShader(vs);
+ GLSMPrograms.glDeleteShader(fs);
return p;
}
@@ -66,7 +66,7 @@ public final class GlTestSupport {
/** GLSM's answer for a 16-float matrix pname. */
public static FloatBuffer matrix(int pname) {
final FloatBuffer buf = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(pname, buf);
+ GLSMQueries.glGetFloat(pname, buf);
return buf;
}
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java
index aadf94655..1e0544433 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java
@@ -43,21 +43,21 @@ public final class LegacyQueryFixture {
public static void setEnabled(int cap, boolean on) {
if (on) {
- GLStateManager.glEnable(cap);
+ GLSMEnable.glEnable(cap);
} else {
- GLStateManager.glDisable(cap);
+ GLSMEnable.glDisable(cap);
}
}
public static void popAttribTo(int base) {
- while (GLStateManager.getAttribDepth() > base) {
- GLStateManager.glPopAttrib();
+ while (GLSMAttribStack.getAttribDepth() > base) {
+ GLSMAttribStack.glPopAttrib();
}
}
public static void drainClientAttribStack() {
- while (GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH) > 0) {
- GLStateManager.glPopClientAttrib();
+ while (GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH) > 0) {
+ GLSMAttribStack.glPopClientAttrib();
}
}
@@ -65,20 +65,20 @@ public final class LegacyQueryFixture {
public static void assertEnableRoundTrip(int cap, boolean clientState) {
final String name = hex(cap);
if (clientState) {
- GLStateManager.glEnableClientState(cap);
+ GLSMVertexInput.glEnableClientState(cap);
} else {
- GLStateManager.glEnable(cap);
+ GLSMEnable.glEnable(cap);
}
- assertTrue(GLStateManager.glIsEnabled(cap), "enabled isEnabled " + name);
- assertTrue(GLStateManager.glGetBoolean(cap), "enabled getBoolean " + name);
- assertEquals(1, GLStateManager.glGetInteger(cap), "enabled getInteger " + name);
+ assertTrue(GLSMEnable.glIsEnabled(cap), "enabled isEnabled " + name);
+ assertTrue(GLSMQueries.glGetBoolean(cap), "enabled getBoolean " + name);
+ assertEquals(1, GLSMQueries.glGetInteger(cap), "enabled getInteger " + name);
if (clientState) {
- GLStateManager.glDisableClientState(cap);
+ GLSMVertexInput.glDisableClientState(cap);
} else {
- GLStateManager.glDisable(cap);
+ GLSMEnable.glDisable(cap);
}
- assertFalse(GLStateManager.glIsEnabled(cap), "disabled isEnabled " + name);
- assertFalse(GLStateManager.glGetBoolean(cap), "disabled getBoolean " + name);
- assertEquals(0, GLStateManager.glGetInteger(cap), "disabled getInteger " + name);
+ assertFalse(GLSMEnable.glIsEnabled(cap), "disabled isEnabled " + name);
+ assertFalse(GLSMQueries.glGetBoolean(cap), "disabled getBoolean " + name);
+ assertEquals(0, GLSMQueries.glGetInteger(cap), "disabled getInteger " + name);
}
}
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java
index 646848da7..d0431ba6e 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java
@@ -24,58 +24,58 @@ public final class ReadbackFixture {
}
public static int colorFbo(int internalFormat, int format, int type, ByteBuffer data) {
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, type, data);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, type, data);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
return fbo;
}
public static int depthStencilFbo() {
final int fbo = colorFbo(GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE);
- final int rb = GLStateManager.glGenRenderbuffers();
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE);
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, rb);
+ final int rb = GLSMFramebuffer.glGenRenderbuffers();
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE);
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, rb);
return fbo;
}
public static void release(int fbo) {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
resetPack();
}
public static void clearColor(float r, float g, float b, float a) {
- GLStateManager.glClearColor(r, g, b, a);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(r, g, b, a);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
public static void clearTopHalf(float r, float g, float b, float a) {
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, SIZE / 2, SIZE, SIZE / 2);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, SIZE / 2, SIZE, SIZE / 2);
clearColor(r, g, b, a);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
}
public static void resetPack() {
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_FALSE);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_FALSE);
}
public static ByteBuffer read(int format, int type, int bytes) {
final ByteBuffer out = BufferUtils.createByteBuffer(bytes);
for (int i = 0; i < bytes; i++) out.put(i, (byte) 0x7E);
- GLStateManager.glReadPixels(0, 0, SIZE, SIZE, format, type, out);
+ GLSMFramebuffer.glReadPixels(0, 0, SIZE, SIZE, format, type, out);
return out.order(ByteOrder.nativeOrder());
}
@@ -138,14 +138,14 @@ public final class ReadbackFixture {
clearColor(51 / 255f, 102 / 255f, 153 / 255f, 204 / 255f);
clearTopHalf(1f, 0f, 0f, 1f);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
final ByteBuffer rgb = read(GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, SIZE * SIZE * 3);
assertBytes(rgb, (SIZE - 1) * SIZE * 3, new int[] { 255, 0, 0 }, "PACK_ALIGNMENT 1 tightly packs RGB rows");
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
- GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 6);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 1);
- GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 2);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 6);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 2);
final int rowBytes = 6 * 4;
final ByteBuffer skipped = read(GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, rowBytes * (SIZE + 2));
assertBytes(skipped, 0, new int[] { 0x7E, 0x7E, 0x7E, 0x7E }, "skipped rows untouched");
@@ -155,7 +155,7 @@ public final class ReadbackFixture {
assertBytes(skipped, 2 * rowBytes + 4 + SIZE * 4, new int[] { 0x7E, 0x7E, 0x7E, 0x7E }, "row padding untouched");
resetPack();
- GLStateManager.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_TRUE);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_TRUE);
final ByteBuffer swapped = read(GL11.GL_RGBA, GL30.GL_HALF_FLOAT, SIZE * SIZE * 8);
assertBytes(swapped, 0, new int[] { 0x32, 0x66 }, "SWAP_BYTES on HALF_FLOAT");
resetPack();
@@ -166,16 +166,16 @@ public final class ReadbackFixture {
public static void pixelPackBuffer() {
final int fbo = colorFbo(GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE);
clearColor(51 / 255f, 102 / 255f, 153 / 255f, 204 / 255f);
- final int pbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, pbo);
- GLStateManager.glBufferData(GL21.GL_PIXEL_PACK_BUFFER, 16 + SIZE * SIZE * 4, GL15.GL_STREAM_READ);
- GLStateManager.glReadPixels(0, 0, SIZE, SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, 16L);
- final ByteBuffer mapped = GLStateManager.glMapBuffer(GL21.GL_PIXEL_PACK_BUFFER, GL15.GL_READ_ONLY);
+ final int pbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, pbo);
+ GLSMBuffers.glBufferData(GL21.GL_PIXEL_PACK_BUFFER, 16 + SIZE * SIZE * 4, GL15.GL_STREAM_READ);
+ GLSMFramebuffer.glReadPixels(0, 0, SIZE, SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, 16L);
+ final ByteBuffer mapped = GLSMBuffers.glMapBuffer(GL21.GL_PIXEL_PACK_BUFFER, GL15.GL_READ_ONLY);
assertTrue(mapped != null, "PBO map");
assertBytes(mapped, 16, new int[] { 51, 102, 153, 204 }, "PBO readPixels at offset 16");
- GLStateManager.glUnmapBuffer(GL21.GL_PIXEL_PACK_BUFFER);
- GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
- GLStateManager.glDeleteBuffers(pbo);
+ GLSMBuffers.glUnmapBuffer(GL21.GL_PIXEL_PACK_BUFFER);
+ GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(pbo);
release(fbo);
}
@@ -237,19 +237,19 @@ public final class ReadbackFixture {
public static void depthStencil() {
final int fbo = depthStencilFbo();
- GLStateManager.glDepthMask(true);
- GLStateManager.glStencilMask(0xFF);
- GLStateManager.glClearDepth(0.25);
- GLStateManager.glClearStencil(0xC3);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, SIZE / 2, SIZE, SIZE / 2);
- GLStateManager.glClearDepth(0.75);
- GLStateManager.glClearStencil(0x5A);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glClearDepth(1.0);
- GLStateManager.glClearStencil(0);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
+ GLSMDepthStencilAlpha.glClearDepth(0.25);
+ GLSMDepthStencilAlpha.glClearStencil(0xC3);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, SIZE / 2, SIZE, SIZE / 2);
+ GLSMDepthStencilAlpha.glClearDepth(0.75);
+ GLSMDepthStencilAlpha.glClearStencil(0x5A);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
+ GLSMDepthStencilAlpha.glClearStencil(0);
final ByteBuffer depth = read(GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, SIZE * SIZE * 4);
assertEquals(0.25f, depth.getFloat(0), 1e-6f, "depth bottom row as FLOAT");
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java
index d4e64bbea..fd4c94119 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java
@@ -1,7 +1,16 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
@@ -53,66 +62,66 @@ public final class CubeParityFixture {
private static void setupCamera(boolean conformal) {
modelView = conformal ? MODELVIEW_CONFORMAL : MODELVIEW;
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
final FloatBuffer mv = BufferUtils.createFloatBuffer(16);
mv.put(modelView).flip();
- GLStateManager.glLoadMatrix(mv);
+ GLSMMatrices.glLoadMatrix(mv);
}
public static void setupScene(boolean lightmap, boolean lit) {
- GLStateManager.glDisable(GL11.GL_FOG);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMEnable.glDisable(GL11.GL_FOG);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
setupCamera(lit);
if (lit) {
enableDirectionalLight();
} else {
- GLStateManager.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
}
netTexture = createNetTexture();
if (lightmap) {
lightmapTexture = createNetTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glScalef(0.00390625f, 0.00390625f, 0.00390625f);
- GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, netTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glScalef(0.00390625f, 0.00390625f, 0.00390625f);
+ GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, netTexture);
}
}
private static void enableDirectionalLight() {
final FloatBuffer buf = BufferUtils.createFloatBuffer(4);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_NORMALIZE);
- GLStateManager.glEnable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT1);
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, fill(buf, 0.2f, 0.2f, 0.2f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, fill(buf, 0.375f, 0.75f, 0.5f, 0.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, fill(buf, 1.0f, 1.0f, 1.0f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_NORMALIZE);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT1);
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, fill(buf, 0.2f, 0.2f, 0.2f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, fill(buf, 0.375f, 0.75f, 0.5f, 0.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, fill(buf, 1.0f, 1.0f, 1.0f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
}
public static void disableDirectionalLight() {
- GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_NORMALIZE);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_NORMALIZE);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
}
private static FloatBuffer fill(FloatBuffer buf, float x, float y, float z, float w) {
@@ -122,11 +131,11 @@ public final class CubeParityFixture {
}
private static int createNetTexture() {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
final ByteBuffer texels = BufferUtils.createByteBuffer(TEX_WIDTH * TEX_HEIGHT * 4);
for (int y = 0; y < TEX_HEIGHT; y++) {
for (int x = 0; x < TEX_WIDTH; x++) {
@@ -137,8 +146,8 @@ public final class CubeParityFixture {
}
}
texels.flip();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_WIDTH, TEX_HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_WIDTH, TEX_HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
return id;
}
@@ -179,30 +188,30 @@ public final class CubeParityFixture {
private static int uploadQuads(int vbo, Spec[] specs, boolean lightmap) {
final ByteBuffer data = buildQuadData(specs);
- if (vbo == 0) vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ if (vbo == 0) vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, REF_STRIDE, 0);
FfpFixture.attrib(1, 4, GL11.GL_UNSIGNED_BYTE, true, REF_STRIDE, 12);
FfpFixture.attrib(2, 2, GL11.GL_FLOAT, false, REF_STRIDE, 16);
if (lightmap) {
FfpFixture.attrib(3, 2, GL11.GL_FLOAT, false, REF_STRIDE, 24);
} else {
- GLStateManager.glDisableVertexAttribArray(3);
+ GLSMVertexInput.glDisableVertexAttribArray(3);
}
FfpFixture.attrib(4, 3, GL11.GL_FLOAT, false, REF_STRIDE, 32);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
return vbo;
}
public static void drawReference(Spec[] specs, boolean lightmap) {
- if (referenceVao == 0) referenceVao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(referenceVao);
+ if (referenceVao == 0) referenceVao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(referenceVao);
referenceVbo = uploadQuads(referenceVbo, specs, lightmap);
VAOManager.setCurrentVertexFlags(UnitCubeMesh.VERTEX_FLAGS | (lightmap ? VertexFlags.BRIGHTNESS_BIT : 0));
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, specs.length * 24);
- GLStateManager.glBindVertexArray(0);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, specs.length * 24);
+ GLSMVertexInput.glBindVertexArray(0);
}
private static float[] corners(Spec spec) {
@@ -264,18 +273,18 @@ public final class CubeParityFixture {
}
records.position(0).limit(specs.length * CubeInstancedAttribs.STRIDE);
- GLStateManager.glBindVertexArray(UnitCubeMesh.vao());
+ GLSMVertexInput.glBindVertexArray(UnitCubeMesh.vao());
VAOManager.setCurrentVertexFlags(UnitCubeMesh.VERTEX_FLAGS);
- if (instanceVbo == 0) instanceVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW);
+ if (instanceVbo == 0) instanceVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW);
CubeInstancedAttribs.pointInstanceAttribs(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.setFfpInstancing(Instancing.CUBE);
- GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, specs.length);
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ GLSMPrograms.setFfpInstancing(Instancing.CUBE);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, specs.length);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
}
public static void assertPixelParity(int[] reference, int[] instanced, int size, int background, IntFunction describe) {
@@ -284,23 +293,23 @@ public final class CubeParityFixture {
public static void deleteResources() {
if (instanceVbo != 0) {
- GLStateManager.glDeleteBuffers(instanceVbo);
+ GLSMBuffers.glDeleteBuffers(instanceVbo);
instanceVbo = 0;
}
if (referenceVbo != 0) {
- GLStateManager.glDeleteBuffers(referenceVbo);
+ GLSMBuffers.glDeleteBuffers(referenceVbo);
referenceVbo = 0;
}
if (referenceVao != 0) {
- GLStateManager.glDeleteVertexArrays(referenceVao);
+ GLSMVertexInput.glDeleteVertexArrays(referenceVao);
referenceVao = 0;
}
if (netTexture != 0) {
- GLStateManager.glDeleteTextures(netTexture);
+ GLSMTextures.glDeleteTextures(netTexture);
netTexture = 0;
}
if (lightmapTexture != 0) {
- GLStateManager.glDeleteTextures(lightmapTexture);
+ GLSMTextures.glDeleteTextures(lightmapTexture);
lightmapTexture = 0;
}
UnitCubeMesh.delete();
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java
index 18728a196..d19e06fb8 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java
@@ -1,6 +1,15 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
@@ -61,29 +70,29 @@ public final class FfpFixture {
public static void build(float spacing) {
program = buildProgram();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
buildTemplate();
buildInstances(new float[] { -spacing, 0.0f, spacing }, new int[] { -1, 7, 50020 });
}
public static void draw() {
- GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, INSTANCES);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, INSTANCES);
}
public static void delete() {
- GLStateManager.glUseProgram(0);
- if (program != 0) { GLStateManager.glDeleteProgram(program); program = 0; }
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- if (templateVbo != 0) { GLStateManager.glDeleteBuffers(templateVbo); templateVbo = 0; }
- if (instanceVbo != 0) { GLStateManager.glDeleteBuffers(instanceVbo); instanceVbo = 0; }
- GLStateManager.glBindVertexArray(0);
- if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; }
+ GLSMPrograms.glUseProgram(0);
+ if (program != 0) { GLSMPrograms.glDeleteProgram(program); program = 0; }
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ if (templateVbo != 0) { GLSMBuffers.glDeleteBuffers(templateVbo); templateVbo = 0; }
+ if (instanceVbo != 0) { GLSMBuffers.glDeleteBuffers(instanceVbo); instanceVbo = 0; }
+ GLSMVertexInput.glBindVertexArray(0);
+ if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; }
}
private static void buildTemplate() {
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
final ByteBuffer quad = BufferUtils.createByteBuffer(4 * 12);
putVertex(quad, -0.15f, -0.8f);
@@ -92,12 +101,12 @@ public final class FfpFixture {
putVertex(quad, -0.15f, 0.8f);
quad.flip();
- templateVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ templateVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private static void putVertex(ByteBuffer buf, float x, float y) {
@@ -115,12 +124,12 @@ public final class FfpFixture {
}
instances.position(0).limit(entities.length * InstancedAttribs.STRIDE);
- instanceVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW);
+ instanceVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW);
InstancedAttribs.enableHeadArrays();
InstancedAttribs.pointTemplate(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private static int buildProgram() {
@@ -129,18 +138,18 @@ public final class FfpFixture {
}
public static void attrib(int loc, int size, int type, boolean normalized, int stride, int offset) {
- GLStateManager.glEnableVertexAttribArray(loc);
- GLStateManager.glVertexAttribPointer(loc, size, type, normalized, stride, offset);
+ GLSMVertexInput.glEnableVertexAttribArray(loc);
+ GLSMVertexInput.glVertexAttribPointer(loc, size, type, normalized, stride, offset);
}
public static void clear() {
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
public static int[] readRegion(int size) {
final ByteBuffer pixels = BufferUtils.createByteBuffer(size * size * 4);
- GLStateManager.glReadPixels(0, 0, size, size, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMFramebuffer.glReadPixels(0, 0, size, size, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
final int[] out = new int[size * size];
for (int i = 0; i < out.length; i++) {
out[i] = pixels.getInt(i * 4);
@@ -150,22 +159,22 @@ public final class FfpFixture {
public static int[] readPixel(int x, int y) {
final ByteBuffer pixel = BufferUtils.createByteBuffer(4);
- GLStateManager.glReadPixels(x, y, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixel);
+ GLSMFramebuffer.glReadPixels(x, y, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixel);
return new int[] { pixel.get(0) & 0xFF, pixel.get(1) & 0xFF, pixel.get(2) & 0xFF, pixel.get(3) & 0xFF };
}
public static int solidTexture(int r, int g, int b, int a) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
final ByteBuffer texels = BufferUtils.createByteBuffer(2 * 2 * 4);
for (int i = 0; i < 4; i++) {
texels.put((byte) r).put((byte) g).put((byte) b).put((byte) a);
}
texels.flip();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
return id;
}
@@ -234,28 +243,28 @@ public final class FfpFixture {
}
public static void resetFfpState() {
- GLStateManager.setFfpInstancing(Instancing.NONE);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
final ShaderManager sm = ShaderManager.getInstance();
if (sm.isActive()) sm.deactivate();
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDepthMask(true);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
}
}
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java
index f6e3152d5..bd55a1228 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java
@@ -1,6 +1,12 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
@@ -56,41 +62,41 @@ public final class LogicOpFixture {
}
public static void clearToDst() {
- GLStateManager.glClearColor(DST_R / 255f, DST_G / 255f, DST_B / 255f, DST_A / 255f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMBlend.glClearColor(DST_R / 255f, DST_G / 255f, DST_B / 255f, DST_A / 255f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
public static void drawQuad(int op, int[] src) {
- GLStateManager.glEnable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glLogicOp(op);
+ GLSMEnable.glEnable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMBlend.glLogicOp(op);
quad(src);
- GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glLogicOp(GL11.GL_COPY);
+ GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMBlend.glLogicOp(GL11.GL_COPY);
}
public static void quad(int[] src) {
if (vao == 0) {
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
final FloatBuffer positions = BufferUtils.createFloatBuffer(12);
positions.put(new float[] { -1f, -1f, 0f, 1f, -1f, 0f, 1f, 1f, 0f, -1f, 1f, 0f }).flip();
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW);
FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 12, 0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
VAOManager.setCurrentVertexFlags(0);
- GLStateManager.glColor4f(src[0] / 255f, src[1] / 255f, src[2] / 255f, src[3] / 255f);
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(src[0] / 255f, src[1] / 255f, src[2] / 255f, src[3] / 255f);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
public static void deleteResources() {
- if (vbo != 0) { GLStateManager.glDeleteBuffers(vbo); vbo = 0; }
- if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; }
+ if (vbo != 0) { GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; }
+ if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; }
}
public static String label(int op, int[] src) {
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java
index 3b0b38a43..31c495d83 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java
@@ -1,7 +1,13 @@
package com.gtnewhorizons.angelica.glsm.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
@@ -76,19 +82,19 @@ public final class ParticleParityFixture {
}
private static int createCheckerTexture() {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
final ByteBuffer texels = BufferUtils.createByteBuffer(2 * 2 * 4);
putTexel(texels, 255, 32, 32);
putTexel(texels, 32, 255, 32);
putTexel(texels, 32, 32, 255);
putTexel(texels, 255, 255, 32);
texels.flip();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
return id;
}
@@ -97,28 +103,28 @@ public final class ParticleParityFixture {
}
public static void setupScene(boolean textureMatrix) {
- GLStateManager.glDisable(GL11.GL_FOG);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMEnable.glDisable(GL11.GL_FOG);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
checkerTexture = createCheckerTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, checkerTexture);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, checkerTexture);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
if (textureMatrix) {
- GLStateManager.glTranslatef(0.1f, 0.1f, 0.0f);
- GLStateManager.glScalef(0.8f, 0.8f, 1.0f);
+ GLSMMatrices.glTranslatef(0.1f, 0.1f, 0.0f);
+ GLSMMatrices.glScalef(0.8f, 0.8f, 1.0f);
}
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
private static ByteBuffer buildReferenceData(Particle[] particles, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
@@ -149,19 +155,19 @@ public final class ParticleParityFixture {
public static void drawReference(Particle[] particles, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
final ByteBuffer data = buildReferenceData(particles, rotX, rotXZ, rotZ, rotYZ, rotXY);
- if (referenceVao == 0) referenceVao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(referenceVao);
- if (referenceVbo == 0) referenceVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, referenceVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ if (referenceVao == 0) referenceVao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(referenceVao);
+ if (referenceVbo == 0) referenceVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, referenceVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, REF_STRIDE, 0);
FfpFixture.attrib(1, 4, GL11.GL_UNSIGNED_BYTE, true, REF_STRIDE, 12);
FfpFixture.attrib(2, 2, GL11.GL_FLOAT, false, REF_STRIDE, 16);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
VAOManager.setCurrentVertexFlags(VertexFlags.COLOR_BIT | VertexFlags.TEXTURE_BIT);
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, particles.length * 4);
- GLStateManager.glBindVertexArray(0);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, particles.length * 4);
+ GLSMVertexInput.glBindVertexArray(0);
}
public static void drawInstanced(Particle[] particles, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
@@ -176,18 +182,18 @@ public final class ParticleParityFixture {
}
records.position(0).limit(particles.length * ParticleInstancedAttribs.STRIDE);
- GLStateManager.glBindVertexArray(ParticleQuadMesh.vao());
+ GLSMVertexInput.glBindVertexArray(ParticleQuadMesh.vao());
VAOManager.setCurrentVertexFlags(ParticleQuadMesh.VERTEX_FLAGS);
- if (instanceVbo == 0) instanceVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW);
+ if (instanceVbo == 0) instanceVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW);
ParticleInstancedAttribs.pointInstanceAttribs(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.setFfpInstancing(Instancing.PARTICLE);
- GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, particles.length);
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ GLSMPrograms.setFfpInstancing(Instancing.PARTICLE);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, particles.length);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
}
public static void assertPixelParity(int[] reference, int[] instanced, int size, int background, IntFunction describe) {
@@ -196,19 +202,19 @@ public final class ParticleParityFixture {
public static void deleteResources() {
if (instanceVbo != 0) {
- GLStateManager.glDeleteBuffers(instanceVbo);
+ GLSMBuffers.glDeleteBuffers(instanceVbo);
instanceVbo = 0;
}
if (referenceVbo != 0) {
- GLStateManager.glDeleteBuffers(referenceVbo);
+ GLSMBuffers.glDeleteBuffers(referenceVbo);
referenceVbo = 0;
}
if (referenceVao != 0) {
- GLStateManager.glDeleteVertexArrays(referenceVao);
+ GLSMVertexInput.glDeleteVertexArrays(referenceVao);
referenceVao = 0;
}
if (checkerTexture != 0) {
- GLStateManager.glDeleteTextures(checkerTexture);
+ GLSMTextures.glDeleteTextures(checkerTexture);
checkerTexture = 0;
}
ParticleQuadMesh.delete();
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java
index de8c2e5c4..60afc2eb9 100644
--- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.streaming;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
import net.minecraft.client.renderer.Tessellator;
import org.lwjgl.opengl.GL11;
@@ -30,21 +30,21 @@ public final class TessellatorEntityIdsFixture {
public static void drawIdsChangedMidBatch() {
draw(() -> {
- GLStateManager.setEntityIds(-1, 0, 7);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, 7);
startQuads();
addQuad(-1.0f, 0.0f);
- GLStateManager.setEntityIds(-1, 0, 50020);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, 50020);
addQuad(0.0f, 1.0f);
- GLStateManager.setEntityIds(-1, 0, -1);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, -1);
});
}
public static void drawIdsChangedAfterTheLastVertex() {
draw(() -> {
- GLStateManager.setEntityIds(-1, 0, 7);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, 7);
startQuads();
addQuad(-1.0f, 1.0f);
- GLStateManager.setEntityIds(-1, 0, 50020);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, 50020);
});
}
@@ -65,7 +65,7 @@ public final class TessellatorEntityIdsFixture {
TessellatorStreamingDrawer.draw(tess);
} finally {
TessellatorEntityIds.onReset(tess);
- GLStateManager.setEntityIds(-1, 0, -1);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, -1);
tess.rawBuffer = savedRawBuffer;
tess.rawBufferSize = savedRawBufferSize;
tess.rawBufferIndex = savedRawBufferIndex;
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java
new file mode 100644
index 000000000..a4f4d64af
--- /dev/null
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java
@@ -0,0 +1,31 @@
+package com.gtnewhorizons.angelica.glsm.testutil;
+
+/** Child-first for the defined name, so a same-named class on the test classpath cannot shadow it. */
+public final class DefiningClassLoader extends ClassLoader {
+
+ private final String dottedName;
+ private final byte[] bytes;
+
+ private DefiningClassLoader(String dottedName, byte[] bytes) {
+ super(DefiningClassLoader.class.getClassLoader());
+ this.dottedName = dottedName;
+ this.bytes = bytes;
+ }
+
+ public static Class> define(String dottedName, byte[] bytes) {
+ try {
+ return Class.forName(dottedName, true, new DefiningClassLoader(dottedName, bytes));
+ } catch (ClassNotFoundException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ @Override
+ protected Class> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+ if (!name.equals(dottedName)) return super.loadClass(name, resolve);
+ synchronized (getClassLoadingLock(name)) {
+ final Class> loaded = findLoadedClass(name);
+ return loaded != null ? loaded : defineClass(name, bytes, 0, bytes.length);
+ }
+ }
+}
diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java
new file mode 100644
index 000000000..3d09c47fc
--- /dev/null
+++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java
@@ -0,0 +1,96 @@
+package com.gtnewhorizons.angelica.glsm.testutil;
+
+import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.net.JarURLConnection;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.stream.Stream;
+
+public final class GlsmClasses {
+
+ private static final String PACKAGE = "com/gtnewhorizons/angelica/glsm/";
+ private static final Map CLASSES = new ConcurrentHashMap<>();
+
+ private GlsmClasses() {}
+
+ public static ClassNode load(String internalName) {
+ return CLASSES.computeIfAbsent(internalName, name -> {
+ try (InputStream in = GlsmClasses.class.getClassLoader().getResourceAsStream(name + ".class")) {
+ if (in == null) throw new IllegalStateException("Missing class file for " + name);
+ final ClassNode node = new ClassNode();
+ new ClassReader(in).accept(node, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+ return node;
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ });
+ }
+
+ public static List classes() {
+ return GLSMRedirector.glsmClasses();
+ }
+
+ public static Set packageClasses() {
+ final URL resource = GlsmClasses.class.getClassLoader().getResource(PACKAGE + "GLStateManager.class");
+ if (resource == null) throw new IllegalStateException("GLStateManager.class not on the classpath");
+ final List fileNames = new ArrayList<>();
+ try {
+ if (resource.getProtocol().equals("jar")) {
+ final JarURLConnection connection = (JarURLConnection) resource.openConnection();
+ connection.setUseCaches(false);
+ try (JarFile jar = connection.getJarFile()) {
+ jar.stream().map(JarEntry::getName).filter(n -> n.startsWith(PACKAGE) && n.indexOf('/', PACKAGE.length()) < 0)
+ .forEach(n -> fileNames.add(n.substring(PACKAGE.length())));
+ }
+ } else {
+ try (Stream files = Files.list(Path.of(resource.toURI()).getParent())) {
+ files.forEach(p -> fileNames.add(p.getFileName().toString()));
+ }
+ }
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ } catch (URISyntaxException e) {
+ throw new IllegalStateException(e);
+ }
+ final Set classes = new TreeSet<>();
+ for (String file : fileNames) {
+ if (file.equals("GLStateManager.class") || file.matches("GLSM[A-Z][A-Za-z]*\\.class")) {
+ classes.add(PACKAGE + file.substring(0, file.length() - ".class".length()));
+ }
+ }
+ return classes;
+ }
+
+ public record Resolved(String owner, MethodNode method) {}
+
+ public static Resolved resolve(String owner, String name, String desc) {
+ for (String type = owner; type != null && type.startsWith(PACKAGE); ) {
+ final ClassNode node = load(type);
+ for (MethodNode method : node.methods) {
+ if (method.name.equals(name) && method.desc.equals(desc)) {
+ if (method.instructions.size() == 0) return null;
+ return new Resolved(type, method);
+ }
+ }
+ type = node.superName;
+ }
+ return null;
+ }
+}
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java
index f7a45f1f4..15bdd2c89 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java
@@ -1,7 +1,18 @@
package com.gtnewhorizons.angelica.sdlgpu;
import com.gtnewhorizons.angelica.config.SystemProperties;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.sdlgpu.device.MemoryStackWrapper;
import com.gtnewhorizons.angelica.sdlgpu.util.MemoryAccess;
@@ -75,141 +86,141 @@ public final class SDLGPULWJGLService implements LWJGLService {
@Override public int getPointerSize() { return 8; } // 64-bit
- @Override public int glGenBuffers() { return GLStateManager.glGenBuffers(); }
- @Override public void glDeleteBuffers(int buffer) { GLStateManager.glDeleteBuffers(buffer); }
- @Override public void glBindBuffer(int target, int buffer) { GLStateManager.glBindBuffer(target, buffer); }
+ @Override public int glGenBuffers() { return GLSMBuffers.glGenBuffers(); }
+ @Override public void glDeleteBuffers(int buffer) { GLSMBuffers.glDeleteBuffers(buffer); }
+ @Override public void glBindBuffer(int target, int buffer) { GLSMBuffers.glBindBuffer(target, buffer); }
@Override public void glBufferData(int target, long size, int usage) {
- GLStateManager.glBufferData(target, size, usage);
+ GLSMBuffers.glBufferData(target, size, usage);
}
@Override public void glBufferData(int target, ByteBuffer data, int usage) {
- GLStateManager.glBufferData(target, data, usage);
+ GLSMBuffers.glBufferData(target, data, usage);
}
@Override public void glBufferData(int target, long size, long data, int usage) {
if (data != 0) {
- GLStateManager.nglBufferData(target, size, data, usage);
+ GLSMBuffers.nglBufferData(target, size, data, usage);
} else {
- GLStateManager.glBufferData(target, size, usage);
+ GLSMBuffers.glBufferData(target, size, usage);
}
}
@Override public void glBufferStorage(int target, long size, int flags) {
- GLStateManager.glBufferStorage(target, size, flags);
+ GLSMBuffers.glBufferStorage(target, size, flags);
}
@Override public void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) {
- GLStateManager.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
+ GLSMFramebuffer.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}
@Override public void glDrawArrays(int mode, int first, int count) {
- GLStateManager.glDrawArrays(mode, first, count);
+ GLSMDraws.glDrawArrays(mode, first, count);
}
@Override public void glDrawBuffers(int[] buffers) {
try (var stack = MemoryStack.stackPush()) {
- GLStateManager.glDrawBuffers(stack.ints(buffers));
+ GLSMFramebuffer.glDrawBuffers(stack.ints(buffers));
}
}
@Override public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
- GLStateManager.glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
+ GLSMTextures.glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels);
}
- @Override public void glTexParameteri(int target, int pname, int param) { GLStateManager.glTexParameteri(target, pname, param); }
+ @Override public void glTexParameteri(int target, int pname, int param) { GLSMTextures.glTexParameteri(target, pname, param); }
@Override public ByteBuffer glMapBufferRange(int target, long offset, long length, int flags) {
- return GLStateManager.glMapBufferRange(target, offset, length, flags);
+ return GLSMBuffers.glMapBufferRange(target, offset, length, flags);
}
@Override public long nglMapBuffer(int target, int access) { return 0; }
@Override public ByteBuffer glMapBuffer(int target, int access) {
- return GLStateManager.glMapBuffer(target, access);
+ return GLSMBuffers.glMapBuffer(target, access);
}
- @Override public void glUnmapBuffer(int target) { GLStateManager.glUnmapBuffer(target); }
+ @Override public void glUnmapBuffer(int target) { GLSMBuffers.glUnmapBuffer(target); }
@Override public void glFlushMappedBufferRange(int target, long offset, long length) {
- GLStateManager.glFlushMappedBufferRange(target, offset, length);
+ GLSMBuffers.glFlushMappedBufferRange(target, offset, length);
}
@Override public void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset,
long size) {
- GLStateManager.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+ GLSMBuffers.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
}
@Override public void glBindBufferBase(int target, int index, int buffer) {
- GLStateManager.glBindBufferBase(target, index, buffer);
+ GLSMBuffers.glBindBufferBase(target, index, buffer);
}
- @Override public int glGenVertexArrays() { return GLStateManager.glGenVertexArrays(); }
- @Override public void glDeleteVertexArrays(int array) { GLStateManager.glDeleteVertexArrays(array); }
- @Override public void glBindVertexArray(int array) { GLStateManager.glBindVertexArray(array); }
- @Override public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) { GLStateManager.glVertexAttribPointer(index, size, type, normalized, stride, pointer); }
- @Override public void glVertexAttribIPointer(int index, int size, int type, int stride, long pointer) { GLStateManager.glVertexAttribIPointer(index, size, type, stride, pointer); }
- @Override public void glEnableVertexAttribArray(int index) { GLStateManager.glEnableVertexAttribArray(index); }
- @Override public void glVertexAttribDivisor(int index, int divisor) { GLStateManager.glVertexAttribDivisor(index, divisor); }
+ @Override public int glGenVertexArrays() { return GLSMVertexInput.glGenVertexArrays(); }
+ @Override public void glDeleteVertexArrays(int array) { GLSMVertexInput.glDeleteVertexArrays(array); }
+ @Override public void glBindVertexArray(int array) { GLSMVertexInput.glBindVertexArray(array); }
+ @Override public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) { GLSMVertexInput.glVertexAttribPointer(index, size, type, normalized, stride, pointer); }
+ @Override public void glVertexAttribIPointer(int index, int size, int type, int stride, long pointer) { GLSMVertexInput.glVertexAttribIPointer(index, size, type, stride, pointer); }
+ @Override public void glEnableVertexAttribArray(int index) { GLSMVertexInput.glEnableVertexAttribArray(index); }
+ @Override public void glVertexAttribDivisor(int index, int divisor) { GLSMVertexInput.glVertexAttribDivisor(index, divisor); }
- @Override public int glCreateShader(int type) { return GLStateManager.glCreateShader(type); }
+ @Override public int glCreateShader(int type) { return GLSMPrograms.glCreateShader(type); }
@Override public void glShaderSource(int shader, CharSequence source) {
- GLStateManager.glShaderSource(shader, source);
+ GLSMPrograms.glShaderSource(shader, source);
}
@Override public void glShaderSourceSafe(int shader, CharSequence source) {
- GLStateManager.glShaderSource(shader, source);
+ GLSMPrograms.glShaderSource(shader, source);
}
- @Override public void glCompileShader(int shader) { GLStateManager.glCompileShader(shader); }
+ @Override public void glCompileShader(int shader) { GLSMPrograms.glCompileShader(shader); }
@Override public String glGetShaderInfoLog(int shader, int maxLength) {
- return GLStateManager.glGetShaderInfoLog(shader, maxLength);
+ return GLSMPrograms.glGetShaderInfoLog(shader, maxLength);
}
- @Override public int glGetShaderi(int shader, int pname) { return GLStateManager.glGetShaderi(shader, pname); }
- @Override public void glDeleteShader(int shader) { GLStateManager.glDeleteShader(shader); }
+ @Override public int glGetShaderi(int shader, int pname) { return GLSMPrograms.glGetShaderi(shader, pname); }
+ @Override public void glDeleteShader(int shader) { GLSMPrograms.glDeleteShader(shader); }
- @Override public int glCreateProgram() { return GLStateManager.glCreateProgram(); }
- @Override public void glAttachShader(int program, int shader) { GLStateManager.glAttachShader(program, shader); }
- @Override public void glLinkProgram(int program) { GLStateManager.glLinkProgram(program); }
+ @Override public int glCreateProgram() { return GLSMPrograms.glCreateProgram(); }
+ @Override public void glAttachShader(int program, int shader) { GLSMPrograms.glAttachShader(program, shader); }
+ @Override public void glLinkProgram(int program) { GLSMPrograms.glLinkProgram(program); }
@Override public String glGetProgramInfoLog(int program, int maxLength) {
- return GLStateManager.glGetProgramInfoLog(program, maxLength);
+ return GLSMPrograms.glGetProgramInfoLog(program, maxLength);
}
- @Override public int glGetProgrami(int program, int pname) { return GLStateManager.glGetProgrami(program, pname); }
- @Override public void glUseProgram(int program) { GLStateManager.glUseProgram(program); }
- @Override public void glDeleteProgram(int program) { GLStateManager.glDeleteProgram(program); }
+ @Override public int glGetProgrami(int program, int pname) { return GLSMPrograms.glGetProgrami(program, pname); }
+ @Override public void glUseProgram(int program) { GLSMPrograms.glUseProgram(program); }
+ @Override public void glDeleteProgram(int program) { GLSMPrograms.glDeleteProgram(program); }
@Override public void glBindAttribLocation(int program, int index, CharSequence name) {
- GLStateManager.glBindAttribLocation(program, index, name);
+ GLSMPrograms.glBindAttribLocation(program, index, name);
}
@Override public void glBindFragDataLocation(int program, int colorNumber, CharSequence name) {}
@Override public int glGetUniformLocation(int program, CharSequence name) {
- return GLStateManager.glGetUniformLocation(program, name);
+ return GLSMPrograms.glGetUniformLocation(program, name);
}
@Override public int glGetUniformBlockIndex(int program, CharSequence name) { return -1; /* TODO */ }
@Override public void glUniformBlockBinding(int program, int blockIndex, int blockBinding) { /* TODO */ }
- @Override public void glUniform1f(int location, float v0) { GLStateManager.glUniform1f(location, v0); }
- @Override public void glUniform1i(int location, int v0) { GLStateManager.glUniform1i(location, v0); }
- @Override public void glUniform1fv(int location, FloatBuffer value) { GLStateManager.glUniform1(location, value); }
- @Override public void glUniform2i(int location, int v0, int v1) { GLStateManager.glUniform2i(location, v0, v1); }
+ @Override public void glUniform1f(int location, float v0) { GLSMPrograms.glUniform1f(location, v0); }
+ @Override public void glUniform1i(int location, int v0) { GLSMPrograms.glUniform1i(location, v0); }
+ @Override public void glUniform1fv(int location, FloatBuffer value) { GLSMPrograms.glUniform1(location, value); }
+ @Override public void glUniform2i(int location, int v0, int v1) { GLSMPrograms.glUniform2i(location, v0, v1); }
@Override public void glUniform3f(int location, float v0, float v1, float v2) {
- GLStateManager.glUniform3f(location, v0, v1, v2);
+ GLSMPrograms.glUniform3f(location, v0, v1, v2);
}
- @Override public void glUniform3fv(int location, FloatBuffer value) { GLStateManager.glUniform3(location, value); }
- @Override public void glUniform3fv(int location, float[] value) { GLStateManager.glUniform3(location, value); }
- @Override public void glUniform4fv(int location, FloatBuffer value) { GLStateManager.glUniform4(location, value); }
- @Override public void glUniform4fv(int location, float[] value) { GLStateManager.glUniform4(location, value); }
+ @Override public void glUniform3fv(int location, FloatBuffer value) { GLSMPrograms.glUniform3(location, value); }
+ @Override public void glUniform3fv(int location, float[] value) { GLSMPrograms.glUniform3(location, value); }
+ @Override public void glUniform4fv(int location, FloatBuffer value) { GLSMPrograms.glUniform4(location, value); }
+ @Override public void glUniform4fv(int location, float[] value) { GLSMPrograms.glUniform4(location, value); }
@Override public void glUniformMatrix3fv(int location, boolean transpose, FloatBuffer value) {
- GLStateManager.glUniformMatrix3(location, transpose, value);
+ GLSMPrograms.glUniformMatrix3(location, transpose, value);
}
@Override public void glUniformMatrix4fv(int location, boolean transpose, FloatBuffer value) {
- GLStateManager.glUniformMatrix4(location, transpose, value);
+ GLSMPrograms.glUniformMatrix4(location, transpose, value);
}
@Override public void glDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) {
- GLStateManager.glDrawElementsBaseVertex(mode, count, type, indices, basevertex);
+ GLSMDraws.glDrawElementsBaseVertex(mode, count, type, indices, basevertex);
}
@Override public void glMultiDrawElementsBaseVertex(int mode, long pCount, int type, long pIndices, int drawcount,
long pBaseVertex) {
- GLStateManager.glMultiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex);
+ GLSMDraws.glMultiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex);
}
@Override public void glMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) {
- GLStateManager.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
+ GLSMDraws.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
}
- @Override public long glFenceSync(int condition, int flags) { return GLStateManager.glFenceSync(condition, flags); }
+ @Override public long glFenceSync(int condition, int flags) { return GLSMBuffers.glFenceSync(condition, flags); }
@Override public int glClientWaitSync(long sync, int flags, long timeout) {
- return GLStateManager.glClientWaitSync(sync, flags, timeout);
+ return GLSMBuffers.glClientWaitSync(sync, flags, timeout);
}
@Override public int glGetSynci(long sync, int pname, IntBuffer length) {
if (length != null && length.remaining() > 0) length.put(0, 1);
return ((SDLGPURenderBackend) BackendManager.RENDER_BACKEND).getSyncStatus(sync);
}
@Override public void glWaitSync(long sync, int flags, long timeout) {
- GLStateManager.glWaitSync(sync, flags, timeout);
+ GLSMBuffers.glWaitSync(sync, flags, timeout);
}
- @Override public void glDeleteSync(long sync) { GLStateManager.glDeleteSync(sync); }
+ @Override public void glDeleteSync(long sync) { GLSMBuffers.glDeleteSync(sync); }
private long[] queryElapsed = new long[64];
private int activeQueryId = -1;
@@ -221,7 +232,7 @@ public final class SDLGPULWJGLService implements LWJGLService {
}
}
- @Override public int glGenQueries() { return GLStateManager.glGenQueries(); }
+ @Override public int glGenQueries() { return GLSMQueries.glGenQueries(); }
@Override public void glDeleteQueries(int query) { }
@Override public void glBeginQuery(int target, int id) {
ensureQueryCapacity(id);
@@ -241,65 +252,65 @@ public final class SDLGPULWJGLService implements LWJGLService {
@Override public int setupDebugCallback(DebugMessageHandler handler) { return 0; }
@Override public void disableDebugCallback() { }
@Override public void glObjectLabel(int identifier, int name, CharSequence label) {
- GLStateManager.glObjectLabel(identifier, name, label);
+ GLSMDraws.glObjectLabel(identifier, name, label);
}
@Override public void glPushDebugGroup(int source, int id, CharSequence message) {
- GLStateManager.glPushDebugGroup(source, id, message);
+ GLSMDraws.glPushDebugGroup(source, id, message);
}
- @Override public void glPopDebugGroup() { GLStateManager.glPopDebugGroup(); }
+ @Override public void glPopDebugGroup() { GLSMDraws.glPopDebugGroup(); }
- @Override public int glGenTextures() { return GLStateManager.glGenTextures(); }
+ @Override public int glGenTextures() { return GLSMTextures.glGenTextures(); }
@Override public void glGenTextures(int[] textures) {
- for (int i = 0; i < textures.length; i++) textures[i] = GLStateManager.glGenTextures();
+ for (int i = 0; i < textures.length; i++) textures[i] = GLSMTextures.glGenTextures();
}
- @Override public void glDeleteTextures(int texture) { GLStateManager.glDeleteTextures(texture); }
+ @Override public void glDeleteTextures(int texture) { GLSMTextures.glDeleteTextures(texture); }
@Override public void glDeleteTextures(int[] textures) {
- for (int t : textures) GLStateManager.glDeleteTextures(t);
+ for (int t : textures) GLSMTextures.glDeleteTextures(t);
}
- @Override public void glBindTexture(int target, int texture) { GLStateManager.glBindTexture(target, texture); }
- @Override public void glActiveTexture(int texture) { GLStateManager.glActiveTexture(texture); }
+ @Override public void glBindTexture(int target, int texture) { GLSMTextures.glBindTexture(target, texture); }
+ @Override public void glActiveTexture(int texture) { GLSMTextures.glActiveTexture(texture); }
@Override public int glGetTexLevelParameteri(int target, int level, int pname) {
- return GLStateManager.glGetTexLevelParameteri(target, level, pname);
+ return GLSMTextures.glGetTexLevelParameteri(target, level, pname);
}
@Override public void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width,
int height) {
- GLStateManager.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
+ GLSMTextures.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
}
- @Override public void glPixelStorei(int pname, int param) { GLStateManager.glPixelStorei(pname, param); }
+ @Override public void glPixelStorei(int pname, int param) { GLSMTextures.glPixelStorei(pname, param); }
- @Override public int glGenFramebuffers() { return GLStateManager.glGenFramebuffers(); }
- @Override public void glDeleteFramebuffers(int framebuffer) { GLStateManager.glDeleteFramebuffers(framebuffer); }
- @Override public void glBindFramebuffer(int target, int framebuffer) { GLStateManager.glBindFramebuffer(target, framebuffer); }
+ @Override public int glGenFramebuffers() { return GLSMFramebuffer.glGenFramebuffers(); }
+ @Override public void glDeleteFramebuffers(int framebuffer) { GLSMFramebuffer.glDeleteFramebuffers(framebuffer); }
+ @Override public void glBindFramebuffer(int target, int framebuffer) { GLSMFramebuffer.glBindFramebuffer(target, framebuffer); }
@Override public int glCheckFramebufferStatus(int target) {
- return GLStateManager.glCheckFramebufferStatus(target);
+ return GLSMFramebuffer.glCheckFramebufferStatus(target);
}
@Override public void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) {
- GLStateManager.glFramebufferTexture2D(target, attachment, textarget, texture, level);
+ GLSMFramebuffer.glFramebufferTexture2D(target, attachment, textarget, texture, level);
}
- @Override public void glEnable(int cap) { GLStateManager.glEnable(cap); }
- @Override public void glDisable(int cap) { GLStateManager.glDisable(cap); }
- @Override public void glBlendFunc(int sfactor, int dfactor) { GLStateManager.glBlendFunc(sfactor, dfactor); }
- @Override public void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { GLStateManager.tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); }
- @Override public void glDepthFunc(int func) { GLStateManager.glDepthFunc(func); }
- @Override public void glDepthMask(boolean flag) { GLStateManager.glDepthMask(flag); }
- @Override public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { GLStateManager.glColorMask(red, green, blue, alpha); }
- @Override public void glViewport(int x, int y, int width, int height) { GLStateManager.glViewport(x, y, width, height); }
- @Override public void glClear(int mask) { GLStateManager.glClear(mask); }
+ @Override public void glEnable(int cap) { GLSMEnable.glEnable(cap); }
+ @Override public void glDisable(int cap) { GLSMEnable.glDisable(cap); }
+ @Override public void glBlendFunc(int sfactor, int dfactor) { GLSMBlend.glBlendFunc(sfactor, dfactor); }
+ @Override public void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { GLSMBlend.tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); }
+ @Override public void glDepthFunc(int func) { GLSMDepthStencilAlpha.glDepthFunc(func); }
+ @Override public void glDepthMask(boolean flag) { GLSMDepthStencilAlpha.glDepthMask(flag); }
+ @Override public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { GLSMBlend.glColorMask(red, green, blue, alpha); }
+ @Override public void glViewport(int x, int y, int width, int height) { GLSMRasterizer.glViewport(x, y, width, height); }
+ @Override public void glClear(int mask) { GLSMFramebuffer.glClear(mask); }
@Override public void glClearColor(float red, float green, float blue, float alpha) {
- GLStateManager.glClearColor(red, green, blue, alpha);
+ GLSMBlend.glClearColor(red, green, blue, alpha);
}
- @Override public int glGetError() { return GLStateManager.glGetError(); }
+ @Override public int glGetError() { return GLSMQueries.glGetError(); }
- @Override public void glMatrixMode(int mode) { GLStateManager.glMatrixMode(mode); }
- @Override public void glLoadMatrixf(FloatBuffer m) { GLStateManager.glLoadMatrix(m); }
+ @Override public void glMatrixMode(int mode) { GLSMMatrices.glMatrixMode(mode); }
+ @Override public void glLoadMatrixf(FloatBuffer m) { GLSMMatrices.glLoadMatrix(m); }
- @Override public int glGetInteger(int pname) { return GLStateManager.glGetInteger(pname); }
- @Override public void glGetIntegerv(int pname, int[] params) { GLStateManager.glGetInteger(pname, params); }
- @Override public boolean glGetBoolean(int pname) { return GLStateManager.glGetBoolean(pname); }
- @Override public String glGetString(int pname) { return GLStateManager.glGetString(pname); }
+ @Override public int glGetInteger(int pname) { return GLSMQueries.glGetInteger(pname); }
+ @Override public void glGetIntegerv(int pname, int[] params) { GLSMQueries.glGetInteger(pname, params); }
+ @Override public boolean glGetBoolean(int pname) { return GLSMQueries.glGetBoolean(pname); }
+ @Override public String glGetString(int pname) { return GLSMQueries.glGetString(pname); }
@Override public int glGetAttribLocation(int program, CharSequence name) {
- return GLStateManager.glGetAttribLocation(program, name);
+ return GLSMPrograms.glGetAttribLocation(program, name);
}
@Override public MemoryStack stackPush() {
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java
index 277d486a4..059e38460 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java
@@ -6,6 +6,8 @@ import com.gtnewhorizons.angelica.sdlgpu.compute.VoxelizationDispatcher;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.glsm.CaptureGate;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.glsm.backend.BackendOptions;
@@ -620,7 +622,7 @@ public class SDLGPURenderBackend extends RenderBackend {
beginSplashFrame();
} else if (st.needsSeed) {
st.needsSeed = false;
- GLStateManager.replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
}
}
@@ -693,7 +695,7 @@ public class SDLGPURenderBackend extends RenderBackend {
final ContextState st = s();
if (st.needsSeed) {
st.needsSeed = false;
- GLStateManager.replayStateToBackend();
+ GLSMAttribStack.replayStateToBackend();
}
ResourceManager.setSingleThreadedReads(GLStateManager.isSplashComplete());
st.pendingColorTextures.clear();
@@ -4557,7 +4559,7 @@ public class SDLGPURenderBackend extends RenderBackend {
@Override public void voxelizeRegion(long pass, boolean rebindVertexBuffer, float x, float y, float z, int rangeBase, int rangeCount, int vertexTotal) {
final ContextState st = s();
- if (voxLocRegionOffset >= 0) GLStateManager.glUniform3f(voxLocRegionOffset, x, y, z);
+ if (voxLocRegionOffset >= 0) GLSMPrograms.glUniform3f(voxLocRegionOffset, x, y, z);
if (rebindVertexBuffer) voxelizationDispatcher.rebindVertexBuffer(st, pass);
voxelizationDispatcher.dispatchRegion(pass, voxLocRangeBase, voxLocRangeCount, voxLocVertexTotal, voxLocInvocationBase, rangeBase, rangeCount, vertexTotal, st);
}
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java
index 0216a65af..36457a573 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.compat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -18,7 +18,7 @@ public final class AwareGLDebugShim {
private AwareGLDebugShim() {}
public static void glDebugMessageCallback(GLDebugMessageCallbackI callback, long userParam) {
- GLStateManager.registerDebugMessageListener(callback == null ? null : callback::invoke, userParam);
+ GLSMDraws.registerDebugMessageListener(callback == null ? null : callback::invoke, userParam);
}
public static Callback setupDebugMessageCallback() {
@@ -31,7 +31,7 @@ public final class AwareGLDebugShim {
return null;
}
final GLDebugMessageCallback proc = GLDebugMessageCallback.create((source, type, id, severity, length, message, userParam) -> stream.println("[Angelica] GL debug message: " + GLDebugMessageCallback.getMessage(length, message)));
- GLStateManager.registerDebugMessageListener(proc::invoke, 0L);
+ GLSMDraws.registerDebugMessageListener(proc::invoke, 0L);
return proc;
}
}
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java
index 057077567..7a3179162 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java
@@ -1,10 +1,10 @@
package com.gtnewhorizons.angelica.sdlgpu.compute;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState;
public final class VoxelizationDispatcher {
- private static final InvocationDispatch.IntUniformWriter UNIFORM_1I = (st, location, value) -> GLStateManager.glUniform1i(location, value);
+ private static final InvocationDispatch.IntUniformWriter UNIFORM_1I = (st, location, value) -> GLSMPrograms.glUniform1i(location, value);
private final ComputeDispatchSink computeBinder;
@@ -21,9 +21,9 @@ public final class VoxelizationDispatcher {
}
public void dispatchRegion(long pass, int locBase, int locCount, int locTotal, int locInvBase, int rangeBase, int rangeCount, int vertexTotal, ContextState st) {
- if (locBase >= 0) GLStateManager.glUniform1i(locBase, rangeBase);
- if (locCount >= 0) GLStateManager.glUniform1i(locCount, rangeCount);
- if (locTotal >= 0) GLStateManager.glUniform1i(locTotal, vertexTotal);
+ if (locBase >= 0) GLSMPrograms.glUniform1i(locBase, rangeBase);
+ if (locCount >= 0) GLSMPrograms.glUniform1i(locCount, rangeCount);
+ if (locTotal >= 0) GLSMPrograms.glUniform1i(locTotal, vertexTotal);
InvocationDispatch.dispatch(computeBinder, st, pass, vertexTotal, locInvBase, UNIFORM_1I);
}
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java
index c8f4c8b71..bb4733c05 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.pipeline;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.ffp.FFPUniformBlock;
import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState;
import com.gtnewhorizons.angelica.sdlgpu.frame.FrameManager;
@@ -155,7 +155,7 @@ public final class FFPTrace {
.append(" glFormat=0x").append(Integer.toHexString(meta.glFormat()));
}
}
- sb.append(" ffpEnabled=").append(GLStateManager.getTextures().getTextureUnitStates(unit).isEnabled());
+ sb.append(" ffpEnabled=").append(GLSMTextures.getTextures().getTextureUnitStates(unit).isEnabled());
}
private void appendFfpUniforms(ContextState st, ShaderManager.ProgramObject prog) {
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java
index c3535ecfd..e83653fee 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java
@@ -9,6 +9,9 @@ import org.lwjgl.sdl.SDL_GPUDepthStencilTargetInfo;
import org.lwjgl.sdl.SDL_GPUViewport;
import org.lwjgl.sdl.SDL_Rect;
import com.gtnewhorizons.angelica.config.SystemProperties;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState;
@@ -420,10 +423,10 @@ public final class PipelineApplier {
if (Tracy.ENABLED) frameManager.noteStateApply();
if (SystemProperties.SDL_VERIFY_STATE_SYNC && Thread.currentThread() == GLStateManager.getMainThread()) {
StateSyncVerifier.verify(
- GLStateManager.getBoundVAO(), st.boundVAO,
- GLStateManager.getDrawFramebuffer(), st.boundFboId,
- GLStateManager.getReadFramebuffer(), st.boundReadFboId,
- GLStateManager.getActiveTextureUnit(), st.activeTextureUnit);
+ GLSMVertexInput.getBoundVAO(), st.boundVAO,
+ GLSMFramebuffer.getDrawFramebuffer(), st.boundFboId,
+ GLSMFramebuffer.getReadFramebuffer(), st.boundReadFboId,
+ GLSMTextures.getActiveTextureUnit(), st.activeTextureUnit);
}
final long rp = f.renderPass;
final long rpGeneration = f.renderPassGeneration;
diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java
index 6dbed69ee..0faf082f3 100644
--- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java
+++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.sdlgpu.resource;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -25,30 +27,30 @@ public final class Image3DClear {
if (failed) return false;
failed = true;
- final int shader = GLStateManager.glCreateShader(GL43.GL_COMPUTE_SHADER);
+ final int shader = GLSMPrograms.glCreateShader(GL43.GL_COMPUTE_SHADER);
if (shader == 0) return false;
try {
- GLStateManager.glShaderSource(shader, ShaderLoader.getShaderSource(SOURCE));
- GLStateManager.glCompileShader(shader);
+ GLSMPrograms.glShaderSource(shader, ShaderLoader.getShaderSource(SOURCE));
+ GLSMPrograms.glCompileShader(shader);
- final int created = GLStateManager.glCreateProgram();
+ final int created = GLSMPrograms.glCreateProgram();
if (created == 0) return false;
- GLStateManager.glAttachShader(created, shader);
- GLStateManager.glLinkProgram(created);
- if (GLStateManager.glGetProgrami(created, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
- LOG.error("3D image clear program failed to link: {}", GLStateManager.glGetProgramInfoLog(created, 4096));
- GLStateManager.glDeleteProgram(created);
+ GLSMPrograms.glAttachShader(created, shader);
+ GLSMPrograms.glLinkProgram(created);
+ if (GLSMPrograms.glGetProgrami(created, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
+ LOG.error("3D image clear program failed to link: {}", GLSMPrograms.glGetProgramInfoLog(created, 4096));
+ GLSMPrograms.glDeleteProgram(created);
return false;
}
program = created;
- extentLocation = GLStateManager.glGetUniformLocation(created, "u_extent");
+ extentLocation = GLSMPrograms.glGetUniformLocation(created, "u_extent");
failed = false;
return true;
} catch (RuntimeException e) {
LOG.error("3D image clear program could not be built; 3D images will not be cleared", e);
return false;
} finally {
- GLStateManager.glDeleteShader(shader);
+ GLSMPrograms.glDeleteShader(shader);
}
}
@@ -56,21 +58,21 @@ public final class Image3DClear {
if (width <= 0 || height <= 0 || depth <= 0) return true;
if (!ensureProgram()) return false;
- final int previousProgram = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM);
- final ImageUnitBinding previousImage = GLStateManager.getImageUnitBinding(0);
+ final int previousProgram = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM);
+ final ImageUnitBinding previousImage = GLSMTextures.getImageUnitBinding(0);
final ImageUnitBinding savedImage = previousImage == null ? null : previousImage.copy();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
try {
- GLStateManager.glBindImageTexture(0, glTexture, 0, true, 0, GL15.GL_WRITE_ONLY, 0);
- if (extentLocation >= 0) GLStateManager.glUniform3i(extentLocation, width, height, depth);
- GLStateManager.glDispatchCompute(groups(width), groups(height), groups(depth));
+ GLSMTextures.glBindImageTexture(0, glTexture, 0, true, 0, GL15.GL_WRITE_ONLY, 0);
+ if (extentLocation >= 0) GLSMPrograms.glUniform3i(extentLocation, width, height, depth);
+ GLSMPrograms.glDispatchCompute(groups(width), groups(height), groups(depth));
} finally {
if (savedImage == null) {
- GLStateManager.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, 0);
+ GLSMTextures.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, 0);
} else {
- GLStateManager.glBindImageTexture(0, savedImage.getTexture(), savedImage.getLevel(), savedImage.isLayered(), savedImage.getLayer(), savedImage.getAccess(), savedImage.getFormat());
+ GLSMTextures.glBindImageTexture(0, savedImage.getTexture(), savedImage.getLevel(), savedImage.isLayered(), savedImage.getLayer(), savedImage.getAccess(), savedImage.getFormat());
}
- GLStateManager.glUseProgram(previousProgram);
+ GLSMPrograms.glUseProgram(previousProgram);
}
return true;
}
@@ -81,7 +83,7 @@ public final class Image3DClear {
public void delete() {
if (program != 0) {
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
program = 0;
}
extentLocation = -1;
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java
index 47dd29f6b..2c7fe7187 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java
@@ -1,7 +1,14 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
import com.gtnewhorizons.angelica.config.SystemProperties;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.sdlgpu.frame.FrameManager;
import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager;
@@ -40,33 +47,33 @@ class GlsmSdlAttachmentClearTest {
/** Clears colour to black and depth to 0.9, then draws a quad so a render pass is open. */
private static void primeTarget(float r, float g, float b) {
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClearDepth(0.9);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMDepthStencilAlpha.glClearDepth(0.9);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GlsmSdlHeadlessRig.solidQuad(r, g, b);
}
private static void primeTargetWithStencil(int stencil) {
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClearDepth(1.0);
- GLStateManager.glClearStencil(stencil);
- GLStateManager.glStencilMask(0xFF);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
+ GLSMDepthStencilAlpha.glClearStencil(stencil);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
GlsmSdlHeadlessRig.solidQuad(0.1f, 0.1f, 0.1f);
}
private static void drawFullQuadAtZ(float z, float r, float g, float b) {
- GLStateManager.glColor4f(r, g, b, 1.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glVertex3f(-1.0f, -1.0f, z);
- GLStateManager.glVertex3f(1.0f, -1.0f, z);
- GLStateManager.glVertex3f(1.0f, 1.0f, z);
- GLStateManager.glVertex3f(-1.0f, 1.0f, z);
- GLStateManager.glEnd();
+ GLSMCurrentAttribs.glColor4f(r, g, b, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glVertex3f(-1.0f, -1.0f, z);
+ GLSMDraws.glVertex3f(1.0f, -1.0f, z);
+ GLSMDraws.glVertex3f(1.0f, 1.0f, z);
+ GLSMDraws.glVertex3f(-1.0f, 1.0f, z);
+ GLSMDraws.glEnd();
}
private static boolean isRed(int argb) {
@@ -82,11 +89,11 @@ class GlsmSdlAttachmentClearTest {
}
private static boolean depthEquals(float depthValue) {
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
drawFullQuadAtZ(depthValue * 2.0f - 1.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
return isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2));
}
@@ -101,10 +108,10 @@ class GlsmSdlAttachmentClearTest {
final int inPassBefore = f.inPassClearsThisFrame;
final int passEndClearBefore = f.passEndCauseCountsThisFrame[FrameManager.PASS_END_CLEAR];
- GLStateManager.glDepthMask(false);
- GLStateManager.glClearDepth(0.0);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMDepthStencilAlpha.glClearDepth(0.0);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
assertEquals(passBefore, f.renderPass, "a masked clear must not break the active render pass");
assertEquals(inPassBefore, f.inPassClearsThisFrame, "a masked clear must not take the in-pass path");
@@ -121,9 +128,9 @@ class GlsmSdlAttachmentClearTest {
assertTrue(passBefore != 0, "expected an active render pass before the clear");
final int inPassBefore = f.inPassClearsThisFrame;
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(0.25);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(0.25);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
assertEquals(passBefore, f.renderPass, "the in-pass clear must not break the active render pass");
assertEquals(inPassBefore + 1, f.inPassClearsThisFrame, "the in-pass clear must be taken exactly once");
@@ -140,9 +147,9 @@ class GlsmSdlAttachmentClearTest {
setDisableInPassClear(true);
try {
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(0.6);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(0.6);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
assertEquals(inPassBefore, f.inPassClearsThisFrame, "angelica.sdlgpu.disableInPassClear must force the legacy path, never the in-pass path");
} finally {
setDisableInPassClear(false);
@@ -164,9 +171,9 @@ class GlsmSdlAttachmentClearTest {
GlsmSdlHeadlessRig.resetState();
primeTarget(0.1f, 0.1f, 0.1f);
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(depthValue);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(depthValue);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
return depthEquals(depthValue);
} finally {
@@ -178,24 +185,24 @@ class GlsmSdlAttachmentClearTest {
void scissoredClearOnlyAffectsTheScissorRect() {
primeTarget(0.1f, 0.1f, 0.1f);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE / 2, SIZE);
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(0.0);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(0.0);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE / 2, SIZE);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE);
drawFullQuadAtZ(-1.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glScissor(SIZE / 2, 0, SIZE - SIZE / 2, SIZE);
+ GLSMRasterizer.glScissor(SIZE / 2, 0, SIZE - SIZE / 2, SIZE);
drawFullQuadAtZ(0.9f * 2.0f - 1.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 4, SIZE / 2)), "inside the scissor rect the depth must have been cleared to 0");
@@ -210,10 +217,10 @@ class GlsmSdlAttachmentClearTest {
final long passBefore = f.renderPass;
final int inPassBefore = f.inPassClearsThisFrame;
- GLStateManager.glClearStencil(0x3F);
- GLStateManager.glStencilMask(0x0F);
- GLStateManager.glClear(GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glStencilMask(0xFF);
+ GLSMDepthStencilAlpha.glClearStencil(0x3F);
+ GLSMDepthStencilAlpha.glStencilMask(0x0F);
+ GLSMFramebuffer.glClear(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
assertEquals(passBefore, f.renderPass, "the stencil-only clear must not break the active render pass");
assertEquals(inPassBefore + 1, f.inPassClearsThisFrame, "the stencil clear must take the in-pass path");
@@ -284,14 +291,14 @@ class GlsmSdlAttachmentClearTest {
private static void probeStrip(int index, int regionW, int strips, int func, int ref, int mask) {
final int x = index * regionW;
final int w = (index == strips - 1) ? SIZE - x : regionW;
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(x, 0, w, SIZE);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(func, ref, mask);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(x, 0, w, SIZE);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(func, ref, mask);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
drawFullQuadAtZ(0.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
}
private static int stripCenter(int index, int regionW, int strips) {
@@ -303,19 +310,19 @@ class GlsmSdlAttachmentClearTest {
@Test
void colorIsUntouchedByADepthStencilOnlyClear() {
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearColor(0.2f, 0.4f, 0.6f, 1.0f);
- GLStateManager.glClearDepth(0.9);
- GLStateManager.glClearStencil(0x55);
- GLStateManager.glStencilMask(0xFF);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glClearColor(0.2f, 0.4f, 0.6f, 1.0f);
+ GLSMDepthStencilAlpha.glClearDepth(0.9);
+ GLSMDepthStencilAlpha.glClearStencil(0x55);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
GlsmSdlHeadlessRig.solidQuad(0.2f, 0.4f, 0.6f);
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(0.1);
- GLStateManager.glClearStencil(0x77);
- GLStateManager.glStencilMask(0xFF);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(0.1);
+ GLSMDepthStencilAlpha.glClearStencil(0x77);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
final int argb = GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2);
@@ -336,12 +343,12 @@ class GlsmSdlAttachmentClearTest {
assertTrue(passBefore != 0, "expected an active render pass before the scissored clear");
final int inPassBefore = f.inPassClearsThisFrame;
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE / 2, SIZE);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClearDepth(0.0);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMDepthStencilAlpha.glClearDepth(0.0);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
assertEquals(passBefore, f.renderPass, "the scissored clear must not break the active render pass");
assertEquals(inPassBefore + 1, f.inPassClearsThisFrame, "the scissored clear must take the in-pass path");
@@ -350,17 +357,17 @@ class GlsmSdlAttachmentClearTest {
final int leftProbeX = SIZE / 2 - probeSize * 2;
final int rightProbeX = SIZE / 2 + probeSize;
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(leftProbeX, 0, probeSize, SIZE);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(leftProbeX, 0, probeSize, SIZE);
drawFullQuadAtZ(0.0f * 2.0f - 1.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glScissor(rightProbeX, 0, probeSize, SIZE);
+ GLSMRasterizer.glScissor(rightProbeX, 0, probeSize, SIZE);
drawFullQuadAtZ(0.9f * 2.0f - 1.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 8, SIZE / 2)), "inside the scissor rect must be the clear color");
@@ -372,18 +379,18 @@ class GlsmSdlAttachmentClearTest {
@Test
void scissoredClearAfterPendingFullClear() {
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE / 2, SIZE);
- GLStateManager.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE);
+ GLSMBlend.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glScissor(0, 0, 0, SIZE);
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, 0, SIZE);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertTrue(isGreen(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 4, SIZE / 2)), "the scissored clear must have painted the left half green");
@@ -395,10 +402,10 @@ class GlsmSdlAttachmentClearTest {
GlsmSdlHeadlessRig.bindTarget();
GlsmSdlHeadlessRig.solidQuad(0.2f, 0.4f, 0.6f);
- GLStateManager.glColorMask(true, false, false, true);
- GLStateManager.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMBlend.glColorMask(true, false, false, true);
+ GLSMBlend.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glColorMask(true, true, true, true);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
final int argb = GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2);
@@ -415,54 +422,54 @@ class GlsmSdlAttachmentClearTest {
final int texA = createColorTexture();
final int texB = createColorTexture();
- final int mrtFbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, mrtFbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texA, 0);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, texB, 0);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glDrawBuffers(IntBuffer.wrap(new int[]{ GL30.GL_COLOR_ATTACHMENT0, GL30.GL_COLOR_ATTACHMENT1 }));
+ final int mrtFbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, mrtFbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texA, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, texB, 0);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMFramebuffer.glDrawBuffers(IntBuffer.wrap(new int[]{ GL30.GL_COLOR_ATTACHMENT0, GL30.GL_COLOR_ATTACHMENT1 }));
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE / 2, SIZE);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
- final int readFbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, readFbo);
+ final int readFbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, readFbo);
assertLeftHalfRed(texA, "texture A");
assertLeftHalfRed(texB, "texture B");
- GLStateManager.glDeleteFramebuffers(readFbo);
- GLStateManager.glDeleteFramebuffers(mrtFbo);
- GLStateManager.glDeleteTextures(texA);
- GLStateManager.glDeleteTextures(texB);
+ GLSMFramebuffer.glDeleteFramebuffers(readFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(mrtFbo);
+ GLSMTextures.glDeleteTextures(texA);
+ GLSMTextures.glDeleteTextures(texB);
GlsmSdlHeadlessRig.bindTarget();
}
@Test
void clearReachesARenderbufferRespecifiedWhileAttached() {
- final int rb = GLStateManager.glGenRenderbuffers();
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE / 4, SIZE / 4);
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_RENDERBUFFER, rb);
+ final int rb = GLSMFramebuffer.glGenRenderbuffers();
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE / 4, SIZE / 4);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_RENDERBUFFER, rb);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE, SIZE);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE, SIZE);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), RED, "respecified renderbuffer must stay attached");
- GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteRenderbuffers(rb);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glDeleteRenderbuffers(rb);
GlsmSdlHeadlessRig.bindTarget();
}
@@ -471,16 +478,16 @@ class GlsmSdlAttachmentClearTest {
}
private static int createColorTexture(int internalFormat, int format) {
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
return tex;
}
private static void assertLeftHalfRed(int texture, String label) {
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 4, SIZE / 2)), label + " left half must be cleared red");
assertFalse(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2 + SIZE / 4, SIZE / 2)), label + " right half must keep the base clear");
@@ -491,11 +498,11 @@ class GlsmSdlAttachmentClearTest {
GlsmSdlHeadlessRig.bindTarget();
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
- GLStateManager.glEnable(GL30.GL_RASTERIZER_DISCARD);
- GLStateManager.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glEnable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMBlend.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
GlsmSdlHeadlessRig.solidQuad(0.0f, 0.0f, 1.0f);
- GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2)), "rasterizer discard must skip both the clear and the draw");
@@ -507,11 +514,11 @@ class GlsmSdlAttachmentClearTest {
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
final FloatBuffer feedbackBuffer = BufferUtils.createFloatBuffer(16);
- GLStateManager.glFeedbackBuffer(GL11.GL_3D, feedbackBuffer);
- GLStateManager.glRenderMode(GL11.GL_FEEDBACK);
- GLStateManager.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glRenderMode(GL11.GL_RENDER);
+ GLSMDraws.glFeedbackBuffer(GL11.GL_3D, feedbackBuffer);
+ GLSMDraws.glRenderMode(GL11.GL_FEEDBACK);
+ GLSMBlend.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMDraws.glRenderMode(GL11.GL_RENDER);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2)), "a clear issued outside GL_RENDER mode must be ignored");
@@ -520,27 +527,27 @@ class GlsmSdlAttachmentClearTest {
@Test
void colorMaskCoveringEveryPresentChannelIsAFullClear() {
final int tex = createColorTexture(GL30.GL_R8, GL11.GL_RED);
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glClearColor(0.2f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0.2f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
GlsmSdlHeadlessRig.solidQuad(0.4f, 0.0f, 0.0f);
final FrameManager.FrameState f = frame();
final int inPassBefore = f.inPassClearsThisFrame;
- GLStateManager.glColorMask(true, false, false, false);
- GLStateManager.glClearColor(0.6f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMBlend.glColorMask(true, false, false, false);
+ GLSMBlend.glClearColor(0.6f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glColorMask(true, true, true, true);
assertEquals(inPassBefore, f.inPassClearsThisFrame, "masking every present channel on a single-red-channel target must take the load-op path, not in-pass");
- GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteTextures(tex);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMTextures.glDeleteTextures(tex);
GlsmSdlHeadlessRig.bindTarget();
}
@@ -561,8 +568,8 @@ class GlsmSdlAttachmentClearTest {
@Test
void aSingleAspectClearLeavesTheTextureUndefined() {
final int fbo = GlsmSdlHeadlessRig.createDepthStencilFbo();
- GLStateManager.glDepthMask(true);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
final ResourceManager resourceManager = GlsmSdlHeadlessRig.resourceManager();
final long depthTexture = resourceManager.getFbo(fbo).depthTexture;
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java
index 09f8078a4..62aaff5ed 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.ffp.CubeInstancedAttribs;
import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
@@ -36,10 +36,10 @@ class GlsmSdlAttribBindingTest {
void instancedEntityIdsStayAtTheInstanceSlot() {
final int program = linkWithIrisBindings(INSTANCED_VERTEX);
try {
- assertEquals(InstancedAttribs.LOC_ENTITY, GLStateManager.glGetAttribLocation(program, "iris_InstEntity"));
- assertEquals(CubeInstancedAttribs.LOC_CUBE_TEX, GLStateManager.glGetAttribLocation(program, "iris_CubeTex"));
+ assertEquals(InstancedAttribs.LOC_ENTITY, GLSMPrograms.glGetAttribLocation(program, "iris_InstEntity"));
+ assertEquals(CubeInstancedAttribs.LOC_CUBE_TEX, GLSMPrograms.glGetAttribLocation(program, "iris_CubeTex"));
} finally {
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
}
}
@@ -47,20 +47,20 @@ class GlsmSdlAttribBindingTest {
void immediateEntityIdsDoNotMoveOntoMcEntity() {
final int program = linkWithIrisBindings(IMMEDIATE_VERTEX);
try {
- assertEquals(ImmediateExtendedAttribHandler.LOC_MC_ENTITY, GLStateManager.glGetAttribLocation(program, "mc_Entity"));
- assertEquals(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS, GLStateManager.glGetAttribLocation(program, "iris_Entity"));
+ assertEquals(ImmediateExtendedAttribHandler.LOC_MC_ENTITY, GLSMPrograms.glGetAttribLocation(program, "mc_Entity"));
+ assertEquals(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS, GLSMPrograms.glGetAttribLocation(program, "iris_Entity"));
} finally {
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
}
}
private static int linkWithIrisBindings(String vertexSource) {
- final int program = GLStateManager.glCreateProgram();
- GLStateManager.glAttachShader(program, GlTestSupport.compile(GL20.GL_VERTEX_SHADER, vertexSource));
- GLStateManager.glAttachShader(program, GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, GlTestSupport.TRIVIAL_FS));
- GLStateManager.glBindAttribLocation(program, InstancedAttribs.LOC_ENTITY, "iris_InstEntity");
- GLStateManager.glBindAttribLocation(program, ImmediateExtendedAttribHandler.LOC_MC_ENTITY, "mc_Entity");
- GLStateManager.glLinkProgram(program);
+ final int program = GLSMPrograms.glCreateProgram();
+ GLSMPrograms.glAttachShader(program, GlTestSupport.compile(GL20.GL_VERTEX_SHADER, vertexSource));
+ GLSMPrograms.glAttachShader(program, GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, GlTestSupport.TRIVIAL_FS));
+ GLSMPrograms.glBindAttribLocation(program, InstancedAttribs.LOC_ENTITY, "iris_InstEntity");
+ GLSMPrograms.glBindAttribLocation(program, ImmediateExtendedAttribHandler.LOC_MC_ENTITY, "mc_Entity");
+ GLSMPrograms.glLinkProgram(program);
return program;
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java
index 75d4c507b..5446535b2 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.gtnewhorizons.angelica.sdlgpu.frame.FrameManager;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Tag;
@@ -19,9 +20,9 @@ class GlsmSdlBlendConstantsTest {
@AfterEach
void restoreBlend() {
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f);
}
/** With blending never enabled before, the pending constants must survive a draw that does not use them. */
@@ -29,21 +30,21 @@ class GlsmSdlBlendConstantsTest {
@ValueSource(booleans = {false, true})
void constantsSetWhileBlendingIsDisabledReachTheNextBlendedDraw(boolean previouslyEnabled) {
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glBlendFunc(GL14.GL_CONSTANT_COLOR, GL11.GL_ZERO);
+ GLSMBlend.glBlendFunc(GL14.GL_CONSTANT_COLOR, GL11.GL_ZERO);
if (previouslyEnabled) {
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendColor(1.0f, 0.0f, 0.0f, 1.0f);
GlsmSdlHeadlessRig.solidQuad(1.0f, 1.0f, 1.0f);
}
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glBlendColor(0.0f, 1.0f, 0.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMBlend.glBlendColor(0.0f, 1.0f, 0.0f, 1.0f);
GlsmSdlHeadlessRig.solidQuad(1.0f, 1.0f, 1.0f);
final FrameManager.FrameState frame = GlsmSdlHeadlessRig.frameManager().frame();
final long pass = frame.renderPass;
final long generation = frame.renderPassGeneration;
assertNotEquals(0, pass);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
GlsmSdlHeadlessRig.solidQuad(1.0f, 1.0f, 1.0f);
assertEquals(pass, frame.renderPass);
assertEquals(generation, frame.renderPassGeneration);
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java
index 4bfbe42dd..955050610 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -47,154 +47,154 @@ class GlsmSdlBufferMappingLifetimeTest {
private static ByteBuffer readBack(int target, int size) {
final ByteBuffer out = MemoryUtil.memAlloc(size);
- GLStateManager.glGetBufferSubData(target, 0, out);
+ GLSMBuffers.glGetBufferSubData(target, 0, out);
return out;
}
private static ByteBuffer mapPersistent(int target, int id) {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferStorage(target, SIZE, PERSISTENT_STORAGE);
- return GLStateManager.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP);
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferStorage(target, SIZE, PERSISTENT_STORAGE);
+ return GLSMBuffers.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP);
}
@Test
void bufferDataOnPersistentlyMappedBufferIsRefusedAndMappingSurvives() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
ByteBuffer out = null;
try {
final ByteBuffer mapped = mapPersistent(target, id);
assertNotNull(mapped);
- GLStateManager.glBufferData(target, SIZE * 2L, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(target, SIZE * 2L, GL15.GL_STATIC_DRAW);
fill(mapped, 1);
- GLStateManager.glFlushMappedBufferRange(target, 0, SIZE);
+ GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE);
out = readBack(target, SIZE);
assertPattern(out, 1);
} finally {
if (out != null) MemoryUtil.memFree(out);
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void persistentMapWithoutPersistentStorageReturnsNull() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferData(target, (long) SIZE, GL15.GL_STATIC_DRAW);
- assertNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP));
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferData(target, (long) SIZE, GL15.GL_STATIC_DRAW);
+ assertNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP));
} finally {
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void secondPersistentMapReturnsNullAndFirstStillRoundTrips() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
ByteBuffer out = null;
try {
final ByteBuffer first = mapPersistent(target, id);
assertNotNull(first);
- assertNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP));
+ assertNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP));
fill(first, 2);
- GLStateManager.glFlushMappedBufferRange(target, 0, SIZE);
+ GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE);
out = readBack(target, SIZE);
assertPattern(out, 2);
} finally {
if (out != null) MemoryUtil.memFree(out);
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void twoBuffersMappedNonPersistentlyKeepTheirOwnData() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int a = GLStateManager.glGenBuffers();
- final int b = GLStateManager.glGenBuffers();
+ final int a = GLSMBuffers.glGenBuffers();
+ final int b = GLSMBuffers.glGenBuffers();
ByteBuffer outA = null;
ByteBuffer outB = null;
try {
- GLStateManager.glBindBuffer(target, a);
- GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBindBuffer(target, b);
- GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(target, a);
+ GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(target, b);
+ GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBindBuffer(target, a);
- final ByteBuffer mapA = GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP);
+ GLSMBuffers.glBindBuffer(target, a);
+ final ByteBuffer mapA = GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP);
assertNotNull(mapA);
- GLStateManager.glBindBuffer(target, b);
- final ByteBuffer mapB = GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP);
+ GLSMBuffers.glBindBuffer(target, b);
+ final ByteBuffer mapB = GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP);
assertNotNull(mapB);
fill(mapA, 3);
fill(mapB, 4);
- GLStateManager.glBindBuffer(target, a);
- assertTrue(GLStateManager.glUnmapBuffer(target));
- GLStateManager.glBindBuffer(target, b);
- assertTrue(GLStateManager.glUnmapBuffer(target));
+ GLSMBuffers.glBindBuffer(target, a);
+ assertTrue(GLSMBuffers.glUnmapBuffer(target));
+ GLSMBuffers.glBindBuffer(target, b);
+ assertTrue(GLSMBuffers.glUnmapBuffer(target));
- GLStateManager.glBindBuffer(target, a);
+ GLSMBuffers.glBindBuffer(target, a);
outA = readBack(target, SIZE);
assertPattern(outA, 3);
- GLStateManager.glBindBuffer(target, b);
+ GLSMBuffers.glBindBuffer(target, b);
outB = readBack(target, SIZE);
assertPattern(outB, 4);
} finally {
if (outA != null) MemoryUtil.memFree(outA);
if (outB != null) MemoryUtil.memFree(outB);
- GLStateManager.glDeleteBuffers(a);
- GLStateManager.glDeleteBuffers(b);
+ GLSMBuffers.glDeleteBuffers(a);
+ GLSMBuffers.glDeleteBuffers(b);
}
}
@Test
void unmapOfUnmappedBufferReturnsFalseAndLeavesOtherMappingIntact() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int mappedId = GLStateManager.glGenBuffers();
- final int idle = GLStateManager.glGenBuffers();
+ final int mappedId = GLSMBuffers.glGenBuffers();
+ final int idle = GLSMBuffers.glGenBuffers();
ByteBuffer out = null;
try {
- GLStateManager.glBindBuffer(target, mappedId);
- GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
- final ByteBuffer map = GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP);
+ GLSMBuffers.glBindBuffer(target, mappedId);
+ GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
+ final ByteBuffer map = GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP);
assertNotNull(map);
fill(map, 5);
- GLStateManager.glBindBuffer(target, idle);
- GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
- assertFalse(GLStateManager.glUnmapBuffer(target));
+ GLSMBuffers.glBindBuffer(target, idle);
+ GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
+ assertFalse(GLSMBuffers.glUnmapBuffer(target));
- GLStateManager.glBindBuffer(target, mappedId);
- assertTrue(GLStateManager.glUnmapBuffer(target));
+ GLSMBuffers.glBindBuffer(target, mappedId);
+ assertTrue(GLSMBuffers.glUnmapBuffer(target));
out = readBack(target, SIZE);
assertPattern(out, 5);
} finally {
if (out != null) MemoryUtil.memFree(out);
- GLStateManager.glDeleteBuffers(mappedId);
- GLStateManager.glDeleteBuffers(idle);
+ GLSMBuffers.glDeleteBuffers(mappedId);
+ GLSMBuffers.glDeleteBuffers(idle);
}
}
@Test
void outOfRangeUniformSubDataIsIgnored() {
- final int ubo = GLStateManager.glGenBuffers();
+ final int ubo = GLSMBuffers.glGenBuffers();
final ByteBuffer data = MemoryUtil.memAlloc(256);
final ByteBuffer big = MemoryUtil.memAlloc(64);
ByteBuffer out = null;
try {
fill(data, 6);
fill(big, 7);
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
- GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
+ GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW);
assertDoesNotThrow(() -> {
big.clear();
- GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 1024, big);
+ GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 1024, big);
big.clear();
- GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 224, big);
+ GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 224, big);
big.clear();
- GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, -8, big);
+ GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, -8, big);
});
out = readBack(GL31.GL_UNIFORM_BUFFER, 256);
assertPattern(out, 6);
@@ -202,33 +202,33 @@ class GlsmSdlBufferMappingLifetimeTest {
if (out != null) MemoryUtil.memFree(out);
MemoryUtil.memFree(data);
MemoryUtil.memFree(big);
- GLStateManager.glDeleteBuffers(ubo);
+ GLSMBuffers.glDeleteBuffers(ubo);
}
}
@Test
void uniformBufferMapForReadSeesItsContents() {
- final int ubo = GLStateManager.glGenBuffers();
+ final int ubo = GLSMBuffers.glGenBuffers();
final ByteBuffer data = MemoryUtil.memAlloc(256);
try {
fill(data, 7);
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
- GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW);
- final ByteBuffer mapped = GLStateManager.glMapBufferRange(GL31.GL_UNIFORM_BUFFER, 0, 256, GL30.GL_MAP_READ_BIT);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
+ GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW);
+ final ByteBuffer mapped = GLSMBuffers.glMapBufferRange(GL31.GL_UNIFORM_BUFFER, 0, 256, GL30.GL_MAP_READ_BIT);
assertNotNull(mapped);
assertPattern(mapped, 7);
- assertTrue(GLStateManager.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER));
+ assertTrue(GLSMBuffers.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER));
} finally {
MemoryUtil.memFree(data);
- GLStateManager.glDeleteBuffers(ubo);
+ GLSMBuffers.glDeleteBuffers(ubo);
}
}
@Test
void copyBufferSubDataMovesBytesIntoAndOutOfAUniformBuffer() {
- final int src = GLStateManager.glGenBuffers();
- final int ubo = GLStateManager.glGenBuffers();
- final int dst = GLStateManager.glGenBuffers();
+ final int src = GLSMBuffers.glGenBuffers();
+ final int ubo = GLSMBuffers.glGenBuffers();
+ final int dst = GLSMBuffers.glGenBuffers();
final ByteBuffer srcData = MemoryUtil.memAlloc(256);
final ByteBuffer uboData = MemoryUtil.memAlloc(256);
ByteBuffer outUbo = null;
@@ -236,20 +236,20 @@ class GlsmSdlBufferMappingLifetimeTest {
try {
fill(srcData, 5);
fill(uboData, 6);
- GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src);
- GLStateManager.glBufferData(GL31.GL_COPY_READ_BUFFER, srcData, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
- GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, uboData, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_UNIFORM_BUFFER, 64, 64, 64);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src);
+ GLSMBuffers.glBufferData(GL31.GL_COPY_READ_BUFFER, srcData, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
+ GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, uboData, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_UNIFORM_BUFFER, 64, 64, 64);
outUbo = readBack(GL31.GL_UNIFORM_BUFFER, 256);
for (int i = 0; i < 256; i++) {
final boolean copied = i >= 64 && i < 128;
assertEquals(copied ? srcData.get(i) : uboData.get(i), outUbo.get(i), (copied ? "copied" : "untouched") + " byte " + i);
}
- GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst);
- GLStateManager.glBufferData(GL31.GL_COPY_WRITE_BUFFER, 64L, GL15.GL_STATIC_DRAW);
- GLStateManager.glCopyBufferSubData(GL31.GL_UNIFORM_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 0, 64);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst);
+ GLSMBuffers.glBufferData(GL31.GL_COPY_WRITE_BUFFER, 64L, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_UNIFORM_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 0, 64);
outDst = readBack(GL31.GL_COPY_WRITE_BUFFER, 64);
assertPattern(outDst, 6);
} finally {
@@ -257,35 +257,35 @@ class GlsmSdlBufferMappingLifetimeTest {
if (outDst != null) MemoryUtil.memFree(outDst);
MemoryUtil.memFree(srcData);
MemoryUtil.memFree(uboData);
- GLStateManager.glDeleteBuffers(src);
- GLStateManager.glDeleteBuffers(ubo);
- GLStateManager.glDeleteBuffers(dst);
+ GLSMBuffers.glDeleteBuffers(src);
+ GLSMBuffers.glDeleteBuffers(ubo);
+ GLSMBuffers.glDeleteBuffers(dst);
}
}
@Test
void outOfRangeCopyBufferSubDataIsIgnored() {
- final int src = GLStateManager.glGenBuffers();
- final int dst = GLStateManager.glGenBuffers();
+ final int src = GLSMBuffers.glGenBuffers();
+ final int dst = GLSMBuffers.glGenBuffers();
final ByteBuffer data = MemoryUtil.memAlloc(256);
ByteBuffer outDst = null;
try {
fill(data, 6);
- GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src);
- GLStateManager.glBufferData(GL31.GL_COPY_READ_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src);
+ GLSMBuffers.glBufferData(GL31.GL_COPY_READ_BUFFER, data, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst);
data.clear();
- GLStateManager.glBufferData(GL31.GL_COPY_WRITE_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 200, 0, 128);
- GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 200, 128);
- GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, -4, 0, 16);
+ GLSMBuffers.glBufferData(GL31.GL_COPY_WRITE_BUFFER, data, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 200, 0, 128);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 200, 128);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, -4, 0, 16);
outDst = readBack(GL31.GL_COPY_WRITE_BUFFER, 256);
assertPattern(outDst, 6);
} finally {
if (outDst != null) MemoryUtil.memFree(outDst);
MemoryUtil.memFree(data);
- GLStateManager.glDeleteBuffers(src);
- GLStateManager.glDeleteBuffers(dst);
+ GLSMBuffers.glDeleteBuffers(src);
+ GLSMBuffers.glDeleteBuffers(dst);
}
}
@@ -294,17 +294,17 @@ class GlsmSdlBufferMappingLifetimeTest {
void outOfRangeClearBufferSubDataIsIgnored(int target) {
final int clearStart = 64;
final int clearEnd = 96;
- final int buffer = GLStateManager.glGenBuffers();
+ final int buffer = GLSMBuffers.glGenBuffers();
final ByteBuffer data = MemoryUtil.memAlloc(256);
ByteBuffer out = null;
try {
fill(data, 8);
- GLStateManager.glBindBuffer(target, buffer);
- GLStateManager.glBufferData(target, data, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glClearBufferSubData(target, GL30.GL_R8, clearStart, clearEnd - clearStart, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
- GLStateManager.glClearBufferSubData(target, GL30.GL_R8, 200, 128, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
- GLStateManager.glClearBufferSubData(target, GL30.GL_R8, -4, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
- GLStateManager.glClearBufferSubData(target, GL30.GL_R8, 1024, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
+ GLSMBuffers.glBindBuffer(target, buffer);
+ GLSMBuffers.glBufferData(target, data, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, clearStart, clearEnd - clearStart, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
+ GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, 200, 128, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
+ GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, -4, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
+ GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, 1024, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null);
GlsmSdlHeadlessRig.endFrame();
GlsmSdlHeadlessRig.beginFrame();
out = readBack(target, 256);
@@ -315,49 +315,49 @@ class GlsmSdlBufferMappingLifetimeTest {
} finally {
if (out != null) MemoryUtil.memFree(out);
MemoryUtil.memFree(data);
- GLStateManager.glDeleteBuffers(buffer);
+ GLSMBuffers.glDeleteBuffers(buffer);
}
}
@Test
void secondBufferStorageIsRefused() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferStorage(target, SIZE, PERSISTENT_STORAGE);
- GLStateManager.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE);
- assertEquals(GL11.GL_TRUE, GLStateManager.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE));
- assertEquals(SIZE, GLStateManager.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE));
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferStorage(target, SIZE, PERSISTENT_STORAGE);
+ GLSMBuffers.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE);
+ assertEquals(GL11.GL_TRUE, GLSMBuffers.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE));
+ assertEquals(SIZE, GLSMBuffers.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE));
} finally {
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void namedBufferDataOnImmutableStorageIsRefused() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferStorage(target, SIZE, PERSISTENT_STORAGE);
- GLStateManager.glNamedBufferData(id, SIZE * 2L, GL15.GL_STATIC_DRAW);
- assertEquals(SIZE, GLStateManager.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE));
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferStorage(target, SIZE, PERSISTENT_STORAGE);
+ GLSMBuffers.glNamedBufferData(id, SIZE * 2L, GL15.GL_STATIC_DRAW);
+ assertEquals(SIZE, GLSMBuffers.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE));
} finally {
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void bufferStorageWithNullDataMarksBufferImmutable() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferStorage(target, (ByteBuffer) null, PERSISTENT_STORAGE);
- assertEquals(GL11.GL_TRUE, GLStateManager.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE));
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferStorage(target, (ByteBuffer) null, PERSISTENT_STORAGE);
+ assertEquals(GL11.GL_TRUE, GLSMBuffers.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE));
} finally {
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@@ -370,74 +370,74 @@ class GlsmSdlBufferMappingLifetimeTest {
@ParameterizedTest(name = "{0}")
@MethodSource("plainMapTargets")
void bufferDataOnMappedBufferUnmapsIt(String name, int target) {
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
- assertNotNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP));
- GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
- assertNotNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP));
- assertTrue(GLStateManager.glUnmapBuffer(target));
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
+ assertNotNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP));
+ GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW);
+ assertNotNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP));
+ assertTrue(GLSMBuffers.glUnmapBuffer(target));
} finally {
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void outOfRangeFlushOfPersistentMappingIsIgnored() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
ByteBuffer out = null;
try {
final ByteBuffer mapped = mapPersistent(target, id);
assertNotNull(mapped);
- GLStateManager.glFlushMappedBufferRange(target, SIZE, 64);
- GLStateManager.glFlushMappedBufferRange(target, SIZE - 16, 64);
- GLStateManager.glFlushMappedBufferRange(target, -8, 16);
+ GLSMBuffers.glFlushMappedBufferRange(target, SIZE, 64);
+ GLSMBuffers.glFlushMappedBufferRange(target, SIZE - 16, 64);
+ GLSMBuffers.glFlushMappedBufferRange(target, -8, 16);
fill(mapped, 9);
- GLStateManager.glFlushMappedBufferRange(target, 0, SIZE);
+ GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE);
out = readBack(target, SIZE);
assertPattern(out, 9);
} finally {
if (out != null) MemoryUtil.memFree(out);
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void persistentMappingAtNonZeroOffsetRoundTrips() {
final int target = GL15.GL_ARRAY_BUFFER;
- final int id = GLStateManager.glGenBuffers();
+ final int id = GLSMBuffers.glGenBuffers();
final ByteBuffer out = MemoryUtil.memAlloc(SIZE);
try {
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE);
- final ByteBuffer mapped = GLStateManager.glMapBufferRange(target, SIZE, SIZE, PERSISTENT_MAP);
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE);
+ final ByteBuffer mapped = GLSMBuffers.glMapBufferRange(target, SIZE, SIZE, PERSISTENT_MAP);
assertNotNull(mapped);
fill(mapped, 10);
- GLStateManager.glFlushMappedBufferRange(target, 0, SIZE);
- GLStateManager.glGetBufferSubData(target, SIZE, out);
+ GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE);
+ GLSMBuffers.glGetBufferSubData(target, SIZE, out);
assertPattern(out, 10);
} finally {
MemoryUtil.memFree(out);
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
}
@Test
void copyFromPersistentMappingShorterThanBufferReadsGpuContents() {
- final int src = GLStateManager.glGenBuffers();
- final int dst = GLStateManager.glGenBuffers();
+ final int src = GLSMBuffers.glGenBuffers();
+ final int dst = GLSMBuffers.glGenBuffers();
final ByteBuffer data = MemoryUtil.memAlloc(SIZE * 2);
ByteBuffer out = null;
try {
fill(data, 11);
- GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src);
- GLStateManager.glBufferStorage(GL31.GL_COPY_READ_BUFFER, data, PERSISTENT_STORAGE);
- assertNotNull(GLStateManager.glMapBufferRange(GL31.GL_COPY_READ_BUFFER, 0, SIZE, PERSISTENT_MAP));
- GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst);
- GLStateManager.glBufferData(GL31.GL_COPY_WRITE_BUFFER, SIZE, GL15.GL_STATIC_DRAW);
- GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, SIZE, 0, 256);
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src);
+ GLSMBuffers.glBufferStorage(GL31.GL_COPY_READ_BUFFER, data, PERSISTENT_STORAGE);
+ assertNotNull(GLSMBuffers.glMapBufferRange(GL31.GL_COPY_READ_BUFFER, 0, SIZE, PERSISTENT_MAP));
+ GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst);
+ GLSMBuffers.glBufferData(GL31.GL_COPY_WRITE_BUFFER, SIZE, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, SIZE, 0, 256);
out = readBack(GL31.GL_COPY_WRITE_BUFFER, 256);
for (int i = 0; i < 256; i++) {
assertEquals(data.get(SIZE + i), out.get(i), "byte " + i);
@@ -445,8 +445,8 @@ class GlsmSdlBufferMappingLifetimeTest {
} finally {
if (out != null) MemoryUtil.memFree(out);
MemoryUtil.memFree(data);
- GLStateManager.glDeleteBuffers(src);
- GLStateManager.glDeleteBuffers(dst);
+ GLSMBuffers.glDeleteBuffers(src);
+ GLSMBuffers.glDeleteBuffers(dst);
}
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java
index 4580b4518..4e3a9b7e5 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Tag;
@@ -55,10 +59,10 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.bindTarget();
GlsmSdlHeadlessRig.clearTo(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE, SCISSOR_ROWS);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE, SCISSOR_ROWS);
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
assertRow(pixels, 0, RED, "inside the scissor");
@@ -68,15 +72,15 @@ class GlsmSdlCopyBlitTest {
}
private static int createTwoLevelTexture(int level0Argb, int level1Argb) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 1);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, 1.0f);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 1);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, 1.0f);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f);
GlsmSdlHeadlessRig.uploadSolidLevel(0, SIZE, level0Argb);
GlsmSdlHeadlessRig.uploadSolidLevel(1, SIZE / 2, level1Argb);
return id;
@@ -88,7 +92,7 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.solidQuad(0.0f, 1.0f, 0.0f);
final int texture = createTwoLevelTexture(RED, BLUE);
- GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 0, 0, SIZE / 2, SIZE / 2);
+ GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 0, 0, SIZE / 2, SIZE / 2);
return texture;
}
@@ -136,17 +140,17 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.solidQuad(0.0f, 1.0f, 0.0f);
final int destination = GlsmSdlHeadlessRig.createDepthStencilFbo();
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GlsmSdlHeadlessRig.solidQuad(0.0f, 0.0f, 1.0f);
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE,
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE,
GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
GlsmSdlHeadlessRig.assertPixel(pixels, SIZE, SIZE / 2, SIZE / 2, GREEN, "color aspect of a color+depth blit");
GlsmSdlHeadlessRig.assertPixel(pixels, SIZE, 4, SIZE - 5, GREEN, "color aspect of a color+depth blit");
@@ -160,45 +164,45 @@ class GlsmSdlCopyBlitTest {
final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(destination, dstLevel);
final int dstExtent = Math.max(1, dstSize >> dstLevel);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE / 2, SIZE / 2, 0, 0, dstExtent, dstExtent, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE / 2, SIZE / 2, 0, 0, dstExtent, dstExtent, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(destination, dstLevel), GREEN, "destination level " + dstLevel + " after blitting source level 1");
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(source, 0), RED, "source level 0 is not the blit source");
if (dstLevel != 0) GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(destination, 0), BLUE, "destination level 0 is not the blit target");
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(readFbo);
- GLStateManager.glDeleteFramebuffers(drawFbo);
- GLStateManager.glDeleteTextures(source);
- GLStateManager.glDeleteTextures(destination);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(readFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(drawFbo);
+ GLSMTextures.glDeleteTextures(source);
+ GLSMTextures.glDeleteTextures(destination);
}
@Test
void attachingToTheReadFramebufferLeavesTheDrawFramebufferAlone() {
final int source = GlsmSdlHeadlessRig.createSolidTexture(GREEN);
final int drawColor = GlsmSdlHeadlessRig.createSolidTexture(BLUE);
- final int readFbo = GLStateManager.glGenFramebuffers();
+ final int readFbo = GLSMFramebuffer.glGenFramebuffers();
final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(drawColor, 0);
try {
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0);
- GLStateManager.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(drawColor, 0), GREEN, "the blit reads the read framebuffer's attachment");
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(drawColor, 0), RED, "the draw framebuffer kept its own attachment");
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(source, 0), GREEN, "the read attachment never became a draw target");
} finally {
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(readFbo);
- GLStateManager.glDeleteFramebuffers(drawFbo);
- GLStateManager.glDeleteTextures(source);
- GLStateManager.glDeleteTextures(drawColor);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(readFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(drawFbo);
+ GLSMTextures.glDeleteTextures(source);
+ GLSMTextures.glDeleteTextures(drawColor);
}
}
@@ -221,17 +225,17 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.clearTo(0.0f, 1.0f, 0.0f, 1.0f);
GlsmSdlHeadlessRig.solidQuad(0.0f, 1.0f, 0.0f);
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, 0);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, 4, 4);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, 4, 4);
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
GlsmSdlHeadlessRig.assertPixel(pixels, SIZE, SIZE / 2, SIZE / 2, GREEN, "blit into fbo0 survived the first fbo0 pass");
@@ -243,16 +247,16 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.clearTo(0.0f, 0.0f, 0.0f, 1.0f);
GlsmSdlHeadlessRig.solidQuad(0.0f, 0.0f, 0.0f);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GlsmSdlHeadlessRig.halfQuad(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f);
GlsmSdlHeadlessRig.halfQuad(0.0f, 1.0f, 1.0f, 0.0f, 0.0f);
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
GlsmSdlHeadlessRig.bindTarget();
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
@@ -268,14 +272,14 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.writeStencilOneInBottomHalf();
final int destination = GlsmSdlHeadlessRig.createDepthStencilFbo();
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT, GL11.GL_NEAREST);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination);
GlsmSdlHeadlessRig.drawRedWhereStencilIsOne();
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
@@ -292,7 +296,7 @@ class GlsmSdlCopyBlitTest {
private static int createPatternTexture() {
final int id = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
final ByteBuffer texels = MemoryUtil.memAlloc(SIZE * SIZE * 4);
try {
for (int y = 0; y < SIZE; y++) {
@@ -300,7 +304,7 @@ class GlsmSdlCopyBlitTest {
GlsmSdlHeadlessRig.putArgb(texels, y * SIZE + x, pattern(x, y));
}
}
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
} finally {
MemoryUtil.memFree(texels);
}
@@ -312,15 +316,15 @@ class GlsmSdlCopyBlitTest {
final int destination = GlsmSdlHeadlessRig.createSolidMipTexture(SIZE, 0, UNTOUCHED);
final int readFbo = GlsmSdlHeadlessRig.fboWithColor(source, 0);
final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(destination, 0);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
- GLStateManager.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
+ GLSMFramebuffer.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
final int[] pixels = GlsmSdlHeadlessRig.readTextureLevel(destination, 0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(readFbo);
- GLStateManager.glDeleteFramebuffers(drawFbo);
- GLStateManager.glDeleteTextures(source);
- GLStateManager.glDeleteTextures(destination);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(readFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(drawFbo);
+ GLSMTextures.glDeleteTextures(source);
+ GLSMTextures.glDeleteTextures(destination);
return pixels;
}
@@ -372,19 +376,19 @@ class GlsmSdlCopyBlitTest {
final int third = GlsmSdlHeadlessRig.createSolidMipTexture(SIZE, 0, UNTOUCHED);
final int readFbo = GlsmSdlHeadlessRig.fboWithColor(source, 0);
final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(first, 0);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, skipped, 0);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT2, GL11.GL_TEXTURE_2D, third, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, skipped, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT2, GL11.GL_TEXTURE_2D, third, 0);
final IntBuffer bufs = MemoryUtil.memAllocInt(3);
try {
bufs.put(0, GL30.GL_COLOR_ATTACHMENT0).put(1, GL11.GL_NONE).put(2, GL30.GL_COLOR_ATTACHMENT2);
- GLStateManager.glDrawBuffers(bufs);
+ GLSMFramebuffer.glDrawBuffers(bufs);
} finally {
MemoryUtil.memFree(bufs);
}
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
final int[] firstPixels = GlsmSdlHeadlessRig.readTextureLevel(first, 0);
final int[] thirdPixels = GlsmSdlHeadlessRig.readTextureLevel(third, 0);
@@ -396,12 +400,12 @@ class GlsmSdlCopyBlitTest {
}
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(skipped, 0), UNTOUCHED, "attachment 1 behind a GL_NONE draw buffer");
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(readFbo);
- GLStateManager.glDeleteFramebuffers(drawFbo);
- GLStateManager.glDeleteTextures(source);
- GLStateManager.glDeleteTextures(first);
- GLStateManager.glDeleteTextures(skipped);
- GLStateManager.glDeleteTextures(third);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(readFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(drawFbo);
+ GLSMTextures.glDeleteTextures(source);
+ GLSMTextures.glDeleteTextures(first);
+ GLSMTextures.glDeleteTextures(skipped);
+ GLSMTextures.glDeleteTextures(third);
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java
index a5691742c..1ba677066 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
@@ -16,7 +16,7 @@ class GlsmSdlDegenerateDrawTest {
@ParameterizedTest(name = "count {0}")
@ValueSource(ints = {0, -3})
void degenerateCountDrawArraysLeavesTheFollowingDrawIntact(int count) {
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, count);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, count);
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), RED, "after a drawArrays with count " + count);
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java
index 1a88e70f2..5fc891983 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Tag;
@@ -24,7 +24,7 @@ class GlsmSdlEmptyBufferTransferTest {
@BeforeEach
void setUp() {
- id = GLStateManager.glGenBuffers();
+ id = GLSMBuffers.glGenBuffers();
empty = MemoryUtil.memAlloc(16);
empty.limit(0);
}
@@ -32,35 +32,35 @@ class GlsmSdlEmptyBufferTransferTest {
@AfterEach
void tearDown() {
MemoryUtil.memFree(empty);
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
}
@Test
void emptyBufferDataReplacesTheStoreWithoutACopy() {
final int target = GL40.GL_DRAW_INDIRECT_BUFFER;
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferData(target, 256L, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferData(target, 256L, GL15.GL_STATIC_DRAW);
GlsmSdlHeadlessRig.resourceManager().flushUploadArena();
- GLStateManager.glBufferData(target, empty, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(target, empty, GL15.GL_STATIC_DRAW);
assertEquals(0L, GlsmSdlHeadlessRig.frameManager().frame().arenaCopyPass);
- assertEquals(0, GLStateManager.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE));
+ assertEquals(0, GLSMBuffers.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE));
}
@Test
void emptyStorageBufferSubDataIssuesNoCopy() {
final int target = GL43.GL_SHADER_STORAGE_BUFFER;
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW);
final int before = GlsmSdlHeadlessRig.frameManager().frame().pendingUploadCommands;
- GLStateManager.glBufferSubData(target, 0, empty);
+ GLSMBuffers.glBufferSubData(target, 0, empty);
assertEquals(before, GlsmSdlHeadlessRig.frameManager().frame().pendingUploadCommands);
}
@Test
void emptyGetBufferSubDataDoesNotReachTheDevice() {
final int target = GL43.GL_SHADER_STORAGE_BUFFER;
- GLStateManager.glBindBuffer(target, id);
- GLStateManager.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glGetBufferSubData(target, 0, empty);
+ GLSMBuffers.glBindBuffer(target, id);
+ GLSMBuffers.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glGetBufferSubData(target, 0, empty);
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java
index 48f8b1c57..5bcaca5ff 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.ffp.LogicOpFixture;
import org.junit.jupiter.api.AfterEach;
@@ -49,28 +50,28 @@ class GlsmSdlExternalUboPushTest {
@AfterEach
void cleanup() {
- GLStateManager.glUseProgram(0);
- GLStateManager.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, 0);
- if (ubo != 0) GLStateManager.glDeleteBuffers(ubo);
- if (program != 0) GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glUseProgram(0);
+ GLSMBuffers.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, 0);
+ if (ubo != 0) GLSMBuffers.glDeleteBuffers(ubo);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
LogicOpFixture.deleteResources();
}
@Test
void subDataBetweenDrawsReachesTheSecondDraw() {
program = GlTestSupport.program(VERT, FRAG);
- GLStateManager.glUniformBlockBinding(program, GLStateManager.glGetUniformBlockIndex(program, "Tint"), BINDING);
+ GLSMPrograms.glUniformBlockBinding(program, GLSMPrograms.glGetUniformBlockIndex(program, "Tint"), BINDING);
- ubo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
- GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, color(1f, 0f, 0f), GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, ubo);
+ ubo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
+ GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, color(1f, 0f, 0f), GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, ubo);
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
LogicOpFixture.quad(UNUSED_COLOR);
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
- GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0, color(0f, 1f, 0f));
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo);
+ GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0, color(0f, 1f, 0f));
LogicOpFixture.quad(UNUSED_COLOR);
final int got = pixelAt(GlsmSdlHeadlessRig.readTarget(), SIZE, SIZE / 2, SIZE / 2);
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java
index 3853fb078..72dc0580c 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
@@ -42,27 +46,27 @@ class GlsmSdlFbo0ViewportTest {
}
private static void bindFbo0WithSmallViewport() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, VIEW, VIEW);
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, VIEW, VIEW);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
private static void bindFbo0WithFullViewport() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H);
- GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
private static int createCopyTarget() {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, VIEW, VIEW, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, VIEW, VIEW, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
return id;
}
@@ -84,11 +88,11 @@ class GlsmSdlFbo0ViewportTest {
@Test
void scissoredClearFlipsYOnFbo0() {
bindFbo0WithFullViewport();
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, FBO0_W, VIEW);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, FBO0_W, VIEW);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, 0, FBO0_W, VIEW), RED, "GL scissor y=0 is the bottom rows of the FBO0 texture");
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, FBO0_H - VIEW, FBO0_W, VIEW), BLUE, "the top rows must stay untouched by the flipped scissor");
@@ -97,27 +101,27 @@ class GlsmSdlFbo0ViewportTest {
@Test
void scissorLargerThanFbo0StillCoversTheWholeTarget() {
bindFbo0WithFullViewport();
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
try {
- GLStateManager.glScissor(0, 0, FBO0_W + 16, FBO0_H + 16);
+ GLSMRasterizer.glScissor(0, 0, FBO0_W + 16, FBO0_H + 16);
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, 0, FBO0_W, FBO0_H), RED, "inside an oversize scissor");
} finally {
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
}
}
@Test
void scissorRunningPastTheRightEdgeClipsToTheTarget() {
bindFbo0WithFullViewport();
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
try {
- GLStateManager.glScissor(FBO0_W - 8, 0, 32, FBO0_H);
+ GLSMRasterizer.glScissor(FBO0_W - 8, 0, 32, FBO0_H);
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(FBO0_W - 8, 0, 8, FBO0_H), RED, "inside the clipped scissor");
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, 0, FBO0_W - 8, FBO0_H), BLUE, "left of the scissor");
} finally {
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
}
}
@@ -128,7 +132,7 @@ class GlsmSdlFbo0ViewportTest {
GlsmSdlHeadlessRig.halfQuad(0.0f, 1.0f, 1.0f, 0.0f, 0.0f);
final int copy = createCopyTarget();
- GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, VIEW, VIEW);
+ GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, VIEW, VIEW);
drawTextureOverTarget(copy);
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
@@ -141,15 +145,15 @@ class GlsmSdlFbo0ViewportTest {
bindFbo0WithSmallViewport();
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
- final int copy = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, copy);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
+ final int copy = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, copy);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
assertNull(GlsmSdlHeadlessRig.resourceManager().getTextureMeta(copy), "destination was allocated before the copy");
- GLStateManager.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 0, 0, VIEW, VIEW, 0);
+ GLSMTextures.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 0, 0, VIEW, VIEW, 0);
final ResourceManager.TextureMeta meta = GlsmSdlHeadlessRig.resourceManager().getTextureMeta(copy);
assertNotNull(meta, "copyTexImage2D did not allocate the destination");
@@ -159,7 +163,7 @@ class GlsmSdlFbo0ViewportTest {
GlsmSdlHeadlessRig.endFrame();
final ByteBuffer out = MemoryUtil.memAlloc(VIEW * VIEW * 4);
try {
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
for (int i = 0; i < VIEW * VIEW; i++) {
final int idx = i;
assertEquals((byte) 0xFF, out.get(i * 4), () -> "R at texel " + idx);
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java
index 430f676ca..37cfb04c9 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java
@@ -1,6 +1,11 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.ffp.CubeParityFixture;
import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture;
import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
@@ -43,7 +48,7 @@ class GlsmSdlFfpTest {
@AfterEach
void cleanupInstancing() {
- GLStateManager.setFfpInstancing(Instancing.NONE);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
CubeParityFixture.deleteResources();
ParticleParityFixture.deleteResources();
FfpFixture.EntityIdInstances.delete();
@@ -58,12 +63,12 @@ class GlsmSdlFfpTest {
}
private static void quadUnit0Only() {
- GLStateManager.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
GlsmSdlHeadlessRig.emitVertex(-1.0f, -1.0f, 0.0f, 0.0f, false, (short) 0);
GlsmSdlHeadlessRig.emitVertex(1.0f, -1.0f, 1.0f, 0.0f, false, (short) 0);
GlsmSdlHeadlessRig.emitVertex(1.0f, 1.0f, 1.0f, 1.0f, false, (short) 0);
GlsmSdlHeadlessRig.emitVertex(-1.0f, 1.0f, 0.0f, 1.0f, false, (short) 0);
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
private static void quadTwoUnits(boolean vanillaBrightness) {
@@ -102,15 +107,15 @@ class GlsmSdlFfpTest {
enableLightmapUnit(true);
GlsmSdlHeadlessRig.terrainRenderState();
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(0.0f, 0.0f, 0.0f);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(0.0f, 0.0f, 0.0f);
quadTwoUnits(true);
- GLStateManager.glPopMatrix();
- GLStateManager.glEndList();
+ GLSMMatrices.glPopMatrix();
+ GLSMDraws.glEndList();
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertTexelEverywhere("two units, glCallList");
GlsmSdlHeadlessRig.beginFrameAndClear();
@@ -118,7 +123,7 @@ class GlsmSdlFfpTest {
final IntBuffer lists = BufferUtils.createIntBuffer(1);
lists.put(0, list);
lists.position(0);
- GLStateManager.glCallLists(lists);
+ GLSMDraws.glCallLists(lists);
assertTexelEverywhere("two units, glCallLists");
}
@@ -126,7 +131,7 @@ class GlsmSdlFfpTest {
void litTexturedQuadIsShaded() {
bindBaseTexture();
enableGuiStandardItemLighting();
- GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL);
+ GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL);
quadUnit0Only();
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
@@ -186,30 +191,30 @@ class GlsmSdlFfpTest {
}
private static void enableGuiStandardItemLighting() {
- GLStateManager.glPushMatrix();
- GLStateManager.glRotatef(-30.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glRotatef(165.0f, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glRotatef(-30.0f, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glRotatef(165.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_LIGHT0);
- GLStateManager.glEnable(GL11.GL_LIGHT1);
- GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
+ GLSMEnable.glEnable(GL11.GL_LIGHT1);
+ GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL);
+ GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
final float[] first = normalize(0.2f, 1.0f, -0.7f);
final float[] second = normalize(-0.2f, 1.0f, 0.7f);
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(first[0], first[1], first[2], 0.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, floats(second[0], second[1], second[2], 0.0f));
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
- GLStateManager.glShadeModel(GL11.GL_FLAT);
- GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(first[0], first[1], first[2], 0.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, floats(second[0], second[1], second[2], 0.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f));
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
+ GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f));
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
private static float[] normalize(float x, float y, float z) {
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java
index 35c88276d..62143d089 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java
@@ -1,5 +1,15 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.GlsmRedirectAgent;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
@@ -81,21 +91,21 @@ public final class GlsmSdlHeadlessRig {
private static void createTarget() {
beginFrame();
- colorTexture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, colorTexture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ colorTexture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, colorTexture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- depthRenderbuffer = GLStateManager.glGenRenderbuffers();
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthRenderbuffer);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE);
+ depthRenderbuffer = GLSMFramebuffer.glGenRenderbuffers();
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthRenderbuffer);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE);
- fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTexture, 0);
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthRenderbuffer);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTexture, 0);
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthRenderbuffer);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
PipelineCache.setSwapchainFormats(new int[]{ colorTargetSdlFormat() });
endFrame();
@@ -149,51 +159,51 @@ public final class GlsmSdlHeadlessRig {
}
public static void bindTarget() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
}
public static int createDepthStencilFbo() {
- final int color = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, color);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ final int color = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, color);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- final int depth = GLStateManager.glGenRenderbuffers();
- GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depth);
- GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE);
+ final int depth = GLSMFramebuffer.glGenRenderbuffers();
+ GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depth);
+ GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE);
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, color, 0);
- GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depth);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, color, 0);
+ GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depth);
return fbo;
}
public static void writeStencilOneInBottomHalf() {
- GLStateManager.glClearStencil(0);
- GLStateManager.glStencilMask(0xFF);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 1, 0xFF);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
+ GLSMDepthStencilAlpha.glClearStencil(0);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 1, 0xFF);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
halfQuad(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
}
public static void drawRedWhereStencilIsOne() {
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
solidQuad(1.0f, 0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
}
public static void clearTo(float r, float g, float b, float a) {
- GLStateManager.glClearColor(r, g, b, a);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMBlend.glClearColor(r, g, b, a);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
public static void beginFrameAndClear() {
@@ -210,59 +220,59 @@ public final class GlsmSdlHeadlessRig {
}
public static void resetState() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glDisable(GL11.GL_FOG);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT1);
- GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glDisable(GL11.GL_FOG);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT1);
+ GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL);
+ GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
public static void terrainRenderState() {
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glEnable(GL11.GL_FOG);
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
- GLStateManager.glFogf(GL11.GL_FOG_START, 1.0e6f);
- GLStateManager.glFogf(GL11.GL_FOG_END, 1.0e7f);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMEnable.glEnable(GL11.GL_FOG);
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 1.0e6f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 1.0e7f);
}
public static int newNearestTexture() {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
return id;
}
public static int fboWithColor(int texture, int level) {
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level);
return fbo;
}
@@ -278,7 +288,7 @@ public final class GlsmSdlHeadlessRig {
final ByteBuffer texels = MemoryUtil.memAlloc(size * size * 4);
try {
for (int i = 0; i < size * size; i++) putArgb(texels, i, argb);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
} finally {
MemoryUtil.memFree(texels);
}
@@ -291,12 +301,12 @@ public final class GlsmSdlHeadlessRig {
}
public static int createLightmapTexture(boolean brightCornersOnly) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
final ByteBuffer texels = MemoryUtil.memAlloc(LIGHTMAP_SIZE * LIGHTMAP_SIZE * 4);
try {
final int last = LIGHTMAP_SIZE - 1;
@@ -306,74 +316,74 @@ public final class GlsmSdlHeadlessRig {
putArgb(texels, y * LIGHTMAP_SIZE + x, bright ? 0xFFFFFFFF : GREEN);
}
}
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
} finally {
MemoryUtil.memFree(texels);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
return id;
}
public static void bindBaseTexture(int texture) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
}
public static void quadTwoUnits(short brightness) {
- GLStateManager.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
emitVertex(-1.0f, -1.0f, 0.0f, 0.0f, true, brightness);
emitVertex(1.0f, -1.0f, 1.0f, 0.0f, true, brightness);
emitVertex(1.0f, 1.0f, 1.0f, 1.0f, true, brightness);
emitVertex(-1.0f, 1.0f, 0.0f, 1.0f, true, brightness);
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
public static void enableLightmapUnit(int lightmapTexture, boolean vanillaTextureMatrix) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
if (vanillaTextureMatrix) {
final float scale = 0.00390625f;
- GLStateManager.glScalef(scale, scale, scale);
- GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f);
+ GLSMMatrices.glScalef(scale, scale, scale);
+ GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f);
}
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
public static void emitVertex(float x, float y, float u, float v, boolean lightmap, short brightness) {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glTexCoord2f(u, v);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glTexCoord2f(u, v);
if (lightmap) {
- GLStateManager.glMultiTexCoord2s(GL13.GL_TEXTURE1, brightness, brightness);
+ GLSMCurrentAttribs.glMultiTexCoord2s(GL13.GL_TEXTURE1, brightness, brightness);
}
- GLStateManager.glVertex3f(x, y, 0.0f);
+ GLSMDraws.glVertex3f(x, y, 0.0f);
}
private static void vertex(float x, float y, float r, float g, float b) {
- GLStateManager.glColor4f(r, g, b, 1.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glVertex3f(x, y, 0.0f);
+ GLSMCurrentAttribs.glColor4f(r, g, b, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMDraws.glVertex3f(x, y, 0.0f);
}
private static void texVertex(float x, float y, float u, float v) {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f);
- GLStateManager.glTexCoord2f(u, v);
- GLStateManager.glVertex3f(x, y, 0.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f);
+ GLSMCurrentAttribs.glTexCoord2f(u, v);
+ GLSMDraws.glVertex3f(x, y, 0.0f);
}
public static void halfQuad(float y0, float y1, float r, float g, float b) {
- GLStateManager.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
vertex(-1.0f, y0, r, g, b);
vertex(1.0f, y0, r, g, b);
vertex(1.0f, y1, r, g, b);
vertex(-1.0f, y1, r, g, b);
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
public static void solidQuad(float r, float g, float b) {
@@ -381,16 +391,16 @@ public final class GlsmSdlHeadlessRig {
}
public static void texturedQuad(int texture, float extent) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glBegin(GL11.GL_QUADS);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
texVertex(-extent, -extent, 0.0f, 0.0f);
texVertex(extent, -extent, 1.0f, 0.0f);
texVertex(extent, extent, 1.0f, 1.0f);
texVertex(-extent, extent, 0.0f, 1.0f);
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
public static int[] readTarget() {
@@ -406,7 +416,7 @@ public final class GlsmSdlHeadlessRig {
final ByteBuffer pixels = MemoryUtil.memAlloc(w * h * 4);
try {
for (int i = 0; i < w * h * 4; i++) pixels.put(i, fill);
- GLStateManager.glReadPixels(x, y, w, h, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMFramebuffer.glReadPixels(x, y, w, h, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
return toArgb(pixels, w * h);
} finally {
MemoryUtil.memFree(pixels);
@@ -414,12 +424,12 @@ public final class GlsmSdlHeadlessRig {
}
public static int createSolidMipTexture(int size, int maxLevel, int argb) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel);
for (int level = 0; level <= maxLevel; level++) {
uploadSolidLevel(level, Math.max(1, size >> level), argb);
}
@@ -427,13 +437,13 @@ public final class GlsmSdlHeadlessRig {
}
public static int[] readTextureLevel(int texture, int level) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- final int w = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH);
- final int h = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ final int w = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH);
+ final int h = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT);
final ByteBuffer pixels = MemoryUtil.memAlloc(w * h * 4);
try {
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
return toArgb(pixels, w * h);
} finally {
MemoryUtil.memFree(pixels);
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java
index 4426d2f59..ae26e73aa 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.sdlgpu.SdlAsserts;
import com.gtnewhorizons.angelica.sdlgpu.SdlTestRig;
@@ -25,7 +25,7 @@ class GlsmSdlIndexedBlendRestoreTest {
}
private static void vanillaBlendFunc() {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
}
@Test
@@ -43,9 +43,9 @@ class GlsmSdlIndexedBlendRestoreTest {
for (int i = 0; i < ContextState.MAX_COLOR_ATTACHMENTS; i++) {
SdlAsserts.assertBlendFactors(p, i, SDL_GPU_BLENDFACTOR_SRC_ALPHA, SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_GPU_BLENDFACTOR_ONE, SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, "restore");
}
- assertFalse(GLStateManager.getBlendState().isFuncUnknown(), "restore forward must clear the unknown flag");
+ assertFalse(GLSMBlend.getBlendState().isFuncUnknown(), "restore forward must clear the unknown flag");
} finally {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
}
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java
index d36fdca9e..1714083b1 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.sdlgpu.SDLGPUGate;
@@ -53,22 +57,22 @@ class GlsmSdlInstancedConstantTest {
Reflect.set(device, "driverName", "metal");
final int program = GlTestSupport.program(VERT, FRAG);
- final int vao = GLStateManager.glGenVertexArrays();
- final int vbo = GLStateManager.glGenBuffers();
+ final int vao = GLSMVertexInput.glGenVertexArrays();
+ final int vbo = GLSMBuffers.glGenBuffers();
final FloatBuffer quad = MemoryUtil.memAllocFloat(12);
try {
quad.put(new float[] { 0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1 }).flip();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0L);
- GLStateManager.glDisableVertexAttribArray(TINT_LOCATION);
- GLStateManager.glVertexAttrib4f(TINT_LOCATION, 0.2f, 0.4f, 0.6f, 1.0f);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0L);
+ GLSMVertexInput.glDisableVertexAttribArray(TINT_LOCATION);
+ GLSMCurrentAttribs.glVertexAttrib4f(TINT_LOCATION, 0.2f, 0.4f, 0.6f, 1.0f);
- GLStateManager.glUseProgram(program);
- GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 6, INSTANCES);
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(program);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 6, INSTANCES);
+ GLSMPrograms.glUseProgram(0);
final int[] row = GlsmSdlHeadlessRig.readTarget(0, GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE, 1);
final int expected = 0xFF000000 | (51 << 16) | (102 << 8) | 153;
@@ -80,11 +84,11 @@ class GlsmSdlInstancedConstantTest {
} finally {
Reflect.set(device, "driverName", driver);
MemoryUtil.memFree(quad);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteBuffers(vbo);
- GLStateManager.glDeleteVertexArrays(vao);
- GLStateManager.glDeleteProgram(program);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(vbo);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
+ GLSMPrograms.glDeleteProgram(program);
}
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java
index 85ce7ecc4..4220a1a8d 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java
@@ -1,5 +1,8 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.PixelStoreState;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
@@ -43,11 +46,11 @@ class GlsmSdlLWJGLServiceRoutingTest {
final int buffer = svc.glGenBuffers();
svc.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
svc.glBufferData(GL15.GL_ARRAY_BUFFER, 64L, GL15.GL_STATIC_DRAW);
- assertEquals(buffer, GLStateManager.getBoundVBO());
+ assertEquals(buffer, GLSMBuffers.getBoundVBO());
svc.glDeleteBuffers(buffer);
- assertEquals(0, GLStateManager.getBoundVBO());
+ assertEquals(0, GLSMBuffers.getBoundVBO());
}
@Test
@@ -71,9 +74,9 @@ class GlsmSdlLWJGLServiceRoutingTest {
void clearColorUpdatesTheGlsmCache() {
svc.glClearColor(0.25f, 0.5f, 0.75f, 1.0f);
- assertEquals(0.25f, GLStateManager.getClearColor().getRed());
- assertEquals(0.5f, GLStateManager.getClearColor().getGreen());
- assertEquals(0.75f, GLStateManager.getClearColor().getBlue());
+ assertEquals(0.25f, GLSMBlend.getClearColor().getRed());
+ assertEquals(0.5f, GLSMBlend.getClearColor().getGreen());
+ assertEquals(0.75f, GLSMBlend.getClearColor().getBlue());
}
@Test
@@ -93,11 +96,11 @@ class GlsmSdlLWJGLServiceRoutingTest {
final int framebuffer = svc.glGenFramebuffers();
try {
svc.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
- assertEquals(framebuffer, GLStateManager.getDrawFramebuffer());
+ assertEquals(framebuffer, GLSMFramebuffer.getDrawFramebuffer());
svc.glDeleteFramebuffers(framebuffer);
- assertEquals(0, GLStateManager.getDrawFramebuffer());
+ assertEquals(0, GLSMFramebuffer.getDrawFramebuffer());
} finally {
GlsmSdlHeadlessRig.bindTarget();
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java
index 58be05eb8..14e4a7c77 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java
@@ -1,5 +1,12 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.LegacyQueryFixture;
import org.junit.jupiter.api.Tag;
@@ -38,7 +45,7 @@ class GlsmSdlLegacyQueryTest {
// fails the non-zero expectations below.
@Test
void legacyQueriesAreAnsweredWithoutTheBackend() {
- final int base = GLStateManager.getAttribDepth();
+ final int base = GLSMAttribStack.getAttribDepth();
final IntBuffer ints = BufferUtils.createIntBuffer(16);
final FloatBuffer floats = BufferUtils.createFloatBuffer(16);
final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(16);
@@ -46,91 +53,91 @@ class GlsmSdlLegacyQueryTest {
final FloatBuffer positions = BufferUtils.createFloatBuffer(12);
final FloatBuffer other = BufferUtils.createFloatBuffer(12);
final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
- final boolean savedLighting = GLStateManager.glIsEnabled(GL11.GL_LIGHTING);
- final boolean savedEdge = GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG);
+ GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor);
+ final boolean savedLighting = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING);
+ final boolean savedEdge = GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG);
final int[] savedHints = new int[HINT_TARGETS.length];
for (int i = 0; i < HINT_TARGETS.length; i++) {
- savedHints[i] = GLStateManager.glGetInteger(HINT_TARGETS[i]);
+ savedHints[i] = GLSMQueries.glGetInteger(HINT_TARGETS[i]);
}
try {
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
- GLStateManager.glClientActiveTexture(0);
- assertEquals(1, GLStateManager.getClientActiveTextureUnit(), "an invalid unit is rejected");
- assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLStateManager.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS));
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE));
+ GLSMTextures.glClientActiveTexture(0);
+ assertEquals(1, GLSMTextures.getClientActiveTextureUnit(), "an invalid unit is rejected");
+ assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLSMQueries.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS));
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
for (final int cap : CLIENT_ARRAY_CAPS) {
- final boolean was = GLStateManager.glIsEnabled(cap);
+ final boolean was = GLSMEnable.glIsEnabled(cap);
assertEnableRoundTrip(cap, true);
- if (was) GLStateManager.glEnableClientState(cap);
+ if (was) GLSMVertexInput.glEnableClientState(cap);
}
for (final int cap : CACHE_ONLY_CAPS) {
- final boolean was = GLStateManager.glIsEnabled(cap);
+ final boolean was = GLSMEnable.glIsEnabled(cap);
assertEnableRoundTrip(cap, false);
setEnabled(cap, was);
}
- GLStateManager.glEdgeFlag(false);
- assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG));
- GLStateManager.glEdgeFlag(true);
- assertTrue(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG));
+ GLSMCurrentAttribs.glEdgeFlag(false);
+ assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG));
+ GLSMCurrentAttribs.glEdgeFlag(true);
+ assertTrue(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG));
for (final int target : HINT_TARGETS) {
final String name = hex(target);
- GLStateManager.glHint(target, GL11.GL_NICEST);
- assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "set " + name);
- assertEquals((float) GL11.GL_NICEST, GLStateManager.glGetFloat(target), "float " + name);
- GLStateManager.glPushAttrib(GL11.GL_HINT_BIT);
- GLStateManager.glHint(target, GL11.GL_FASTEST);
- assertEquals(GL11.GL_FASTEST, GLStateManager.glGetInteger(target), "inside push " + name);
- GLStateManager.glPopAttrib();
- assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "after pop " + name);
+ GLSMRasterizer.glHint(target, GL11.GL_NICEST);
+ assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "set " + name);
+ assertEquals((float) GL11.GL_NICEST, GLSMQueries.glGetFloat(target), "float " + name);
+ GLSMAttribStack.glPushAttrib(GL11.GL_HINT_BIT);
+ GLSMRasterizer.glHint(target, GL11.GL_FASTEST);
+ assertEquals(GL11.GL_FASTEST, GLSMQueries.glGetInteger(target), "inside push " + name);
+ GLSMAttribStack.glPopAttrib();
+ assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "after pop " + name);
}
- GLStateManager.glVertexPointer(3, 12, positions);
- GLStateManager.glFogCoordPointer(4, positions);
- assertEquals(3, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE));
- assertEquals(GL11.GL_FLOAT, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_TYPE));
- assertEquals(12, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE));
- assertEquals(0, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
- assertEquals(4, GLStateManager.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE));
- assertEquals(3, GLStateManager.glGetInteger(GL14.GL_SECONDARY_COLOR_ARRAY_SIZE));
- GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
- GLStateManager.glVertexPointer(2, 8, other);
- GLStateManager.glFogCoordPointer(8, other);
- GLStateManager.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
- assertEquals(2, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE));
- GLStateManager.glPopClientAttrib();
- assertEquals(3, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "client attrib pop restores the pointer");
- assertEquals(12, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE));
- assertEquals(4, GLStateManager.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE));
- assertFalse(GLStateManager.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY));
+ GLSMVertexInput.glVertexPointer(3, 12, positions);
+ GLSMVertexInput.glFogCoordPointer(4, positions);
+ assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE));
+ assertEquals(GL11.GL_FLOAT, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_TYPE));
+ assertEquals(12, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE));
+ assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING));
+ assertEquals(4, GLSMQueries.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE));
+ assertEquals(3, GLSMQueries.glGetInteger(GL14.GL_SECONDARY_COLOR_ARRAY_SIZE));
+ GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT);
+ GLSMVertexInput.glVertexPointer(2, 8, other);
+ GLSMVertexInput.glFogCoordPointer(8, other);
+ GLSMVertexInput.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
+ assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE));
+ GLSMAttribStack.glPopClientAttrib();
+ assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "client attrib pop restores the pointer");
+ assertEquals(12, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE));
+ assertEquals(4, GLSMQueries.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE));
+ assertFalse(GLSMEnable.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY));
- GLStateManager.glColor4f(1.0f, 0.5f, 0.0f, 1.0f);
- GLStateManager.glGetInteger(GL11.GL_CURRENT_COLOR, ints);
+ GLSMCurrentAttribs.glColor4f(1.0f, 0.5f, 0.0f, 1.0f);
+ GLSMQueries.glGetInteger(GL11.GL_CURRENT_COLOR, ints);
assertEquals(2147483647, ints.get(0));
assertEquals(1073741823, ints.get(1));
assertEquals(0, ints.get(2));
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- assertEquals(1, GLStateManager.glGetInteger(GL11.GL_LIGHTING));
- assertEquals(1.0f, GLStateManager.glGetFloat(GL11.GL_LIGHTING));
- assertEquals((float) GLStateManager.glGetInteger(GL11.GL_FOG_MODE), GLStateManager.glGetFloat(GL11.GL_FOG_MODE));
- assertEquals(GL11.GL_RENDER, GLStateManager.glGetInteger(GL11.GL_RENDER_MODE));
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_LIGHTING));
+ assertEquals(1.0f, GLSMQueries.glGetFloat(GL11.GL_LIGHTING));
+ assertEquals((float) GLSMQueries.glGetInteger(GL11.GL_FOG_MODE), GLSMQueries.glGetFloat(GL11.GL_FOG_MODE));
+ assertEquals(GL11.GL_RENDER, GLSMQueries.glGetInteger(GL11.GL_RENDER_MODE));
for (final int pname : LegacyQueryFixture.legacyPnames()) {
final String name = hex(pname);
- final int scalar = GLStateManager.glGetInteger(pname);
- final float scalarFloat = GLStateManager.glGetFloat(pname);
- final boolean scalarBool = GLStateManager.glGetBoolean(pname);
+ final int scalar = GLSMQueries.glGetInteger(pname);
+ final float scalarFloat = GLSMQueries.glGetFloat(pname);
+ final boolean scalarBool = GLSMQueries.glGetBoolean(pname);
ints.clear();
- GLStateManager.glGetInteger(pname, ints);
+ GLSMQueries.glGetInteger(pname, ints);
floats.clear();
- GLStateManager.glGetFloat(pname, floats);
+ GLSMQueries.glGetFloat(pname, floats);
doubles.clear();
- GLStateManager.glGetDouble(pname, doubles);
+ GLSMQueries.glGetDouble(pname, doubles);
bytes.clear();
- GLStateManager.glGetBoolean(pname, bytes);
+ GLSMQueries.glGetBoolean(pname, bytes);
assertEquals(scalar, ints.get(0), "IntBuffer overload for " + name);
assertEquals(scalarFloat, floats.get(0), "FloatBuffer overload for " + name);
assertEquals((double) scalarFloat, doubles.get(0), "DoubleBuffer overload for " + name);
@@ -139,13 +146,13 @@ class GlsmSdlLegacyQueryTest {
} finally {
drainClientAttribStack();
popAttribTo(base);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY);
for (int i = 0; i < HINT_TARGETS.length; i++) {
- GLStateManager.glHint(HINT_TARGETS[i], savedHints[i]);
+ GLSMRasterizer.glHint(HINT_TARGETS[i], savedHints[i]);
}
- GLStateManager.glEdgeFlag(savedEdge);
- GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
+ GLSMCurrentAttribs.glEdgeFlag(savedEdge);
+ GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3));
setEnabled(GL11.GL_LIGHTING, savedLighting);
}
}
@@ -153,33 +160,33 @@ class GlsmSdlLegacyQueryTest {
@Test
void pointParametersRoundTrip() {
final FloatBuffer attenuation = BufferUtils.createFloatBuffer(16);
- final float savedMin = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN);
- final float savedMax = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX);
- final float savedThreshold = GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE);
- final int savedOrigin = GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN);
- final int base = GLStateManager.getAttribDepth();
+ final float savedMin = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN);
+ final float savedMax = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX);
+ final float savedThreshold = GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE);
+ final int savedOrigin = GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN);
+ final int base = GLSMAttribStack.getAttribDepth();
try {
assertEquals(1.0f, savedMax);
- GLStateManager.glPushAttrib(GL11.GL_POINT_BIT);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.0f);
- GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 8.0f);
- GLStateManager.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 3.0f);
- GLStateManager.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.0f);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 8.0f);
+ GLSMRasterizer.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 3.0f);
+ GLSMRasterizer.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT);
attenuation.clear();
attenuation.put(0, 0.5f).put(1, 0.25f).put(2, 0.125f);
- GLStateManager.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
- assertEquals(2.0f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN));
- assertEquals(8.0f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX));
- assertEquals(3.0f, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
- assertEquals(GL20.GL_LOWER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
+ GLSMRasterizer.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
+ assertEquals(2.0f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN));
+ assertEquals(8.0f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX));
+ assertEquals(3.0f, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
+ assertEquals(GL20.GL_LOWER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
attenuation.clear();
- GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
+ GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation);
assertEquals(0.25f, attenuation.get(1));
- GLStateManager.glPopAttrib();
- assertEquals(savedMin, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN));
- assertEquals(savedMax, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX));
- assertEquals(savedThreshold, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
- assertEquals(savedOrigin, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
+ GLSMAttribStack.glPopAttrib();
+ assertEquals(savedMin, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN));
+ assertEquals(savedMax, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX));
+ assertEquals(savedThreshold, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE));
+ assertEquals(savedOrigin, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN));
} finally {
popAttribTo(base);
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java
index a8eb04cb7..e634f737d 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java
@@ -1,6 +1,11 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.ffp.LogicOpFixture;
import org.junit.jupiter.api.AfterEach;
@@ -58,10 +63,10 @@ class GlsmSdlLogicOpTest {
@AfterEach
void cleanup() {
- GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glLogicOp(GL11.GL_COPY);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glUseProgram(0);
+ GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMBlend.glLogicOp(GL11.GL_COPY);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMPrograms.glUseProgram(0);
LogicOpFixture.deleteResources();
}
@@ -80,8 +85,8 @@ class GlsmSdlLogicOpTest {
@Test
void blendingIsIgnoredWhileLogicOpIsEnabled() {
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
final int[] src = LogicOpFixture.SOURCES[1];
LogicOpFixture.clearToDst();
LogicOpFixture.drawQuad(GL11.GL_XOR, src);
@@ -93,8 +98,8 @@ class GlsmSdlLogicOpTest {
final int[] src = LogicOpFixture.SOURCES[1];
LogicOpFixture.clearToDst();
LogicOpFixture.drawQuad(GL11.GL_XOR, src);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
LogicOpFixture.quad(src);
final int got = centerPixel();
@@ -112,9 +117,9 @@ class GlsmSdlLogicOpTest {
GlsmSdlHeadlessRig.beginFrame();
GlsmSdlHeadlessRig.bindTarget();
LogicOpFixture.clearToDst();
- GLStateManager.glUseProgram(singleProgram);
+ GLSMPrograms.glUseProgram(singleProgram);
LogicOpFixture.drawQuad(op, PROGRAM_SRC);
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
assertCenter(op, PROGRAM_SRC, "user program " + LogicOpFixture.label(op, PROGRAM_SRC));
}
}
@@ -124,54 +129,54 @@ class GlsmSdlLogicOpTest {
mrtProgram = buildProgram(mrtProgram, FRAG_MRT);
final int unorm = colorTexture(GL11.GL_RGBA8, GL11.GL_UNSIGNED_BYTE);
final int half = colorTexture(GL30.GL_RGBA16F, GL11.GL_FLOAT);
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, unorm, 0);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, half, 0);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, unorm, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, half, 0);
final IntBuffer bufs = BufferUtils.createIntBuffer(2);
bufs.put(GL30.GL_COLOR_ATTACHMENT0).put(GL30.GL_COLOR_ATTACHMENT1).flip();
- GLStateManager.glDrawBuffers(bufs);
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ GLSMFramebuffer.glDrawBuffers(bufs);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
LogicOpFixture.clearToDst();
- GLStateManager.glUseProgram(mrtProgram);
+ GLSMPrograms.glUseProgram(mrtProgram);
LogicOpFixture.drawQuad(GL11.GL_OR_REVERSE, PROGRAM_SRC);
- GLStateManager.glUseProgram(0);
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMPrograms.glUseProgram(0);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
GlsmSdlHeadlessRig.endFrame();
- GLStateManager.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0);
+ GLSMFramebuffer.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0);
final ByteBuffer px = BufferUtils.createByteBuffer(4);
- GLStateManager.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, px);
+ GLSMFramebuffer.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, px);
assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[0], LogicOpFixture.DST_R), px.get(0) & 0xFF, "unorm red");
assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[1], LogicOpFixture.DST_G), px.get(1) & 0xFF, "unorm green");
assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[2], LogicOpFixture.DST_B), px.get(2) & 0xFF, "unorm blue");
assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[3], LogicOpFixture.DST_A), px.get(3) & 0xFF, "unorm alpha");
- GLStateManager.glReadBuffer(GL30.GL_COLOR_ATTACHMENT1);
+ GLSMFramebuffer.glReadBuffer(GL30.GL_COLOR_ATTACHMENT1);
final ByteBuffer fpx = BufferUtils.createByteBuffer(16).order(ByteOrder.nativeOrder());
- GLStateManager.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_FLOAT, fpx);
+ GLSMFramebuffer.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_FLOAT, fpx);
assertEquals(0.2f, fpx.getFloat(0), 1e-3f, "float red passes through unblended");
assertEquals(0.4f, fpx.getFloat(4), 1e-3f, "float green passes through unblended");
assertEquals(0.8f, fpx.getFloat(8), 1e-3f, "float blue passes through unblended");
assertEquals(1.0f, fpx.getFloat(12), 1e-3f, "float alpha passes through unblended");
- GLStateManager.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteTextures(unorm);
- GLStateManager.glDeleteTextures(half);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMTextures.glDeleteTextures(unorm);
+ GLSMTextures.glDeleteTextures(half);
}
private static int colorTexture(int internalFormat, int type) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, GL11.GL_RGBA, type, (ByteBuffer) null);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, GL11.GL_RGBA, type, (ByteBuffer) null);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return id;
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java
index 4ea292917..df08f00fa 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -25,7 +28,7 @@ class GlsmSdlMipAttachmentTest {
private static final int BASE = 0xFF10C030;
private static void setClearColor(int argb) {
- GLStateManager.glClearColor(((argb >> 16) & 0xFF) / 255.0f, ((argb >> 8) & 0xFF) / 255.0f, (argb & 0xFF) / 255.0f, ((argb >>> 24) & 0xFF) / 255.0f);
+ GLSMBlend.glClearColor(((argb >> 16) & 0xFF) / 255.0f, ((argb >> 8) & 0xFF) / 255.0f, (argb & 0xFF) / 255.0f, ((argb >>> 24) & 0xFF) / 255.0f);
}
private static int levelColor(int level) {
@@ -39,10 +42,10 @@ class GlsmSdlMipAttachmentTest {
for (int level = 1; level <= MAX_LEVEL; level++) {
final int extent = Math.max(1, TEX_SIZE >> level);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level);
- GLStateManager.glViewport(0, 0, extent, extent);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level);
+ GLSMRasterizer.glViewport(0, 0, extent, extent);
setClearColor(levelColor(level));
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
for (int level = 1; level <= MAX_LEVEL; level++) {
@@ -50,36 +53,36 @@ class GlsmSdlMipAttachmentTest {
}
assertUniform(readTextureLevel(texture, 0), BASE, "level 0 untouched by clearing the mip levels");
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1);
final int w = Math.max(1, TEX_SIZE >> 1);
final ByteBuffer pixels = MemoryUtil.memAlloc(w * w * 4);
try {
- GLStateManager.glReadPixels(0, 0, w, w, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
+ GLSMFramebuffer.glReadPixels(0, 0, w, w, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
assertUniform(GlsmSdlHeadlessRig.toArgb(pixels, w * w), levelColor(1), "readPixels of the level 1 attachment");
} finally {
MemoryUtil.memFree(pixels);
}
- GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteTextures(texture);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMTextures.glDeleteTextures(texture);
}
@Test
void pendingLevelZeroClearIsNotAppliedToALevelOnePass() {
final int texture = createSolidMipTexture(TEX_SIZE, MAX_LEVEL, BASE);
final int fbo = GlsmSdlHeadlessRig.fboWithColor(texture, 0);
- GLStateManager.glViewport(0, 0, TEX_SIZE, TEX_SIZE);
+ GLSMRasterizer.glViewport(0, 0, TEX_SIZE, TEX_SIZE);
setClearColor(CLEAR);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1);
- GLStateManager.glViewport(0, 0, TEX_SIZE / 2, TEX_SIZE / 2);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1);
+ GLSMRasterizer.glViewport(0, 0, TEX_SIZE / 2, TEX_SIZE / 2);
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
assertUniform(readTextureLevel(texture, 1), RED, "level 1 after drawing into it");
assertUniform(readTextureLevel(texture, 0), CLEAR, "level 0 keeps its own pending clear");
- GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteTextures(texture);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMTextures.glDeleteTextures(texture);
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java
index 671b19e72..efea4b7c2 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.testutil.TestThreads;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -14,6 +14,6 @@ class GlsmSdlOffContextCreationTest {
@Test
void creationWithoutContextThrows() throws InterruptedException {
- TestThreads.run("sdl-no-context", () -> assertThrows(IllegalStateException.class, GLStateManager::glGenTextures));
+ TestThreads.run("sdl-no-context", () -> assertThrows(IllegalStateException.class, GLSMTextures::glGenTextures));
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java
index 76a46fbf3..ef37303b5 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -24,9 +24,9 @@ class GlsmSdlOutOfFrameReadbackTest {
void outOfFrameTexImageReadback() {
final ByteBuffer pattern = pattern(TEX_SIZE, TEX_SIZE, 1);
final int tex = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern);
assertReadback(tex, TEX_SIZE, TEX_SIZE, pattern);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
@ParameterizedTest(name = "in frame: {0}")
@@ -39,13 +39,13 @@ class GlsmSdlOutOfFrameReadbackTest {
private static void copyAndReadBack(int seed) {
final ByteBuffer pattern = pattern(TEX_SIZE, TEX_SIZE, seed);
final int src = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern);
final int dst = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- GLStateManager.glCopyImageSubData(src, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, TEX_SIZE, TEX_SIZE, 1);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glCopyImageSubData(src, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, TEX_SIZE, TEX_SIZE, 1);
assertReadback(dst, TEX_SIZE, TEX_SIZE, pattern);
- GLStateManager.glDeleteTextures(src);
- GLStateManager.glDeleteTextures(dst);
+ GLSMTextures.glDeleteTextures(src);
+ GLSMTextures.glDeleteTextures(dst);
}
private static ByteBuffer pattern(int w, int h, int seed) {
@@ -60,11 +60,11 @@ class GlsmSdlOutOfFrameReadbackTest {
}
private static void assertReadback(int tex, int w, int h, ByteBuffer expected) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
final ByteBuffer got = BufferUtils.createByteBuffer(w * h * 4);
for (int i = 0; i < got.capacity(); i++) got.put(i, (byte) 0xCD);
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, got);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, got);
final int n = w * h * 4;
int mismatches = 0;
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java
index ddafcd59a..0890b0224 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Tag;
@@ -41,8 +41,8 @@ class GlsmSdlProxyTextureProbeTest {
@Test
void vanillaMaximumTextureSizeProbeLeavesTheBoundLightmapIntact() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager();
final long handleBefore = rm.getTextureHandle(lightmapTexture);
@@ -54,15 +54,15 @@ class GlsmSdlProxyTextureProbeTest {
assertEquals(LIGHTMAP_SIZE, meta.width(), "lightmap width after probe");
assertEquals(LIGHTMAP_SIZE, meta.height(), "lightmap height after probe");
assertEquals(handleBefore, rm.getTextureHandle(lightmapTexture), "lightmap handle after probe");
- assertEquals(LIGHTMAP_SIZE, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH));
+ assertEquals(LIGHTMAP_SIZE, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
@Test
void proxyTargetCallsLeaveTheBoundTextureIntact() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager();
final long handleBefore = rm.getTextureHandle(lightmapTexture);
@@ -71,12 +71,12 @@ class GlsmSdlProxyTextureProbeTest {
for (int target : PROXY_TARGETS) {
final String where = "0x" + Integer.toHexString(target);
- GLStateManager.glTexParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameterf(target, GL12.GL_TEXTURE_MIN_LOD, 4.0f);
- GLStateManager.glTexSubImage2D(target, 0, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- GLStateManager.glCopyTexSubImage2D(target, 0, 0, 0, 0, 0, 1, 1);
- GLStateManager.glCopyTexImage2D(target, 0, GL11.GL_RGBA, 0, 0, 4, 4, 0);
- GLStateManager.glGenerateMipmap(target);
+ GLSMTextures.glTexParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameterf(target, GL12.GL_TEXTURE_MIN_LOD, 4.0f);
+ GLSMTextures.glTexSubImage2D(target, 0, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glCopyTexSubImage2D(target, 0, 0, 0, 0, 0, 1, 1);
+ GLSMTextures.glCopyTexImage2D(target, 0, GL11.GL_RGBA, 0, 0, 4, 4, 0);
+ GLSMTextures.glGenerateMipmap(target);
final ResourceManager.TextureMeta after = rm.getTextureMeta(lightmapTexture);
assertNotNull(after, where);
@@ -87,7 +87,7 @@ class GlsmSdlProxyTextureProbeTest {
assertEquals(handleBefore, rm.getTextureHandle(lightmapTexture), where);
}
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
@Test
@@ -95,9 +95,9 @@ class GlsmSdlProxyTextureProbeTest {
GlsmSdlHeadlessRig.bindBaseTexture(baseTexture);
GlsmSdlHeadlessRig.enableLightmapUnit(lightmapTexture, true);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(16384, vanillaGetGLMaximumTextureSize());
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
GlsmSdlHeadlessRig.terrainRenderState();
GlsmSdlHeadlessRig.quadTwoUnits((short) 240);
@@ -111,8 +111,8 @@ class GlsmSdlProxyTextureProbeTest {
private static int vanillaGetGLMaximumTextureSize() {
for (int i = 16384; i > 0; i >>= 1) {
- GLStateManager.glTexImage2D(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_RGBA, i, i, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- final int j = GLStateManager.glGetTexLevelParameteri(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
+ GLSMTextures.glTexImage2D(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_RGBA, i, i, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ final int j = GLSMTextures.glGetTexLevelParameteri(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
if (j != 0) {
return i;
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java
index df061ea33..c737d8b50 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.ReadbackFixture;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
@@ -41,7 +45,7 @@ class GlsmSdlReadbackMatrixTest {
@AfterEach
void resetPack() {
ReadbackFixture.resetPack();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
}
static Stream fixtureCases() {
@@ -67,18 +71,18 @@ class GlsmSdlReadbackMatrixTest {
@Test
void fbo0FloatReadIsBottomUp() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H);
- GLStateManager.glClearColor(0f, 0f, 1f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, FBO0_W, 1);
- GLStateManager.glClearColor(1f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H);
+ GLSMBlend.glClearColor(0f, 0f, 1f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, FBO0_W, 1);
+ GLSMBlend.glClearColor(1f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
final ByteBuffer out = BufferUtils.createByteBuffer(FBO0_W * FBO0_H * 16).order(ByteOrder.nativeOrder());
- GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_FLOAT, out);
+ GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_FLOAT, out);
assertEquals(1f, out.getFloat(0), "GL row 0 is the scissored bottom row (red)");
assertEquals(0f, out.getFloat(8), "GL row 0 blue");
final int top = (FBO0_H - 1) * FBO0_W * 16;
@@ -88,13 +92,13 @@ class GlsmSdlReadbackMatrixTest {
@Test
void fbo0ReadAfterBareClearSeesTheClear() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H);
- GLStateManager.glClearColor(0.2f, 0.4f, 0.6f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H);
+ GLSMBlend.glClearColor(0.2f, 0.4f, 0.6f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
final ByteBuffer out = BufferUtils.createByteBuffer(FBO0_W * FBO0_H * 4);
- GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
+ GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
assertEquals(51, out.get(0) & 0xFF, "red after bare clear");
assertEquals(102, out.get(1) & 0xFF, "green after bare clear");
assertEquals(153, out.get(2) & 0xFF, "blue after bare clear");
@@ -102,29 +106,29 @@ class GlsmSdlReadbackMatrixTest {
@Test
void fbo0DepthAndStencilAreBottomUp() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H);
- GLStateManager.glDepthMask(true);
- GLStateManager.glStencilMask(0xFF);
- GLStateManager.glClearDepth(0.75);
- GLStateManager.glClearStencil(0x11);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, FBO0_W, 1);
- GLStateManager.glClearDepth(0.25);
- GLStateManager.glClearStencil(0x22);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glClearDepth(1.0);
- GLStateManager.glClearStencil(0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glStencilMask(0xFF);
+ GLSMDepthStencilAlpha.glClearDepth(0.75);
+ GLSMDepthStencilAlpha.glClearStencil(0x11);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, FBO0_W, 1);
+ GLSMDepthStencilAlpha.glClearDepth(0.25);
+ GLSMDepthStencilAlpha.glClearStencil(0x22);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
+ GLSMDepthStencilAlpha.glClearStencil(0);
final ByteBuffer depth = BufferUtils.createByteBuffer(FBO0_W * FBO0_H * 4).order(ByteOrder.nativeOrder());
- GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth);
+ GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth);
assertEquals(0.25f, depth.getFloat(0), 1e-6f, "fbo0 depth bottom row");
assertEquals(0.75f, depth.getFloat((FBO0_H - 1) * FBO0_W * 4), 1e-6f, "fbo0 depth top row");
final ByteBuffer stencil = BufferUtils.createByteBuffer(FBO0_W * FBO0_H);
- GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_STENCIL_INDEX, GL11.GL_UNSIGNED_BYTE, stencil);
+ GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_STENCIL_INDEX, GL11.GL_UNSIGNED_BYTE, stencil);
assertEquals(0x22, stencil.get(0) & 0xFF, "fbo0 stencil bottom row");
assertEquals(0x11, stencil.get((FBO0_H - 1) * FBO0_W) & 0xFF, "fbo0 stencil top row");
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java
index bf9b279f6..12db726a7 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -26,26 +28,26 @@ class GlsmSdlReadbackTest {
@Test
void getTexImageSeesDeferredTextureUpload() {
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
final ByteBuffer src = solidTexture(TEX_SIZE, TEX_SIZE);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0,
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0,
GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src);
final ByteBuffer dst = BufferUtils.createByteBuffer(TEX_SIZE * TEX_SIZE * 4);
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, dst);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, dst);
assertPixels(dst, TEX_SIZE * TEX_SIZE);
- GLStateManager.glDeleteTextures(texture);
+ GLSMTextures.glDeleteTextures(texture);
}
@Test
void getBufferSubDataSeesSameFrameStorageBufferWrite() {
final int size = 64;
- final int ssbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
+ final int ssbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
final ByteBuffer initial = BufferUtils.createByteBuffer(size);
final ByteBuffer update = BufferUtils.createByteBuffer(size);
@@ -53,16 +55,16 @@ class GlsmSdlReadbackTest {
initial.put(i, (byte) 0x11);
update.put(i, (byte) (i + 1));
}
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, initial, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, update);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, initial, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, update);
final ByteBuffer dst = BufferUtils.createByteBuffer(size);
- GLStateManager.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, dst);
+ GLSMBuffers.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, dst);
for (int i = 0; i < size; i++) {
assertEquals((byte) (i + 1), dst.get(i), "byte " + i + " should hold the same-frame sub-data write");
}
- GLStateManager.glDeleteBuffers(ssbo);
+ GLSMBuffers.glDeleteBuffers(ssbo);
}
@Test
@@ -72,7 +74,7 @@ class GlsmSdlReadbackTest {
GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f);
final ByteBuffer pixel = BufferUtils.createByteBuffer(4);
- GLStateManager.glReadPixels(
+ GLSMFramebuffer.glReadPixels(
GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1,
GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixel);
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java
index 518521846..1f7da20ea 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.sdlgpu.SdlTestRig;
@@ -23,15 +26,15 @@ class GlsmSdlSamplerBindingTest {
@Test
void glsmDeleteClearsBothCaches() {
final ContextState st = SdlTestRig.contextState();
- final int sampler = GLStateManager.glGenSamplers();
- GLStateManager.glBindSampler(UNIT, sampler);
+ final int sampler = GLSMTextures.glGenSamplers();
+ GLSMTextures.glBindSampler(UNIT, sampler);
assertEquals(sampler, st.boundSamplerObjects[UNIT], "SDL unit binding");
- assertEquals(sampler, GLStateManager.getSamplerBinding(UNIT), "GLSM unit binding");
+ assertEquals(sampler, GLSMTextures.getSamplerBinding(UNIT), "GLSM unit binding");
- GLStateManager.glDeleteSamplers(sampler);
+ GLSMTextures.glDeleteSamplers(sampler);
assertEquals(0, st.boundSamplerObjects[UNIT], "SDL must drop the deleted sampler");
- assertEquals(0, GLStateManager.getSamplerBinding(UNIT), "GLSM must drop the deleted sampler");
+ assertEquals(0, GLSMTextures.getSamplerBinding(UNIT), "GLSM must drop the deleted sampler");
}
@Test
@@ -41,7 +44,7 @@ class GlsmSdlSamplerBindingTest {
final int sampler = RenderSystem.genSampler();
try {
RenderSystem.bindSamplerToUnit(UNIT, sampler);
- GLStateManager.glBindSampler(UNIT, 0);
+ GLSMTextures.glBindSampler(UNIT, 0);
assertEquals(0, st.boundSamplerObjects[UNIT], "setup: GLSM unbind must reach SDL");
RenderSystem.bindSamplerToUnit(UNIT, sampler);
@@ -62,40 +65,40 @@ class GlsmSdlSamplerBindingTest {
""");
final int red = GlsmSdlHeadlessRig.createSolidTexture(0xFFFF0000);
final int green = GlsmSdlHeadlessRig.createSolidTexture(0xFF00FF00);
- final int vao = GLStateManager.glGenVertexArrays();
+ final int vao = GLSMVertexInput.glGenVertexArrays();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, red);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, green);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glUseProgram(program);
- final int location = GLStateManager.glGetUniformLocation(program, "s");
- GLStateManager.glUniform1i(location, 0);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- GLStateManager.glUniform1i(location, 1);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- GLStateManager.glUseProgram(0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, red);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, green);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMPrograms.glUseProgram(program);
+ final int location = GLSMPrograms.glGetUniformLocation(program, "s");
+ GLSMPrograms.glUniform1i(location, 0);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMPrograms.glUniform1i(location, 1);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMPrograms.glUseProgram(0);
final int center = GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1)[0];
assertEquals(Integer.toHexString(GlsmSdlHeadlessRig.GREEN), Integer.toHexString(center), "the second draw must sample unit 1");
} finally {
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glDeleteVertexArrays(vao);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(red);
- GLStateManager.glDeleteTextures(green);
- GLStateManager.glDeleteProgram(program);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(red);
+ GLSMTextures.glDeleteTextures(green);
+ GLSMPrograms.glDeleteProgram(program);
}
}
@Test
void unitCountMatchesTheSdlSamplerArray() {
- GLStateManager.glBindSampler(0, 0);
- assertEquals(SdlTestRig.contextState().boundSamplerObjects.length, GLStateManager.getSamplerUnitCount());
+ GLSMTextures.glBindSampler(0, 0);
+ assertEquals(SdlTestRig.contextState().boundSamplerObjects.length, GLSMTextures.getSamplerUnitCount());
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java
index d945e7e6f..69e0d3832 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java
@@ -1,6 +1,15 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
@@ -47,7 +56,7 @@ class GlsmSdlSamplerOverflowTest {
private static final int FETCH_GREEN = 17;
private static final int FILTERED_BLUE = 15;
private static final int EXPECTED = 0xFF4080C0;
- private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLStateManager.class, "RELEASE_DELAY_FRAMES");
+ private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLSMTextureLifetime.class, "RELEASE_DELAY_FRAMES");
private final int[] textures = new int[SAMPLERS];
private int program;
@@ -99,31 +108,31 @@ class GlsmSdlSamplerOverflowTest {
assertEquals(2, po.fragmentResources.numStorageTextures(), "fetch-only samplers moved to texture slots");
for (int i = 0; i < SAMPLERS; i++) textures[i] = i == FETCH_RED ? redTexture.getAsInt() : GlsmSdlHeadlessRig.createSolidTexture(colorFor(i));
for (int i = 0; i < SAMPLERS; i++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[i]);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[i]);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- vao = GLStateManager.glGenVertexArrays();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ vao = GLSMVertexInput.glGenVertexArrays();
}
private int drawCenter(String redName, int[] units) {
bindDrawState(redName, units);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- GLStateManager.glUseProgram(0);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMPrograms.glUseProgram(0);
assertMovedSamplersReadCopiesOnVulkan();
return GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1)[0];
}
private void bindDrawState(String redName, int[] units) {
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glUseProgram(program);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "redLod"), redLod);
+ GLSMPrograms.glUseProgram(program);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "redLod"), redLod);
for (int i = 0; i < SAMPLERS; i++) {
- final int location = GLStateManager.glGetUniformLocation(program, name(i, redName));
+ final int location = GLSMPrograms.glGetUniformLocation(program, name(i, redName));
assertTrue(location >= 0, name(i, redName) + " has no location");
- GLStateManager.glUniform1i(location, units[i]);
+ GLSMPrograms.glUniform1i(location, units[i]);
}
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
}
private void assertMovedSamplersReadCopiesOnVulkan() {
@@ -147,21 +156,21 @@ class GlsmSdlSamplerOverflowTest {
@AfterEach
void cleanUp() {
copyProbe.close();
- GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glLogicOp(GL11.GL_COPY);
- GLStateManager.glBindImageTexture(0, 0, 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8);
- GLStateManager.glBindVertexArray(0);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
+ GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMBlend.glLogicOp(GL11.GL_COPY);
+ GLSMTextures.glBindImageTexture(0, 0, 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8);
+ GLSMVertexInput.glBindVertexArray(0);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
for (int unit = 0; unit < SAMPLERS; unit++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
for (int i = 0; i < SAMPLERS; i++) {
- if (textures[i] != 0) GLStateManager.glDeleteTextures(textures[i]);
+ if (textures[i] != 0) GLSMTextures.glDeleteTextures(textures[i]);
textures[i] = 0;
}
- if (program != 0) GLStateManager.glDeleteProgram(program);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
program = 0;
vao = 0;
}
@@ -178,9 +187,9 @@ class GlsmSdlSamplerOverflowTest {
void unboundMovedSamplerReadsTheFloat2DFallback() {
final int[] units = shuffledUnits();
setUp("t" + FETCH_RED, units);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
assertEquals(0xFF0080C0, drawCenter("t" + FETCH_RED, units));
}
@@ -190,19 +199,19 @@ class GlsmSdlSamplerOverflowTest {
final int[] units = shuffledUnits();
setUp("t" + FETCH_RED, units);
bindDrawState("t" + FETCH_RED, units);
- for (int i = 0; i < 3; i++) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ for (int i = 0; i < 3; i++) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
if (change.equals("uniform")) {
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "t" + FETCH_RED), units[0]);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "t" + FETCH_RED), units[0]);
} else {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
final int refreshes = copyProbe.refreshCalls();
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
if (SDLGPUGate.device().isVulkan()) assertEquals(refreshes + 1, copyProbe.refreshCalls(), "a changed moved sampler must invalidate preparation");
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
assertEquals(0xFF0080C0, GlsmSdlHeadlessRig.readTarget(32, 32, 1, 1)[0], "the new unit supplies black instead of red");
}
@@ -212,14 +221,14 @@ class GlsmSdlSamplerOverflowTest {
setUp("t" + FETCH_RED, units);
final int fbo = GlsmSdlHeadlessRig.fboWithColor(textures[FETCH_RED], 0);
try {
- GLStateManager.glViewport(0, 0, 2, 2);
- GLStateManager.glClearColor(0x60 / 255.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMRasterizer.glViewport(0, 0, 2, 2);
+ GLSMBlend.glClearColor(0x60 / 255.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
assertEquals(Integer.toHexString(0xFF6080C0), Integer.toHexString(drawCenter("t" + FETCH_RED, units)),
"the moved sampler must read the cleared texture, not its uploaded texels");
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
}
}
@@ -231,7 +240,7 @@ class GlsmSdlSamplerOverflowTest {
final ByteBuffer texels = MemoryUtil.memAlloc(2 * 2 * 4);
try {
for (int i = 0; i < 4; i++) GlsmSdlHeadlessRig.putArgb(texels, i, colorFor(FETCH_RED));
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL21.GL_SRGB8_ALPHA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL21.GL_SRGB8_ALPHA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
} finally {
MemoryUtil.memFree(texels);
}
@@ -253,15 +262,15 @@ class GlsmSdlSamplerOverflowTest {
final int[] units = shuffledUnits();
setUp("t" + FETCH_RED, units, () -> {
final int texture = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, 2, 2, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, 2, 2, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
final int fbo = GlsmSdlHeadlessRig.fboWithColor(GlsmSdlHeadlessRig.createSolidTexture(0xFF000000), 0);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, texture, 0);
- GLStateManager.glViewport(0, 0, 2, 2);
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(0.25);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, texture, 0);
+ GLSMRasterizer.glViewport(0, 0, 2, 2);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(0.25);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
return texture;
});
assertChannels(drawCenter("t" + FETCH_RED, units), 64, 0x80, 0xC0, "red is the cleared depth 0.25");
@@ -281,11 +290,11 @@ class GlsmSdlSamplerOverflowTest {
drawCenter("t" + FETCH_RED, units);
final int beforeDelete = liveTextureCount();
- GLStateManager.glDeleteTextures(textures[FETCH_RED]);
+ GLSMTextures.glDeleteTextures(textures[FETCH_RED]);
textures[FETCH_RED] = 0;
for (int i = 0; i < RELEASE_DELAY_FRAMES; i++) {
GlsmSdlHeadlessRig.beginFrame();
- GLStateManager.onFrameEnd();
+ GLSMTextureLifetime.onFrameEnd();
GlsmSdlHeadlessRig.endFrame();
}
assertEquals(beforeDelete - 2, liveTextureCount(), "the deleted texture and its copy are released after the delay");
@@ -299,7 +308,7 @@ class GlsmSdlSamplerOverflowTest {
drawCenter("t" + FETCH_RED, units);
final int beforeExpiry = liveTextureCount();
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
program = 0;
for (int frame = 0; frame < 12; frame++) {
GlsmSdlHeadlessRig.beginFrame();
@@ -330,22 +339,22 @@ class GlsmSdlSamplerOverflowTest {
final int[] units = shuffledUnits();
setUp("t" + FETCH_RED, units);
bindDrawState("t" + FETCH_RED, units);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
final long copy = watchCopy("t" + FETCH_RED);
final int writes = copyProbe.writesTo(copy);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
final int refreshes = copyProbe.refreshCalls();
assertTrue(refreshes > 0, "the probe must observe preparation before the cache can skip it");
final var frame = GlsmSdlHeadlessRig.frameManager().frame();
final long pass = frame.renderPassGeneration;
final int bindGen = SdlTestRig.contextState().samplerBindGen;
final long writeGen = GlsmSdlHeadlessRig.resourceManager().textureWriteGeneration();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[0]);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[0]);
for (int i = 0; i < 4; i++) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[(i + 1) % 2]);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[(i + 1) % 2]);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
assertEquals(pass, frame.renderPassGeneration, "the draws keep the same render pass");
assertNotEquals(bindGen, SdlTestRig.contextState().samplerBindGen, "the entity texture changes reached the backend");
assertEquals(writeGen, GlsmSdlHeadlessRig.resourceManager().textureWriteGeneration(), "observing copies must not change write tracking");
@@ -353,10 +362,10 @@ class GlsmSdlSamplerOverflowTest {
assertEquals(writes, copyProbe.writesTo(copy), "repeated draws must not copy unchanged content");
GlsmSdlHeadlessRig.frameManager().endRenderPassIfActive();
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
assertEquals(refreshes + 1, copyProbe.refreshCalls(), "a new pass must recheck its snapshots");
assertEquals(writes, copyProbe.writesTo(copy), "a new pass must reuse unchanged content");
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
GlsmSdlHeadlessRig.endFrame();
GlsmSdlHeadlessRig.beginFrame();
assertEquals(EXPECTED, drawCenter("t" + FETCH_RED, units));
@@ -379,7 +388,7 @@ class GlsmSdlSamplerOverflowTest {
} else {
setUp("t" + FETCH_RED, units);
}
- if (write.equals("compute")) GLStateManager.glBindImageTexture(0, textures[FETCH_RED], 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8);
+ if (write.equals("compute")) GLSMTextures.glBindImageTexture(0, textures[FETCH_RED], 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8);
final int fbo = GlsmSdlHeadlessRig.fboWithColor(textures[FETCH_RED], 0);
try {
assertEquals(EXPECTED, drawCenter("t" + FETCH_RED, units));
@@ -390,14 +399,14 @@ class GlsmSdlSamplerOverflowTest {
GlsmSdlHeadlessRig.beginFrame();
switch (write) {
case "upload" -> {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
final ByteBuffer texels = MemoryUtil.memAlloc(16);
try {
for (int i = 0; i < 4; i++) GlsmSdlHeadlessRig.putArgb(texels, i, 0xFF000000);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
} finally {
MemoryUtil.memFree(texels);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
case "copy" -> BackendManager.RENDER_BACKEND.copyImageSubData(textures[0], GL11.GL_TEXTURE_2D, 0, 0, 0, 0,
@@ -405,28 +414,28 @@ class GlsmSdlSamplerOverflowTest {
case "blit" -> {
final int srcFbo = GlsmSdlHeadlessRig.fboWithColor(textures[0], 0);
try {
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fbo);
- GLStateManager.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
} finally {
- GLStateManager.glDeleteFramebuffers(srcFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(srcFbo);
}
}
case "clear" -> {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glClearColor(0, 0, 0, 1);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMBlend.glClearColor(0, 0, 0, 1);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
}
case "mipmap" -> BackendManager.RENDER_BACKEND.generateTextureMipmap(textures[FETCH_RED]);
case "compute" -> computeBlack();
case "copyTexSubImage" -> {
final int srcFbo = GlsmSdlHeadlessRig.fboWithColor(textures[0], 0);
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
- GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]);
+ GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2);
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteFramebuffers(srcFbo);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMFramebuffer.glDeleteFramebuffers(srcFbo);
}
}
default -> throw new AssertionError(write);
@@ -435,8 +444,8 @@ class GlsmSdlSamplerOverflowTest {
assertEquals(redWrites + 1, copyProbe.writesTo(redCopy), "changed source copied once");
assertEquals(greenWrites, copyProbe.writesTo(greenCopy), "unchanged source not copied again");
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
}
}
@@ -447,17 +456,17 @@ class GlsmSdlSamplerOverflowTest {
layout(rgba8, binding = 0) uniform writeonly image2D target;
void main() { imageStore(target, ivec2(gl_GlobalInvocationID.xy), vec4(0.0, 0.0, 0.0, 1.0)); }
""");
- final int compute = GLStateManager.glCreateProgram();
+ final int compute = GLSMPrograms.glCreateProgram();
try {
- GLStateManager.glAttachShader(compute, shader);
- GLStateManager.glLinkProgram(compute);
- assertEquals(1, GLStateManager.glGetProgrami(compute, GL20.GL_LINK_STATUS), GLStateManager.glGetProgramInfoLog(compute, 4096));
- GLStateManager.glUseProgram(compute);
- GLStateManager.glDispatchCompute(2, 2, 1);
+ GLSMPrograms.glAttachShader(compute, shader);
+ GLSMPrograms.glLinkProgram(compute);
+ assertEquals(1, GLSMPrograms.glGetProgrami(compute, GL20.GL_LINK_STATUS), GLSMPrograms.glGetProgramInfoLog(compute, 4096));
+ GLSMPrograms.glUseProgram(compute);
+ GLSMPrograms.glDispatchCompute(2, 2, 1);
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(compute);
- GLStateManager.glDeleteShader(shader);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(compute);
+ GLSMPrograms.glDeleteShader(shader);
}
}
@@ -469,14 +478,14 @@ class GlsmSdlSamplerOverflowTest {
bindDrawState("t" + FETCH_RED, units);
final var frame = GlsmSdlHeadlessRig.frameManager().frame();
final long before = frame.renderPassGeneration;
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, 1, 1);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, 1, 1);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
assertEquals(before + 1, frame.renderPassGeneration, "only the clear's render pass is opened");
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
assertNotEquals(0L, boundCopy("t" + FETCH_RED), "the first draw prepares the copy");
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
assertEquals(EXPECTED, GlsmSdlHeadlessRig.readTarget(32, 32, 1, 1)[0]);
}
@@ -488,16 +497,16 @@ class GlsmSdlSamplerOverflowTest {
+ "fragColor = c + vec4(texelFetch(fetched, " + coord + "(0), 0)); }\n";
final int vs = GlTestSupport.compile(GL20.GL_VERTEX_SHADER, GlsmSdlHeadlessRig.FULLSCREEN_VERTEX);
final int fs = GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, source);
- program = GLStateManager.glCreateProgram();
+ program = GLSMPrograms.glCreateProgram();
try {
- GLStateManager.glAttachShader(program, vs);
- GLStateManager.glAttachShader(program, fs);
- GLStateManager.glLinkProgram(program);
- assertEquals(0, GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS));
- assertTrue(GLStateManager.glGetProgramInfoLog(program, 4096).contains("Too many fragment shader texture samplers"));
+ GLSMPrograms.glAttachShader(program, vs);
+ GLSMPrograms.glAttachShader(program, fs);
+ GLSMPrograms.glLinkProgram(program);
+ assertEquals(0, GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS));
+ assertTrue(GLSMPrograms.glGetProgramInfoLog(program, 4096).contains("Too many fragment shader texture samplers"));
} finally {
- GLStateManager.glDeleteShader(vs);
- GLStateManager.glDeleteShader(fs);
+ GLSMPrograms.glDeleteShader(vs);
+ GLSMPrograms.glDeleteShader(fs);
}
}
@@ -579,7 +588,7 @@ class GlsmSdlSamplerOverflowTest {
program = GlTestSupport.program(GlsmSdlHeadlessRig.FULLSCREEN_VERTEX, sb.toString());
assertEquals(1, shaderManager().getProgram(program).fragmentResources.numStorageTextures(), "only 'fetched' moves");
- assertTrue(GLStateManager.glGetUniformLocation(program, "realTex") >= 0, "the uniform keeps the name the macro expands to");
+ assertTrue(GLSMPrograms.glGetUniformLocation(program, "realTex") >= 0, "the uniform keeps the name the macro expands to");
}
@ParameterizedTest
@@ -603,22 +612,22 @@ class GlsmSdlSamplerOverflowTest {
""");
final ShaderManager.ProgramObject po = shaderManager().getProgram(program);
assertEquals(1, (fragment ? po.fragmentResources : po.vertexResources).numStorageTextures(), "shadowtex0 moved");
- assertEquals(-1, GLStateManager.glGetUniformLocation(program, "shadowtex0"), "an unread sampler must report -1, or Iris treats shadows as used");
- assertTrue(GLStateManager.glGetUniformLocation(program, "f0") >= 0, "read samplers keep their location");
+ assertEquals(-1, GLSMPrograms.glGetUniformLocation(program, "shadowtex0"), "an unread sampler must report -1, or Iris treats shadows as used");
+ assertTrue(GLSMPrograms.glGetUniformLocation(program, "f0") >= 0, "read samplers keep their location");
textures[0] = GlsmSdlHeadlessRig.createSolidTexture(GlsmSdlHeadlessRig.RED);
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glUseProgram(program);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMPrograms.glUseProgram(program);
GlsmSdlHeadlessRig.bindTarget();
final var rm = GlsmSdlHeadlessRig.resourceManager();
final long fallback = rm.getOrCreateFallbackStorageTexture2D();
final long before = rm.textureWriteGeneration();
- for (int i = 0; i < 3; i++) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ for (int i = 0; i < 3; i++) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
final ContextState st = SdlTestRig.contextState();
assertEquals(fallback, (fragment ? st.lastFragStorageTex : st.lastVertStorageTex)[0], "the unread slot uses the 2D fallback");
assertEquals(before, rm.textureWriteGeneration(), "the unread sampler must not start tracking or copying unit 0");
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
assertEquals(GlsmSdlHeadlessRig.GREEN, GlsmSdlHeadlessRig.readTarget(32, 32, 1, 1)[0]);
}
@@ -635,32 +644,32 @@ class GlsmSdlSamplerOverflowTest {
for (int i = 0; i < 16; i++) textures[i] = GlsmSdlHeadlessRig.createSolidTexture(0xFF000000);
textures[16] = GlsmSdlHeadlessRig.createSolidTexture(0xFF00FF00);
for (int i = 0; i <= 16; i++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- vao = GLStateManager.glGenVertexArrays();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ vao = GLSMVertexInput.glGenVertexArrays();
final int fbo = GlsmSdlHeadlessRig.fboWithColor(textures[16], 0);
try {
- GLStateManager.glUseProgram(program);
- for (int i = 0; i < 16; i++) GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "f" + i), i);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "written"), 16);
- GLStateManager.glBindVertexArray(vao);
+ GLSMPrograms.glUseProgram(program);
+ for (int i = 0; i < 16; i++) GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "f" + i), i);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "written"), 16);
+ GLSMVertexInput.glBindVertexArray(vao);
- GLStateManager.glViewport(0, 0, 2, 2);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "readWritten"), 0);
- for (int i = 0; i < 3; i++) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMRasterizer.glViewport(0, 0, 2, 2);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "readWritten"), 0);
+ for (int i = 0; i < 3; i++) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "readWritten"), 1);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "readWritten"), 1);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMPrograms.glUseProgram(0);
assertChannels(GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1)[0], 0x40, 0, 0,
"the second draw must see what the first draw wrote, not the texture's earlier green");
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(fbo);
}
}
@@ -668,18 +677,18 @@ class GlsmSdlSamplerOverflowTest {
void tooManyFilteredSamplersFailLinkInsteadOfDraw() {
final int vs = GlTestSupport.compile(GL20.GL_VERTEX_SHADER, GlsmSdlHeadlessRig.FULLSCREEN_VERTEX);
final int fs = GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, fragment("t" + FETCH_RED, false));
- final int failed = GLStateManager.glCreateProgram();
+ final int failed = GLSMPrograms.glCreateProgram();
try {
- GLStateManager.glAttachShader(failed, vs);
- GLStateManager.glAttachShader(failed, fs);
- GLStateManager.glLinkProgram(failed);
- assertEquals(0, GLStateManager.glGetProgrami(failed, GL20.GL_LINK_STATUS), "18 filtered samplers cannot fit 16 slots");
- final String log = GLStateManager.glGetProgramInfoLog(failed, 4096);
+ GLSMPrograms.glAttachShader(failed, vs);
+ GLSMPrograms.glAttachShader(failed, fs);
+ GLSMPrograms.glLinkProgram(failed);
+ assertEquals(0, GLSMPrograms.glGetProgrami(failed, GL20.GL_LINK_STATUS), "18 filtered samplers cannot fit 16 slots");
+ final String log = GLSMPrograms.glGetProgramInfoLog(failed, 4096);
assertTrue(log.contains("Too many fragment shader texture samplers (18, maximum 16)"), () -> "info log should name the count: " + log);
} finally {
- GLStateManager.glDeleteShader(vs);
- GLStateManager.glDeleteShader(fs);
- GLStateManager.glDeleteProgram(failed);
+ GLSMPrograms.glDeleteShader(vs);
+ GLSMPrograms.glDeleteShader(fs);
+ GLSMPrograms.glDeleteProgram(failed);
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java
index 723a5c7ca..332be3e8e 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.glsm.testutil.TestThreads;
@@ -24,7 +24,7 @@ class GlsmSdlSplashTargetTest {
final OffscreenTarget target = createSplashTarget(backend);
Reflect.set(backend, "splashTarget", target);
try {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
TestThreads.run("SplashTarget-Seed-Thread", () -> {
Reflect.invoke(backend, "enterContext", new Class>[]{boolean.class}, true);
GlsmSdlHeadlessRig.solidQuad(0f, 1f, 0f);
@@ -32,7 +32,7 @@ class GlsmSdlSplashTargetTest {
backend.onRenderThreadReleased(Thread.currentThread());
});
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId());
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), GlsmSdlHeadlessRig.GREEN, "splash target");
} finally {
releaseSplashTarget(backend, target);
@@ -50,14 +50,14 @@ class GlsmSdlSplashTargetTest {
TestThreads.run("SplashTarget-BindZero-Thread", () -> {
Reflect.invoke(backend, "enterContext", new Class>[]{boolean.class}, true);
GlsmSdlHeadlessRig.bindTarget();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
GlsmSdlHeadlessRig.clearTo(1f, 0f, 0f, 1f);
GlsmSdlHeadlessRig.solidQuad(0f, 1f, 0f);
backend.handleSwapBuffers();
backend.onRenderThreadReleased(Thread.currentThread());
});
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId());
GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), GlsmSdlHeadlessRig.GREEN, "splash target");
GlsmSdlHeadlessRig.bindTarget();
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java
index 31da226a4..9dbc9c5ec 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
import com.gtnewhorizons.angelica.glsm.streaming.PersistentStreamingBuffer;
@@ -24,19 +24,19 @@ class GlsmSdlStreamingRingTest {
@Test
void ringCreationLeavesTheGlsmArrayBufferCacheMatchingSdl() {
assertTrue(RenderSystem.supportsBufferStorage(), "SDL-GPU must advertise buffer storage");
- final int other = GLStateManager.glGenBuffers();
+ final int other = GLSMBuffers.glGenBuffers();
PersistentStreamingBuffer ring = null;
try {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other);
ring = PersistentStreamingBuffer.createOrNull(4096);
assertNotNull(ring);
final IntSet persistent = Reflect.getStatic(FfpExtendedAttribs.class, "persistentSources");
assertTrue(persistent.contains(ring.getBufferId()), "the ring buffer is the persistent source");
assertFalse(persistent.contains(other), "the previously bound buffer is not persistent");
- assertEquals(RENDER_BACKEND.getInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO(), "SDL ContextState.boundArrayBuffer must equal the GLSM cache after ring creation");
+ assertEquals(RENDER_BACKEND.getInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO(), "SDL ContextState.boundArrayBuffer must equal the GLSM cache after ring creation");
} finally {
if (ring != null) ring.destroy();
- GLStateManager.glDeleteBuffers(other);
+ GLSMBuffers.glDeleteBuffers(other);
}
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java
index 42de37f3e..fcb3387d9 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
import com.gtnewhorizons.angelica.glsm.EntityIdsOnlyHandler;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
@@ -31,15 +31,15 @@ class GlsmSdlTessellatorEntityIdsTest {
@AfterEach
void tearDown() {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
GLSMHooks.immediateExtendedHandler = previousHandler;
}
@Test
void idsChangedMidBatchApplyToTheVerticesAddedAfterTheChange() {
GlsmSdlHeadlessRig.beginFrameAndClear();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
TessellatorEntityIdsFixture.drawIdsChangedMidBatch();
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
@@ -50,7 +50,7 @@ class GlsmSdlTessellatorEntityIdsTest {
@Test
void idsChangedAfterTheLastVertexLeaveTheBatchAlone() {
GlsmSdlHeadlessRig.beginFrameAndClear();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
TessellatorEntityIdsFixture.drawIdsChangedAfterTheLastVertex();
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java
index d40fea556..4b30c7956 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -20,10 +20,10 @@ class GlsmSdlTextureBindingQueryTest {
@Test
void everyBindingQueryReadsThePerUnitSlot() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- final int tex = GLStateManager.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ final int tex = GLSMTextures.glGenTextures();
try {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, tex);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, tex);
assertEquals(tex, RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D), "GL_TEXTURE_BINDING_2D");
assertEquals(tex, RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_1D), "GL_TEXTURE_BINDING_1D");
assertEquals(tex, RENDER_BACKEND.getInteger(GL12.GL_TEXTURE_BINDING_3D), "GL_TEXTURE_BINDING_3D");
@@ -33,9 +33,9 @@ class GlsmSdlTextureBindingQueryTest {
assertEquals(tex, RENDER_BACKEND.getInteger(GL31.GL_TEXTURE_BINDING_RECTANGLE), "GL_TEXTURE_BINDING_RECTANGLE");
assertEquals(tex, RENDER_BACKEND.getInteger(GL40.GL_TEXTURE_BINDING_CUBE_MAP_ARRAY), "GL_TEXTURE_BINDING_CUBE_MAP_ARRAY");
} finally {
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glDeleteTextures(tex);
}
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java
index 2546b4103..98388f7cc 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.glsm.texture.TextureStaging;
@@ -95,7 +96,7 @@ class GlsmSdlTextureStagingTest {
fail("level " + level + ": " + mismatches + " texels differ; first (" + fx + "," + fy + ") expected " + GlsmSdlHeadlessRig.describe(stagedColor(level, fx, fy)) + " got " + GlsmSdlHeadlessRig.describe(got[first]));
}
}
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
@ParameterizedTest
@@ -103,15 +104,15 @@ class GlsmSdlTextureStagingTest {
void directUploadLandsAfterEarlierBatchedUpload(boolean inFrame, boolean fboAttached) {
if (inFrame) GlsmSdlHeadlessRig.beginFrame();
final int tex = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, BIG_TEX, BIG_TEX, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, BIG_TEX, BIG_TEX, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
int fbo = 0;
if (fboAttached) {
- fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
}
final ByteBuffer small = solidRgba(SMALL, SMALL, COLOR_A);
@@ -119,11 +120,11 @@ class GlsmSdlTextureStagingTest {
final ByteBuffer out = MemoryUtil.memAlloc(BIG_TEX * BIG_TEX * 4);
try {
assertTrue(big.remaining() > ResourceManager.BATCH_SEGMENT_CAPACITY, "second upload must take the direct path");
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SMALL, SMALL, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, small);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, BIG_W, BIG_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, big);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SMALL, SMALL, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, small);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, BIG_W, BIG_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, big);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out);
final int[] got = GlsmSdlHeadlessRig.toArgb(out, BIG_TEX * BIG_TEX);
int mismatches = 0;
for (int y = 0; y < BIG_H; y++) {
@@ -138,14 +139,14 @@ class GlsmSdlTextureStagingTest {
MemoryUtil.memFree(big);
MemoryUtil.memFree(out);
}
- if (fbo != 0) GLStateManager.glDeleteFramebuffers(fbo);
- GLStateManager.glDeleteTextures(tex);
+ if (fbo != 0) GLSMFramebuffer.glDeleteFramebuffers(fbo);
+ GLSMTextures.glDeleteTextures(tex);
}
private static void stageBand(int tex, int level, int y0, int w, int h) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- final TextureStaging staging = GLStateManager.beginTextureStaging(level, 0, y0, w, h);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ final TextureStaging staging = GLSMTextures.beginTextureStaging(level, 0, y0, w, h);
assertNotNull(staging, "beginTextureStaging level " + level + " y " + y0);
final ByteBuffer buf = staging.buffer();
assertEquals(w * h * 4, buf.remaining(), "staging capacity");
@@ -162,7 +163,7 @@ class GlsmSdlTextureStagingTest {
buf.put(i + 3, (byte) (c >>> 24));
}
}
- assertTrue(GLStateManager.commitTextureStaging(staging), "commitTextureStaging level " + level + " y " + y0);
+ assertTrue(GLSMTextures.commitTextureStaging(staging), "commitTextureStaging level " + level + " y " + y0);
}
private static int stagedColor(int level, int x, int y) {
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java
index 665999cd3..7f0dba3bd 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -50,11 +53,11 @@ class GlsmSdlUnalignedAttribTest {
private static int redChannelForFactorAt(int factorOffset, int decoyOffset) {
final int p = buildProgram();
- final int vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ final int vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
- final int vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ final int vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
final ByteBuffer data = MemoryUtil.memAlloc(3 * STRIDE);
try {
for (int i = 0; i < 3 * STRIDE; i++) data.put(i, (byte) 0);
@@ -68,26 +71,26 @@ class GlsmSdlUnalignedAttribTest {
data.put(base + factorOffset, (byte) FACTOR);
}
data.position(0).limit(3 * STRIDE);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
} finally {
MemoryUtil.memFree(data);
}
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, STRIDE, 0L);
- GLStateManager.glEnableVertexAttribArray(5);
- GLStateManager.glVertexAttribPointer(5, 1, GL11.GL_UNSIGNED_BYTE, true, STRIDE, factorOffset);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, STRIDE, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(5);
+ GLSMVertexInput.glVertexAttribPointer(5, 1, GL11.GL_UNSIGNED_BYTE, true, STRIDE, factorOffset);
- GLStateManager.glUseProgram(p);
+ GLSMPrograms.glUseProgram(p);
try {
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
} finally {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
}
final int[] pixels = GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
return (pixels[0] >> 16) & 0xFF;
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java
index 03fa20c9b..fc52e9564 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java
@@ -1,6 +1,13 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager;
@@ -42,7 +49,7 @@ class GlsmSdlVanillaTextureTest {
};
private static final int LIGHTMAP_SIZE = 16;
- private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLStateManager.class, "RELEASE_DELAY_FRAMES");
+ private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLSMTextureLifetime.class, "RELEASE_DELAY_FRAMES");
private static final int CLEAR_COLOR = 0xFF000000;
private static int atlasTexture;
@@ -57,8 +64,8 @@ class GlsmSdlVanillaTextureTest {
}
private static int createMipmappedAtlas() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int id = GLStateManager.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int id = GLSMTextures.glGenTextures();
allocateTextureImpl(id, ATLAS_MIPMAP_LEVELS, ATLAS_SIZE, ATLAS_SIZE, 1.0f);
for (int level = 0; level <= ATLAS_MIPMAP_LEVELS; level++) {
uploadTextureSub(level, LEVEL_COLORS[level], ATLAS_SIZE >> level, ATLAS_SIZE >> level, true);
@@ -67,81 +74,81 @@ class GlsmSdlVanillaTextureTest {
}
private static int allocateDynamicLightmap() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int id = GLStateManager.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int id = GLSMTextures.glGenTextures();
allocateTextureImpl(id, 0, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 1.0f);
return id;
}
private static void allocateTextureImpl(int id, int maxLevel, int width, int height, float aniso) {
- GLStateManager.glDeleteTextures(id);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glDeleteTextures(id);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
if (maxLevel > 0) {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, (float) maxLevel);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, (float) maxLevel);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f);
}
for (int level = 0; level <= maxLevel; level++) {
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, width >> level, height >> level, 0,
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, width >> level, height >> level, 0,
GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, (IntBuffer) null);
}
}
private static void uploadTextureSub(int level, int argb, int width, int height, boolean mipmapped) {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
mipmapped ? GL11.GL_NEAREST_MIPMAP_LINEAR : GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
final IntBuffer data = BufferUtils.createIntBuffer(width * height);
for (int i = 0; i < width * height; i++) {
data.put(i, argb);
}
data.position(0);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, level, 0, 0, width, height,
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, level, 0, 0, width, height,
GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, data);
}
private static void uploadLightmapFrame(int argb) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
uploadTextureSub(0, argb, LIGHTMAP_SIZE, LIGHTMAP_SIZE, false);
}
private static void bindAtlasUnit0() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
}
private static void enableLightmap() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
final float scale = 0.00390625f;
- GLStateManager.glScalef(scale, scale, scale);
- GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glScalef(scale, scale, scale);
+ GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private static void quad(float extent, boolean lightmap, boolean counterClockwise) {
- GLStateManager.glBegin(GL11.GL_QUADS);
+ GLSMDraws.glBegin(GL11.GL_QUADS);
if (counterClockwise) {
GlsmSdlHeadlessRig.emitVertex(-extent, -extent, 0.0f, 0.0f, lightmap, (short) 240);
GlsmSdlHeadlessRig.emitVertex(extent, -extent, 1.0f, 0.0f, lightmap, (short) 240);
@@ -153,7 +160,7 @@ class GlsmSdlVanillaTextureTest {
GlsmSdlHeadlessRig.emitVertex(extent, -extent, 1.0f, 0.0f, lightmap, (short) 240);
GlsmSdlHeadlessRig.emitVertex(-extent, -extent, 0.0f, 0.0f, lightmap, (short) 240);
}
- GLStateManager.glEnd();
+ GLSMDraws.glEnd();
}
private static int center() {
@@ -224,11 +231,11 @@ class GlsmSdlVanillaTextureTest {
enableLightmap();
GlsmSdlHeadlessRig.terrainRenderState();
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
quad(1.0f, true, frontFacing);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
return center();
}
@@ -246,20 +253,20 @@ class GlsmSdlVanillaTextureTest {
@Test
void displayListWithBindingsOutsideShowsTheModulatedTexel() {
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
quad(1.0f, true, true);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
uploadLightmapFrame(0xFFFF8040);
bindAtlasUnit0();
enableLightmap();
GlsmSdlHeadlessRig.terrainRenderState();
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(0.0f, 0.0f, 0.0f);
- GLStateManager.glCallList(list);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(0.0f, 0.0f, 0.0f);
+ GLSMDraws.glCallList(list);
+ GLSMMatrices.glPopMatrix();
final int expected = modulate(LEVEL_COLORS[0], 0xFFFF8040);
final int actual = center();
@@ -267,14 +274,14 @@ class GlsmSdlVanillaTextureTest {
}
private static void texImageEmpty(int level) {
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
}
@Test
void zeroSizedLevelZeroDropsStorageAndRespecifyRecreatesIt() {
final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager();
final int tex = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2);
GlsmSdlHeadlessRig.uploadSolidLevel(0, 4, LEVEL_COLORS[0]);
assertEquals(3, rm.getTextureMeta(tex).levels(), "MAX_LEVEL 2 allocates the 4x4 chain");
final long handle = rm.getTextureHandle(tex);
@@ -292,21 +299,21 @@ class GlsmSdlVanillaTextureTest {
assertNotEquals(0L, rm.getTextureHandle(tex), "respecified level 0 must recreate storage");
assertEquals(4, rm.getTextureMeta(tex).width(), "recreated width");
assertEquals(3, rm.getTextureMeta(tex).levels(), "MAX_LEVEL survives the release");
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
@Test
void rescuedTextureAllocatesOneLevelUntilAHigherLevelIsUploaded() {
final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager();
final int tex = GlsmSdlHeadlessRig.newNearestTexture();
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2);
- GLStateManager.glDeleteTextures(tex);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2);
+ GLSMTextures.glDeleteTextures(tex);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
GlsmSdlHeadlessRig.uploadSolidLevel(0, 4, LEVEL_COLORS[0]);
assertEquals(1, rm.getTextureMeta(tex).levels(), "level-0 upload");
GlsmSdlHeadlessRig.uploadSolidLevel(1, 2, LEVEL_COLORS[1]);
assertEquals(3, rm.getTextureMeta(tex).levels(), "level-1 upload grows to the full chain");
- GLStateManager.glDeleteTextures(tex);
+ GLSMTextures.glDeleteTextures(tex);
}
@Test
@@ -314,17 +321,17 @@ class GlsmSdlVanillaTextureTest {
final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager();
final int deleted = GlsmSdlHeadlessRig.newNearestTexture();
GlsmSdlHeadlessRig.uploadSolidLevel(0, 4, LEVEL_COLORS[0]);
- final int volume = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, volume);
+ final int volume = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, volume);
- GLStateManager.glDeleteTextures(deleted);
+ GLSMTextures.glDeleteTextures(deleted);
assertEquals(volume, BackendManager.RENDER_BACKEND.getInteger(GL12.GL_TEXTURE_BINDING_3D), "after the delete");
- for (int i = 0; i < RELEASE_DELAY_FRAMES; i++) GLStateManager.onFrameEnd();
+ for (int i = 0; i < RELEASE_DELAY_FRAMES; i++) GLSMTextureLifetime.onFrameEnd();
assertEquals(0L, rm.getTextureHandle(deleted), "the frame-end release must have run");
assertEquals(volume, BackendManager.RENDER_BACKEND.getInteger(GL12.GL_TEXTURE_BINDING_3D), "after the release");
- GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0);
- GLStateManager.glDeleteTextures(volume);
+ GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0);
+ GLSMTextures.glDeleteTextures(volume);
}
}
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java
index 6d330a7ac..5d8543116 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.sdlgpu.SdlTestRig;
import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState;
import org.junit.jupiter.api.Tag;
@@ -21,30 +21,30 @@ class GlsmSdlVoxelRegionBindTest {
}
private static void unbind(int slot) {
- GLStateManager.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, slot, 0);
+ GLSMBuffers.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, slot, 0);
}
@Test
void glsmBindBufferBaseReachesBothCaches() {
final ContextState st = SdlTestRig.contextState();
- final int buf = GLStateManager.glGenBuffers();
+ final int buf = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf);
+ GLSMBuffers.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf);
assertEquals(buf, st.boundSsboByIndex[BOUND_SLOT], "SDL indexed SSBO slot");
assertEquals(buf, glsmGenericSsbo(), "GLSM generic SSBO binding");
} finally {
unbind(BOUND_SLOT);
- GLStateManager.glDeleteBuffers(buf);
+ GLSMBuffers.glDeleteBuffers(buf);
}
}
@Test
void deletingTheRegionBufferClearsTheGlsmGenericBinding() {
- final int buf = GLStateManager.glGenBuffers();
+ final int buf = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf);
+ GLSMBuffers.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf);
assertEquals(buf, glsmGenericSsbo());
- GLStateManager.glDeleteBuffers(buf);
+ GLSMBuffers.glDeleteBuffers(buf);
assertEquals(0, glsmGenericSsbo(), "delete must see the tracked SSBO binding");
} finally {
unbind(BOUND_SLOT);
diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java
index c0c1adfc7..6425fcde0 100644
--- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java
+++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java
@@ -1,6 +1,10 @@
package com.gtnewhorizons.angelica.sdlgpu.glsm;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@@ -23,19 +27,19 @@ class GlsmSdlWideLineTest {
@AfterEach
void resetLineState() {
- GLStateManager.glLineWidth(1.0f);
- GLStateManager.glDisable(GL11.GL_LINE_STIPPLE);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMRasterizer.glLineWidth(1.0f);
+ GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
private static void line(float[] start, float[] end) {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glBegin(GL11.GL_LINES);
- GLStateManager.glVertex3f(start[0], start[1], start[2]);
- GLStateManager.glVertex3f(end[0], end[1], end[2]);
- GLStateManager.glEnd();
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMDraws.glBegin(GL11.GL_LINES);
+ GLSMDraws.glVertex3f(start[0], start[1], start[2]);
+ GLSMDraws.glVertex3f(end[0], end[1], end[2]);
+ GLSMDraws.glEnd();
}
private static int litInRow(int[] pixels, int y) {
@@ -48,9 +52,9 @@ class GlsmSdlWideLineTest {
@Test
void stippledWideLineKeepsOnePhaseAcrossItsWidth() {
- GLStateManager.glLineWidth(3.0f);
- GLStateManager.glEnable(GL11.GL_LINE_STIPPLE);
- GLStateManager.glLineStipple(2, (short) 0x0F0F);
+ GLSMRasterizer.glLineWidth(3.0f);
+ GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE);
+ GLSMRasterizer.glLineStipple(2, (short) 0x0F0F);
final float y = pixelCenter(32);
line(new float[] { pixelCenter(8), y, 0f }, new float[] { pixelCenter(56), y, 0f });
@@ -70,11 +74,11 @@ class GlsmSdlWideLineTest {
private static final float[] BEHIND = { 0f, 0.8f, 2f };
private static void nearPlaneScene() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glFrustum(-0.05, 0.05, -0.05, 0.05, 0.05, 100.0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLineWidth(3.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glFrustum(-0.05, 0.05, -0.05, 0.05, 0.05, 100.0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMRasterizer.glLineWidth(3.0f);
}
private static void assertWidthAcrossTheNearPlane(float[] start, float[] end) {
@@ -124,15 +128,15 @@ class GlsmSdlWideLineTest {
}
private static void horizontalLines(float width, float lowerY, float upperY) {
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.glLineWidth(width);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glBegin(GL11.GL_LINES);
- GLStateManager.glVertex3f(-0.8f, lowerY, 0.0f);
- GLStateManager.glVertex3f(0.8f, lowerY, 0.0f);
- GLStateManager.glVertex3f(0.8f, upperY, 0.0f);
- GLStateManager.glVertex3f(-0.8f, upperY, 0.0f);
- GLStateManager.glEnd();
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMRasterizer.glLineWidth(width);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMDraws.glBegin(GL11.GL_LINES);
+ GLSMDraws.glVertex3f(-0.8f, lowerY, 0.0f);
+ GLSMDraws.glVertex3f(0.8f, lowerY, 0.0f);
+ GLSMDraws.glVertex3f(0.8f, upperY, 0.0f);
+ GLSMDraws.glVertex3f(-0.8f, upperY, 0.0f);
+ GLSMDraws.glEnd();
}
@Test
@@ -154,7 +158,7 @@ class GlsmSdlWideLineTest {
@Test
void wideLineCoversItsFirstPixelButNotItsLast() {
final float y = pixelCenter(16);
- GLStateManager.glLineWidth(2.0f);
+ GLSMRasterizer.glLineWidth(2.0f);
line(new float[] { pixelCenter(40), y, 0.0f }, new float[] { pixelCenter(20), y, 0.0f });
final int[] pixels = GlsmSdlHeadlessRig.readTarget();
diff --git a/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java b/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java
index a134454e2..da5b1958b 100644
--- a/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java
+++ b/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java
@@ -5,53 +5,43 @@ import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Public API for querying Angelica's GL call redirections.
*
* Angelica's bytecode transformer redirects GL calls (e.g., {@code GL11.glPushMatrix()}) to
- * {@link com.gtnewhorizons.angelica.glsm.GLStateManager GLStateManager} for state tracking and
- * core profile compatibility. This works for normal Java bytecode loaded through the Forge classloader,
+ * the GLSM classes for state tracking and core profile compatibility. This works for normal Java bytecode loaded through the Forge classloader,
* but callers that bypass class transformation (e.g., Nashorn/script engines, reflection, MethodHandles)
* need to perform their own redirection.
*
- * This class provides the redirect mapping data and a precompiled regex pattern for transforming
+ * This class provides the redirect mapping data and {@link #redirectScript} for transforming
* script source text before evaluation.
*
*
Example: transforming a Nashorn script before eval
- * Given a script that uses {@code importPackage(Packages.org.lwjgl.opengl)} and calls
- * {@code GL11.glPushMatrix()}, the text transformation rewrites those calls before evaluation:
* {@code
- * // Make GLStateManager available to the script -- either via importPackage:
- * script = "importPackage(Packages.com.gtnewhorizons.angelica.glsm);\n" + script;
- * // ... or via Java.type for an explicit binding:
- * // script = "var GLStateManager = Java.type('" + GLRedirects.TARGET_CLASS + "');\n" + script;
- *
- * // Rewrite: GL11.glPushMatrix() -> GLStateManager.glPushMatrix()
- * script = GLRedirects.getMethodRedirectPattern().matcher(script).replaceAll(mr -> {
- * String target = GLRedirects.getTargetMethodName(mr.group(0));
- * return target != null ? "GLStateManager." + target : mr.group(0);
- * });
- *
+ * script = GLRedirects.redirectScript(script);
* engine.eval(script);
* }
+ * {@link #getMethodRedirectPattern} and {@link #getTargetReference} remain for callers that rewrite text themselves.
*/
public final class GLRedirects {
- /** Fully qualified name of the GLStateManager class that all methods redirect to. */
- @SuppressWarnings("unused")
- public static final String TARGET_CLASS = "com.gtnewhorizons.angelica.glsm.GLStateManager";
-
private static final String SHORT_GL_PREFIX;
private static final Map> NAMED_CLASS_SHORT_NAME_MAP;
private static final Map GL_PREFIX_METHOD_REDIRECTS;
private static final Pattern METHOD_REDIRECT_PATTERN;
+ private static final Pattern UNQUALIFIED_METHOD_REDIRECT_PATTERN;
+ private static final String GLSM_INTERNAL_NAME = "com/gtnewhorizons/angelica/glsm/GLStateManager";
+ private static final String GLSM_IMPORT = "importPackage(Packages.com.gtnewhorizons.angelica.glsm)";
+ private static final Pattern GLSM_MEMBER_PATTERN = Pattern.compile("\\bGLStateManager\\.(\\w+)");
static {
SHORT_GL_PREFIX = buildShortGLPrefix();
NAMED_CLASS_SHORT_NAME_MAP = buildNamedClassShortNameMap();
GL_PREFIX_METHOD_REDIRECTS = GLSMRedirector.getGLPrefixMethodRedirects();
- METHOD_REDIRECT_PATTERN = buildMethodRedirectPattern();
+ METHOD_REDIRECT_PATTERN = buildMethodRedirectPattern("\\b");
+ UNQUALIFIED_METHOD_REDIRECT_PATTERN = buildMethodRedirectPattern("(? {
+ final String cls = mr.group(1);
+ if (cls.equals("GLStateManager") || cls.startsWith("GLSM")) return Matcher.quoteReplacement(mr.group());
+ final String ref = getTargetReference(mr.group());
+ return Matcher.quoteReplacement(ref != null ? ref : mr.group());
+ });
+ result = GLSM_MEMBER_PATTERN.matcher(result).replaceAll(mr -> {
+ final String owner = GLSMRedirector.getTargetOwner(mr.group(1));
+ if (owner == null || owner.equals(GLSM_INTERNAL_NAME)) return Matcher.quoteReplacement(mr.group());
+ return Matcher.quoteReplacement(qualify(owner, mr.group(1)));
+ });
+ if (result.equals(script)) return script;
+ return result.contains(GLSM_IMPORT) ? result : GLSM_IMPORT + ";\n" + result;
+ }
+
private static String buildShortGLPrefix() {
final String glPrefix = GLSMRedirector.getGLPrefix();
return glPrefix.substring(glPrefix.lastIndexOf('/') + 1);
@@ -106,13 +135,13 @@ public final class GLRedirects {
return named;
}
- private static Pattern buildMethodRedirectPattern() {
+ private static Pattern buildMethodRedirectPattern(String lead) {
final TreeSet alternatives = new TreeSet<>();
alternatives.add(Pattern.quote(SHORT_GL_PREFIX) + "\\w+");
for (final String shortName : NAMED_CLASS_SHORT_NAME_MAP.keySet()) {
alternatives.add(Pattern.quote(shortName));
}
final String classAlt = String.join("|", alternatives);
- return Pattern.compile("\\b(" + classAlt + ")\\.\\w+\\b");
+ return Pattern.compile(lead + "(" + classAlt + ")\\.\\w+\\b");
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java b/src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java
new file mode 100644
index 000000000..7ed198093
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java
@@ -0,0 +1,73 @@
+package com.gtnewhorizons.angelica.api.glstate;
+
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.stacks.FogStateStack;
+import org.joml.Matrix4f;
+import org.joml.Vector3d;
+import org.joml.Vector4f;
+
+import java.nio.FloatBuffer;
+
+/** Read-only access to the GL state Angelica tracks. Call from the render thread. */
+public final class GLState {
+
+ private GLState() {}
+
+ public static boolean isFogEnabled() {
+ return GLSMFog.getFogMode().isEnabled();
+ }
+
+ /** @return The fog mode: GL_EXP, GL_EXP2 or GL_LINEAR. */
+ public static int getFogMode() {
+ return GLSMFog.getFogState().getFogMode();
+ }
+
+ public static float getFogStart() {
+ return GLSMFog.getFogState().getStart();
+ }
+
+ public static float getFogEnd() {
+ return GLSMFog.getFogState().getEnd();
+ }
+
+ public static float getFogDensity() {
+ return GLSMFog.getFogState().getDensity();
+ }
+
+ public static Vector4f getFogColor(Vector4f dest) {
+ final FogStateStack fog = GLSMFog.getFogState();
+ return dest.set((float) fog.getFogColor().x, (float) fog.getFogColor().y, (float) fog.getFogColor().z, fog.getFogAlpha());
+ }
+
+ public static Vector3d getFogColor(Vector3d dest) {
+ return dest.set(GLSMFog.getFogState().getFogColor());
+ }
+
+ /** Writes the fog color as RGBA at the buffer's position. The position is not changed. */
+ public static void getFogColor(FloatBuffer rgba) {
+ final FogStateStack fog = GLSMFog.getFogState();
+ final int pos = rgba.position();
+ rgba.put(pos, (float) fog.getFogColor().x);
+ rgba.put(pos + 1, (float) fog.getFogColor().y);
+ rgba.put(pos + 2, (float) fog.getFogColor().z);
+ rgba.put(pos + 3, fog.getFogAlpha());
+ }
+
+ public static Matrix4f getModelViewMatrix(Matrix4f dest) {
+ return dest.set(GLSMMatrices.getModelViewMatrix());
+ }
+
+ public static Matrix4f getProjectionMatrix(Matrix4f dest) {
+ return dest.set(GLSMMatrices.getProjectionMatrix());
+ }
+
+ public static String getRenderBackendName() {
+ return GLStateManager.getRenderBackendName();
+ }
+
+ public static boolean isRenderThread() {
+ return GLStateManager.isMainThread();
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java b/src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java
new file mode 100644
index 000000000..a00f2fafb
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java
@@ -0,0 +1,4 @@
+@API(owner = "angelica", provides = "angelica|glstate", apiVersion = "1")
+package com.gtnewhorizons.angelica.api.glstate;
+
+import cpw.mods.fml.common.API;
diff --git a/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java b/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java
index 6aa8315c9..d32561f6a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java
+++ b/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.api.tesr;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.minecraft.tileentity.TileEntity;
/**
@@ -21,7 +21,7 @@ public interface TesrMeshProvider {
/** Per-instance transform, defaults to TE position */
default void angelica$transform(TileEntity te, double x, double y, double z) {
- GLStateManager.glTranslated(x, y, z);
+ GLSMMatrices.glTranslated(x, y, z);
}
/** Build and cache the mesh */
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java b/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java
index a185344f5..ef5777747 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java
@@ -7,6 +7,17 @@ import com.gtnewhorizon.gtnhlib.util.font.FontRendering;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.config.FontConfig;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.FFPVertexLighting;
@@ -129,16 +140,16 @@ public class BatchingFontRenderer {
FontProviderMC.get(this.isSGA).locationFontTexture = this.locationFontTexture;
fontShaderId = FontAAShader.getProgram().getProgramId();
- AAMode = GLStateManager.glGetUniformLocation(fontShaderId, "aaMode");
- AAStrength = GLStateManager.glGetUniformLocation(fontShaderId, "strength");
- fontBrightness = GLStateManager.glGetUniformLocation(fontShaderId, "fontBrightness");
- alphaTestRefLocation = GLStateManager.glGetUniformLocation(fontShaderId, "alphaTestRef");
- mvpMatrixLocation = GLStateManager.glGetUniformLocation(fontShaderId, "u_MVPMatrix");
- lightmapLocation = GLStateManager.glGetUniformLocation(fontShaderId, "u_Lightmap");
- lightmapSamplerLocation = GLStateManager.glGetUniformLocation(fontShaderId, "lightmap");
+ AAMode = GLSMPrograms.glGetUniformLocation(fontShaderId, "aaMode");
+ AAStrength = GLSMPrograms.glGetUniformLocation(fontShaderId, "strength");
+ fontBrightness = GLSMPrograms.glGetUniformLocation(fontShaderId, "fontBrightness");
+ alphaTestRefLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "alphaTestRef");
+ mvpMatrixLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "u_MVPMatrix");
+ lightmapLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "u_Lightmap");
+ lightmapSamplerLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "lightmap");
if (ebo == null) {
ebo = new IndexBuffer();
- vbo = GLStateManager.glGenBuffers();
+ vbo = GLSMBuffers.glGenBuffers();
allocateBuffers();
}
}
@@ -372,7 +383,7 @@ public class BatchingFontRenderer {
return;
}
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
vboCapacity = StreamingUploader.upload(vertexData, vboCapacity);
pendingBuffer = vbo;
pendingBase = 0;
@@ -607,12 +618,12 @@ public class BatchingFontRenderer {
if (batchMatrixValid) {
batchProj.mul(batchModelView, dest);
} else {
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), dest);
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), dest);
}
}
private void resolveModelView(Matrix4f dest) {
- dest.set(batchMatrixValid ? batchModelView : GLStateManager.getModelViewMatrix());
+ dest.set(batchMatrixValid ? batchModelView : GLSMMatrices.getModelViewMatrix());
}
private void sealBatchSegment() {
@@ -747,25 +758,25 @@ public class BatchingFontRenderer {
final BatchingFontRenderer first = deferredSegments.getFirst().owner;
final int prevBlockEntityId = CapturedRenderingState.INSTANCE.getCurrentRenderedBlockEntity();
- final int d = GLStateManager.pushState(StateSet.FONT_PIPELINE);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT_PIPELINE);
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
- GLStateManager.enableAlphaTest();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(first.blendSrcRGB, first.blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(first.blendSrcRGB, first.blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO);
final Boolean prevTranslucency = GbufferPrograms.beginTranslucencyDeclaration(Boolean.TRUE);
GbufferPrograms.setBlockEntityDefaults();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
try {
for (final TextSegment segment : deferredSegments) {
final BatchingFontRenderer owner = segment.owner;
if (segment.cmdStart == segment.cmdEnd) continue;
- GLStateManager.setModelViewMatrix(segment.modelView);
+ GLSMMatrices.setModelViewMatrix(segment.modelView);
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(segment.blockEntityId);
segment.drawState.apply();
@@ -776,12 +787,12 @@ public class BatchingFontRenderer {
segment.packedLight, segment.normalX, segment.normalY, segment.normalZ);
}
} finally {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(prevBlockEntityId);
GbufferPrograms.endTranslucencyDeclaration(prevTranslucency);
}
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
discardDeferredText();
}
}
@@ -791,32 +802,32 @@ public class BatchingFontRenderer {
uploadVertexData(deferredVertexPos);
}
- final int d = GLStateManager.pushState(StateSet.FONT);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT);
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
deferredSegments.get(0).owner.setupFontDrawState();
flushLastTexture = INVALID_TEXTURE;
resetFlushLightmap();
for (final TextSegment segment : deferredSegments) {
FLUSH_MVP.clear();
segment.mvp.get(FLUSH_MVP);
- GLStateManager.glUniformMatrix4(segment.owner.mvpMatrixLocation, false, FLUSH_MVP);
+ GLSMPrograms.glUniformMatrix4(segment.owner.mvpMatrixLocation, false, FLUSH_MVP);
uploadLightmap(segment.owner.lightmapLocation, segment.lightmapActive, segment.lightmapU,
segment.lightmapV, segment.lightmapTexture);
segment.owner.applyDrawState(segment.drawState);
drawCommands(segment.owner.batchCommands.elements(), segment.cmdStart, segment.cmdEnd, segment.owner);
}
} finally {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.popStateTo(d);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMAttribStack.popStateTo(d);
discardDeferredText();
}
}
private void applyDrawState(TextDrawState state) {
state.apply();
- GLStateManager.glUniform1f(alphaTestRefLocation, state.alphaRef);
+ GLSMPrograms.glUniform1f(alphaTestRefLocation, state.alphaRef);
}
public static void discardDeferredText() {
@@ -917,7 +928,7 @@ public class BatchingFontRenderer {
}
Arrays.sort(cmds, batchSealedEnd, cmdCount, FontDrawCmd.DRAW_ORDER_COMPARATOR);
- final int d = GLStateManager.pushState(StateSet.FONT);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT);
try {
setupFontDrawState();
flushLastTexture = INVALID_TEXTURE;
@@ -927,7 +938,7 @@ public class BatchingFontRenderer {
final TextSegment segment = batchSegments.get(i);
FLUSH_MVP.clear();
segment.mvp.get(FLUSH_MVP);
- GLStateManager.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP);
+ GLSMPrograms.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP);
uploadLightmap(lightmapLocation, segment.lightmapActive, segment.lightmapU, segment.lightmapV, segment.lightmapTexture);
applyDrawState(segment.drawState);
drawCommands(cmds, segment.cmdStart, segment.cmdEnd, this);
@@ -936,17 +947,17 @@ public class BatchingFontRenderer {
FLUSH_MVP.clear();
resolveMvp(scratchMvp);
scratchMvp.get(FLUSH_MVP);
- GLStateManager.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP);
+ GLSMPrograms.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP);
uploadLightmap(lightmapLocation, lightmapActive, lightmapU, lightmapV, lightmapTextureId);
applyDrawState(drawState);
drawCommands(cmds, batchSealedEnd, cmdCount, this);
}
} finally {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
}
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
truncateBatchToWatermark();
@@ -957,27 +968,27 @@ public class BatchingFontRenderer {
}
private void setupFontDrawState() {
- GLStateManager.enableTexture();
- GLStateManager.enableAlphaTest();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glShadeModel(GL11.GL_FLAT);
+ GLSMTextures.enableTexture();
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
- GLStateManager.glUseProgram(fontShaderId);
+ GLSMPrograms.glUseProgram(fontShaderId);
if (FontConfig.fontAAMode != fontAAModeLast) {
fontAAModeLast = FontConfig.fontAAMode;
- GLStateManager.glUniform1i(AAMode, FontConfig.fontAAMode);
+ GLSMPrograms.glUniform1i(AAMode, FontConfig.fontAAMode);
}
if (FontConfig.fontAAStrength != fontAAStrengthLast) {
fontAAStrengthLast = FontConfig.fontAAStrength;
- GLStateManager.glUniform1f(AAStrength, preprocessAAStrength());
+ GLSMPrograms.glUniform1f(AAStrength, preprocessAAStrength());
}
if (FontConfig.fontBrightness != fontBrightnessLast) {
fontBrightnessLast = FontConfig.fontBrightness;
- GLStateManager.glUniform1f(fontBrightness, 0.625f * FontConfig.fontBrightness + 0.1875f);
+ GLSMPrograms.glUniform1f(fontBrightness, 0.625f * FontConfig.fontBrightness + 0.1875f);
}
if (lightmapSamplerProgram != fontShaderId) {
- GLStateManager.glUniform1i(lightmapSamplerLocation, LIGHTMAP_TEX_UNIT);
+ GLSMPrograms.glUniform1i(lightmapSamplerLocation, LIGHTMAP_TEX_UNIT);
lightmapSamplerProgram = fontShaderId;
}
@@ -988,28 +999,28 @@ public class BatchingFontRenderer {
}
int fontVAO = glCtx.fontVao;
if (fontVAO == 0) {
- fontVAO = GLStateManager.glGenVertexArrays();
+ fontVAO = GLSMVertexInput.glGenVertexArrays();
glCtx.fontVao = fontVAO;
- GLStateManager.glBindVertexArray(fontVAO);
+ GLSMVertexInput.glBindVertexArray(fontVAO);
ebo.bind();
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glEnableVertexAttribArray(2);
- GLStateManager.glEnableVertexAttribArray(3);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMVertexInput.glEnableVertexAttribArray(2);
+ GLSMVertexInput.glEnableVertexAttribArray(3);
} else {
- GLStateManager.glBindVertexArray(fontVAO);
+ GLSMVertexInput.glBindVertexArray(fontVAO);
}
}
private static void bindVertexSource(int buffer, int base) {
if (vaoBuffer != buffer || vaoBase != base) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base);
- GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 8);
- GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, base + 16);
- GLStateManager.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 20);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base);
+ GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 8);
+ GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, base + 16);
+ GLSMVertexInput.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 20);
vaoBuffer = buffer;
vaoBase = base;
@@ -1029,18 +1040,18 @@ public class BatchingFontRenderer {
}
private static int boundLightmapTexture() {
- return GLStateManager.getTextures().getTextureUnitBindings(LIGHTMAP_TEX_UNIT).getBinding();
+ return GLSMTextures.getTextures().getTextureUnitBindings(LIGHTMAP_TEX_UNIT).getBinding();
}
private static void bindLightmapTexture(int texture) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private static void uploadLightmap(int uniformLocation, boolean active, float u, float v, int texture) {
if (u != flushLastLightmapU || v != flushLastLightmapV || active != flushLastLightmapActive) {
- GLStateManager.glUniform3f(uniformLocation, u, v, active ? 1.0f : 0.0f);
+ GLSMPrograms.glUniform3f(uniformLocation, u, v, active ? 1.0f : 0.0f);
flushLastLightmapU = u;
flushLastLightmapV = v;
flushLastLightmapActive = active;
@@ -1075,9 +1086,9 @@ public class BatchingFontRenderer {
final FontDrawCmd cmd = cmdsData[i];
if (flushLastTexture != cmd.texture) {
if (flushLastTexture == 0) {
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
} else if (cmd.texture == 0) {
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
}
if (cmd.texture != 0) {
bindIntTexture(owner, cmd.texture);
@@ -1086,7 +1097,7 @@ public class BatchingFontRenderer {
}
if (cmd.mesh == null) {
bindVertexSource(pendingBuffer, pendingBase);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L);
continue;
}
int end = i + 1;
@@ -1097,10 +1108,10 @@ public class BatchingFontRenderer {
}
bindVertexSource(cmd.buffer, 0);
// GLSM's glDrawElementsBaseVertex and glMultiDrawElementsBaseVertex skip glDrawElements' preDraw (pending program, deferred blend, entity ids, deferred attribs); drop this and those go stale.
- GLStateManager.preDraw(GLStateManager.ctx(), GL11.GL_TRIANGLES);
+ GLSMDraws.preDraw(GLStateManager.ctx(), GL11.GL_TRIANGLES);
final int runLength = end - i;
if (runLength == 1) {
- GLStateManager.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L, cmd.baseVertex);
+ GLSMDraws.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L, cmd.baseVertex);
} else {
if (runLength > multiDrawCapacity) growMultiDraw(runLength);
for (int k = 0; k < runLength; k++) {
@@ -1109,7 +1120,7 @@ public class BatchingFontRenderer {
memPutAddress(multiDrawIndicesAddress + (long) k * Pointer.POINTER_SIZE, (long) run.startVtx * 2L);
memPutInt(multiDrawBaseVerticesAddress + (long) k * 4L, run.baseVertex);
}
- GLStateManager.glMultiDrawElementsBaseVertex(GL11.GL_TRIANGLES, multiDrawCountsAddress, GL11.GL_UNSIGNED_SHORT,
+ GLSMDraws.glMultiDrawElementsBaseVertex(GL11.GL_TRIANGLES, multiDrawCountsAddress, GL11.GL_UNSIGNED_SHORT,
multiDrawIndicesAddress, runLength, multiDrawBaseVerticesAddress);
}
i = end - 1;
@@ -1136,30 +1147,30 @@ public class BatchingFontRenderer {
// The unsealed tail still belongs to the modelview live at flush time; capture it before the segments move it.
resolveModelView(scratchModelView);
- final int d = GLStateManager.pushState(StateSet.FONT_PIPELINE);
+ final int d = GLSMAttribStack.pushState(StateSet.FONT_PIPELINE);
try {
- GLStateManager.enableTexture();
- GLStateManager.enableAlphaTest();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMTextures.enableTexture();
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO);
final Boolean prevTranslucency = GbufferPrograms.beginTranslucencyDeclaration(Boolean.TRUE);
GbufferPrograms.setBlockEntityDefaults();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
try {
for (int i = 0; i < segmentCount; i++) {
final TextSegment segment = batchSegments.get(i);
if (segment.cmdStart == segment.cmdEnd) continue;
- GLStateManager.setModelViewMatrix(segment.modelView);
+ GLSMMatrices.setModelViewMatrix(segment.modelView);
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(segment.blockEntityId);
segment.drawState.apply();
emitRangeThroughPipeline(this, cmdsData, segment.cmdStart, segment.cmdEnd,
segment.packedLight, segment.normalX, segment.normalY, segment.normalZ);
}
if (batchSealedEnd < cmdCount) {
- GLStateManager.setModelViewMatrix(scratchModelView);
+ GLSMMatrices.setModelViewMatrix(scratchModelView);
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(prevBlockEntityId);
drawState.apply();
final Vector3f normal = ShaderManager.getCurrentNormal();
@@ -1167,12 +1178,12 @@ public class BatchingFontRenderer {
lightmapPackedLight, normal.x, normal.y, normal.z);
}
} finally {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(prevBlockEntityId);
GbufferPrograms.endTranslucencyDeclaration(prevTranslucency);
}
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
truncateBatchToWatermark();
}
}
@@ -1192,9 +1203,9 @@ public class BatchingFontRenderer {
drawing = false;
}
if (cmd.texture == 0) {
- GLStateManager.disableTexture();
+ GLSMTextures.disableTexture();
} else {
- GLStateManager.enableTexture();
+ GLSMTextures.enableTexture();
bindIntTexture(owner, cmd.texture);
}
lastTexture = cmd.texture;
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java b/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java
index 21fc2a785..8ea062adc 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java
@@ -4,7 +4,7 @@ import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memAllocInt;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memFree;
import com.gtnewhorizons.angelica.config.FontConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import jss.util.RandomXoshiro256StarStar;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -65,7 +65,7 @@ public final class FontProviderCustom implements FontProvider {
for (int i = 0; i < ATLAS_COUNT; i++) {
if (this.atlasTextures[i] != 0) {
- GLStateManager.glDeleteTextures(this.atlasTextures[i]);
+ GLSMTextures.glDeleteTextures(this.atlasTextures[i]);
this.atlasTextures[i] = 0;
}
}
@@ -236,18 +236,18 @@ public final class FontProviderCustom implements FontProvider {
final BufferedImage image = rasterize(id);
if (image == null) { return 0; }
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
final IntBuffer pixelBuffer = memAllocInt(pixels.length);
pixelBuffer.put(pixels);
pixelBuffer.flip();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
memFree(pixelBuffer);
this.atlasTextures[id] = texture;
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java b/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java
index 4dfa1b0b7..a4017ec87 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java
@@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.client.font;
import com.google.common.collect.HashMultiset;
import com.gtnewhorizon.gtnhlib.util.font.GlyphReplacements;
import com.gtnewhorizons.angelica.config.FontConfig;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
import cpw.mods.fml.client.SplashProgress;
@@ -260,7 +261,7 @@ public class FontStrategist {
static void bindIntTexture(BatchingFontRenderer owner, int texture) {
if (texture > 0) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
} else if (texture < 0) {
final ResourceLocation location;
synchronized (RESOURCE_LOCK) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java b/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java
index 745ff2058..1b9258f2d 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizons.angelica.glsm.FeedbackManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
@@ -108,10 +109,10 @@ final class RetainedTextStore {
private static void create(int capacity) {
final int previous = GLStateManager.ctx().boundVBO;
- buffer = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) capacity * BatchingFontRenderer.QUAD_BYTES, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous);
+ buffer = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) capacity * BatchingFontRenderer.QUAD_BYTES, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous);
capacityQuads = capacity;
allocator.reset(capacity);
resident.clear();
@@ -123,9 +124,9 @@ final class RetainedTextStore {
final ByteBuffer vertices = mesh.vertices;
vertices.position(0);
vertices.limit(mesh.quadCount * BatchingFontRenderer.QUAD_BYTES);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) start * BatchingFontRenderer.QUAD_BYTES, vertices);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) start * BatchingFontRenderer.QUAD_BYTES, vertices);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous);
vertices.clear();
}
@@ -150,7 +151,7 @@ final class RetainedTextStore {
final int id = retiredBuffers[i];
if (retiredBufferFrames[i] <= deletableUpTo) {
BatchingFontRenderer.forgetVertexSource(id);
- GLStateManager.glDeleteBuffers(id);
+ GLSMBuffers.glDeleteBuffers(id);
} else {
retiredBuffers[kept] = id;
retiredBufferFrames[kept] = retiredBufferFrames[i];
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java b/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java
index d8e5a15e1..92568008c 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java
@@ -1,7 +1,10 @@
package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizons.angelica.glsm.GLContextState;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.states.ColorMask;
import com.gtnewhorizons.angelica.glsm.states.PolygonState;
import org.lwjgl.opengl.GL11;
@@ -83,14 +86,14 @@ final class TextDrawState {
}
void apply() {
- if (depthTest) GLStateManager.enableDepthTest(); else GLStateManager.disableDepthTest();
- GLStateManager.glDepthFunc(depthFunc);
- GLStateManager.glDepthMask(depthMask);
- GLStateManager.glColorMask(colorRed, colorGreen, colorBlue, colorAlpha);
- if (cull) GLStateManager.enableCull(); else GLStateManager.disableCull();
- GLStateManager.glCullFace(cullFace);
- GLStateManager.glFrontFace(frontFace);
- if (polygonOffset) GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); else GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(offsetFactor, offsetUnits);
+ if (depthTest) GLSMDepthStencilAlpha.enableDepthTest(); else GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(depthFunc);
+ GLSMDepthStencilAlpha.glDepthMask(depthMask);
+ GLSMBlend.glColorMask(colorRed, colorGreen, colorBlue, colorAlpha);
+ if (cull) GLSMRasterizer.enableCull(); else GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(cullFace);
+ GLSMRasterizer.glFrontFace(frontFace);
+ if (polygonOffset) GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); else GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(offsetFactor, offsetUnits);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java b/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java
index 13516cf84..e7b2ecf4a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.client.gui;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
@@ -123,7 +123,7 @@ public class SliderClone extends GuiButton {
this.displayString = displayStringFormatter.apply(f);
}
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.drawTexturedModalRect(this.xPosition + (int)(this.sliderPercentage * (float)(this.width - 8)), this.yPosition, 0, 66, 4, 20);
this.drawTexturedModalRect(this.xPosition + (int)(this.sliderPercentage * (float)(this.width - 8)) + 4, this.yPosition, 196, 66, 4, 20);
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java
index b5daa5d6c..4deec6494 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.client.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
import org.embeddedt.embeddium.impl.render.chunk.fog.FogService;
import org.embeddedt.embeddium.impl.render.chunk.shader.ChunkFogMode;
@@ -11,17 +11,17 @@ public class AngelicaFogService implements FogService {
@Override
public float getFogEnd() {
- return GLStateManager.getFogState().getEnd();
+ return GLSMFog.getFogState().getEnd();
}
@Override
public float getFogStart() {
- return GLStateManager.getFogState().getStart();
+ return GLSMFog.getFogState().getStart();
}
@Override
public float getFogDensity() {
- return GLStateManager.getFogState().getDensity();
+ return GLSMFog.getFogState().getDensity();
}
@Override
@@ -36,7 +36,7 @@ public class AngelicaFogService implements FogService {
@Override
public float[] getFogColor() {
- final var fogState = GLStateManager.getFogState();
+ final var fogState = GLSMFog.getFogState();
final var color = fogState.getFogColor();
fogColorArray[0] = (float) color.x;
fogColorArray[1] = (float) color.y;
@@ -47,9 +47,9 @@ public class AngelicaFogService implements FogService {
@Override
public ChunkFogMode getFogMode() {
- if (!GLStateManager.getFogMode().isEnabled()) {
+ if (!GLSMFog.getFogMode().isEnabled()) {
return ChunkFogMode.NONE;
}
- return ChunkFogMode.fromGLMode(GLStateManager.getFogState().getFogMode());
+ return ChunkFogMode.fromGLMode(GLSMFog.getFogState().getFogMode());
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java
index 74c812960..436ac92dc 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java
@@ -1,7 +1,10 @@
package com.gtnewhorizons.angelica.client.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
import lombok.Getter;
import net.minecraft.client.renderer.Tessellator;
@@ -107,7 +110,7 @@ public class DeferredDrawBatcher {
subEnd++;
// Don't try to merge strips, fans, loops or polygons
- if (GLStateManager.isContinuousDraw(drawMode)) break;
+ if (GLSMDraws.isContinuousDraw(drawMode)) break;
}
drawPackedBatch(batchTessellator, ranges, i, subEnd, totalBytes, totalVertices, drawMode, flags);
@@ -150,14 +153,14 @@ public class DeferredDrawBatcher {
* - fog state (mode, color, start/end — constant for the frame)
*/
static long captureStateKey() {
- final int activeUnit = GLStateManager.getActiveTextureUnit();
- final int textureId = GLStateManager.getTextures().getTextureUnitBindings(activeUnit).getBinding();
- final int srcRgb = GLStateManager.getBlendState().getSrcRgb();
- final int dstRgb = GLStateManager.getBlendState().getDstRgb();
- final boolean blendEnabled = GLStateManager.getBlendMode().isEnabled();
- final boolean depthMask = GLStateManager.getDepthState().isEnabled();
- final boolean tex0Enabled = GLStateManager.getTextures().getTextureUnitStates(0).isEnabled();
- final boolean tex1Enabled = GLStateManager.getTextures().getTextureUnitStates(1).isEnabled();
+ final int activeUnit = GLSMTextures.getActiveTextureUnit();
+ final int textureId = GLSMTextures.getTextures().getTextureUnitBindings(activeUnit).getBinding();
+ final int srcRgb = GLSMBlend.getBlendState().getSrcRgb();
+ final int dstRgb = GLSMBlend.getBlendState().getDstRgb();
+ final boolean blendEnabled = GLSMBlend.getBlendMode().isEnabled();
+ final boolean depthMask = GLSMDepthStencilAlpha.getDepthState().isEnabled();
+ final boolean tex0Enabled = GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled();
+ final boolean tex1Enabled = GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled();
return packStateKey(textureId, srcRgb, dstRgb, blendEnabled, depthMask, tex0Enabled, tex1Enabled);
}
@@ -189,15 +192,15 @@ public class DeferredDrawBatcher {
final boolean tex0Enabled = unpackTex0Enabled(key);
final boolean tex1Enabled = unpackTex1Enabled(key);
- GLStateManager.getTextures().getTextureUnitStates(0).setEnabled(tex0Enabled);
- GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(tex1Enabled);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
- GLStateManager.glBlendFunc(srcRgb, dstRgb);
+ GLSMTextures.getTextures().getTextureUnitStates(0).setEnabled(tex0Enabled);
+ GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(tex1Enabled);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
+ GLSMBlend.glBlendFunc(srcRgb, dstRgb);
if (blendEnabled) {
- GLStateManager.enableBlend();
+ GLSMBlend.enableBlend();
} else {
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
}
- GLStateManager.glDepthMask(depthMask);
+ GLSMDepthStencilAlpha.glDepthMask(depthMask);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java
index 173db07db..a22f8c657 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.client.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform;
public class GlUniformFloat2v extends GlUniform {
@@ -14,10 +14,10 @@ public class GlUniformFloat2v extends GlUniform {
if (value.length != 2) {
throw new IllegalArgumentException("value.length != 2");
}
- GLStateManager.glUniform2f(this.index, value[0], value[1]);
+ GLSMPrograms.glUniform2f(this.index, value[0], value[1]);
}
public void set(float x, float y) {
- GLStateManager.glUniform2f(this.index, x, y);
+ GLSMPrograms.glUniform2f(this.index, x, y);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java
index b3b74d128..5cd78c188 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.client.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform;
import java.nio.FloatBuffer;
@@ -13,6 +13,6 @@ public class GlUniformFloat3Array extends GlUniform {
@Override
public void set(FloatBuffer value) {
- GLStateManager.glUniform3(this.index, value);
+ GLSMPrograms.glUniform3(this.index, value);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java
index b24172386..ebfed5f2d 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.client.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform;
import java.nio.FloatBuffer;
@@ -13,6 +13,6 @@ public class GlUniformFloat4Array extends GlUniform {
@Override
public void set(FloatBuffer value) {
- GLStateManager.glUniform4(this.index, value);
+ GLSMPrograms.glUniform4(this.index, value);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java
index e1ff9888c..b13984596 100644
--- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.client.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
@@ -10,12 +10,12 @@ public final class ModelViewDelta {
private final Matrix4f baseInverse = new Matrix4f();
public void snapshot() {
- base.set(GLStateManager.getModelViewMatrix());
+ base.set(GLSMMatrices.getModelViewMatrix());
base.invert(baseInverse);
}
public Matrix4fc deltaOrNull(Matrix4f scratch) {
- final Matrix4f current = GLStateManager.getModelViewMatrix();
+ final Matrix4f current = GLSMMatrices.getModelViewMatrix();
if (current.equals(base)) return null;
return baseInverse.mul(current, scratch);
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java b/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java
index 38482b8c0..6b91ed18c 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java
@@ -6,6 +6,8 @@ import org.lwjgl.opengl.ARBDebugOutput;
import org.lwjgl.opengl.GL11;
import com.gtnewhorizons.angelica.config.SystemProperties;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.LTWWorkaround;
@@ -21,9 +23,9 @@ public class DriverCompatabilityCheck {
* Should be called after GL context is created and GLStateManager is initialized.
*/
public static void checkDriverCompatibility() {
- final String vendor = GLStateManager.glGetString(GL11.GL_VENDOR);
- final String renderer = GLStateManager.glGetString(GL11.GL_RENDERER);
- final String version = GLStateManager.glGetString(GL11.GL_VERSION);
+ final String vendor = GLSMQueries.glGetString(GL11.GL_VENDOR);
+ final String renderer = GLSMQueries.glGetString(GL11.GL_RENDERER);
+ final String version = GLSMQueries.glGetString(GL11.GL_VERSION);
LOGGER.info("OpenGL Vendor: {}", vendor);
LOGGER.info("OpenGL Renderer: {}", renderer);
@@ -58,6 +60,6 @@ public class DriverCompatabilityCheck {
}
LOGGER.info("Enabling workaround for NVIDIA threaded optimizations");
- GLStateManager.glEnable(ARBDebugOutput.GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
+ GLSMEnable.glEnable(ARBDebugOutput.GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java b/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java
index 81e994e90..72f73cfb7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java
@@ -6,6 +6,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugGroupHandle;
import com.gtnewhorizons.angelica.api.debug.DebugScreenApi;
import com.gtnewhorizons.angelica.api.debug.DebugScreenDisplayer;
import com.gtnewhorizons.angelica.api.debug.DebugScreenEntry;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
@@ -59,9 +60,9 @@ public final class BotaniaDebugEntry implements DebugScreenEntry {
return;
}
if (glVersion == null) {
- glVersion = GLStateManager.glGetString(GL11.GL_VERSION);
- glRenderer = GLStateManager.glGetString(GL11.GL_RENDERER);
- glslVersion = GLStateManager.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION);
+ glVersion = GLSMQueries.glGetString(GL11.GL_VERSION);
+ glRenderer = GLSMQueries.glGetString(GL11.GL_RENDERER);
+ glslVersion = GLSMQueries.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION);
}
final ContextCapabilities caps = GLStateManager.capabilities;
writeContext(displayer, group, ConfigHandler.useShaders, ConfigHandler.glSecondaryTextureUnit, glVersion, glRenderer, glslVersion, GLStateManager.MAX_TEXTURE_UNITS, caps.GL_ARB_multitexture, caps.GL_ARB_texture_non_power_of_two, caps.OpenGL13);
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java b/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java
index 1e425b17b..edf204fa7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.compat.draconicevolution;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.item.ItemBlock;
@@ -21,24 +23,24 @@ public final class PlacedItemRenderCompat {
public static void render(double x, double y, double z, Runnable draw) {
final boolean inFrame = RenderItem.renderInFrame;
- GLStateManager.glPushMatrix();
- GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT);
+ GLSMMatrices.glPushMatrix();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT);
try {
- GLStateManager.glTranslated(x, y, z);
+ GLSMMatrices.glTranslated(x, y, z);
draw.run();
} finally {
RenderItem.renderInFrame = inFrame;
- GLStateManager.glPopAttrib();
- GLStateManager.glPopMatrix();
+ GLSMAttribStack.glPopAttrib();
+ GLSMMatrices.glPopMatrix();
}
}
public static byte renderWithBatchState(double x, double y, double z, byte state, Runnable draw) {
- BatchEligibility.beginIsolated(state, GLStateManager.drawCalls);
+ BatchEligibility.beginIsolated(state, GLSMDraws.drawCalls);
try {
render(x, y, z, draw);
} finally {
- state = BatchEligibility.endIsolated(state, GLStateManager.drawCalls);
+ state = BatchEligibility.endIsolated(state, GLSMDraws.drawCalls);
}
return state;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java
index e333de8c1..3e933d290 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.compat.mojang;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.renderer.texture.AbstractTexture;
import org.lwjgl.opengl.GL11;
@@ -12,6 +12,6 @@ public abstract class AutoClosableAbstractTexture extends AbstractTexture implem
// TODO: Is this needed?
public void bind() {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, getGlTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, getGlTextureId());
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java
index 04ae05d93..41444b1c7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java
@@ -9,7 +9,7 @@ import java.nio.IntBuffer;
import javax.imageio.ImageIO;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import lombok.Getter;
import net.coderbot.iris.Iris;
import org.lwjgl.opengl.GL11;
@@ -55,7 +55,7 @@ public class NativeImage extends BufferedImage {
public void downloadTexture(int level, boolean bl) {
// this.checkAllocated();
- GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, format.components);
+ GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, format.components);
// GlStateManager._getTexImage(3553, level, format.glFormat, GL11.GL_UNSIGNED_BYTE, this.pixels);
// final int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH);
@@ -65,7 +65,7 @@ public class NativeImage extends BufferedImage {
final IntBuffer buffer = MemoryUtilities.memAllocInt(pixels);
try {
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, level, format.glFormat, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buffer);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, level, format.glFormat, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buffer);
int[] data = new int[pixels];
buffer.get(data, 0, pixels);
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java
index c75cad785..f00f35cd4 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java
@@ -4,7 +4,7 @@ import com.gtnewhorizons.angelica.rendering.RenderFailures;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrShader;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.hooks.TextureUtilHooks;
import com.gtnewhorizons.angelica.rendering.tesr.DrawState;
import com.gtnewhorizons.angelica.rendering.tesr.TesrShaderPrograms;
@@ -226,14 +226,14 @@ public final class RenderLayer implements BlendingStateHolder {
try {
state.apply();
if (textureId != null) {
- GLStateManager.enableTexture();
+ GLSMTextures.enableTexture();
Minecraft.getMinecraft().getTextureManager().bindTexture(textureId);
if (unfilteredAtlas) {
filtering = true;
TextureUtilHooks.forceNearestFilter();
}
} else {
- GLStateManager.disableTexture();
+ GLSMTextures.disableTexture();
}
if (hook != null) {
hookActive = true;
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java
index 9d44d1552..9fd39c2e3 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java
@@ -3,6 +3,15 @@ package com.gtnewhorizons.angelica.compat.thaumcraft;
import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v;
import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat3Array;
import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat4Array;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.FragmentKey;
@@ -62,7 +71,7 @@ final class PortalDrawer {
for (int i = 0; i < LAYERS; i++) {
LAYER_DEPTH[i] = i == 0 ? 65.0F : 16 - i;
LAYER_SCALE[i] = i == 0 ? 0.125F : i == 1 ? 0.5F : 0.0625F;
- // GLStateManager.glRotatef's float radians
+ // GLSMMatrices.glRotatef's float radians
LAYER_ANGLE[i] = (float) Math.toRadians((float) (i * i * 4321 + i * 9) * 2.0F);
}
}
@@ -78,7 +87,7 @@ final class PortalDrawer {
static int maxPlanes() {
if (maxPlanes == 0) {
- final int vectors = GLStateManager.glGetInteger(GL20.GL_MAX_VERTEX_UNIFORM_COMPONENTS) / 4;
+ final int vectors = GLSMQueries.glGetInteger(GL20.GL_MAX_VERTEX_UNIFORM_COMPONENTS) / 4;
maxPlanes = Math.clamp((vectors - 128) / 12, 1, 64);
}
return maxPlanes;
@@ -105,7 +114,7 @@ final class PortalDrawer {
}
private static void uploadFog(Uniforms uniforms, int fogMode) {
- final FogState fog = GLStateManager.getFogState();
+ final FogState fog = GLSMFog.getFogState();
FOG_PARAMS[0] = fog.linearScale();
FOG_PARAMS[1] = fog.linearBias();
FOG_PARAMS[2] = fog.expScale();
@@ -117,9 +126,9 @@ final class PortalDrawer {
}
private static void instanced(int attribute, int size, int floatOffset) {
- GLStateManager.glEnableVertexAttribArray(attribute);
- GLStateManager.glVertexAttribPointer(attribute, size, GL11.GL_FLOAT, false, FACE_BYTES, (long) floatOffset * Float.BYTES);
- GLStateManager.glVertexAttribDivisor(attribute, 1);
+ GLSMVertexInput.glEnableVertexAttribArray(attribute);
+ GLSMVertexInput.glVertexAttribPointer(attribute, size, GL11.GL_FLOAT, false, FACE_BYTES, (long) floatOffset * Float.BYTES);
+ GLSMVertexInput.glVertexAttribDivisor(attribute, 1);
}
private static GlProgram buildProgram(boolean capturing, boolean fogged) {
@@ -137,15 +146,15 @@ final class PortalDrawer {
frag.delete();
}
- final int previous = GLStateManager.getActiveProgram();
+ final int previous = GLSMPrograms.getActiveProgram();
final int handle = program.handle();
- GLStateManager.glUseProgram(handle);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(handle, "u_Tunnel"), TUNNEL_UNIT);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(handle, "u_Lightmap"), LIGHTMAP_UNIT);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(handle, "u_Field"), FIELD_UNIT);
- GLStateManager.glUniform4f(GLStateManager.glGetUniformLocation(handle, "u_ObjectPlaneR"), 0.0F, 0.0F, 0.0F, 1.0F);
- GLStateManager.glUniform3(GLStateManager.glGetUniformLocation(handle, "u_LayerColor"), floatBuffer(layerColors()));
- GLStateManager.glUseProgram(previous);
+ GLSMPrograms.glUseProgram(handle);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(handle, "u_Tunnel"), TUNNEL_UNIT);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(handle, "u_Lightmap"), LIGHTMAP_UNIT);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(handle, "u_Field"), FIELD_UNIT);
+ GLSMPrograms.glUniform4f(GLSMPrograms.glGetUniformLocation(handle, "u_ObjectPlaneR"), 0.0F, 0.0F, 0.0F, 1.0F);
+ GLSMPrograms.glUniform3(GLSMPrograms.glGetUniformLocation(handle, "u_LayerColor"), floatBuffer(layerColors()));
+ GLSMPrograms.glUseProgram(previous);
return program;
}
@@ -191,20 +200,20 @@ final class PortalDrawer {
GlFramebuffer atlasFramebuffer() {
if (atlasFramebuffer == null) {
- atlasTexture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, ATLAS_SIZE, ATLAS_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
+ atlasTexture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, ATLAS_SIZE, ATLAS_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
atlasFramebuffer = new GlFramebuffer();
atlasFramebuffer.addColorAttachment(0, atlasTexture);
atlasFramebuffer.drawBuffers(new int[]{0});
atlasFramebuffer.readBuffer(0);
if (!atlasFramebuffer.isComplete()) {
atlasFramebuffer.destroy();
- GLStateManager.glDeleteTextures(atlasTexture);
+ GLSMTextures.glDeleteTextures(atlasTexture);
atlasFramebuffer = null;
atlasTexture = 0;
throw new IllegalStateException("Incomplete Thaumcraft portal atlas framebuffer");
@@ -222,23 +231,23 @@ final class PortalDrawer {
if (directFogged != null) directFogged.delete();
if (capture != null) capture.delete();
direct = directFogged = capture = null;
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (ebo != 0) GLStateManager.glDeleteBuffers(ebo);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (ebo != 0) GLSMBuffers.glDeleteBuffers(ebo);
vao = vbo = ebo = 0;
if (atlasFramebuffer != null) atlasFramebuffer.destroy();
- if (atlasTexture != 0) GLStateManager.glDeleteTextures(atlasTexture);
+ if (atlasTexture != 0) GLSMTextures.glDeleteTextures(atlasTexture);
atlasFramebuffer = null;
atlasTexture = 0;
}
private void draw(GlProgram program, float[] faces, int first, int count, int tunnelTexture, int fieldTexture, Frame frame, int fogMode) {
- final int previousProgram = GLStateManager.getActiveProgram();
- final int previousVao = GLStateManager.getBoundVAO();
- final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_TEXTURE_BIT));
+ final int previousProgram = GLSMPrograms.getActiveProgram();
+ final int previousVao = GLSMVertexInput.getBoundVAO();
+ final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_TEXTURE_BIT));
try {
- GLStateManager.disableBlend();
- GLStateManager.glUseProgram(program.handle());
+ GLSMBlend.disableBlend();
+ GLSMPrograms.glUseProgram(program.handle());
final Uniforms uniforms = program.getInterface();
if (uniforms.modelViewProjection != null) uniforms.modelViewProjection.set(frame.modelViewProjection);
if (uniforms.uploadedFrame != frame || uniforms.uploadedVersion != frame.version) {
@@ -263,18 +272,18 @@ final class PortalDrawer {
if (uniforms.atlasSize != null) uniforms.atlasSize.setFloat(ATLAS_SIZE);
if (fogMode != FragmentKey.FOG_NONE) uploadFog(uniforms, fogMode);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + FIELD_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, fieldTexture);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + TUNNEL_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tunnelTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + FIELD_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, fieldTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + TUNNEL_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tunnelTexture);
uploadFaces(faces, first, count);
- GLStateManager.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, count);
+ GLSMDraws.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, count);
} finally {
- GLStateManager.glBindVertexArray(previousVao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glUseProgram(previousProgram);
- GLStateManager.popStateTo(depth);
+ GLSMVertexInput.glBindVertexArray(previousVao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMPrograms.glUseProgram(previousProgram);
+ GLSMAttribStack.popStateTo(depth);
}
}
@@ -286,24 +295,24 @@ final class PortalDrawer {
upload.put(faces, first * FLOATS_PER_FACE, count * FLOATS_PER_FACE).flip();
if (vao == 0) createBuffers();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, upload, GL15.GL_STREAM_DRAW);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, upload, GL15.GL_STREAM_DRAW);
}
private void createBuffers() {
- vao = GLStateManager.glGenVertexArrays();
- vbo = GLStateManager.glGenBuffers();
- ebo = GLStateManager.glGenBuffers();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ vbo = GLSMBuffers.glGenBuffers();
+ ebo = GLSMBuffers.glGenBuffers();
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
for (int corner = 0; corner < 4; corner++) {
instanced(corner, 4, corner * 4);
}
final IntBuffer indices = BufferUtils.createIntBuffer(6);
indices.put(0).put(1).put(2).put(0).put(2).put(3).flip();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
}
static final class Frame {
@@ -367,7 +376,7 @@ final class PortalDrawer {
}
void readLightmap(int blockLight) {
- final TextureUnitArray textures = GLStateManager.getTextures();
+ final TextureUnitArray textures = GLSMTextures.getTextures();
lightmapEnabled = textures.getTextureUnitStates(LIGHTMAP_UNIT).isEnabled() && textures.getTextureUnitBindings(LIGHTMAP_UNIT).getBinding() != 0;
textures.getTextureUnitMatrix(LIGHTMAP_UNIT).transform(lightmapCoord.set(blockLight, 0.0F, 0.0F, 1.0F));
lightmapU = lightmapCoord.x / lightmapCoord.w;
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java
index 213cedd82..8a4e21c51 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java
@@ -1,7 +1,16 @@
package com.gtnewhorizons.angelica.compat.thaumcraft;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
@@ -92,7 +101,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
}
public static void addFace(int axis, boolean negative, double plane, double x0, double y0, double z0, double x1, double y1, double z1, double x3, double y3, double z3) {
- addFace(GLStateManager.getFogMode().isEnabled(), axis, negative, plane, x0, y0, z0, x1, y1, z1, x3, y3, z3);
+ addFace(GLSMFog.getFogMode().isEnabled(), axis, negative, plane, x0, y0, z0, x1, y1, z1, x3, y3, z3);
}
static void addFace(boolean fogged, int axis, boolean negative, double plane, double x0, double y0, double z0, double x1, double y1, double z1, double x3, double y3, double z3) {
@@ -153,18 +162,18 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
}
public static void endSkippedRender() {
- if (!GLStateManager.glIsEnabled(GL11.GL_FOG)) GLStateManager.glEnable(GL11.GL_FOG);
+ if (!GLSMEnable.glIsEnabled(GL11.GL_FOG)) GLSMEnable.glEnable(GL11.GL_FOG);
}
private static void prepareBatch(boolean fogged) {
if ((faceCount > 0 || farCount > 0) && fogged != batchFogged) flushFaces();
batchFogged = fogged;
- final int modelViewGeneration = GLStateManager.getMvGeneration();
- final int projectionGeneration = GLStateManager.getProjGeneration();
+ final int modelViewGeneration = GLSMMatrices.getMvGeneration();
+ final int projectionGeneration = GLSMMatrices.getProjGeneration();
final boolean empty = faceCount == 0 && farCount == 0;
if (empty || modelViewGeneration != batchModelViewGeneration || projectionGeneration != batchProjectionGeneration) {
final int mode = currentMode();
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), modelViewProjection);
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), modelViewProjection);
if (!empty && (mode != batchMode || !modelViewProjection.equals(frame.modelViewProjection))) flushFaces();
if (faceCount == 0 && farCount == 0) startBatch(mode);
batchModelViewGeneration = modelViewGeneration;
@@ -186,14 +195,14 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
private static void restoreSkippedPlaneState() {
if (!skippedPlaneState) return;
skippedPlaneState = false;
- if (GLStateManager.glIsEnabled(GL11.GL_BLEND)) GLStateManager.disableBlend();
- if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_S)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S);
- if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_T)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T);
- if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_R)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R);
- if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_Q)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q);
- if (!GLStateManager.glIsEnabled(GL11.GL_LIGHTING)) GLStateManager.enableLighting();
- if (GLStateManager.getTextures().getTextureUnitBindings(GLStateManager.getActiveTextureUnit()).getBinding() != lastPlaneTexture) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lastPlaneTexture);
+ if (GLSMEnable.glIsEnabled(GL11.GL_BLEND)) GLSMBlend.disableBlend();
+ if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_S)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S);
+ if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_T)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T);
+ if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_R)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R);
+ if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_Q)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q);
+ if (!GLSMEnable.glIsEnabled(GL11.GL_LIGHTING)) GLSMLighting.enableLighting();
+ if (GLSMTextures.getTextures().getTextureUnitBindings(GLSMTextures.getActiveTextureUnit()).getBinding() != lastPlaneTexture) {
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lastPlaneTexture);
}
}
@@ -248,7 +257,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
farTexture = textureId(FAR_FIELD);
frame.modelViewProjection.set(modelViewProjection);
if (mode == MODE_SHADOW) return;
- frame.modelView.set(GLStateManager.getModelViewMatrix());
+ frame.modelView.set(GLSMMatrices.getModelViewMatrix());
frame.cameraX = (float) TileEntityRendererDispatcher.staticPlayerX;
frame.cameraY = (float) TileEntityRendererDispatcher.staticPlayerY;
frame.cameraZ = (float) TileEntityRendererDispatcher.staticPlayerZ;
@@ -266,7 +275,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
drawer.drawDirect(faces, faceCount, tunnel, field, frame, batchFogged);
return;
}
- final ViewportState viewport = GLStateManager.getViewportState();
+ final ViewportState viewport = GLSMRasterizer.getViewportState();
int first = 0, x = 0, y = 0, rowHeight = 0;
for (int face = 0; face < faceCount; face++) {
final int size = slotSize(face, viewport.width, viewport.height);
@@ -313,40 +322,40 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
private static void capture(DeferredWorldRenderingPipeline pipeline, int first, int count, int tunnel, int field) {
BatchStateGuard.beforeChange();
- final int drawFramebuffer = GLStateManager.getDrawFramebuffer();
- final int readFramebuffer = GLStateManager.getReadFramebuffer();
+ final int drawFramebuffer = GLSMFramebuffer.getDrawFramebuffer();
+ final int readFramebuffer = GLSMFramebuffer.getReadFramebuffer();
pipeline.setIsMainBound(false);
- final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_VIEWPORT_BIT | GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT));
+ final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_VIEWPORT_BIT | GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT));
try {
drawer.atlasFramebuffer().bind();
- GLStateManager.glViewport(0, 0, PortalDrawer.ATLAS_SIZE, PortalDrawer.ATLAS_SIZE);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMRasterizer.glViewport(0, 0, PortalDrawer.ATLAS_SIZE, PortalDrawer.ATLAS_SIZE);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMBlend.glColorMask(true, true, true, true);
drawer.drawCapture(faces, first, count, tunnel, field, frame);
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFramebuffer);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFramebuffer);
- GLStateManager.popStateTo(depth);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFramebuffer);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFramebuffer);
+ GLSMAttribStack.popStateTo(depth);
pipeline.setIsMainBound(true);
pipeline.rebindCurrentPass();
}
}
private static void drawQuads(int texture, int first, int count, boolean fromAtlas) {
- final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT));
- savedTextureMatrix.set(GLStateManager.getTextures().getTextureUnitMatrix(0));
+ final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT));
+ savedTextureMatrix.set(GLSMTextures.getTextures().getTextureUnitMatrix(0));
CapturedRenderingState.INSTANCE.pushCurrentBlockEntity();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
- GLStateManager.disableLighting();
- GLStateManager.disableBlend();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
+ GLSMLighting.disableLighting();
+ GLSMBlend.disableBlend();
if (!batchFogged) disableFogUntilPop();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.setTextureMatrix(0, IDENTITY);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMMatrices.setTextureMatrix(0, IDENTITY);
final Tessellator tess = Tessellator.instance;
final float texel = 1.0F / PortalDrawer.ATLAS_SIZE;
int runStart = first;
@@ -372,21 +381,21 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
if (fromAtlas) BatchStateGuard.beforeChange();
} finally {
CapturedRenderingState.INSTANCE.popCurrentBlockEntity();
- GLStateManager.setTextureMatrix(0, savedTextureMatrix);
+ GLSMMatrices.setTextureMatrix(0, savedTextureMatrix);
popStateTo(depth);
}
}
private static void drawFarFaces() {
- final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT));
+ final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT));
CapturedRenderingState.INSTANCE.pushCurrentBlockEntity();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
- GLStateManager.disableLighting();
- GLStateManager.disableBlend();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
+ GLSMLighting.disableLighting();
+ GLSMBlend.disableBlend();
disableFogUntilPop();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, farTexture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, farTexture);
final Tessellator tess = Tessellator.instance;
final float[] f = farFaces;
int runStart = 0;
@@ -416,7 +425,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
private static void disableFogUntilPop() {
BatchStateGuard.suspend();
try {
- GLStateManager.glDisable(GL11.GL_FOG);
+ GLSMEnable.glDisable(GL11.GL_FOG);
} finally {
BatchStateGuard.resume();
}
@@ -425,7 +434,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending {
private static void popStateTo(int depth) {
BatchStateGuard.suspend();
try {
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
} finally {
BatchStateGuard.resume();
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java
index b1d074813..f62b492c1 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java
@@ -4,7 +4,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrMeshBuilder;
import com.gtnewhorizons.angelica.api.tesr.TesrMeshSink;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.rendering.tesr.AngelicaTesrMeshCache;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import net.minecraft.client.renderer.RenderBlocks;
@@ -91,7 +92,7 @@ public final class Tc4JarMeshes {
}
private static void applyBrightness(int bright) {
- GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, bright % 65536, (float) (bright / 65536));
+ GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, bright % 65536, (float) (bright / 65536));
}
private Tc4JarMeshes() {}
@@ -123,13 +124,13 @@ public final class Tc4JarMeshes {
holder = new Holder(color);
HOLDERS.put(liquidKey, holder);
}
- GLStateManager.glPushMatrix();
- GLStateManager.glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
BUILDER.material = holder.material;
BUILDER.level64 = level64;
BUILDER.icon = icon;
AngelicaTesrMeshCache.INSTANCE.renderCached(holder.cacheKey, BUILDER);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
return true;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java
index 4cb9f120b..7f85c89a2 100644
--- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java
+++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java
@@ -1,6 +1,14 @@
package com.gtnewhorizons.angelica.compat.thaumcraft;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.states.AlphaState;
@@ -25,55 +33,55 @@ public final class ThaumometerScreen {
public static Capture begin() {
if (DisplayListManager.isRecording()) return null;
final Capture capture = new Capture();
- GLStateManager.glNewList(capture.list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(capture.list, GL11.GL_COMPILE);
return capture;
}
public static void finish(Capture capture) {
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
pending.add(capture);
}
public static void abort(Capture capture) {
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
- GLStateManager.glDeleteLists(capture.list, 1);
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
+ GLSMDraws.glDeleteLists(capture.list, 1);
}
public static void discard() {
- for (Capture capture : pending) GLStateManager.glDeleteLists(capture.list, 1);
+ for (Capture capture : pending) GLSMDraws.glDeleteLists(capture.list, 1);
pending.clear();
}
public static void render(WorldRenderingPipeline pipeline) {
if (pending.isEmpty()) return;
final WorldRenderingPhase phase = pipeline.getPhase();
- final Matrix4f texture = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(0));
- final Matrix4f lightmap = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(1));
+ final Matrix4f texture = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(0));
+ final Matrix4f lightmap = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(1));
final float brightnessX = GLStateManager.ctx().lastBrightnessX;
final float brightnessY = GLStateManager.ctx().lastBrightnessY;
final Boolean translucency = GbufferPrograms.beginTranslucencyDeclaration(true);
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
ItemIdManager.pushItemId();
try {
pipeline.setPhase(WorldRenderingPhase.HAND_TRANSLUCENT);
GbufferPrograms.setBlockEntityDefaults();
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthMask(false);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthMask(false);
for (Capture capture : pending) capture.replay();
} finally {
ItemIdManager.popItemId();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
- GLStateManager.setTextureMatrix(0, texture);
- GLStateManager.setTextureMatrix(1, lightmap);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glPopAttrib();
- GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.setTextureMatrix(0, texture);
+ GLSMMatrices.setTextureMatrix(1, lightmap);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMAttribStack.glPopAttrib();
+ GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY);
GbufferPrograms.endTranslucencyDeclaration(translucency);
pipeline.setPhase(phase);
discard();
@@ -81,41 +89,41 @@ public final class ThaumometerScreen {
}
public static final class Capture {
- private final int list = GLStateManager.glGenLists(1);
- private final Matrix4f modelView = new Matrix4f(GLStateManager.getModelViewMatrix());
- private final Matrix4f projection = new Matrix4f(GLStateManager.getProjectionMatrix());
- private final Matrix4f texture = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(0));
- private final Matrix4f lightmapMatrix = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(1));
+ private final int list = GLSMDraws.glGenLists(1);
+ private final Matrix4f modelView = new Matrix4f(GLSMMatrices.getModelViewMatrix());
+ private final Matrix4f projection = new Matrix4f(GLSMMatrices.getProjectionMatrix());
+ private final Matrix4f texture = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(0));
+ private final Matrix4f lightmapMatrix = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(1));
private final float brightnessX = GLStateManager.ctx().lastBrightnessX;
private final float brightnessY = GLStateManager.ctx().lastBrightnessY;
private final Vector3f normal = new Vector3f(ShaderManager.getCurrentNormal());
- private final AlphaState alphaState = GLStateManager.getAlphaState().readEffective(new AlphaState());
- private final int depthFunction = GLStateManager.getDepthState().getFunc();
+ private final AlphaState alphaState = GLSMDepthStencilAlpha.getAlphaState().readEffective(new AlphaState());
+ private final int depthFunction = GLSMDepthStencilAlpha.getDepthState().getFunc();
private final int itemId = ItemIdManager.getItemId();
- private final boolean cull = GLStateManager.getCullState().isEnabled();
- private final boolean alpha = GLStateManager.getAlphaTest().isEffectivelyEnabled();
- private final boolean lightmap = GLStateManager.getTextures().getTextureUnitStates(1).isEnabled();
- private final boolean lighting = GLStateManager.getLightingState().isEnabled();
+ private final boolean cull = GLSMRasterizer.getCullState().isEnabled();
+ private final boolean alpha = GLSMDepthStencilAlpha.getAlphaTest().isEffectivelyEnabled();
+ private final boolean lightmap = GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled();
+ private final boolean lighting = GLSMLighting.getLightingState().isEnabled();
private void replay() {
- GLStateManager.setProjectionMatrix(projection);
- GLStateManager.setModelViewMatrix(modelView);
- GLStateManager.setTextureMatrix(0, texture);
- GLStateManager.setTextureMatrix(1, lightmapMatrix);
- GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glNormal3f(normal.x, normal.y, normal.z);
- GLStateManager.glDepthFunc(depthFunction);
- GLStateManager.glAlphaFunc(alphaState.getFunction(), alphaState.getReference());
+ GLSMMatrices.setProjectionMatrix(projection);
+ GLSMMatrices.setModelViewMatrix(modelView);
+ GLSMMatrices.setTextureMatrix(0, texture);
+ GLSMMatrices.setTextureMatrix(1, lightmapMatrix);
+ GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMCurrentAttribs.glNormal3f(normal.x, normal.y, normal.z);
+ GLSMDepthStencilAlpha.glDepthFunc(depthFunction);
+ GLSMDepthStencilAlpha.glAlphaFunc(alphaState.getFunction(), alphaState.getReference());
ItemIdManager.setItemIdRaw(itemId);
- if (cull) GLStateManager.enableCull(); else GLStateManager.disableCull();
- if (alpha) GLStateManager.enableAlphaTest(); else GLStateManager.disableAlphaTest();
- if (lighting) GLStateManager.enableLighting(); else GLStateManager.disableLighting();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- if (lightmap) GLStateManager.enableTexture(); else GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
- GLStateManager.glCallList(list);
+ if (cull) GLSMRasterizer.enableCull(); else GLSMRasterizer.disableCull();
+ if (alpha) GLSMDepthStencilAlpha.enableAlphaTest(); else GLSMDepthStencilAlpha.disableAlphaTest();
+ if (lighting) GLSMLighting.enableLighting(); else GLSMLighting.disableLighting();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ if (lightmap) GLSMTextures.enableTexture(); else GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
+ GLSMDraws.glCallList(list);
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java b/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java
index 59306bacf..990ad828d 100644
--- a/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java
+++ b/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java
@@ -20,6 +20,11 @@ public class CompatConfig {
@Config.RequiresMcRestart
public static boolean fixStacksOnStacks;
+ @Config.Comment("Redirect KaizPatchX script GL calls through Angelica's GLRedirects API")
+ @Config.DefaultBoolean(true)
+ @Config.RequiresMcRestart
+ public static boolean fixKaizPatchX;
+
@Config.Comment("Apply fixes to Minefactory Reloaded")
@Config.DefaultBoolean(true)
@Config.RequiresMcRestart
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java b/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java
index b20dcd70d..ff7e0b5a5 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java
@@ -31,7 +31,7 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry;
import com.gtnewhorizons.angelica.debug.render.DebugProgram;
import com.gtnewhorizons.angelica.debug.render.DebugPrograms;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
import com.gtnewhorizons.angelica.rendering.celeritas.AngelicaRenderSectionManager;
import com.gtnewhorizons.angelica.rendering.celeritas.CeleritasWorldRenderer;
@@ -110,7 +110,7 @@ public class ChunkDebugMinimap {
}
}
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), mvp).scale(2, 2, 1).translate(32, 32, 0);
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), mvp).scale(2, 2, 1).translate(32, 32, 0);
scope.beginHud();
try {
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java b/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java
index 597637e25..9a3b6f9c4 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java
@@ -9,7 +9,11 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry;
import com.gtnewhorizons.angelica.debug.render.DebugPrograms;
import com.gtnewhorizons.angelica.debug.render.DebugProgram;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.states.ViewportState;
import com.gtnewhorizons.angelica.glsm.streaming.LineQuads;
import net.minecraft.client.Minecraft;
@@ -40,25 +44,25 @@ public class F3Direction {
final int width = event.resolution.getScaledWidth();
final int height = event.resolution.getScaledHeight();
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
- GLStateManager.glTranslatef((float) (width / 2), (float) (height / 2), -90);
+ GLSMMatrices.glTranslatef((float) (width / 2), (float) (height / 2), -90);
final Entity entity = mc.renderViewEntity;
- GLStateManager.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * event.partialTicks, -1.0F, 0.0F, 0.0F);
- GLStateManager.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * event.partialTicks, 0.0F, 1.0F, 0.0F);
+ GLSMMatrices.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * event.partialTicks, -1.0F, 0.0F, 0.0F);
+ GLSMMatrices.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * event.partialTicks, 0.0F, 1.0F, 0.0F);
- GLStateManager.glScalef(-1.0F, -1.0F, -1.0F);
+ GLSMMatrices.glScalef(-1.0F, -1.0F, -1.0F);
renderWorldDirections();
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
}
public static void renderWorldDirections() {
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), MVP);
- final ViewportState viewport = GLStateManager.getViewportState();
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), MVP);
+ final ViewportState viewport = GLSMRasterizer.getViewportState();
SCOPE.beginHud();
try {
@@ -68,8 +72,8 @@ public class F3Direction {
lines.mvp(MVP);
lines.lineWidth(LINE_WIDTH);
lines.viewport(viewport.width, viewport.height);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, QUAD_VERTICES);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, QUAD_VERTICES);
} finally {
SCOPE.end();
}
@@ -88,11 +92,11 @@ public class F3Direction {
putAxis(p, 0.0F, AXIS_LENGTH, 0.0F, 0xFF00FF00);
LineQuads.expandWithOtherEnd(source.address(), FORMAT, GL11.GL_LINES, LINE_VERTICES, expanded.address());
- final int vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, expanded.window(quadBytes), GL15.GL_STATIC_DRAW);
+ final int vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, expanded.window(quadBytes), GL15.GL_STATIC_DRAW);
vao = DebugGeometry.createVao(vbo, QUAD_FORMAT);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
} finally {
source.free();
expanded.free();
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java b/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java
index 03b1c61a2..96a616be6 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java
@@ -10,7 +10,11 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry;
import com.gtnewhorizons.angelica.debug.render.DebugPrograms;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
import com.gtnewhorizons.angelica.debug.screen.DebugNumbers;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
@@ -129,21 +133,21 @@ public abstract class F3Graph {
private void init() {
final int handle = DebugPrograms.link("angelica:debug_graph", "angelica:debug_graph.vert.glsl", "angelica:debug_graph.frag.glsl", ShaderConstants.EMPTY, new String[]{"pos"}, new int[]{0});
program = handle;
- GLStateManager.glUseProgram(handle);
+ GLSMPrograms.glUseProgram(handle);
- uFBWidth = GLStateManager.glGetUniformLocation(handle, "fbWidth");
- uFBHeight = GLStateManager.glGetUniformLocation(handle, "fbHeight");
- uScaleFactor = GLStateManager.glGetUniformLocation(handle, "scaleFactor");
- uSamples = GLStateManager.glGetUniformLocation(handle, "samples");
- uHeadIdx = GLStateManager.glGetUniformLocation(handle, "headIdx");
- final int uPxPerNs = GLStateManager.glGetUniformLocation(handle, "pxPerNs");
- final int uLeft = GLStateManager.glGetUniformLocation(handle, "left");
+ uFBWidth = GLSMPrograms.glGetUniformLocation(handle, "fbWidth");
+ uFBHeight = GLSMPrograms.glGetUniformLocation(handle, "fbHeight");
+ uScaleFactor = GLSMPrograms.glGetUniformLocation(handle, "scaleFactor");
+ uSamples = GLSMPrograms.glGetUniformLocation(handle, "samples");
+ uHeadIdx = GLSMPrograms.glGetUniformLocation(handle, "headIdx");
+ final int uPxPerNs = GLSMPrograms.glGetUniformLocation(handle, "pxPerNs");
+ final int uLeft = GLSMPrograms.glGetUniformLocation(handle, "left");
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
- vertBuf = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL_ARRAY_BUFFER, vertBuf);
+ vertBuf = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL_ARRAY_BUFFER, vertBuf);
try (final MemoryStack stack = stackPush()) {
final FloatBuffer vertices = stack.mallocFloat(VERT_COUNT * VERT_FLOATS);
// Since we use a triangle strip, we only need 4 vertices. The quad extends to the top of the screen so spikes
@@ -156,18 +160,18 @@ public abstract class F3Graph {
});
vertices.rewind();
- GLStateManager.glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
}
// Configure vertex attribute in the VAO
- GLStateManager.glVertexAttribPointer(0, VERT_FLOATS, GL_FLOAT, false, VERT_FLOATS * 4, 0);
- GLStateManager.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, VERT_FLOATS, GL_FLOAT, false, VERT_FLOATS * 4, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
- GLStateManager.glBindBuffer(GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
- GLStateManager.glUniform1f(uPxPerNs, pxPerNs);
- GLStateManager.glUniform1i(uLeft, left ? 1 : 0);
+ GLSMPrograms.glUniform1f(uPxPerNs, pxPerNs);
+ GLSMPrograms.glUniform1i(uLeft, left ? 1 : 0);
}
public void render(ScaledResolution sr, int tick) {
@@ -185,7 +189,7 @@ public abstract class F3Graph {
final Minecraft mc = Minecraft.getMinecraft();
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), mvp);
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), mvp);
scope.beginHud();
try {
@@ -236,14 +240,14 @@ public abstract class F3Graph {
color.mvp(mvp);
TessellatorStreamingDrawer.drawPacked(scratch.window(4 * COLOR_STRIDE), GL11.GL_QUADS, COLOR_FLAGS, 4);
- GLStateManager.glUseProgram(program);
- GLStateManager.glUniform1f(uFBWidth, mc.displayWidth);
- GLStateManager.glUniform1f(uFBHeight, mc.displayHeight);
- GLStateManager.glUniform1f(uScaleFactor, sr.getScaleFactor());
- GLStateManager.glUniform1i(uHeadIdx, samplesHead);
- GLStateManager.glUniform1(uSamples, sampleBuf);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glDrawArrays(GL_TRIANGLE_STRIP, 0, VERT_COUNT);
+ GLSMPrograms.glUseProgram(program);
+ GLSMPrograms.glUniform1f(uFBWidth, mc.displayWidth);
+ GLSMPrograms.glUniform1f(uFBHeight, mc.displayHeight);
+ GLSMPrograms.glUniform1f(uScaleFactor, sr.getScaleFactor());
+ GLSMPrograms.glUniform1i(uHeadIdx, samplesHead);
+ GLSMPrograms.glUniform1(uSamples, sampleBuf);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMDraws.glDrawArrays(GL_TRIANGLE_STRIP, 0, VERT_COUNT);
mc.getTextureManager().bindTexture(texture);
p = scratch.address();
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java
index 14fb8a86f..2b81075ce 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java
@@ -1,6 +1,13 @@
package com.gtnewhorizons.angelica.debug.render;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.StateSet;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
@@ -17,42 +24,42 @@ public final class DebugDrawScope {
public void beginHud() {
capture();
- GLStateManager.disableDepthTest();
+ GLSMDepthStencilAlpha.disableDepthTest();
common();
}
public void beginWorld() {
capture();
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glFrontFace(GL11.GL_CCW);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
common();
}
private void capture() {
- depth = GLStateManager.pushState(SET);
- program = GLStateManager.getActiveProgram();
- vao = GLStateManager.getBoundVAO();
- vbo = GLStateManager.getBoundVBO();
+ depth = GLSMAttribStack.pushState(SET);
+ program = GLSMPrograms.getActiveProgram();
+ vao = GLSMVertexInput.getBoundVAO();
+ vbo = GLSMBuffers.getBoundVBO();
}
public void end() {
- GLStateManager.glUseProgram(program);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.popStateTo(depth);
+ GLSMPrograms.glUseProgram(program);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMAttribStack.popStateTo(depth);
}
private static void common() {
- GLStateManager.glDepthMask(false);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.disableCull();
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
- GLStateManager.disableScissorTest();
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glLineWidth(1.0F);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
+ GLSMRasterizer.disableScissorTest();
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMRasterizer.glLineWidth(1.0F);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java
index f32fc5fe1..dc28d5c83 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java
@@ -2,7 +2,8 @@ package com.gtnewhorizons.angelica.debug.render;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.opengl.GL15;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memPutByte;
@@ -13,9 +14,9 @@ public final class DebugGeometry {
private DebugGeometry() {}
public static int createVao(int vbo, VertexFormat format) {
- final int vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ final int vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
format.setupBufferState(0L);
return vao;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java
index 31fa9c6a9..af23bc75a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.debug.render;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.joml.Matrix4fc;
import org.lwjgl.BufferUtils;
@@ -16,25 +16,25 @@ public final class DebugProgram {
DebugProgram(int handle) {
this.handle = handle;
- this.mvpLocation = GLStateManager.glGetUniformLocation(handle, "u_MVP");
- this.lineWidthLocation = GLStateManager.glGetUniformLocation(handle, "u_LineWidth");
- this.viewportLocation = GLStateManager.glGetUniformLocation(handle, "u_ViewportSize");
+ this.mvpLocation = GLSMPrograms.glGetUniformLocation(handle, "u_MVP");
+ this.lineWidthLocation = GLSMPrograms.glGetUniformLocation(handle, "u_LineWidth");
+ this.viewportLocation = GLSMPrograms.glGetUniformLocation(handle, "u_ViewportSize");
}
public void use() {
- GLStateManager.glUseProgram(handle);
+ GLSMPrograms.glUseProgram(handle);
}
public void mvp(Matrix4fc mvp) {
mvp.get(matrix);
- GLStateManager.glUniformMatrix4(mvpLocation, false, matrix);
+ GLSMPrograms.glUniformMatrix4(mvpLocation, false, matrix);
}
public void lineWidth(float pixels) {
- GLStateManager.glUniform1f(lineWidthLocation, pixels);
+ GLSMPrograms.glUniform1f(lineWidthLocation, pixels);
}
public void viewport(int width, int height) {
- GLStateManager.glUniform2f(viewportLocation, width, height);
+ GLSMPrograms.glUniform2f(viewportLocation, width, height);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java
index f0bb318e9..f78486b87 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java
@@ -5,7 +5,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugEntryCategory;
import com.gtnewhorizons.angelica.api.debug.DebugScreenEntryStatus;
import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
@@ -724,7 +724,7 @@ public class DebugOptionsScreen extends GuiScreen {
private void beginLayer() {
if (painter == null) return;
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
batcher.beginBatch();
painter.beginRects();
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java
index 39d333d1a..f928cd80d 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java
@@ -6,7 +6,8 @@ import com.gtnewhorizons.angelica.client.font.GlyphSettings;
import com.gtnewhorizons.angelica.client.font.TextMesh;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.debug.F3Graph;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt;
@@ -312,12 +313,12 @@ public final class DebugScreenOverlay {
if (placedCount == 0) return;
if (Tracy.ENABLED) Tracy.beginZone(Z_DRAW);
if (scaled) {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
final float factor = scale / (float) gameScale;
- GLStateManager.glScalef(factor, factor, 1.0f);
+ GLSMMatrices.glScalef(factor, factor, 1.0f);
}
try {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
text.batcher.beginBatch();
try {
drawChrome();
@@ -326,7 +327,7 @@ public final class DebugScreenOverlay {
text.batcher.endBatch();
}
} finally {
- if (scaled) GLStateManager.glPopMatrix();
+ if (scaled) GLSMMatrices.glPopMatrix();
if (Tracy.ENABLED) Tracy.endZone();
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java
index e79af7c44..826010cda 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.debug.screen;
import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer;
import com.gtnewhorizons.angelica.client.font.FormatCodes;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import net.minecraft.client.gui.FontRenderer;
public abstract class DebugText {
@@ -156,8 +156,8 @@ public abstract class DebugText {
}
public void beginRects() {
- depthWasEnabled = GLStateManager.getDepthTest().isEnabled();
- GLStateManager.disableDepthTest();
+ depthWasEnabled = GLSMDepthStencilAlpha.getDepthTest().isEnabled();
+ GLSMDepthStencilAlpha.disableDepthTest();
}
@Override
@@ -166,7 +166,7 @@ public abstract class DebugText {
}
public void endRects() {
- if (depthWasEnabled) GLStateManager.enableDepthTest();
+ if (depthWasEnabled) GLSMDepthStencilAlpha.enableDepthTest();
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java
index 7ae708e0b..5c624f626 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java
@@ -6,7 +6,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugScreenDisplayer;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.debug.screen.DebugGroup;
import com.gtnewhorizons.angelica.dynamiclights.DynamicLights;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
import com.gtnewhorizons.angelica.glsm.states.FogState;
import com.gtnewhorizons.angelica.proxy.ClientProxy;
import org.joml.Vector3d;
@@ -36,10 +36,10 @@ public final class AngelicaEntries {
}
public static void writeFog(DebugFact fact) {
- final FogState fog = GLStateManager.getFogState();
+ final FogState fog = GLSMFog.getFogState();
final Vector3d color = fog.getFogColor();
fact
- .value(GLStateManager.getFogMode().isEnabled() ? "ON" : "OFF")
+ .value(GLSMFog.getFogMode().isEnabled() ? "ON" : "OFF")
.text(' ')
.value(fogModeName(fog.getFogMode()))
.text(' ')
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java
index 0c74edf99..477bfd281 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java
@@ -4,7 +4,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugContext;
import com.gtnewhorizons.angelica.api.debug.DebugScreenDisplayer;
import com.gtnewhorizons.angelica.api.debug.DebugScreenEntry;
import com.gtnewhorizons.angelica.debug.screen.DebugGroup;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;
@@ -33,8 +33,8 @@ public final class SystemSpecsEntry implements DebugScreenEntry {
resolved = true;
java = System.getProperty("java.version", UNKNOWN) + " (" + System.getProperty("java.vendor", UNKNOWN) + ")";
cores = Runtime.getRuntime().availableProcessors();
- gpu = orUnknown(GLStateManager.glGetString(GL11.GL_RENDERER));
- openGl = orUnknown(GLStateManager.glGetString(GL11.GL_VERSION));
+ gpu = orUnknown(GLSMQueries.glGetString(GL11.GL_RENDERER));
+ openGl = orUnknown(GLSMQueries.glGetString(GL11.GL_VERSION));
}
private static String orUnknown(String value) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java
index dd66690b8..8a668ff4c 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java
@@ -12,7 +12,13 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry;
import com.gtnewhorizons.angelica.debug.render.DebugProgram;
import com.gtnewhorizons.angelica.debug.render.DebugPrograms;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.states.Color4;
import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
@@ -245,26 +251,26 @@ final class DebugLabelBatch {
private void drawFallback(int value, int argb, float eyeX, float eyeY, float eyeZ) {
final String text = NUMBERS[value];
labelMatrix.translation(eyeX, eyeY, eyeZ).scale(SCALE, -SCALE, SCALE);
- GLStateManager.setModelViewMatrix(labelMatrix);
+ GLSMMatrices.setModelViewMatrix(labelMatrix);
font.drawString(text, -Math.round(stringWidth(value, glyphAdvance) * 0.5F), 0, argb);
}
private void pinFallback() {
- fallbackModelView.set(GLStateManager.getModelViewMatrix());
- final Color4 color = GLStateManager.getColor();
+ fallbackModelView.set(GLSMMatrices.getModelViewMatrix());
+ final Color4 color = GLSMCurrentAttribs.getColor();
fallbackColor[0] = color.getRed();
fallbackColor[1] = color.getGreen();
fallbackColor[2] = color.getBlue();
fallbackColor[3] = color.getAlpha();
- GLStateManager.glUseProgram(0);
- GLStateManager.disableLighting();
- GLStateManager.disableFog();
- GLStateManager.disableAlphaTest();
- GLStateManager.glActiveTexture(OpenGlHelper.lightmapTexUnit);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(OpenGlHelper.defaultTexUnit);
- GLStateManager.enableTexture();
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMPrograms.glUseProgram(0);
+ GLSMLighting.disableLighting();
+ GLSMFog.disableFog();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMTextures.glActiveTexture(OpenGlHelper.lightmapTexUnit);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(OpenGlHelper.defaultTexUnit);
+ GLSMTextures.enableTexture();
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
}
void end() {
@@ -286,8 +292,8 @@ final class DebugLabelBatch {
}
} finally {
if (batcher == null && font != null) {
- GLStateManager.setModelViewMatrix(fallbackModelView);
- GLStateManager.glColor4f(fallbackColor[0], fallbackColor[1], fallbackColor[2], fallbackColor[3]);
+ GLSMMatrices.setModelViewMatrix(fallbackModelView);
+ GLSMCurrentAttribs.glColor4f(fallbackColor[0], fallbackColor[1], fallbackColor[2], fallbackColor[3]);
}
for (int i = 0; i < bucketCount; i++) bucketBytes[i] = 0;
batcher = null;
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java
index e952a5c28..36901a776 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java
@@ -5,7 +5,10 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry;
import com.gtnewhorizons.angelica.debug.render.DebugProgram;
import com.gtnewhorizons.angelica.debug.render.DebugPrograms;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.states.ViewportState;
import com.gtnewhorizons.angelica.glsm.streaming.LineQuads;
import org.joml.Matrix4f;
@@ -63,10 +66,10 @@ final class DebugMesh {
if (plainBytes > 0) {
if (plainVao == 0) {
- plainVbo = GLStateManager.glGenBuffers();
+ plainVbo = GLSMBuffers.glGenBuffers();
plainVao = DebugGeometry.createVao(plainVbo, DebugMeshData.PLAIN);
} else {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, plainVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, plainVbo);
}
scratch.ensure(plainBytes);
long destination = scratch.address();
@@ -80,7 +83,7 @@ final class DebugMesh {
data.copySection(DebugMeshData.lineSection(b), destination);
destination += data.lineBytes(b);
}
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(plainBytes), GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(plainBytes), GL15.GL_DYNAMIC_DRAW);
}
if (wideVertices > 0) {
@@ -91,12 +94,12 @@ final class DebugMesh {
LineQuads.expandWithOtherEnd(data.lineAddress(b), DebugMeshData.PLAIN, GL11.GL_LINES, data.lineVertexCount(b), scratch.address() + (long) lineFirst[b] * WIDE_STRIDE);
}
if (wideVao == 0) {
- wideVbo = GLStateManager.glGenBuffers();
+ wideVbo = GLSMBuffers.glGenBuffers();
wideVao = DebugGeometry.createVao(wideVbo, WIDE);
} else {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, wideVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, wideVbo);
}
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(wideBytes), GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(wideBytes), GL15.GL_DYNAMIC_DRAW);
}
}
@@ -109,7 +112,7 @@ final class DebugMesh {
static DebugProgram useLines() {
final DebugProgram lines = DebugPrograms.lines();
lines.use();
- final ViewportState viewport = GLStateManager.getViewportState();
+ final ViewportState viewport = GLSMRasterizer.getViewportState();
lines.viewport(viewport.width, viewport.height);
return lines;
}
@@ -131,33 +134,33 @@ final class DebugMesh {
void drawPlain(boolean onTop, DebugProgram color) {
if (!has(false, onTop)) return;
color.mvp(mvp);
- GLStateManager.glBindVertexArray(plainVao);
+ GLSMVertexInput.glBindVertexArray(plainVao);
if (!onTop && fillCount > 0) {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
try {
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, fillCount);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, fillCount);
} finally {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
}
}
final int from = onTop ? DebugMeshData.WIDTH_COUNT : 0;
final int to = from + DebugMeshData.WIDTH_COUNT;
for (int b = from; b < to; b++) {
if (lineWide[b] || lineCount[b] == 0) continue;
- GLStateManager.glDrawArrays(GL11.GL_LINES, lineFirst[b], lineCount[b]);
+ GLSMDraws.glDrawArrays(GL11.GL_LINES, lineFirst[b], lineCount[b]);
}
}
void drawWide(boolean onTop, DebugProgram lines) {
if (!has(true, onTop)) return;
lines.mvp(mvp);
- GLStateManager.glBindVertexArray(wideVao);
+ GLSMVertexInput.glBindVertexArray(wideVao);
final int from = onTop ? DebugMeshData.WIDTH_COUNT : 0;
final int to = from + DebugMeshData.WIDTH_COUNT;
for (int b = from; b < to; b++) {
if (!lineWide[b] || lineCount[b] == 0) continue;
lines.lineWidth(WIDTHS[b % DebugMeshData.WIDTH_COUNT].pixels);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, lineFirst[b], lineCount[b]);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, lineFirst[b], lineCount[b]);
}
}
@@ -166,10 +169,10 @@ final class DebugMesh {
}
void delete() {
- if (plainVbo != 0) GLStateManager.glDeleteBuffers(plainVbo);
- if (plainVao != 0) GLStateManager.glDeleteVertexArrays(plainVao);
- if (wideVbo != 0) GLStateManager.glDeleteBuffers(wideVbo);
- if (wideVao != 0) GLStateManager.glDeleteVertexArrays(wideVao);
+ if (plainVbo != 0) GLSMBuffers.glDeleteBuffers(plainVbo);
+ if (plainVao != 0) GLSMVertexInput.glDeleteVertexArrays(plainVao);
+ if (wideVbo != 0) GLSMBuffers.glDeleteBuffers(wideVbo);
+ if (wideVao != 0) GLSMVertexInput.glDeleteVertexArrays(wideVao);
plainVbo = 0;
plainVao = 0;
wideVbo = 0;
diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java
index fb1ffd264..5f8a2c8e7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java
+++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java
@@ -5,6 +5,10 @@ import com.gtnewhorizons.angelica.debug.render.DebugProgram;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
import com.gtnewhorizons.angelica.debug.screen.DebugRegistry;
import com.gtnewhorizons.angelica.glsm.GLContextState;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
@@ -126,8 +130,8 @@ public final class DebugWorldRenderHandler {
} catch (RuntimeException | LinkageError e) {
slots.fail(slot, e);
} finally {
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
}
}
@@ -143,8 +147,8 @@ public final class DebugWorldRenderHandler {
final int n = slots.count;
if (nextDrawable(0) == n) return;
- base.set(GLStateManager.getModelViewMatrix());
- projBase.set(GLStateManager.getProjectionMatrix()).mul(base);
+ base.set(GLSMMatrices.getModelViewMatrix());
+ projBase.set(GLSMMatrices.getProjectionMatrix()).mul(base);
scope.beginWorld();
try {
for (int i = nextDrawable(0); i < n; i = nextDrawable(i + 1)) {
@@ -166,7 +170,7 @@ public final class DebugWorldRenderHandler {
}
}
- GLStateManager.disableDepthTest();
+ GLSMDepthStencilAlpha.disableDepthTest();
drawPass(true);
} finally {
scope.end();
@@ -215,7 +219,7 @@ public final class DebugWorldRenderHandler {
private void drawLabels(Minecraft mc, GLContextState glCtx, double camX, double camY, double camZ) {
final int n = slots.count;
try {
- labels.begin(mc.fontRenderer, GLStateManager.getProjectionMatrix(), glCtx.viewportState.height);
+ labels.begin(mc.fontRenderer, GLSMMatrices.getProjectionMatrix(), glCtx.viewportState.height);
for (int i = nextDrawable(0); i < n; i = nextDrawable(i + 1)) {
final DebugMesh mesh = meshes[i];
if (mesh.labels.count == 0) continue;
diff --git a/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java b/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java
index 8c41d3ee2..4dd0db34a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java
+++ b/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java
@@ -6,7 +6,19 @@ import com.gtnewhorizons.angelica.compat.holoinventory.HoloInventoryReflectionCo
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.event.ClientEvent;
import com.gtnewhorizons.angelica.event.ClientEventType;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.glsm.stacks.RetainedState;
@@ -84,13 +96,13 @@ public class HUDCaching {
}
private static void setupOverlay(ScaledResolution scaled) {
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(0.0D, scaled.getScaledWidth_double(), scaled.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(0.0F, 0.0F, -2000.0F);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(0.0D, scaled.getScaledWidth_double(), scaled.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(0.0F, 0.0F, -2000.0F);
}
public static void init() {
@@ -99,43 +111,43 @@ public class HUDCaching {
public static void resetAfterCrash() {
renderingCacheOverride = false;
- GLStateManager.setHudCacheOverride(false);
+ GLSMBlend.setHudCacheOverride(false);
dirty = true;
}
private static void initComposite() {
compositeProgram = PanoramaRenderer.loadProgram("angelica:hud_composite", "angelica:panorama_blur", "angelica:hud_composite", ctx -> ctx);
compositeProgram.bind();
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(compositeProgram.handle(), "u_Depth"), 1);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(compositeProgram.handle(), "u_Depth"), 1);
compositeProgram.unbind();
- compositeVao = GLStateManager.glGenVertexArrays();
+ compositeVao = GLSMVertexInput.glGenVertexArrays();
}
private static void composite() {
if (compositeProgram == null) initComposite();
- final int program = GLStateManager.getActiveProgram();
- final int vao = GLStateManager.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
- final int stateDepth = GLStateManager.pushState(allState);
+ final int program = GLSMPrograms.getActiveProgram();
+ final int vao = GLSMQueries.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
+ final int stateDepth = GLSMAttribStack.pushState(allState);
try {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.disableCull();
- GLStateManager.disableScissorTest();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.depthAttachment);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.framebufferTexture);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.disableScissorTest();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.depthAttachment);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.framebufferTexture);
compositeProgram.bind();
- GLStateManager.glBindVertexArray(compositeVao);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMVertexInput.glBindVertexArray(compositeVao);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
} finally {
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glUseProgram(program);
- GLStateManager.popStateTo(stateDepth);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMPrograms.glUseProgram(program);
+ GLSMAttribStack.popStateTo(stateDepth);
}
}
@@ -147,11 +159,11 @@ public class HUDCaching {
XaeroMinimapCore.beforeIngameGuiRender(partialTicks);
}
- GLStateManager.disableLighting();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
+ GLSMLighting.disableLighting();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
if (!AngelicaConfig.hudCachingActive || mc.displayWidth < 16 || mc.displayHeight < 16) {
ingame.renderGameOverlay(partialTicks, hasScreen, mouseX, mouseY);
@@ -168,29 +180,29 @@ public class HUDCaching {
dirty = false;
nextHudRefresh = System.currentTimeMillis() + (1000 / AngelicaConfig.hudCachingFPS);
if (Tracy.ENABLED) Tracy.beginZone(Z_CACHE_WRAP);
- final int outerDepth = GLStateManager.pushState(allState);
+ final int outerDepth = GLSMAttribStack.pushState(allState);
try {
if (framebuffer.framebufferWidth != mc.displayWidth || framebuffer.framebufferHeight != mc.displayHeight) {
framebuffer.createBindFramebuffer(mc.displayWidth, mc.displayHeight);
} else {
framebuffer.clearBindFramebuffer();
}
- final int hudDepth = GLStateManager.pushState(allState);
+ final int hudDepth = GLSMAttribStack.pushState(allState);
renderingCacheOverride = true;
- GLStateManager.setHudCacheOverride(true);
+ GLSMBlend.setHudCacheOverride(true);
if (Tracy.ENABLED) Tracy.beginZone(Z_DRAW);
try {
ingame.renderGameOverlay(partialTicks, hasScreen, mouseX, mouseY);
} finally {
if (Tracy.ENABLED) Tracy.endZone();
}
- GLStateManager.setHudCacheOverride(false);
- GLStateManager.popStateTo(hudDepth + 1);
- GLStateManager.retainModifiedState(hudDepth, hudExitState);
+ GLSMBlend.setHudCacheOverride(false);
+ GLSMAttribStack.popStateTo(hudDepth + 1);
+ GLSMAttribStack.retainModifiedState(hudDepth, hudExitState);
} finally {
renderingCacheOverride = false;
- GLStateManager.setHudCacheOverride(false);
- GLStateManager.popStateTo(outerDepth);
+ GLSMBlend.setHudCacheOverride(false);
+ GLSMAttribStack.popStateTo(outerDepth);
mc.getFramebuffer().bindFramebuffer(false);
if (Tracy.ENABLED) Tracy.endZone();
}
@@ -201,17 +213,17 @@ public class HUDCaching {
int width = scaled.getScaledWidth();
int height = scaled.getScaledHeight();
if (Tracy.ENABLED) Tracy.beginZone(Z_CAPTURED_BITS);
- GLStateManager.enableBlend();
+ GLSMBlend.enableBlend();
// reset the color that may be applied by some items
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
// render bits that were captured when rendering into cache
GuiIngameAccessor gui = (GuiIngameAccessor) ingame;
if (renderVignetteCaptured) {
gui.callRenderVignette(mc.thePlayer.getBrightness(partialTicks), width, height);
} else {
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
}
if (ingame instanceof GuiIngameForge) {
@@ -231,7 +243,7 @@ public class HUDCaching {
if (renderCrosshairsCaptured) {
if (ModStatus.isXaerosMinimapLoaded) {
// this fixes the crosshair going invisible when no lines are being drawn under the minimap
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
}
guiForge.callRenderCrosshairs(width, height);
}
@@ -262,7 +274,7 @@ public class HUDCaching {
composite();
if (Tracy.ENABLED) Tracy.endZone();
if (Tracy.ENABLED) Tracy.beginZone(Z_APPLY_RETAINED);
- GLStateManager.applyRetainedState(hudExitState);
+ GLSMAttribStack.applyRetainedState(hudExitState);
if (Tracy.ENABLED) Tracy.endZone();
ClientEvent.post(ClientEventType.POST_RENDER_HUD, renderer, partialTicks);
@@ -274,11 +286,11 @@ public class HUDCaching {
* the state before we start rendering
*/
public static void fixGLStateBeforeRenderingCache() {
- GLStateManager.glDepthMask(true);
- GLStateManager.enableDepthTest();
- GLStateManager.enableAlphaTest();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.disableBlend();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.disableBlend();
}
public static void disableHoloInventory() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java b/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java
index 35fdeb8da..03547a5ec 100644
--- a/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java
+++ b/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.iris;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
@@ -56,9 +57,9 @@ public final class ImmediateExtendedAttribs implements ImmediateExtendedAttribHa
wants = programWantsExtCache.get(program);
} else {
wants = 0;
- if (GLStateManager.glGetAttribLocation(program, "mc_midTexCoord") >= 0) wants |= WANTS_MID;
- if (GLStateManager.glGetAttribLocation(program, "at_tangent") >= 0) wants |= WANTS_TANGENT;
- if (GLStateManager.glGetAttribLocation(program, "iris_Entity") == LOC_ENTITY_IDS) wants |= WANTS_ENTITY_IDS;
+ if (GLSMPrograms.glGetAttribLocation(program, "mc_midTexCoord") >= 0) wants |= WANTS_MID;
+ if (GLSMPrograms.glGetAttribLocation(program, "at_tangent") >= 0) wants |= WANTS_TANGENT;
+ if (GLSMPrograms.glGetAttribLocation(program, "iris_Entity") == LOC_ENTITY_IDS) wants |= WANTS_ENTITY_IDS;
programWantsExtCache.put(program, wants);
}
currentProgramWants = wants;
@@ -101,7 +102,7 @@ public final class ImmediateExtendedAttribs implements ImmediateExtendedAttribHa
private static boolean programWants(int mask) {
if (!Iris.enabled) return false;
GLSMHooks.resolvePendingProgram();
- return (currentProgramWants & mask) != 0 && GLStateManager.getActiveProgram() != 0;
+ return (currentProgramWants & mask) != 0 && GLSMPrograms.getActiveProgram() != 0;
}
@Override
@@ -281,7 +282,7 @@ public final class ImmediateExtendedAttribs implements ImmediateExtendedAttribHa
}
private static boolean isAtlasNotBound() {
- final int tex = GLStateManager.getBoundTextureForServerState(0);
+ final int tex = GLSMTextures.getBoundTextureForServerState(0);
if (tex <= 0) return true;
final Minecraft mc = Minecraft.getMinecraft();
if (mc == null || mc.getTextureManager() == null) return true;
diff --git a/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java b/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java
index 554cb1c2c..3ccd30a5e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java
+++ b/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java
@@ -11,6 +11,8 @@ import com.gtnewhorizons.angelica.glsm.hooks.LineDrawHandler;
import com.gtnewhorizons.angelica.glsm.hooks.ShaderTransformPostProcessor;
import com.gtnewhorizons.angelica.glsm.shader.ShaderType;
import org.taumc.glsl.grammar.GLSLParser;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.sdlgpu.SDLGPUGate;
import net.coderbot.iris.Iris;
@@ -70,7 +72,7 @@ public class IrisGLSMBridge {
state.setEntityIdsListener(() -> {
final boolean suspended = GLStateManager.suspendExitCapture();
try {
- GLStateManager.setEntityIds(
+ GLSMCurrentAttribs.setEntityIds(
state.getCurrentRenderedEntity(), state.getCurrentRenderedBlockEntity(), state.getCurrentRenderedItem());
} finally {
GLStateManager.resumeExitCapture(suspended);
@@ -278,7 +280,7 @@ public class IrisGLSMBridge {
programRestoreDeferred = false;
final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable();
if (pipeline instanceof DeferredWorldRenderingPipeline drp && drp.shouldOverrideShaders()) {
- drp.restorePassAfterModProgram(GLStateManager.getActiveProgram());
+ drp.restorePassAfterModProgram(GLSMPrograms.getActiveProgram());
}
}
});
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java b/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java
index d1c21bafb..1eb57eb79 100644
--- a/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java
@@ -56,6 +56,7 @@ public final class AngelicaClientTweaker implements IFMLLoadingPlugin, IEarlyMix
Launch.classLoader.addTransformerExclusion("jss.notfine.asm");
Launch.classLoader.addTransformerExclusion("com.gtnewhorizons.angelica.loading");
Launch.classLoader.addTransformerExclusion("com.gtnewhorizons.angelica.glsm.GLStateManager");
+ Launch.classLoader.addTransformerExclusion("com.gtnewhorizons.angelica.glsm.GLSM");
final boolean rfbLoaded = Launch.blackboard.getOrDefault("angelica.rfbPluginLoaded", Boolean.FALSE) == Boolean.TRUE;
if (rfbLoaded) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java
index 42da20705..4819eb826 100644
--- a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java
@@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.loading.fml.compat;
import com.gtnewhorizons.angelica.config.CompatConfig;
import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ExtraUtilsCompatHandler;
import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ImmersiveEngineeringCompatHandler;
+import com.gtnewhorizons.angelica.loading.fml.compat.handlers.KaizPatchXCompatHandler;
import com.gtnewhorizons.angelica.loading.fml.compat.handlers.StacksOnStacksCompatHandler;
import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ThaumcraftCompatHandler;
import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ThaumicHorizonsCompatHandler;
@@ -17,7 +18,8 @@ public enum CompatHandlers {
EXTRA_UTILS(() -> CompatConfig.fixExtraUtils, new ExtraUtilsCompatHandler()),
IMMERSIVE_ENGINEERING(() -> CompatConfig.fixImmersiveEngineering, new ImmersiveEngineeringCompatHandler()),
THAUMCRAFT(() -> CompatConfig.fixThaumcraft, new ThaumcraftCompatHandler()),
- THAUMIC_HORIZONS(() -> CompatConfig.fixThaumicHorizons, new ThaumicHorizonsCompatHandler());
+ THAUMIC_HORIZONS(() -> CompatConfig.fixThaumicHorizons, new ThaumicHorizonsCompatHandler()),
+ KAIZPATCHX(() -> CompatConfig.fixKaizPatchX, new KaizPatchXCompatHandler());
private final Supplier applyIf;
private final ICompatHandler handler;
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java
new file mode 100644
index 000000000..3aaa6c1ca
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java
@@ -0,0 +1,14 @@
+package com.gtnewhorizons.angelica.loading.fml.compat.handlers;
+
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizons.angelica.loading.fml.compat.ICompatHandler;
+
+import java.util.List;
+
+public class KaizPatchXCompatHandler implements ICompatHandler {
+
+ @Override
+ public List extraTransformers() {
+ return ImmutableList.of("com.gtnewhorizons.angelica.loading.fml.compat.transformers.specific.KaizPatchXTransformer");
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java
new file mode 100644
index 000000000..ed7ea94f9
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java
@@ -0,0 +1,61 @@
+package com.gtnewhorizons.angelica.loading.fml.compat.transformers.specific;
+
+import com.gtnewhorizon.gtnhlib.asm.ClassConstantPoolParser;
+import com.gtnewhorizons.angelica.loading.AngelicaClientTweaker;
+import com.gtnewhorizons.angelica.loading.shared.AngelicaClassDump;
+import net.minecraft.launchwrapper.IClassTransformer;
+import org.spongepowered.asm.lib.ClassReader;
+import org.spongepowered.asm.lib.ClassWriter;
+import org.spongepowered.asm.lib.Opcodes;
+import org.spongepowered.asm.lib.tree.AbstractInsnNode;
+import org.spongepowered.asm.lib.tree.ClassNode;
+import org.spongepowered.asm.lib.tree.MethodInsnNode;
+import org.spongepowered.asm.lib.tree.MethodNode;
+
+public class KaizPatchXTransformer implements IClassTransformer {
+
+ private static final String ANGELICA_COMPAT = "jp.kaiz.kaizpatch.compat.AngelicaCompat";
+ private static final String SCRIPT_DESC = "(Ljava/lang/String;)Ljava/lang/String;";
+ private static final String GL_REDIRECTS = "com/gtnewhorizons/angelica/api/GLRedirects";
+ private static final String REDIRECT_SCRIPT = "redirectScript";
+ private static final ClassConstantPoolParser ADOPTED = new ClassConstantPoolParser(REDIRECT_SCRIPT);
+
+ @Override
+ public byte[] transform(String name, String transformedName, byte[] basicClass) {
+ if (basicClass == null) return null;
+ if (!transformedName.equals(ANGELICA_COMPAT)) return basicClass;
+ if (ADOPTED.find(basicClass)) {
+ AngelicaClientTweaker.LOGGER.info("[AngelicaCompat]Extra Transformers: KaizPatchXTransformer skipped, {} already calls GLRedirects.redirectScript", transformedName);
+ return basicClass;
+ }
+
+ final ClassReader cr = new ClassReader(basicClass);
+ final ClassNode cn = new ClassNode();
+ cr.accept(cn, 0);
+
+ MethodNode target = null;
+ for (MethodNode mn : cn.methods) {
+ if (mn.name.equals("transformScript") && mn.desc.equals(SCRIPT_DESC)) {
+ target = mn;
+ break;
+ }
+ }
+ if (target == null) {
+ AngelicaClientTweaker.LOGGER.info("[AngelicaCompat]Extra Transformers: KaizPatchXTransformer found no transformScript in {}", transformedName);
+ return basicClass;
+ }
+
+ for (AbstractInsnNode in : target.instructions.toArray()) {
+ if (in.getOpcode() == Opcodes.ARETURN) {
+ target.instructions.insertBefore(in, new MethodInsnNode(Opcodes.INVOKESTATIC, GL_REDIRECTS, REDIRECT_SCRIPT, SCRIPT_DESC, false));
+ }
+ }
+
+ ClassWriter cw = new ClassWriter(0);
+ cn.accept(cw);
+ final byte[] bytes = cw.toByteArray();
+ AngelicaClientTweaker.LOGGER.info("[AngelicaCompat]Extra Transformers: Applied KaizPatchXTransformer");
+ AngelicaClassDump.dumpClass(transformedName, basicClass, bytes, this);
+ return bytes;
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java
index 6c60b6360..5789b375a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java
@@ -2,6 +2,8 @@ package com.gtnewhorizons.angelica.loading.fml.transformers;
import com.gtnewhorizons.angelica.glsm.loading.EarlyRedirectorCore;
import com.gtnewhorizons.angelica.glsm.loading.EcosystemNarrowRules;
+import com.gtnewhorizons.angelica.loading.shared.transformers.AngelicaRedirector;
+import com.gtnewhorizons.angelica.loading.shared.transformers.GLSMApiRedirects;
import net.minecraft.launchwrapper.IClassTransformer;
/**
@@ -20,6 +22,11 @@ public class EarlyRedirectorTransformer implements IClassTransformer {
private final EarlyRedirectorCore impl = new EarlyRedirectorCore("com.gtnewhorizons.angelica.transform");
+ public EarlyRedirectorTransformer() {
+ impl.setLegacyHint(AngelicaRedirector.LEGACY_HINT);
+ impl.setLegacyRewriter(GLSMApiRedirects.INSTANCE);
+ }
+
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
return impl.transform(transformedName, basicClass, this);
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java
index 5ecc71be9..6959b71e0 100644
--- a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java
@@ -5,8 +5,13 @@ import com.gtnewhorizons.angelica.loading.shared.AngelicaClassDump;
public final class AngelicaRedirector {
+ public static final String LEGACY_HINT = "Call GL11 for GL calls; read cached state via com.gtnewhorizons.angelica.api.glstate.GLState";
+
public static ModRedirector create() {
- return new ModRedirector(AngelicaClassDump.INSTANCE, "com.gtnewhorizons.angelica.transform");
+ final ModRedirector redirector = new ModRedirector(AngelicaClassDump.INSTANCE, "com.gtnewhorizons.angelica.transform");
+ redirector.setLegacyHint(LEGACY_HINT);
+ redirector.setLegacyRewriter(GLSMApiRedirects.INSTANCE);
+ return redirector;
}
private AngelicaRedirector() {}
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java
new file mode 100644
index 000000000..52c16b2dc
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java
@@ -0,0 +1,59 @@
+package com.gtnewhorizons.angelica.loading.shared.transformers;
+
+import com.gtnewhorizons.angelica.glsm.redirect.LegacyRewriter;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.TypeInsnNode;
+
+public final class GLSMApiRedirects implements LegacyRewriter {
+
+ public static final GLSMApiRedirects INSTANCE = new GLSMApiRedirects();
+
+ private static final String GL_STATE = "com/gtnewhorizons/angelica/api/glstate/GLState";
+ private static final String FOG_STATE_STACK = "com/gtnewhorizons/angelica/glsm/stacks/FogStateStack";
+ private static final String VECTOR3D = "org/joml/Vector3d";
+
+ private GLSMApiRedirects() {}
+
+ @Override
+ public String rewrite(InsnList instructions, MethodInsnNode call) {
+ if (call.getOpcode() != Opcodes.INVOKESTATIC) return null;
+ if (call.name.equals("getFogState") && call.desc.equals("()L" + FOG_STATE_STACK + ";")) {
+ final AbstractInsnNode next = nextReal(call);
+ if (!(next instanceof MethodInsnNode getter) || getter.getOpcode() != Opcodes.INVOKEVIRTUAL
+ || !getter.owner.equals(FOG_STATE_STACK) || !getter.name.equals("getFogColorBuffer")
+ || !getter.desc.equals("()Ljava/nio/FloatBuffer;")) {
+ return null;
+ }
+ final InsnList replacement = new InsnList();
+ replacement.add(new InsnNode(Opcodes.ICONST_4));
+ replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/nio/FloatBuffer", "allocate", "(I)Ljava/nio/FloatBuffer;", false));
+ replacement.add(new InsnNode(Opcodes.DUP));
+ replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GL_STATE, "getFogColor", "(Ljava/nio/FloatBuffer;)V", false));
+ instructions.insertBefore(call, replacement);
+ instructions.remove(call);
+ instructions.remove(getter);
+ return "com.gtnewhorizons.angelica.api.glstate.GLState.getFogColor(FloatBuffer)";
+ }
+ if (call.name.equals("getFogColor") && call.desc.equals("()L" + VECTOR3D + ";")) {
+ final InsnList replacement = new InsnList();
+ replacement.add(new TypeInsnNode(Opcodes.NEW, VECTOR3D));
+ replacement.add(new InsnNode(Opcodes.DUP));
+ replacement.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, VECTOR3D, "", "()V", false));
+ replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GL_STATE, "getFogColor", "(L" + VECTOR3D + ";)L" + VECTOR3D + ";", false));
+ instructions.insertBefore(call, replacement);
+ instructions.remove(call);
+ return "com.gtnewhorizons.angelica.api.glstate.GLState.getFogColor(Vector3d)";
+ }
+ return null;
+ }
+
+ private static AbstractInsnNode nextReal(AbstractInsnNode node) {
+ AbstractInsnNode next = node.getNext();
+ while (next != null && next.getOpcode() < 0) next = next.getNext();
+ return next;
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java b/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java
index 1692da856..c5a239583 100644
--- a/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java
+++ b/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.mixins.hooks;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.gtnewhorizons.angelica.glsm.StateSet;
import net.minecraft.client.renderer.Tessellator;
import org.lwjgl.opengl.GL11;
@@ -8,21 +11,21 @@ import org.lwjgl.opengl.GL11;
public class TextHighlightHooks {
public static void draw(int x1, int y1, int x2, int y2) {
- final int depth = GLStateManager.pushState(StateSet.BLEND);
+ final int depth = GLSMAttribStack.pushState(StateSet.BLEND);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFuncSeparate(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMBlend.glBlendFuncSeparate(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
quad(x1, y1, x2, y2);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMCurrentAttribs.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
quad(x1, y1, x2, y2);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.popStateTo(depth);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMAttribStack.popStateTo(depth);
}
private static void quad(int x1, int y1, int x2, int y2) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java b/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java
index fb32ccb35..8a89596b4 100644
--- a/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java
+++ b/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java
@@ -3,7 +3,11 @@ package com.gtnewhorizons.angelica.profiling;
import com.gtnewhorizons.angelica.dynamiclights.DynamicLights;
import com.gtnewhorizons.angelica.glsm.CaptureGate;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.glsm.profiling.TracyBackend;
@@ -189,15 +193,15 @@ public final class TracyFramePlots {
Tracy.plotInt(P_ENTITIES_TOTAL, mc.theWorld.loadedEntityList.size());
}
- P_GL_DRAW_CALLS.plot(GLStateManager.drawCalls);
- P_GL_TEX_BIND_MISSES.plot(GLStateManager.texBindMisses);
- P_GL_PROGRAM_SWITCHES.plot(GLStateManager.programSwitches);
- Tracy.plotInt(P_GL_TEX_AWAITING_RELEASE, GLStateManager.deferredTexturesAwaitingRelease());
- P_GLSM_BRACKETS.plot(GLStateManager.attribPushes);
- P_GLSM_COW_SLOTS.plot(GLStateManager.attribSlotsSaved);
- P_GLSM_POP_RESTORES.plot(GLStateManager.attribValueRestores);
- P_GLSM_POP_GL_CALLS.plot(GLStateManager.attribBackendCalls);
- P_GLSM_POP_DISCARDS.plot(GLStateManager.attribDiscards);
+ P_GL_DRAW_CALLS.plot(GLSMDraws.drawCalls);
+ P_GL_TEX_BIND_MISSES.plot(GLSMTextures.texBindMisses);
+ P_GL_PROGRAM_SWITCHES.plot(GLSMPrograms.programSwitches);
+ Tracy.plotInt(P_GL_TEX_AWAITING_RELEASE, GLSMTextureLifetime.deferredTexturesAwaitingRelease());
+ P_GLSM_BRACKETS.plot(GLSMAttribStack.attribPushes);
+ P_GLSM_COW_SLOTS.plot(GLSMAttribStack.attribSlotsSaved);
+ P_GLSM_POP_RESTORES.plot(GLSMAttribStack.attribValueRestores);
+ P_GLSM_POP_GL_CALLS.plot(GLSMAttribStack.attribBackendCalls);
+ P_GLSM_POP_DISCARDS.plot(GLSMAttribStack.attribDiscards);
P_GL_LIST_PLAYBACKS.plot(DisplayListManager.listPlaybacks);
P_GL_STREAMED_BYTES.plot(TessellatorStreamingDrawer.streamedBytes);
P_GL_STREAM_DRAWS.plot(TessellatorStreamingDrawer.streamDraws);
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java
index 6fa4ba8ac..1cdb8f3ec 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.render;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
@@ -74,9 +76,9 @@ final class CloudFaceMesh {
}
void delete() {
- if (vao != -1) GLStateManager.glDeleteVertexArrays(vao);
- if (vbo != -1) GLStateManager.glDeleteBuffers(vbo);
- if (ebo != -1) GLStateManager.glDeleteBuffers(ebo);
+ if (vao != -1) GLSMVertexInput.glDeleteVertexArrays(vao);
+ if (vbo != -1) GLSMBuffers.glDeleteBuffers(vbo);
+ if (ebo != -1) GLSMBuffers.glDeleteBuffers(ebo);
vao = -1;
vbo = -1;
ebo = -1;
@@ -261,54 +263,54 @@ final class CloudFaceMesh {
uploadBuffer.position(0).limit(uploadBytes);
final boolean freshBuffers = vbo == -1;
- if (freshBuffers) vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ if (freshBuffers) vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
if (uploadBytes > vboCapacityBytes) {
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, uploadBuffer, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, uploadBuffer, GL15.GL_DYNAMIC_DRAW);
vboCapacityBytes = uploadBytes;
} else {
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, uploadBuffer);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, uploadBuffer);
}
if (freshBuffers) {
ensureQuadIndices();
- if (vao == -1) vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glEnableVertexAttribArray(FACE_ATTRIB);
- GLStateManager.glVertexAttribDivisor(FACE_ATTRIB, 1);
- GLStateManager.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, 0L);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glBindVertexArray(0);
+ if (vao == -1) vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMVertexInput.glEnableVertexAttribArray(FACE_ATTRIB);
+ GLSMVertexInput.glVertexAttribDivisor(FACE_ATTRIB, 1);
+ GLSMVertexInput.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, 0L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMVertexInput.glBindVertexArray(0);
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private void ensureQuadIndices() {
if (ebo != -1) return;
- ebo = GLStateManager.glGenBuffers();
+ ebo = GLSMBuffers.glGenBuffers();
final IntBuffer indices = BufferUtils.createIntBuffer(6);
indices.put(0).put(1).put(2).put(0).put(2).put(3);
indices.flip();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
}
void bind() {
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
}
void unbind() {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
}
void drawRange(int startFace, int endFace) {
final int faces = endFace - startFace;
if (faces <= 0) return;
- GLStateManager.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, (long) startFace * FACE_BYTES);
- GLStateManager.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, faces);
+ GLSMVertexInput.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, (long) startFace * FACE_BYTES);
+ GLSMDraws.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, faces);
}
void drawInterior() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java
index e43a0f347..7f61d77de 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java
@@ -22,7 +22,12 @@
package com.gtnewhorizons.angelica.render;
import com.gtnewhorizons.angelica.api.clouds.CloudLayer;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.glsm.states.FogState;
import net.irisshaders.iris.api.v0.IrisApi;
@@ -166,10 +171,10 @@ final class CloudLayerRenderer {
}
private void uploadFogUniforms(CloudUniforms uniforms, float fogStart, float fogEnd) {
- final boolean fogEnabled = GLStateManager.getFogMode().isEnabled();
+ final boolean fogEnabled = GLSMFog.getFogMode().isEnabled();
uniforms.setFogEnabled(fogEnabled);
if (!fogEnabled) return;
- final FogState fog = GLStateManager.getFogState();
+ final FogState fog = GLSMFog.getFogState();
final Vector3d color = fog.getFogColor();
uniforms.setFogColor((float) color.x, (float) color.y, (float) color.z);
switch (fog.getFogMode()) {
@@ -320,11 +325,11 @@ final class CloudLayerRenderer {
b = tempB;
}
- final float origFogStart = GLStateManager.getFogState().getStart();
- final float origFogEnd = GLStateManager.getFogState().getEnd();
+ final float origFogStart = GLSMFog.getFogState().getStart();
+ final float origFogEnd = GLSMFog.getFogState().getEnd();
final float cloudExtentBlocks = renderRadiusChunks * CELLS_PER_CHUNK * cellWidthBlocks;
- final boolean stretchFog = GLStateManager.getFogMode().isEnabled()
- && GLStateManager.getFogState().getFogMode() == GL11.GL_LINEAR
+ final boolean stretchFog = GLSMFog.getFogMode().isEnabled()
+ && GLSMFog.getFogState().getFogMode() == GL11.GL_LINEAR
&& origFogEnd > 0.0f
&& origFogEnd < cloudExtentBlocks;
final float fogStart = stretchFog ? origFogStart * (cloudExtentBlocks / origFogEnd) : origFogStart;
@@ -332,8 +337,8 @@ final class CloudLayerRenderer {
final boolean pushFog = stretchFog && shadersActive;
if (pushFog) {
- GLStateManager.glFogf(GL11.GL_FOG_START, fogStart);
- GLStateManager.glFogf(GL11.GL_FOG_END, fogEnd);
+ GLSMFog.glFogf(GL11.GL_FOG_START, fogStart);
+ GLSMFog.glFogf(GL11.GL_FOG_END, fogEnd);
}
final float anchorDriftX = (float) (anchorX - anchorCellX);
@@ -354,18 +359,18 @@ final class CloudLayerRenderer {
if (!shadersActive) {
program.bind();
final CloudUniforms uniforms = program.getInterface();
- final Matrix4fStack modelView = GLStateManager.getModelViewMatrix();
+ final Matrix4fStack modelView = GLSMMatrices.getModelViewMatrix();
modelView.pushMatrix();
modelView.scale(cellWidthBlocks, 1.0f, cellWidthBlocks);
if (interiorActive) {
modelView.pushMatrix();
modelView.translate(entityToCameraX - cellFractionX, deckBaseY, entityToCameraZ - cellFractionZ);
- GLStateManager.getProjectionMatrix().mul(modelView, mvpInteriorScratch);
+ GLSMMatrices.getProjectionMatrix().mul(modelView, mvpInteriorScratch);
modelView.popMatrix();
}
modelView.translate(entityToCameraX - (cellFractionX + anchorDriftX), deckBaseY, entityToCameraZ - (cellFractionZ + anchorDriftZ));
modelViewScratch.set(modelView);
- GLStateManager.getProjectionMatrix().mul(modelView, mvpScratch);
+ GLSMMatrices.getProjectionMatrix().mul(modelView, mvpScratch);
modelView.popMatrix();
uniforms.mvp.set(mvpScratch);
uniforms.modelView.set(modelViewScratch);
@@ -377,16 +382,16 @@ final class CloudLayerRenderer {
drawClouds(r, g, b, false);
program.unbind();
} else {
- GLStateManager.glPushMatrix();
- GLStateManager.glScalef(cellWidthBlocks, 1.0f, cellWidthBlocks);
- GLStateManager.glTranslatef(entityToCameraX - (cellFractionX + anchorDriftX), deckBaseY, entityToCameraZ - (cellFractionZ + anchorDriftZ));
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glScalef(cellWidthBlocks, 1.0f, cellWidthBlocks);
+ GLSMMatrices.glTranslatef(entityToCameraX - (cellFractionX + anchorDriftX), deckBaseY, entityToCameraZ - (cellFractionZ + anchorDriftZ));
drawClouds(r, g, b, true);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
if (pushFog) {
- GLStateManager.glFogf(GL11.GL_FOG_START, origFogStart);
- GLStateManager.glFogf(GL11.GL_FOG_END, origFogEnd);
+ GLSMFog.glFogf(GL11.GL_FOG_START, origFogStart);
+ GLSMFog.glFogf(GL11.GL_FOG_END, origFogEnd);
}
if (Tracy.FINE_ZONES) Tracy.endZone();
return true;
@@ -523,11 +528,11 @@ final class CloudLayerRenderer {
}
private void drawFaces(float r, float g, float b) {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
applyAnaglyphColorMask();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthMask(true);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthMask(true);
program.getInterface().setColorMult(r, g, b, alpha);
@@ -540,9 +545,9 @@ final class CloudLayerRenderer {
drawVisibleWedges(faceMesh.plateStarts(), faceMesh.wallStarts(), faceMesh.uploadedCount(), true);
faceMesh.unbind();
- GLStateManager.glDepthMask(true);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.disableBlend();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMBlend.disableBlend();
}
private void drawVertices(float r, float g, float b, boolean depthPrepass) {
@@ -550,16 +555,16 @@ final class CloudLayerRenderer {
final int totalQuads = vertexMesh.quadCount();
if (cullBackFaces()) {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
} else {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
}
if (depthPrepass) {
- GLStateManager.disableBlend();
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(false, false, false, false);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, alpha);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(false, false, false, false);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, alpha);
vertexMesh.drawAll();
drawCalls++;
if (interiorActive) {
@@ -575,15 +580,15 @@ final class CloudLayerRenderer {
}
applyAnaglyphColorMask();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthMask(!depthPrepass);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthMask(!depthPrepass);
if (depthPrepass) {
for (int face = 0; face < 4; face++) {
if (vertexMesh.faceEmpty(face)) continue;
final float shade = CloudVertexMesh.FACE_SHADE[face];
- GLStateManager.glColor4f(shade * r, shade * g, shade * b, alpha);
+ GLSMCurrentAttribs.glColor4f(shade * r, shade * g, shade * b, alpha);
vertexMesh.drawFace(face);
drawCalls++;
}
@@ -605,7 +610,7 @@ final class CloudLayerRenderer {
for (int face = 0; face < 4; face++) {
if (interiorMesh.faceEmpty(face)) continue;
final float shade = CloudVertexMesh.FACE_SHADE[face];
- GLStateManager.glColor4f(shade * r, shade * g, shade * b, alpha);
+ GLSMCurrentAttribs.glColor4f(shade * r, shade * g, shade * b, alpha);
interiorMesh.drawFace(face);
drawCalls++;
}
@@ -617,16 +622,16 @@ final class CloudLayerRenderer {
popInteriorTransform(depthPrepass);
}
- GLStateManager.enableCull();
- GLStateManager.glDepthMask(true);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.disableBlend();
+ GLSMRasterizer.enableCull();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMBlend.disableBlend();
}
private void pushInteriorTransform(boolean shadersActive) {
if (shadersActive) {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(interiorDriftX, 0.0f, interiorDriftZ);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(interiorDriftX, 0.0f, interiorDriftZ);
} else {
program.getInterface().mvp.set(mvpInteriorScratch);
}
@@ -634,7 +639,7 @@ final class CloudLayerRenderer {
private void popInteriorTransform(boolean shadersActive) {
if (shadersActive) {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
} else {
program.getInterface().mvp.set(mvpScratch);
}
@@ -689,13 +694,13 @@ final class CloudLayerRenderer {
private void applyAnaglyphColorMask() {
if (!mc.gameSettings.anaglyph) {
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMBlend.glColorMask(true, true, true, true);
return;
}
switch (EntityRenderer.anaglyphField) {
- case 0 -> GLStateManager.glColorMask(false, true, true, true);
- case 1 -> GLStateManager.glColorMask(true, false, false, true);
- default -> GLStateManager.glColorMask(true, true, true, true);
+ case 0 -> GLSMBlend.glColorMask(false, true, true, true);
+ case 1 -> GLSMBlend.glColorMask(true, false, false, true);
+ default -> GLSMBlend.glColorMask(true, true, true, true);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java
index 7b99fc60a..422ed339a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java
@@ -5,7 +5,8 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import org.embeddedt.embeddium.impl.gl.shader.GlProgram;
@@ -89,16 +90,16 @@ final class CloudRenderResources {
void bind() {
if (mc.renderEngine == null) return;
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
mc.renderEngine.bindTexture(location);
- final int boundTexId = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
+ final int boundTexId = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
if (boundTexId != mipmappedTexId) {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4);
- GLStateManager.glGenerateMipmap(GL11.GL_TEXTURE_2D);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4);
+ GLSMTextures.glGenerateMipmap(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
mipmappedTexId = boundTexId;
}
if (boundTexId != cloudTexId || shape == null) {
@@ -108,8 +109,8 @@ final class CloudRenderResources {
}
private void extractCloudShape() {
- final int texWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
- final int texHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
+ final int texWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
+ final int texHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
if (texWidth <= 0 || texHeight <= 0) return;
final int neededBytes = texWidth * texHeight * 4;
if (texelStagingBuffer == null || texelStagingBuffer.capacity() < neededBytes) {
@@ -117,7 +118,7 @@ final class CloudRenderResources {
} else {
texelStagingBuffer.clear();
}
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,
texelStagingBuffer);
width = texWidth;
shape = new CloudShape(texWidth, texHeight, texelStagingBuffer);
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java
index 24b663fdd..6beab5609 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java
@@ -24,7 +24,8 @@ package com.gtnewhorizons.angelica.render;
import com.gtnewhorizons.angelica.api.clouds.CloudLayer;
import com.gtnewhorizons.angelica.api.clouds.CloudLayerProvider;
import com.gtnewhorizons.angelica.compat.galaxyspace.GalaxySpaceClouds;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.states.ViewportState;
import jss.notfine.core.Settings;
import jss.notfine.gui.options.named.GraphicsQualityOff;
@@ -157,8 +158,8 @@ public class CloudRenderer implements IResourceManagerReloadListener {
return true;
});
- final ViewportState viewport = GLStateManager.getViewportState();
- cloudView.update(GLStateManager.getProjectionMatrix(), GLStateManager.getModelViewMatrix(), viewport.width, viewport.height);
+ final ViewportState viewport = GLSMRasterizer.getViewportState();
+ cloudView.update(GLSMMatrices.getProjectionMatrix(), GLSMMatrices.getModelViewMatrix(), viewport.width, viewport.height);
final Entity view = mc.renderViewEntity;
final double cameraY = view.lastTickPosY + (view.posY - view.lastTickPosY) * partialTicks + cloudView.offsetY;
sortCameraY = cameraY;
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java
index dd9e8056c..c6f4a4fec 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java
@@ -4,7 +4,9 @@ import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject;
import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
@@ -644,10 +646,10 @@ final class CloudVertexMesh {
private void setupShadeAttrib() {
vao.bind();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vao.getVBO().getId());
- GLStateManager.glEnableVertexAttribArray(FACE_SHADE_ATTRIB);
- GLStateManager.glVertexAttribPointer(FACE_SHADE_ATTRIB, 4, GL11.GL_UNSIGNED_BYTE, true, vertexStride, normalOffset);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vao.getVBO().getId());
+ GLSMVertexInput.glEnableVertexAttribArray(FACE_SHADE_ATTRIB);
+ GLSMVertexInput.glVertexAttribPointer(FACE_SHADE_ATTRIB, 4, GL11.GL_UNSIGNED_BYTE, true, vertexStride, normalOffset);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
vao.unbind();
}
@@ -752,9 +754,9 @@ final class CloudVertexMesh {
void reorderUpload() {
if (orderPendingQuads <= 0) return;
if (Tracy.FINE_ZONES) Tracy.beginZone(Z_REORDER_UPLOAD);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, orderIndexBuffer, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, orderIndexBuffer, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
System.arraycopy(plateStartScratch, 0, plateStart, 0, plateStart.length);
System.arraycopy(wallStartScratch, 0, wallStart, 0, wallStart.length);
eboQuadCapacity = orderPendingQuads;
@@ -771,7 +773,7 @@ final class CloudVertexMesh {
private void ensureEbo(int quads) {
if (eboId == -1) {
- eboId = GLStateManager.glGenBuffers();
+ eboId = GLSMBuffers.glGenBuffers();
}
if (quads <= eboQuadCapacity && eboIsSequential) return;
@@ -779,9 +781,9 @@ final class CloudVertexMesh {
final int capacity = Math.max(quads + (quads >> 1), 4096);
final IntBuffer indices = sequentialIndices(capacity);
indices.position(0).limit(capacity * 6);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
eboQuadCapacity = capacity;
}
@@ -802,7 +804,7 @@ final class CloudVertexMesh {
void deleteEbo() {
if (eboId != -1) {
- GLStateManager.glDeleteBuffers(eboId);
+ GLSMBuffers.glDeleteBuffers(eboId);
eboId = -1;
eboQuadCapacity = 0;
}
@@ -819,7 +821,7 @@ final class CloudVertexMesh {
void bind() {
vao.bind();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId);
}
void unbind() {
@@ -829,11 +831,11 @@ final class CloudVertexMesh {
void drawRange(int startQuad, int endQuad) {
final int quads = endQuad - startQuad;
if (quads <= 0) return;
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, quads * 6, GL11.GL_UNSIGNED_INT, (long) startQuad * 6L * 4L);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, quads * 6, GL11.GL_UNSIGNED_INT, (long) startQuad * 6L * 4L);
}
void drawAll() {
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, (vertexCount / 4) * 6, GL11.GL_UNSIGNED_INT, 0L);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, (vertexCount / 4) * 6, GL11.GL_UNSIGNED_INT, 0L);
}
boolean faceEmpty(int face) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java
index a5398ab65..44066b9c2 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java
@@ -1,6 +1,14 @@
package com.gtnewhorizons.angelica.render;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v;
import net.minecraft.client.Minecraft;
import net.minecraft.util.MathHelper;
@@ -81,7 +89,7 @@ public class PanoramaRenderer {
fboB = createFbo(texB);
buildCubeGeometry();
- emptyVao = GLStateManager.glGenVertexArrays();
+ emptyVao = GLSMVertexInput.glGenVertexArrays();
initShaders();
}
@@ -100,7 +108,7 @@ public class PanoramaRenderer {
try {
final GlProgram program = GlProgram.builder(name).attachShader(vert).attachShader(frag).link(factory);
program.bind();
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program.handle(), "u_Texture"), 0);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program.handle(), "u_Texture"), 0);
program.unbind();
return program;
} finally {
@@ -136,48 +144,48 @@ public class PanoramaRenderer {
}
ibuf.flip();
- cubeVao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(cubeVao);
+ cubeVao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(cubeVao);
- cubeVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, cubeVbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vbuf, GL15.GL_STATIC_DRAW);
+ cubeVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, cubeVbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vbuf, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, VERTEX_STRIDE, 0);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_STRIDE, 12);
- GLStateManager.glEnableVertexAttribArray(2);
- GLStateManager.glVertexAttribPointer(2, 1, GL11.GL_FLOAT, false, VERTEX_STRIDE, 20);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, VERTEX_STRIDE, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_STRIDE, 12);
+ GLSMVertexInput.glEnableVertexAttribArray(2);
+ GLSMVertexInput.glVertexAttribPointer(2, 1, GL11.GL_FLOAT, false, VERTEX_STRIDE, 20);
- cubeIbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, cubeIbo);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, ibuf, GL15.GL_STATIC_DRAW);
+ cubeIbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, cubeIbo);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, ibuf, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
private static int createTexture() {
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return tex;
}
private static int createFbo(int colorTex) {
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTex, 0);
- final int status = GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER);
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTex, 0);
+ final int status = GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER);
if (status != GL30.GL_FRAMEBUFFER_COMPLETE) {
throw new RuntimeException("Panorama FBO incomplete: 0x" + Integer.toHexString(status));
}
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
return fbo;
}
@@ -185,35 +193,35 @@ public class PanoramaRenderer {
if (!initialized) return;
initialized = false;
if (fboA != 0) {
- GLStateManager.glDeleteFramebuffers(fboA);
+ GLSMFramebuffer.glDeleteFramebuffers(fboA);
fboA = 0;
}
if (fboB != 0) {
- GLStateManager.glDeleteFramebuffers(fboB);
+ GLSMFramebuffer.glDeleteFramebuffers(fboB);
fboB = 0;
}
if (texA != 0) {
- GLStateManager.glDeleteTextures(texA);
+ GLSMTextures.glDeleteTextures(texA);
texA = 0;
}
if (texB != 0) {
- GLStateManager.glDeleteTextures(texB);
+ GLSMTextures.glDeleteTextures(texB);
texB = 0;
}
if (cubeVao != 0) {
- GLStateManager.glDeleteVertexArrays(cubeVao);
+ GLSMVertexInput.glDeleteVertexArrays(cubeVao);
cubeVao = 0;
}
if (cubeVbo != 0) {
- GLStateManager.glDeleteBuffers(cubeVbo);
+ GLSMBuffers.glDeleteBuffers(cubeVbo);
cubeVbo = 0;
}
if (cubeIbo != 0) {
- GLStateManager.glDeleteBuffers(cubeIbo);
+ GLSMBuffers.glDeleteBuffers(cubeIbo);
cubeIbo = 0;
}
if (emptyVao != 0) {
- GLStateManager.glDeleteVertexArrays(emptyVao);
+ GLSMVertexInput.glDeleteVertexArrays(emptyVao);
emptyVao = 0;
}
if (cubeProgram != null) {
@@ -233,54 +241,54 @@ public class PanoramaRenderer {
public void renderSkybox(int panoramaTimer, float partialTicks, ResourceLocation[] panoramaPaths, Minecraft mc, int screenWidth, int screenHeight, float zLevel) {
init();
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.disableCull();
- GLStateManager.disableScissorTest();
- GLStateManager.disableDepthTest();
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.disableScissorTest();
+ GLSMDepthStencilAlpha.disableDepthTest();
mc.getFramebuffer().unbindFramebuffer();
- GLStateManager.glViewport(0, 0, FBO_SIZE, FBO_SIZE);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA);
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMRasterizer.glViewport(0, 0, FBO_SIZE, FBO_SIZE);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
drawCubeFaces(panoramaTimer, partialTicks, panoramaPaths, mc);
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
blurProgram.bind();
- GLStateManager.glBindVertexArray(emptyVao);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glBindVertexArray(emptyVao);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
final BlurUniforms bu = blurProgram.getInterface();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboB);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboB);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA);
bu.direction.set(1.0f / FBO_SIZE, 0.0f);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB);
bu.direction.set(0.0f, 1.0f / FBO_SIZE);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
mc.getFramebuffer().bindFramebuffer(true);
- GLStateManager.glViewport(0, 0, mc.displayWidth, mc.displayHeight);
+ GLSMRasterizer.glViewport(0, 0, mc.displayWidth, mc.displayHeight);
blitProgram.bind();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA);
final float f1 = screenWidth > screenHeight ? 120.0F / screenWidth : 120.0F / screenHeight;
blitProgram.getInterface().scaleV.setFloat(screenHeight * f1 / 256.0F);
blitProgram.getInterface().scaleU.setFloat(screenWidth * f1 / 256.0F);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
blitProgram.unbind();
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.enableBlend();
- GLStateManager.enableTexture();
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMBlend.enableBlend();
+ GLSMTextures.enableTexture();
}
private void drawCubeFaces(int panoramaTimer, float partialTicks, ResourceLocation[] panoramaPaths, Minecraft mc) {
@@ -292,13 +300,13 @@ public class PanoramaRenderer {
final Matrix4f proj = projScratch.setPerspective((float) Math.toRadians(120.0), 1.0f, 0.05f, 10.0f);
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthMask(false);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthMask(false);
cubeProgram.bind();
- GLStateManager.glBindVertexArray(cubeVao);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glBindVertexArray(cubeVao);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
final CubeUniforms cu = cubeProgram.getInterface();
@@ -307,12 +315,12 @@ public class PanoramaRenderer {
cu.mvp.set(mvpScratch);
mc.getTextureManager().bindTexture(panoramaPaths[face]);
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, INDICES_PER_FACE, GL11.GL_UNSIGNED_SHORT, 0);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, INDICES_PER_FACE, GL11.GL_UNSIGNED_SHORT, 0);
}
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
cubeProgram.unbind();
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(true);
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java
index a801c0c03..d006508d9 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java
@@ -4,7 +4,9 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject;
import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.states.Color4;
import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer;
import net.irisshaders.iris.api.v0.IrisApi;
@@ -64,7 +66,7 @@ public final class SelectionBoxRenderer {
final float extY = (float) (aabb.maxY - aabb.minY);
final float extZ = (float) (aabb.maxZ - aabb.minZ);
- if (GLStateManager.wideLineEmulationEnabled || (AngelicaConfig.enableIris && IrisApi.getInstance().isShaderPackInUse())) {
+ if (GLSMRasterizer.wideLineEmulationEnabled || (AngelicaConfig.enableIris && IrisApi.getInstance().isShaderPackInUse())) {
drawAsLines(minX, minY, minZ, extX, extY, extZ, color);
} else {
drawFast(minX, minY, minZ, extX, extY, extZ, color);
@@ -76,7 +78,7 @@ public final class SelectionBoxRenderer {
program.bind();
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), mvpMatrix);
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), mvpMatrix);
mvpMatrix.translate(minX, minY, minZ).scale(extX, extY, extZ);
uniforms.mvp.set(mvpMatrix);
@@ -86,7 +88,7 @@ public final class SelectionBoxRenderer {
colorBuf[2] = (color & 0xFF) / 255.0f;
colorBuf[3] = 1.0f;
} else {
- final Color4 c = GLStateManager.getColor();
+ final Color4 c = GLSMCurrentAttribs.getColor();
colorBuf[0] = c.getRed();
colorBuf[1] = c.getGreen();
colorBuf[2] = c.getBlue();
@@ -101,24 +103,24 @@ public final class SelectionBoxRenderer {
// The streaming drawer's line path widens the edges in the FFP vertex shader or sends them to a pack's gbuffers_line
private static void drawAsLines(float minX, float minY, float minZ, float extX, float extY, float extZ, int color) {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(minX, minY, minZ);
- GLStateManager.glScalef(extX, extY, extZ);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(minX, minY, minZ);
+ GLSMMatrices.glScalef(extX, extY, extZ);
- final Color4 prev = GLStateManager.getColor();
+ final Color4 prev = GLSMCurrentAttribs.getColor();
final float prevRed = prev.getRed(), prevGreen = prev.getGreen(), prevBlue = prev.getBlue(), prevAlpha = prev.getAlpha();
final boolean overrideColor = color != -1;
if (overrideColor) {
- GLStateManager.glColor4f(((color >> 16) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, (color & 0xFF) / 255.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(((color >> 16) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, (color & 0xFF) / 255.0f, 1.0f);
}
edges.clear();
TessellatorStreamingDrawer.drawPacked(edges, GL11.GL_LINES, DefaultVertexFormat.POSITION.getVertexFlags(), VERT_COUNT);
if (overrideColor) {
- GLStateManager.glColor4f(prevRed, prevGreen, prevBlue, prevAlpha);
+ GLSMCurrentAttribs.glColor4f(prevRed, prevGreen, prevBlue, prevAlpha);
}
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
public static void destroy() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java
index 58828f7f7..d7ae2b34f 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java
@@ -3,7 +3,14 @@ package com.gtnewhorizons.angelica.render;
import com.gtnewhorizons.angelica.compat.dragonapi.DragonAPICompat;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.config.SystemProperties;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
import com.gtnewhorizons.angelica.glsm.ffp.VAOManager;
import com.gtnewhorizons.angelica.glsm.ffp.WeatherInstancedAttribs;
@@ -273,20 +280,20 @@ public final class WeatherRenderer {
updateCount & 31, updateCount & 511, rainStrength);
mc.entityRenderer.enableLightmap(partialTicks);
- GLStateManager.disableCull();
- GLStateManager.glNormal3f(0.0F, 1.0F, 0.0F);
- GLStateManager.enableBlend();
+ GLSMRasterizer.disableCull();
+ GLSMCurrentAttribs.glNormal3f(0.0F, 1.0F, 0.0F);
+ GLSMBlend.enableBlend();
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
int drawCalls = 0;
drawCalls += drawRange(mc, deferred, RAIN_TEXTURE, 0, rainInstances);
drawCalls += drawRange(mc, deferred, SNOW_TEXTURE, rainInstances, instanceCount - rainInstances);
- GLStateManager.enableCull();
- GLStateManager.disableBlend();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMRasterizer.enableCull();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
mc.entityRenderer.disableLightmap(partialTicks);
report(instanceCount, drawCalls, startNanos);
@@ -303,15 +310,15 @@ public final class WeatherRenderer {
deferred.bindInstancedVariant(Instancing.WEATHER);
}
- GLStateManager.glBindVertexArray(WeatherQuadMesh.vao());
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer);
+ GLSMVertexInput.glBindVertexArray(WeatherQuadMesh.vao());
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer);
WeatherInstancedAttribs.pointInstanceAttribs((long) first * WeatherInstancedAttribs.STRIDE);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
VAOManager.setCurrentVertexFlags(WeatherQuadMesh.VERTEX_FLAGS);
- if (deferred == null) GLStateManager.setFfpInstancing(Instancing.WEATHER);
- GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLE_FAN, 0, WeatherQuadMesh.VERTEX_COUNT, count);
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ if (deferred == null) GLSMPrograms.setFfpInstancing(Instancing.WEATHER);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLE_FAN, 0, WeatherQuadMesh.VERTEX_COUNT, count);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
if (deferred != null) deferred.rebindCurrentPass();
return 1;
@@ -324,10 +331,10 @@ public final class WeatherRenderer {
if (instanceCapacity < slots) {
instanceCapacity = slots;
instanceData = ByteBuffer.allocateDirect(slots * stride).order(ByteOrder.nativeOrder());
- if (instanceBuffer == 0) instanceBuffer = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) slots * stride, GL15.GL_DYNAMIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ if (instanceBuffer == 0) instanceBuffer = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) slots * stride, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
WeatherQuadMesh.bindInstanceBuffer(instanceBuffer);
}
@@ -339,9 +346,9 @@ public final class WeatherRenderer {
instanceData.position(0);
instanceData.limit(count * stride);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer);
- GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, instanceData);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer);
+ GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, instanceData);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
instanceData.clear();
}
@@ -394,12 +401,12 @@ public final class WeatherRenderer {
mc.entityRenderer.enableLightmap(partialTicks);
final float age = updateCount + partialTicks;
- GLStateManager.disableCull();
- GLStateManager.glNormal3f(0.0F, 1.0F, 0.0F);
- GLStateManager.enableBlend();
+ GLSMRasterizer.disableCull();
+ GLSMCurrentAttribs.glNormal3f(0.0F, 1.0F, 0.0F);
+ GLSMBlend.enableBlend();
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
final Tessellator tessellator = Tessellator.instance;
int bound = -1;
@@ -473,9 +480,9 @@ public final class WeatherRenderer {
drawCalls++;
}
- GLStateManager.enableCull();
- GLStateManager.disableBlend();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMRasterizer.enableCull();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
mc.entityRenderer.disableLightmap(partialTicks);
report(quads, drawCalls, startNanos);
@@ -517,7 +524,7 @@ public final class WeatherRenderer {
public static void clear() {
WeatherQuadMesh.delete();
if (instanceBuffer != 0) {
- GLStateManager.glDeleteBuffers(instanceBuffer);
+ GLSMBuffers.glDeleteBuffers(instanceBuffer);
instanceBuffer = 0;
}
instanceData = null;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java b/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java
index 1f37e97cf..0aec3e77b 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.gtnewhorizons.angelica.iris.IrisDisplayListState;
import com.gtnewhorizons.angelica.rendering.celeritas.BlockRenderLayer;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
@@ -24,14 +24,14 @@ public final class BlockMaterialAttribute {
IrisDisplayListState.recordBlockEntityAttribute(block, metadata);
if (!shadersActive()) return;
IrisDisplayListState.runUnrecorded(() ->
- GLStateManager.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) blockMaterialId(block, metadata), (short) 0));
+ GLSMCurrentAttribs.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) blockMaterialId(block, metadata), (short) 0));
}
public static void reset() {
IrisDisplayListState.recordBlockEntityAttribute(null, 0);
if (!shadersActive()) return;
IrisDisplayListState.runUnrecorded(() ->
- GLStateManager.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) -1, (short) -1));
+ GLSMCurrentAttribs.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) -1, (short) -1));
}
static boolean shadersActive() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java b/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java
index 6e32a402a..fd63764c3 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay;
import lombok.Getter;
import net.coderbot.iris.layer.GbufferPrograms;
@@ -87,7 +90,7 @@ public class DeferredEntityOverlay {
entry.set(pendingShouldRenderPass, pendingRenderer, pendingEntity, pendingPartialTick,
limbSwing, limbSwingAmount, ageInTicks, headYaw, headPitch, scale);
- GLStateManager.getModelViewMatrix().get(entry.matrix);
+ GLSMMatrices.getModelViewMatrix().get(entry.matrix);
deferred.add(entry);
EntityShadowReplay.recordDeferredOverlay(entry);
@@ -145,29 +148,29 @@ public class DeferredEntityOverlay {
// Restore the entity's lightmap coords
int brightness = entity.getBrightnessForRender(entry.partialTick);
- GLStateManager.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,
+ GLSMCurrentAttribs.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,
brightness % 65536, (float) brightness / 65536);
// Restore the saved modelview matrix
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
boolean depthMaskDisabled = false;
try {
MATRIX_BUF.clear();
MATRIX_BUF.put(entry.matrix);
MATRIX_BUF.flip();
- GLStateManager.glLoadMatrix(MATRIX_BUF);
+ GLSMMatrices.glLoadMatrix(MATRIX_BUF);
// Replay shouldRenderPass pass 1
replaying = true;
int result = entry.shouldRenderPass.invoke(entity, 1, entry.partialTick);
if (result > 0) {
// Disable depth writes so coplanar faces don't z-fight each other
- GLStateManager.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthMask(false);
depthMaskDisabled = true;
// Disable backface culling so both sides of the overlay shell are visible
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
// Render using the model set by shouldRenderPass
entry.renderer.renderPassModel.setLivingAnimations(entity,
@@ -183,10 +186,10 @@ public class DeferredEntityOverlay {
} finally {
replaying = false;
if (depthMaskDisabled) {
- GLStateManager.glDepthMask(true);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
}
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java
index 0b9f543d6..e945f2cb2 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.rendering;
import com.gtnewhorizons.angelica.AngelicaMod;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend.GateSample;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend;
@@ -165,7 +166,7 @@ public final class FramePacer {
}
public static void beforePresent() {
- final long firstClearBlockNanos = GLStateManager.takeFirstClearBlockNanos();
+ final long firstClearBlockNanos = GLSMFramebuffer.takeFirstClearBlockNanos();
Tracy.beginZone(Z_PACER_PRESENT_SLEEP);
try {
core.beforePresent(nanoTime(), firstClearBlockNanos);
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java b/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java
index e9317664d..93532581d 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import org.joml.Matrix4fc;
import org.joml.Matrix4f;
@@ -57,10 +57,10 @@ public final class GlintClock {
}
public static void translateArmorGlint() {
- if (secondArmorLayer(GLStateManager.getMatrixStack())) {
- GLStateManager.glTranslatef(armorU1, armorV1, 0f);
+ if (secondArmorLayer(GLSMMatrices.getMatrixStack())) {
+ GLSMMatrices.glTranslatef(armorU1, armorV1, 0f);
} else {
- GLStateManager.glTranslatef(armorU0, armorV0, 0f);
+ GLSMMatrices.glTranslatef(armorU0, armorV0, 0f);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java b/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java
index fea6e362d..465289303 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.rendering;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.proxy.ClientProxy;
public final class GuiBlockSupersampling {
@@ -9,10 +9,10 @@ public final class GuiBlockSupersampling {
public static int begin() {
if (!RenderingState.INSTANCE.isRenderingGuiItem() || RenderingState.INSTANCE.isRenderingWorld()) return 0;
final int samples = ClientProxy.options().quality.guiBlockSupersampling;
- return samples > 1 ? GLStateManager.setTextureSupersamplingSamples(samples) : 0;
+ return samples > 1 ? GLSMTextures.setTextureSupersamplingSamples(samples) : 0;
}
public static void end(int previous) {
- if (previous != 0) GLStateManager.setTextureSupersamplingSamples(previous);
+ if (previous != 0) GLSMTextures.setTextureSupersamplingSamples(previous);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java b/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java
index 014fe7163..1cb3219b7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java
@@ -3,6 +3,15 @@ package com.gtnewhorizons.angelica.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.QuadConverter;
import com.gtnewhorizons.angelica.glsm.StateSet;
@@ -130,8 +139,8 @@ public final class PlayerReflectionCapture {
final float[] data = vertexScratch();
emitModel(model, scale, data);
- pendingModelView.set(GLStateManager.getModelViewMatrix());
- pendingSkin = GLStateManager.getBoundTextureForServerState(0);
+ pendingModelView.set(GLSMMatrices.getModelViewMatrix());
+ pendingSkin = GLSMTextures.getBoundTextureForServerState(0);
pendingEntityId = CapturedRenderingState.INSTANCE.getCurrentRenderedEntity();
pendingItemId = CapturedRenderingState.INSTANCE.getCurrentRenderedItem();
pending = true;
@@ -212,7 +221,7 @@ public final class PlayerReflectionCapture {
if (!(Iris.getPipelineManager().getPipelineNullable() instanceof DeferredWorldRenderingPipeline pipeline)) return;
pipeline.rebindCurrentPass();
- if (GLStateManager.getActiveProgram() != pipeline.getActivePassProgramId()) return;
+ if (GLSMPrograms.getActiveProgram() != pipeline.getActivePassProgramId()) return;
if (Tracy.ENABLED) Tracy.beginZone(Z_PLAYER_REFLECTION_FLUSH);
try {
@@ -251,14 +260,14 @@ public final class PlayerReflectionCapture {
repackBuffer.limit((int) (writePtr - repackAddress));
ensureVAO(format);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, repackBuffer, GL15.GL_STREAM_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, repackBuffer, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- final int prevUnit = GL13.GL_TEXTURE0 + GLStateManager.getActiveTextureUnitForServerState();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int prevTexture = GLStateManager.getBoundTextureForServerState();
+ final int prevUnit = GL13.GL_TEXTURE0 + GLSMTextures.getActiveTextureUnitForServerState();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int prevTexture = GLSMTextures.getBoundTextureForServerState();
if (pendingSkin > 0 && pendingSkin != skin64Tex) {
final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(pendingSkin);
@@ -285,8 +294,8 @@ public final class PlayerReflectionCapture {
skinPixels = ByteBuffer.allocateDirect(required).order(ByteOrder.nativeOrder());
}
skinPixels.clear();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, pendingSkin);
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, pendingSkin);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels);
skinCopyWidth = srcW;
skinCopyHeight = srcH;
}
@@ -295,12 +304,12 @@ public final class PlayerReflectionCapture {
if (skinCopyWidth > 0 && (skinChanged || atlasChanged)) {
ensureSkin64Texture(Math.max(skinCopyWidth, skinCopyHeight));
- final int prevRowLength = GLStateManager.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, skinCopyWidth);
+ final int prevRowLength = GLSMQueries.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, skinCopyWidth);
try {
skinPixels.rewind();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, skinCopyWidth, skinCopyHeight, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, skinCopyWidth, skinCopyHeight, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels);
skin64Valid = true;
if (atlasInfo != null) {
@@ -308,39 +317,39 @@ public final class PlayerReflectionCapture {
final int dstH = Math.min(atlasInfo.getHeight(), skinCopyHeight);
if (dstW > 0 && dstH > 0) {
skinPixels.rewind();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, atlasId);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, dstW, dstH, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, atlasId);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, dstW, dstH, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels);
}
}
} finally {
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, prevRowLength);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, prevRowLength);
}
lastUploadedAtlasInfo = atlasInfo;
lastUploadedAtlasGeneration = atlasInfo != null ? atlasInfo.getUploadGeneration() : 0;
}
- if (skin64Valid) GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex);
+ if (skin64Valid) GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex);
}
final int prevEntityId = CapturedRenderingState.INSTANCE.getCurrentRenderedEntity();
final int prevItemId = CapturedRenderingState.INSTANCE.getCurrentRenderedItem();
- savedModelView.set(GLStateManager.getModelViewMatrix());
+ savedModelView.set(GLSMMatrices.getModelViewMatrix());
CapturedRenderingState.INSTANCE.setCurrentEntityAndItem(pendingEntityId, pendingItemId);
- GLStateManager.setModelViewMatrix(pendingModelView);
- final int maskStateDepth = GLStateManager.pushState(StateSet.MASKS);
- GLStateManager.glColorMask(false, false, false, false);
- GLStateManager.glDepthMask(false);
+ GLSMMatrices.setModelViewMatrix(pendingModelView);
+ final int maskStateDepth = GLSMAttribStack.pushState(StateSet.MASKS);
+ GLSMBlend.glColorMask(false, false, false, false);
+ GLSMDepthStencilAlpha.glDepthMask(false);
try {
QuadConverter.drawQuadsAsTriangles(GLStateManager.ctx(), 0, VERTEX_COUNT);
} finally {
- GLStateManager.popStateTo(maskStateDepth);
- GLStateManager.setModelViewMatrix(savedModelView);
+ GLSMAttribStack.popStateTo(maskStateDepth);
+ GLSMMatrices.setModelViewMatrix(savedModelView);
CapturedRenderingState.INSTANCE.setCurrentEntityAndItem(prevEntityId, prevItemId);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture);
- GLStateManager.glActiveTexture(prevUnit);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture);
+ GLSMTextures.glActiveTexture(prevUnit);
}
}
@@ -351,23 +360,23 @@ public final class PlayerReflectionCapture {
private static void ensureVAO(VertexFormat format) {
if (vao != 0) return;
- vbo = GLStateManager.glGenBuffers();
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ vbo = GLSMBuffers.glGenBuffers();
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
format.setupBufferState(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
}
private static void ensureSkin64Texture(int size) {
if (skin64Tex != 0 && skin64Size == size) return;
- if (skin64Tex == 0) skin64Tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex);
+ if (skin64Tex == 0) skin64Tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex);
final ByteBuffer zero = ByteBuffer.allocateDirect(size * size * 4);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zero);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zero);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
skin64Size = size;
skin64Valid = false;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java b/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java
index 86a93897b..1a0f15674 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java
@@ -1,6 +1,13 @@
package com.gtnewhorizons.angelica.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.MatrixHelper;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
import com.gtnewhorizons.angelica.glsm.states.Color4;
@@ -33,22 +40,22 @@ public final class SkippedGlintBlock {
private static void applyExitState(float red, float green, float blue, float alpha, int srcRgb, int dstRgb, int srcAlpha, int dstAlpha, boolean resetTextureMatrix, boolean restoreDepthMask) {
final boolean recording = GLStateManager.isExitCaptureActive();
- final Color4 color = GLStateManager.getColor();
+ final Color4 color = GLSMCurrentAttribs.getColor();
if (recording || color.getRed() != red || color.getGreen() != green || color.getBlue() != blue || color.getAlpha() != alpha) {
- GLStateManager.glColor4f(red, green, blue, alpha);
+ GLSMCurrentAttribs.glColor4f(red, green, blue, alpha);
}
- if (resetTextureMatrix && (recording || !MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0)))) {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ if (resetTextureMatrix && (recording || !MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0)))) {
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
}
- if (recording || GLStateManager.getMatrixMode().getMode() != GL11.GL_MODELVIEW) GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- if (restoreDepthMask && (recording || !GLStateManager.isEffectiveDepthMaskEnabled())) GLStateManager.glDepthMask(true);
- if (recording || !GLStateManager.getLightingState().isEnabled()) GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.getEffectiveBlendState(blend);
- if (recording || GLStateManager.getBlendState().isFuncUnknown() || blend.getSrcRgb() != srcRgb || blend.getDstRgb() != dstRgb || blend.getSrcAlpha() != srcAlpha || blend.getDstAlpha() != dstAlpha) {
- GLStateManager.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ if (recording || GLSMMatrices.getMatrixMode().getMode() != GL11.GL_MODELVIEW) GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ if (restoreDepthMask && (recording || !GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled())) GLSMDepthStencilAlpha.glDepthMask(true);
+ if (recording || !GLSMLighting.getLightingState().isEnabled()) GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMBlend.getEffectiveBlendState(blend);
+ if (recording || GLSMBlend.getBlendState().isFuncUnknown() || blend.getSrcRgb() != srcRgb || blend.getDstRgb() != dstRgb || blend.getSrcAlpha() != srcAlpha || blend.getDstAlpha() != dstAlpha) {
+ GLSMBlend.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha);
}
- if (recording || GLStateManager.isEffectiveBlendEnabled()) GLStateManager.glDisable(GL11.GL_BLEND);
- if (recording || GLStateManager.getDepthState().getFunc() != GL11.GL_LEQUAL) GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ if (recording || GLSMBlend.isEffectiveBlendEnabled()) GLSMEnable.glDisable(GL11.GL_BLEND);
+ if (recording || GLSMDepthStencilAlpha.getDepthState().getFunc() != GL11.GL_LEQUAL) GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java
index 495b3f425..04398fe1c 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java
@@ -2,7 +2,8 @@ package com.gtnewhorizons.angelica.rendering.celeritas;
import com.gtnewhorizons.angelica.AngelicaMod;
import com.gtnewhorizons.angelica.client.rendering.AngelicaFogService;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.rendering.culling.GpuTerrainCuller;
@@ -391,7 +392,7 @@ class AngelicaChunkRenderer extends DefaultChunkRenderer {
return;
}
- final int prevProgram = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM);
+ final int prevProgram = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM);
voxelCompute.use();
deferred.prepareShadowVoxelizationCompute(matrices.modelView());
try {
@@ -399,7 +400,7 @@ class AngelicaChunkRenderer extends DefaultChunkRenderer {
shadowVoxelSink.flush();
} finally {
shadowVoxelSink.discard();
- if (prevProgram != 0) GLStateManager.glUseProgram(prevProgram);
+ if (prevProgram != 0) GLSMPrograms.glUseProgram(prevProgram);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java
index d98575c5e..666f7b691 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.rendering.celeritas;
import com.google.common.collect.ImmutableListMultimap;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.proxy.ClientProxy;
import com.gtnewhorizons.angelica.utils.SpritePadding;
@@ -117,32 +118,32 @@ public class AngelicaRenderPassConfiguration {
@Override
public void setup() {
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(true);
if (alphaCutoff > 0.0f) {
if (alphaStateDepth >= 0) {
- GLStateManager.popStateTo(alphaStateDepth);
+ GLSMAttribStack.popStateTo(alphaStateDepth);
alphaStateDepth = -1;
}
- alphaStateDepth = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, alphaCutoff);
+ alphaStateDepth = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, alphaCutoff);
if (pass == 1) {
- GLStateManager.enableAlphaTest();
+ GLSMDepthStencilAlpha.enableAlphaTest();
}
}
if (disableAlphaTest) {
- GLStateManager.disableAlphaTest();
+ GLSMDepthStencilAlpha.disableAlphaTest();
}
}
@Override
public void clear() {
if (alphaStateDepth >= 0) {
- GLStateManager.popStateTo(alphaStateDepth);
+ GLSMAttribStack.popStateTo(alphaStateDepth);
alphaStateDepth = -1;
}
if (disableAlphaTest) {
- GLStateManager.enableAlphaTest();
+ GLSMDepthStencilAlpha.enableAlphaTest();
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java
index 5cc453f3d..2983e1e8b 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java
@@ -43,7 +43,9 @@ import com.gtnewhorizons.angelica.compat.cubicchunks.CubicChunksAPI;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.dynamiclights.DynamicLights;
import com.gtnewhorizons.angelica.dynamiclights.IDynamicLightWorldRenderer;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.mixins.interfaces.ITileEntityBoundingBoxCache;
@@ -386,7 +388,7 @@ public class CeleritasWorldRenderer extends SimpleWorldRenderer metaCapacityBytes) {
final int newCap = Math.max(needed, Math.max(metaCapacityBytes * 2, SectionMetaBuffer.BYTES_PER_SECTION * INITIAL_META_SECTIONS));
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, newCap, GL15.GL_DYNAMIC_DRAW);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, newCap, GL15.GL_DYNAMIC_DRAW);
metaCapacityBytes = newCap;
}
- GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, metaBytes);
+ GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, metaBytes);
return true;
}
public void uploadFrustum(ByteBuffer frustumUboBytes) {
if (!ready || frustumUboBytes == null) return;
- GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, frustumUboGlId);
- GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0L, frustumUboBytes);
+ GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, frustumUboGlId);
+ GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0L, frustumUboBytes);
}
void beginDispatches(int visibleSsboGlId, int indirectSsboGlId) {
- savedProgram = GLStateManager.getActiveProgram();
+ savedProgram = GLSMPrograms.getActiveProgram();
savedVisibleSsbo = RenderSystem.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, VISIBLE_SSBO_BINDING);
savedMetaSsbo = RenderSystem.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, META_SSBO_BINDING);
savedIndirectSsbo = RenderSystem.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, INDIRECT_SSBO_BINDING);
savedFrustumUbo = RenderSystem.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, FRUSTUM_UBO_BINDING);
- GLStateManager.glUseProgram(program.handle());
+ GLSMPrograms.glUseProgram(program.handle());
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, VISIBLE_SSBO_BINDING, visibleSsboGlId);
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, META_SSBO_BINDING, metaSsboGlId);
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, INDIRECT_SSBO_BINDING, indirectSsboGlId);
@@ -109,22 +110,22 @@ public final class GpuDrivenChunkCuller {
void dispatch(int visibleCount) {
final int groups = (visibleCount + LOCAL_SIZE_X - 1) / LOCAL_SIZE_X;
- GLStateManager.glDispatchCompute(groups, 1, 1);
+ GLSMPrograms.glDispatchCompute(groups, 1, 1);
}
void endDispatches() {
- GLStateManager.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT | GL42.GL_COMMAND_BARRIER_BIT);
+ GLSMBuffers.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT | GL42.GL_COMMAND_BARRIER_BIT);
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, VISIBLE_SSBO_BINDING, savedVisibleSsbo);
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, META_SSBO_BINDING, savedMetaSsbo);
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, INDIRECT_SSBO_BINDING, savedIndirectSsbo);
RenderSystem.bindBufferBase(GL31.GL_UNIFORM_BUFFER, FRUSTUM_UBO_BINDING, savedFrustumUbo);
- GLStateManager.glUseProgram(savedProgram);
+ GLSMPrograms.glUseProgram(savedProgram);
}
public synchronized void shutdown() {
if (program != null) { program.delete(); program = null; }
- if (metaSsboGlId != 0) { GLStateManager.glDeleteBuffers(metaSsboGlId); metaSsboGlId = 0; }
- if (frustumUboGlId != 0) { GLStateManager.glDeleteBuffers(frustumUboGlId); frustumUboGlId = 0; }
+ if (metaSsboGlId != 0) { GLSMBuffers.glDeleteBuffers(metaSsboGlId); metaSsboGlId = 0; }
+ if (frustumUboGlId != 0) { GLSMBuffers.glDeleteBuffers(frustumUboGlId); frustumUboGlId = 0; }
ready = false;
disabled = true;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java b/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java
index c0cdf9280..97dfd916a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.rendering.culling;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.mixins.interfaces.SectionRenderDataStorageRegionAccessor;
@@ -236,7 +237,7 @@ public final class GpuTerrainCuller {
public void endPass() {
if (indirectBufferBound) {
- GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0);
indirectBufferBound = false;
}
currentDrawStart = 0;
@@ -258,8 +259,8 @@ public final class GpuTerrainCuller {
ensureGpuBuffers(totalAppendedEntries);
visibleStagingView.position(0).limit(totalAppendedEntries * ENTRY_BYTES);
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId);
- GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, visibleStagingView);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId);
+ GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, visibleStagingView);
culler.beginDispatches(visibleSsboGlId, indirectSsboGlId);
BackendManager.RENDER_BACKEND.beginComputeDispatchBatch();
@@ -287,14 +288,14 @@ public final class GpuTerrainCuller {
}
private void ensureGpuBuffers(int maxVisible) {
- if (visibleSsboGlId == 0) visibleSsboGlId = GLStateManager.glGenBuffers();
- if (indirectSsboGlId == 0) indirectSsboGlId = GLStateManager.glGenBuffers();
+ if (visibleSsboGlId == 0) visibleSsboGlId = GLSMBuffers.glGenBuffers();
+ if (indirectSsboGlId == 0) indirectSsboGlId = GLSMBuffers.glGenBuffers();
if (maxVisible <= gpuCapacityEntries) return;
final int newCap = Math.max(maxVisible, Math.max(gpuCapacityEntries * 2, 64));
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId);
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * ENTRY_BYTES, GL15.GL_STREAM_DRAW);
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, indirectSsboGlId);
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * GpuDrivenChunkCuller.FACINGS_PER_SECTION * GpuDrivenChunkCuller.INDIRECT_COMMAND_BYTES, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * ENTRY_BYTES, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, indirectSsboGlId);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * GpuDrivenChunkCuller.FACINGS_PER_SECTION * GpuDrivenChunkCuller.INDIRECT_COMMAND_BYTES, GL15.GL_STREAM_DRAW);
gpuCapacityEntries = newCap;
}
@@ -624,19 +625,19 @@ public final class GpuTerrainCuller {
}
if (!indirectBufferBound) {
- GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectSsboGlId);
+ GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectSsboGlId);
indirectBufferBound = true;
}
final long offsetBytes = (long) drawStart * GpuDrivenChunkCuller.INDIRECT_COMMAND_BYTES;
try (DrawCommandList ignored = commandList.beginTessellating(tessellation)) {
- GLStateManager.glMultiDrawElementsIndirect(primitiveType.getId(), GL11.GL_UNSIGNED_INT, offsetBytes, drawCount, 0);
+ GLSMDraws.glMultiDrawElementsIndirect(primitiveType.getId(), GL11.GL_UNSIGNED_INT, offsetBytes, drawCount, 0);
}
}
public void delete() {
if (indirectBufferBound) {
- GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0);
indirectBufferBound = false;
}
if (visibleStaging != null) {
@@ -646,11 +647,11 @@ public final class GpuTerrainCuller {
stagingCapacityEntries = 0;
}
if (visibleSsboGlId != 0) {
- GLStateManager.glDeleteBuffers(visibleSsboGlId);
+ GLSMBuffers.glDeleteBuffers(visibleSsboGlId);
visibleSsboGlId = 0;
}
if (indirectSsboGlId != 0) {
- GLStateManager.glDeleteBuffers(indirectSsboGlId);
+ GLSMBuffers.glDeleteBuffers(indirectSsboGlId);
indirectSsboGlId = 0;
}
gpuCapacityEntries = 0;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java
index c46b380ed..25bdb544d 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.rendering.items;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
@@ -49,15 +49,15 @@ public class BlockRenderListManager {
public static int callOrStartCompiling(int cached) {
if (cached != 0) {
- GLStateManager.glCallList(cached);
+ GLSMDraws.glCallList(cached);
return -1;
}
return startCompiling();
}
private static int startCompiling() {
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
return list;
}
@@ -65,25 +65,25 @@ public class BlockRenderListManager {
if (list <= 0) return;
finishCompiling();
displayListMap.put(new BlockMeta(block, meta), list);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
}
public static void endItemFrameCompiling(int list, int variant) {
if (list <= 0) return;
finishCompiling();
itemFrameDisplayLists[variant] = list;
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
}
public static void abortCompiling(int list) {
if (list <= 0) return;
finishCompiling();
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
private static void finishCompiling() {
DisplayListManager.discardMatrixTransforms();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
public static void registerReloadListener(){
@@ -91,12 +91,12 @@ public class BlockRenderListManager {
.getResourceManager();
resourceManager.registerReloadListener(_ -> {
for (int list : displayListMap.values()) {
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
displayListMap.clear();
for (int i = 0; i < itemFrameDisplayLists.length; i++) {
if (itemFrameDisplayLists[i] != 0) {
- GLStateManager.glDeleteLists(itemFrameDisplayLists[i], 1);
+ GLSMDraws.glDeleteLists(itemFrameDisplayLists[i], 1);
itemFrameDisplayLists[i] = 0;
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java
index fec4eff21..7e99a3375 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java
@@ -4,6 +4,9 @@ import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.Color4;
import com.gtnewhorizons.angelica.rendering.items.BlockRenderListManager.BlockMeta;
@@ -122,7 +125,7 @@ public final class DroppedItemInstancer {
}
static long batchIcon(TesrMaterial material, boolean afterGlint, float maxU, float minV, float minU, float maxV, int width, int height, float thickness) {
- final long drawsBefore = GLStateManager.drawCalls;
+ final long drawsBefore = GLSMDraws.drawCalls;
if (BatchEligibility.batchingAllowed()) {
final TemplateBuffer template = iconTemplate(maxU, minV, minU, maxV, width, height, thickness);
if (template == null) {
@@ -154,7 +157,7 @@ public final class DroppedItemInstancer {
BatchEligibility.onPartQueued();
return SKIP;
}
- final long drawsBefore = GLStateManager.drawCalls;
+ final long drawsBefore = GLSMDraws.drawCalls;
if (allowed) {
currentGlintProperties.set(maxU, minV, minU, maxV, width, height, thickness);
if (glintSeen && glintProperties.equals(currentGlintProperties) && ModelPartBatcher.INSTANCE.replayGlint(glintCapture)) {
@@ -211,9 +214,9 @@ public final class DroppedItemInstancer {
public static long directBlock(RenderBlocks rb, Block block, int meta, float brightness) {
if (itemsDrawingBlocks != 0 || !ModelPartBatcher.INSTANCE.entitiesActive()) return RUN;
- if (!BatchEligibility.batchingAllowed()) return GLStateManager.drawCalls;
+ if (!BatchEligibility.batchingAllowed()) return GLSMDraws.drawCalls;
final TesrMaterial material = EntityMaterials.itemFromCurrentState(false);
- return material != null ? batchBlock(material, rb, block, meta, brightness) : GLStateManager.drawCalls;
+ return material != null ? batchBlock(material, rb, block, meta, brightness) : GLSMDraws.drawCalls;
}
private static long itemBlock(ItemStack stack, RenderBlocks rb, Block block, int meta, float brightness, boolean unfilteredAtlas) {
@@ -231,13 +234,13 @@ public final class DroppedItemInstancer {
}
static long batchBlock(TesrMaterial material, RenderBlocks rb, Block block, int meta, float brightness) {
- final long drawsBefore = GLStateManager.drawCalls;
+ final long drawsBefore = GLSMDraws.drawCalls;
if (BatchEligibility.batchingAllowed()) {
BlockMesh mesh = lookupBlock(block, meta);
if (mesh == null) {
mesh = captureBlock(rb, block, meta, brightness);
} else if (mesh.template() != null) {
- GLStateManager.glColor4f(mesh.red(), mesh.green(), mesh.blue(), mesh.alpha());
+ GLSMCurrentAttribs.glColor4f(mesh.red(), mesh.green(), mesh.blue(), mesh.alpha());
}
if (mesh.template() == null) {
fallback++;
@@ -260,7 +263,7 @@ public final class DroppedItemInstancer {
public static void endPart(long part) {
if (part >= 0L) {
- BatchEligibility.onPartFallback(part, GLStateManager.drawCalls);
+ BatchEligibility.onPartFallback(part, GLSMDraws.drawCalls);
}
}
@@ -317,7 +320,7 @@ public final class DroppedItemInstancer {
}
final TemplateBuffer template;
final AnimationsRenderUtils.SpriteCapture sprites = AnimationsRenderUtils.captureSprites();
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
try {
blockBackend.begin();
try {
@@ -326,10 +329,10 @@ public final class DroppedItemInstancer {
template = blockBackend.end();
}
} finally {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
sprites.close();
}
- final Color4 color = GLStateManager.getColor();
+ final Color4 color = GLSMCurrentAttribs.getColor();
final BlockMesh mesh = new BlockMesh(template, color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha(), sprites);
blocks.put(new BlockMeta(block, meta), mesh);
return mesh;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java
index 0a5dc99c9..2f6b86e61 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.rendering.items;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.CombinedGlint;
import com.gtnewhorizons.angelica.rendering.GlintClock;
@@ -39,8 +41,8 @@ public final class ItemGlint {
}
public static boolean canResetStencil() {
- if (!GLStateManager.getStencilTest().isEnabled()) return true;
- final var stencil = GLStateManager.getStencilState();
+ if (!GLSMDepthStencilAlpha.getStencilTest().isEnabled()) return true;
+ final var stencil = GLSMDepthStencilAlpha.getStencilState();
return stencil.getFuncFront() == GL11.GL_ALWAYS && stencil.getFuncBack() == GL11.GL_ALWAYS && stencil.getFailOpFront() == GL11.GL_KEEP && stencil.getFailOpBack() == GL11.GL_KEEP && stencil.getZFailOpFront() == GL11.GL_KEEP
&& stencil.getZFailOpBack() == GL11.GL_KEEP && stencil.getZPassOpFront() == GL11.GL_KEEP && stencil.getZPassOpBack() == GL11.GL_KEEP;
}
@@ -53,8 +55,8 @@ public final class ItemGlint {
if (!eligible()) return false;
final var mc = Minecraft.getMinecraft();
final var texture = mc.getTextureManager().getTexture(TEXTURE);
- if (texture == null || texture.getGlTextureId() != GLStateManager.getTextures().getTextureUnitBindings(0).getBinding()) return false;
- return firstMatrix().equals(GLStateManager.getTextures().getTextureUnitMatrix(0), 0.000001f) && CombinedGlint.begin(secondMatrix());
+ if (texture == null || texture.getGlTextureId() != GLSMTextures.getTextures().getTextureUnitBindings(0).getBinding()) return false;
+ return firstMatrix().equals(GLSMTextures.getTextures().getTextureUnitMatrix(0), 0.000001f) && CombinedGlint.begin(secondMatrix());
}
public static ResourceLocation texture() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java
index a749a5302..08e448085 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java
@@ -33,7 +33,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vao.VAOManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
@@ -121,19 +122,19 @@ public class ItemRenderListManager {
final boolean firstAttach = extVbo == 0;
if (firstAttach) {
- extVbo = GLStateManager.glGenBuffers();
+ extVbo = GLSMBuffers.glGenBuffers();
}
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
ext.position(0).limit(vertexCount * extStride);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
memFree(ext);
if (firstAttach) {
vertexBuffer.bind();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, extStride);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
vertexBuffer.unbind();
}
}
@@ -141,10 +142,10 @@ public class ItemRenderListManager {
private void detachExtAttribs() {
if (extVbo == 0) return;
vertexBuffer.bind();
- GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX);
- GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT);
+ GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX);
+ GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT);
vertexBuffer.unbind();
- GLStateManager.glDeleteBuffers(extVbo);
+ GLSMBuffers.glDeleteBuffers(extVbo);
extVbo = 0;
}
@@ -156,7 +157,7 @@ public class ItemRenderListManager {
vertexBuffer.delete();
// EBO gets deleted by vertexBuffer.delete()
if (extVbo != 0) {
- GLStateManager.glDeleteBuffers(extVbo);
+ GLSMBuffers.glDeleteBuffers(extVbo);
extVbo = 0;
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java
index 660637aaa..d8d7d81c8 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.rendering.particles;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.ITextureObject;
@@ -55,10 +55,10 @@ public final class BopParticleDescriptors {
final TextureManager manager = Minecraft.getMinecraft().getTextureManager();
ITextureObject texture = manager.getTexture(PIXIE_TRAIL_TEXTURE);
if (texture == null) {
- final int previous = GLStateManager.getBoundTextureForServerState();
+ final int previous = GLSMTextures.getBoundTextureForServerState();
manager.bindTexture(PIXIE_TRAIL_TEXTURE);
texture = manager.getTexture(PIXIE_TRAIL_TEXTURE);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previous);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previous);
}
id = texture == null ? 0 : texture.getGlTextureId();
if (id == 0) LOG.warn("Pixie trail texture {} is unavailable; those particles will not draw", PIXIE_TRAIL_TEXTURE);
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java
index 39e771140..44fa81d11 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.rendering.particles;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.minecraft.client.renderer.Tessellator;
import org.joml.Matrix4fc;
import org.lwjgl.opengl.GL11;
@@ -141,7 +141,7 @@ public final class ParticleCaptureTessellator extends Tessellator {
}
boolean overflow = !uvSet || closed || captured == MAX_VERTICES;
if (!overflow && captured == 0) {
- if (GLStateManager.getModelViewMatrix().equals(layerModelView)) state.sample();
+ if (GLSMMatrices.getModelViewMatrix().equals(layerModelView)) state.sample();
else overflow = true;
}
if (overflow) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java
index 847ef04ef..3c7899a1e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java
@@ -2,7 +2,12 @@ package com.gtnewhorizons.angelica.rendering.particles;
import com.gtnewhorizons.angelica.rendering.RenderFailures;
import com.gtnewhorizons.angelica.client.rendering.DeferredDrawBatcher;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
@@ -105,7 +110,7 @@ public final class ParticleInstancer {
if (available()) {
layerActive = true;
groupCount = 0;
- LAYER_MV.set(GLStateManager.getModelViewMatrix());
+ LAYER_MV.set(GLSMMatrices.getModelViewMatrix());
} else {
deferred = null;
DeferredDrawBatcher.enter();
@@ -181,7 +186,7 @@ public final class ParticleInstancer {
Throwable failure = null;
try {
if (groupCount > 0) {
- restoreDepth = GLStateManager.pushState(StateSet.BATCH);
+ restoreDepth = GLSMAttribStack.pushState(StateSet.BATCH);
for (int i = 0; i < groupCount; i++) {
final Group group = GROUP_POOL.get(i);
if (!group.translucent) flush(group);
@@ -196,7 +201,7 @@ public final class ParticleInstancer {
} finally {
if (restoreDepth >= 0) {
try {
- GLStateManager.popStateTo(restoreDepth);
+ GLSMAttribStack.popStateTo(restoreDepth);
} catch (Throwable t) {
failure = RenderFailures.suppress(failure, t);
} finally {
@@ -304,28 +309,28 @@ public final class ParticleInstancer {
if (extHandler != null && extHandler.wantsExtended()) {
FfpExtendedAttribs.setNeutralCurrentValues();
}
- GLStateManager.glBindVertexArray(ParticleQuadMesh.vao());
+ GLSMVertexInput.glBindVertexArray(ParticleQuadMesh.vao());
VAOManager.setCurrentVertexFlags(ParticleQuadMesh.VERTEX_FLAGS);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring().bufferId());
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring().bufferId());
ParticleInstancedAttribs.pointInstanceAttribs(base);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
try {
- if (ffp) GLStateManager.setFfpInstancing(Instancing.PARTICLE);
- GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, count);
+ if (ffp) GLSMPrograms.setFfpInstancing(Instancing.PARTICLE);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, count);
draws++;
} finally {
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
}
}
private static void drawInstancesCpu(ParticleRenderState state, ByteBuffer list, int count, boolean listTranslucent) {
final Tessellator t = run;
- GLStateManager.popStateTo(restoreDepth);
+ GLSMAttribStack.popStateTo(restoreDepth);
GbufferPrograms.setTranslucencyDeclaration(ParticleRunSplitter.currentRunTranslucent());
t.draw();
t.startDrawingQuads();
- restoreDepth = GLStateManager.pushState(StateSet.BATCH);
+ restoreDepth = GLSMAttribStack.pushState(StateSet.BATCH);
GbufferPrograms.setTranslucencyDeclaration(listTranslucent);
state.apply();
for (int i = 0; i < count; i++) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java
index bd8e5ef74..690bb7b95 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.rendering.particles;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
import org.lwjgl.opengl.GL11;
@@ -17,14 +20,14 @@ public final class ParticleRenderState {
public boolean depthMask;
public void sample() {
- texture = GLStateManager.getBoundTextureForServerState();
- blend = GLStateManager.isEffectiveBlendEnabled();
- GLStateManager.getEffectiveBlendState(scratch);
+ texture = GLSMTextures.getBoundTextureForServerState();
+ blend = GLSMBlend.isEffectiveBlendEnabled();
+ GLSMBlend.getEffectiveBlendState(scratch);
blendSrc = scratch.getSrcRgb();
blendDst = scratch.getDstRgb();
blendSrcAlpha = scratch.getSrcAlpha();
blendDstAlpha = scratch.getDstAlpha();
- depthMask = GLStateManager.isEffectiveDepthMaskEnabled();
+ depthMask = GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled();
}
public void set(ParticleRenderState other) {
@@ -42,13 +45,13 @@ public final class ParticleRenderState {
}
public void apply() {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
if (blend) {
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFuncSeparate(blendSrc, blendDst, blendSrcAlpha, blendDstAlpha);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFuncSeparate(blendSrc, blendDst, blendSrcAlpha, blendDstAlpha);
} else {
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
}
- GLStateManager.glDepthMask(depthMask);
+ GLSMDepthStencilAlpha.glDepthMask(depthMask);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java
index 59449f272..f963cfc9e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java
@@ -5,7 +5,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.ColorABGR;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.client.rendering.ModelViewDelta;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.gtnewhorizons.angelica.glsm.states.Color4;
import net.minecraft.client.renderer.Tessellator;
import org.joml.Matrix4f;
@@ -53,7 +53,7 @@ public final class BakedTransformCapture extends DirectTessellator {
@Override
public int draw() {
- final Color4 color = GLStateManager.getColor();
+ final Color4 color = GLSMCurrentAttribs.getColor();
final int packed = ColorABGR.pack(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
if (!sawRun) {
sawRun = true;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java
index 0055533c6..ec72b3cc3 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java
@@ -1,7 +1,10 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizon.gtnhlib.client.renderer.MatrixHelper;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.hooks.TextureUtilHooks;
import net.coderbot.iris.gl.blending.DepthColorStorage;
import net.coderbot.iris.gl.program.Program;
@@ -22,31 +25,31 @@ public final class BatchDrawDefaults {
private boolean overridesCleared;
public static void capturePassFramebuffer() {
- passFramebuffer = GLStateManager.getDrawFramebuffer();
+ passFramebuffer = GLSMFramebuffer.getDrawFramebuffer();
}
public static boolean drawsToPassFramebuffer() {
return passFramebuffer < 0 || TesrBatchRenderer.deferredPipeline() != null
- || GLStateManager.getDrawFramebuffer() == passFramebuffer;
+ || GLSMFramebuffer.getDrawFramebuffer() == passFramebuffer;
}
public void apply() {
if (passFramebuffer >= 0 && TesrBatchRenderer.deferredPipeline() == null) {
- final int framebuffer = GLStateManager.getDrawFramebuffer();
+ final int framebuffer = GLSMFramebuffer.getDrawFramebuffer();
if (framebuffer != passFramebuffer) {
callerFramebuffer = framebuffer;
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, passFramebuffer);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, passFramebuffer);
}
}
- final int program = GLStateManager.getActiveProgram();
+ final int program = GLSMPrograms.getActiveProgram();
if (program != 0 && !Program.isManagedBind(program) && !DepthColorStorage.isOwnedProgram(program)) {
callerProgram = program;
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
}
- final Matrix4f textureMatrix = GLStateManager.getTextures().getTextureUnitMatrix(0);
+ final Matrix4f textureMatrix = GLSMTextures.getTextures().getTextureUnitMatrix(0);
if (!MatrixHelper.isIdentity(textureMatrix)) {
callerTextureMatrix.set(textureMatrix);
- GLStateManager.setTextureMatrix(0, IDENTITY);
+ GLSMMatrices.setTextureMatrix(0, IDENTITY);
textureMatrixReset = true;
}
filterPaused = TextureUtilHooks.pauseTemporaryFilter();
@@ -68,17 +71,17 @@ public final class BatchDrawDefaults {
}
if (textureMatrixReset) {
textureMatrixReset = false;
- GLStateManager.setTextureMatrix(0, callerTextureMatrix);
+ GLSMMatrices.setTextureMatrix(0, callerTextureMatrix);
}
if (callerProgram != 0) {
final int program = callerProgram;
callerProgram = 0;
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
}
if (callerFramebuffer >= 0) {
final int framebuffer = callerFramebuffer;
callerFramebuffer = -1;
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer);
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java
index 12d0ae72e..498a11239 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java
@@ -1,5 +1,8 @@
package com.gtnewhorizons.angelica.rendering.tesr;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
import org.lwjgl.opengl.GL11;
@@ -22,18 +25,18 @@ final class BatchStateFallback {
GLStateManager.warnOnce("batch-fallback-entities:" + inside, "Uncaptured state change {} a renderer flushed the entity batch early",
inside ? "inside" : "between", new Throwable());
}
- final int mode = GLStateManager.getMatrixMode().getMode();
- final int unit = GLStateManager.getActiveTextureUnit();
+ final int mode = GLSMMatrices.getMatrixMode().getMode();
+ final int unit = GLSMTextures.getActiveTextureUnit();
BatchEligibility.onUncapturedState();
- final long before = GLStateManager.drawCalls;
+ final long before = GLSMDraws.drawCalls;
try {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
models.flushForStateChange();
tesrs.flushForStateChange();
} finally {
- GLStateManager.glMatrixMode(mode);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
- BatchEligibility.onBatchFlushed(GLStateManager.drawCalls - before);
+ GLSMMatrices.glMatrixMode(mode);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ BatchEligibility.onBatchFlushed(GLSMDraws.drawCalls - before);
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java
index 5cd6cbcb5..0991d808f 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java
@@ -3,7 +3,9 @@ package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrMeshBuilder;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.tileentity.TileEntityBeacon;
@@ -66,7 +68,7 @@ public final class BeaconBeamMeshes {
public static boolean render(TileEntityBeacon beacon, double x, double y, double z, float partialTicks) {
final float f1 = beacon.func_146002_i();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
if (f1 <= 0.0f) {
return true;
}
@@ -75,33 +77,33 @@ public final class BeaconBeamMeshes {
}
Minecraft.getMinecraft().getTextureManager().bindTexture(BEACON_TEXTURE);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
final float f2 = (float) beacon.getWorldObj().getTotalWorldTime() + partialTicks;
final float f3 = -f2 * 0.2f - MathHelper.floor_float(-f2 * 0.1f);
final double d3 = f2 * 0.025 * -1.5;
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(0f, f3 - 1f, 0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(0f, f3 - 1f, 0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
try {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslated(x + 0.5, y, z + 0.5);
- GLStateManager.glRotatef((float) -Math.toDegrees(d3), 0f, 1f, 0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslated(x + 0.5, y, z + 0.5);
+ GLSMMatrices.glRotatef((float) -Math.toDegrees(d3), 0f, 1f, 0f);
AngelicaTesrMeshCache.INSTANCE.renderCached(INNER_KEY, INNER_BUILDER);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslated(x + 0.5, y, z + 0.5);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslated(x + 0.5, y, z + 0.5);
AngelicaTesrMeshCache.INSTANCE.renderCached(OUTER_KEY, OUTER_BUILDER);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
} finally {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
return true;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java
index eac5c9f5b..5882c545a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java
@@ -1,7 +1,12 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.states.PolygonState;
import it.unimi.dsi.fastutil.Hash;
import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
@@ -105,8 +110,8 @@ public final class DrawState {
}
public static int liveCull() {
- final PolygonState polygon = GLStateManager.getPolygonState();
- final int cull = packCull(GLStateManager.getCullState().isEnabled(), polygon.getCullFaceMode());
+ final PolygonState polygon = GLSMRasterizer.getPolygonState();
+ final int cull = packCull(GLSMRasterizer.getCullState().isEnabled(), polygon.getCullFaceMode());
return cull != DISABLED && polygon.getFrontFace() == GL11.GL_CW ? cull | FRONT_FACE_CLOCKWISE : cull;
}
@@ -115,76 +120,76 @@ public final class DrawState {
}
public static boolean liveLit(TesrMaterial material) {
- return GLStateManager.getLightingState().isEnabled() && !material.isUnlit();
+ return GLSMLighting.getLightingState().isEnabled() && !material.isUnlit();
}
public static boolean liveLightmap() {
- return GLStateManager.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).isEnabled();
+ return GLSMTextures.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).isEnabled();
}
public void apply() {
switch (blend) {
case TRANSLUCENT -> {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
}
case ADDITIVE -> {
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
}
case ADDITIVE_ALPHA -> {
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
}
case GLINT -> {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE);
}
- default -> GLStateManager.disableBlend();
+ default -> GLSMBlend.disableBlend();
}
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(depthEqual ? GL11.GL_EQUAL : GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(depthWrite);
- GLStateManager.glColorMask(colorWrite, colorWrite, colorWrite, colorWrite);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(depthEqual ? GL11.GL_EQUAL : GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(depthWrite);
+ GLSMBlend.glColorMask(colorWrite, colorWrite, colorWrite, colorWrite);
if (alphaCutoff > 0.0f) {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, alphaCutoff);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, alphaCutoff);
} else {
- GLStateManager.disableAlphaTest();
+ GLSMDepthStencilAlpha.disableAlphaTest();
}
if (lit) {
- GLStateManager.enableLighting();
+ GLSMLighting.enableLighting();
} else {
- GLStateManager.disableLighting();
+ GLSMLighting.disableLighting();
}
- GLStateManager.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).setEnabled(lightmap);
+ GLSMTextures.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).setEnabled(lightmap);
switch (cull & CULL_FACE_MASK) {
case CULL_BACK -> {
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
}
case CULL_FRONT -> {
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
}
case CULL_BOTH -> {
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT_AND_BACK);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT_AND_BACK);
}
- default -> GLStateManager.disableCull();
+ default -> GLSMRasterizer.disableCull();
}
- GLStateManager.glFrontFace((cull & FRONT_FACE_CLOCKWISE) != 0 ? GL11.GL_CW : GL11.GL_CCW);
+ GLSMRasterizer.glFrontFace((cull & FRONT_FACE_CLOCKWISE) != 0 ? GL11.GL_CW : GL11.GL_CCW);
if (offsetFactor != 0.0f || offsetUnits != 0.0f) {
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(offsetFactor, offsetUnits);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(offsetFactor, offsetUnits);
} else {
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java
index 2abcdc64c..d01576809 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.AlphaState;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
@@ -45,26 +48,26 @@ public final class EntityMaterials {
static TesrMaterial fromCurrentState(boolean texIdentity) {
GLStateManager.requireExitDrawState(true);
- final boolean textured = GLStateManager.getTextures().getTextureUnitStates(0).isEnabled();
- final AlphaState alpha = GLStateManager.getEffectiveAlphaState(effectiveAlpha);
- final ColorMask colorMask = GLStateManager.getEffectiveColorMask(effectiveColorMask);
+ final boolean textured = GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled();
+ final AlphaState alpha = GLSMDepthStencilAlpha.getEffectiveAlphaState(effectiveAlpha);
+ final ColorMask colorMask = GLSMBlend.getEffectiveColorMask(effectiveColorMask);
if (!colorMask.red && !colorMask.green && !colorMask.blue && !colorMask.alpha) {
- return depthOnlyFromState(textured, GLStateManager.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(),
- GLStateManager.getDepthState().getFunc(), GLStateManager.isEffectiveDepthMaskEnabled());
+ return depthOnlyFromState(textured, GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(),
+ GLSMDepthStencilAlpha.getDepthState().getFunc(), GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled());
}
- final BlendState blend = GLStateManager.getEffectiveBlendState(effectiveBlend);
- return fromState(textured, textured && !texIdentity, GLStateManager.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(),
- GLStateManager.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLStateManager.getDepthState().getFunc(),
- GLStateManager.isEffectiveDepthMaskEnabled());
+ final BlendState blend = GLSMBlend.getEffectiveBlendState(effectiveBlend);
+ return fromState(textured, textured && !texIdentity, GLSMBlend.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(),
+ GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLSMDepthStencilAlpha.getDepthState().getFunc(),
+ GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled());
}
public static TesrMaterial itemFromCurrentState(boolean unfilteredAtlas) {
GLStateManager.requireExitDrawState(true);
- final BlendState blend = GLStateManager.getEffectiveBlendState(effectiveBlend);
- final AlphaState alpha = GLStateManager.getEffectiveAlphaState(effectiveAlpha);
- return itemFromState(unfilteredAtlas, GLStateManager.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(),
- GLStateManager.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLStateManager.getDepthState().getFunc(),
- GLStateManager.isEffectiveDepthMaskEnabled());
+ final BlendState blend = GLSMBlend.getEffectiveBlendState(effectiveBlend);
+ final AlphaState alpha = GLSMDepthStencilAlpha.getEffectiveAlphaState(effectiveAlpha);
+ return itemFromState(unfilteredAtlas, GLSMBlend.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(),
+ GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLSMDepthStencilAlpha.getDepthState().getFunc(),
+ GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled());
}
static TesrMaterial itemFromState(boolean unfilteredAtlas, boolean blend, int srcRgb, int dstRgb, boolean alphaTest, int alphaFunc, float alphaRef, int depthFunc, boolean depthMask) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java
index 572a4cef2..796d1e419 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java
@@ -2,7 +2,11 @@ package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizon.gtnhlib.client.renderer.cel.util.ModelQuadUtil;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
import com.gtnewhorizons.angelica.shadercompat.ShaderGlint;
import net.coderbot.batchedentityrendering.impl.AngelicaBufferSource;
@@ -103,10 +107,10 @@ final class EntityShadowBatcher {
}
}
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDepthMask(true);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthMask(true);
return true;
}
@@ -136,10 +140,10 @@ final class EntityShadowBatcher {
}
private int currentMvIndex() {
- final int mvGen = GLStateManager.getMvGeneration();
+ final int mvGen = GLSMMatrices.getMvGeneration();
if (mvCount > 0 && mvGen == lastMvGeneration) return mvCount - 1;
lastMvGeneration = mvGen;
- mvScratch.set(GLStateManager.getModelViewMatrix());
+ mvScratch.set(GLSMMatrices.getModelViewMatrix());
if (mvCount > 0 && mvs[mvCount - 1].equals(mvScratch)) return mvCount - 1;
if (mvCount == mvs.length) mvs = Arrays.copyOf(mvs, mvs.length * 2);
Matrix4f slot = mvs[mvCount];
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java
index d909ce4b7..7ba1f01d7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java
@@ -5,6 +5,9 @@ import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.config.SystemProperties;
import com.gtnewhorizons.angelica.glsm.ExitState;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.rendering.DeferredEntityOverlay;
@@ -94,7 +97,7 @@ public final class EntityShadowReplay {
static void beginPass(boolean shadow, int renderPass) {
if (shadow) {
resetRecords();
- shadowInverse.set(GLStateManager.getModelViewMatrix()).invert();
+ shadowInverse.set(GLSMMatrices.getModelViewMatrix()).invert();
shadowViewValid = shadowInverse.isFinite();
shadowX = RenderManager.renderPosX;
shadowY = RenderManager.renderPosY;
@@ -104,7 +107,7 @@ public final class EntityShadowReplay {
} else {
mainReady = shadowAvailable && renderPass == 0;
if (mainReady) {
- mainFromShadow.set(GLStateManager.getModelViewMatrix()).translate(
+ mainFromShadow.set(GLSMMatrices.getModelViewMatrix()).translate(
(float) (shadowX - RenderManager.renderPosX), (float) (shadowY - RenderManager.renderPosY),
(float) (shadowZ - RenderManager.renderPosZ)).mul(shadowInverse);
}
@@ -135,7 +138,7 @@ public final class EntityShadowReplay {
recording = record;
record.capturingState = true;
GLStateManager.beginExitCapture(record.exitState);
- drawsAtStart = GLStateManager.drawCalls;
+ drawsAtStart = GLSMDraws.drawCalls;
return true;
}
@@ -145,7 +148,7 @@ public final class EntityShadowReplay {
recording.capturingState = false;
if (!GLStateManager.finishExitCapture(recording.exitState)) reject(Rejection.EXIT_STATE_UNSUPPORTED);
}
- if (GLStateManager.drawCalls != drawsAtStart) reject(Rejection.FOREIGN_DRAW);
+ if (GLSMDraws.drawCalls != drawsAtStart) reject(Rejection.FOREIGN_DRAW);
if (recording.renderer == null) reject(Rejection.UNSAFE_RENDERER);
if (!completed) reject(Rejection.RENDER_FAILED);
if (recording.entity instanceof IBossDisplayData && (!recording.hasBossStatus || bossStatusChanged())) {
@@ -215,7 +218,7 @@ public final class EntityShadowReplay {
else if (record.partialTicks != partialTicks) reason = Rejection.PARTIAL_TICKS_CHANGED;
else if (shadowYaw != RenderManager.instance.playerViewY || shadowPitch != RenderManager.instance.playerViewX) reason = Rejection.VIEW_CHANGED;
else if (!GLStateManager.canApplyExitState(record.exitState)) reason = Rejection.ENTRY_STATE_CHANGED;
- else if (GLStateManager.getPolygonState().getOffsetClamp() != 0) reason = Rejection.UNCAPTURED_STATE;
+ else if (GLSMRasterizer.getPolygonState().getOffsetClamp() != 0) reason = Rejection.UNCAPTURED_STATE;
}
if (reason == null) {
reason = commands.validate(record.start, record.end);
@@ -274,7 +277,7 @@ public final class EntityShadowReplay {
}
private static boolean captureInheritedState(DrawInputs inputs) {
- if (GLStateManager.getPolygonState().getOffsetClamp() != 0) reject(Rejection.UNCAPTURED_STATE);
+ if (GLSMRasterizer.getPolygonState().getOffsetClamp() != 0) reject(Rejection.UNCAPTURED_STATE);
if (!isRecording()) return false;
final int offsetWrites = GLStateManager.getExitPolygonOffsetWrites();
inputs.inheritedOffsetEnable = (offsetWrites & ExitState.POLYGON_OFFSET_ENABLE_WRITTEN) == 0;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java
index 2a5190e6c..a6b4ace55 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.rendering.tesr;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
@@ -246,20 +249,20 @@ public final class EntityTextureAtlas {
private Page newPage() {
if (pages.size() == MAX_PAGES) return null;
- final int previous = GLStateManager.getBoundTextureForServerState();
+ final int previous = GLSMTextures.getBoundTextureForServerState();
final int texture;
BatchStateGuard.suspend();
try {
- texture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, PAGE_SIZE, PAGE_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, PAGE_SIZE, PAGE_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previous);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previous);
BatchStateGuard.resume();
}
final ResourceLocation location = new ResourceLocation("angelica", "entity_atlas_" + pages.size());
@@ -270,22 +273,22 @@ public final class EntityTextureAtlas {
}
private void copy(int texture, Slot slot) {
- final int previousRead = GLStateManager.getReadFramebuffer();
- final int previousDraw = GLStateManager.getDrawFramebuffer();
- final boolean scissor = GLStateManager.getScissorTest().isEnabled();
+ final int previousRead = GLSMFramebuffer.getReadFramebuffer();
+ final int previousDraw = GLSMFramebuffer.getDrawFramebuffer();
+ final boolean scissor = GLSMRasterizer.getScissorTest().isEnabled();
BatchStateGuard.suspend();
try {
if (readFbo == 0) {
- readFbo = GLStateManager.glGenFramebuffers();
- drawFbo = GLStateManager.glGenFramebuffers();
+ readFbo = GLSMFramebuffer.glGenFramebuffers();
+ drawFbo = GLSMFramebuffer.glGenFramebuffers();
}
- if (scissor) GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
- GLStateManager.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, texture);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
+ if (scissor) GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo);
+ GLSMFramebuffer.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, texture);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo);
assert slot.page != null;
if (drawFboPage != slot.page.texture) {
- GLStateManager.glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, slot.page.texture, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, slot.page.texture, 0);
drawFboPage = slot.page.texture;
}
final int w = slot.width, h = slot.height, x = slot.x + 1, y = slot.y + 1;
@@ -295,16 +298,16 @@ public final class EntityTextureAtlas {
for (int col = 0; col < 3; col++) blit(fromX[col], fromY[row], widths[col], heights[row], toX[col], toY[row]);
}
} finally {
- GLStateManager.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, 0);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, previousRead);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, previousDraw);
- if (scissor) GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMFramebuffer.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, previousRead);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, previousDraw);
+ if (scissor) GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
BatchStateGuard.resume();
}
}
private static void blit(int srcX, int srcY, int width, int height, int dstX, int dstY) {
- GLStateManager.glBlitFramebuffer(srcX, srcY, srcX + width, srcY + height, dstX, dstY, dstX + width, dstY + height, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMFramebuffer.glBlitFramebuffer(srcX, srcY, srcX + width, srcY + height, dstX, dstY, dstX + width, dstY + height, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST);
}
public void clear() {
@@ -320,11 +323,11 @@ public final class EntityTextureAtlas {
void freePages() {
if (pages.isEmpty() && readFbo == 0) return;
clear();
- for (Page page : pages) GLStateManager.glDeleteTextures(page.texture);
+ for (Page page : pages) GLSMTextures.glDeleteTextures(page.texture);
pages.clear();
if (readFbo != 0) {
- GLStateManager.glDeleteFramebuffers(readFbo);
- GLStateManager.glDeleteFramebuffers(drawFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(readFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(drawFbo);
readFbo = 0;
drawFbo = 0;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java
index 767532b9e..68427e949 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java
@@ -1,6 +1,11 @@
package com.gtnewhorizons.angelica.rendering.tesr;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.ffp.FragmentKey;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
@@ -57,15 +62,15 @@ public final class GlintCapture {
boolean begin(RetainedTesrGroups groups) {
if (!open(groups)) return false;
- parent.set(GLStateManager.getModelViewMatrix());
- texture = GLStateManager.getBoundTextureForServerState();
+ parent.set(GLSMMatrices.getModelViewMatrix());
+ texture = GLSMTextures.getBoundTextureForServerState();
color = currentColor();
light = GLSMConfig.packedLastBrightness();
fragmentLength = FragmentKey.packFromState(fragment);
- GLStateManager.getEffectiveBlendState(blend);
- blendEnabled = GLStateManager.isEffectiveBlendEnabled();
- depthMask = GLStateManager.isEffectiveDepthMaskEnabled();
- depthFunc = GLStateManager.getDepthState().getFunc();
+ GLSMBlend.getEffectiveBlendState(blend);
+ blendEnabled = GLSMBlend.isEffectiveBlendEnabled();
+ depthMask = GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled();
+ depthFunc = GLSMDepthStencilAlpha.getDepthState().getFunc();
return true;
}
@@ -74,7 +79,7 @@ public final class GlintCapture {
*/
boolean beginBase(RetainedTesrGroups groups, int overlay) {
if (!open(groups)) return false;
- parent.set(GLStateManager.getModelViewMatrix());
+ parent.set(GLSMMatrices.getModelViewMatrix());
light = GLSMConfig.packedLastBrightness();
this.overlay = overlay;
base = true;
@@ -98,7 +103,7 @@ public final class GlintCapture {
owner = groups;
pass = groups.captureVersion();
groups.glintCapture = this;
- draws = GLStateManager.drawCalls;
+ draws = GLSMDraws.drawCalls;
valid = true;
uniformLight = true;
return true;
@@ -148,24 +153,24 @@ public final class GlintCapture {
private void close(boolean poseRestored) {
if (owner == null || owner.glintCapture != this) return;
owner.glintCapture = null;
- valid &= GLStateManager.drawCalls == draws && used > 0;
+ valid &= GLSMDraws.drawCalls == draws && used > 0;
this.poseRestored = poseRestored;
- restoredGeneration = GLStateManager.getMvGeneration();
+ restoredGeneration = GLSMMatrices.getMvGeneration();
if (replayStart >= 0) replayEnd = EntityShadowReplay.splitCommands();
}
private boolean sameParentPose() {
- return poseRestored && restoredGeneration == GLStateManager.getMvGeneration() || parent.equals(GLStateManager.getModelViewMatrix());
+ return poseRestored && restoredGeneration == GLSMMatrices.getMvGeneration() || parent.equals(GLSMMatrices.getModelViewMatrix());
}
boolean replay(RetainedTesrGroups groups) {
- return replay(groups, GLStateManager.getTextures().getTextureUnitMatrix(0));
+ return replay(groups, GLSMTextures.getTextures().getTextureUnitMatrix(0));
}
boolean replay(RetainedTesrGroups groups, Matrix4f textureMatrix) {
- if (base || !valid || owner != groups || pass != groups.captureVersion() || groups.glintCapture != null || GLStateManager.drawCalls != draws) return false;
- if (!trusted && (blendEnabled != GLStateManager.isEffectiveBlendEnabled() || depthMask != GLStateManager.isEffectiveDepthMaskEnabled() || depthFunc != GLStateManager.getDepthState().getFunc()
- || !blend.sameAs(GLStateManager.getEffectiveBlendState(scratchBlend)) || !sameParentPose() || texture != GLStateManager.getBoundTextureForServerState() || color != currentColor() || light != GLSMConfig.packedLastBrightness()
+ if (base || !valid || owner != groups || pass != groups.captureVersion() || groups.glintCapture != null || GLSMDraws.drawCalls != draws) return false;
+ if (!trusted && (blendEnabled != GLSMBlend.isEffectiveBlendEnabled() || depthMask != GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled() || depthFunc != GLSMDepthStencilAlpha.getDepthState().getFunc()
+ || !blend.sameAs(GLSMBlend.getEffectiveBlendState(scratchBlend)) || !sameParentPose() || texture != GLSMTextures.getBoundTextureForServerState() || color != currentColor() || light != GLSMConfig.packedLastBrightness()
|| fragmentLength != FragmentKey.packFromState(scratch) || !Arrays.equals(fragment, 0, fragmentLength, scratch, 0, fragmentLength))) return false;
for (int i = 0; i < used; i++) {
final Range range = ranges.get(i);
@@ -225,7 +230,7 @@ public final class GlintCapture {
}
private static int currentColor() {
- final var c = GLStateManager.getColor();
+ final var c = GLSMCurrentAttribs.getColor();
return AngelicaBufferSource.packAbgr(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha());
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java
index 7c19cfebe..f0aa07230 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java
@@ -1,7 +1,11 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.ffp.CubeInstancedAttribs;
@@ -112,7 +116,7 @@ final class InstancedTemplateRenderer {
int draws = 0;
long recordOffset = ringBase;
neutralizeExtendedAttribs();
- GLStateManager.setFfpInstancing(Instancing.TEMPLATE);
+ GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE);
for (int b = 0, n = liveBuckets.size(); b < n; b++) {
final Bucket bucket = liveBuckets.get(b);
final TemplateMesh mesh = bucket.mesh;
@@ -122,16 +126,16 @@ final class InstancedTemplateRenderer {
}
bindRingTo(mesh.vao, TEMPLATE_FLAGS);
InstancedAttribs.pointTemplate(recordOffset);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, bucket.indices.size());
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMDraws.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, bucket.indices.size());
draws++;
recordOffset += (long) bucket.indices.size() * InstancedAttribs.STRIDE;
bucket.indices.clear();
bucket.mesh = null;
bucketPool.add(bucket);
}
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
liveBuckets.clear();
return draws;
}
@@ -142,26 +146,26 @@ final class InstancedTemplateRenderer {
int redrawTemplates(TexRun base, int colorABGR) {
long recordOffset = base.uploadOffset;
neutralizeExtendedAttribs();
- GLStateManager.setFfpInstancing(Instancing.TEMPLATE);
+ GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE);
for (int b = 0, n = base.uploadMeshes.size(); b < n; b++) {
final TemplateMesh mesh = (TemplateMesh) base.uploadMeshes.get(b);
final int count = base.uploadCounts.getInt(b);
bindRingTo(mesh.vao, TEMPLATE_FLAGS);
InstancedAttribs.pointTemplate(recordOffset);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
setConstantColor(colorABGR);
- GLStateManager.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, count);
- GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR);
+ GLSMDraws.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, count);
+ GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR);
recordOffset += (long) count * InstancedAttribs.STRIDE;
}
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
return base.uploadMeshes.size();
}
private static void setConstantColor(int colorABGR) {
- GLStateManager.glDisableVertexAttribArray(InstancedAttribs.LOC_COLOR);
- GLStateManager.glVertexAttrib4f(InstancedAttribs.LOC_COLOR, (colorABGR & 0xFF) / 255.0f, (colorABGR >>> 8 & 0xFF) / 255.0f, (colorABGR >>> 16 & 0xFF) / 255.0f, (colorABGR >>> 24) / 255.0f);
+ GLSMVertexInput.glDisableVertexAttribArray(InstancedAttribs.LOC_COLOR);
+ GLSMCurrentAttribs.glVertexAttrib4f(InstancedAttribs.LOC_COLOR, (colorABGR & 0xFF) / 255.0f, (colorABGR >>> 8 & 0xFF) / 255.0f, (colorABGR >>> 16 & 0xFF) / 255.0f, (colorABGR >>> 24) / 255.0f);
}
/** Returns the ring offset of the uploaded instances, for {@link #redrawCubes}. */
@@ -195,11 +199,11 @@ final class InstancedTemplateRenderer {
neutralizeExtendedAttribs();
bindRingTo(UnitCubeMesh.vao(), UnitCubeMesh.VERTEX_FLAGS);
CubeInstancedAttribs.pointInstanceAttribs(ringBase);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.setFfpInstancing(Instancing.CUBE);
- GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, run.instances);
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMPrograms.setFfpInstancing(Instancing.CUBE);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, run.instances);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
return ringBase;
}
@@ -219,13 +223,13 @@ final class InstancedTemplateRenderer {
neutralizeExtendedAttribs();
bindRingTo(UnitCubeMesh.vao(), UnitCubeMesh.VERTEX_FLAGS);
CubeInstancedAttribs.pointInstanceAttribs(offset);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
setConstantColor(colorABGR);
- GLStateManager.setFfpInstancing(Instancing.CUBE);
- GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, instances);
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR);
- GLStateManager.glBindVertexArray(0);
+ GLSMPrograms.setFfpInstancing(Instancing.CUBE);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, instances);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR);
+ GLSMVertexInput.glBindVertexArray(0);
}
private long uploadStaging(long base, long end, int stride) {
@@ -237,9 +241,9 @@ final class InstancedTemplateRenderer {
}
private void bindRingTo(int vao, int vertexFlags) {
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
VAOManager.setCurrentVertexFlags(vertexFlags);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring.bufferId());
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring.bufferId());
}
private static void neutralizeExtendedAttribs() {
@@ -263,32 +267,32 @@ final class InstancedTemplateRenderer {
final TemplateMesh mesh = new TemplateMesh();
mesh.vertexCount = template.vertexCount;
mesh.drawMode = template.drawMode;
- mesh.vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(mesh.vao);
- mesh.vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, template.data, GL15.GL_STATIC_DRAW);
+ mesh.vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(mesh.vao);
+ mesh.vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, template.data, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, COLOR_INDEX * 4L);
- GLStateManager.glEnableVertexAttribArray(2);
- GLStateManager.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, TEX_X_INDEX * 4L);
- GLStateManager.glEnableVertexAttribArray(4);
- GLStateManager.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, NORMAL_INDEX * 4L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMVertexInput.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, COLOR_INDEX * 4L);
+ GLSMVertexInput.glEnableVertexAttribArray(2);
+ GLSMVertexInput.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, TEX_X_INDEX * 4L);
+ GLSMVertexInput.glEnableVertexAttribArray(4);
+ GLSMVertexInput.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, NORMAL_INDEX * 4L);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
mesh.extVbo = buildExt(template);
if (mesh.extVbo != 0) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.extVbo);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.extVbo);
ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, ImmediateExtendedAttribHandler.EXT_STRIDE);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
InstancedAttribs.enableHeadArrays();
VAOManager.setCurrentVertexFlags(TEMPLATE_FLAGS);
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
return mesh;
}
@@ -303,10 +307,10 @@ final class InstancedTemplateRenderer {
handler.build(template.data, template.vertexCount, extPrim,
ImmediateExtendedAttribHandler.RAW_NORMAL_INDEX, memAddress0(ext), extStride);
- final int extVbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
+ final int extVbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo);
ext.position(0).limit(template.vertexCount * extStride);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW);
memFree(ext);
return extVbo;
}
@@ -347,9 +351,9 @@ final class InstancedTemplateRenderer {
}
private static void delete(TemplateMesh mesh) {
- GLStateManager.glDeleteBuffers(mesh.vbo);
- if (mesh.extVbo != 0) GLStateManager.glDeleteBuffers(mesh.extVbo);
- GLStateManager.glDeleteVertexArrays(mesh.vao);
+ GLSMBuffers.glDeleteBuffers(mesh.vbo);
+ if (mesh.extVbo != 0) GLSMBuffers.glDeleteBuffers(mesh.extVbo);
+ GLSMVertexInput.glDeleteVertexArrays(mesh.vao);
}
int meshCount() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java
index d1a01641e..5088c1d1b 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import org.lwjgl.BufferUtils;
import java.nio.ByteBuffer;
@@ -35,9 +35,9 @@ public final class MeshBuffer {
public void bind() {
if (vao == 0) {
- vao = GLStateManager.glGenVertexArrays();
+ vao = GLSMVertexInput.glGenVertexArrays();
}
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
vbo.setupState();
}
@@ -47,7 +47,7 @@ public final class MeshBuffer {
public void unbind() {
vbo.cleanupState();
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
}
public void render() {
@@ -62,7 +62,7 @@ public final class MeshBuffer {
vbo = null;
}
if (vao != 0) {
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
vao = 0;
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java
index 8c86c7c56..37f7755e5 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java
@@ -9,6 +9,16 @@ import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
@@ -243,13 +253,13 @@ public final class ModelPartBatcher {
int id, glintSlot;
void capture() {
- id = GLStateManager.getBoundTextureForServerState(0);
+ id = GLSMTextures.getBoundTextureForServerState(0);
location = id == lastBoundGlId ? lastBoundLocation : null;
glintSlot = id == lastBoundGlId ? lastBoundGlintSlot : ShaderGlint.NO_TINT;
}
void apply() {
- if (GLStateManager.getBoundTextureForServerState(0) != id) return;
+ if (GLSMTextures.getBoundTextureForServerState(0) != id) return;
lastBoundLocation = location;
lastBoundGlId = id;
lastBoundGlintSlot = glintSlot;
@@ -374,15 +384,15 @@ public final class ModelPartBatcher {
if (Tracy.ENABLED) Tracy.beginZone(Z_ENTITY_DEFERRED);
try {
final EntityRenderer entityRenderer = Minecraft.getMinecraft().entityRenderer;
- final int deferredDepth = GLStateManager.pushState(StateSet.BATCH);
+ final int deferredDepth = GLSMAttribStack.pushState(StateSet.BATCH);
try {
- GLStateManager.glDepthMask(true);
- GLStateManager.enableDepthTest();
- GLStateManager.enableBlend();
- GLStateManager.defaultBlendFunc();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMBlend.enableBlend();
+ GLSMBlend.defaultBlendFunc();
entityRenderer.enableLightmap(0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
final boolean wrap = Iris.enabled && GbufferPrograms.getCurrentPhase() == WorldRenderingPhase.NONE;
if (wrap) GbufferPrograms.beginEntities();
try {
@@ -394,7 +404,7 @@ public final class ModelPartBatcher {
entityRenderer.disableLightmap(0);
}
} finally {
- GLStateManager.popStateTo(deferredDepth);
+ GLSMAttribStack.popStateTo(deferredDepth);
}
} finally {
if (Tracy.ENABLED) Tracy.endZone();
@@ -450,22 +460,22 @@ public final class ModelPartBatcher {
}
private boolean passProgramBound() {
- return GLStateManager.getActiveProgram() == (shaderPipeline != null ? shaderPipeline.getActivePassProgramId() : 0);
+ return GLSMPrograms.getActiveProgram() == (shaderPipeline != null ? shaderPipeline.getActivePassProgramId() : 0);
}
public boolean replayGlint(GlintCapture capture) {
- return replayGlint(capture, GLStateManager.getTextures().getTextureUnitMatrix(0));
+ return replayGlint(capture, GLSMTextures.getTextures().getTextureUnitMatrix(0));
}
public boolean queueSecondArmorGlint(GlintCapture capture) {
- final Matrix4f second = GlintClock.secondArmorMatrix(GLStateManager.getTextures().getTextureUnitMatrix(0));
+ final Matrix4f second = GlintClock.secondArmorMatrix(GLSMTextures.getTextures().getTextureUnitMatrix(0));
if (second == null || !replayGlint(capture, second)) return false;
armorLoopSkips++;
return true;
}
private boolean replayGlint(GlintCapture capture, Matrix4f textureMatrix) {
- if (!active || shaderPipeline != null || shadow || !BatchEligibility.batchingAllowed() || GLStateManager.getActiveProgram() != 0 || GLStateManager.isRecordingDisplayList()) return false;
+ if (!active || shaderPipeline != null || shadow || !BatchEligibility.batchingAllowed() || GLSMPrograms.getActiveProgram() != 0 || GLStateManager.isRecordingDisplayList()) return false;
if (!capture.replay(activeGroups, textureMatrix)) return false;
glintPassReuses++;
BatchEligibility.onPartQueued();
@@ -511,7 +521,7 @@ public final class ModelPartBatcher {
}
public boolean queueSkippedArmorGlint(GlintCapture base, ResourceLocation glintTexture) {
- if (cannotQueueOrRecordGlint() || GLStateManager.getActiveTextureUnit() != 0 || !GLStateManager.getTextures().getTextureUnitStates(0).isEnabled()) return false;
+ if (cannotQueueOrRecordGlint() || GLSMTextures.getActiveTextureUnit() != 0 || !GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled()) return false;
if (!(shadow ? base.recordBothLayers(this, activeGroups, glintTexture) : base.queueBothLayers(this, activeGroups, glintTexture))) return false;
if (!shadow) {
armorBaseReuses++;
@@ -523,7 +533,7 @@ public final class ModelPartBatcher {
}
public boolean queueSkippedItemGlint(TemplateBuffer template, TesrMaterial material) {
- if (cannotQueueOrRecordGlint() || GLStateManager.getActiveTextureUnit() != 0 || !activeGroups.canCopyInstances(material) || !MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0))) return false;
+ if (cannotQueueOrRecordGlint() || GLSMTextures.getActiveTextureUnit() != 0 || !activeGroups.canCopyInstances(material) || !MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0))) return false;
final EntityRenderCommands.DrawInputs inputs = glintInputs(ItemGlint.texture(), material, ShaderGlint.NO_TINT, false);
if (shadow) {
if (material == EntityMaterials.ITEM_GLINT && !ItemGlint.canResetStencil()) return false;
@@ -553,15 +563,15 @@ public final class ModelPartBatcher {
private EntityRenderCommands.DrawInputs liveInputs(ResourceLocation texture, int textureId, TesrMaterial material, PassOverride pass,
int glintSlot, int cull, boolean lit, boolean lightmap, boolean afterGlint) {
- final PolygonState polygon = GLStateManager.getPolygonState();
- return drawInputs.set(texture, textureId, material, pass, GLStateManager.getPolygonOffsetFillState().isEnabled(),
+ final PolygonState polygon = GLSMRasterizer.getPolygonState();
+ return drawInputs.set(texture, textureId, material, pass, GLSMRasterizer.getPolygonOffsetFillState().isEnabled(),
polygon.getOffsetFactor(), polygon.getOffsetUnits(), glintSlot, cull, lit, lightmap, afterGlint);
}
private Matrix4f currentModelView() {
- final int mvGen = GLStateManager.getMvGeneration();
+ final int mvGen = GLSMMatrices.getMvGeneration();
if (!mvCaptured || mvGen != lastMvGeneration) {
- modelView.set(GLStateManager.getModelViewMatrix());
+ modelView.set(GLSMMatrices.getModelViewMatrix());
lastMvGeneration = mvGen;
mvCaptured = true;
}
@@ -574,13 +584,13 @@ public final class ModelPartBatcher {
int currentOverlay() {
return shaderPipeline != null ? AngelicaBufferSource.packEntityColor(CapturedRenderingState.INSTANCE.getCurrentEntityColor())
- : AngelicaBufferSource.packAbgr(GLStateManager.getOverlayR(), GLStateManager.getOverlayG(), GLStateManager.getOverlayB(), GLStateManager.getOverlayA());
+ : AngelicaBufferSource.packAbgr(GLSMCurrentAttribs.getOverlayR(), GLSMCurrentAttribs.getOverlayG(), GLSMCurrentAttribs.getOverlayB(), GLSMCurrentAttribs.getOverlayA());
}
boolean prepareArmorGlint() {
- if (GLStateManager.getBoundTextureForServerState() != lastBoundGlId || lastBoundLocation == null) return false;
- final Color4 color = GLStateManager.getColor();
- setArmorGlint(lastBoundLocation, lastBoundGlintSlot, DrawState.liveLit(EntityMaterials.GLINT), GLStateManager.getTextures().getTextureUnitMatrix(0),
+ if (GLSMTextures.getBoundTextureForServerState() != lastBoundGlId || lastBoundLocation == null) return false;
+ final Color4 color = GLSMCurrentAttribs.getColor();
+ setArmorGlint(lastBoundLocation, lastBoundGlintSlot, DrawState.liveLit(EntityMaterials.GLINT), GLSMTextures.getTextures().getTextureUnitMatrix(0),
AngelicaBufferSource.packAbgr(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()));
return true;
}
@@ -683,7 +693,7 @@ public final class ModelPartBatcher {
bail(BailReason.INACTIVE);
return false;
}
- if (shaderPipeline != null && GLStateManager.getActiveProgram() != shaderPipeline.getActivePassProgramId()) {
+ if (shaderPipeline != null && GLSMPrograms.getActiveProgram() != shaderPipeline.getActivePassProgramId()) {
bail(BailReason.FOREIGN_PROGRAM);
return false;
}
@@ -700,7 +710,7 @@ public final class ModelPartBatcher {
if (material == EntityMaterials.OVERLAY) {
texture = null;
} else {
- if (GLStateManager.getBoundTextureForServerState() != lastBoundGlId) {
+ if (GLSMTextures.getBoundTextureForServerState() != lastBoundGlId) {
bail(BailReason.TEXTURE);
return false;
}
@@ -726,7 +736,7 @@ public final class ModelPartBatcher {
final RenderLayer layer = layerFor(atlasSlot != null ? Objects.requireNonNull(atlasSlot.page).location : texture, inputs);
// Entities nested inside a TESR (mob spawner, OpenBlocks trophy) run in the block entity pass but carry an entity id
final int entityId = groupId(shaderPipeline != null, mode == Mode.ENTITIES || pass.isEntityPhase(), CapturedRenderingState.INSTANCE.getCurrentRenderedEntity(), CapturedRenderingState.INSTANCE.getCurrentRenderedBlockEntity());
- final Color4 color = GLStateManager.getColor();
+ final Color4 color = GLSMCurrentAttribs.getColor();
final int colorABGR = AngelicaBufferSource.packAbgr(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
final int overlayABGR = currentOverlay();
final long entityInfo = currentEntityInfo(CapturedRenderingState.INSTANCE.getCurrentRenderedItem());
@@ -753,8 +763,8 @@ public final class ModelPartBatcher {
void beginReplay(Matrix4fc mainFromShadow) {
replayTransform = mainFromShadow;
- final PolygonState polygon = GLStateManager.getPolygonState();
- replayOffsetEnabled = GLStateManager.getPolygonOffsetFillState().isEnabled();
+ final PolygonState polygon = GLSMRasterizer.getPolygonState();
+ replayOffsetEnabled = GLSMRasterizer.getPolygonOffsetFillState().isEnabled();
replayOffsetFactor = polygon.getOffsetFactor();
replayOffsetUnits = polygon.getOffsetUnits();
}
@@ -848,11 +858,11 @@ public final class ModelPartBatcher {
return result;
}
case DRAW_NOW_EXPECTED -> {
- BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls);
try {
return TessellatorStreamingDrawer.draw(tess);
} finally {
- BatchEligibility.endExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls);
}
}
default -> {
@@ -870,11 +880,11 @@ public final class ModelPartBatcher {
if (!entityFire && (mode != Mode.BLOCK_ENTITIES || !BatchEligibility.insideRenderer())) return TessellatorRoute.DRAW_NOW;
if (!tess.isDrawing || tess.drawMode != GL11.GL_QUADS || tess.vertexCount == 0 || (tess.vertexCount & 3) != 0) return TessellatorRoute.DRAW_NOW;
if (shaderPipeline != null && TessellatorEntityIds.hasIdChanges(tess)) return TessellatorRoute.DRAW_NOW;
- if (DisplayListManager.isRecording() || !GLStateManager.getDepthTest().isEnabled() || !unitTexIdentity()) return TessellatorRoute.DRAW_NOW;
+ if (DisplayListManager.isRecording() || !GLSMDepthStencilAlpha.getDepthTest().isEnabled() || !unitTexIdentity()) return TessellatorRoute.DRAW_NOW;
if (!passProgramBound()) return TessellatorRoute.DRAW_NOW;
final TesrMaterial material = EntityMaterials.fromCurrentState(true);
if (material == null || material == EntityMaterials.OVERLAY) return TessellatorRoute.DRAW_NOW;
- if (lastBoundLocation == null || GLStateManager.getBoundTextureForServerState() != lastBoundGlId) return TessellatorRoute.DRAW_NOW;
+ if (lastBoundLocation == null || GLSMTextures.getBoundTextureForServerState() != lastBoundGlId) return TessellatorRoute.DRAW_NOW;
if (!entityFire && !BatchEligibility.batchingAllowed()) return TessellatorRoute.DRAW_NOW_EXPECTED;
GLStateManager.requireExitDrawState(false);
@@ -901,13 +911,13 @@ public final class ModelPartBatcher {
private void logMaterialBail() {
final Class> cls = TesrAttribution.currentRenderable;
if (cls == null || !loggedMaterialBails.add(cls)) return;
- final boolean textured = GLStateManager.getTextures().getTextureUnitStates(0).isEnabled();
- final BlendState blendState = GLStateManager.getEffectiveBlendState(bailBlend);
- final AlphaState alphaState = GLStateManager.getEffectiveAlphaState(bailAlpha);
+ final boolean textured = GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled();
+ final BlendState blendState = GLSMBlend.getEffectiveBlendState(bailBlend);
+ final AlphaState alphaState = GLSMDepthStencilAlpha.getEffectiveAlphaState(bailAlpha);
AngelicaMod.LOGGER.info("TESR MATERIAL bail: cls={} shadow={} textured={} texAnimated={} blend={} src={} dst={} alphaTest={} alphaFunc={} alphaRef={} depthFunc={} depthMask={}",
- cls.getName(), shadow, textured, textured && !unitTexIdentity(), GLStateManager.isEffectiveBlendEnabled(), blendState.getSrcRgb(),
- blendState.getDstRgb(), GLStateManager.isEffectiveAlphaTestEnabled(), alphaState.getFunction(), alphaState.getReference(),
- GLStateManager.getDepthState().getFunc(), GLStateManager.isEffectiveDepthMaskEnabled());
+ cls.getName(), shadow, textured, textured && !unitTexIdentity(), GLSMBlend.isEffectiveBlendEnabled(), blendState.getSrcRgb(),
+ blendState.getDstRgb(), GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alphaState.getFunction(), alphaState.getReference(),
+ GLSMDepthStencilAlpha.getDepthState().getFunc(), GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled());
}
static int groupId(boolean piped, boolean entityPhase, int entityId, int blockEntityId) {
@@ -916,9 +926,9 @@ public final class ModelPartBatcher {
}
private boolean unitTexIdentity() {
- final int generation = GLStateManager.getTexMatrixGeneration();
+ final int generation = GLSMMatrices.getTexMatrixGeneration();
if (!texCaptured || generation != texGeneration) {
- final Matrix4f unitMatrix = GLStateManager.getTextures().getTextureUnitMatrix(0);
+ final Matrix4f unitMatrix = GLSMTextures.getTextures().getTextureUnitMatrix(0);
texIdentity = MatrixHelper.isIdentity(unitMatrix);
if (!texIdentity) texMatrixScratch.set(unitMatrix);
texGeneration = generation;
@@ -928,7 +938,7 @@ public final class ModelPartBatcher {
}
private static boolean isDepthEqualDecalState() {
- return GLStateManager.getDepthState().getFunc() == GL11.GL_EQUAL && !GLStateManager.isEffectiveDepthMaskEnabled();
+ return GLSMDepthStencilAlpha.getDepthState().getFunc() == GL11.GL_EQUAL && !GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled();
}
private PartTemplate templateFor(ModelRenderer part, float scale, ModelPartMeshBuilder builder) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java
index 56afd0218..05f8e637e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.rendering.tesr;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import net.coderbot.iris.Iris;
import net.coderbot.iris.pipeline.WorldRenderingPipeline;
@@ -13,15 +14,15 @@ public final class PassRebindGate {
public static void rebindIfDirty() {
if (!Iris.enabled) return;
- if (GLStateManager.getProgramGeneration() == lastProgramGen
- && GLStateManager.getDrawFramebufferGeneration() == lastFbGen) {
+ if (GLSMPrograms.getProgramGeneration() == lastProgramGen
+ && GLSMFramebuffer.getDrawFramebufferGeneration() == lastFbGen) {
return;
}
final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable();
if (pipeline != null) {
pipeline.rebindCurrentPass();
}
- lastProgramGen = GLStateManager.getProgramGeneration();
- lastFbGen = GLStateManager.getDrawFramebufferGeneration();
+ lastProgramGen = GLSMPrograms.getProgramGeneration();
+ lastFbGen = GLSMFramebuffer.getDrawFramebufferGeneration();
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java
index 4497acf8c..91d6ed1fd 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java
@@ -3,6 +3,13 @@ package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
import com.gtnewhorizons.angelica.glsm.ffp.CubeParams;
@@ -1322,7 +1329,7 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook {
final Group group = list.get(i);
if (!live(group) || !queuedInstanced(group)) continue;
if (group.templateColumns.hasInstances()) {
- final boolean fixedFunction = deferred == null && GLStateManager.getActiveProgram() == 0;
+ final boolean fixedFunction = deferred == null && GLSMPrograms.getActiveProgram() == 0;
drawTemplateRuns(group.templateColumns, group.material.special().isGlint() && fixedFunction, group.material == EntityMaterials.ITEM_GLINT);
}
if (!cubeAvailable && group.cubeColumns.hasInstances() && !group.cubeColumns.anyAtlasSlot) {
@@ -1438,13 +1445,13 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook {
applyTexMatrix(run);
final boolean combined = combineGlint && r + 1 < n && combineRuns(cols, run, cols.runs.get(r + 1));
if (itemStencil) {
- GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilMask(1);
- GLStateManager.glClearStencil(0);
- GLStateManager.glClear(GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 0, 1);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR);
+ GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilMask(1);
+ GLSMDepthStencilAlpha.glClearStencil(0);
+ GLSMFramebuffer.glClear(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 0, 1);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR);
}
try {
if (canRedraw(run)) {
@@ -1456,7 +1463,7 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook {
}
instancedInstances += run.parts;
} finally {
- if (itemStencil) GLStateManager.glPopAttrib();
+ if (itemStencil) GLSMAttribStack.glPopAttrib();
if (combined) CombinedGlint.end();
}
if (combined) r++;
@@ -1509,16 +1516,16 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook {
if (run.identity && !texApplied) return;
if (!texApplied) {
texApplied = true;
- savedTexMatrix.set(GLStateManager.getTextures().getTextureUnitMatrix(0));
+ savedTexMatrix.set(GLSMTextures.getTextures().getTextureUnitMatrix(0));
}
- GLStateManager.setTextureMatrix(0, run.identity ? IDENTITY : run.matrix);
+ GLSMMatrices.setTextureMatrix(0, run.identity ? IDENTITY : run.matrix);
if (!run.identity) texMatrixRuns++;
}
private void restoreTexMatrix() {
if (!texApplied) return;
texApplied = false;
- GLStateManager.setTextureMatrix(0, savedTexMatrix);
+ GLSMMatrices.setTextureMatrix(0, savedTexMatrix);
}
private static final Matrix4f IDENTITY = new Matrix4f();
@@ -1537,7 +1544,7 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook {
private void drawInstancesCpu(Group group, InstanceColumns cols) {
saveMV();
- GLStateManager.setModelViewMatrix(IDENTITY);
+ GLSMMatrices.setModelViewMatrix(IDENTITY);
final VertexFormat format = group.layer.getVertexFormat();
for (int r = 0, rn = cols.runs.size(); r < rn; r++) {
final TexRun head = cols.runs.get(r);
@@ -1744,21 +1751,21 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook {
AngelicaBufferSource.setEntityColor(group.entityColor);
drawMV.set(baseMV).translate((float) (group.anchor.x - camX), (float) (group.anchor.y - camY), (float) (group.anchor.z - camZ));
saveMV();
- GLStateManager.setModelViewMatrix(drawMV);
+ GLSMMatrices.setModelViewMatrix(drawMV);
group.mesh.render();
}
private void saveMV() {
if (!mvSaved) {
mvSaved = true;
- savedMV.set(GLStateManager.getModelViewMatrix());
+ savedMV.set(GLSMMatrices.getModelViewMatrix());
}
}
private void restoreMV() {
if (mvSaved) {
mvSaved = false;
- GLStateManager.setModelViewMatrix(savedMV);
+ GLSMMatrices.setModelViewMatrix(savedMV);
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java
index 55f0ed221..1da183b8b 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java
@@ -7,7 +7,14 @@ import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrShader;
import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
@@ -183,12 +190,12 @@ public final class TesrBatchRenderer {
}
public void queue(TemplateBuffer template, ResourceLocation texture, TesrMaterial material) {
- modelView.set(GLStateManager.getModelViewMatrix());
+ modelView.set(GLSMMatrices.getModelViewMatrix());
final int packedLight = currentPackedLight(material);
final int colorABGR = resolveColor(material);
if (activePass >= 0) {
- final boolean offset = GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL);
- final PolygonState polygon = GLStateManager.getPolygonState();
+ final boolean offset = GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL);
+ final PolygonState polygon = GLSMRasterizer.getPolygonState();
final PassOverride pass = PassOverride.capture();
final int cullCode = DrawState.liveCull(material);
final boolean lit = DrawState.liveLit(material);
@@ -206,7 +213,7 @@ public final class TesrBatchRenderer {
}
private static Matrix4f captureTextureMatrix() {
- final Matrix4f texMatrix = GLStateManager.getTextures().getTextureUnitMatrix(0);
+ final Matrix4f texMatrix = GLSMTextures.getTextures().getTextureUnitMatrix(0);
return MatrixHelper.isIdentity(texMatrix) ? null : texMatrix;
}
@@ -367,7 +374,7 @@ public final class TesrBatchRenderer {
if (material.hasColor()) {
return AngelicaBufferSource.packAbgr(material.colorRed(), material.colorGreen(), material.colorBlue(), material.colorAlpha());
}
- final Color4 color = GLStateManager.getColor();
+ final Color4 color = GLSMCurrentAttribs.getColor();
return AngelicaBufferSource.packAbgr(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
}
@@ -437,15 +444,15 @@ public final class TesrBatchRenderer {
if (Tracy.ENABLED) Tracy.beginZone(Z_TESR_DEFERRED);
try {
final EntityRenderer entityRenderer = Minecraft.getMinecraft().entityRenderer;
- final int deferredDepth = GLStateManager.pushState(StateSet.BATCH);
+ final int deferredDepth = GLSMAttribStack.pushState(StateSet.BATCH);
try {
- GLStateManager.glDepthMask(true);
- GLStateManager.enableDepthTest();
- GLStateManager.enableBlend();
- GLStateManager.defaultBlendFunc();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMBlend.enableBlend();
+ GLSMBlend.defaultBlendFunc();
entityRenderer.enableLightmap(0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
final boolean wrap = Iris.enabled && GbufferPrograms.getCurrentPhase() == WorldRenderingPhase.NONE;
boolean blockEntitiesBegun = false;
if (wrap) {
@@ -461,7 +468,7 @@ public final class TesrBatchRenderer {
entityRenderer.disableLightmap(0);
}
} finally {
- GLStateManager.popStateTo(deferredDepth);
+ GLSMAttribStack.popStateTo(deferredDepth);
}
} finally {
if (Tracy.ENABLED) Tracy.endZone();
@@ -594,9 +601,9 @@ public final class TesrBatchRenderer {
immediateScratch.position((int) (end - addr));
immediateScratch.flip();
final RenderLayer layer = noPassLayerFor(texture, material);
- final int d = GLStateManager.pushState(StateSet.BATCH);
+ final int d = GLSMAttribStack.pushState(StateSet.BATCH);
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
boolean layerStarted = false;
Throwable failure = null;
try {
@@ -617,7 +624,7 @@ public final class TesrBatchRenderer {
}
if (failure != null) RenderFailures.rethrow(failure);
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java
index d761889f4..ce1631bb5 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.api.tesr.TesrMeshProvider;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.coderbot.iris.uniforms.CapturedRenderingState;
import net.minecraft.tileentity.TileEntity;
@@ -26,12 +26,12 @@ public final class TesrProviderDispatch {
CapturedRenderingState.INSTANCE.pushCurrentBlockEntity();
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(te == null ? null : te.getBlockType(), blockMetadata(te));
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
try {
provider.angelica$transform(te, x, y, z);
AngelicaTesrMeshCache.INSTANCE.renderCached(key, provider.angelica$meshDirty(te), provider, te);
} finally {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
CapturedRenderingState.INSTANCE.popCurrentBlockEntity();
}
return true;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java
index 219e15722..a6c8b0d34 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java
@@ -3,6 +3,8 @@ package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrShader;
import com.gtnewhorizons.angelica.api.tesr.TesrShaderUniforms;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor;
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
@@ -103,7 +105,7 @@ public final class TesrShaderPrograms {
}
if (entry.programBound) {
entry.programBound = false;
- GLStateManager.glUseProgram(entry.savedProgram);
+ GLSMPrograms.glUseProgram(entry.savedProgram);
}
}
@@ -119,7 +121,7 @@ public final class TesrShaderPrograms {
}
private static void reset(Variant variant) {
- if (variant.program != 0) GLStateManager.glDeleteProgram(variant.program);
+ if (variant.program != 0) GLSMPrograms.glDeleteProgram(variant.program);
variant.program = 0;
variant.state = UNKNOWN;
}
@@ -132,12 +134,12 @@ public final class TesrShaderPrograms {
}
if (!entry.programBound) {
entry.programBound = true;
- entry.savedProgram = GLStateManager.getActiveProgram();
+ entry.savedProgram = GLSMPrograms.getActiveProgram();
}
- GLStateManager.glUseProgram(variant.program);
+ GLSMPrograms.glUseProgram(variant.program);
if (entry.wantsLightmap && !entry.lightmapBound) {
entry.lightmapBound = true;
- entry.savedLightmapBinding = GLStateManager.getBoundTextureForServerState(DrawState.LIGHTMAP_UNIT);
+ entry.savedLightmapBinding = GLSMTextures.getBoundTextureForServerState(DrawState.LIGHTMAP_UNIT);
bindLightmapUnit(((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture().getGlTextureId());
}
final TesrShaderUniforms uniforms = entry.shader.uniforms();
@@ -146,10 +148,10 @@ public final class TesrShaderPrograms {
}
private static void bindLightmapUnit(int texture) {
- final int active = GLStateManager.getActiveTextureUnit();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + DrawState.LIGHTMAP_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + active);
+ final int active = GLSMTextures.getActiveTextureUnit();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + DrawState.LIGHTMAP_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + active);
}
private static void ensureLinked(Entry entry) {
@@ -190,23 +192,23 @@ public final class TesrShaderPrograms {
if (vertex == 0) return;
fragment = compile(entry, variant, GL20.GL_FRAGMENT_SHADER, TesrShaderPrelude.fragment() + TesrShaderPrelude.stripVersion(name, fragmentBody));
if (fragment == 0) return;
- program = GLStateManager.glCreateProgram();
- GLStateManager.glAttachShader(program, vertex);
- GLStateManager.glAttachShader(program, fragment);
- GLStateManager.glLinkProgram(program);
- if (GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
- fail(entry, variant, "failed to link", GLStateManager.glGetProgramInfoLog(program));
+ program = GLSMPrograms.glCreateProgram();
+ GLSMPrograms.glAttachShader(program, vertex);
+ GLSMPrograms.glAttachShader(program, fragment);
+ GLSMPrograms.glLinkProgram(program);
+ if (GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
+ fail(entry, variant, "failed to link", GLSMPrograms.glGetProgramInfoLog(program));
return;
}
- final int previous = GLStateManager.getActiveProgram();
- GLStateManager.glUseProgram(program);
+ final int previous = GLSMPrograms.getActiveProgram();
+ GLSMPrograms.glUseProgram(program);
try {
setSampler(program, TesrShaderPrelude.LAYER_SAMPLER, 0);
setSampler(program, TesrShaderPrelude.LIGHTMAP_SAMPLER, DrawState.LIGHTMAP_UNIT);
final TesrShaderUniforms uniforms = entry.shader.uniforms();
if (uniforms != null) uniforms.angelica$linked(program, instanced);
} finally {
- GLStateManager.glUseProgram(previous);
+ GLSMPrograms.glUseProgram(previous);
}
variant.program = program;
variant.state = READY;
@@ -215,25 +217,25 @@ public final class TesrShaderPrograms {
} catch (RuntimeException e) {
fail(entry, variant, "failed to build", e.toString());
} finally {
- if (vertex != 0) GLStateManager.glDeleteShader(vertex);
- if (fragment != 0) GLStateManager.glDeleteShader(fragment);
- if (program != 0) GLStateManager.glDeleteProgram(program);
+ if (vertex != 0) GLSMPrograms.glDeleteShader(vertex);
+ if (fragment != 0) GLSMPrograms.glDeleteShader(fragment);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
}
}
private static int compile(Entry entry, Variant variant, int type, String source) {
- final int shader = GLStateManager.glCreateShader(type);
- GLStateManager.glShaderSource(shader, source);
- GLStateManager.glCompileShader(shader);
- if (GLStateManager.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_TRUE) return shader;
- fail(entry, variant, type == GL20.GL_VERTEX_SHADER ? "vertex stage failed to compile" : "fragment stage failed to compile", GLStateManager.glGetShaderInfoLog(shader));
- GLStateManager.glDeleteShader(shader);
+ final int shader = GLSMPrograms.glCreateShader(type);
+ GLSMPrograms.glShaderSource(shader, source);
+ GLSMPrograms.glCompileShader(shader);
+ if (GLSMPrograms.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_TRUE) return shader;
+ fail(entry, variant, type == GL20.GL_VERTEX_SHADER ? "vertex stage failed to compile" : "fragment stage failed to compile", GLSMPrograms.glGetShaderInfoLog(shader));
+ GLSMPrograms.glDeleteShader(shader);
return 0;
}
private static void setSampler(int program, String name, int unit) {
- final int location = GLStateManager.glGetUniformLocation(program, name);
- if (location >= 0) GLStateManager.glUniform1i(location, unit);
+ final int location = GLSMPrograms.glGetUniformLocation(program, name);
+ if (location >= 0) GLSMPrograms.glUniform1i(location, unit);
}
private static void fail(Entry entry, Variant variant, String what, String detail) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java
index 9635fc887..ae41d0a7e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java
@@ -4,7 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrMeshBuilder;
import com.gtnewhorizons.angelica.api.tesr.TesrMeshSink;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
import net.minecraft.client.model.ModelChest;
@@ -67,12 +67,12 @@ public final class VanillaModelMeshes {
}
private static void renderRotatedPart(Object key, ResourceLocation texture, ModelRenderer part, float angleX) {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(part.offsetX + part.rotationPointX * MODEL_SCALE, part.offsetY + part.rotationPointY * MODEL_SCALE, part.offsetZ + part.rotationPointZ * MODEL_SCALE);
- GLStateManager.glRotatef(angleX * (180f / (float) Math.PI), 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(part.offsetX + part.rotationPointX * MODEL_SCALE, part.offsetY + part.rotationPointY * MODEL_SCALE, part.offsetZ + part.rotationPointZ * MODEL_SCALE);
+ GLSMMatrices.glRotatef(angleX * (180f / (float) Math.PI), 1.0f, 0.0f, 0.0f);
BUILDER.setLocal(texture, MODEL_SCALE, part);
AngelicaTesrMeshCache.INSTANCE.renderCached(key, BUILDER);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
public static void renderSign(ModelSign model) {
@@ -86,16 +86,16 @@ public final class VanillaModelMeshes {
return false;
}
final Object key = SKULL_KEYS.computeIfAbsent(model, m -> new Object2ObjectOpenHashMap<>()).computeIfAbsent(texture, t -> new Object());
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
if (yawDegrees != 0.0f) {
- GLStateManager.glRotatef(yawDegrees, 0.0f, 1.0f, 0.0f);
+ GLSMMatrices.glRotatef(yawDegrees, 0.0f, 1.0f, 0.0f);
}
if (pitchDegrees != 0.0f) {
- GLStateManager.glRotatef(pitchDegrees, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glRotatef(pitchDegrees, 1.0f, 0.0f, 0.0f);
}
BUILDER.set(texture, scale, model.skeletonHead, null, null);
AngelicaTesrMeshCache.INSTANCE.renderCached(key, BUILDER);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
return true;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java b/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java
index 5808923a0..f0d48acc9 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.rendering.voxelization;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend;
@@ -81,15 +81,15 @@ public final class SdlShadowVoxelizationSink implements ShadowVoxelizer.Sink {
private void upload() {
final ByteBuffer data = table.entries();
final int bytes = data.remaining();
- if (rangesBuf == 0) rangesBuf = GLStateManager.glGenBuffers();
+ if (rangesBuf == 0) rangesBuf = GLSMBuffers.glGenBuffers();
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, RANGES_BINDING, rangesBuf);
if (rangesCapacityBytes < bytes) {
long cap = Math.max(rangesCapacityBytes, 4096L);
while (cap < bytes) cap <<= 1;
rangesCapacityBytes = cap;
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, rangesCapacityBytes, GL15.GL_STREAM_DRAW);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, rangesCapacityBytes, GL15.GL_STREAM_DRAW);
}
- GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, data);
+ GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, data);
}
public void discard() {
@@ -98,7 +98,7 @@ public final class SdlShadowVoxelizationSink implements ShadowVoxelizer.Sink {
public void delete() {
if (rangesBuf != 0) {
- GLStateManager.glDeleteBuffers(rangesBuf);
+ GLSMBuffers.glDeleteBuffers(rangesBuf);
rangesBuf = 0;
rangesCapacityBytes = 0;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java b/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java
index 01d5d91ec..be11c18c1 100644
--- a/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java
+++ b/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.shadercompat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.hooks.GlintColorHandler;
import com.gtnewhorizons.angelica.iris.IrisDisplayListState;
@@ -72,7 +73,7 @@ public final class ShaderGlint {
injecting = false;
// Save the texture bound before the glint section so endGlint can put it back if we swap
- prevTexture = GLStateManager.getBoundTextureForServerState(0);
+ prevTexture = GLSMTextures.getBoundTextureForServerState(0);
// Observe vertex-color changes for the rest of the glint section
GLSMHooks.glintColorHandler = COLOR_HANDLER;
@@ -85,7 +86,7 @@ public final class ShaderGlint {
GLSMHooks.glintColorHandler = null;
if (swapped) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture);
ModelPartBatcher.onTextureSwap(prevTexture, NO_TINT);
}
swapped = false;
@@ -100,8 +101,8 @@ public final class ShaderGlint {
final int texture = slotTextures[slot];
injecting = true;
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, alpha);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, alpha);
injecting = false;
swapped = true;
ModelPartBatcher.onTextureSwap(texture, slot);
@@ -110,7 +111,7 @@ public final class ShaderGlint {
public static void invalidate() {
for (int i = 0; i < slotTextures.length; i++) {
if (slotTextures[i] != 0) {
- GLStateManager.glDeleteTextures(slotTextures[i]);
+ GLSMTextures.glDeleteTextures(slotTextures[i]);
slotTextures[i] = 0;
}
}
@@ -129,8 +130,8 @@ public final class ShaderGlint {
}
if (!IrisApi.getInstance().isShaderPackInUse()) return;
final ITextureObject mask = Minecraft.getMinecraft().getTextureManager().getTexture(GLINT_MASK);
- if (mask == null || GLStateManager.getBoundTextureForServerState() != mask.getGlTextureId()) return;
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, slotTextures[slot]);
+ if (mask == null || GLSMTextures.getBoundTextureForServerState() != mask.getGlTextureId()) return;
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, slotTextures[slot]);
}
private static int tintSlot(float r, float g, float b) {
@@ -148,7 +149,7 @@ public final class ShaderGlint {
final int slot;
if (colorToSlot.size() >= TINT_SLOTS) {
slot = colorToSlot.remove(colorToSlot.firstIntKey());
- GLStateManager.glDeleteTextures(slotTextures[slot]);
+ GLSMTextures.glDeleteTextures(slotTextures[slot]);
} else {
slot = colorToSlot.size();
}
@@ -168,14 +169,14 @@ public final class ShaderGlint {
}
pixels.flip();
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
// Match the vanilla glint texture
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, maskW, maskH, 0,
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, maskW, maskH, 0,
GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
return texture;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java b/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java
index a8c2ede33..341482b14 100644
--- a/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java
+++ b/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.textures.atlas;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.texture.TextureStaging;
import com.gtnewhorizons.angelica.glsm.threading.AngelicaWorkers;
import com.gtnewhorizons.angelica.rendering.celeritas.SpriteExtension;
@@ -89,7 +89,7 @@ public final class AtlasAssembler {
discard(previous);
discard(current);
} finally {
- GLStateManager.trimTextureStaging();
+ GLSMTextures.trimTextureStaging();
}
final TextureAtlasSprite last = sprites.getLast();
@@ -170,7 +170,7 @@ public final class AtlasAssembler {
final int rows = (y1 >> l) - ly0;
final int lw = atlasWidth >> l;
if (rows <= 0 || lw <= 0) continue;
- final TextureStaging staging = GLStateManager.beginTextureStaging(l, 0, ly0, lw, rows);
+ final TextureStaging staging = GLSMTextures.beginTextureStaging(l, 0, ly0, lw, rows);
if (staging == null) {
abandon(band, 0);
return null;
@@ -237,7 +237,7 @@ public final class AtlasAssembler {
band.stagings[l] = null;
boolean committed = false;
try {
- committed = GLStateManager.commitTextureStaging(staging);
+ committed = GLSMTextures.commitTextureStaging(staging);
} finally {
if (!committed) abandon(band, l + 1);
}
@@ -260,7 +260,7 @@ public final class AtlasAssembler {
final TextureStaging staging = band.stagings[l];
if (staging == null) continue;
band.stagings[l] = null;
- GLStateManager.abandonTextureStaging(staging);
+ GLSMTextures.abandonTextureStaging(staging);
}
}
diff --git a/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java b/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java
index 726c342f5..241ce23d2 100644
--- a/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java
+++ b/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java
@@ -16,7 +16,7 @@ import net.minecraft.init.Blocks;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.MCPatcherUtils;
@@ -414,7 +414,7 @@ public class ColorizeBlock {
waterColor = new float[3];
ColorUtils.intToFloat3(waterColorMap.getColorMultiplier(), waterColor);
}
- GLStateManager.glColor4f(waterColor[0], waterColor[1], waterColor[2], 1.0f);
+ GLSMCurrentAttribs.glColor4f(waterColor[0], waterColor[1], waterColor[2], 1.0f);
}
}
diff --git a/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java b/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java
index e26a2f0b1..3729be646 100644
--- a/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java
+++ b/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java
@@ -9,7 +9,12 @@ import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.prupe.mcpatcher.mal.resource.BlendMethod;
import com.prupe.mcpatcher.mal.resource.PropertiesFile;
import com.prupe.mcpatcher.mal.resource.TexturePackAPI;
@@ -34,45 +39,45 @@ final class Enchantment extends OverrideBase {
private float armorScaleY;
static void beginOuter2D() {
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
}
static void endOuter2D() {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
static void beginOuter3D() {
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f);
- GLStateManager.glEnable(GL11.GL_BLEND);
- lightingWasEnabled = GLStateManager.glGetBoolean(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ lightingWasEnabled = GLSMQueries.glGetBoolean(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
}
static void endOuter3D() {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
if (lightingWasEnabled) {
- GLStateManager.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
}
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
Enchantment(PropertiesFile properties) {
@@ -144,15 +149,15 @@ final class Enchantment extends OverrideBase {
begin(intensity);
// Depth pre-pass
- GLStateManager.glColorMask(false, false, false, false);
- GLStateManager.glDepthMask(true);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMBlend.glColorMask(false, false, false, false);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
ItemRenderer.renderItemIn2D(Tessellator.instance, 1.0f, 0.0f, 0.0f, 1.0f, width, height, ITEM_2D_THICKNESS);
// Color pass
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glDepthMask(false);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
ItemRenderer.renderItemIn2D(Tessellator.instance, 1.0f, 0.0f, 0.0f, 1.0f, width, height, ITEM_2D_THICKNESS);
end();
}
@@ -176,46 +181,46 @@ final class Enchantment extends OverrideBase {
}
void beginArmor(float intensity) {
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
begin(intensity);
if (!armorScaleSet) {
setArmorScale();
}
- GLStateManager.glScalef(armorScaleX, armorScaleY, 1.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glScalef(armorScaleX, armorScaleY, 1.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
void endArmor() {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
end();
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
void begin(float intensity) {
blendMethod.applyBlending();
blendMethod.applyDepthFunc();
blendMethod.applyFade(intensity);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
if (speed != 0.0) {
double offset = ((double) System.currentTimeMillis() * speed) / 3000.0;
offset -= Math.floor(offset);
- GLStateManager.glTranslatef((float) offset * 8.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef((float) offset * 8.0f, 0.0f, 0.0f);
}
- GLStateManager.glRotatef(rotation, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glRotatef(rotation, 0.0f, 0.0f, 1.0f);
}
void end() {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
private void setArmorScale() {
diff --git a/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java b/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java
index a68a451a8..5133a85dd 100644
--- a/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java
+++ b/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java
@@ -14,7 +14,8 @@ import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.MCPatcherUtils;
import com.prupe.mcpatcher.mal.resource.GLAPI;
@@ -146,8 +147,8 @@ public class CustomAnimation implements Comparable {
return;
}
TexturePackAPI.bindTexture(dstName);
- int dstWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
- int dstHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
+ int dstWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
+ int dstHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
int levels = MipmapHelper.getMipmapLevelsForCurrentTexture();
if (x + w > dstWidth || y + h > dstHeight) {
properties.error(
@@ -239,7 +240,7 @@ public class CustomAnimation implements Comparable {
}
GLAPI.glBindTexture(texture);
update(texture, 0, 0);
- int glError = GLStateManager.glGetError();
+ int glError = GLSMQueries.glGetError();
if (glError != 0) {
logger.severe("%s: %s", this, GLU.gluErrorString(glError));
error = true;
@@ -352,7 +353,7 @@ public class CustomAnimation implements Comparable {
// Without the cast the code won't compile
@SuppressWarnings("RedundantCast")
private void update(int texture, int dx, int dy) {
- GLStateManager.glTexSubImage2D(
+ GLSMTextures.glTexSubImage2D(
GL11.GL_TEXTURE_2D,
mipmapLevel,
x + dx,
diff --git a/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java b/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java
index 6548fde43..49759855c 100644
--- a/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java
+++ b/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java
@@ -28,6 +28,17 @@ import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL13;
import org.lwjgl.util.glu.GLU;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.MCPatcherUtils;
@@ -55,7 +66,7 @@ public class FancyDial {
private static final int glAttributes;
private static boolean initialized;
private static boolean active;
- private static final int drawList = GLStateManager.glGenLists(1);
+ private static final int drawList = GLSMDraws.glGenLists(1);
private static final Map setupInfo = new IdentityHashMap<>();
private static final Map instances = new IdentityHashMap<>();
@@ -97,9 +108,9 @@ public class FancyDial {
}
glAttributes = bits;
- GLStateManager.glNewList(drawList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(drawList, GL11.GL_COMPILE);
drawBox();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
public static void setup(TextureAtlasSprite icon) {
@@ -136,18 +147,18 @@ public class FancyDial {
if (!active) {
return false;
}
- int oldFB = GLStateManager.glGetInteger(EXTFramebufferObject.GL_FRAMEBUFFER_BINDING_EXT);
+ int oldFB = GLSMQueries.glGetInteger(EXTFramebufferObject.GL_FRAMEBUFFER_BINDING_EXT);
if (oldFB != 0 && warnCount < 10) {
logger.finer("rendering %s while non-default framebuffer %d is active", icon.getIconName(), oldFB);
warnCount++;
}
- int oldTexture = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
+ int oldTexture = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
try {
FancyDial instance = getInstance(icon);
return instance != null && instance.render(itemFrameRenderer);
} finally {
- GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, oldFB);
+ GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, oldFB);
GLAPI.glBindTexture(oldTexture);
}
}
@@ -271,7 +282,7 @@ public class FancyDial {
outputFrames = properties.getInt("outputFrames", 0);
- int glError = GLStateManager.glGetError();
+ int glError = GLSMQueries.glGetError();
if (glError != 0) {
logger.severe("%s during %s setup", GLU.gluErrorString(glError), name);
return;
@@ -367,7 +378,7 @@ public class FancyDial {
lastItemFrameRenderer = false;
}
- int glError = GLStateManager.glGetError();
+ int glError = GLSMQueries.glGetError();
if (glError != 0) {
logger.severe("%s during %s update", GLU.gluErrorString(glError), name);
ok = false;
@@ -433,7 +444,7 @@ public class FancyDial {
private void renderImpl(double angle) {
for (Layer layer : layers) {
layer.blendMethod.applyBlending();
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
TexturePackAPI.bindTexture(layer.textureName);
float offsetX = layer.offsetX;
float offsetY = layer.offsetY;
@@ -445,26 +456,26 @@ public class FancyDial {
scaleX += scaleXDelta;
scaleY += scaleYDelta;
}
- GLStateManager.glTranslatef(offsetX, offsetY, 0.0f);
- GLStateManager.glScalef(scaleX, scaleY, 1.0f);
+ GLSMMatrices.glTranslatef(offsetX, offsetY, 0.0f);
+ GLSMMatrices.glScalef(scaleX, scaleY, 1.0f);
float layerAngle = (float) (angle * layer.rotationMultiplier + layer.rotationOffset);
- GLStateManager.glRotatef(layerAngle, 0.0f, 0.0f, 1.0f);
- GLStateManager.glCallList(drawList);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glRotatef(layerAngle, 0.0f, 0.0f, 1.0f);
+ GLSMDraws.glCallList(drawList);
+ GLSMMatrices.glPopMatrix();
}
}
private static void drawBox() {
- GLStateManager.glBegin(GL11.GL_QUADS);
- GLStateManager.glTexCoord2f(0.0f, 0.0f);
- GLStateManager.glVertex3f(-1.0f, -1.0f, 0.0f);
- GLStateManager.glTexCoord2f(1.0f, 0.0f);
- GLStateManager.glVertex3f(1.0f, -1.0f, 0.0f);
- GLStateManager.glTexCoord2f(1.0f, 1.0f);
- GLStateManager.glVertex3f(1.0f, 1.0f, 0.0f);
- GLStateManager.glTexCoord2f(0.0f, 1.0f);
- GLStateManager.glVertex3f(-1.0f, 1.0f, 0.0f);
- GLStateManager.glEnd();
+ GLSMDraws.glBegin(GL11.GL_QUADS);
+ GLSMCurrentAttribs.glTexCoord2f(0.0f, 0.0f);
+ GLSMDraws.glVertex3f(-1.0f, -1.0f, 0.0f);
+ GLSMCurrentAttribs.glTexCoord2f(1.0f, 0.0f);
+ GLSMDraws.glVertex3f(1.0f, -1.0f, 0.0f);
+ GLSMCurrentAttribs.glTexCoord2f(1.0f, 1.0f);
+ GLSMDraws.glVertex3f(1.0f, 1.0f, 0.0f);
+ GLSMCurrentAttribs.glTexCoord2f(0.0f, 1.0f);
+ GLSMDraws.glVertex3f(-1.0f, 1.0f, 0.0f);
+ GLSMDraws.glEnd();
}
private void finish() {
@@ -605,13 +616,13 @@ public class FancyDial {
this.width = width;
this.height = height;
- frameBuffer = GLStateManager.glGenFramebuffers();
+ frameBuffer = GLSMFramebuffer.glGenFramebuffers();
if (frameBuffer < 0) {
throw new RuntimeException("could not get framebuffer object");
}
GLAPI.glBindTexture(texture);
- GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer);
- GLStateManager.glFramebufferTexture2D(
+ GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer);
+ GLSMFramebuffer.glFramebufferTexture2D(
EXTFramebufferObject.GL_FRAMEBUFFER_EXT,
EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT,
GL11.GL_TEXTURE_2D,
@@ -620,75 +631,75 @@ public class FancyDial {
}
void bind() {
- GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer);
+ GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer);
- GLStateManager.glPushAttrib(glAttributes);
- GLStateManager.glViewport(x0, y0, width, height);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(x0, y0, width, height);
+ GLSMAttribStack.glPushAttrib(glAttributes);
+ GLSMRasterizer.glViewport(x0, y0, width, height);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(x0, y0, width, height);
lightmapEnabled = false;
if (gl13Supported) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- lightmapEnabled = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ lightmapEnabled = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_2D);
if (lightmapEnabled) {
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f);
if (useGL13) {
- GLStateManager.glDisable(GL13.GL_MULTISAMPLE);
+ GLSMEnable.glDisable(GL13.GL_MULTISAMPLE);
}
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
}
void unbind() {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
if (lightmapEnabled) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
GLAPI.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
+ GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
}
void read(ByteBuffer buffer) {
- GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer);
+ GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer);
buffer.position(0);
- GLStateManager.glReadPixels(x0, y0, width, height, MipmapHelper.TEX_FORMAT, MipmapHelper.TEX_DATA_TYPE, buffer);
+ GLSMFramebuffer.glReadPixels(x0, y0, width, height, MipmapHelper.TEX_FORMAT, MipmapHelper.TEX_DATA_TYPE, buffer);
}
void write(ByteBuffer buffer) {
GLAPI.glBindTexture(texture);
buffer.position(0);
- GLStateManager.glTexSubImage2D(
+ GLSMTextures.glTexSubImage2D(
GL11.GL_TEXTURE_2D,
0,
x0,
@@ -704,9 +715,9 @@ public class FancyDial {
if (!deleted) {
deleted = true;
if (ownTexture) {
- GLStateManager.glDeleteTextures(texture);
+ GLSMTextures.glDeleteTextures(texture);
}
- GLStateManager.glDeleteFramebuffers(frameBuffer);
+ GLSMFramebuffer.glDeleteFramebuffers(frameBuffer);
}
}
@@ -717,7 +728,7 @@ public class FancyDial {
}
private static int blankTexture(int width, int height) {
- int texture = GLStateManager.glGenTextures();
+ int texture = GLSMTextures.glGenTextures();
MipmapHelper.setupTexture(texture, width, height, "scratch");
return texture;
}
diff --git a/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java b/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java
index 764b1f82d..791a68048 100644
--- a/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java
+++ b/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java
@@ -13,6 +13,9 @@ import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.util.glu.GLU;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.mal.resource.GLAPI;
@@ -51,7 +54,7 @@ public class MipmapHelper {
anisoSupported = GLStateManager.capabilities.GL_EXT_texture_filter_anisotropic;
if (anisoSupported) {
- anisoMax = (int) GLStateManager.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT);
+ anisoMax = (int) GLSMQueries.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT);
checkGLError("glGetFloat(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)");
anisoLevel = Math.max(Math.min(MCPatcherForgeConfig.ExtendedHD.anisotropicFiltering, anisoMax), 1);
} else {
@@ -76,30 +79,30 @@ public class MipmapHelper {
final int magFilter = blur ? GL11.GL_LINEAR : GL11.GL_NEAREST;
final int minFilter = mipmaps > 0 ? GL11.GL_LINEAR_MIPMAP_LINEAR : magFilter;
final int wrap = clamp ? GL11.GL_CLAMP : GL11.GL_REPEAT;
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmaps);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmaps);
if (mipmaps > 0) {
checkGLError("%s: set GL_TEXTURE_MAX_LEVEL = %d", textureName, mipmaps);
if (anisoSupported && anisoLevel > 1) {
- GLStateManager.glTexParameterf(
+ GLSMTextures.glTexParameterf(
GL11.GL_TEXTURE_2D,
EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT,
anisoLevel);
checkGLError("%s: set GL_TEXTURE_MAX_ANISOTROPY_EXT = %f", textureName, anisoLevel);
}
if (lodSupported) {
- GLStateManager.glTexEnvi(
+ GLSMTexEnvGen.glTexEnvi(
EXTTextureLODBias.GL_TEXTURE_FILTER_CONTROL_EXT,
EXTTextureLODBias.GL_TEXTURE_LOD_BIAS_EXT,
lodBias);
checkGLError("%s: set GL_TEXTURE_LOD_BIAS_EXT = %d", textureName, lodBias);
}
}
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, minFilter);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, magFilter);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, minFilter);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, magFilter);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap);
for (int level = 0; level <= mipmaps; level++) {
- GLStateManager.glTexImage2D(
+ GLSMTextures.glTexImage2D(
GL11.GL_TEXTURE_2D,
level,
GL11.GL_RGBA,
@@ -172,11 +175,11 @@ public class MipmapHelper {
}
static int getMipmapLevelsForCurrentTexture() {
- final int filter = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
+ final int filter = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER);
if (filter != GL11.GL_NEAREST_MIPMAP_LINEAR && filter != GL11.GL_NEAREST_MIPMAP_NEAREST) {
return 0;
}
- return Math.min(maxMipmapLevel, GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL));
+ return Math.min(maxMipmapLevel, GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL));
}
private static int gcd(int a, int b) {
@@ -273,7 +276,7 @@ public class MipmapHelper {
}
private static void checkGLError(String format, Object... params) {
- final int error = GLStateManager.glGetError();
+ final int error = GLSMQueries.glGetError();
if (error != 0) {
final String message = GLU.gluErrorString(error) + ": " + String.format(format, params);
new RuntimeException(message).printStackTrace();
diff --git a/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java b/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java
index cf5386ec3..b264ff88a 100644
--- a/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java
+++ b/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java
@@ -7,7 +7,9 @@ import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.prupe.mcpatcher.MCPatcherUtils;
public class BlendMethod {
@@ -156,38 +158,38 @@ public class BlendMethod {
public void applyFade(float fade) {
if (fadeRGB && fadeAlpha) {
- GLStateManager.glColor4f(fade, fade, fade, fade);
+ GLSMCurrentAttribs.glColor4f(fade, fade, fade, fade);
} else if (fadeRGB) {
- GLStateManager.glColor4f(fade, fade, fade, 1.0f);
+ GLSMCurrentAttribs.glColor4f(fade, fade, fade, 1.0f);
} else if (fadeAlpha) {
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, fade);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, fade);
}
}
public void applyAlphaTest() {
if (blend) {
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
} else {
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f);
}
}
public void applyDepthFunc() {
if (blend) {
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
} else {
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
}
}
public void applyBlending() {
if (blend) {
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
GLAPI.glBlendFuncSeparate(srcBlend, dstBlend, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
} else {
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
}
}
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 970f64a26..88babcc19 100644
--- a/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java
+++ b/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java
@@ -1,6 +1,8 @@
package com.prupe.mcpatcher.mal.resource;
import org.lwjgl.opengl.GL11;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
public class GLAPI {
@@ -9,15 +11,15 @@ public class GLAPI {
public static void glBindTexture(int texture) {
if (texture >= 0) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
}
}
public static void glBlendFuncSeparate(int src, int dst, int srcAlpha, int dstAlpha) {
if (useGlBlendFuncSeparate) {
- GLStateManager.glBlendFuncSeparate(src, dst, srcAlpha, dstAlpha);
+ GLSMBlend.glBlendFuncSeparate(src, dst, srcAlpha, dstAlpha);
} else {
- GLStateManager.glBlendFunc(src, dst);
+ GLSMBlend.glBlendFunc(src, dst);
}
}
}
diff --git a/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java b/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java
index bfc394cff..cab8a08e6 100644
--- a/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java
+++ b/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java
@@ -6,7 +6,8 @@ import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.mal.resource.PropertiesFile;
import com.prupe.mcpatcher.mal.resource.TexturePackAPI;
@@ -125,8 +126,8 @@ public class LineRenderer {
TexturePackAPI.bindTexture(texture);
Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
dx += sx + plusSX;
dy += sy + plusSY;
dz += sz + plusSZ;
@@ -178,7 +179,7 @@ public class LineRenderer {
u0 = u1;
}
tessellator.draw();
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
return true;
}
diff --git a/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java b/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java
index 5c4620f4c..9b0b7f1dd 100644
--- a/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java
+++ b/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java
@@ -13,7 +13,9 @@ import net.minecraft.world.IBlockAccess;
import org.lwjgl.opengl.GL11;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.MCPatcherUtils;
import com.prupe.mcpatcher.ctm.CTMUtils;
@@ -291,21 +293,21 @@ public class RenderPass {
case RenderPassAPI.TRANSLUCENT_RENDER_PASS:
case RenderPassAPI.BACKFACE_RENDER_PASS:
if (!backfaceCulling[pass]) {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
}
break;
case RenderPassAPI.OVERLAY_RENDER_PASS:
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.glPolygonOffset(-2.0f, -2.0f);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMRasterizer.glPolygonOffset(-2.0f, -2.0f);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
if (backfaceCulling[pass]) {
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
} else {
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
}
if (ambientOcclusion) {
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
}
blendMethod.applyBlending();
break;
@@ -324,18 +326,18 @@ public class RenderPass {
case RenderPassAPI.TRANSLUCENT_RENDER_PASS:
case RenderPassAPI.BACKFACE_RENDER_PASS:
if (!backfaceCulling[currentRenderPass]) {
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
}
break;
case RenderPassAPI.OVERLAY_RENDER_PASS:
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
if (!backfaceCulling[currentRenderPass]) {
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
}
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glShadeModel(GL11.GL_FLAT);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
break;
default:
diff --git a/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java b/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java
index 31e165d1c..37d7c1cc2 100644
--- a/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java
+++ b/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java
@@ -14,7 +14,9 @@ import net.minecraft.world.World;
import org.lwjgl.opengl.GL11;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.prupe.mcpatcher.MCLogger;
import com.prupe.mcpatcher.MCPatcherUtils;
import com.prupe.mcpatcher.mal.resource.BlendMethod;
@@ -385,42 +387,42 @@ public class SkyRenderer {
TexturePackAPI.bindTexture(texture);
setBlendingMethod(brightness);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
if (rotate) {
- GLStateManager.glRotatef(celestialAngle * 360.0f * speed, axis[0], axis[1], axis[2]);
+ GLSMMatrices.glRotatef(celestialAngle * 360.0f * speed, axis[0], axis[1], axis[2]);
}
// north
- GLStateManager.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
- GLStateManager.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
drawTile(4);
// top
- GLStateManager.glPushMatrix();
- GLStateManager.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
drawTile(1);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
// bottom
- GLStateManager.glPushMatrix();
- GLStateManager.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
drawTile(0);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
// west
- GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
drawTile(5);
// south
- GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
drawTile(2);
// east
- GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
drawTile(3);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
return true;
}
@@ -441,14 +443,14 @@ public class SkyRenderer {
blendMethod.applyFade(brightness);
blendMethod.applyAlphaTest();
blendMethod.applyBlending();
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
}
static void clearBlendingMethod() {
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
GLAPI.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, rainStrength);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, rainStrength);
}
}
}
diff --git a/src/main/java/jss/notfine/render/RenderStars.java b/src/main/java/jss/notfine/render/RenderStars.java
index caee756a3..59fdd1371 100644
--- a/src/main/java/jss/notfine/render/RenderStars.java
+++ b/src/main/java/jss/notfine/render/RenderStars.java
@@ -1,7 +1,7 @@
package jss.notfine.render;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import jss.notfine.core.Settings;
import jss.util.RandomXoshiro256StarStar;
import net.minecraft.client.renderer.RenderGlobal;
@@ -13,9 +13,9 @@ public class RenderStars {
//private static final ResourceLocation locationStarsPng = new ResourceLocation("textures/colormap/stars.png");
public static void reloadStarRenderList(RenderGlobal render) {
- GLStateManager.glNewList(render.starGLCallList, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(render.starGLCallList, GL11.GL_COMPILE);
renderStars();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
public static void renderStars() {
diff --git a/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java b/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java
index f8cd646e8..f082df92a 100644
--- a/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java
+++ b/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java
@@ -3,7 +3,7 @@ package me.flashyreese.mods.reeses_sodium_options.client.gui.frame;
import com.gtnewhorizons.angelica.compat.mojang.Drawable;
import com.gtnewhorizons.angelica.compat.mojang.Element;
import com.gtnewhorizons.angelica.compat.mojang.ParentElement;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement;
import me.jellysquid.mods.sodium.client.gui.widgets.AbstractWidget;
import me.jellysquid.mods.sodium.client.util.Dim2i;
@@ -55,10 +55,10 @@ public abstract class AbstractFrame extends AbstractWidget implements ParentElem
public void applyScissor(int x, int y, int width, int height, Runnable action) {
final double scale = new ScaledResolution(Minecraft.getMinecraft(), Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight).getScaleFactor();
- GLStateManager.enableScissorTest();
- GLStateManager.glScissor((int) (x * scale), (int) (Minecraft.getMinecraft().getFramebuffer().framebufferHeight - (y + height) * scale), (int) (width * scale), (int) (height * scale));
+ GLSMRasterizer.enableScissorTest();
+ GLSMRasterizer.glScissor((int) (x * scale), (int) (Minecraft.getMinecraft().getFramebuffer().framebufferHeight - (y + height) * scale), (int) (width * scale), (int) (height * scale));
action.run();
- GLStateManager.disableScissorTest();
+ GLSMRasterizer.disableScissorTest();
}
protected void drawRectOutline(double x, double y, double w, double h, int color) {
diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java
index 06c32cf35..da8eb6f42 100644
--- a/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java
+++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java
@@ -2,7 +2,8 @@ package me.jellysquid.mods.sodium.client.gui.widgets;
import com.gtnewhorizons.angelica.compat.mojang.Drawable;
import com.gtnewhorizons.angelica.compat.mojang.Element;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.gui.FontRenderer;
@@ -33,17 +34,17 @@ public abstract class AbstractWidget implements Drawable, Element {
}
protected void drawQuads(Consumer consumer) {
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.defaultBlendFunc();
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMBlend.defaultBlendFunc();
final Tessellator tessellator = Tessellator.instance;
tessellator.startDrawingQuads();
consumer.accept(tessellator);
tessellator.draw();
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
}
protected static void addQuad(Tessellator consumer, double x1, double y1, double x2, double y2, float a, float r, float g, float b) {
diff --git a/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java b/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java
index 88ee2ce74..66a052b0b 100644
--- a/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java
+++ b/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java
@@ -3,7 +3,10 @@ package net.coderbot.batchedentityrendering.impl;
import com.gtnewhorizons.angelica.rendering.RenderFailures;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
import com.gtnewhorizons.angelica.rendering.tesr.BatchDrawDefaults;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.LightingSnapshot;
import com.gtnewhorizons.angelica.glsm.StateSet;
import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap;
@@ -59,7 +62,7 @@ public class AngelicaBufferSource implements Groupable {
public void capturePassLighting() {
if (passLighting == null) passLighting = new LightingSnapshot();
- GLStateManager.captureLighting(passLighting);
+ GLSMLighting.captureLighting(passLighting);
}
public SegmentedBufferBuilder getBuffer(RenderLayer type, int blockEntityId) {
@@ -198,7 +201,7 @@ public class AngelicaBufferSource implements Groupable {
private void restoreDrawState() {
if (drawStateDepth >= 0) {
drawDefaults.restore();
- GLStateManager.popStateTo(drawStateDepth);
+ GLSMAttribStack.popStateTo(drawStateDepth);
drawStateDepth = -1;
}
}
@@ -225,9 +228,9 @@ public class AngelicaBufferSource implements Groupable {
final boolean hasRetained = hook != null && hook.hasDraws(layer);
if (!hasDynamic && !hasRetained) return;
if (drawStateDepth < 0) {
- drawStateDepth = GLStateManager.pushState(StateSet.BATCH);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- if (passLighting != null) GLStateManager.applyLighting(passLighting);
+ drawStateDepth = GLSMAttribStack.pushState(StateSet.BATCH);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ if (passLighting != null) GLSMLighting.applyLighting(passLighting);
drawDefaults.apply();
}
saveIrisState();
@@ -258,9 +261,9 @@ public class AngelicaBufferSource implements Groupable {
boolean boundSetup = false;
Throwable failure = null;
try {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
matrixPushed = true;
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
int currentEntity = Integer.MIN_VALUE;
int currentBlock = Integer.MIN_VALUE;
int currentItem = Integer.MIN_VALUE;
@@ -306,7 +309,7 @@ public class AngelicaBufferSource implements Groupable {
}
if (matrixPushed) {
try {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
} catch (Throwable cleanup) {
failure = RenderFailures.suppress(failure, cleanup);
}
diff --git a/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java b/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java
index b0ad197a9..bbe445f4e 100644
--- a/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java
+++ b/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.celeritas;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor;
import net.coderbot.iris.Iris;
@@ -106,22 +107,22 @@ public class IrisCeleritasChunkShaderInterface implements ChunkShaderInterface {
bindFramebuffer(pass);
if (ShadowRenderingState.areShadowsCurrentlyBeingRendered()) {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
}
// Explicitly set iris_LightmapTextureMatrix rather than relying on CompatUniformManager.
// At high uniform locations in large UBOs, the compat manager's writes may not persist
// through the per-program dirtyUniforms swap in non-GL backends.
if (uniformLightmapTextureMatrix != null) {
- uniformLightmapTextureMatrix.set(GLStateManager.getTextures().getTextureUnitMatrix(1));
+ uniformLightmapTextureMatrix.set(GLSMTextures.getTextures().getTextureUnitMatrix(1));
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.ALBEDO_TEXTURE_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, Minecraft.getMinecraft().getTextureMapBlocks().getGlTextureId());
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.ALBEDO_TEXTURE_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, Minecraft.getMinecraft().getTextureMapBlocks().getGlTextureId());
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT);
final DynamicTexture lightmapTexture = ((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId());
if (blendModeOverride != null) {
blendModeOverride.apply();
diff --git a/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java b/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java
index ca97a8ded..42040f4e5 100644
--- a/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java
+++ b/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.compat.dh;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.seibel.distanthorizons.api.DhApi;
import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiFramebuffer;
import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiGenericObjectShaderProgram;
@@ -260,9 +260,9 @@ public class DHCompatInternal {
public void copyTranslucents(int width, int height) {
if (translucentDepthDirty) {
translucentDepthDirty = false;
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, depthTexNoTranslucent.getTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, depthTexNoTranslucent.getTextureId());
dhTerrainFramebuffer.bindAsReadBuffer();
- GLStateManager.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, DepthBufferFormat.DEPTH32F.getGlInternalFormat(), 0, 0, width, height, 0);
+ GLSMTextures.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, DepthBufferFormat.DEPTH32F.getGlInternalFormat(), 0, 0, width, height, 0);
} else {
DepthCopyStrategy.fastest(false).copy(dhTerrainFramebuffer, storedDepthTex, null, depthTexNoTranslucent.getTextureId(), width, height);
}
diff --git a/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java b/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java
index 1d4a68cb4..be50b6523 100644
--- a/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java
+++ b/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.compat.dh;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiFramebuffer;
import net.coderbot.iris.gl.framebuffer.GlFramebuffer;
import org.lwjgl.opengl.GL30;
@@ -37,7 +37,7 @@ public class DhFrameBufferWrapper implements IDhApiFramebuffer {
@Override
public int getStatus() {
this.bind();
- int status = GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER);
+ int status = GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER);
return status;
}
diff --git a/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java b/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java
index dc9310cd1..d3971e9f6 100644
--- a/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java
+++ b/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java
@@ -1,7 +1,11 @@
package net.coderbot.iris.compat.dh;
import com.google.common.primitives.Ints;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor;
import org.lwjgl.BufferUtils;
import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiGenericObjectShaderProgram;
@@ -67,49 +71,49 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
// This will bind AbstractVertexAttribute
private IrisGenericRenderProgram(String name, boolean isShadowPass, boolean translucent, BlendModeOverride override, BufferBlendOverride[] bufferBlendOverrides, String vertex, String tessControl, String tessEval, String geometry, String fragment, CustomUniforms customUniforms, DeferredWorldRenderingPipeline pipeline) {
- id = GLStateManager.glCreateProgram();
+ id = GLSMPrograms.glCreateProgram();
- GLStateManager.glBindAttribLocation(this.id, 0, "vPosition");
- GLStateManager.glBindAttribLocation(this.id, 1, "iris_color");
- GLStateManager.glBindAttribLocation(this.id, 2, "aScale");
- GLStateManager.glBindAttribLocation(this.id, 3, "aTranslateChunk");
- GLStateManager.glBindAttribLocation(this.id, 4, "aTranslateSubChunk");
- GLStateManager.glBindAttribLocation(this.id, 5, "aMaterial");
+ GLSMPrograms.glBindAttribLocation(this.id, 0, "vPosition");
+ GLSMPrograms.glBindAttribLocation(this.id, 1, "iris_color");
+ GLSMPrograms.glBindAttribLocation(this.id, 2, "aScale");
+ GLSMPrograms.glBindAttribLocation(this.id, 3, "aTranslateChunk");
+ GLSMPrograms.glBindAttribLocation(this.id, 4, "aTranslateSubChunk");
+ GLSMPrograms.glBindAttribLocation(this.id, 5, "aMaterial");
this.bufferBlendOverrides = bufferBlendOverrides;
GlShader vert = new GlShader(ShaderType.VERTEX, name + ".vsh", vertex);
- GLStateManager.glAttachShader(id, vert.getHandle());
+ GLSMPrograms.glAttachShader(id, vert.getHandle());
GlShader tessCont = null;
if (tessControl != null) {
tessCont = new GlShader(ShaderType.TESSELATION_CONTROL, name + ".tcs", tessControl);
- GLStateManager.glAttachShader(id, tessCont.getHandle());
+ GLSMPrograms.glAttachShader(id, tessCont.getHandle());
}
GlShader tessE = null;
if (tessEval != null) {
tessE = new GlShader(ShaderType.TESSELATION_EVAL, name + ".tes", tessEval);
- GLStateManager.glAttachShader(id, tessE.getHandle());
+ GLSMPrograms.glAttachShader(id, tessE.getHandle());
}
GlShader geom = null;
if (geometry != null) {
geom = new GlShader(ShaderType.GEOMETRY, name + ".gsh", geometry);
- GLStateManager.glAttachShader(id, geom.getHandle());
+ GLSMPrograms.glAttachShader(id, geom.getHandle());
}
GlShader frag = new GlShader(ShaderType.FRAGMENT, name + ".fsh", fragment);
- GLStateManager.glAttachShader(id, frag.getHandle());
+ GLSMPrograms.glAttachShader(id, frag.getHandle());
- GLStateManager.glLinkProgram(this.id);
- int status = GLStateManager.glGetProgrami(this.id, GL20.GL_LINK_STATUS);
+ GLSMPrograms.glLinkProgram(this.id);
+ int status = GLSMPrograms.glGetProgrami(this.id, GL20.GL_LINK_STATUS);
if (status != 1) {
- String message = "Shader link error in Iris DH program! Details: " + GLStateManager.glGetProgramInfoLog(this.id, 9999);
+ String message = "Shader link error in Iris DH program! Details: " + GLSMPrograms.glGetProgramInfoLog(this.id, 9999);
this.free();
throw new RuntimeException(message);
} else {
- GLStateManager.glUseProgram(this.id);
+ GLSMPrograms.glUseProgram(this.id);
}
vert.destroy();
@@ -135,9 +139,9 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
samplers = samplerBuilder.build();
images = builder.build();
- this.va = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(va);
- GLStateManager.glEnableVertexAttribArray(0);
+ this.va = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(va);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
this.instancedShaderOffsetChunkUniform = this.tryGetUniformLocation2("uOffsetChunk");
this.instancedShaderOffsetSubChunkUniform = this.tryGetUniformLocation2("uOffsetSubChunk");
@@ -188,7 +192,7 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
}
public int tryGetUniformLocation2(CharSequence name) {
- return GLStateManager.glGetUniformLocation(this.id, name);
+ return GLSMPrograms.glGetUniformLocation(this.id, name);
}
private final FloatBuffer matrixScratch = BufferUtils.createFloatBuffer(16);
@@ -196,13 +200,13 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
public void setUniform(int index, Matrix4f matrix) {
if (index == -1 || matrix == null) return;
matrix.get(matrixScratch);
- GLStateManager.glUniformMatrix4(index, false, matrixScratch);
+ GLSMPrograms.glUniformMatrix4(index, false, matrixScratch);
}
// Override ShaderProgram.bind()
public void bind(DhApiRenderParam renderParam) {
- GLStateManager.glBindVertexArray(va);
- GLStateManager.glUseProgram(id);
+ GLSMVertexInput.glBindVertexArray(va);
+ GLSMPrograms.glUseProgram(id);
if (blend != null) blend.apply();
for (BufferBlendOverride override : bufferBlendOverrides) {
@@ -214,9 +218,9 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
this.setUniform(this.instancedShaderProjectionModelViewMatrixUniform, tempMat4.set(tempProj).mul(tempModel));
LodRendererEvents.pushDhMatrices(tempProj, tempModel);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT);
DynamicTexture lightmapTexture = ((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId());
samplers.update();
uniforms.update();
@@ -228,8 +232,8 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
public void unbind() {
LodRendererEvents.popDhMatrices();
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glUseProgram(0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMPrograms.glUseProgram(0);
ProgramUniforms.clearActiveUniforms();
ProgramSamplers.clearActiveSamplers();
BlendModeOverride.restore();
@@ -237,8 +241,8 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
@Override
public void bindVertexBuffer(int i) {
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, i);
- GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, i);
+ GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0);
}
@Override
@@ -252,13 +256,13 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
}
public void free() {
- GLStateManager.glDeleteProgram(id);
+ GLSMPrograms.glDeleteProgram(id);
}
public void fillIndirectUniformData(DhApiRenderParam dhApiRenderParam, DhApiRenderableBoxGroupShading dhApiRenderableBoxGroupShading, IDhApiRenderableBoxGroup boxGroup, DhApiVec3d camPos) {
bind(dhApiRenderParam);
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
this.setUniform(this.instancedShaderOffsetChunkUniform,
getChunkPosFromDouble(boxGroup.getOriginBlockPos().x),
getChunkPosFromDouble(boxGroup.getOriginBlockPos().y),
@@ -302,19 +306,19 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra
}
private void setUniform(int index, int value) {
- GLStateManager.glUniform1i(index, value);
+ GLSMPrograms.glUniform1i(index, value);
}
private void setUniform(int index, float value) {
- GLStateManager.glUniform1f(index, value);
+ GLSMPrograms.glUniform1f(index, value);
}
private void setUniform(int index, float x, float y, float z) {
- GLStateManager.glUniform3f(index, x, y, z);
+ GLSMPrograms.glUniform3f(index, x, y, z);
}
private void setUniform(int index, int x, int y, int z) {
- GLStateManager.glUniform3i(index, x, y, z);
+ GLSMPrograms.glUniform3i(index, x, y, z);
}
}
diff --git a/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java b/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java
index 7fba9f17f..6ab8fb029 100644
--- a/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java
+++ b/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java
@@ -1,7 +1,8 @@
package net.coderbot.iris.compat.dh;
import com.google.common.primitives.Ints;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor;
import com.seibel.distanthorizons.api.DhApi;
import com.seibel.distanthorizons.api.objects.math.DhApiVec3f;
@@ -52,46 +53,46 @@ public class IrisLodRenderProgram {
// This will bind AbstractVertexAttribute
private IrisLodRenderProgram(String name, boolean isShadowPass, boolean translucent, BlendModeOverride override, BufferBlendOverride[] bufferBlendOverrides, String vertex, String tessControl, String tessEval, String geometry, String fragment, CustomUniforms customUniforms, DeferredWorldRenderingPipeline pipeline) {
- id = GLStateManager.glCreateProgram();
+ id = GLSMPrograms.glCreateProgram();
- GLStateManager.glBindAttribLocation(this.id, 0, "vPosition");
- GLStateManager.glBindAttribLocation(this.id, 1, "iris_color");
- GLStateManager.glBindAttribLocation(this.id, 2, "irisExtra");
+ GLSMPrograms.glBindAttribLocation(this.id, 0, "vPosition");
+ GLSMPrograms.glBindAttribLocation(this.id, 1, "iris_color");
+ GLSMPrograms.glBindAttribLocation(this.id, 2, "irisExtra");
this.bufferBlendOverrides = bufferBlendOverrides;
GlShader vert = new GlShader(ShaderType.VERTEX, name + ".vsh", vertex);
- GLStateManager.glAttachShader(id, vert.getHandle());
+ GLSMPrograms.glAttachShader(id, vert.getHandle());
GlShader tessCont = null;
if (tessControl != null) {
tessCont = new GlShader(ShaderType.TESSELATION_CONTROL, name + ".tcs", tessControl);
- GLStateManager.glAttachShader(id, tessCont.getHandle());
+ GLSMPrograms.glAttachShader(id, tessCont.getHandle());
}
GlShader tessE = null;
if (tessEval != null) {
tessE = new GlShader(ShaderType.TESSELATION_EVAL, name + ".tes", tessEval);
- GLStateManager.glAttachShader(id, tessE.getHandle());
+ GLSMPrograms.glAttachShader(id, tessE.getHandle());
}
GlShader geom = null;
if (geometry != null) {
geom = new GlShader(ShaderType.GEOMETRY, name + ".gsh", geometry);
- GLStateManager.glAttachShader(id, geom.getHandle());
+ GLSMPrograms.glAttachShader(id, geom.getHandle());
}
GlShader frag = new GlShader(ShaderType.FRAGMENT, name + ".fsh", fragment);
- GLStateManager.glAttachShader(id, frag.getHandle());
+ GLSMPrograms.glAttachShader(id, frag.getHandle());
- GLStateManager.glLinkProgram(this.id);
- int status = GLStateManager.glGetProgrami(this.id, GL20.GL_LINK_STATUS);
+ GLSMPrograms.glLinkProgram(this.id);
+ int status = GLSMPrograms.glGetProgrami(this.id, GL20.GL_LINK_STATUS);
if (status != 1) {
- String message = "Shader link error in Iris DH program! Details: " + GLStateManager.glGetProgramInfoLog(this.id, 9999);
+ String message = "Shader link error in Iris DH program! Details: " + GLSMPrograms.glGetProgramInfoLog(this.id, 9999);
this.free();
throw new RuntimeException(message);
} else {
- GLStateManager.glUseProgram(this.id);
+ GLSMPrograms.glUseProgram(this.id);
}
vert.destroy();
@@ -156,12 +157,12 @@ public class IrisLodRenderProgram {
// Noise Uniforms
public int tryGetUniformLocation2(CharSequence name) {
- return GLStateManager.glGetUniformLocation(this.id, name);
+ return GLSMPrograms.glGetUniformLocation(this.id, name);
}
// Override ShaderProgram.bind()
public void bind() {
- GLStateManager.glUseProgram(id);
+ GLSMPrograms.glUseProgram(id);
if (blend != null) blend.apply();
for (BufferBlendOverride override : bufferBlendOverrides) {
@@ -170,22 +171,22 @@ public class IrisLodRenderProgram {
}
public void unbind() {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
ProgramUniforms.clearActiveUniforms();
ProgramSamplers.clearActiveSamplers();
BlendModeOverride.restore();
}
public void free() {
- GLStateManager.glDeleteProgram(id);
+ GLSMPrograms.glDeleteProgram(id);
}
public void fillUniformData(Matrix4fc projection, Matrix4fc modelView, int worldYOffset, float partialTicks) {
- GLStateManager.glUseProgram(id);
+ GLSMPrograms.glUseProgram(id);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT);
DynamicTexture lightmapTexture = ((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId());
LodRendererEvents.pushDhMatrices(projection, modelView);
@@ -208,7 +209,7 @@ public class IrisLodRenderProgram {
}
private void setUniform(int index, float value) {
- GLStateManager.glUniform1f(index, value);
+ GLSMPrograms.glUniform1f(index, value);
}
public void setModelPos(DhApiVec3f modelPos) {
@@ -216,7 +217,7 @@ public class IrisLodRenderProgram {
}
private void setUniform(int index, DhApiVec3f pos) {
- GLStateManager.glUniform3f(index, pos.x, pos.y, pos.z);
+ GLSMPrograms.glUniform3f(index, pos.x, pos.y, pos.z);
}
}
diff --git a/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java b/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java
index 7e09e295b..7a3d7d784 100644
--- a/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java
+++ b/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java
@@ -1,6 +1,8 @@
package net.coderbot.iris.compat.dh;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.rendering.RenderingState;
import com.seibel.distanthorizons.api.DhApi;
import com.seibel.distanthorizons.api.enums.rendering.EDhApiFogDrawMode;
@@ -53,18 +55,18 @@ public class LodRendererEvents {
static void pushDhMatrices(Matrix4fc projection, Matrix4fc modelView) {
if (!dhMatricesActive) {
- savedModelView.set(GLStateManager.getModelViewMatrix());
- savedProjection.set(GLStateManager.getProjectionMatrix());
+ savedModelView.set(GLSMMatrices.getModelViewMatrix());
+ savedProjection.set(GLSMMatrices.getProjectionMatrix());
dhMatricesActive = true;
}
- GLStateManager.setModelViewMatrix(modelView);
- GLStateManager.setProjectionMatrix(projection);
+ GLSMMatrices.setModelViewMatrix(modelView);
+ GLSMMatrices.setProjectionMatrix(projection);
}
static void popDhMatrices() {
if (dhMatricesActive) {
- GLStateManager.setModelViewMatrix(savedModelView);
- GLStateManager.setProjectionMatrix(savedProjection);
+ GLSMMatrices.setModelViewMatrix(savedModelView);
+ GLSMMatrices.setProjectionMatrix(savedProjection);
dhMatricesActive = false;
}
}
@@ -211,7 +213,7 @@ public class LodRendererEvents {
} else {
getInstance().getSolidShader().unbind();
if (atTranslucent) {
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
}
}
}
@@ -229,7 +231,7 @@ public class LodRendererEvents {
if (ShadowRenderingState.areShadowsCurrentlyBeingRendered()) {
event.cancelEvent();
} else if (getInstance().shouldOverride) {
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
event.cancelEvent();
}
}
@@ -364,7 +366,7 @@ public class LodRendererEvents {
instance.copyTranslucents(textureWidth, textureHeight);
instance.getTranslucentShader().bind();
Matrix4f projection = RenderingState.INSTANCE.getProjectionMatrix();
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
instance.getTranslucentShader().fillUniformData(
new Matrix4f().setPerspective(projection.perspectiveFov(), projection.m11() / projection.m00(), event.value.nearClipPlane, event.value.farClipPlane),
diff --git a/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java b/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java
index c07b1bd54..a61c03997 100644
--- a/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java
+++ b/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gbuffer_overrides.matching;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
import org.lwjgl.opengl.GL11;
@@ -15,10 +15,10 @@ public final class TranslucentBlendMatcher {
private TranslucentBlendMatcher() {}
public static boolean matchesCurrentState() {
- if (!GLStateManager.isEffectiveBlendEnabled()) {
+ if (!GLSMBlend.isEffectiveBlendEnabled()) {
return false;
}
- GLStateManager.getEffectiveBlendState(scratch);
+ GLSMBlend.getEffectiveBlendState(scratch);
return scratch.getSrcRgb() == GL11.GL_SRC_ALPHA && scratch.getDstRgb() == GL11.GL_ONE_MINUS_SRC_ALPHA;
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java b/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java
index d51e598ae..41a0f8fb6 100644
--- a/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java
+++ b/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java
@@ -2,7 +2,7 @@ package net.coderbot.iris.gl.blending;
import com.gtnewhorizons.angelica.glsm.states.AlphaTestFunction;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.glsm.hooks.VanillaBooleanLayer;
import com.gtnewhorizons.angelica.glsm.hooks.VanillaStateLayer;
import com.gtnewhorizons.angelica.glsm.states.AlphaState;
@@ -22,10 +22,10 @@ public class AlphaTestStorage {
public static void overrideAlphaTest(AlphaTest override) {
if (!overrideHeld) {
- final AlphaState alphaState = GLStateManager.getAlphaState();
+ final AlphaState alphaState = GLSMDepthStencilAlpha.getAlphaState();
// Only save the previous state if the alpha test wasn't already overridden
- vanillaEnabled = GLStateManager.getAlphaTest().isEnabled();
+ vanillaEnabled = GLSMDepthStencilAlpha.getAlphaTest().isEnabled();
vanillaFunction = alphaState.getFunction();
vanillaReference = alphaState.getReference();
}
@@ -43,10 +43,10 @@ public class AlphaTestStorage {
alphaTestLocked = false;
try {
if (enabled) {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(function, reference);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(function, reference);
} else {
- GLStateManager.disableAlphaTest();
+ GLSMDepthStencilAlpha.disableAlphaTest();
}
} finally {
alphaTestLocked = true;
@@ -74,12 +74,12 @@ public class AlphaTestStorage {
alphaTestLocked = false;
if (vanillaEnabled) {
- GLStateManager.enableAlphaTest();
+ GLSMDepthStencilAlpha.enableAlphaTest();
} else {
- GLStateManager.disableAlphaTest();
+ GLSMDepthStencilAlpha.disableAlphaTest();
}
- GLStateManager.glAlphaFunc(vanillaFunction, vanillaReference);
+ GLSMDepthStencilAlpha.glAlphaFunc(vanillaFunction, vanillaReference);
overrideHeld = false;
}
diff --git a/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java b/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java
index f3ef25f79..10baa5ff4 100644
--- a/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java
+++ b/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.blending;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.hooks.VanillaBooleanLayer;
import com.gtnewhorizons.angelica.glsm.hooks.VanillaStateLayer;
@@ -45,10 +45,10 @@ public class BlendModeStorage {
blendLocked = false;
try {
if (override == null) {
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
} else {
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(override.getSrcRgb(), override.getDstRgb(), override.getSrcAlpha(), override.getDstAlpha());
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(override.getSrcRgb(), override.getDstRgb(), override.getSrcAlpha(), override.getDstAlpha());
}
} finally {
blendLocked = true;
@@ -79,8 +79,8 @@ public class BlendModeStorage {
private static void captureVanilla() {
if (!overrideHeld) {
- vanillaBlendEnable = GLStateManager.getBlendMode().isEnabled();
- vanillaBlend.set(GLStateManager.getBlendState());
+ vanillaBlendEnable = GLSMBlend.getBlendMode().isEnabled();
+ vanillaBlend.set(GLSMBlend.getBlendState());
}
}
@@ -146,11 +146,11 @@ public class BlendModeStorage {
blendLocked = false;
try {
if (vanillaBlendEnable) {
- GLStateManager.enableBlend();
+ GLSMBlend.enableBlend();
} else {
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
}
- GLStateManager.tryBlendFuncSeparate(vanillaBlend.getSrcRgb(), vanillaBlend.getDstRgb(), vanillaBlend.getSrcAlpha(), vanillaBlend.getDstAlpha());
+ GLSMBlend.tryBlendFuncSeparate(vanillaBlend.getSrcRgb(), vanillaBlend.getDstRgb(), vanillaBlend.getSrcAlpha(), vanillaBlend.getDstAlpha());
} finally {
blendLocked = wasLocked;
}
diff --git a/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java b/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java
index 73a391099..5985d044d 100644
--- a/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java
+++ b/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java
@@ -2,7 +2,8 @@ package net.coderbot.iris.gl.blending;
import com.gtnewhorizons.angelica.glsm.states.DepthState;
import com.gtnewhorizons.angelica.glsm.states.ColorMask;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.glsm.hooks.VanillaStateLayer;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import lombok.Getter;
@@ -33,8 +34,8 @@ public class DepthColorStorage {
public static void disableDepthColor() {
if (!overrideHeld) {
- final ColorMask colorMask = GLStateManager.getColorMask();
- final DepthState depthState = GLStateManager.getDepthState();
+ final ColorMask colorMask = GLSMBlend.getColorMask();
+ final DepthState depthState = GLSMDepthStencilAlpha.getDepthState();
vanillaDepthEnable = depthState.isEnabled();
vanillaColor.set(colorMask);
@@ -44,8 +45,8 @@ public class DepthColorStorage {
depthColorLocked = false;
try {
- GLStateManager.glDepthMask(false);
- GLStateManager.glColorMask(false, false, false, false);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMBlend.glColorMask(false, false, false, false);
} finally {
depthColorLocked = true;
}
@@ -66,8 +67,8 @@ public class DepthColorStorage {
depthColorLocked = false;
- GLStateManager.glDepthMask(vanillaDepthEnable);
- GLStateManager.glColorMask(vanillaColor.red, vanillaColor.green, vanillaColor.blue, vanillaColor.alpha);
+ GLSMDepthStencilAlpha.glDepthMask(vanillaDepthEnable);
+ GLSMBlend.glColorMask(vanillaColor.red, vanillaColor.green, vanillaColor.blue, vanillaColor.alpha);
overrideHeld = false;
}
diff --git a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java
index fd72e1a2c..cc5fc893e 100644
--- a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java
+++ b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.buffer;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import lombok.Getter;
import org.embeddedt.embeddium.impl.gl.debug.GLDebug;
@@ -41,8 +41,8 @@ public class ShaderStorageBuffer {
if (!info.relative()) return;
RenderSystem.deleteBuffers(id);
- int newId = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, newId);
+ int newId = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, newId);
// Calculation time
long newWidth = (long) (width * info.scaleX());
diff --git a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java
index 5ed03c326..bd5827639 100644
--- a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java
+++ b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.buffer;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
import net.coderbot.iris.gl.sampler.SamplerLimits;
@@ -38,7 +38,7 @@ public class ShaderStorageBufferHolder {
if (bufferInfo.relative()) {
buffers[index].resizeIfRelative(width, height);
} else {
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer);
RenderSystem.bufferStorage(GL43.GL_SHADER_STORAGE_BUFFER, bufferInfo.size(), 0);
RenderSystem.clearBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, GL30.GL_R8, 0, bufferInfo.size(), GL11.GL_RED, GL11.GL_BYTE, new int[]{0});
RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, index, buffer);
@@ -49,7 +49,7 @@ public class ShaderStorageBufferHolder {
destroyBuffers();
throw e;
} finally {
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java b/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java
index 02ada8c3e..206690b20 100644
--- a/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java
+++ b/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java
@@ -3,7 +3,8 @@ package net.coderbot.iris.gl.framebuffer;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack.*;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
import it.unimi.dsi.fastutil.ints.Int2IntArrayMap;
@@ -25,8 +26,8 @@ public class GlFramebuffer extends GlResource {
super(RenderSystem.createFramebuffer());
this.attachments = new Int2IntArrayMap();
- this.maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
- this.maxColorAttachments = GLStateManager.glGetInteger(GL30.GL_MAX_COLOR_ATTACHMENTS);
+ this.maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
+ this.maxColorAttachments = GLSMQueries.glGetInteger(GL30.GL_MAX_COLOR_ATTACHMENTS);
this.hasDepthAttachment = false;
}
@@ -100,25 +101,25 @@ public class GlFramebuffer extends GlResource {
}
public void bind() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, getGlId());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, getGlId());
}
public void bindAsReadBuffer() {
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, getGlId());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, getGlId());
}
public void bindAsDrawBuffer() {
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, getGlId());
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, getGlId());
}
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteFramebuffers(getGlId());
+ GLSMFramebuffer.glDeleteFramebuffers(getGlId());
}
public int getStatus() {
bind();
- return GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER);
+ return GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER);
}
public boolean isComplete() {
diff --git a/src/main/java/net/coderbot/iris/gl/image/GlImage.java b/src/main/java/net/coderbot/iris/gl/image/GlImage.java
index 145a970a3..ba5d9d587 100644
--- a/src/main/java/net/coderbot/iris/gl/image/GlImage.java
+++ b/src/main/java/net/coderbot/iris/gl/image/GlImage.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.image;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.texture.InternalTextureFormat;
import com.gtnewhorizons.angelica.glsm.texture.PixelFormat;
@@ -39,14 +39,14 @@ public class GlImage extends GlObject {
GLDebug.nameObject(GL11.GL_TEXTURE, handle(), name);
- GLStateManager.glBindTexture(target.getGlType(), handle());
+ GLSMTextures.glBindTexture(target.getGlType(), handle());
target.apply(handle(), width, height, depth, internalFormat.getGlFormat(), format.getGlFormat(), pixelType.getGlFormat(), null);
final int texture = handle();
setup(texture, width, height, depth);
- GLStateManager.glBindTexture(target.getGlType(), 0);
+ GLSMTextures.glBindTexture(target.getGlType(), 0);
BY_NAME.put(name, this);
}
@@ -112,7 +112,7 @@ public class GlImage extends GlObject {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteTextures(handle());
+ GLSMTextures.glDeleteTextures(handle());
BY_NAME.remove(name, this);
}
@@ -147,14 +147,14 @@ public class GlImage extends GlObject {
@Override
public void updateNewSize(int width, int height) {
- GLStateManager.glBindTexture(target.getGlType(), handle());
+ GLSMTextures.glBindTexture(target.getGlType(), handle());
target.apply(handle(), (int) (width * relativeWidth), (int) (height * relativeHeight), 0, internalTextureFormat.getGlFormat(), format.getGlFormat(), pixelType.getGlFormat(), null);
final int texture = handle();
setup(texture, width, height, 0);
- GLStateManager.glBindTexture(target.getGlType(), 0);
+ GLSMTextures.glBindTexture(target.getGlType(), 0);
}
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java b/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java
index d95501fe6..1a2d5cf9f 100644
--- a/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java
+++ b/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable;
import org.joml.Vector2f;
import org.joml.Vector3i;
import org.lwjgl.BufferUtils;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.lwjgl.opengl.GL42;
import org.lwjgl.opengl.GL43;
@@ -71,7 +71,7 @@ public final class ComputeProgram extends GlResource {
}
public void use() {
- GLStateManager.glUseProgram(getGlId());
+ GLSMPrograms.glUseProgram(getGlId());
uniforms.update();
samplers.update();
@@ -94,7 +94,7 @@ public final class ComputeProgram extends GlResource {
public static void unbind() {
ProgramUniforms.clearActiveUniforms();
ProgramSamplers.clearActiveSamplers();
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
}
@Override
@@ -103,7 +103,7 @@ public final class ComputeProgram extends GlResource {
if (sources != null) {
RetainedPrograms.retain(sources, getGlId());
} else {
- GLStateManager.glDeleteProgram(getGlId());
+ GLSMPrograms.glDeleteProgram(getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/program/Program.java b/src/main/java/net/coderbot/iris/gl/program/Program.java
index 3302d58c7..dc6fdbd67 100644
--- a/src/main/java/net/coderbot/iris/gl/program/Program.java
+++ b/src/main/java/net/coderbot/iris/gl/program/Program.java
@@ -3,6 +3,7 @@ package net.coderbot.iris.gl.program;
import lombok.Getter;
import net.coderbot.iris.gl.GlResource;
import net.coderbot.iris.gl.blending.DepthColorStorage;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.jetbrains.annotations.Nullable;
@@ -59,7 +60,7 @@ public final class Program extends GlResource {
final int previousManagedBind = managedBindProgram;
managedBindProgram = program;
try {
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
} finally {
managedBindProgram = previousManagedBind;
}
@@ -70,7 +71,7 @@ public final class Program extends GlResource {
try {
ProgramUniforms.clearActiveUniforms();
ProgramSamplers.clearActiveSamplers();
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
} finally {
GLStateManager.resumeExitCapture(suspended);
}
@@ -82,7 +83,7 @@ public final class Program extends GlResource {
if (sources != null) {
RetainedPrograms.retain(sources, getGlId());
} else {
- GLStateManager.glDeleteProgram(getGlId());
+ GLSMPrograms.glDeleteProgram(getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java b/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java
index ba079434b..0258ff535 100644
--- a/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java
+++ b/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java
@@ -2,7 +2,7 @@ package net.coderbot.iris.gl.program;
import com.google.common.collect.ImmutableSet;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder;
import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache;
@@ -61,7 +61,7 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo
initializeFallbackUniforms(retained);
return new ProgramBuilder(name, retained, reservedTextureUnits).retainAs(sources);
}
- GLStateManager.glDeleteProgram(retained);
+ GLSMPrograms.glDeleteProgram(retained);
}
if (cacheKey != null) {
@@ -97,14 +97,14 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo
/** Initialize alpha and color uniforms to neutral values until the first pass update. */
private static void initializeFallbackUniforms(int programId) {
- final int previous = GLStateManager.getActiveProgram();
+ final int previous = GLSMPrograms.getActiveProgram();
final CommandRecorder recorder = DisplayListManager.isRecording() ? DisplayListManager.pauseRecording() : null;
try {
Program.bindManaged(programId);
seedUniform1i(programId, "iris_currentAlphaFunc", 7);
seedUniform1f(programId, "iris_currentAlphaTest", -1.0f);
seedUniform1f(programId, "alphaTestRef", -1.0f);
- final int modulator = GLStateManager.glGetUniformLocation(programId, "iris_ColorModulator");
+ final int modulator = GLSMPrograms.glGetUniformLocation(programId, "iris_ColorModulator");
if (modulator != -1) {
RenderSystem.uniform4f(modulator, 1.0f, 1.0f, 1.0f, 1.0f);
}
@@ -118,14 +118,14 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo
}
private static void seedUniform1i(int programId, String name, int value) {
- final int location = GLStateManager.glGetUniformLocation(programId, name);
+ final int location = GLSMPrograms.glGetUniformLocation(programId, name);
if (location != -1) {
RenderSystem.uniform1i(location, value);
}
}
private static void seedUniform1f(int programId, String name, float value) {
- final int location = GLStateManager.glGetUniformLocation(programId, name);
+ final int location = GLSMPrograms.glGetUniformLocation(programId, name);
if (location != -1) {
RenderSystem.uniform1f(location, value);
}
@@ -146,7 +146,7 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo
if (cacheKey == null || ProgramBinaryCache.saveRetained(cacheKey, retained)) {
return new ProgramBuilder(name, retained, reservedTextureUnits).retainAs(sources);
}
- GLStateManager.glDeleteProgram(retained);
+ GLSMPrograms.glDeleteProgram(retained);
}
if (cacheKey != null) {
diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java b/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java
index 60a7e4c76..7a83e1e5a 100644
--- a/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java
+++ b/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java
@@ -6,7 +6,7 @@ import net.coderbot.iris.gl.image.ImageBinding;
import net.coderbot.iris.gl.image.ImageHolder;
import net.coderbot.iris.gl.image.ImageLimits;
import com.gtnewhorizons.angelica.glsm.texture.InternalTextureFormat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import java.util.ArrayList;
import java.util.List;
@@ -60,12 +60,12 @@ public class ProgramImages {
@Override
public boolean hasImage(String name) {
- return GLStateManager.glGetUniformLocation(program, name) != -1;
+ return GLSMPrograms.glGetUniformLocation(program, name) != -1;
}
@Override
public void addTextureImage(IntSupplier textureID, InternalTextureFormat internalFormat, String name) {
- int location = GLStateManager.glGetUniformLocation(program, name);
+ int location = GLSMPrograms.glGetUniformLocation(program, name);
if (location == -1) {
return;
diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java b/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java
index de8247e2e..3e65c3f2a 100644
--- a/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java
+++ b/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java
@@ -2,7 +2,7 @@ package net.coderbot.iris.gl.program;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import net.coderbot.iris.gl.sampler.GlSampler;
@@ -40,7 +40,7 @@ public class ProgramSamplers {
active = this;
- int activeTexture = GLStateManager.getActiveTextureUnit();
+ int activeTexture = GLSMTextures.getActiveTextureUnit();
try {
if (initializer != null) {
for (GlUniform1iCall call : initializer) {
@@ -57,7 +57,7 @@ public class ProgramSamplers {
clearActiveSamplers();
throw e;
} finally {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + activeTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + activeTexture);
}
}
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 abbb61ede..d17c22479 100644
--- a/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java
+++ b/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java
@@ -2,7 +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.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import java.nio.IntBuffer;
@@ -72,7 +72,7 @@ public class ProgramUniforms {
public void update() {
// glUseProgram is only recorded during GL_COMPILE
if (DisplayListManager.getRecordMode() == DisplayListManager.RecordMode.COMPILE
- || GLStateManager.getActiveProgram() != program) {
+ || GLSMPrograms.getActiveProgram() != program) {
hasDeferredUploads = true;
return;
}
@@ -128,7 +128,7 @@ public class ProgramUniforms {
}
public static boolean isActiveProgramBound() {
- return active != null && GLStateManager.getActiveProgram() == active.program;
+ return active != null && GLSMPrograms.getActiveProgram() == active.program;
}
public static void markActiveDeferred() {
@@ -212,7 +212,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 = GLStateManager.glGetProgrami(program, GL20.GL_ACTIVE_UNIFORMS);
+ final int activeUniforms = GLSMPrograms.glGetProgrami(program, GL20.GL_ACTIVE_UNIFORMS);
IntBuffer sizeType = BufferUtils.createIntBuffer(2);
for (int index = 0; index < activeUniforms; index++) {
diff --git a/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java b/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java
index 3c8aff160..8eb6e1e7f 100644
--- a/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java
+++ b/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.program;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayDeque;
@@ -51,7 +51,7 @@ public final class RetainedPrograms {
public static void afterPipelineBuilt() {
for (ArrayDeque programs : older.values()) {
for (int program : programs) {
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
}
}
older = recent;
diff --git a/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java b/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java
index 343df8df9..456b2f075 100644
--- a/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java
+++ b/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.sampler;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
@@ -13,9 +13,9 @@ public class SamplerLimits {
private final int maxShaderStorageUnits;
private SamplerLimits() {
- this.maxTextureUnits = GLStateManager.glGetInteger(GL20.GL_MAX_TEXTURE_IMAGE_UNITS);
- this.maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
- this.maxShaderStorageUnits = RenderSystem.supportsSSBO() ? GLStateManager.glGetInteger(GL43.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS) : 0;
+ this.maxTextureUnits = GLSMQueries.glGetInteger(GL20.GL_MAX_TEXTURE_IMAGE_UNITS);
+ this.maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
+ this.maxShaderStorageUnits = RenderSystem.supportsSSBO() ? GLSMQueries.glGetInteger(GL43.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS) : 0;
}
public static SamplerLimits get() {
diff --git a/src/main/java/net/coderbot/iris/gl/shader/GlShader.java b/src/main/java/net/coderbot/iris/gl/shader/GlShader.java
index 68b4fa6f4..ebf4ad7f1 100644
--- a/src/main/java/net/coderbot/iris/gl/shader/GlShader.java
+++ b/src/main/java/net/coderbot/iris/gl/shader/GlShader.java
@@ -3,7 +3,7 @@
package net.coderbot.iris.gl.shader;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.shader.ShaderType;
import net.coderbot.iris.gl.GlResource;
@@ -30,12 +30,12 @@ public class GlShader extends GlResource {
}
private static int createShader(ShaderType type, String name, String src) {
- int handle = GLStateManager.glCreateShader(type.id);
+ int handle = GLSMPrograms.glCreateShader(type.id);
// TODO: Iris
// ShaderWorkarounds.safeShaderSource(handle, src);
// TODO: ShaderWorkaround
- GLStateManager.glShaderSource(handle, src + '\0');
- GLStateManager.glCompileShader(handle);
+ GLSMPrograms.glShaderSource(handle, src + '\0');
+ GLSMPrograms.glCompileShader(handle);
GLDebug.nameObject(KHRDebug.GL_SHADER, handle, name + "(" + type.name().toLowerCase(Locale.ROOT) + ")");
@@ -45,7 +45,7 @@ public class GlShader extends GlResource {
LOGGER.warn("Shader compilation log for " + name + ": " + log);
}
- int result = GLStateManager.glGetShaderi(handle, GL20.GL_COMPILE_STATUS);
+ int result = GLSMPrograms.glGetShaderi(handle, GL20.GL_COMPILE_STATUS);
if (result != GL11.GL_TRUE) {
throw new RuntimeException("Shader compilation failed, see log for details");
@@ -64,6 +64,6 @@ public class GlShader extends GlResource {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteShader(this.getGlId());
+ GLSMPrograms.glDeleteShader(this.getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java
index 57ad40002..83cdf3d82 100644
--- a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java
+++ b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java
@@ -3,7 +3,7 @@
package net.coderbot.iris.gl.shader;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler;
@@ -51,17 +51,17 @@ public class ProgramCreator {
}
public static int create(String name, @Nullable ProgramBinaryCache.Key cacheKey, GlShader... shaders) {
- int program = GLStateManager.glCreateProgram();
+ int program = GLSMPrograms.glCreateProgram();
for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
RenderSystem.bindAttributeLocation(program, ATTRIBUTE_LOCATIONS[i], ATTRIBUTE_NAMES[i]);
}
for (GlShader shader : shaders) {
- GLStateManager.glAttachShader(program, shader.getHandle());
+ GLSMPrograms.glAttachShader(program, shader.getHandle());
}
- GLStateManager.glLinkProgram(program);
+ GLSMPrograms.glLinkProgram(program);
GLDebug.nameObject(KHRDebug.GL_PROGRAM, program, name);
@@ -76,7 +76,7 @@ public class ProgramCreator {
LOGGER.warn("Program link log for " + name + ": " + log);
}
- int result = GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS);
+ int result = GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS);
if (result != GL11.GL_TRUE) {
throw new RuntimeException("Shader program linking failed, see log for details");
diff --git a/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java b/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java
index cf306f7f3..0d11ed3bb 100644
--- a/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java
+++ b/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java
@@ -15,7 +15,7 @@ import net.coderbot.iris.texture.format.TextureFormat;
import net.coderbot.iris.texture.format.TextureFormatLoader;
import net.coderbot.iris.uniforms.VanillaBiomeList;
import net.minecraft.world.biome.BiomeGenBase;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import org.lwjgl.LWJGLUtil;
@@ -190,7 +190,7 @@ public class StandardMacros {
* @see Optifine Doc for GLSL Version
*/
public static String getGlVersion(int name) {
- return RenderSystem.parseGlVersionString(GLStateManager.glGetString(name));
+ return RenderSystem.parseGlVersionString(GLSMQueries.glGetString(name));
}
/**
@@ -219,7 +219,7 @@ public class StandardMacros {
* @see Optifine Doc
*/
public static String getVendor() {
- String vendor = Objects.requireNonNull(GLStateManager.glGetString(GL11.GL_VENDOR)).toLowerCase(Locale.ROOT);
+ String vendor = Objects.requireNonNull(GLSMQueries.glGetString(GL11.GL_VENDOR)).toLowerCase(Locale.ROOT);
if (vendor.startsWith("ati")) {
return "MC_GL_VENDOR_ATI";
} else if (vendor.startsWith("intel")) {
@@ -241,7 +241,7 @@ public class StandardMacros {
* @see Optifine Doc
*/
public static String getRenderer() {
- String renderer = Objects.requireNonNull(GLStateManager.glGetString(GL11.GL_RENDERER)).toLowerCase(Locale.ROOT);
+ String renderer = Objects.requireNonNull(GLSMQueries.glGetString(GL11.GL_RENDERER)).toLowerCase(Locale.ROOT);
if (renderer.startsWith("amd")) {
return "MC_GL_RENDERER_RADEON";
} else if (renderer.startsWith("ati")) {
@@ -274,10 +274,10 @@ public class StandardMacros {
* @see Optifine Doc
*/
public static Set getGlExtensions() {
- int numExtensions = GLStateManager.glGetInteger(GL30.GL_NUM_EXTENSIONS);
+ int numExtensions = GLSMQueries.glGetInteger(GL30.GL_NUM_EXTENSIONS);
String[] extensions = new String[numExtensions];
for (int i = 0; i < numExtensions; i++) {
- extensions[i] = GLStateManager.glGetStringi(GL11.GL_EXTENSIONS, i);
+ extensions[i] = GLSMQueries.glGetStringi(GL11.GL_EXTENSIONS, i);
}
// TODO note that we do not add extensions based on if the shader uses them and if they are supported
diff --git a/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java b/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java
index 44d384d50..63fa43daa 100644
--- a/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java
+++ b/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java
@@ -1,5 +1,6 @@
package net.coderbot.iris.gl.texture;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
@@ -97,7 +98,7 @@ public interface DepthCopyStrategy {
public void copy(GlFramebuffer sourceFb, int sourceTexture, GlFramebuffer destFb, int destTexture, int width, int height) {
if (Tracy.ENABLED) Tracy.beginZone(Z_DEPTH_COPY_IMAGE);
try {
- GLStateManager.glCopyImageSubData(sourceTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, destTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
+ GLSMTextures.glCopyImageSubData(sourceTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, destTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1);
} finally {
if (Tracy.ENABLED) Tracy.endZone();
}
diff --git a/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java b/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java
index fcedfab4e..6389e8dd9 100644
--- a/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java
+++ b/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java
@@ -2,7 +2,7 @@ package net.coderbot.iris.gl.texture;
import com.gtnewhorizons.angelica.glsm.texture.TextureType;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.shaderpack.texture.TextureFilteringData;
import org.embeddedt.embeddium.impl.gl.GlObject;
@@ -20,7 +20,7 @@ public class GlTexture extends GlObject implements TextureAccess {
private final TextureType target;
public GlTexture(TextureType target, int sizeX, int sizeY, int sizeZ, int internalFormat, int format, int pixelType, byte[] pixels, TextureFilteringData filteringData) {
- this.setHandle(GLStateManager.glGenTextures());
+ this.setHandle(GLSMTextures.glGenTextures());
bindTextureForSetup(target.getGlType(), handle());
TextureUploadHelper.resetTextureUploadState();
@@ -56,7 +56,7 @@ public class GlTexture extends GlObject implements TextureAccess {
}
public static void bindTextureForSetup(int glType, int glId) {
- GLStateManager.glBindTexture(glType, glId);
+ GLSMTextures.glBindTexture(glType, glId);
}
public TextureType getTarget() {
@@ -79,6 +79,6 @@ public class GlTexture extends GlObject implements TextureAccess {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteTextures(handle());
+ GLSMTextures.glDeleteTextures(handle());
}
}
diff --git a/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java b/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java
index c4b03f280..73da2675f 100644
--- a/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java
+++ b/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gl.texture;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import org.lwjgl.opengl.GL11;
public class TextureUploadHelper {
@@ -15,9 +15,9 @@ public class TextureUploadHelper {
// It is likely that this also avoids the crashes on AMD that I previously experienced with texture creation.
//
// This code is from Canvas: https://github.com/grondag/canvas/commit/f0ab652d7a8b7cc9febf0209bee15cffce9eac83
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0);
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4);
}
}
diff --git a/src/main/java/net/coderbot/iris/gui/GuiUtil.java b/src/main/java/net/coderbot/iris/gui/GuiUtil.java
index aa54a5959..4301d22aa 100644
--- a/src/main/java/net/coderbot/iris/gui/GuiUtil.java
+++ b/src/main/java/net/coderbot/iris/gui/GuiUtil.java
@@ -1,6 +1,9 @@
package net.coderbot.iris.gui;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import cpw.mods.fml.client.config.GuiUtils;
import lombok.Getter;
import net.minecraft.client.Minecraft;
@@ -63,11 +66,11 @@ public final class GuiUtil {
final int vOffset = disabled ? 46 : hovered ? 86 : 66;
// Sets RenderSystem to use solid white as the tint color for blend mode, and enables blend mode
- GLStateManager.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.enableBlend();
+ GLSMBlend.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMBlend.enableBlend();
// Sets RenderSystem to be able to use textures when drawing
- GLStateManager.enableTexture();
+ GLSMTextures.enableTexture();
// Top left section
GuiUtils.drawTexturedModalRect(x, y, 0, vOffset, halfWidth, halfHeight, 0);
@@ -141,10 +144,10 @@ public final class GuiUtil {
final Minecraft mc = client();
final int scale = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight).getScaleFactor();
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(minX * scale, mc.displayHeight - (maxY * scale), boxWidth * scale, (maxY - minY) * scale);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(minX * scale, mc.displayHeight - (maxY * scale), boxWidth * scale, (maxY - minY) * scale);
font.drawStringWithShadow(text, minX - scroll, textY, color);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
} else {
int textX = centerX - (textWidth / 2);
textX = Math.min(textX, maxX - textWidth);
@@ -247,11 +250,11 @@ public final class GuiUtil {
*/
public void draw(int x, int y) {
// Sets RenderSystem to use solid white as the tint color for blend mode, and enables blend mode
- GLStateManager.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.enableBlend();
+ GLSMBlend.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMBlend.enableBlend();
// Sets RenderSystem to be able to use textures when drawing
- GLStateManager.enableTexture();
+ GLSMTextures.enableTexture();
// Draw the texture to the screen
GuiUtils.drawTexturedModalRect(x, y, u, v, width, height, 256);
diff --git a/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java b/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java
index ef4490781..dac4ea5c9 100644
--- a/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java
+++ b/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.gui.element;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.client.Minecraft;
@@ -166,8 +167,8 @@ public abstract class IrisGuiSlot extends GuiSlot {
this.bindAmountScrolled();
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_FOG);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_FOG);
final Tessellator tessellator = Tessellator.instance;
drawContainerBackground(tessellator);
final int elementRight = this.left + this.width / 2 - this.getListWidth() / 2 + 2;
@@ -178,14 +179,14 @@ public abstract class IrisGuiSlot extends GuiSlot {
}
this.drawSelectionBox(elementRight, relativeY, mouseX, mouseY);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
this.overlayBackground(0, this.top, 255, 255);
this.overlayBackground(this.bottom, this.height, 255, 255);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
OpenGlHelper.glBlendFunc(770, 771, 0, 1);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
tessellator.startDrawingQuads();
tessellator.setColorRGBA_I(0, 0);
tessellator.addVertexWithUV(this.left, (this.top + offset), 0.0D, 0.0D, 1.0D);
@@ -246,9 +247,9 @@ public abstract class IrisGuiSlot extends GuiSlot {
tessellator.draw();
}
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glShadeModel(GL11.GL_FLAT);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
}
}
diff --git a/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java b/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java
index 523f16761..36a0a63e9 100644
--- a/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java
+++ b/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.gui.element.shaderoptions;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import net.coderbot.iris.Iris;
import net.coderbot.iris.gui.GuiUtil;
import net.coderbot.iris.gui.NavigationController;
@@ -91,7 +91,7 @@ public class HeaderEntry extends BaseEntry {
public void drawEntry(ShaderPackScreen screen, int index, int x, int y, int slotWidth, int slotHeight, Tessellator tessellator, int mouseX, int mouseY, boolean isMouseOver) {
Gui.drawRect(x - 3, (y + slotHeight) - 3, x + slotWidth, (y + slotHeight) - 2, 0x66BEBEBE);
// Gui.drawRect leaves GL color set to the rect's color; reset to white so button textures aren't tinted.
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
final int tickDelta = 0;
final FontRenderer font = Minecraft.getMinecraft().fontRenderer;
diff --git a/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java b/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java
index 1d74a842a..68be62835 100644
--- a/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java
+++ b/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.gui.element.widget;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import cpw.mods.fml.client.config.GuiUtils;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
@@ -36,11 +37,11 @@ public class IrisImageButton extends IrisButton {
}
// Sets RenderSystem to use solid white as the tint color for blend mode, and enables blend mode
- GLStateManager.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f);
- GLStateManager.enableBlend();
+ GLSMBlend.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMBlend.enableBlend();
// Sets RenderSystem to be able to use textures when drawing
- GLStateManager.enableTexture();
+ GLSMTextures.enableTexture();
mc.getTextureManager().bindTexture(this.textureLocation);
// Draw the texture to the screen
diff --git a/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java b/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java
index f8824fae5..f88aa8c52 100644
--- a/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java
+++ b/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java
@@ -1,7 +1,7 @@
package net.coderbot.iris.gui.screen;
import com.gtnewhorizons.angelica.AngelicaMod;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache;
@@ -132,7 +132,7 @@ public class ShaderPackScreen extends GuiScreen implements HudHideable {
@Override
public void drawScreen(int mouseX, int mouseY, float delta) {
- GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT);
try {
if(dirty) {
dirty = false;
@@ -215,7 +215,7 @@ public class ShaderPackScreen extends GuiScreen implements HudHideable {
this.fontRendererObj.drawStringWithShadow(irisTextComponent, 2, this.height - 10, 0xFFFFFF);
}
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
}
diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java
index 85f824c68..9565a116a 100644
--- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java
+++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java
@@ -5,7 +5,9 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.coderbot.iris.Iris;
import net.coderbot.iris.gbuffer_overrides.matching.SpecialCondition;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs;
import com.gtnewhorizons.angelica.iris.IrisDisplayListState;
import net.coderbot.iris.gl.shader.ProgramCreator;
@@ -148,23 +150,23 @@ public class GbufferPrograms {
}
public static void setCutoutDefaults() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
if (DisplayListManager.getRecordMode() == DisplayListManager.RecordMode.NONE) {
- GLStateManager.getTextures().getTextureUnitStates(1).enable();
+ GLSMTextures.getTextures().getTextureUnitStates(1).enable();
return;
}
- final int previousUnit = GLStateManager.getActiveTextureUnitForServerState();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + previousUnit);
+ final int previousUnit = GLSMTextures.getActiveTextureUnitForServerState();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + previousUnit);
}
public static void setBlockEntityDefaults() {
- GLStateManager.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short)-1, (short)-1);
+ GLSMCurrentAttribs.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short)-1, (short)-1);
FfpExtendedAttribs.setNeutralCurrentValues();
- GLStateManager.glVertexAttrib4f(ProgramCreator.AT_MIDBLOCK, 0.0f, 0.0f, 0.0f, 0.0f);
+ GLSMCurrentAttribs.glVertexAttrib4f(ProgramCreator.AT_MIDBLOCK, 0.0f, 0.0f, 0.0f, 0.0f);
}
public static WorldRenderingPhase getCurrentPhase() {
diff --git a/src/main/java/net/coderbot/iris/pipeline/ClearPass.java b/src/main/java/net/coderbot/iris/pipeline/ClearPass.java
index 0d725032b..25daa061b 100644
--- a/src/main/java/net/coderbot/iris/pipeline/ClearPass.java
+++ b/src/main/java/net/coderbot/iris/pipeline/ClearPass.java
@@ -1,6 +1,8 @@
package net.coderbot.iris.pipeline;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import net.coderbot.iris.gl.framebuffer.GlFramebuffer;
import net.minecraft.client.Minecraft;
import net.minecraft.profiler.Profiler;
@@ -30,7 +32,7 @@ public class ClearPass {
public void execute(Vector4f defaultClearColor) {
final Profiler profiler = Minecraft.getMinecraft().mcProfiler;
profiler.startSection(name);
- GLStateManager.glViewport(0, 0, viewportX.getAsInt(), viewportY.getAsInt());
+ GLSMRasterizer.glViewport(0, 0, viewportX.getAsInt(), viewportY.getAsInt());
framebuffer.bind();
Vector4f color = Objects.requireNonNull(defaultClearColor);
@@ -39,8 +41,8 @@ public class ClearPass {
color = this.color;
}
- GLStateManager.glClearColor(color.x, color.y, color.z, color.w);
- GLStateManager.glClear(clearFlags);
+ GLSMBlend.glClearColor(color.x, color.y, color.z, color.w);
+ GLSMFramebuffer.glClear(clearFlags);
profiler.endSection();
}
diff --git a/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java b/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java
index e1acc1302..c56e23c9f 100644
--- a/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java
+++ b/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java
@@ -10,7 +10,7 @@ import net.coderbot.iris.shaderpack.PackShadowDirectives;
import net.coderbot.iris.shadows.ShadowRenderTargets;
import org.joml.Vector2i;
import org.joml.Vector4f;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
@@ -22,7 +22,7 @@ import java.util.Map;
public class ClearPassCreator {
public static ImmutableList createClearPasses(RenderTargets renderTargets, boolean fullClear,
PackRenderTargetDirectives renderTargetDirectives) {
- final int maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
+ final int maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
// Sort buffers by their clear color so we can group up glClear calls.
Map> clearByColor = new HashMap<>();
@@ -82,7 +82,7 @@ public class ClearPassCreator {
public static ImmutableList createShadowClearPasses(ShadowRenderTargets renderTargets, boolean fullClear,
PackShadowDirectives renderTargetDirectives) {
- final int maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
+ final int maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS);
// Sort buffers by their clear color so we can group up glClear calls.
Map clearByColor = new HashMap<>();
diff --git a/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java b/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java
index 85787381a..e94ba5182 100644
--- a/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java
+++ b/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java
@@ -1,7 +1,8 @@
package net.coderbot.iris.pipeline;
import com.gtnewhorizons.angelica.compat.mojang.NativeImage;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
@@ -200,10 +201,10 @@ public class CustomTextureManager {
final TextureFormat textureFormat = TextureFormatLoader.getFormat();
if (textureFormat != null) {
- final int previousBinding = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, pbrTexture.getGlTextureId());
+ final int previousBinding = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, pbrTexture.getGlTextureId());
textureFormat.setupTextureParameters(pbrType, pbrTexture);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previousBinding);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previousBinding);
}
return pbrTexture.getGlTextureId();
diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java
index 4f03b9c53..27a79db99 100644
--- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java
+++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java
@@ -14,6 +14,15 @@ import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniformMatrix3f;
import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniformMatrix4f;
import org.joml.Matrix3f;
import org.joml.Matrix4fc;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
@@ -258,10 +267,10 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
final long _t0 = System.nanoTime();
long _tLast = _t0;
- final int entryTextureUnit = GLStateManager.getActiveTextureUnit();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ final int entryTextureUnit = GLSMTextures.getActiveTextureUnit();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
customTextureManager = new CustomTextureManager(programs.getPackDirectives(), programs.getPack().getCustomTextureDataMap(), programs.getPack().getIrisCustomTextureDataMap(), programs.getPack().getCustomNoiseTexture());
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + entryTextureUnit);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + entryTextureUnit);
final Map>> prepareTransformFutures =
submitCompositeTransforms(programs.getPrepare(), TextureStage.PREPARE, programs.getPackDirectives().getTextureMap());
@@ -392,7 +401,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
updatePbrSamplers(TextureFormatLoader.getFormat(), SodiumGameOptions.resolvedAnisotropicFiltering());
// Don't clobber anything in texture unit 0. It probably won't cause issues, but we're just being cautious here.
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
whitePixel = new NativeImageBackedSingleColorTexture(255, 255, 255, 255);
@@ -428,7 +437,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
this.ssboHolder = null;
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
BufferFlipper flipper = new BufferFlipper();
@@ -1125,14 +1134,14 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
GLSMHooks.resolvePendingProgram();
final Pass pass = this.current;
if (pass == null) {
- if (GLStateManager.getActiveProgram() == 0) {
+ if (GLSMPrograms.getActiveProgram() == 0) {
matchPass();
}
return;
}
final Program program = pass.getProgram();
final GlFramebuffer expected = isBeforeTranslucent ? pass.framebufferBeforeTranslucents : pass.framebufferAfterTranslucents;
- if (program != null && GLStateManager.getActiveProgram() == program.getProgramId() && GLStateManager.getDrawFramebuffer() == expected.getId()) {
+ if (program != null && GLSMPrograms.getActiveProgram() == program.getProgramId() && GLSMFramebuffer.getDrawFramebuffer() == expected.getId()) {
return;
}
pass.use();
@@ -1476,10 +1485,10 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
}
if (shadowViewport) {
- GLStateManager.glViewport(0, 0, shadowMapResolution, shadowMapResolution);
+ GLSMRasterizer.glViewport(0, 0, shadowMapResolution, shadowMapResolution);
} else {
final Framebuffer main = Minecraft.getMinecraft().getFramebuffer();
- GLStateManager.glViewport(0, 0, main.framebufferWidth, main.framebufferHeight);
+ GLSMRasterizer.glViewport(0, 0, main.framebufferWidth, main.framebufferHeight);
}
// Apply state overrides before program.use() so that uniforms (e.g. iris_currentAlphaTest)
@@ -1627,7 +1636,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
}
private boolean usesImage(@Nullable Program program, String image) {
- return program != null && (GLStateManager.glGetUniformLocation(program.getProgramId(), image) != -1 || vertexWriteReplays.writesImage(program, image));
+ return program != null && (GLSMPrograms.glGetUniformLocation(program.getProgramId(), image) != -1 || vertexWriteReplays.writesImage(program, image));
}
@Override
@@ -1673,7 +1682,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
vertexWriteReplays.attach(name, program, transformed, (samplers, images) -> wireGbufferResources(samplers, images, availability, shadow));
this.customUniforms.mapholderToPass(builder, program);
final int id = program.getProgramId();
- return new WideLineProgram(program, GLStateManager.glGetUniformLocation(id, "iris_LineWidth"), GLStateManager.glGetUniformLocation(id, "iris_ScreenSize"));
+ return new WideLineProgram(program, GLSMPrograms.glGetUniformLocation(id, "iris_LineWidth"), GLSMPrograms.glGetUniformLocation(id, "iris_ScreenSize"));
} catch (Exception e) {
Iris.logger.warn("Wide line program link failed for {}; lines there stay 1 px wide", sourceName, e);
return null;
@@ -1690,7 +1699,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
GLSMHooks.resolvePendingProgram();
final Pass pass = current;
if (pass == null || pass.getProgram() == null || activeInstancing != Instancing.NONE
- || GLStateManager.getActiveProgram() != pass.getProgram().getProgramId()) {
+ || GLSMPrograms.getActiveProgram() != pass.getProgram().getProgramId()) {
return false;
}
@@ -1712,8 +1721,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
if (wide != null) {
wide.program().use();
this.customUniforms.push(wide.program());
- final var viewport = GLStateManager.getViewportState();
- RenderSystem.uniform1f(wide.lineWidthLocation(), GLStateManager.getLineState().getWidth());
+ final var viewport = GLSMRasterizer.getViewportState();
+ RenderSystem.uniform1f(wide.lineWidthLocation(), GLSMRasterizer.getLineState().getWidth());
RenderSystem.uniform2f(wide.screenSizeLocation(), viewport.width, viewport.height);
}
return true;
@@ -1746,9 +1755,9 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
DepthColorStorage.unlockDepthColor();
BlendModeOverride.restore();
AlphaTestOverride.restore();
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
GLStateManager.incrementFragmentGeneration();
FullScreenQuadRenderer.clearLocCache();
@@ -1867,7 +1876,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
private void prepareRenderTargets() {
parityState.onFrameStart();
// Make sure we're using texture unit 0 for this.
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
if (shadowRenderTargets != null) {
profiler.startSection("iris_shadow_clear");
@@ -1881,7 +1890,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
} else {
// Clear depth first, regardless of any color clearing.
shadowRenderTargets.getDepthSourceFb().bind();
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
ImmutableList passes;
@@ -1968,7 +1977,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
passes = clearPasses;
}
- final Vector3d fogColor3 = GLStateManager.getFogColor();
+ final Vector3d fogColor3 = GLSMFog.getFogColor();
// NB: The alpha value must be 1.0 here, or else you will get a bunch of bugs. Sildur's Vibrant Shaders
// will give you pink reflections and other weirdness if this is zero.
@@ -2034,8 +2043,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
private void bindVoxelizationMatrixUniforms() {
if (shadowVoxelizationCompute == null) return;
final int id = shadowVoxelizationCompute.getProgramId();
- final int modelView = GLStateManager.glGetUniformLocation(id, "iris_ModelViewMatrix");
- final int normal = GLStateManager.glGetUniformLocation(id, "iris_NormalMatrix");
+ final int modelView = GLSMPrograms.glGetUniformLocation(id, "iris_ModelViewMatrix");
+ final int normal = GLSMPrograms.glGetUniformLocation(id, "iris_NormalMatrix");
this.voxelizationModelView = modelView >= 0 ? new GlUniformMatrix4f(modelView) : null;
this.voxelizationNormalMatrix = normal >= 0 ? new GlUniformMatrix3f(normal) : null;
}
@@ -2214,8 +2223,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
profiler.endSection();
}
- GLStateManager.enableBlend();
- GLStateManager.enableAlphaTest();
+ GLSMBlend.enableBlend();
+ GLSMDepthStencilAlpha.enableAlphaTest();
// note: we are careful not to touch the lightmap texture unit or overlay color texture unit here,
// so we don't need to do anything to restore them if needed.
@@ -2374,16 +2383,16 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
if (true/*skyType == DimensionSpecialEffects.SkyType.NORMAL*/) {
profiler.startSection("iris_horizon");
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDepthMask(false);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMDepthStencilAlpha.glDepthMask(false);
- final Vector3d fogColor = GLStateManager.getFogColor();
- GLStateManager.glColor4f((float) fogColor.x, (float) fogColor.y, (float) fogColor.z, 1.0F);
+ final Vector3d fogColor = GLSMFog.getFogColor();
+ GLSMCurrentAttribs.glColor4f((float) fogColor.x, (float) fogColor.y, (float) fogColor.z, 1.0F);
horizonRenderer.renderHorizon(RenderingState.INSTANCE.getModelViewBuffer());
- GLStateManager.glDepthMask(true);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
profiler.endSection();
}
}
diff --git a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java
index 81828bc9e..130ee63b1 100644
--- a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java
+++ b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java
@@ -1,7 +1,7 @@
package net.coderbot.iris.pipeline;
import com.gtnewhorizons.angelica.compat.mojang.Camera;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
import net.coderbot.iris.block_rendering.BlockRenderingSettings;
@@ -42,7 +42,7 @@ public class FixedFunctionWorldRenderingPipeline implements WorldRenderingPipeli
}
// Use the default Minecraft framebuffer and ensure that no programs are in use
mainFb.bindFramebuffer(true);
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java
index 6bad2b930..21c44eeba 100644
--- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java
+++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java
@@ -5,7 +5,10 @@ import com.gtnewhorizons.angelica.compat.mojang.Camera;
import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil;
import com.gtnewhorizons.angelica.compat.mojang.InteractionHand;
import com.gtnewhorizons.angelica.event.RenderHandEvent;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.mixins.interfaces.ItemRendererAccessor;
import com.gtnewhorizons.angelica.rendering.RenderingState;
@@ -37,30 +40,30 @@ public class HandRenderer {
private void setupGlState(RenderGlobal gameRenderer, Camera camera, float tickDelta) {
final Minecraft mc = Minecraft.getMinecraft();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
// We need to scale the matrix by 0.125 so the hand doesn't clip through blocks.
- GLStateManager.glScalef(1.0F, 1.0F, DEPTH);
+ GLSMMatrices.glScalef(1.0F, 1.0F, DEPTH);
// TODO: Anaglyph
/*if (this.mc.gameSettings.anaglyph) {
- GLStateManager.glTranslatef((float) (-(anaglyphChannel * 2 - 1)) * 0.07F, 0.0F, 0.0F);
+ GLSMMatrices.glTranslatef((float) (-(anaglyphChannel * 2 - 1)) * 0.07F, 0.0F, 0.0F);
}*/
if (mc.entityRenderer.cameraZoom != 1.0D) {
- GLStateManager.glTranslatef((float) mc.entityRenderer.cameraYaw, (float) (-mc.entityRenderer.cameraPitch), 0.0F);
- GLStateManager.glScaled(mc.entityRenderer.cameraZoom, mc.entityRenderer.cameraZoom, 1.0D);
+ GLSMMatrices.glTranslatef((float) mc.entityRenderer.cameraYaw, (float) (-mc.entityRenderer.cameraPitch), 0.0F);
+ GLSMMatrices.glScaled(mc.entityRenderer.cameraZoom, mc.entityRenderer.cameraZoom, 1.0D);
}
Project.gluPerspective(mc.entityRenderer.getFOVModifier(tickDelta, false), (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, mc.entityRenderer.farPlaneDistance * 2.0F);
if (mc.playerController.enableEverythingIsScrewedUpMode()) {
- GLStateManager.glScalef(1.0F, 2 / 3f, 1.0F);
+ GLSMMatrices.glScalef(1.0F, 2 / 3f, 1.0F);
}
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
// TODO: Anaglyph
/*if (mc.gameSettings.anaglyph) {
@@ -129,21 +132,21 @@ public class HandRenderer {
ACTIVE = true;
- final int stateDepth = GLStateManager.pushState(StateSet.HAND);
+ final int stateDepth = GLSMAttribStack.pushState(StateSet.HAND);
try {
GbufferPrograms.setCutoutDefaults();
- GLStateManager.disableBlend();
- GLStateManager.defaultBlendFunc();
+ GLSMBlend.disableBlend();
+ GLSMBlend.defaultBlendFunc();
pipeline.setPhase(WorldRenderingPhase.HAND_SOLID);
boolean matrixPushed = false;
boolean profilerSectionStarted = false;
try {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
matrixPushed = true;
- GLStateManager.glDepthMask(true); // actually write to the depth buffer, it's normally disabled at this point
+ GLSMDepthStencilAlpha.glDepthMask(true); // actually write to the depth buffer, it's normally disabled at this point
mc.mcProfiler.startSection("iris_hand");
profilerSectionStarted = true;
@@ -164,12 +167,12 @@ public class HandRenderer {
}
} finally {
if (matrixPushed) {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
resetProjectionMatrix();
}
}
} finally {
- GLStateManager.popStateTo(stateDepth);
+ GLSMAttribStack.popStateTo(stateDepth);
pipeline.setPhase(WorldRenderingPhase.NONE);
@@ -185,21 +188,21 @@ public class HandRenderer {
ACTIVE = true;
- final int stateDepth = GLStateManager.pushState(StateSet.HAND);
+ final int stateDepth = GLSMAttribStack.pushState(StateSet.HAND);
try {
GbufferPrograms.setCutoutDefaults();
- GLStateManager.enableBlend();
- GLStateManager.defaultBlendFunc();
+ GLSMBlend.enableBlend();
+ GLSMBlend.defaultBlendFunc();
pipeline.setPhase(WorldRenderingPhase.HAND_TRANSLUCENT);
boolean matrixPushed = false;
boolean profilerSectionStarted = false;
try {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
matrixPushed = true;
- GLStateManager.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthMask(false);
mc.mcProfiler.startSection("iris_hand_translucent");
profilerSectionStarted = true;
@@ -216,12 +219,12 @@ public class HandRenderer {
}
} finally {
if (matrixPushed) {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
resetProjectionMatrix();
}
}
} finally {
- GLStateManager.popStateTo(stateDepth);
+ GLSMAttribStack.popStateTo(stateDepth);
pipeline.setPhase(WorldRenderingPhase.NONE);
@@ -230,10 +233,10 @@ public class HandRenderer {
}
private void resetProjectionMatrix() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMultMatrix(RenderingState.INSTANCE.getProjectionBuffer());
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMultMatrix(RenderingState.INSTANCE.getProjectionBuffer());
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
public boolean isActive() {
diff --git a/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java
index ed490cb85..8287150f3 100644
--- a/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java
+++ b/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java
@@ -5,7 +5,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject;
import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
@@ -155,15 +155,15 @@ public class HorizonRenderer {
rebuildBuffer();
}
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glMultMatrix(matrix);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMultMatrix(matrix);
vao.bind();
vao.draw();
vao.unbind();
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
public void destroy() {
diff --git a/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java b/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java
index aef902d19..d754f308f 100644
--- a/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java
+++ b/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.pipeline;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import lombok.Getter;
import net.coderbot.iris.Iris;
@@ -105,13 +105,13 @@ public class PipelineManager {
//
// Without this code, there will be weird issues when reloading certain shaderpacks.
for (int i = 0; i < 16; i++) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
// Set the active texture unit to unit 0
//
// This seems to be what most code expects. It's a sane default in any case.
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
diff --git a/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java b/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java
index 266653cc9..3d5e822f4 100644
--- a/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java
+++ b/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java
@@ -6,7 +6,12 @@ import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil;
import com.gtnewhorizons.angelica.compat.toremove.MatrixStack;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.profiling.RenderClassTimings;
import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay;
@@ -329,7 +334,7 @@ public class ShadowRenderer {
final ImmutableList colorSamplingSettings =
shadowDirectives.getColorSamplingSettings();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE4);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE4);
configureDepthSampler(targets.getDepthTexture().getTextureId(), depthSamplingSettings.get(0));
@@ -342,7 +347,7 @@ public class ShadowRenderer {
configureSampler(glTextureId, colorSamplingSettings.get(i));
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private final IntBuffer swizzleBuf = BufferUtils.createIntBuffer(4);
@@ -379,13 +384,13 @@ public class ShadowRenderer {
}
private void generateMipmaps() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE4);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE4);
for (MipmapPass mipmapPass : mipmapPasses) {
setupMipmappingForTexture(mipmapPass.getTexture(), mipmapPass.getTargetFilteringMode());
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private void setupMipmappingForTexture(int texture, int filteringMode) {
@@ -520,7 +525,7 @@ public class ShadowRenderer {
}
private void setupGlState(Matrix4f projMatrix) {
- GLStateManager.glViewport(0, 0, resolution, resolution);
+ GLSMRasterizer.glViewport(0, 0, resolution, resolution);
// Set up our projection matrix and load it into the legacy matrix stack
RenderSystem.setupProjectionMatrix(projMatrix);
@@ -532,23 +537,23 @@ public class ShadowRenderer {
// However, it only partially resolves issues of light leaking into caves.
//
// TODO: Better way of preventing light from leaking into places where it shouldn't
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
}
private void restoreGlState() {
// Restore backface culling
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
// Make sure to unload the projection matrix
RenderSystem.restoreProjectionMatrix();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glClearDepth(1.0);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
// Restore main framebuffer and viewport
Minecraft mc = Minecraft.getMinecraft();
mc.getFramebuffer().bindFramebuffer(false);
- GLStateManager.glViewport(0, 0, mc.displayWidth, mc.displayHeight);
+ GLSMRasterizer.glViewport(0, 0, mc.displayWidth, mc.displayHeight);
}
private void copyPreTranslucentDepth() {
@@ -663,7 +668,7 @@ public class ShadowRenderer {
}
// Reset viewport in case terrain rendering changed it
- GLStateManager.glViewport(0, 0, resolution, resolution);
+ GLSMRasterizer.glViewport(0, 0, resolution, resolution);
}
// Saved RenderManager position for shadow pass
@@ -689,20 +694,20 @@ public class ShadowRenderer {
RenderManager.renderPosY = cameraY;
RenderManager.renderPosZ = cameraZ;
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(1.0f, 1.0f);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(1.0f, 1.0f);
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
MODELVIEW_BUFFER.clear().rewind();
modelView.peek().getModel().get(MODELVIEW_BUFFER);
- GLStateManager.glLoadMatrix(MODELVIEW_BUFFER);
+ GLSMMatrices.glLoadMatrix(MODELVIEW_BUFFER);
}
private void teardownEntityShadowState() {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
RenderManager.renderPosX = savedRenderPosX;
RenderManager.renderPosY = savedRenderPosY;
@@ -784,8 +789,8 @@ public class ShadowRenderer {
final World world = tile.getWorldObj();
int brightness = TileEntityLight.packedLight(world, tile.xCoord, tile.yCoord, tile.zCoord, world.getLightBrightnessForSkyBlocks(tile.xCoord, tile.yCoord, tile.zCoord, 0));
PendingTesrDraws.beforeTileEntity(tile);
- GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, (float) brightness % 65536, (float) brightness / 65536);
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, (float) brightness % 65536, (float) brightness / 65536);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
TileEntityRendererDispatcher.instance.renderTileEntityAt(tile,
(double)tile.xCoord - cameraX,
(double)tile.yCoord - cameraY,
@@ -809,10 +814,10 @@ public class ShadowRenderer {
culler.setPosition(cameraX, cameraY, cameraZ);
}
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
MODELVIEW_BUFFER.clear().rewind();
modelView.peek().getModel().get(MODELVIEW_BUFFER);
- GLStateManager.glLoadMatrix(MODELVIEW_BUFFER);
+ GLSMMatrices.glLoadMatrix(MODELVIEW_BUFFER);
TesrBatchRenderer.INSTANCE.beginPass(TesrBatchRenderer.PASS_SHADOW, modelView.peek().getModel(), cameraX, cameraY, cameraZ);
@@ -857,7 +862,7 @@ public class ShadowRenderer {
TesrBatchRenderer.INSTANCE.flush();
GbufferPrograms.endBlockEntities();
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
renderedShadowTileEntities = shadowTileEntities;
diff --git a/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java b/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java
index a7950472a..9ee23f438 100644
--- a/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java
+++ b/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.pipeline.transform;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.gl.program.ComputeProgram;
import net.coderbot.iris.postprocess.FullScreenQuadRenderer;
@@ -14,17 +15,17 @@ public final class PreRasterComputeDispatcher {
private PreRasterComputeDispatcher() {}
public static int dispatch(ComputeProgram compute, RwImageStoreExtractor.RwExtractMode mode, int cachedTargetSizeLoc, int width, int height, CustomUniforms uniforms) {
- final int prevProgram = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM);
+ final int prevProgram = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM);
compute.use();
uniforms.push(compute);
if (mode == RwImageStoreExtractor.RwExtractMode.COMPOSITE_VSH) FullScreenQuadRenderer.uploadCompositeMatrices();
int targetSizeLoc = cachedTargetSizeLoc;
if (mode == RwImageStoreExtractor.RwExtractMode.COMPOSITE_FSH) {
if (targetSizeLoc == LOC_UNRESOLVED) {
- targetSizeLoc = GLStateManager.glGetUniformLocation(compute.getProgramId(), "_vg_target_size");
+ targetSizeLoc = GLSMPrograms.glGetUniformLocation(compute.getProgramId(), "_vg_target_size");
}
if (targetSizeLoc >= 0) {
- GLStateManager.glUniform2i(targetSizeLoc, width, height);
+ GLSMPrograms.glUniform2i(targetSizeLoc, width, height);
}
}
final int gx, gy, gz;
@@ -33,9 +34,9 @@ public final class PreRasterComputeDispatcher {
case COMPOSITE_FSH -> { gx = (width + 7) / 8; gy = (height + 7) / 8; gz = 1; }
default -> { gx = 1; gy = 1; gz = 1; }
}
- GLStateManager.glDispatchCompute(gx, gy, gz);
+ GLSMPrograms.glDispatchCompute(gx, gy, gz);
RenderSystem.memoryBarrier(GL42.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
- if (prevProgram != 0) GLStateManager.glUseProgram(prevProgram);
+ if (prevProgram != 0) GLSMPrograms.glUseProgram(prevProgram);
return targetSizeLoc;
}
}
diff --git a/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java b/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java
index 4a05cc1df..557406ca7 100644
--- a/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java
+++ b/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java
@@ -1,6 +1,8 @@
package net.coderbot.iris.postprocess;
import com.google.common.collect.ImmutableSet;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.gl.framebuffer.GlFramebuffer;
@@ -31,15 +33,15 @@ public class CenterDepthSampler {
private boolean destroyed;
public CenterDepthSampler(IntSupplier depthSupplier, float halfLife) {
- this.texture = GLStateManager.glGenTextures();
- this.altTexture = GLStateManager.glGenTextures();
+ this.texture = GLSMTextures.glGenTextures();
+ this.altTexture = GLSMTextures.glGenTextures();
this.framebuffer = new GlFramebuffer();
// Fall back to a less precise format if the system doesn't support OpenGL 3
InternalTextureFormat format = GLStateManager.capabilities.OpenGL32 ? InternalTextureFormat.R32F : InternalTextureFormat.RGB16;
setupColorTexture(texture, format);
setupColorTexture(altTexture, format);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
this.framebuffer.addColorAttachment(0, texture);
String vsh = ShaderLoader.getShaderSource("angelica:centerDepth.vsh");
@@ -65,7 +67,7 @@ public class CenterDepthSampler {
this.framebuffer.bind();
this.program.use();
- GLStateManager.glViewport(0, 0, 1, 1);
+ GLSMRasterizer.glViewport(0, 0, 1, 1);
FullScreenQuadRenderer.INSTANCE.render();
@@ -97,8 +99,8 @@ public class CenterDepthSampler {
}
public void destroy() {
- GLStateManager.glDeleteTextures(texture);
- GLStateManager.glDeleteTextures(altTexture);
+ GLSMTextures.glDeleteTextures(texture);
+ GLSMTextures.glDeleteTextures(altTexture);
framebuffer.destroy();
program.destroy();
destroyed = true;
diff --git a/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java b/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java
index 0bb75dd04..5b3c2ec6f 100644
--- a/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java
+++ b/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java
@@ -4,7 +4,11 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
@@ -298,8 +302,8 @@ public class CompositeRenderer {
}
public void renderAll() {
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
FullScreenQuadRenderer.INSTANCE.begin();
@@ -336,7 +340,7 @@ public class CompositeRenderer {
final ImmutableSet readsFromAlt = renderTargets.parityResolve(renderPass.stageReadsFromAlt);
if (!renderPass.mipmappedBuffers.isEmpty()) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
for (int index : renderPass.mipmappedBuffers) {
setupMipmapping(CompositeRenderer.this.renderTargets.get(index), readsFromAlt.contains(index));
@@ -347,7 +351,7 @@ public class CompositeRenderer {
final float scaledHeight = renderPass.viewHeight * renderPass.viewportScale.scale();
final float viewportX = renderPass.viewWidth * renderPass.viewportScale.viewportX();
final float viewportY = renderPass.viewHeight * renderPass.viewportScale.viewportY();
- GLStateManager.glViewport((int) viewportX, (int) viewportY, (int) scaledWidth, (int) scaledHeight);
+ GLSMRasterizer.glViewport((int) viewportX, (int) viewportY, (int) scaledWidth, (int) scaledHeight);
if (renderPass.preRasterCompute != null && renderPass.preRasterMode != null) {
dispatchPreRasterCompute(renderPass);
@@ -378,18 +382,18 @@ public class CompositeRenderer {
Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(true);
ProgramUniforms.clearActiveUniforms();
ProgramSamplers.clearActiveSamplers();
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
// NB: Unbinding all of these textures is necessary for proper shaderpack reloading.
- final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLStateManager.getMaxBoundTextureUnit());
+ final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLSMTextures.getMaxBoundTextureUnit());
for (int i = 0; i <= maxUnit; i++) {
// Unbind all textures that we may have used.
// NB: This is necessary for shader pack reloading to work propely
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private void dispatchPreRasterCompute(Pass pass) {
diff --git a/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java b/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java
index 5c95926b9..4c5346b97 100644
--- a/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java
+++ b/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java
@@ -2,7 +2,11 @@ package net.coderbot.iris.postprocess;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import it.unimi.dsi.fastutil.ints.IntList;
@@ -156,7 +160,7 @@ public class FinalPassRenderer {
this.swapPasses = swapPasses.build();
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
}
private Map getTransformed(ProgramSource source, CompletableFuture> precomputedTransformFuture, String stageName) {
@@ -200,9 +204,9 @@ public class FinalPassRenderer {
}
public void renderFinalPass() {
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.glDepthMask(false);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glDepthMask(false);
final Framebuffer main = Minecraft.getMinecraft().getFramebuffer();
final int baseWidth = main.framebufferWidth;
@@ -255,7 +259,7 @@ public class FinalPassRenderer {
}
if (!finalPass.mipmappedBuffers.isEmpty()) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
final ImmutableSet readsFromAlt = renderTargets.parityResolve(finalPass.stageReadsFromAlt);
for (int index : finalPass.mipmappedBuffers) {
@@ -288,7 +292,7 @@ public class FinalPassRenderer {
}
profiler.endSection();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
for (int i = 0; i < renderTargets.getRenderTargetCount(); i++) {
// Reset mipmapping states at the end of the frame.
@@ -308,8 +312,8 @@ public class FinalPassRenderer {
// Also note that RenderTargets already calls readBuffer(0) for us.
swapPass.from.bind();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, swapPass.targetTexture);
- GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, swapPass.width, swapPass.height);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, swapPass.targetTexture);
+ GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, swapPass.width, swapPass.height);
}
profiler.endSection();
@@ -318,17 +322,17 @@ public class FinalPassRenderer {
main.bindFramebuffer(true);
ProgramUniforms.clearActiveUniforms();
ProgramSamplers.clearActiveSamplers();
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
- final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLStateManager.getMaxBoundTextureUnit());
+ final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLSMTextures.getMaxBoundTextureUnit());
for (int i = 0; i <= maxUnit; i++) {
// Unbind all textures that we may have used.
// NB: This is necessary for shader pack reloading to work properly
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
public void recalculateSwapPassSize() {
@@ -379,7 +383,7 @@ public class FinalPassRenderer {
RenderSystem.texParameteri(target.getMainTexture(), GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter);
RenderSystem.texParameteri(target.getAltTexture(), GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
// TODO: Don't just copy this from DeferredWorldRenderingPipeline
diff --git a/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java b/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java
index fd918d526..21a454cf4 100644
--- a/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java
+++ b/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java
@@ -2,7 +2,14 @@ package net.coderbot.iris.postprocess;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import org.lwjgl.BufferUtils;
@@ -22,13 +29,13 @@ public class FullScreenQuadRenderer {
public static final FullScreenQuadRenderer INSTANCE = new FullScreenQuadRenderer();
private FullScreenQuadRenderer() {
- this.vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ this.vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
this.quadBuffer = createQuad();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, quadBuffer);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, quadBuffer);
DefaultVertexFormat.POSITION_TEXTURE.setupBufferState(0L);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
}
public void render() {
@@ -40,37 +47,37 @@ public class FullScreenQuadRenderer {
}
public void begin() {
- GLStateManager.disableDepthTest();
+ GLSMDepthStencilAlpha.disableDepthTest();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
// scale the quad from [0, 1] to [-1, 1]
- GLStateManager.glTranslatef(-1.0F, -1.0F, 0.0F);
- GLStateManager.glScalef(2.0F, 2.0F, 1.0F);
+ GLSMMatrices.glTranslatef(-1.0F, -1.0F, 0.0F);
+ GLSMMatrices.glScalef(2.0F, 2.0F, 1.0F);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glBindVertexArray(vao);
+ GLSMVertexInput.glBindVertexArray(vao);
}
public void renderQuad() {
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);
}
public static void end() {
- GLStateManager.glBindVertexArray(0);
+ GLSMVertexInput.glBindVertexArray(0);
- GLStateManager.enableDepthTest();
+ GLSMDepthStencilAlpha.enableDepthTest();
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
}
private static final FloatBuffer matBuf = BufferUtils.createFloatBuffer(16);
@@ -84,28 +91,28 @@ public class FullScreenQuadRenderer {
}
public static void uploadCompositeMatrices() {
- final int program = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM);
+ final int program = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM);
if (program == 0) return;
int[] locs = compositeLocCache.get(program);
if (locs == null) {
locs = new int[] {
- GLStateManager.glGetUniformLocation(program, "iris_ModelViewMatrix"),
- GLStateManager.glGetUniformLocation(program, "iris_ProjectionMatrix")
+ GLSMPrograms.glGetUniformLocation(program, "iris_ModelViewMatrix"),
+ GLSMPrograms.glGetUniformLocation(program, "iris_ProjectionMatrix")
};
compositeLocCache.put(program, locs);
}
if (locs[0] != -1) {
- GLStateManager.getModelViewMatrix().get(matBuf);
+ GLSMMatrices.getModelViewMatrix().get(matBuf);
matBuf.rewind();
- GLStateManager.glUniformMatrix4(locs[0], false, matBuf);
+ GLSMPrograms.glUniformMatrix4(locs[0], false, matBuf);
}
if (locs[1] != -1) {
- GLStateManager.getProjectionMatrix().get(matBuf);
+ GLSMMatrices.getProjectionMatrix().get(matBuf);
matBuf.rewind();
- GLStateManager.glUniformMatrix4(locs[1], false, matBuf);
+ GLSMPrograms.glUniformMatrix4(locs[1], false, matBuf);
}
}
diff --git a/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java b/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java
index 53f8702d7..3603049f5 100644
--- a/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java
+++ b/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.rendertarget;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.gl.GlResource;
import net.coderbot.iris.gl.texture.TextureUploadHelper;
@@ -23,7 +24,7 @@ public class ColorTexture extends GlResource {
TextureUploadHelper.resetTextureUploadState();
RenderSystem.texImage2D(texture, GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, GL11.GL_RGBA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, (ByteBuffer) null);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0);
}
public int getTextureId() {
@@ -32,6 +33,6 @@ public class ColorTexture extends GlResource {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteTextures(getGlId());
+ GLSMTextures.glDeleteTextures(getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java b/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java
index a9d93e185..a9d0953e8 100644
--- a/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java
+++ b/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.rendertarget;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.gl.GlResource;
import com.gtnewhorizons.angelica.glsm.texture.DepthBufferFormat;
@@ -19,7 +19,7 @@ public class DepthTexture extends GlResource {
RenderSystem.texParameteri(texture, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
RenderSystem.texParameteri(texture, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
void resize(int width, int height, DepthBufferFormat format) {
@@ -33,6 +33,6 @@ public class DepthTexture extends GlResource {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteTextures(getGlId());
+ GLSMTextures.glDeleteTextures(getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java b/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java
index f6cbe8674..fa6b14fd6 100644
--- a/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java
+++ b/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.rendertarget;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.gl.GlResource;
import net.coderbot.iris.gl.texture.TextureUploadHelper;
@@ -34,7 +34,7 @@ public class NoiseTexture extends GlResource {
RenderSystem.texParameterf(texture, GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0F);
resize(texture, width, height);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
void resize(int texture, int width, int height) {
@@ -46,10 +46,10 @@ public class NoiseTexture extends GlResource {
TextureUploadHelper.resetTextureUploadState();
// Since we're using tightly-packed RGB data, we must use an alignment of 1 byte instead of the usual 4 bytes.
- GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
+ GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
RenderSystem.texImage2D(texture, GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, width, height, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixels);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
private ByteBuffer generateNoise() {
@@ -71,6 +71,6 @@ public class NoiseTexture extends GlResource {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteTextures(getGlId());
+ GLSMTextures.glDeleteTextures(getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java b/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java
index 2a091d2c0..8137f8721 100644
--- a/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java
+++ b/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.rendertarget;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack.*;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import lombok.Getter;
import com.gtnewhorizons.angelica.glsm.texture.InternalTextureFormat;
@@ -47,7 +47,7 @@ public class RenderTarget {
try (MemoryStack stack = stackPush()) {
IntBuffer textures = stack.mallocInt(2);
- GLStateManager.glGenTextures(textures);
+ GLSMTextures.glGenTextures(textures);
this.mainTexture = textures.get(0);
this.altTexture = textures.get(1);
@@ -59,7 +59,7 @@ public class RenderTarget {
// Clean up after ourselves
// This is strictly defensive to ensure that other buggy code doesn't tamper with our textures
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
private void setupTexture(int texture, int width, int height, boolean allowsLinear) {
@@ -129,7 +129,7 @@ public class RenderTarget {
isValid = false;
deleteBuffer.put(0, mainTexture);
deleteBuffer.put(1, altTexture);
- GLStateManager.glDeleteTextures(deleteBuffer);
+ GLSMTextures.glDeleteTextures(deleteBuffer);
}
private void requireValid() {
diff --git a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java
index f5cddc69f..e0304af74 100644
--- a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java
+++ b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java
@@ -1,6 +1,8 @@
package net.coderbot.iris.rendertarget;
import com.google.common.collect.ImmutableSet;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
@@ -193,7 +195,7 @@ public class RenderTargets {
translucentDepthDirty = false;
final Profiler profiler = Minecraft.getMinecraft().mcProfiler;
profiler.startSection("iris_depth_realloc");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, noTranslucents.getTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, noTranslucents.getTextureId());
depthSourceFb.bindAsReadBuffer();
RenderSystem.copyTexImage2D(GL11.GL_TEXTURE_2D, 0, copyDepthFormat().getGlInternalFormat(), 0, 0, cachedWidth, cachedHeight, 0);
profiler.endSection();
@@ -207,7 +209,7 @@ public class RenderTargets {
handDepthDirty = false;
final Profiler profiler = Minecraft.getMinecraft().mcProfiler;
profiler.startSection("iris_depth_realloc");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, noHand.getTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, noHand.getTextureId());
depthSourceFb.bindAsReadBuffer();
RenderSystem.copyTexImage2D(GL11.GL_TEXTURE_2D, 0, copyDepthFormat().getGlInternalFormat(), 0, 0, cachedWidth, cachedHeight, 0);
profiler.endSection();
@@ -359,7 +361,7 @@ public class RenderTargets {
framebuffer.drawBuffers(actualDrawBuffers);
framebuffer.readBuffer(0);
- if (GLStateManager.framebufferCompletenessIsMeaningful()) {
+ if (GLSMFramebuffer.framebufferCompletenessIsMeaningful()) {
final int status = framebuffer.getStatus();
if (status != GL30.GL_FRAMEBUFFER_COMPLETE) {
throw new IllegalStateException(String.format("Unexpected error while creating framebuffer: glCheckFramebufferStatus=0x%X, size=%dx%d, drawBuffers=%d", status, cachedWidth, cachedHeight, drawBuffers.length));
diff --git a/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java b/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java
index e22d8914c..e896bb381 100644
--- a/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java
+++ b/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.rendertarget;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.gl.GlResource;
import net.coderbot.iris.gl.texture.TextureUploadHelper;
@@ -36,6 +36,6 @@ public class SingleColorTexture extends GlResource {
@Override
protected void destroyInternal() {
- GLStateManager.glDeleteTextures(getGlId());
+ GLSMTextures.glDeleteTextures(getGlId());
}
}
diff --git a/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java b/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java
index fa8b9fcc3..fe58a7674 100644
--- a/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java
+++ b/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java
@@ -4,7 +4,10 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.gtnewhorizons.angelica.glsm.GLDebug;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
@@ -179,7 +182,7 @@ public class ShadowCompositeRenderer {
this.passes = passes.build();
this.flippedAtLeastOnceFinal = flippedAtLeastOnce.build();
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
}
private static void setupMipmapping(RenderTarget target, boolean readFromAlt) {
@@ -230,7 +233,7 @@ public class ShadowCompositeRenderer {
}
public void renderAll() {
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
FullScreenQuadRenderer.INSTANCE.begin();
@@ -264,7 +267,7 @@ public class ShadowCompositeRenderer {
}
if (!renderPass.mipmappedBuffers.isEmpty()) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
for (int index : renderPass.mipmappedBuffers) {
setupMipmapping(renderTargets.get(index), renderPass.stageReadsFromAlt.contains(index));
@@ -275,7 +278,7 @@ public class ShadowCompositeRenderer {
float scaledHeight = renderTargets.getResolution() * renderPass.viewportScale.scale();
int beginWidth = (int) (renderTargets.getResolution() * renderPass.viewportScale.viewportX());
int beginHeight = (int) (renderTargets.getResolution() * renderPass.viewportScale.viewportY());
- GLStateManager.glViewport(beginWidth, beginHeight, (int) scaledWidth, (int) scaledHeight);
+ GLSMRasterizer.glViewport(beginWidth, beginHeight, (int) scaledWidth, (int) scaledHeight);
if (renderPass.preRasterCompute != null && renderPass.preRasterMode != null) {
dispatchPreRasterCompute(renderPass, (int) scaledWidth, (int) scaledHeight);
@@ -303,7 +306,7 @@ public class ShadowCompositeRenderer {
}
}
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
// TODO: Don't just copy this from DeferredWorldRenderingPipeline
diff --git a/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java b/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java
index 30f5f3d82..4625404d2 100644
--- a/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java
+++ b/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java
@@ -1,7 +1,8 @@
package net.coderbot.iris.shadows;
import com.google.common.collect.ImmutableSet;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
@@ -147,7 +148,7 @@ public class ShadowRenderTargets {
}
if (terrainColorCache != null) {
for (int tex : terrainColorCache) {
- if (tex != 0) GLStateManager.glDeleteTextures(tex);
+ if (tex != 0) GLSMTextures.glDeleteTextures(tex);
}
terrainColorCache = null;
}
@@ -236,7 +237,7 @@ public class ShadowRenderTargets {
}
private int createCacheTexture(InternalTextureFormat format) {
- final int tex = GLStateManager.glGenTextures();
+ final int tex = GLSMTextures.glGenTextures();
RenderSystem.texImage2D(tex, GL11.GL_TEXTURE_2D, 0, format.getGlFormat(), resolution, resolution, 0, format.getPixelFormat().getGlFormat(), PixelType.UNSIGNED_BYTE.getGlFormat(), (ByteBuffer) null);
RenderSystem.texParameteri(tex, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
RenderSystem.texParameteri(tex, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
@@ -364,7 +365,7 @@ public class ShadowRenderTargets {
framebuffer.drawBuffers(actualDrawBuffers);
framebuffer.readBuffer(0);
- if (GLStateManager.framebufferCompletenessIsMeaningful()) {
+ if (GLSMFramebuffer.framebufferCompletenessIsMeaningful()) {
final int status = framebuffer.getStatus();
if (status != GL30.GL_FRAMEBUFFER_COMPLETE) {
throw new IllegalStateException(String.format("Unexpected error while creating shadow framebuffer: glCheckFramebufferStatus=0x%X, resolution=%d, drawBuffers=%d", status, resolution, drawBuffers.length));
diff --git a/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java b/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java
index 82f1a9ac6..ed215bf3c 100644
--- a/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java
+++ b/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.texture.pbr;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.client.rendering.TextureTracker;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -87,7 +88,7 @@ public class PBRTextureManager {
Class extends AbstractTexture> clazz = texture.getClass();
PBRTextureLoader loader = PBRTextureLoaderRegistry.INSTANCE.getLoader(clazz);
if (loader != null) {
- int previousTextureBinding = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
+ int previousTextureBinding = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
consumer.clear();
try {
loader.load(texture, Minecraft.getMinecraft().getResourceManager(), consumer);
@@ -95,7 +96,7 @@ public class PBRTextureManager {
} catch (Exception e) {
Iris.logger.error("Failed to load PBR textures for texture " + id, e);
} finally {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureBinding);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureBinding);
}
}
}
diff --git a/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java b/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java
index 5404b2143..8f638080d 100644
--- a/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java
+++ b/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.texture.util;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.compat.mojang.NativeImage;
import net.coderbot.iris.Iris;
@@ -21,7 +21,7 @@ public class TextureExporter {
public static void exportTexture(String directory, String filename, int textureId, int level, int width, int height) {
NativeImage nativeImage = new NativeImage(width, height, false);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
nativeImage.downloadTexture(level, false);
File dir = new File(Minecraft.getMinecraft().mcDataDir, directory);
diff --git a/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java b/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java
index aa78ee1c9..ca5ce8bf5 100644
--- a/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java
+++ b/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java
@@ -1,7 +1,11 @@
package net.coderbot.iris.texture.util;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.renderer.OpenGlHelper;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL30;
@@ -20,33 +24,33 @@ public class TextureManipulationUtil {
colorFillFBO = OpenGlHelper.func_153165_e/*glGenFramebuffers*/();
}
- final int previousFramebufferId = GLStateManager.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING);
+ final int previousFramebufferId = GLSMQueries.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING);
final FloatBuffer previousClearColorBuffer = stack.mallocFloat(4);
- GLStateManager.glGetFloat(GL11.GL_COLOR_CLEAR_VALUE, previousClearColorBuffer);
- final int previousTextureId = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
+ GLSMQueries.glGetFloat(GL11.GL_COLOR_CLEAR_VALUE, previousClearColorBuffer);
+ final int previousTextureId = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
final IntBuffer previousViewportBuffer = stack.mallocInt(4);
- GLStateManager.glGetInteger(GL11.GL_VIEWPORT, previousViewportBuffer);
+ GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, previousViewportBuffer);
OpenGlHelper.func_153171_g/*glBindFramebuffer*/(GL30.GL_FRAMEBUFFER, colorFillFBO);
- GLStateManager.glClearColor(
+ GLSMBlend.glClearColor(
(rgba >> 24 & 0xFF) / 255.0f,
(rgba >> 16 & 0xFF) / 255.0f,
(rgba >> 8 & 0xFF) / 255.0f,
(rgba & 0xFF) / 255.0f);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
for (int level = 0; level <= maxLevel; ++level) {
- final int width = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH);
- final int height = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT);
- GLStateManager.glViewport(0, 0, width, height);
- GLStateManager.glFramebufferTexture2D(
+ final int width = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH);
+ final int height = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT);
+ GLSMRasterizer.glViewport(0, 0, width, height);
+ GLSMFramebuffer.glFramebufferTexture2D(
GL30.GL_FRAMEBUFFER,
GL30.GL_COLOR_ATTACHMENT0,
GL11.GL_TEXTURE_2D,
textureId,
level);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glFramebufferTexture2D(
+ GLSMFramebuffer.glFramebufferTexture2D(
GL30.GL_FRAMEBUFFER,
GL30.GL_COLOR_ATTACHMENT0,
GL11.GL_TEXTURE_2D,
@@ -55,13 +59,13 @@ public class TextureManipulationUtil {
}
OpenGlHelper.func_153171_g/*glBindFramebuffer*/(GL30.GL_FRAMEBUFFER, previousFramebufferId);
- GLStateManager.glClearColor(
+ GLSMBlend.glClearColor(
previousClearColorBuffer.get(0),
previousClearColorBuffer.get(1),
previousClearColorBuffer.get(2),
previousClearColorBuffer.get(3));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureId);
- GLStateManager.glViewport(
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureId);
+ GLSMRasterizer.glViewport(
previousViewportBuffer.get(0),
previousViewportBuffer.get(1),
previousViewportBuffer.get(2),
diff --git a/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java b/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java
index adda75ef4..eb6de7a7d 100644
--- a/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java
+++ b/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java
@@ -1,6 +1,8 @@
package net.coderbot.iris.uniforms;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
@@ -78,7 +80,7 @@ public final class CommonUniforms {
IrisInternalUniforms.addWeatherUniforms(uniforms);
uniforms.uniform2i("atlasSize", () -> {
- final int glId = GLStateManager.getBoundTextureForServerState(0);
+ final int glId = GLSMTextures.getBoundTextureForServerState(0);
final AbstractTexture texture = TextureTracker.INSTANCE.getTexture(glId);
if (texture instanceof TextureMap) {
@@ -90,22 +92,22 @@ public final class CommonUniforms {
}, StateUpdateNotifiers.bindTextureNotifier);
uniforms.uniform2i("gtextureSize", () -> {
- final int glId = GLStateManager.getBoundTextureForServerState(0);
+ final int glId = GLSMTextures.getBoundTextureForServerState(0);
final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(glId);
return scratch2i.set(info.getWidth(), info.getHeight());
}, StateUpdateNotifiers.bindTextureNotifier);
- uniforms.uniform1i("gtextureId", () -> GLStateManager.getBoundTextureForServerState(0),
+ uniforms.uniform1i("gtextureId", () -> GLSMTextures.getBoundTextureForServerState(0),
StateUpdateNotifiers.bindTextureNotifier);
uniforms.uniform1i("textureReloadCount", CapturedRenderingState.INSTANCE::getTextureReloadCount,
CapturedRenderingState.INSTANCE.getTextureReloadNotifier());
uniforms.uniform4i("blendFunc", () -> {
- if(GLStateManager.getBlendMode().isEnabled()) {
- final BlendState blend = GLStateManager.getBlendState();
+ if(GLSMBlend.getBlendMode().isEnabled()) {
+ final BlendState blend = GLSMBlend.getBlendState();
return scratch4i.set(blend.getSrcRgb(), blend.getDstRgb(), blend.getSrcAlpha(), blend.getDstAlpha());
}
return scratch4i.set(0, 0, 0, 0);
@@ -150,7 +152,7 @@ public final class CommonUniforms {
.uniform1f(PER_TICK, "rainStrength", CommonUniforms::getRainStrength)
.uniform1f(PER_TICK, "wetness", new SmoothedFloat(directives.getWetnessHalfLife(), directives.getDrynessHalfLife(), CommonUniforms::getRainStrength, updateNotifier))
.uniform3d(PER_FRAME, "skyColor", CommonUniforms::getSkyColor)
- .uniform3d(PER_FRAME, "fogColor", GLStateManager::getFogColor)
+ .uniform3d(PER_FRAME, "fogColor", GLSMFog::getFogColor)
.uniform1f(PER_FRAME, "dhFarPlane", DHCompat::getFarPlane)
.uniform1f(PER_FRAME, "dhNearPlane", DHCompat::getNearPlane)
.uniform1i(PER_FRAME, "dhRenderDistance", DHCompat::getRenderDistance);
diff --git a/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java b/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java
index 8c3271602..0962d4df1 100644
--- a/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java
+++ b/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.uniforms;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
import net.coderbot.iris.gl.state.FogMode;
import net.coderbot.iris.gl.state.StateUpdateNotifiers;
import net.coderbot.iris.gl.state.ValueUpdateNotifier;
@@ -18,14 +18,14 @@ public class FogUniforms {
uniforms.uniform1i(UniformUpdateFrequency.ONCE, "fogShape", () -> -1);
} else {
uniforms.uniform1i("fogMode", () -> {
- if (!GLStateManager.getFogMode().isEnabled()) return 0;
- return GLStateManager.getFogState().getFogMode();
+ if (!GLSMFog.getFogMode().isEnabled()) return 0;
+ return GLSMFog.getFogState().getFogMode();
}, StateUpdateNotifiers.fogModeNotifier);
uniforms.uniform1i("fogShape", () -> 0, ValueUpdateNotifier.NONE);
}
- uniforms.uniform1f("fogDensity", () -> GLStateManager.getFogState().getDensity(), StateUpdateNotifiers.fogDensityNotifier);
- uniforms.uniform1f("fogStart", () -> GLStateManager.getFogState().getStart(), StateUpdateNotifiers.fogStartNotifier);
- uniforms.uniform1f("fogEnd", () -> GLStateManager.getFogState().getEnd(), StateUpdateNotifiers.fogEndNotifier);
+ uniforms.uniform1f("fogDensity", () -> GLSMFog.getFogState().getDensity(), StateUpdateNotifiers.fogDensityNotifier);
+ uniforms.uniform1f("fogStart", () -> GLSMFog.getFogState().getStart(), StateUpdateNotifiers.fogStartNotifier);
+ uniforms.uniform1f("fogEnd", () -> GLSMFog.getFogState().getEnd(), StateUpdateNotifiers.fogEndNotifier);
}
}
diff --git a/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java b/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java
index c8a33a08d..f4796659a 100644
--- a/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java
+++ b/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java
@@ -1,6 +1,8 @@
package net.coderbot.iris.uniforms;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
import com.gtnewhorizons.angelica.glsm.ffp.WeatherParams;
import net.coderbot.iris.gl.state.FogMode;
import net.coderbot.iris.gl.state.StateUpdateNotifiers;
@@ -20,22 +22,22 @@ public class IrisInternalUniforms {
private static Vector4f getColorModulator() {
return COLOR_MODULATOR.set(
- GLStateManager.getShaderColorR(),
- GLStateManager.getShaderColorG(),
- GLStateManager.getShaderColorB(),
- GLStateManager.getShaderColorA());
+ GLSMCurrentAttribs.getShaderColorR(),
+ GLSMCurrentAttribs.getShaderColorG(),
+ GLSMCurrentAttribs.getShaderColorB(),
+ GLSMCurrentAttribs.getShaderColorA());
}
private static float getEffectiveAlphaRef() {
- if (!GLStateManager.getAlphaTest().isEnabled() || GLStateManager.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
+ if (!GLSMDepthStencilAlpha.getAlphaTest().isEnabled() || GLSMDepthStencilAlpha.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
return -1.0f;
}
- return GLStateManager.getAlphaState().getReference();
+ return GLSMDepthStencilAlpha.getAlphaState().getReference();
}
private static int getEffectiveAlphaFunc() {
- if (!GLStateManager.getAlphaTest().isEnabled()) return 7;
- final int func = GLStateManager.getAlphaState().getFunction();
+ if (!GLSMDepthStencilAlpha.getAlphaTest().isEnabled()) return 7;
+ final int func = GLSMDepthStencilAlpha.getAlphaState().getFunction();
return func & 0x7;
}
@@ -54,14 +56,14 @@ public class IrisInternalUniforms {
public static void addFogUniforms(DynamicUniformHolder uniforms, FogMode fogMode) {
uniforms.uniform4f(PER_FRAME, "iris_FogColor", () -> {
- final Vector3d color = GLStateManager.getFogState().getFogColor();
- return FOG_COLOR.set((float) color.x, (float) color.y, (float) color.z, GLStateManager.getFogState().getFogAlpha());
+ final Vector3d color = GLSMFog.getFogState().getFogColor();
+ return FOG_COLOR.set((float) color.x, (float) color.y, (float) color.z, GLSMFog.getFogState().getFogAlpha());
});
uniforms
- .uniform1f(PER_FRAME, "iris_FogStart", () -> GLStateManager.getFogState().getStart())
- .uniform1f(PER_FRAME, "iris_FogEnd", () -> GLStateManager.getFogState().getEnd())
- .uniform1f(PER_FRAME, "iris_FogDensity", () -> Math.max(0.0F, GLStateManager.getFogState().getDensity()));
+ .uniform1f(PER_FRAME, "iris_FogStart", () -> GLSMFog.getFogState().getStart())
+ .uniform1f(PER_FRAME, "iris_FogEnd", () -> GLSMFog.getFogState().getEnd())
+ .uniform1f(PER_FRAME, "iris_FogDensity", () -> Math.max(0.0F, GLSMFog.getFogState().getDensity()));
uniforms
.uniform1f("iris_currentAlphaTest", IrisInternalUniforms::getEffectiveAlphaRef, StateUpdateNotifiers.alphaTestNotifier)
diff --git a/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java b/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java
index dfce86386..87b9133f3 100644
--- a/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java
+++ b/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java
@@ -1,6 +1,6 @@
package net.coderbot.iris.uniforms;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.StateSet;
import net.coderbot.iris.Iris;
import net.coderbot.iris.layer.GbufferPrograms;
@@ -23,7 +23,7 @@ public class ItemIdManager {
public static int beginCutout(ItemStack stack) {
pushItemId();
- final int depth = GLStateManager.pushState(StateSet.CUTOUT);
+ final int depth = GLSMAttribStack.pushState(StateSet.CUTOUT);
try {
GbufferPrograms.setCutoutDefaults();
setItemId(stack);
@@ -36,7 +36,7 @@ public class ItemIdManager {
public static void endCutout(int depth) {
popItemId();
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
}
/**
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java
index ced66badc..34250cda0 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached;
import kroppeb.stareval.function.FunctionReturn;
import kroppeb.stareval.function.Type;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import java.util.function.BooleanSupplier;
@@ -26,7 +26,7 @@ public class BooleanCachedUniform extends CachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform1i(location, this.cached ? 1 : 0);
+ GLSMPrograms.glUniform1i(location, this.cached ? 1 : 0);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java
index 8b7f8a686..06a1cebaf 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.parsing.VectorType;
import org.joml.Vector2f;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import java.util.function.Supplier;
@@ -20,7 +20,7 @@ public class Float2VectorCachedUniform extends VectorCachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform2f(location, this.cached.x, this.cached.y);
+ GLSMPrograms.glUniform2f(location, this.cached.x, this.cached.y);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java
index 2c8e1dab8..572fe362a 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.parsing.VectorType;
import org.joml.Vector3f;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.joml.Vector3fc;
import java.util.function.Supplier;
@@ -21,7 +21,7 @@ public class Float3VectorCachedUniform extends VectorCachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform3f(location, this.cached.x(), this.cached.y(), this.cached.z());
+ GLSMPrograms.glUniform3f(location, this.cached.x(), this.cached.y(), this.cached.z());
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java
index 83e73b5a9..4c93eb4e2 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.parsing.MatrixType;
import org.joml.Matrix4f;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.joml.Matrix4fc;
import java.nio.ByteBuffer;
@@ -27,7 +27,7 @@ public class Float4MatrixCachedUniform extends VectorCachedUniform {
public void push(int location) {
// `gets` the values from the matrix and put's them into a buffer
this.cached.get(buffer);
- GLStateManager.glUniformMatrix4(location, false, buffer);
+ GLSMPrograms.glUniformMatrix4(location, false, buffer);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java
index 987f29630..40ab8a42f 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java
@@ -4,7 +4,7 @@ import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.parsing.VectorType;
import org.joml.Vector4f;
import org.joml.Vector4fc;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import java.util.function.Supplier;
@@ -29,7 +29,7 @@ public class Float4VectorCachedUniform extends VectorCachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform4f(location, this.cached.x, this.cached.y, this.cached.z, this.cached.w);
+ GLSMPrograms.glUniform4f(location, this.cached.x, this.cached.y, this.cached.z, this.cached.w);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java
index e1dfb421d..3fb3810da 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java
@@ -4,7 +4,7 @@ import kroppeb.stareval.function.FunctionReturn;
import kroppeb.stareval.function.Type;
import net.coderbot.iris.gl.uniform.FloatSupplier;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
public class FloatCachedUniform extends CachedUniform {
@@ -25,7 +25,7 @@ public class FloatCachedUniform extends CachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform1f(location, this.cached);
+ GLSMPrograms.glUniform1f(location, this.cached);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java
index c3f158247..ed0cb9c78 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java
@@ -5,7 +5,7 @@ import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.parsing.VectorType;
import org.joml.Vector2i;
import org.joml.Vector2ic;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import java.util.function.Supplier;
@@ -30,7 +30,7 @@ public class Int2VectorCachedUniform extends VectorCachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform2i(location, this.cached.x, this.cached.y);
+ GLSMPrograms.glUniform2i(location, this.cached.x, this.cached.y);
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java
index 32f61ad10..c84ee6f92 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
import net.coderbot.iris.parsing.VectorType;
import org.joml.Vector3i;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.joml.Vector3ic;
import java.util.function.Supplier;
@@ -21,7 +21,7 @@ public class Int3VectorCachedUniform extends VectorCachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform3i(location, this.cached.x(), this.cached.y(), this.cached.z());
+ GLSMPrograms.glUniform3i(location, this.cached.x(), this.cached.y(), this.cached.z());
}
@Override
diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java
index 331d03b61..5c56eb745 100644
--- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java
+++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java
@@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached;
import kroppeb.stareval.function.FunctionReturn;
import kroppeb.stareval.function.Type;
import net.coderbot.iris.gl.uniform.UniformUpdateFrequency;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import java.util.function.IntSupplier;
@@ -26,7 +26,7 @@ public class IntCachedUniform extends CachedUniform {
@Override
public void push(int location) {
- GLStateManager.glUniform1i(location, this.cached);
+ GLSMPrograms.glUniform1i(location, this.cached);
}
@Override
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java
index c48ce6b09..31e9cb5e7 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java
@@ -5,7 +5,7 @@ import com.gtnewhorizons.angelica.AngelicaMod;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.config.GLVersionChoice;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import net.minecraftforge.client.ForgeHooksClient;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -189,13 +189,13 @@ public abstract class MixinForgeHooksClient_CoreProfile {
@Unique
private static int angelica$validateContext(int major, int minor) {
- final String glVersion = GLStateManager.glGetString(GL11.GL_VERSION);
+ final String glVersion = GLSMQueries.glGetString(GL11.GL_VERSION);
final int actual = RenderSystem.parseMajorMinor(glVersion);
- final boolean core = (GLStateManager.glGetInteger(GL32.GL_CONTEXT_PROFILE_MASK) & GL32.GL_CONTEXT_CORE_PROFILE_BIT) != 0;
+ final boolean core = (GLSMQueries.glGetInteger(GL32.GL_CONTEXT_PROFILE_MASK) & GL32.GL_CONTEXT_CORE_PROFILE_BIT) != 0;
if (RenderSystem.isContextValid(major, minor, actual, core)) {
return 0;
}
- final String renderer = GLStateManager.glGetString(GL11.GL_RENDERER);
+ final String renderer = GLSMQueries.glGetString(GL11.GL_RENDERER);
LOGGER.warn("Requested GL {}.{} core context but driver returned \"{}\" (core profile: {}, GPU: {}); falling back to a lower version", major, minor, glVersion, core, renderer);
angelica$lastRejection = "requested GL " + major + "." + minor + " core, driver returned \"" + glVersion + "\" (core profile: " + core + ", GPU: " + renderer + ")";
try { Display.destroy(); } catch (Exception ignored) {}
@@ -218,7 +218,7 @@ public abstract class MixinForgeHooksClient_CoreProfile {
LOGGER.error("FATAL: {}", message);
if (Display.isCreated()) {
try {
- LOGGER.error("GPU: {}, Driver: {}", GLStateManager.glGetString(GL11.GL_RENDERER), GLStateManager.glGetString(GL11.GL_VERSION));
+ LOGGER.error("GPU: {}, Driver: {}", GLSMQueries.glGetString(GL11.GL_RENDERER), GLSMQueries.glGetString(GL11.GL_VERSION));
} catch (Exception ignored) {}
} else {
LOGGER.error("GPU info: not available (no GL context)");
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java
index ebda5f411..03bcb4fc4 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java
@@ -20,6 +20,7 @@ import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.settings.GameSettings;
import org.embeddedt.embeddium.impl.render.frame.RenderAheadManager;
import org.lwjgl.input.Keyboard;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.lwjgl.opengl.GL11;
import org.objectweb.asm.Opcodes;
@@ -55,7 +56,7 @@ public abstract class MixinMinecraft {
at = @At(value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onRenderTickEnd(F)V", shift = At.Shift.AFTER, remap = false)
)
private void angelica$injectLightingFixPostRenderTick(CallbackInfo ci) {
- GLStateManager.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
}
@Unique
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java
index 262d0ebe4..23454ee1b 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.animation;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite;
import com.gtnewhorizons.angelica.proxy.ClientProxy;
import net.minecraft.client.Minecraft;
@@ -32,7 +32,7 @@ public abstract class MixinTextureMap extends AbstractTexture {
final boolean renderVisible = ClientProxy.options().performance.animateOnlyVisibleTextures;
Minecraft.getMinecraft().mcProfiler.startSection("updateAnimations");
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, this.getGlTextureId());
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, this.getGlTextureId());
final int size = listAnimatedSprites.size();
for (int i = 0; i < size; i++) {
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java
index 92d3b9749..0f61d6c87 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java
@@ -18,12 +18,12 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.glDisable;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.glEnable;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.glPopMatrix;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.glPushMatrix;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.glScalef;
-import static com.gtnewhorizons.angelica.glsm.GLStateManager.glTranslatef;
+import static com.gtnewhorizons.angelica.glsm.GLSMEnable.glDisable;
+import static com.gtnewhorizons.angelica.glsm.GLSMEnable.glEnable;
+import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glPopMatrix;
+import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glPushMatrix;
+import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glScalef;
+import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glTranslatef;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
@SuppressWarnings("deprecation")
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java
index afd00bbde..25dc9442b 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java
@@ -2,6 +2,10 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.CombinedGlint;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
@@ -61,16 +65,16 @@ public class MixinItemRenderer_EdgeDepth {
@Surround.Carry
final boolean preparing = !ShadowRenderer.ACTIVE && !GLStateManager.isRecordingDisplayList()
&& !TessellatorManager.isCurrentlyCapturing() && !TessellatorManager.shouldInterceptDraw(tess)
- && GLStateManager.getDepthTest().isEnabled() && GLStateManager.getDepthState().isEnabled()
+ && GLSMDepthStencilAlpha.getDepthTest().isEnabled() && GLSMDepthStencilAlpha.getDepthState().isEnabled()
&& ItemGlint.canResetStencil() && ItemGlint.eligible() && ItemGlint.needsImmediateBase(stack, pass);
if (preparing) {
BatchStateGuard.suspend();
try {
- GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilMask(1);
- GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 0, 1);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
+ GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilMask(1);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 0, 1);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE);
} finally {
BatchStateGuard.resume();
}
@@ -82,7 +86,7 @@ public class MixinItemRenderer_EdgeDepth {
if (preparing) {
BatchStateGuard.suspend();
try {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
} finally {
BatchStateGuard.resume();
}
@@ -127,26 +131,26 @@ public class MixinItemRenderer_EdgeDepth {
final boolean combined = !secondLayer && ItemGlint.begin();
// Depth selects the surface, stencil limits it to one blend.
// The base draw's stencil reset or the first layer's marks avoid a masked full-screen clear.
- GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
try {
- GLStateManager.glDepthMask(false);
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilMask(1);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilMask(1);
if (secondLayer) {
// Same pixels as the first layer, so removing its marks leaves the stencil reset.
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 1, 1);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_DECR);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 1, 1);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_DECR);
} else {
if (!angelica$stencilPrepared) {
- GLStateManager.glClearStencil(0);
- GLStateManager.glClear(GL11.GL_STENCIL_BUFFER_BIT);
+ GLSMDepthStencilAlpha.glClearStencil(0);
+ GLSMFramebuffer.glClear(GL11.GL_STENCIL_BUFFER_BIT);
}
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 0, 1);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 0, 1);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR);
}
angelica$drawGlint(tess, iconWidth, iconHeight, thickness);
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
if (combined) CombinedGlint.end();
}
angelica$combinedGlint = combined;
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java
index c9c5bcd4b..1b888cf43 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
import com.llamalad7.mixinextras.sugar.Share;
@@ -21,11 +21,11 @@ public class MixinRenderGlobal_DestroyBlock {
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Tessellator;startDrawingQuads()V")
)
private void iris$beginDrawBlockDamageTexture(Tessellator tessellator, EntityLivingBase entity, float partialTicks, CallbackInfo ci, @Share("lastMin") LocalIntRef lastMin, @Share("lastMag") LocalIntRef lastMag) {
- TextureInfo info = TextureInfoCache.INSTANCE.getInfo(GLStateManager.getBoundTextureForServerState());
+ TextureInfo info = TextureInfoCache.INSTANCE.getInfo(GLSMTextures.getBoundTextureForServerState());
lastMin.set(info.getMinFilter());
lastMag.set(info.getMagFilter());
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
}
@Inject(
@@ -34,7 +34,7 @@ public class MixinRenderGlobal_DestroyBlock {
remap = false
)
private void iris$endDrawBlockDamageTexture(Tessellator tessellator, EntityLivingBase entity, float partialTicks, CallbackInfo ci, @Share("lastMin") LocalIntRef lastMin, @Share("lastMag") LocalIntRef lastMag) {
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, lastMin.get());
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, lastMag.get());
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, lastMin.get());
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, lastMag.get());
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java
index 221db4c1f..0e90ec445 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import net.coderbot.iris.Iris;
import net.coderbot.iris.pipeline.FixedFunctionWorldRenderingPipeline;
import net.coderbot.iris.pipeline.WorldRenderingPipeline;
@@ -38,7 +38,7 @@ public class MixinRenderMooshroom_MushroomTint {
if (angelica$mushroomTintShaderPath) {
CapturedRenderingState.INSTANCE.setCurrentEntityColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
} else {
- GLStateManager.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
+ GLSMCurrentAttribs.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
}
angelica$mushroomTintActive = true;
}
@@ -56,7 +56,7 @@ public class MixinRenderMooshroom_MushroomTint {
if (angelica$mushroomTintShaderPath) {
CapturedRenderingState.INSTANCE.setCurrentEntityColor(0.0F, 0.0F, 0.0F, 0.0F);
} else {
- GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
+ GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
}
angelica$mushroomTintActive = false;
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java
index 13b1339dc..22a4a3986 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.helpers.RendererLivingEntityHelper;
import net.minecraft.client.renderer.entity.RendererLivingEntity;
import org.lwjgl.opengl.GL11;
@@ -24,15 +25,15 @@ public class MixinRendererLivingEntity_EyeDepth {
@Surround.Carry
boolean eyes = RendererLivingEntityHelper.hasEyePass(this);
if (eyes) {
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(-1.0f, -1.0f);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(-1.0f, -1.0f);
}
}
@Surround.Finally
private void angelica$eyePassPolygonOffsetEnd(@Surround.Carry boolean eyes) {
if (!eyes) return;
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java
index 36056790d..33561e5d4 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java
@@ -2,7 +2,10 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import net.coderbot.iris.Iris;
import net.coderbot.iris.pipeline.FixedFunctionWorldRenderingPipeline;
@@ -41,10 +44,10 @@ public class MixinRendererLivingEntity_OverlayTint {
)
private void angelica$setupOverlay(EntityLivingBase entity, double x, double y, double z,
float yaw, float partialTick, CallbackInfo ci) {
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
if (entity.hurtTime <= 0 && entity.deathTime <= 0) return;
if (angelica$isShaderPackActive()) {
@@ -53,7 +56,7 @@ public class MixinRendererLivingEntity_OverlayTint {
angelica$shaderEntityColorActive = true;
} else {
// FFP path
- GLStateManager.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
+ GLSMCurrentAttribs.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
angelica$ffpOverlayActive = true;
}
angelica$skipReRender = true;
@@ -68,7 +71,7 @@ public class MixinRendererLivingEntity_OverlayTint {
private void angelica$teardownOverlay(EntityLivingBase entity, double x, double y, double z,
float yaw, float partialTick, CallbackInfo ci) {
if (angelica$ffpOverlayActive) {
- GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
+ GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
angelica$ffpOverlayActive = false;
}
if (angelica$shaderEntityColorActive) {
@@ -110,7 +113,7 @@ public class MixinRendererLivingEntity_OverlayTint {
boolean untint = false;
if (angelica$skipReRender && angelica$isAdditivePass()) {
if (angelica$ffpOverlayActive) {
- GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
+ GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
untint = true;
} else if (angelica$shaderEntityColorActive) {
CapturedRenderingState.INSTANCE.setCurrentEntityColor(0.0F, 0.0F, 0.0F, 0.0F);
@@ -123,7 +126,7 @@ public class MixinRendererLivingEntity_OverlayTint {
private void angelica$retintAfterAdditivePass(@Surround.Carry boolean untint) {
if (!untint) return;
if (angelica$ffpOverlayActive) {
- GLStateManager.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
+ GLSMCurrentAttribs.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
} else if (angelica$shaderEntityColorActive) {
CapturedRenderingState.INSTANCE.setCurrentEntityColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX);
}
@@ -135,7 +138,7 @@ public class MixinRendererLivingEntity_OverlayTint {
)
private void angelica$reset(CallbackInfo ci) {
if (angelica$ffpOverlayActive) {
- GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
+ GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F);
angelica$ffpOverlayActive = false;
}
if (angelica$shaderEntityColorActive) {
@@ -147,9 +150,9 @@ public class MixinRendererLivingEntity_OverlayTint {
@Unique
private static boolean angelica$isAdditivePass() {
- if (!GLStateManager.glIsEnabled(GL11.GL_BLEND)) return false;
- if (GLStateManager.glGetInteger(GL14.GL_BLEND_DST_RGB) != GL11.GL_ONE) return false;
- final int src = GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_RGB);
+ if (!GLSMEnable.glIsEnabled(GL11.GL_BLEND)) return false;
+ if (GLSMQueries.glGetInteger(GL14.GL_BLEND_DST_RGB) != GL11.GL_ONE) return false;
+ final int src = GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_RGB);
return src == GL11.GL_ONE || src == GL11.GL_SRC_COLOR;
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java
index 367015507..219f23079 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.debug;
import com.gtnewhorizons.angelica.glsm.GLDebug;
+import com.gtnewhorizons.angelica.glsm.GLSMQueries;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import net.minecraft.client.renderer.texture.ITextureObject;
import net.minecraft.client.renderer.texture.TextureManager;
@@ -17,10 +19,10 @@ public class MixinTextureManager {
@Inject(method = "loadTexture", at = @At("RETURN"))
private void onTextureLoad(ResourceLocation resource, ITextureObject texture, CallbackInfoReturnable cir) {
if(texture != null && texture != TextureUtil.missingTexture && !GLStateManager.isRecordingDisplayList()) {
- final int curId = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture.getGlTextureId());
+ final int curId = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture.getGlTextureId());
GLDebug.nameObject(GL11.GL_TEXTURE, texture.getGlTextureId(), resource.toString());
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, curId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, curId);
}
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java
index d7a742ec7..be0cf3655 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import com.gtnewhorizons.angelica.rendering.tesr.ModelPartBatcher;
import net.minecraft.client.model.ModelRenderer;
@@ -14,9 +14,9 @@ public abstract class MixinModelRenderer {
@Redirect(method = {"render", "renderWithRotation"}, at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glCallList(I)V", remap = false))
private void angelica$batchPart(int list, float scale) {
if (!ModelPartBatcher.partDraw((ModelRenderer) (Object) this, scale, null)) {
- final long drawsBefore = GLStateManager.drawCalls;
- GLStateManager.glCallList(list);
- BatchEligibility.onPartFallback(drawsBefore, GLStateManager.drawCalls);
+ final long drawsBefore = GLSMDraws.drawCalls;
+ GLSMDraws.glCallList(list);
+ BatchEligibility.onPartFallback(drawsBefore, GLSMDraws.drawCalls);
}
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java
index de32eefda..6a580b109 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.rendering.GlintClock;
import com.gtnewhorizons.angelica.rendering.SkippedGlintBlock;
import com.gtnewhorizons.angelica.rendering.items.DroppedItemInstancer;
@@ -159,12 +159,12 @@ public abstract class MixinRenderItem_Instanced {
id = "customDraws"
)
private void angelica$beginCustomItemDraws() {
- BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls);
}
@Surround.Finally("customDraws")
private void angelica$endCustomItemDraws() {
- BatchEligibility.endExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls);
}
@Surround(
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java
index 1571869d9..8f07cea2d 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.mixins.interfaces.IBatchEligibility;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay;
@@ -20,13 +20,13 @@ public class MixinRenderManager_BatchEligibility {
final IBatchEligibility holder = (IBatchEligibility) render;
final byte state = holder.angelica$batchState();
final boolean recording = AngelicaConfig.entityShadowReplayEnabled() && EntityShadowReplay.beginRenderer(render, entity, partialTicks, state);
- BatchEligibility.begin(state, GLStateManager.drawCalls);
+ BatchEligibility.begin(state, GLSMDraws.drawCalls);
boolean completed = false;
try {
render.doRender(entity, x, y, z, yaw, partialTicks);
completed = true;
} finally {
- final byte next = BatchEligibility.end(state, GLStateManager.drawCalls);
+ final byte next = BatchEligibility.end(state, GLSMDraws.drawCalls);
if (recording) EntityShadowReplay.endRenderer(completed, next);
if (next != state) {
holder.angelica$setBatchState(next);
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java
index b4e36d542..3c669bcbe 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay;
import net.minecraft.client.renderer.entity.Render;
@@ -14,11 +14,11 @@ public abstract class MixinRender_NameTagDraws {
@Surround(method = "func_147906_a")
private void angelica$countNameTagDraws() {
EntityShadowReplay.rejectForeignDraw();
- BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls);
}
@Surround.Finally
private void angelica$endNameTagDraws() {
- BatchEligibility.endExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java
index cc6170ccc..a275eaae5 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import net.minecraft.client.renderer.entity.RendererLivingEntity;
import org.spongepowered.asm.mixin.Mixin;
@@ -15,11 +15,11 @@ public abstract class MixinRendererLivingEntity_EquippedDraws {
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/RendererLivingEntity;renderEquippedItems(Lnet/minecraft/entity/EntityLivingBase;F)V")
)
private void angelica$countEquippedDraws() {
- BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls);
}
@Surround.Finally
private void angelica$endEquippedDraws() {
- BatchEligibility.endExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java
index bcfb7dbfe..967c8d3d0 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java
@@ -3,7 +3,8 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
import com.gtnewhorizons.angelica.rendering.SkippedGlintBlock;
import com.gtnewhorizons.angelica.helpers.RendererLivingEntityHelper;
import com.gtnewhorizons.angelica.rendering.GlintClock;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay;
import com.gtnewhorizons.angelica.rendering.tesr.GlintCapture;
@@ -59,7 +60,7 @@ public abstract class MixinRendererLivingEntity_GlintClock {
final ModelBase model = ((RendererLivingEntity) (Object) this).renderPassModel;
if ((angelica$armorPassFlags & 15) != 15) return mask;
angelica$nextGlintLayer = 0;
- if (model != angelica$baseModel || GLStateManager.getOverlayA() != 0.0F || RendererLivingEntityHelper.hasEyePass(this)
+ if (model != angelica$baseModel || GLSMCurrentAttribs.getOverlayA() != 0.0F || RendererLivingEntityHelper.hasEyePass(this)
|| !ModelPartBatcher.INSTANCE.queueSkippedArmorGlint(angelica$armorBase, RES_ITEM_GLINT)) return mask;
SkippedGlintBlock.applyArmorExitState();
return 0;
@@ -84,7 +85,7 @@ public abstract class MixinRendererLivingEntity_GlintClock {
}
angelica$baseModel = null;
angelica$capturingBase = (angelica$armorPassFlags & 15) == 15 && ModelPartBatcher.INSTANCE.beginArmorCapture(angelica$armorBase);
- if (angelica$capturingBase) GLStateManager.glPushMatrix();
+ if (angelica$capturingBase) GLSMMatrices.glPushMatrix();
}
@Inject(method = "doRender(Lnet/minecraft/entity/EntityLivingBase;DDDFF)V",
@@ -95,7 +96,7 @@ public abstract class MixinRendererLivingEntity_GlintClock {
private void angelica$endArmorBase(CallbackInfo ci) {
if (angelica$capturingBase) {
angelica$capturingBase = false;
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
angelica$armorBase.endWithRestoredPose();
angelica$baseModel = ((RendererLivingEntity) (Object) this).renderPassModel;
}
@@ -121,7 +122,7 @@ public abstract class MixinRendererLivingEntity_GlintClock {
}
if (layer == 1 && batcher.replayGlint(angelica$armorGlint)) return false;
angelica$glintLayer = layer == 0 && batcher.beginGlintCapture(angelica$armorGlint) ? GLINT_LAYER_CAPTURED : GLINT_LAYER_DRAWN;
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
return true;
}
@@ -130,7 +131,7 @@ public abstract class MixinRendererLivingEntity_GlintClock {
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/ModelBase;render(Lnet/minecraft/entity/Entity;FFFFFF)V", ordinal = 0, shift = At.Shift.AFTER))
private void angelica$endArmorGlintLayer(CallbackInfo ci) {
if (angelica$glintLayer != GLINT_LAYER_QUEUED) {
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
if (angelica$glintLayer == GLINT_LAYER_CAPTURED) {
angelica$armorGlint.endWithRestoredPose();
angelica$secondArmorQueued = ModelPartBatcher.INSTANCE.queueSecondArmorGlint(angelica$armorGlint);
@@ -146,12 +147,12 @@ public abstract class MixinRendererLivingEntity_GlintClock {
EntityShadowReplay.rejectRenderFailed();
if (angelica$capturingBase) {
angelica$capturingBase = false;
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
angelica$armorBase.reset();
}
if (angelica$glintLayer != GLINT_LAYER_QUEUED) {
angelica$glintLayer = GLINT_LAYER_QUEUED;
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
angelica$armorGlint.reset();
}
angelica$endZone();
@@ -180,7 +181,7 @@ public abstract class MixinRendererLivingEntity_GlintClock {
method = "doRender(Lnet/minecraft/entity/EntityLivingBase;DDDFF)V",
at = @At(
value = "INVOKE",
- target = "Lcom/gtnewhorizons/angelica/glsm/GLStateManager;glTranslatef(FFF)V",
+ target = "Lcom/gtnewhorizons/angelica/glsm/GLSMMatrices;glTranslatef(FFF)V",
ordinal = 1,
remap = false
),
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java
index 43918438b..a893d567f 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import net.minecraft.client.renderer.entity.RendererLivingEntity;
import org.spongepowered.asm.mixin.Mixin;
@@ -15,11 +15,11 @@ public abstract class MixinRendererLivingEntity_ModelPassDraws {
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/ModelBase;render(Lnet/minecraft/entity/Entity;FFFFFF)V")
)
private void angelica$countModelPassDraws() {
- BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls);
}
@Surround.Finally
private void angelica$endModelPassDraws() {
- BatchEligibility.endExpectedDraws(GLStateManager.drawCalls);
+ BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java
index d4fed53df..11145c784 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.entity;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.rendering.tesr.ModelPartBatcher;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.util.ResourceLocation;
@@ -14,6 +14,6 @@ public abstract class MixinTextureManager {
@Inject(method = "bindTexture", at = @At("RETURN"))
private void angelica$trackBind(ResourceLocation location, CallbackInfo ci) {
- ModelPartBatcher.onTextureBind(location, GLStateManager.getBoundTextureForServerState());
+ ModelPartBatcher.onTextureBind(location, GLSMTextures.getBoundTextureForServerState());
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java
index 65a7de77f..6686b07d7 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java
@@ -10,7 +10,8 @@ import com.gtnewhorizons.angelica.client.font.ColorCodeUtils;
import com.gtnewhorizons.angelica.client.font.FontEffectRegistry;
import com.gtnewhorizons.angelica.compat.GTNHLibCompat;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.texture.TextureManager;
@@ -140,7 +141,7 @@ public abstract class MixinFontRenderer implements FontRendererAccessor, IFontPa
target = "Lnet/minecraft/client/gui/FontRenderer;enableAlpha()V", shift = At.Shift.AFTER, remap = false), cancellable = true)
public void angelica$BatchedFontRendererDrawString(String text, int x, int y, int argb, boolean dropShadow, CallbackInfoReturnable cir)
{
- if (GLStateManager.getListMode() == 0) {
+ if (GLSMDraws.getListMode() == 0) {
cir.setReturnValue(angelica$drawStringBatched(text, x, y, argb, dropShadow));
}
}
@@ -150,7 +151,7 @@ public abstract class MixinFontRenderer implements FontRendererAccessor, IFontPa
*/
@Inject(method = "renderString", at = @At("HEAD"), cancellable = true)
public void angelica$BatchedFontRendererRenderString(String text, int x, int y, int argb, boolean dropShadow, CallbackInfoReturnable cir) {
- if (GLStateManager.getListMode() == 0) {
+ if (GLSMDraws.getListMode() == 0) {
cir.setReturnValue(angelica$drawStringBatched(text, x, y, argb, dropShadow));
}
}
@@ -179,7 +180,7 @@ public abstract class MixinFontRenderer implements FontRendererAccessor, IFontPa
this.blue = (float)(argb >> 8 & 255) / 255.0F;
this.green = (float)(argb & 255) / 255.0F;
this.alpha = (float)(argb >> 24 & 255) / 255.0F;
- GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
this.posX = (float)x;
this.posY = (float)y;
return (int) angelica$batcher.drawString(x, y, argb, dropShadow, unicodeFlag, text, 0, text.length());
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java
index 4e4891b25..3714db56c 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.fontrenderer;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
import net.minecraft.client.gui.FontRenderer;
import net.minecraftforge.client.GuiIngameForge;
@@ -35,11 +35,11 @@ public class MixinGuiIngameForge {
private void angelica$endF3TextBatching(int width, int height, CallbackInfo ci) {
FontRendererAccessor fra = (FontRendererAccessor) (Object) fontrenderer;
- final boolean depthWasEnabled = GLStateManager.getDepthTest().isEnabled();
- GLStateManager.disableDepthTest();
+ final boolean depthWasEnabled = GLSMDepthStencilAlpha.getDepthTest().isEnabled();
+ GLSMDepthStencilAlpha.disableDepthTest();
fra.angelica$getBatcher().endBatch();
if (depthWasEnabled) {
- GLStateManager.enableDepthTest();
+ GLSMDepthStencilAlpha.enableDepthTest();
}
}
@@ -53,11 +53,11 @@ public class MixinGuiIngameForge {
private void angelica$endHotbarTextBatching() {
final FontRendererAccessor fra = (FontRendererAccessor) (Object) fontrenderer;
- final boolean depthWasEnabled = GLStateManager.getDepthTest().isEnabled();
- GLStateManager.disableDepthTest();
+ final boolean depthWasEnabled = GLSMDepthStencilAlpha.getDepthTest().isEnabled();
+ GLSMDepthStencilAlpha.disableDepthTest();
fra.angelica$getBatcher().endBatch();
if (depthWasEnabled) {
- GLStateManager.enableDepthTest();
+ GLSMDepthStencilAlpha.enableDepthTest();
}
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java
index 8092cf03a..bfc84ddb4 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.hudcaching;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.gtnewhorizons.angelica.mixins.dummy.DummyTessellator;
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import net.minecraft.client.renderer.Tessellator;
@@ -32,7 +32,7 @@ public class MixinRenderItem {
)
)
private void angelica$neuterGlDisable(int cap) {
- if (cap == GL_LIGHTING) GLStateManager.glDisable(cap);
+ if (cap == GL_LIGHTING) GLSMEnable.glDisable(cap);
}
@Redirect(
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java
index 581ca0720..c064514bf 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.optimizations;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import net.minecraft.client.renderer.GLAllocation;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@@ -31,7 +31,7 @@ public class MixinGLAllocation {
*/
@Overwrite
public static synchronized int generateDisplayLists(int count) {
- final int id = GLStateManager.glGenLists(count);
+ final int id = GLSMDraws.glGenLists(count);
// Cast to Int2IntMap to use primitive put(int, int) instead of put(Integer, Integer)
((Int2IntMap) mapDisplayLists).put(id, count);
return id;
@@ -47,7 +47,7 @@ public class MixinGLAllocation {
// This makes it null-safe even if called with unallocated ID (no NPE from unboxing null)
final int count = ((Int2IntMap) mapDisplayLists).remove(id);
if (count > 0) {
- GLStateManager.glDeleteLists(id, count);
+ GLSMDraws.glDeleteLists(id, count);
}
}
@@ -59,7 +59,7 @@ public class MixinGLAllocation {
public static synchronized void deleteTexturesAndDisplayLists() {
// Cast to Int2IntMap to use primitive iteration
for (Int2IntMap.Entry entry : ((Int2IntMap) mapDisplayLists).int2IntEntrySet()) {
- GLStateManager.glDeleteLists(entry.getIntKey(), entry.getIntValue());
+ GLSMDraws.glDeleteLists(entry.getIntKey(), entry.getIntValue());
}
mapDisplayLists.clear();
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java
index 4ceaf212a..497368088 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.tesr;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.mixins.interfaces.IBatchEligibility;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import com.gtnewhorizons.angelica.rendering.tesr.TesrProviderDispatch;
@@ -28,11 +28,11 @@ public class MixinTileEntityRendererDispatcher {
final IBatchEligibility holder = (IBatchEligibility) renderer;
final byte state = holder.angelica$batchState();
- BatchEligibility.begin(state, GLStateManager.drawCalls);
+ BatchEligibility.begin(state, GLSMDraws.drawCalls);
try {
renderer.renderTileEntityAt(te, x, y, z, partialTicks);
} finally {
- final byte next = BatchEligibility.end(state, GLStateManager.drawCalls);
+ final byte next = BatchEligibility.end(state, GLSMDraws.drawCalls);
if (next != state) {
holder.angelica$setBatchState(next);
BatchEligibility.onStateChange(renderer, next);
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java
index 4f1a9404b..43a8eeb25 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.textures;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.rendering.RenderingState;
import com.gtnewhorizons.angelica.rendering.TextureSamplers;
@@ -22,7 +22,7 @@ public class MixinRenderItem_GuiSampler {
)
private void angelica$beginGuiSampling() {
@Surround.Carry("gui") final boolean gui = !RenderingState.INSTANCE.isRenderingWorld();
- @Surround.Carry("sampler") final int sampler = gui ? GLStateManager.getSamplerBinding(0) : 0;
+ @Surround.Carry("sampler") final int sampler = gui ? GLSMTextures.getSamplerBinding(0) : 0;
if (gui) RenderSystem.bindSamplerToUnit(0, TextureSamplers.getGuiSampler().getId());
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java
index 9dff12f3f..412a8ee0a 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java
@@ -1,7 +1,13 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.vbo;
import com.gtnewhorizon.gtnhlib.client.renderer.postprocessing.PostProcessingHelper;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.shader.Framebuffer;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
@@ -21,26 +27,26 @@ public abstract class MixinFramebuffer {
*/
@Overwrite
public void framebufferRender(int width, int height) {
- GLStateManager.glColorMask(true, true, true, false);
- GLStateManager.disableDepthTest();
- GLStateManager.glDepthMask(false);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glViewport(0, 0, width, height);
- GLStateManager.enableTexture();
- GLStateManager.disableLighting();
- GLStateManager.disableAlphaTest();
- GLStateManager.disableBlend();
- GLStateManager.disableCull();
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, framebufferTexture);
+ GLSMBlend.glColorMask(true, true, true, false);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, width, height);
+ GLSMTextures.enableTexture();
+ GLSMLighting.disableLighting();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMBlend.disableBlend();
+ GLSMRasterizer.disableCull();
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, framebufferTexture);
PostProcessingHelper.bindFullscreenVAO();
PostProcessingHelper.drawFullscreenQuad();
PostProcessingHelper.unbindVAO();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java
index 078e62651..ce77b2d3a 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.celeritas.features.textures;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.mixins.interfaces.TextureMetadataExtension;
import com.gtnewhorizons.angelica.rendering.TextureAtlasType;
import com.gtnewhorizons.angelica.rendering.celeritas.SpriteExtension;
@@ -195,7 +195,7 @@ public class MixinTextureMap implements TextureMapExtension {
@Inject(method = "loadTextureAtlas", at = @At("RETURN"))
private void celeritas$generateQuadTree(CallbackInfo ci, @Local(ordinal = 0) Stitcher stitcher) {
if (angelica$isBlockAtlas()) {
- GLStateManager.markTextureAsAtlas(((TextureMap) (Object) this).getGlTextureId(),
+ GLSMTextures.markTextureAsAtlas(((TextureMap) (Object) this).getGlTextureId(),
((SpriteExtension) this.missingImage).angelica$getGutterWidth());
SodiumGameOptions.recordAtlasMipmapClamp(Minecraft.getMinecraft().gameSettings.mipmapLevels,
this.mipmapLevels);
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java
index b997f86ea..ea53028bc 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java
@@ -5,7 +5,8 @@ import com.gtnewhorizons.angelica.compat.mojang.Camera;
import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil;
import com.gtnewhorizons.angelica.event.RenderChunkEvent;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.profiling.Tracy;
import com.gtnewhorizons.angelica.mixins.interfaces.IRenderGlobalExt;
import com.gtnewhorizons.angelica.rendering.AngelicaRenderQueue;
@@ -158,12 +159,12 @@ public class MixinRenderGlobal implements IRenderGlobalExt {
RenderHelper.disableStandardItemLighting();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.getTextureMapBlocks().getGlTextureId());
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.getTextureMapBlocks().getGlTextureId());
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glEnable(GL11.GL_FOG);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_FOG);
this.mc.entityRenderer.enableLightmap(partialTicks);
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java
index b423a6a21..b44b0e3b9 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.dragonapi;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
@@ -14,6 +14,6 @@ public class MixinShaderRegistry_ParseError {
@Redirect(method = "parseError",
at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL20;glGetShaderInfoLog(II)Ljava/lang/String;"))
private static String angelica$routeInfoLogByType(int id, int maxLen) {
- return GLStateManager.glIsProgram(id) ? GLStateManager.glGetProgramInfoLog(id, maxLen) : GLStateManager.glGetShaderInfoLog(id, maxLen);
+ return GLSMPrograms.glIsProgram(id) ? GLSMPrograms.glGetProgramInfoLog(id, maxLen) : GLSMPrograms.glGetShaderInfoLog(id, maxLen);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java
index 32c6e530c..94e138efa 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.base;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.renderer.texture.AbstractTexture;
import org.spongepowered.asm.mixin.Mixin;
@@ -16,7 +16,7 @@ public abstract class MixinAbstractTexture implements AbstractTextureExpansion {
public void unloadGLTexture() {
if (this.glTextureId >= 0) {
- GLStateManager.glDeleteTextures(this.glTextureId);
+ GLSMTextures.glDeleteTextures(this.glTextureId);
this.glTextureId = -1;
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java
index 3264490ae..915935b7b 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.cc.client.renderer.entity;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
import net.minecraft.client.renderer.entity.RenderWolf;
import net.minecraft.entity.passive.EntitySheep;
import net.minecraft.entity.passive.EntityWolf;
@@ -19,7 +19,7 @@ public class MixinRenderWolf {
at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glColor3f(FFF)V", ordinal = 1, remap = false))
private void modifyShouldRenderPass2(float red, float green, float blue, EntityWolf entity) {
int collarColor = entity.getCollarColor();
- GLStateManager.glColor3f(
+ GLSMCurrentAttribs.glColor3f(
ColorizeEntity.getWolfCollarColor(EntitySheep.fleeceColorTable[collarColor], collarColor)[0],
ColorizeEntity.getWolfCollarColor(EntitySheep.fleeceColorTable[collarColor], collarColor)[1],
ColorizeEntity.getWolfCollarColor(EntitySheep.fleeceColorTable[collarColor], collarColor)[2]);
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java
index dba1458dd..240845486 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java
@@ -1,6 +1,11 @@
package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.cit.client.renderer.entity;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RendererLivingEntity;
@@ -87,8 +92,8 @@ public abstract class MixinRenderEntityLiving extends Render {
public void doRender(EntityLivingBase entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) {
if (MinecraftForge.EVENT_BUS
.post(new RenderLivingEvent.Pre(entity, (RendererLivingEntity) (Object) this, x, y, z))) return;
- GLStateManager.glPushMatrix();
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMMatrices.glPushMatrix();
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
this.mainModel.onGround = this.renderSwingProgress(entity, p_76986_9_);
if (this.renderPassModel != null) {
@@ -139,10 +144,10 @@ public abstract class MixinRenderEntityLiving extends Render {
f4 = this.handleRotationFloat(entity, p_76986_9_);
this.rotateCorpse(entity, f4, f2, p_76986_9_);
float f5 = 0.0625F;
- GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL);
- GLStateManager.glScalef(-1.0F, -1.0F, 1.0F);
+ GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL);
+ GLSMMatrices.glScalef(-1.0F, -1.0F, 1.0F);
this.preRenderCallback(entity, p_76986_9_);
- GLStateManager.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F);
+ GLSMMatrices.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F);
float f6 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * p_76986_9_;
float f7 = entity.limbSwing - entity.limbSwingAmount * (1.0F - p_76986_9_);
@@ -154,7 +159,7 @@ public abstract class MixinRenderEntityLiving extends Render {
f6 = 1.0F;
}
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
this.mainModel.setLivingAnimations(entity, f7, f6, p_76986_9_);
this.renderModel(entity, f7, f6, f4, f3 - f2, f13, f5);
int j;
@@ -184,65 +189,65 @@ public abstract class MixinRenderEntityLiving extends Render {
// patch end
f8 = (float) entity.ticksExisted + p_76986_9_;
this.bindTexture(RES_ITEM_GLINT);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
f9 = 0.5F;
- GLStateManager.glColor4f(f9, f9, f9, 1.0F);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
+ GLSMCurrentAttribs.glColor4f(f9, f9, f9, 1.0F);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
for (int k = 0; k < 2; ++k) {
- GLStateManager.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
f10 = 0.76F;
- GLStateManager.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F);
- GLStateManager.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
+ GLSMCurrentAttribs.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
float f11 = f8 * (0.001F + (float) k * 0.003F) * 20.0F;
float f12 = 0.33333334F;
- GLStateManager.glScalef(f12, f12, f12);
- GLStateManager.glRotatef(30.0F - (float) k * 60.0F, 0.0F, 0.0F, 1.0F);
- GLStateManager.glTranslatef(0.0F, f11, 0.0F);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glScalef(f12, f12, f12);
+ GLSMMatrices.glRotatef(30.0F - (float) k * 60.0F, 0.0F, 0.0F, 1.0F);
+ GLSMMatrices.glTranslatef(0.0F, f11, 0.0F);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5);
}
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glDepthMask(true);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
}
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
}
}
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(true);
this.renderEquippedItems(entity, p_76986_9_);
float f14 = entity.getBrightness(p_76986_9_);
j = this.getColorMultiplier(entity, f14, p_76986_9_);
- GLStateManager.setActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.setActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.setActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.setActiveTexture(GL13.GL_TEXTURE0);
if ((j >> 24 & 255) > 0 || entity.hurtTime > 0 || entity.deathTime > 0) {
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
if (entity.hurtTime > 0 || entity.deathTime > 0) {
- GLStateManager.glColor4f(f14, 0.0F, 0.0F, 0.4F);
+ GLSMCurrentAttribs.glColor4f(f14, 0.0F, 0.0F, 0.4F);
this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5);
for (int l = 0; l < 4; ++l) {
if (this.inheritRenderPass(entity, l, p_76986_9_) >= 0) {
- GLStateManager.glColor4f(f14, 0.0F, 0.0F, 0.4F);
+ GLSMCurrentAttribs.glColor4f(f14, 0.0F, 0.0F, 0.4F);
this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5);
}
}
@@ -253,33 +258,33 @@ public abstract class MixinRenderEntityLiving extends Render {
f9 = (float) (j >> 8 & 255) / 255.0F;
float f15 = (float) (j & 255) / 255.0F;
f10 = (float) (j >> 24 & 255) / 255.0F;
- GLStateManager.glColor4f(f8, f9, f15, f10);
+ GLSMCurrentAttribs.glColor4f(f8, f9, f15, f10);
this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5);
for (int i1 = 0; i1 < 4; ++i1) {
if (this.inheritRenderPass(entity, i1, p_76986_9_) >= 0) {
- GLStateManager.glColor4f(f8, f9, f15, f10);
+ GLSMCurrentAttribs.glColor4f(f8, f9, f15, f10);
this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5);
}
}
}
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
}
- GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL);
+ GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL);
} catch (Exception exception) {
logger.error("Couldn't render entity", exception);
}
- GLStateManager.setActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.setActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
- GLStateManager.glPopMatrix();
+ GLSMTextures.setActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.setActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
+ GLSMMatrices.glPopMatrix();
this.passSpecialRender(entity, x, y, z);
MinecraftForge.EVENT_BUS
.post(new RenderLivingEvent.Post(entity, (RendererLivingEntity) (Object) this, x, y, z));
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java
index e74de9d13..adcdd93f4 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java
@@ -1,6 +1,8 @@
package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.cit.client.renderer.entity;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.entity.Render;
@@ -53,7 +55,7 @@ public abstract class MixinRenderItem extends Render {
remap = false)
private void modifyRenderItemIntoGUI1(FontRenderer fontRenderer, TextureManager manager, ItemStack itemStack, int x,
int y, boolean renderEffect, CallbackInfo ci) {
- GLStateManager.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthMask(false);
}
@Inject(
@@ -62,7 +64,7 @@ public abstract class MixinRenderItem extends Render {
remap = false)
private void modifyRenderItemIntoGUI2(FontRenderer fontRenderer, TextureManager manager, ItemStack itemStack, int x,
int y, boolean renderEffect, CallbackInfo ci) {
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(true);
}
@Redirect(
@@ -104,8 +106,8 @@ public abstract class MixinRenderItem extends Render {
private void modifyRenderItemAndEffectIntoGUI1(FontRenderer fontRenderer, TextureManager manager,
ItemStack itemStack, int x, int y, CallbackInfo ci) {
// Moved to before call, will not trigger with forge event
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f);
}
/**
@@ -119,18 +121,18 @@ public abstract class MixinRenderItem extends Render {
private void modifyRenderItemAndEffectIntoGUI2(FontRenderer fontRenderer, TextureManager manager,
ItemStack itemStack, int x, int y, CallbackInfo ci) {
if (!CITUtils.renderEnchantmentGUI(itemStack, x, y, this.zLevel) && itemStack.hasEffect(0)) {
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDepthMask(false);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMDepthStencilAlpha.glDepthMask(false);
manager.bindTexture(RES_ITEM_GLINT);
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glColor4f(0.5F, 0.25F, 0.8F, 1.0F);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMCurrentAttribs.glColor4f(0.5F, 0.25F, 0.8F, 1.0F);
this.renderGlint(x * 431278612 + y * 32178161, x - 2, y - 2, 20, 20);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
- GLStateManager.glDepthMask(true);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
}
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java
index 66356e758..4d77788e0 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.mob;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.Render;
@@ -26,10 +27,10 @@ public abstract class MixinRenderFish extends Render {
@SuppressWarnings({ "DuplicatedCode", "ExtractMethodRecommender" })
@Overwrite
public void doRender(EntityFishHook entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef((float) x, (float) y, (float) z);
- GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL);
- GLStateManager.glScalef(0.5F, 0.5F, 0.5F);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef((float) x, (float) y, (float) z);
+ GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL);
+ GLSMMatrices.glScalef(0.5F, 0.5F, 0.5F);
this.bindEntityTexture(entity);
Tessellator tessellator = Tessellator.instance;
byte b0 = 1;
@@ -41,8 +42,8 @@ public abstract class MixinRenderFish extends Render {
float f6 = 1.0F;
float f7 = 0.5F;
float f8 = 0.5F;
- GLStateManager.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
- GLStateManager.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
+ GLSMMatrices.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F);
+ GLSMMatrices.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F);
tessellator.startDrawingQuads();
tessellator.setNormal(0.0F, 1.0F, 0.0F);
tessellator.addVertexWithUV(0.0F - f7, 0.0F - f8, 0.0D, f2, f5);
@@ -50,8 +51,8 @@ public abstract class MixinRenderFish extends Render {
tessellator.addVertexWithUV(f6 - f7, 1.0F - f8, 0.0D, f3, f4);
tessellator.addVertexWithUV(0.0F - f7, 1.0F - f8, 0.0D, f2, f4);
tessellator.draw();
- GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL);
- GLStateManager.glPopMatrix();
+ GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL);
+ GLSMMatrices.glPopMatrix();
if (entity.field_146042_b != null) {
float f9 = entity.field_146042_b.getSwingProgress(p_76986_9_);
@@ -110,8 +111,8 @@ public abstract class MixinRenderFish extends Render {
double d13 = (float) (d5 - d10);
// patch start (= if statement)
if (!LineRenderer.renderLine(0, x, y, z, d11, d12, d13)) {
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
tessellator.startDrawing(3);
tessellator.setColorOpaque_I(0);
byte b2 = 16;
@@ -125,8 +126,8 @@ public abstract class MixinRenderFish extends Render {
}
tessellator.draw();
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
}
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java
index 49e446495..87bd23ddb 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java
@@ -8,7 +8,7 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityHanging;
import net.minecraft.entity.EntityLiving;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
@@ -73,9 +73,9 @@ public abstract class MixinRenderLiving extends RendererLivingEntity {
double d18 = (float) (d11 - d15);
// patch start (only change is if-wrapper)
if (!LineRenderer.renderLine(1, x, y, z, d16, d17, d18)) {
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
tessellator.startDrawing(5);
int i;
float f2;
@@ -124,11 +124,11 @@ public abstract class MixinRenderLiving extends RendererLivingEntity {
}
tessellator.draw();
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
}
// patch end
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
}
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java
index df1c36786..a71d5ce35 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.mixins.early.notfine.clouds;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import jss.notfine.core.Settings;
import jss.notfine.gui.options.named.GraphicsQualityOff;
import net.minecraft.client.Minecraft;
@@ -51,8 +54,8 @@ public abstract class MixinRenderGlobal {
@Overwrite
public void renderCloudsFancy(float partialTicks) {
Tessellator tessellator = Tessellator.instance;
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
renderEngine.bindTexture(locationCloudsPng);
@@ -90,19 +93,19 @@ public abstract class MixinRenderGlobal {
float cloudWidth = 8f;
int renderRadius = (int)((int)Settings.RENDER_DISTANCE_CLOUDS.option.getStore() / (cloudScale * 2f));
float edgeOverlap = 0.0001f;//0.001F;
- GLStateManager.glScalef(cloudInteriorWidth, 1.0F, cloudInteriorWidth);
+ GLSMMatrices.glScalef(cloudInteriorWidth, 1.0F, cloudInteriorWidth);
for (int loop = 0; loop < 2; ++loop) {
if (loop == 0) {
- GLStateManager.glColorMask(false, false, false, false);
+ GLSMBlend.glColorMask(false, false, false, false);
} else if (mc.gameSettings.anaglyph) {
if (EntityRenderer.anaglyphField == 0) {
- GLStateManager.glColorMask(false, true, true, true);
+ GLSMBlend.glColorMask(false, true, true, true);
} else {
- GLStateManager.glColorMask(true, false, false, true);
+ GLSMBlend.glColorMask(true, false, false, true);
}
} else {
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMBlend.glColorMask(true, true, true, true);
}
for(int chunkX = -renderRadius + 1; chunkX <= renderRadius; ++chunkX) {
@@ -185,15 +188,15 @@ public abstract class MixinRenderGlobal {
}
}
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
}
public void renderCloudsFast(float partialTicks) {
Tessellator tessellator = Tessellator.instance;
- GLStateManager.glDisable(GL11.GL_CULL_FACE);
- GLStateManager.glEnable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_CULL_FACE);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
renderEngine.bindTexture(locationCloudsPng);
@@ -239,9 +242,9 @@ public abstract class MixinRenderGlobal {
tessellator.addVertexWithUV(neg, cameraRelativeY, neg, startXUv, startZUv);
tessellator.draw();
- GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glEnable(GL11.GL_CULL_FACE);
+ GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glEnable(GL11.GL_CULL_FACE);
}
@Shadow @Final
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java
index 3d3e2655f..b5ecd1a46 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java
@@ -3,7 +3,9 @@ package com.gtnewhorizons.angelica.mixins.early.shaders;
import com.gtnewhorizons.angelica.compat.mojang.Camera;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.rendering.celeritas.CeleritasWorldRenderer;
import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay;
import com.llamalad7.mixinextras.sugar.Local;
@@ -58,7 +60,7 @@ public abstract class MixinEntityRenderer implements IResourceManagerReloadListe
final WorldRenderingPipeline pipeline = Iris.getPipelineManager().preparePipeline(Iris.getCurrentDimensionName());
mc.mcProfiler.endSection();
- GLStateManager.setShaderColor(1f, 1f, 1f, 1f);
+ GLSMCurrentAttribs.setShaderColor(1f, 1f, 1f, 1f);
pipeline.beginLevelRendering();
}
@@ -72,10 +74,10 @@ public abstract class MixinEntityRenderer implements IResourceManagerReloadListe
Minecraft.getMinecraft().mcProfiler.endStartSection("iris_final");
pipeline.finalizeLevelRendering();
Program.unbind();
- GLStateManager.glDepthMask(true);
- GLStateManager.disableBlend();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F);
- GLStateManager.enableAlphaTest();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GLSMDepthStencilAlpha.enableAlphaTest();
}
@Surround(id = "disableVanillaRenderHand", method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemRenderer;renderItemInFirstPerson(F)V"))
@@ -141,7 +143,7 @@ public abstract class MixinEntityRenderer implements IResourceManagerReloadListe
WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable();
pipeline.setPhase(WorldRenderingPhase.RAIN_SNOW);
if (pipeline.shouldWriteRainAndSnowToDepthBuffer()) {
- GLStateManager.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthMask(true);
}
@Surround.Skip
boolean skip = !pipeline.shouldRenderWeather();
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java
index b64b86460..a8f26c792 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.shaders;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.coderbot.iris.rendertarget.IRenderTargetExt;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.shader.Framebuffer;
@@ -54,7 +54,7 @@ public class MixinFramebuffer implements IRenderTargetExt {
@Inject(method="deleteFramebuffer()V", at=@At(value="FIELD", target="Lnet/minecraft/client/shader/Framebuffer;depthBuffer:I", shift = At.Shift.BEFORE, ordinal = 0), require = 1)
private void iris$deleteDepthBuffer(CallbackInfo ci) {
if(this.iris$depthTextureId > -1 ) {
- GLStateManager.glDeleteTextures(this.iris$depthTextureId);
+ GLSMTextures.glDeleteTextures(this.iris$depthTextureId);
this.iris$depthTextureId = -1;
}
}
@@ -69,19 +69,19 @@ public class MixinFramebuffer implements IRenderTargetExt {
@Inject(method = "createFramebuffer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/shader/Framebuffer;framebufferClear()V", shift = At.Shift.BEFORE, ordinal = 1), require = 1)
private void iris$createDepthTexture(int width, int height, CallbackInfo ci) {
if(this.useDepth) {
- this.iris$depthTextureId = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, this.iris$depthTextureId);
+ this.iris$depthTextureId = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, this.iris$depthTextureId);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_MODE, 0);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_MODE, 0);
final boolean stencil = MinecraftForgeClient.getStencilBits() != 0;
if (stencil) {
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH24_STENCIL8, width, height, 0, GL30.GL_DEPTH_STENCIL, GL30.GL_UNSIGNED_INT_24_8, (IntBuffer) null);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH24_STENCIL8, width, height, 0, GL30.GL_DEPTH_STENCIL, GL30.GL_UNSIGNED_INT_24_8, (IntBuffer) null);
} else {
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, width, height, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (IntBuffer) null);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, width, height, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (IntBuffer) null);
}
OpenGlHelper.func_153188_a(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, this.iris$depthTextureId, 0);
if (stencil) {
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java
index 4d50cd323..69354e0ac 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.shaders;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import net.minecraftforge.client.GuiIngameForge;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
@@ -13,6 +13,6 @@ public class MixinGuiIngameForge {
@Inject(method="renderCrosshairs", at= @At(value = "INVOKE", target = "Lnet/minecraftforge/client/GuiIngameForge;bind(Lnet/minecraft/util/ResourceLocation;)V", shift = At.Shift.AFTER))
private void renderCrosshairs(CallbackInfo ci) {
// Set the same state as vanilla so we don't break with textures that set a color value on transparent pixels for the crosshairs
- GLStateManager.glEnable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_ALPHA_TEST);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java
index be119631b..01b4eb43e 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.shaders;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
import com.gtnewhorizons.angelica.api.EnderDragonBeams;
import net.minecraft.client.renderer.entity.RenderDragon;
import net.minecraft.entity.boss.EntityDragon;
@@ -51,14 +51,14 @@ public abstract class MixinRenderDragon {
EnderDragonBeams.beginDeathRays();
angelica$depthPassReplay++;
- GLStateManager.glColorMask(false, false, false, false);
+ GLSMBlend.glColorMask(false, false, false, false);
try {
angelica$invokeRenderEquippedItems(dragon, partialTicks);
} catch (Throwable t) {
angelica$endDeathBeamsLighting(true);
throw t;
} finally {
- GLStateManager.glColorMask(true, true, true, true);
+ GLSMBlend.glColorMask(true, true, true, true);
angelica$depthPassReplay--;
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java
index 481d00751..efef42d16 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.shaders;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import net.coderbot.iris.Iris;
import net.coderbot.iris.uniforms.SystemTimeUniforms;
import net.minecraft.client.Minecraft;
@@ -41,7 +41,7 @@ public class MixinRenderEndPortal {
float bottom = (float) y + iris$BOTTOM;
Minecraft.getMinecraft().getTextureManager().bindTexture(iris$END_PORTAL_TEXTURE);
- GLStateManager.enableTexture();
+ GLSMTextures.enableTexture();
Tessellator tess = Tessellator.instance;
tess.startDrawingQuads();
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java
index 485e53d70..576fab19c 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.mixins.early.shaders;
import com.gtnewhorizon.gtnhlib.client.renderer.ITessellatorInstance;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.coderbot.iris.Iris;
import net.coderbot.iris.layer.GbufferPrograms;
import net.coderbot.iris.pipeline.WorldRenderingPhase;
@@ -60,7 +60,7 @@ public class MixinRenderGlobal {
@Inject(method = "renderSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/WorldClient;getCelestialAngle(F)F"),
slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/WorldClient;getRainStrength(F)F")))
private void iris$renderSky$tiltSun(float p_72714_1_, CallbackInfo ci) {
- GLStateManager.glRotatef(Iris.getPipelineManager().getPipelineNullable().getSunPathRotation(), 0.0F, 0.0F, 1.0F);
+ GLSMMatrices.glRotatef(Iris.getPipelineManager().getPipelineNullable().getSunPathRotation(), 0.0F, 0.0F, 1.0F);
}
// Sky disc: wrap the glCallList(glSkyList) call — the first glCallList in the surface world branch
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java
index bbc2d4afe..c89bd1152 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.shaders;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.rendering.tesr.PassRebindGate;
import com.gtnewhorizons.angelica.rendering.tesr.TesrAttribution;
@@ -29,7 +29,7 @@ public class MixinTileEntityRendererDispatcher {
@Surround(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDF)V")
private void iris$beginBlockEntity(TileEntity te, double x, double y, double z, float partialTicks) {
RenderRecovery.throwIfCrashTestArmed();
- @Surround.Carry final int blendDepth = GLStateManager.pushState(StateSet.BLEND);
+ @Surround.Carry final int blendDepth = GLSMAttribStack.pushState(StateSet.BLEND);
CTMUtils.clearCurrentCompact();
CapturedRenderingState.INSTANCE.pushCurrentBlockEntity();
CapturedRenderingState.INSTANCE.setCurrentBlockEntity(te == null ? null : te.getBlockType(), TesrProviderDispatch.blockMetadata(te));
@@ -43,7 +43,7 @@ public class MixinTileEntityRendererDispatcher {
CTMUtils.clearCurrentCompact();
CapturedRenderingState.INSTANCE.popCurrentBlockEntity();
TesrAttribution.currentRenderable = prevRenderable;
- GLStateManager.popStateTo(blendDepth);
+ GLSMAttribStack.popStateTo(blendDepth);
}
@ModifyExpressionValue(method = "renderTileEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getLightBrightnessForSkyBlocks(IIII)I"))
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java
index 58b5ce7b9..e111c8463 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.late.chisel;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
import com.gtnewhorizons.angelica.glsm.StateSet;
import net.coderbot.iris.gbuffer_overrides.matching.SpecialCondition;
import net.coderbot.iris.layer.GbufferPrograms;
@@ -25,14 +25,14 @@ public class MixinRenderCarvableBeacon {
@Surround(method = "renderBeam(FLnet/minecraft/world/World;DDDIF)V", require = 1)
private void angelica$wrapBeaconBeam(float f1, World world, double x, double y, double z, int meta, float partialTicks) {
@Surround.Carry
- final int stateDepth = GLStateManager.pushState(StateSet.CULL);
+ final int stateDepth = GLSMAttribStack.pushState(StateSet.CULL);
GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.BEACON_BEAM);
}
@Surround.Finally
private void angelica$wrapBeaconBeamRestore(@Surround.Carry int stateDepth) {
GbufferPrograms.teardownSpecialRenderCondition();
- GLStateManager.popStateTo(stateDepth);
+ GLSMAttribStack.popStateTo(stateDepth);
}
@Redirect(
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java
index d7cc84bfb..222698bb2 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.mixins.late.client.ntmSpace;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.utils.WorkaroundUtils;
import com.hbm.dim.SkyProviderCelestial;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
@@ -72,26 +73,26 @@ public class MixinSkyProviderCelestial {
, target = "Lnet/minecraft/client/renderer/RenderHelper;disableStandardItemLighting()V"
, remap = true))
public void iris$main$renderInDefaultProgram(CallbackInfo ci) {
- angelica$previousProgram = GLStateManager.getActiveProgram();
- GLStateManager.glUseProgram(0);
+ angelica$previousProgram = GLSMPrograms.getActiveProgram();
+ GLSMPrograms.glUseProgram(0);
}
@Surround(method = "render"
, at = @At(value = "INVOKE"
, target = "Lcom/hbm/dim/SkyProviderCelestial;renderSun(FLnet/minecraft/client/multiplayer/WorldClient;Lnet/minecraft/client/Minecraft;Lcom/hbm/dim/CelestialBody;DDFF)V"))
private void iris$main$renderSunInShaderProgram(){
- GLStateManager.glUseProgram(angelica$previousProgram);
+ GLSMPrograms.glUseProgram(angelica$previousProgram);
}
@Surround.Finally
private void iris$main$renderSunInShaderProgramEnd() {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
}
@Inject(method = "render"
, at = @At(value = "TAIL"))
public void iris$main$restorePreviousProgram(CallbackInfo ci) {
- GLStateManager.glUseProgram(angelica$previousProgram);
+ GLSMPrograms.glUseProgram(angelica$previousProgram);
}
@Inject(method = "renderSun"
@@ -156,7 +157,7 @@ public class MixinSkyProviderCelestial {
, ordinal = 2))
private void iris$renderSky$tiltSun(CallbackInfo ci) {
Iris.getPipelineManager().getPipeline().ifPresent(
- p -> GLStateManager.glRotatef(p.getSunPathRotation(), 0.0F, 0.0F, 1.0F)
+ p -> GLSMMatrices.glRotatef(p.getSunPathRotation(), 0.0F, 0.0F, 1.0F)
);
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java
index de72ed4dc..4bf99612a 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.late.client.ntmSpace;
import com.gtnewhorizons.angelica.experimental.surround.Surround;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.utils.WorkaroundUtils;
import com.hbm.dim.orbit.SkyProviderOrbit;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
@@ -41,26 +41,26 @@ public class MixinSkyProviderOrbit {
, target = "Lnet/minecraft/client/renderer/RenderHelper;disableStandardItemLighting()V"
, remap = true))
public void iris$main$renderInDefaultProgram(CallbackInfo ci) {
- angelica$previousProgram = GLStateManager.getActiveProgram();
- GLStateManager.glUseProgram(0);
+ angelica$previousProgram = GLSMPrograms.getActiveProgram();
+ GLSMPrograms.glUseProgram(0);
}
@Surround(method = "render"
, at = @At(value = "INVOKE"
, target = "Lcom/hbm/dim/orbit/SkyProviderOrbit;renderSun(FLnet/minecraft/client/multiplayer/WorldClient;Lnet/minecraft/client/Minecraft;Lcom/hbm/dim/CelestialBody;DDFF)V"))
private void iris$main$renderSunInShaderProgram(){
- GLStateManager.glUseProgram(angelica$previousProgram);
+ GLSMPrograms.glUseProgram(angelica$previousProgram);
}
@Surround.Finally
private void iris$main$renderSunInShaderProgramEnd() {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
}
@Inject(method = "render"
, at = @At(value = "TAIL"))
public void iris$main$restorePreviousProgram(CallbackInfo ci) {
- GLStateManager.glUseProgram(angelica$previousProgram);
+ GLSMPrograms.glUseProgram(angelica$previousProgram);
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java
index 67a9c6493..7fc5e12a1 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.late.notfine.toggle.biomesoplenty;
import biomesoplenty.client.fog.FogHandler;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
import jss.notfine.core.Settings;
import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin;
@@ -16,19 +16,19 @@ public class MixinFogHandler {
private static void notFine$modifyBoPFog(int fogMode, float farPlane, float nearFactor, CallbackInfo ci) {
if (!(Boolean) Settings.TERRAIN_FOG.option.getStore()) {
// same values from notfine.toggle.MixinEntityRenderer
- GLStateManager.glFogf(GL11.GL_FOG_START, 1024 * 1024 * 15);
- GLStateManager.glFogf(GL11.GL_FOG_END, 1024 * 1024 * 16);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 1024 * 1024 * 15);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 1024 * 1024 * 16);
ci.cancel();
return;
}
if (fogMode < 0) {
- GLStateManager.glFogf(GL11.GL_FOG_START, 0.0F);
- GLStateManager.glFogf(GL11.GL_FOG_END, farPlane);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 0.0F);
+ GLSMFog.glFogf(GL11.GL_FOG_END, farPlane);
} else {
float nearDistPercent = (int) Settings.FOG_NEAR_DISTANCE.option.getStore() * 0.01F;
- GLStateManager.glFogf(GL11.GL_FOG_START, farPlane * nearFactor * nearDistPercent);
- GLStateManager.glFogf(GL11.GL_FOG_END, farPlane);
+ GLSMFog.glFogf(GL11.GL_FOG_START, farPlane * nearFactor * nearDistPercent);
+ GLSMFog.glFogf(GL11.GL_FOG_END, farPlane);
}
ci.cancel();
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java b/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java
index deaaec5d6..7db2e44ae 100644
--- a/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java
@@ -7,6 +7,7 @@ import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
class GLRedirectsTest {
@@ -151,12 +152,55 @@ class GLRedirectsTest {
String script = "GL11.glPushMatrix();\nGL11.glTranslatef(1,2,3);\nGL11.glEnable(GL11.GL_BLEND);";
String result = GLRedirects.getMethodRedirectPattern().matcher(script).replaceAll(mr -> {
- String target = GLRedirects.getTargetMethodName(mr.group(0));
- return target != null ? "GLStateManager." + target : mr.group(0);
+ String ref = GLRedirects.getTargetReference(mr.group(0));
+ return ref != null ? ref : mr.group(0);
});
- assertTrue(result.contains("GLStateManager.glPushMatrix()"), "glPushMatrix not redirected: " + result);
- assertTrue(result.contains("GLStateManager.glTranslatef(1,2,3)"), "glTranslatef not redirected: " + result);
- assertTrue(result.contains("GLStateManager.glEnable(GL11.GL_BLEND)"), "glEnable not redirected or GL_BLEND mangled: " + result);
+ assertTrue(result.contains("GLSMMatrices.glPushMatrix()"), "glPushMatrix not redirected: " + result);
+ assertTrue(result.contains("GLSMMatrices.glTranslatef(1,2,3)"), "glTranslatef not redirected: " + result);
+ assertTrue(result.contains("GLSMEnable.glEnable(GL11.GL_BLEND)"), "glEnable not redirected or GL_BLEND mangled: " + result);
+ }
+
+ private static final String IMPORT = "importPackage(Packages.com.gtnewhorizons.angelica.glsm)";
+
+ @Test
+ void redirectScriptRewritesGlCallAndAddsImportOnce() {
+ final String result = GLRedirects.redirectScript("GL11.glPushMatrix();");
+ assertTrue(result.contains("GLSMMatrices.glPushMatrix();"), result);
+ assertEquals(result.indexOf(IMPORT), result.lastIndexOf(IMPORT), result);
+ assertTrue(result.startsWith(IMPORT), result);
+ }
+
+ @Test
+ void redirectScriptRewritesMovedGlStateManagerMember() {
+ assertTrue(GLRedirects.redirectScript("GLStateManager.glPushMatrix();").contains("GLSMMatrices.glPushMatrix();"));
+ }
+
+ @Test
+ void redirectScriptLeavesUnmovedMemberAndWordPrefixed() {
+ final String unmoved = "GLStateManager.ctx();";
+ assertSame(unmoved, GLRedirects.redirectScript(unmoved));
+ final String prefixed = "xGLStateManager.glPushMatrix();";
+ assertSame(prefixed, GLRedirects.redirectScript(prefixed));
+ }
+
+ @Test
+ void redirectScriptLeavesDottedAndAlreadyMovedReferences() {
+ final String dotted = "Packages.org.lwjgl.opengl.GL11.glPushMatrix();";
+ assertSame(dotted, GLRedirects.redirectScript(dotted));
+ final String moved = "GLSMMatrices.glPushMatrix();";
+ assertSame(moved, GLRedirects.redirectScript(moved));
+ }
+
+ @Test
+ void redirectScriptIsIdempotent() {
+ final String once = GLRedirects.redirectScript("GL11.glPushMatrix();\nGLStateManager.glPopMatrix();");
+ assertEquals(once, GLRedirects.redirectScript(once));
+ }
+
+ @Test
+ void redirectScriptKeepsExistingImport() {
+ final String result = GLRedirects.redirectScript(IMPORT + ";\nGL11.glPushMatrix();");
+ assertEquals(result.indexOf(IMPORT), result.lastIndexOf(IMPORT), result);
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java b/src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java
new file mode 100644
index 000000000..d9e159e19
--- /dev/null
+++ b/src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java
@@ -0,0 +1,109 @@
+package com.gtnewhorizons.angelica.api.glstate;
+
+import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import org.joml.Matrix4f;
+import org.joml.Vector3d;
+import org.joml.Vector4f;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.GL11;
+
+import java.nio.FloatBuffer;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+@GLCoreTest
+class GLState_GLTest {
+
+ @BeforeEach
+ void saveState() {
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ }
+
+ @AfterEach
+ void restoreState() {
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMAttribStack.glPopAttrib();
+ }
+
+ @ParameterizedTest
+ @ValueSource(ints = {GL11.GL_LINEAR, GL11.GL_EXP, GL11.GL_EXP2})
+ void fogMirrorsGlsmState(int mode) {
+ GLSMEnable.glEnable(GL11.GL_FOG);
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, mode);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 12.5f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 99.25f);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.375f);
+ final FloatBuffer color = BufferUtils.createFloatBuffer(4);
+ color.put(new float[] {0.25f, 0.5f, 0.75f, 0.125f}).flip();
+ GLSMFog.glFog(GL11.GL_FOG_COLOR, color);
+
+ assertTrue(GLState.isFogEnabled());
+ assertEquals(mode, GLState.getFogMode());
+ assertEquals(12.5f, GLState.getFogStart());
+ assertEquals(99.25f, GLState.getFogEnd());
+ assertEquals(0.375f, GLState.getFogDensity());
+
+ final Vector4f rgba = GLState.getFogColor(new Vector4f());
+ assertEquals(new Vector4f(0.25f, 0.5f, 0.75f, 0.125f), rgba);
+
+ assertEquals(new Vector3d(0.25, 0.5, 0.75), GLState.getFogColor(new Vector3d()));
+
+ final FloatBuffer out = BufferUtils.createFloatBuffer(6);
+ out.position(1);
+ GLState.getFogColor(out);
+ assertEquals(1, out.position());
+ assertEquals(0.25f, out.get(1));
+ assertEquals(0.5f, out.get(2));
+ assertEquals(0.75f, out.get(3));
+ assertEquals(0.125f, out.get(4));
+
+ GLSMEnable.glDisable(GL11.GL_FOG);
+ assertFalse(GLState.isFogEnabled());
+ }
+
+ @Test
+ void matricesAreCopies() {
+ final Matrix4f modelView = new Matrix4f().translation(1, 2, 3).rotateX(0.5f);
+ final Matrix4f projection = new Matrix4f().perspective(1.2f, 1.5f, 0.1f, 200f);
+ loadMatrix(GL11.GL_MODELVIEW, modelView);
+ loadMatrix(GL11.GL_PROJECTION, projection);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+
+ final Matrix4f dest = new Matrix4f();
+ assertSame(GLState.getModelViewMatrix(dest), dest);
+ assertEquals(modelView, dest, "modelview");
+
+ assertSame(GLState.getProjectionMatrix(dest), dest);
+ assertEquals(projection, dest, "projection");
+
+ dest.zero();
+ assertEquals(modelView, GLState.getModelViewMatrix(new Matrix4f()));
+ }
+
+ private static void loadMatrix(int mode, Matrix4f m) {
+ final FloatBuffer buf = BufferUtils.createFloatBuffer(16);
+ m.get(buf);
+ GLSMMatrices.glMatrixMode(mode);
+ GLSMMatrices.glLoadMatrix(buf);
+ }
+}
diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java
index 8bb1c1526..4a7a86498 100644
--- a/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java
@@ -1,7 +1,16 @@
package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.testutil.TestPaths;
import net.coderbot.iris.uniforms.builtin.BuiltinReplacementUniforms;
@@ -43,15 +52,15 @@ class FontFilterLightmapGLTest {
@AfterEach
void cleanup() {
- GLStateManager.glUseProgram(0);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMPrograms.glUseProgram(0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
if (lightmapTexture != 0) { GL11.glDeleteTextures(lightmapTexture); lightmapTexture = 0; }
- if (vbo != 0) { GLStateManager.glDeleteBuffers(vbo); vbo = 0; }
- if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; }
- if (program != 0) { GLStateManager.glDeleteProgram(program); program = 0; }
+ if (vbo != 0) { GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; }
+ if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; }
+ if (program != 0) { GLSMPrograms.glDeleteProgram(program); program = 0; }
}
private void buildProgram() {
@@ -73,17 +82,17 @@ class FontFilterLightmapGLTest {
}
lightmapTexture = GL11.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private void buildQuad() {
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
final ByteBuffer data = BufferUtils.createByteBuffer(3 * VERTEX_SIZE);
putVertex(data, -0.9f, -0.9f);
@@ -91,17 +100,17 @@ class FontFilterLightmapGLTest {
putVertex(data, 0.0f, 0.9f);
data.flip();
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
- GLStateManager.glEnableVertexAttribArray(0);
- GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 0L);
- GLStateManager.glEnableVertexAttribArray(1);
- GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 8L);
- GLStateManager.glEnableVertexAttribArray(2);
- GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, 16L);
- GLStateManager.glEnableVertexAttribArray(3);
- GLStateManager.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, 20L);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glEnableVertexAttribArray(0);
+ GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 0L);
+ GLSMVertexInput.glEnableVertexAttribArray(1);
+ GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 8L);
+ GLSMVertexInput.glEnableVertexAttribArray(2);
+ GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, 16L);
+ GLSMVertexInput.glEnableVertexAttribArray(3);
+ GLSMVertexInput.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, 20L);
}
private static void putVertex(ByteBuffer buf, float x, float y) {
@@ -115,13 +124,13 @@ class FontFilterLightmapGLTest {
}
private static void applyVanillaLightmapMatrix() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glScalef(0.00390625f, 0.00390625f, 0.00390625f);
- GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glScalef(0.00390625f, 0.00390625f, 0.00390625f);
+ GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private float[] draw(boolean lightmapEnabled) {
@@ -130,28 +139,28 @@ class FontFilterLightmapGLTest {
buildQuad();
applyVanillaLightmapMatrix();
- assertEquals(BuiltinReplacementUniforms.lightmapTextureMatrix, new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT)), "EntityRenderer#enableLightmap must reproduce the lightmap texture matrix Iris documents");
+ assertEquals(BuiltinReplacementUniforms.lightmapTextureMatrix, new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT)), "EntityRenderer#enableLightmap must reproduce the lightmap texture matrix Iris documents");
- final Vector4f uv = new Vector4f(BRIGHTNESS_X, BRIGHTNESS_Y, 0.0f, 1.0f).mul(GLStateManager.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT));
+ final Vector4f uv = new Vector4f(BRIGHTNESS_X, BRIGHTNESS_Y, 0.0f, 1.0f).mul(GLSMTextures.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT));
- GLStateManager.glViewport(0, 0, 800, 600);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.disableBlend();
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMBlend.disableBlend();
- GLStateManager.glUseProgram(program);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "sampler"), 0);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "lightmap"), LIGHTMAP_TEX_UNIT);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "aaMode"), 0);
- GLStateManager.glUniform1f(GLStateManager.glGetUniformLocation(program, "strength"), 1.0f);
- GLStateManager.glUniform1f(GLStateManager.glGetUniformLocation(program, "alphaTestRef"), 0.0f);
- GLStateManager.glUniform3f(GLStateManager.glGetUniformLocation(program, "u_Lightmap"), uv.x, uv.y, lightmapEnabled ? 1.0f : 0.0f);
+ GLSMPrograms.glUseProgram(program);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "sampler"), 0);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "lightmap"), LIGHTMAP_TEX_UNIT);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "aaMode"), 0);
+ GLSMPrograms.glUniform1f(GLSMPrograms.glGetUniformLocation(program, "strength"), 1.0f);
+ GLSMPrograms.glUniform1f(GLSMPrograms.glGetUniformLocation(program, "alphaTestRef"), 0.0f);
+ GLSMPrograms.glUniform3f(GLSMPrograms.glGetUniformLocation(program, "u_Lightmap"), uv.x, uv.y, lightmapEnabled ? 1.0f : 0.0f);
- GLStateManager.glUniformMatrix4(GLStateManager.glGetUniformLocation(program, "u_MVPMatrix"), false, new Matrix4f().get(BufferUtils.createFloatBuffer(16)));
+ GLSMPrograms.glUniformMatrix4(GLSMPrograms.glGetUniformLocation(program, "u_MVPMatrix"), false, new Matrix4f().get(BufferUtils.createFloatBuffer(16)));
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "fontFilter draw must not raise a GL error");
final ByteBuffer pixel = BufferUtils.createByteBuffer(4);
diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java
index 0fddb58c8..8009ec2e6 100644
--- a/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizons.angelica.config.FontConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.glsm.testutil.TestThreads;
import org.junit.jupiter.api.AfterEach;
@@ -87,11 +87,11 @@ class FontProviderCustomGLTest {
@Test
void glyphInkLandsInsideMeasuredRects() {
assertTrue(provider.isGlyphAvailable('A'));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, provider.getTexture('A'));
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, provider.getTexture('A'));
final int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH);
final int height = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT);
final IntBuffer pixels = BufferUtils.createIntBuffer(width * height);
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
final int margin = QUALITY / 6;
final boolean[] covered = new boolean[width * height];
diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java b/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java
index 1307b9c9b..041d2aeae 100644
--- a/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java
+++ b/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java
@@ -3,7 +3,7 @@ package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizon.gtnhlib.util.font.FontRendering;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.config.FontConfig;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.glsm.testutil.TestPaths;
import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor;
@@ -54,7 +54,7 @@ public final class FontTestFixture implements AutoCloseable {
@Override
public void angelica$bindTexture(ResourceLocation location) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
}
}
@@ -124,14 +124,14 @@ public final class FontTestFixture implements AutoCloseable {
if (font.batcher == null) font.batcher = new BatchingFontRenderer(font, charWidths(), new int[32], ASCII);
if (font.texture == 0) {
font.texture = GL11.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, font.texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, font.texture);
final ByteBuffer pixels = BufferUtils.createByteBuffer(4 * 4 * 4);
while (pixels.hasRemaining()) pixels.put((byte) 0xFF);
pixels.flip();
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
return font.batcher;
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java
index e6cbd9610..8adf9dc3d 100644
--- a/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java
@@ -1,6 +1,11 @@
package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.StateSet;
import org.junit.jupiter.api.AfterEach;
@@ -32,29 +37,29 @@ class TextDrawStateGLTest {
}
private static void setDefaults() {
- GLStateManager.disableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glFrontFace(GL11.GL_CCW);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0.0f, 0.0f);
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0.0f, 0.0f);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
}
private static void setNonDefaults() {
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_GEQUAL);
- GLStateManager.glDepthMask(false);
- GLStateManager.glColorMask(false, false, false, false);
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.glFrontFace(GL11.GL_CW);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(-10.0f, -10.0f);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_GEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMBlend.glColorMask(false, false, false, false);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMRasterizer.glFrontFace(GL11.GL_CW);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(-10.0f, -10.0f);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
}
private static TextDrawState capture() {
@@ -134,9 +139,9 @@ class TextDrawStateGLTest {
setDefaults();
final TextDrawState before = capture();
- final int depth = GLStateManager.pushState(set);
+ final int depth = GLSMAttribStack.pushState(set);
moved.apply();
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
final ByteBuffer driverColorMask = BufferUtils.createByteBuffer(16);
GL11.glGetBoolean(GL11.GL_COLOR_WRITEMASK, driverColorMask);
diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java
index b10fbed00..256949d27 100644
--- a/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java
@@ -2,7 +2,13 @@ package com.gtnewhorizons.angelica.client.font;
import com.gtnewhorizons.angelica.config.FontConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend;
import com.gtnewhorizons.angelica.glsm.ffp.FFPVertexLighting;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
@@ -68,12 +74,12 @@ class TextMeshGLTest {
@BeforeEach
void projection() {
shadow = false;
- GLStateManager.glViewport(0, 0, VIEW_W, VIEW_H);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(0.0, VIEW_W, VIEW_H, 0.0, -1.0, 1.0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, VIEW_W, VIEW_H);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(0.0, VIEW_W, VIEW_H, 0.0, -1.0, 1.0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
@AfterEach
@@ -85,15 +91,15 @@ class TextMeshGLTest {
endFrames();
BatchingFontRenderer.exitButtonSection(false);
BatchingFontRenderer.exitRecolorSection(false);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.disableDepthTest();
- GLStateManager.disableLighting();
- GLStateManager.disableColorMaterial();
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMLighting.disableLighting();
+ GLSMLighting.disableColorMaterial();
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
private static void draw(String s, float y) {
@@ -130,8 +136,8 @@ class TextMeshGLTest {
}
private static byte[] frame(Runnable body) {
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
body.run();
final ByteBuffer pixels = BufferUtils.createByteBuffer(VIEW_W * VIEW_H * 4);
GL11.glReadPixels(0, 0, VIEW_W, VIEW_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
@@ -243,12 +249,12 @@ class TextMeshGLTest {
Named.of("plain lines", TextMeshGLTest::drawLines),
Named.of("matrix change seals a segment", () -> {
draw("before", 2.0f);
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
draw("after", 11.0f);
}),
Named.of("draw state change seals a segment", () -> {
draw("before", 2.0f);
- GLStateManager.glColorMask(false, false, false, false);
+ GLSMBlend.glColorMask(false, false, false, false);
draw("after", 11.0f);
}));
}
@@ -294,11 +300,11 @@ class TextMeshGLTest {
return List.of(
refused("matrix change mid-capture", false, () -> {
draw("before", 2.0f);
- GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f);
+ GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f);
draw("after", 11.0f);
}),
refused("draw state change before the first glyph", false, () -> {
- GLStateManager.enableDepthTest();
+ GLSMDepthStencilAlpha.enableDepthTest();
draw("depth", 2.0f);
}),
refused("another renderer flushes mid-capture", false, () -> {
@@ -340,17 +346,17 @@ class TextMeshGLTest {
@ParameterizedTest(name = "{0} fillRect={1}")
@CsvSource({ "none, false", "lit, false", "lit, true", "button, false", "darkMode, false" })
void replayIsRefusedWhereADirectDrawWouldDiffer(String context, boolean rect) {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
final Runnable body = rect ? () -> batcher.fillRect(0.0f, 0.0f, 4.0f, 4.0f, 0xFF00FF00) : () -> draw("text", 2.0f);
final TextMesh outside = capture(body);
assertTrue(outside.isValid(GlyphSettings.current()));
switch (context) {
case "lit" -> {
- GLStateManager.enableLighting();
- GLStateManager.enableColorMaterial();
+ GLSMLighting.enableLighting();
+ GLSMLighting.enableColorMaterial();
assertTrue(FFPVertexLighting.modulatesVertexColor(new Vector3f()));
assertTrue(capture(body).isAnimated());
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java b/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java
index 61d216f29..652a85fab 100644
--- a/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java
@@ -1,7 +1,9 @@
package com.gtnewhorizons.angelica.compat.draconicevolution;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility;
import net.minecraft.client.renderer.entity.RenderItem;
import org.joml.Matrix4f;
@@ -14,61 +16,61 @@ import static org.junit.jupiter.api.Assertions.*;
class PlacedItemRenderCompatTest {
@Test
void customAnimationRunsEveryFrameAndRestoresEligibilityAfterFailure() {
- final Matrix4f original = new Matrix4f(GLStateManager.getModelViewMatrix());
+ final Matrix4f original = new Matrix4f(GLSMMatrices.getModelViewMatrix());
final int[] frames = { 0 };
- BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls);
+ BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls);
try {
BatchEligibility.onPartQueued();
for (int frame = 0; frame < 3; frame++) {
assertEquals(BatchEligibility.DENIED, PlacedItemRenderCompat.renderWithBatchState(1, 2, 3,
BatchEligibility.DENIED, () -> {
assertFalse(BatchEligibility.batchingAllowed());
- GLStateManager.glRotatef(frames[0]++ * 30, 0, 1, 0);
- final long before = GLStateManager.drawCalls;
- GLStateManager.drawCalls += 2;
- BatchEligibility.onPartFallback(before, GLStateManager.drawCalls);
- GLStateManager.drawCalls++;
+ GLSMMatrices.glRotatef(frames[0]++ * 30, 0, 1, 0);
+ final long before = GLSMDraws.drawCalls;
+ GLSMDraws.drawCalls += 2;
+ BatchEligibility.onPartFallback(before, GLSMDraws.drawCalls);
+ GLSMDraws.drawCalls++;
}));
assertTrue(BatchEligibility.batchingAllowed());
- assertTrue(original.equals(GLStateManager.getModelViewMatrix(), 1e-5f));
+ assertTrue(original.equals(GLSMMatrices.getModelViewMatrix(), 1e-5f));
}
assertEquals(3, frames[0]);
assertThrows(IllegalStateException.class, () -> PlacedItemRenderCompat.renderWithBatchState(1, 2, 3,
BatchEligibility.DENIED, () -> {
- GLStateManager.drawCalls++;
+ GLSMDraws.drawCalls++;
throw new IllegalStateException("renderer failed");
}));
assertTrue(BatchEligibility.batchingAllowed());
- assertTrue(original.equals(GLStateManager.getModelViewMatrix(), 1e-5f));
+ assertTrue(original.equals(GLSMMatrices.getModelViewMatrix(), 1e-5f));
} finally {
- assertEquals(BatchEligibility.SAFE, BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls));
+ assertEquals(BatchEligibility.SAFE, BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls));
}
assertFalse(BatchEligibility.batchingAllowed());
}
@Test
void eachFrameRunsTheAnimationAndRestoresPlacementStateEvenOnFailure() {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- final Matrix4f original = new Matrix4f(GLStateManager.getModelViewMatrix());
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ final Matrix4f original = new Matrix4f(GLSMMatrices.getModelViewMatrix());
final boolean originalFrame = RenderItem.renderInFrame;
- final boolean originalDepth = GLStateManager.getDepthTest().isEnabled();
+ final boolean originalDepth = GLSMDepthStencilAlpha.getDepthTest().isEnabled();
final int[] calls = { 0 };
try {
- GLStateManager.glLoadIdentity();
- GLStateManager.enableDepthTest();
+ GLSMMatrices.glLoadIdentity();
+ GLSMDepthStencilAlpha.enableDepthTest();
RenderItem.renderInFrame = true;
for (int frame = 0; frame < 3; frame++) {
final int tick = frame;
PlacedItemRenderCompat.render(1, 2, 3, () -> {
calls[0]++;
- GLStateManager.glRotatef(tick * 30, 0, 1, 0);
+ GLSMMatrices.glRotatef(tick * 30, 0, 1, 0);
assertTrue(new Matrix4f().translation(1, 2, 3).rotateY((float) Math.toRadians(tick * 30))
- .equals(GLStateManager.getModelViewMatrix(), 1e-5f));
- GLStateManager.disableDepthTest();
+ .equals(GLSMMatrices.getModelViewMatrix(), 1e-5f));
+ GLSMDepthStencilAlpha.disableDepthTest();
RenderItem.renderInFrame = false;
});
assertEquals(frame + 1, calls[0]);
- assertTrue(new Matrix4f().equals(GLStateManager.getModelViewMatrix(), 1e-5f));
+ assertTrue(new Matrix4f().equals(GLSMMatrices.getModelViewMatrix(), 1e-5f));
assertTrue(GL11.glIsEnabled(GL11.GL_DEPTH_TEST));
assertTrue(RenderItem.renderInFrame);
}
@@ -76,11 +78,11 @@ class PlacedItemRenderCompatTest {
RenderItem.renderInFrame = false;
throw new IllegalStateException("renderer failed");
}));
- assertTrue(new Matrix4f().equals(GLStateManager.getModelViewMatrix(), 1e-5f));
+ assertTrue(new Matrix4f().equals(GLSMMatrices.getModelViewMatrix(), 1e-5f));
assertTrue(RenderItem.renderInFrame);
} finally {
- GLStateManager.setModelViewMatrix(original);
- GLStateManager.getDepthTest().setEnabled(originalDepth);
+ GLSMMatrices.setModelViewMatrix(original);
+ GLSMDepthStencilAlpha.getDepthTest().setEnabled(originalDepth);
RenderItem.renderInFrame = originalFrame;
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java b/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java
index f69d0ca21..ed7b4743e 100644
--- a/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java
@@ -1,7 +1,20 @@
package com.gtnewhorizons.angelica.compat.thaumcraft;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import net.coderbot.iris.gl.framebuffer.GlFramebuffer;
@@ -59,37 +72,37 @@ class PortalDrawerTest {
vertices.putShort((short) 180).putShort((short) 0);
}
vertices.flip();
- final int vao = GLStateManager.glGenVertexArrays();
- final int vbo = GLStateManager.glGenBuffers();
+ final int vao = GLSMVertexInput.glGenVertexArrays();
+ final int vbo = GLSMBuffers.glGenBuffers();
try {
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
- GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 20, 0L);
- GLStateManager.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 20, 12L);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glTexCoordPointer(2, GL11.GL_SHORT, 20, 16L);
- GLStateManager.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY);
- GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY);
- GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW);
+ GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 20, 0L);
+ GLSMVertexInput.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 20, 12L);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMVertexInput.glTexCoordPointer(2, GL11.GL_SHORT, 20, 16L);
+ GLSMVertexInput.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY);
+ GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4);
} finally {
- GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
- GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteBuffers(vbo);
- GLStateManager.glDeleteVertexArrays(vao);
+ GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1);
+ GLSMVertexInput.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(vbo);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
}
}
private static void clear() {
- GLStateManager.glClearColor(10 / 255.0F, 20 / 255.0F, 30 / 255.0F, 1.0F);
- GLStateManager.glClearDepth(1.0);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMBlend.glClearColor(10 / 255.0F, 20 / 255.0F, 30 / 255.0F, 1.0F);
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
}
private static int channelDifference(int a, int b) {
@@ -114,8 +127,8 @@ class PortalDrawerTest {
}
texels.flip();
final int id = texture(width, height, GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
return id;
} catch (IOException e) {
throw new RuntimeException(e);
@@ -130,21 +143,21 @@ class PortalDrawerTest {
}
texels.flip();
final int id = texture(size, size, GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter);
final int wrap = filter == GL11.GL_LINEAR ? GL12.GL_CLAMP_TO_EDGE : GL11.GL_REPEAT;
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap);
return id;
}
private static int texture(int width, int height, int internalFormat, int format, int type, ByteBuffer data) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, data);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, data);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
return id;
}
@@ -157,15 +170,15 @@ class PortalDrawerTest {
@BeforeEach
void setup() {
FfpFixture.resetFfpState();
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
ShaderManager.enable();
- GLStateManager.disableFog();
- GLStateManager.disableLighting();
- GLStateManager.disableCull();
- GLStateManager.disableBlend();
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMFog.disableFog();
+ GLSMLighting.disableLighting();
+ GLSMRasterizer.disableCull();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
color = texture(SIZE, SIZE, GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, null);
depth = texture(SIZE, SIZE, GL14.GL_DEPTH_COMPONENT24, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, null);
@@ -175,23 +188,23 @@ class PortalDrawerTest {
framebuffer.drawBuffers(new int[]{0});
framebuffer.readBuffer(0);
framebuffer.bind();
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
lightmap = noiseTexture(16, 3, GL11.GL_LINEAR);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmap);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmap);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
// EntityRenderer.enableLightmap's texture matrix
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glScalef(0.00390625F, 0.00390625F, 0.00390625F);
- GLStateManager.glTranslatef(8.0F, 8.0F, 8.0F);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glScalef(0.00390625F, 0.00390625F, 0.00390625F);
+ GLSMMatrices.glTranslatef(8.0F, 8.0F, 8.0F);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
- GLStateManager.setProjectionMatrix(new Matrix4f().perspective((float) Math.toRadians(70), 1.0F, 0.05F, 256.0F));
- GLStateManager.setModelViewMatrix(new Matrix4f().rotateX(0.2F).rotateY(0.25F));
+ GLSMMatrices.setProjectionMatrix(new Matrix4f().perspective((float) Math.toRadians(70), 1.0F, 0.05F, 256.0F));
+ GLSMMatrices.setModelViewMatrix(new Matrix4f().rotateX(0.2F).rotateY(0.25F));
addFaces();
}
@@ -199,12 +212,12 @@ class PortalDrawerTest {
void cleanup() {
drawer.destroy();
framebuffer.destroy();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteTextures(color);
- GLStateManager.glDeleteTextures(depth);
- if (tunnel != 0) GLStateManager.glDeleteTextures(tunnel);
- if (field != 0) GLStateManager.glDeleteTextures(field);
- GLStateManager.glDeleteTextures(lightmap);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMTextures.glDeleteTextures(color);
+ GLSMTextures.glDeleteTextures(depth);
+ if (tunnel != 0) GLSMTextures.glDeleteTextures(tunnel);
+ if (field != 0) GLSMTextures.glDeleteTextures(field);
+ GLSMTextures.glDeleteTextures(lightmap);
FfpFixture.resetFfpState();
}
@@ -229,16 +242,16 @@ class PortalDrawerTest {
void fogsEachLayerLikeTheMirror() {
tunnel = noiseTexture(64, 1, GL11.GL_NEAREST);
field = noiseTexture(256, 2, GL11.GL_NEAREST);
- GLStateManager.enableFog();
- GLStateManager.glFog(GL11.GL_FOG_COLOR, floats(0.05F, 0.08F, 0.15F, 1.0F));
+ GLSMFog.enableFog();
+ GLSMFog.glFog(GL11.GL_FOG_COLOR, floats(0.05F, 0.08F, 0.15F, 1.0F));
// Minecraft's distance fog, then its underwater fog
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
- GLStateManager.glFogf(GL11.GL_FOG_START, 2.0F);
- GLStateManager.glFogf(GL11.GL_FOG_END, 40.0F);
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 2.0F);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 40.0F);
final Parity linear = compare(true);
assertTrue(linear.withinOne >= linear.covered * 0.97, "linear fog drifts from TC's layers: " + linear);
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
- GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.02F);
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
+ GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.02F);
final Parity exp = compare(true);
assertTrue(exp.withinOne >= exp.covered * 0.97, "exp fog drifts from TC's layers: " + exp);
}
@@ -254,8 +267,8 @@ class PortalDrawerTest {
clear();
final PortalDrawer.Frame frame = new PortalDrawer.Frame();
- GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), frame.modelViewProjection);
- frame.modelView.set(GLStateManager.getModelViewMatrix());
+ GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), frame.modelViewProjection);
+ frame.modelView.set(GLSMMatrices.getModelViewMatrix());
frame.cameraX = CAMERA_X;
frame.cameraY = CAMERA_Y;
frame.cameraZ = CAMERA_Z;
@@ -328,22 +341,22 @@ class PortalDrawerTest {
final float view = axis == AXIS_X ? VIEW_X : axis == AXIS_Y ? VIEW_Y : VIEW_Z;
final Random random = new Random(31100L);
for (int i = 0; i < 16; ++i) {
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
float f5 = (float) (16 - i);
float f6 = 0.0625F;
float f7 = 1.0F / (f5 + 1.0F);
if (i == 0) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tunnel);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tunnel);
f7 = 0.1F;
f5 = 65.0F;
f6 = 0.125F;
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(770, 771);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(770, 771);
}
if (i == 1) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, field);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(1, 1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, field);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(1, 1);
f6 = 0.5F;
}
final float f8 = (float) (negative ? -plane : plane);
@@ -352,59 +365,59 @@ class PortalDrawerTest {
float f11 = f9 / f10;
f11 += (float) plane;
switch (axis) {
- case AXIS_X -> GLStateManager.glTranslatef(f11, py, pz);
- case AXIS_Y -> GLStateManager.glTranslatef(px, f11, pz);
- default -> GLStateManager.glTranslatef(px, py, f11);
+ case AXIS_X -> GLSMMatrices.glTranslatef(f11, py, pz);
+ case AXIS_Y -> GLSMMatrices.glTranslatef(px, f11, pz);
+ default -> GLSMMatrices.glTranslatef(px, py, f11);
}
- GLStateManager.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR);
- GLStateManager.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR);
- GLStateManager.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR);
- GLStateManager.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR);
+ GLSMTexEnvGen.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR);
+ GLSMTexEnvGen.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR);
+ GLSMTexEnvGen.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR);
+ GLSMTexEnvGen.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR);
switch (axis) {
case AXIS_X -> {
- GLStateManager.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0));
- GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0));
- GLStateManager.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1));
- GLStateManager.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(1, 0, 0, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1));
+ GLSMTexEnvGen.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(1, 0, 0, 0));
}
case AXIS_Y -> {
- GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0));
- GLStateManager.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0));
- GLStateManager.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1));
- GLStateManager.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 1, 0, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1));
+ GLSMTexEnvGen.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 1, 0, 0));
}
default -> {
- GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0));
- GLStateManager.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0));
- GLStateManager.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1));
- GLStateManager.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 0, 1, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0));
+ GLSMTexEnvGen.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1));
+ GLSMTexEnvGen.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 0, 1, 0));
}
}
- GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_S);
- GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_T);
- GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_R);
- GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_Q);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glTranslatef(0.0F, TIME, 0.0F);
- GLStateManager.glScalef(f6, f6, f6);
- GLStateManager.glTranslatef(0.5F, 0.5F, 0.0F);
- GLStateManager.glRotatef((float) (i * i * 4321 + i * 9) * 2.0F, 0.0F, 0.0F, 1.0F);
- GLStateManager.glTranslatef(-0.5F, -0.5F, 0.0F);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_S);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_T);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_R);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_Q);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glTranslatef(0.0F, TIME, 0.0F);
+ GLSMMatrices.glScalef(f6, f6, f6);
+ GLSMMatrices.glTranslatef(0.5F, 0.5F, 0.0F);
+ GLSMMatrices.glRotatef((float) (i * i * 4321 + i * 9) * 2.0F, 0.0F, 0.0F, 1.0F);
+ GLSMMatrices.glTranslatef(-0.5F, -0.5F, 0.0F);
switch (axis) {
case AXIS_X -> {
- GLStateManager.glTranslatef(-pz, -py, -px);
- GLStateManager.glTranslatef(VIEW_Z * f5 / f9, VIEW_Y * f5 / f9, -px);
+ GLSMMatrices.glTranslatef(-pz, -py, -px);
+ GLSMMatrices.glTranslatef(VIEW_Z * f5 / f9, VIEW_Y * f5 / f9, -px);
}
case AXIS_Y -> {
- GLStateManager.glTranslatef(-px, -pz, -py);
- GLStateManager.glTranslatef(VIEW_X * f5 / f9, VIEW_Z * f5 / f9, -py);
+ GLSMMatrices.glTranslatef(-px, -pz, -py);
+ GLSMMatrices.glTranslatef(VIEW_X * f5 / f9, VIEW_Z * f5 / f9, -py);
}
default -> {
- GLStateManager.glTranslatef(-px, -py, -pz);
- GLStateManager.glTranslatef(VIEW_X * f5 / f9, VIEW_Y * f5 / f9, -pz);
+ GLSMMatrices.glTranslatef(-px, -py, -pz);
+ GLSMMatrices.glTranslatef(VIEW_X * f5 / f9, VIEW_Y * f5 / f9, -pz);
}
}
float red = random.nextFloat() * 0.5F + 0.1F;
@@ -413,14 +426,14 @@ class PortalDrawerTest {
if (i == 0) red = green = blue = 1.0F;
// Tessellator.setColorRGBA_F stores bytes, and its brightness 180 becomes the lightmap coordinate
quad(f, (int) (red * f7 * 255.0F), (int) (green * f7 * 255.0F), (int) (blue * f7 * 255.0F));
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
- GLStateManager.disableBlend();
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q);
+ GLSMBlend.disableBlend();
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q);
}
private record Parity(int covered, int exact, int withinOne, int worst) {
diff --git a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java
index df6d71b99..02c750ee5 100644
--- a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java
@@ -4,7 +4,8 @@ import com.gtnewhorizons.angelica.api.debug.DebugScreenEntryStatus;
import com.gtnewhorizons.angelica.client.font.FontTestFixture;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt;
import net.minecraft.client.audio.SoundHandler;
@@ -220,22 +221,22 @@ class DebugOptionsScreenGLTest {
final int viewTop = Reflect.get(screen, "viewTop");
final int nameX = Reflect.get(screen, "nameX");
final int rowH = Reflect.getStatic(DebugOptionsScreen.class, "ROW_H");
- final boolean blend = GLStateManager.getBlendMode().isEnabled();
- final boolean depth = GLStateManager.getDepthTest().isEnabled();
- GLStateManager.enableDepthTest();
+ final boolean blend = GLSMBlend.getBlendMode().isEnabled();
+ final boolean depth = GLSMDepthStencilAlpha.getDepthTest().isEnabled();
+ GLSMDepthStencilAlpha.enableDepthTest();
try {
GL11.glGetError();
screen.drawScreen(nameX + 1, viewTop + (hovered - first) * rowH + rowH / 2, 0.0f);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
- assertTrue(GLStateManager.getDepthTest().isEnabled());
- assertEquals(blend, GLStateManager.getBlendMode().isEnabled());
+ assertTrue(GLSMDepthStencilAlpha.getDepthTest().isEnabled());
+ assertEquals(blend, GLSMBlend.getBlendMode().isEnabled());
final Object batcher = Reflect.get(screen, "batcher");
assertEquals(0, (int) Reflect.get(batcher, "batchDepth"));
assertNotNull(Reflect.get(screen, "measuredTooltip"));
} finally {
- if (!depth) GLStateManager.disableDepthTest();
+ if (!depth) GLSMDepthStencilAlpha.disableDepthTest();
}
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java
index 6cd655824..71b9955ab 100644
--- a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java
@@ -5,7 +5,10 @@ import com.gtnewhorizons.angelica.client.font.FontTestFixture;
import com.gtnewhorizons.angelica.client.font.TextMesh;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt;
import net.minecraft.client.gui.FontRenderer;
@@ -114,14 +117,14 @@ class DebugOverlayFallbackGLTest {
}
private static boolean anyLitAfterDirectDraw() {
- GLStateManager.glViewport(0, 0, 128, 32);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glOrtho(0.0, 128, 32, 0.0, -1.0, 1.0);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMRasterizer.glViewport(0, 0, 128, 32);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glOrtho(0.0, 128, 32, 0.0, -1.0, 1.0);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
batcher.drawString(2.0f, 2.0f, 0xFFFFFFFF, false, false, "balanced", 0, 8);
final ByteBuffer pixels = BufferUtils.createByteBuffer(128 * 32 * 4);
GL11.glReadPixels(0, 0, 128, 32, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
diff --git a/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java b/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java
index 6136e006c..7870f81ac 100644
--- a/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java
@@ -11,7 +11,15 @@ import com.gtnewhorizons.angelica.debug.render.DebugPrograms;
import com.gtnewhorizons.angelica.debug.render.NativeScratch;
import com.gtnewhorizons.angelica.debug.screen.renderers.DebugMeshData.LineWidth;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
@@ -60,22 +68,22 @@ class DebugMeshGLTest {
FfpFixture.resetFfpState();
ShaderManager.enable();
ShaderManager.getInstance().activate();
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
}
@AfterEach
void tearDown() {
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
mesh.delete();
data.free();
uploadScratch.free();
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
FfpFixture.resetFfpState();
}
@@ -191,80 +199,80 @@ class DebugMeshGLTest {
mesh.upload(data, uploadScratch);
final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
- final int ambient = GLStateManager.glGenTextures();
- final int glyphs = GLStateManager.glGenTextures();
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ final int ambient = GLSMTextures.glGenTextures();
+ final int glyphs = GLSMTextures.glGenTextures();
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, ambient);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_ALWAYS);
- GLStateManager.glDepthMask(true);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE);
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.glFrontFace(GL11.GL_CW);
- GLStateManager.enableScissorTest();
- GLStateManager.glScissor(0, 0, SIZE, SIZE);
- GLStateManager.glPolygonMode(GL11.GL_FRONT, GL11.GL_FILL);
- GLStateManager.glPolygonMode(GL11.GL_BACK, GL11.GL_LINE);
- GLStateManager.glLineWidth(3.0F);
- GLStateManager.glUseProgram(program);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, ambient);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMRasterizer.glFrontFace(GL11.GL_CW);
+ GLSMRasterizer.enableScissorTest();
+ GLSMRasterizer.glScissor(0, 0, SIZE, SIZE);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT, GL11.GL_FILL);
+ GLSMRasterizer.glPolygonMode(GL11.GL_BACK, GL11.GL_LINE);
+ GLSMRasterizer.glLineWidth(3.0F);
+ GLSMPrograms.glUseProgram(program);
- final long drawCalls = GLStateManager.drawCalls;
+ final long drawCalls = GLSMDraws.drawCalls;
scope.beginWorld();
try {
drawMeshPasses(false, 0.0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, glyphs);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, glyphs);
} finally {
scope.end();
}
- assertTrue(GLStateManager.drawCalls > drawCalls);
- assertTrue(GLStateManager.getDepthTest().isEnabled());
- assertEquals(GL11.GL_ALWAYS, GLStateManager.getDepthState().getFunc());
- assertTrue(GLStateManager.getDepthState().isEnabled());
- assertFalse(GLStateManager.getBlendMode().isEnabled());
- final BlendState blend = GLStateManager.getBlendState();
+ assertTrue(GLSMDraws.drawCalls > drawCalls);
+ assertTrue(GLSMDepthStencilAlpha.getDepthTest().isEnabled());
+ assertEquals(GL11.GL_ALWAYS, GLSMDepthStencilAlpha.getDepthState().getFunc());
+ assertTrue(GLSMDepthStencilAlpha.getDepthState().isEnabled());
+ assertFalse(GLSMBlend.getBlendMode().isEnabled());
+ final BlendState blend = GLSMBlend.getBlendState();
assertEquals(GL11.GL_ONE, blend.getSrcRgb());
assertEquals(GL11.GL_ONE, blend.getDstRgb());
assertEquals(GL11.GL_ZERO, blend.getSrcAlpha());
assertEquals(GL11.GL_ONE, blend.getDstAlpha());
- assertTrue(GLStateManager.getCullState().isEnabled());
- assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode());
- assertEquals(GL11.GL_CW, GLStateManager.getPolygonState().getFrontFace());
- assertTrue(GLStateManager.getScissorTest().isEnabled());
- assertEquals(GL11.GL_FILL, GLStateManager.getPolygonState().getFrontMode());
- assertEquals(GL11.GL_LINE, GLStateManager.getPolygonState().getBackMode());
- assertEquals(3.0F, GLStateManager.getLineState().getWidth());
- assertEquals(1, GLStateManager.getActiveTextureUnit());
- assertEquals(ambient, GLStateManager.getTextures().getTextureUnitBindings(0).getBinding());
+ assertTrue(GLSMRasterizer.getCullState().isEnabled());
+ assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode());
+ assertEquals(GL11.GL_CW, GLSMRasterizer.getPolygonState().getFrontFace());
+ assertTrue(GLSMRasterizer.getScissorTest().isEnabled());
+ assertEquals(GL11.GL_FILL, GLSMRasterizer.getPolygonState().getFrontMode());
+ assertEquals(GL11.GL_LINE, GLSMRasterizer.getPolygonState().getBackMode());
+ assertEquals(3.0F, GLSMRasterizer.getLineState().getWidth());
+ assertEquals(1, GLSMTextures.getActiveTextureUnit());
+ assertEquals(ambient, GLSMTextures.getTextures().getTextureUnitBindings(0).getBinding());
assertEquals(ambient, GlTestSupport.driverTextureBinding(0));
- assertEquals(program, GLStateManager.getActiveProgram());
+ assertEquals(program, GLSMPrograms.getActiveProgram());
assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- assertEquals(vao, GLStateManager.getBoundVAO());
- assertEquals(vbo, GLStateManager.getBoundVBO());
+ assertEquals(vao, GLSMVertexInput.getBoundVAO());
+ assertEquals(vbo, GLSMBuffers.getBoundVBO());
assertEquals(vao, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING));
assertEquals(vbo, GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING));
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
- GLStateManager.glLineWidth(1.0F);
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
- GLStateManager.disableScissorTest();
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glFrontFace(GL11.GL_CCW);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(ambient);
- GLStateManager.glDeleteTextures(glyphs);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
+ GLSMRasterizer.glLineWidth(1.0F);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
+ GLSMRasterizer.disableScissorTest();
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(ambient);
+ GLSMTextures.glDeleteTextures(glyphs);
}
}
@@ -277,14 +285,14 @@ class DebugMeshGLTest {
final int colorOffset = DebugGeometry.offsetOf(format, VertexFormatElement.Usage.COLOR);
final ByteBuffer texels = BufferUtils.createByteBuffer(2 * 2 * 4);
texels.put(new byte[] { (byte) 255, 0, 0, (byte) 255, 0, (byte) 255, 0, (byte) 255, 0, 0, (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, (byte) 255 }).flip();
- final int texture = GLStateManager.glGenTextures();
+ final int texture = GLSMTextures.glGenTextures();
final NativeScratch vertices = new NativeScratch(4 * stride);
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
vertices.ensure(4 * stride);
final long p = vertices.address();
texturedVertex(p, -1.0F, -1.0F, 0.0F, 0.0F, uvOffset, colorOffset);
@@ -310,8 +318,8 @@ class DebugMeshGLTest {
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError());
} finally {
vertices.free();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texture);
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java b/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java
index 0515cf9fc..bac90c24d 100644
--- a/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java
@@ -2,7 +2,13 @@ package com.gtnewhorizons.angelica.iris;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.recording.GLCommand;
@@ -53,14 +59,14 @@ class IrisDisplayListStateTest {
@AfterEach
void cleanup() {
ProgramUniforms.clearActiveUniforms();
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
- GLStateManager.glUseProgram(0);
- for (int list : lists) GLStateManager.glDeleteLists(list, 1);
- for (int program : programs) GLStateManager.glDeleteProgram(program);
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
+ GLSMPrograms.glUseProgram(0);
+ for (int list : lists) GLSMDraws.glDeleteLists(list, 1);
+ for (int program : programs) GLSMPrograms.glDeleteProgram(program);
}
private int newList() {
- int list = GLStateManager.glGenLists(1);
+ int list = GLSMDraws.glGenLists(1);
lists.add(list);
return list;
}
@@ -73,121 +79,121 @@ class IrisDisplayListStateTest {
}
private void selectProgram() {
- IrisDisplayListState.runProgramTransition(() -> GLStateManager.glUseProgram(selectedProgram));
+ IrisDisplayListState.runProgramTransition(() -> GLSMPrograms.glUseProgram(selectedProgram));
}
@Test
void cutoutScopesRestorePlaybackAlphaAndLightmapWithoutChangingItsActiveUnit() {
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try {
for (int mode : new int[] {GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) {
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.2f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.2f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
final int list = newList();
- GLStateManager.glNewList(list, mode);
- final int outer = GLStateManager.pushState(StateSet.CUTOUT);
+ GLSMDraws.glNewList(list, mode);
+ final int outer = GLSMAttribStack.pushState(StateSet.CUTOUT);
GbufferPrograms.setCutoutDefaults();
- final int inner = GLStateManager.pushState(StateSet.CUTOUT);
+ final int inner = GLSMAttribStack.pushState(StateSet.CUTOUT);
GbufferPrograms.setCutoutDefaults();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.popStateTo(inner);
- DisplayListManager.recordStateCommand(() -> assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled()));
- GLStateManager.popStateTo(outer);
- GLStateManager.glEndList();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMAttribStack.popStateTo(inner);
+ DisplayListManager.recordStateCommand(() -> assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled()));
+ GLSMAttribStack.popStateTo(outer);
+ GLSMDraws.glEndList();
for (boolean lightmap : new boolean[] {true, false}) {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GEQUAL, 0.7f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- if (lightmap) GLStateManager.enableTexture(); else GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glCallList(list);
- assertTrue(GLStateManager.isEffectiveAlphaTestEnabled());
- assertEquals(GL11.GL_GEQUAL, GLStateManager.getAlphaState().getFunction());
- assertEquals(0.7f, GLStateManager.getAlphaState().getReference());
- assertEquals(lightmap, GLStateManager.getTextures().getTextureUnitStates(1).isEnabled());
- assertEquals(2, GLStateManager.getActiveTextureUnit(), "scope restores must preserve the list's explicit unit selection");
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GEQUAL, 0.7f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ if (lightmap) GLSMTextures.enableTexture(); else GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMDraws.glCallList(list);
+ assertTrue(GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled());
+ assertEquals(GL11.GL_GEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction());
+ assertEquals(0.7f, GLSMDepthStencilAlpha.getAlphaState().getReference());
+ assertEquals(lightmap, GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled());
+ assertEquals(2, GLSMTextures.getActiveTextureUnit(), "scope restores must preserve the list's explicit unit selection");
}
}
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
}
@Test
void cutoutDefaultsOutsideListEnableLightmapWithoutSwitchingUnit() {
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.disableTexture();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE3);
- final int d = GLStateManager.pushState(StateSet.CUTOUT);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.disableTexture();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3);
+ final int d = GLSMAttribStack.pushState(StateSet.CUTOUT);
try {
- final long savedBefore = GLStateManager.attribSlotsSaved;
+ final long savedBefore = GLSMAttribStack.attribSlotsSaved;
GbufferPrograms.setCutoutDefaults();
- assertEquals(1, GLStateManager.attribSlotsSaved - savedBefore);
- assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled());
- assertEquals(3, GLStateManager.getActiveTextureUnit());
+ assertEquals(1, GLSMAttribStack.attribSlotsSaved - savedBefore);
+ assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled());
+ assertEquals(3, GLSMTextures.getActiveTextureUnit());
} finally {
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
}
- assertFalse(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled());
+ assertFalse(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled());
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
}
@Test
void nestedBlendScopesRestorePlaybackValuesEvenIfCompileTimePopWasANoop() {
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try {
for (int mode : new int[] {GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) {
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
final int child = newList();
- GLStateManager.glNewList(child, mode);
- final int scope = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.popStateTo(scope);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(child, mode);
+ final int scope = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMAttribStack.popStateTo(scope);
+ GLSMDraws.glEndList();
final int parent = newList();
- GLStateManager.glNewList(parent, mode);
- final int parentScope = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.glCallList(child);
- GLStateManager.popStateTo(parentScope);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(parent, mode);
+ final int parentScope = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMDraws.glCallList(child);
+ GLSMAttribStack.popStateTo(parentScope);
+ GLSMDraws.glEndList();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE);
- final int caller = GLStateManager.pushState(StateSet.BLEND);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE);
+ final int caller = GLSMAttribStack.pushState(StateSet.BLEND);
try {
- GLStateManager.glCallList(parent);
- assertTrue(GLStateManager.isEffectiveBlendEnabled());
+ GLSMDraws.glCallList(parent);
+ assertTrue(GLSMBlend.isEffectiveBlendEnabled());
assertTrue(GL11.glIsEnabled(GL11.GL_BLEND), "driver blend enable");
assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb");
assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_DST_RGB), "driver blend dst rgb");
assertEquals(GL11.GL_ZERO, GL11.glGetInteger(GL14.GL_BLEND_SRC_ALPHA), "driver blend src alpha");
assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_DST_ALPHA), "driver blend dst alpha");
- final var blend = GLStateManager.getEffectiveBlendState(new com.gtnewhorizons.angelica.glsm.states.BlendState());
+ final var blend = GLSMBlend.getEffectiveBlendState(new com.gtnewhorizons.angelica.glsm.states.BlendState());
assertEquals(GL11.GL_SRC_ALPHA, blend.getSrcRgb());
assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, blend.getDstRgb());
assertEquals(GL11.GL_ZERO, blend.getSrcAlpha());
assertEquals(GL11.GL_ONE, blend.getDstAlpha());
- assertEquals(caller + 1, GLStateManager.getAttribDepth());
+ assertEquals(caller + 1, GLSMAttribStack.getAttribDepth());
} finally {
- GLStateManager.popStateTo(caller);
+ GLSMAttribStack.popStateTo(caller);
}
}
} finally {
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
}
}
@@ -200,7 +206,7 @@ class IrisDisplayListStateTest {
state.setCurrentBlockEntity(12);
state.setCurrentEntityColor(1, 0, 0, 0.5f);
final int child = newList();
- GLStateManager.glNewList(child, mode);
+ GLSMDraws.glNewList(child, mode);
try (CapturedStateScope nestedIgnored = new CapturedStateScope()) {
state.setCurrentEntityAndItem(45010, 45011);
state.setCurrentBlockEntity(45012);
@@ -212,22 +218,22 @@ class IrisDisplayListStateTest {
assertTrue(state.getCurrentEntityColor().equals(0, 1, 0, 0.25f));
});
}
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
final int parent = newList();
- GLStateManager.glNewList(parent, mode);
+ GLSMDraws.glNewList(parent, mode);
state.pushCurrentBlockEntity();
state.setCurrentBlockEntity(99);
- GLStateManager.glCallList(child);
+ GLSMDraws.glCallList(child);
DisplayListManager.recordStateCommand(() -> assertEquals(99, state.getCurrentRenderedBlockEntity()));
state.popCurrentBlockEntity();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
for (int caller : new int[] {33, 44}) {
state.setCurrentEntityAndItem(caller, caller + 1);
state.setCurrentBlockEntity(caller + 2);
state.setCurrentEntityColor(0, 0, 1, 0.75f);
- GLStateManager.glCallList(parent);
+ GLSMDraws.glCallList(parent);
assertEquals(caller, state.getCurrentRenderedEntity());
assertEquals(caller + 1, state.getCurrentRenderedItem());
assertEquals(caller + 2, state.getCurrentRenderedBlockEntity());
@@ -245,16 +251,16 @@ class IrisDisplayListStateTest {
state.setCurrentBlockEntity(9);
state.setCurrentEntityColor(1, 0, 0, 0.5f);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
for (int i = 0; i < 100; i++) state.setCurrentEntityAndItem(7, 8);
for (int i = 0; i < 100; i++) state.setCurrentBlockEntity(9);
for (int i = 0; i < 100; i++) state.setCurrentEntityColor(1, 0, 0, 0.5f);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(3, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.COMPLEX_REF));
state.setCurrentEntityAndItem(70, 80);
state.setCurrentBlockEntity(90);
state.setCurrentEntityColor(0, 1, 0, 1);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(7, state.getCurrentRenderedEntity());
assertEquals(8, state.getCurrentRenderedItem());
assertEquals(9, state.getCurrentRenderedBlockEntity());
@@ -274,14 +280,14 @@ class IrisDisplayListStateTest {
settings.setEntityIds(null);
settings.setItemIds(null);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
state.setCurrentNamedEntity(name);
state.setCurrentNamedItem(name);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
for (int id : new int[] {45001, 45002, -1}) {
settings.setEntityIds(key -> name.equals(key) ? id : -1);
settings.setItemIds(key -> name.equals(key) ? id + 4 : 0);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(id, state.getCurrentRenderedEntity());
assertEquals(id + 4, state.getCurrentRenderedItem());
}
@@ -300,7 +306,7 @@ class IrisDisplayListStateTest {
final var state = CapturedRenderingState.INSTANCE;
state.pushCurrentBlockEntity();
final int program = program();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
state.setCurrentBlockEntity(111);
final var builder = ProgramUniforms.builder("block identity", program);
builder.uniform1i("itemId", state::getCurrentRenderedBlockEntity, state.getBlockEntityIdNotifier());
@@ -310,11 +316,11 @@ class IrisDisplayListStateTest {
try {
settings.setBlockMetaMatches(null);
final int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
state.setCurrentBlockEntity(block, 3);
uniforms.update();
assertEquals(111, itemUniform(program), "compile-only notifications must not change the live uniform");
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
for (int id : new int[] {45020, 45021}) {
final var meta = new it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap();
meta.put(3, id);
@@ -322,7 +328,7 @@ class IrisDisplayListStateTest {
matches.put(block, meta);
settings.setBlockMetaMatches(matches);
state.setCurrentBlockEntity(222);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(id, state.getCurrentRenderedBlockEntity());
assertEquals(id, itemUniform(program));
}
@@ -339,15 +345,15 @@ class IrisDisplayListStateTest {
final var values = BufferUtils.createFloatBuffer(4);
try {
for (int mode : new int[] {GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) {
- GLStateManager.glVertexAttrib4f(index, 1, 2, 3, 4);
+ GLSMCurrentAttribs.glVertexAttrib4f(index, 1, 2, 3, 4);
final int list = newList();
- GLStateManager.glNewList(list, mode);
- GLStateManager.glVertexAttrib2s(index, (short) -1, (short) 7);
+ GLSMDraws.glNewList(list, mode);
+ GLSMCurrentAttribs.glVertexAttrib2s(index, (short) -1, (short) 7);
GL20.glGetVertexAttrib(index, GL20.GL_CURRENT_VERTEX_ATTRIB, values);
assertEquals(mode == GL11.GL_COMPILE ? 1f : -1f, values.get(0));
- GLStateManager.glEndList();
- GLStateManager.glVertexAttrib4f(index, 9, 9, 9, 9);
- GLStateManager.glCallList(list);
+ GLSMDraws.glEndList();
+ GLSMCurrentAttribs.glVertexAttrib4f(index, 9, 9, 9, 9);
+ GLSMDraws.glCallList(list);
GL20.glGetVertexAttrib(index, GL20.GL_CURRENT_VERTEX_ATTRIB, values);
assertEquals(-1f, values.get(0));
assertEquals(7f, values.get(1));
@@ -356,7 +362,7 @@ class IrisDisplayListStateTest {
assertEquals(1, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.VERTEX_ATTRIB));
}
} finally {
- GLStateManager.glVertexAttrib4f(index, 0, 0, 0, 1);
+ GLSMCurrentAttribs.glVertexAttrib4f(index, 0, 0, 0, 1);
}
}
@@ -366,19 +372,19 @@ class IrisDisplayListStateTest {
int compileProgram = program();
int playbackProgram = program();
for (int mode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) {
- GLStateManager.glUseProgram(caller);
+ GLSMPrograms.glUseProgram(caller);
selectedProgram = compileProgram;
int list = newList();
- GLStateManager.glNewList(list, mode);
+ GLSMDraws.glNewList(list, mode);
DisplayListManager.recordStateCommand(this::selectProgram);
selectProgram();
assertEquals(mode == GL11.GL_COMPILE ? caller : compileProgram, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(0, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.USE_PROGRAM));
selectedProgram = playbackProgram;
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(playbackProgram, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- assertEquals(playbackProgram, GLStateManager.getActiveProgram());
+ assertEquals(playbackProgram, GLSMPrograms.getActiveProgram());
}
}
@@ -386,25 +392,25 @@ class IrisDisplayListStateTest {
void explicitForeignProgramBindsStillRecord() {
int explicit = program();
int caller = program();
- GLStateManager.glUseProgram(caller);
+ GLSMPrograms.glUseProgram(caller);
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glUseProgram(explicit);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMPrograms.glUseProgram(explicit);
+ GLSMDraws.glEndList();
assertEquals(caller, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(explicit, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
}
@Test
void transitionFailureResumesRecording() {
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE);
assertThrows(IllegalStateException.class, () -> IrisDisplayListState.runProgramTransition(() -> {
throw new IllegalStateException("test");
}));
assertTrue(DisplayListManager.isRecording());
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
}
@Test
@@ -412,21 +418,21 @@ class IrisDisplayListStateTest {
final int original = ItemIdManager.getItemId();
try {
final int child = newList();
- GLStateManager.glNewList(child, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(child, GL11.GL_COMPILE);
ItemIdManager.setItemIdRaw(19);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
ItemIdManager.setItemIdRaw(42);
final int parent = newList();
- GLStateManager.glNewList(parent, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(parent, GL11.GL_COMPILE);
ItemIdManager.setItemIdRaw(42);
ItemIdManager.setItemIdRaw(42);
- GLStateManager.glCallList(child);
+ GLSMDraws.glCallList(child);
ItemIdManager.setItemIdRaw(42);
ItemIdManager.setItemIdRaw(42);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(2, DisplayListManager.getDisplayList(parent).getCommandCounts().get(GLCommand.COMPLEX_REF));
ItemIdManager.setItemIdRaw(77);
- GLStateManager.glCallList(parent);
+ GLSMDraws.glCallList(parent);
assertEquals(42, ItemIdManager.getItemId());
} finally {
ItemIdManager.setItemIdRaw(original);
@@ -439,23 +445,23 @@ class IrisDisplayListStateTest {
try {
ItemIdManager.setItemIdRaw(111);
int child = newList();
- GLStateManager.glNewList(child, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(child, GL11.GL_COMPILE);
ItemIdManager.pushItemId();
ItemIdManager.setItemIdRaw(9);
ItemIdManager.popItemId();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
int parent = newList();
- GLStateManager.glNewList(parent, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(parent, GL11.GL_COMPILE);
ItemIdManager.pushItemId();
ItemIdManager.setItemIdRaw(42);
- GLStateManager.glCallList(child);
+ GLSMDraws.glCallList(child);
DisplayListManager.recordStateCommand(() -> assertEquals(42, ItemIdManager.getItemId()));
ItemIdManager.popItemId();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(111, ItemIdManager.getItemId());
for (int caller : new int[] {222, 333}) {
ItemIdManager.setItemIdRaw(caller);
- GLStateManager.glCallList(parent);
+ GLSMDraws.glCallList(parent);
assertEquals(caller, ItemIdManager.getItemId());
}
} finally {
@@ -468,19 +474,19 @@ class IrisDisplayListStateTest {
WorldRenderingPhase originalPhase = GbufferPrograms.getOverridePhase();
Boolean originalTranslucency = GbufferPrograms.getDeclaredTranslucency();
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
GbufferPrograms.pushOverridePhase(WorldRenderingPhase.ENTITIES);
GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.GLINT);
Boolean previous = GbufferPrograms.beginTranslucencyDeclaration(false);
GbufferPrograms.endTranslucencyDeclaration(previous);
GbufferPrograms.teardownSpecialRenderCondition();
GbufferPrograms.popOverridePhase();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
GbufferPrograms.setOverridePhase(WorldRenderingPhase.HAND_SOLID);
GbufferPrograms.setTranslucencyDeclaration(true);
GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.ENTITY_EYES);
try {
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(WorldRenderingPhase.HAND_SOLID, GbufferPrograms.getOverridePhase());
assertEquals(SpecialCondition.ENTITY_EYES, GbufferPrograms.getSpecialCondition());
assertEquals(Boolean.TRUE, GbufferPrograms.getDeclaredTranslucency());
@@ -505,7 +511,7 @@ class IrisDisplayListStateTest {
for (WorldRenderingPhase compiling : new WorldRenderingPhase[] { WorldRenderingPhase.NONE, WorldRenderingPhase.BLOCK_ENTITIES }) {
pipeline.phase = compiling;
int child = newList();
- GLStateManager.glNewList(child, mode);
+ GLSMDraws.glNewList(child, mode);
boolean childScope = GbufferPrograms.beginNestedEntityPhase();
DisplayListManager.recordStateCommand(() -> {
assertEquals(expected[0], GbufferPrograms.getCurrentPhase());
@@ -513,23 +519,23 @@ class IrisDisplayListStateTest {
GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
});
GbufferPrograms.endNestedEntityPhase(childScope);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
int parent = newList();
- GLStateManager.glNewList(parent, mode);
+ GLSMDraws.glNewList(parent, mode);
boolean parentScope = GbufferPrograms.beginNestedEntityPhase();
// COMPILE_AND_EXECUTE also replays the child now.
expected[0] = GbufferPrograms.getCurrentPhase();
pipeline.bind();
- GLStateManager.glCallList(child);
+ GLSMDraws.glCallList(child);
GbufferPrograms.endNestedEntityPhase(parentScope);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
for (WorldRenderingPhase playback : new WorldRenderingPhase[] { WorldRenderingPhase.BLOCK_ENTITIES, WorldRenderingPhase.HAND_SOLID, WorldRenderingPhase.ENTITIES }) {
pipeline.phase = playback;
GbufferPrograms.setOverridePhase(null);
expected[0] = playback == WorldRenderingPhase.BLOCK_ENTITIES ? WorldRenderingPhase.ENTITIES : playback;
- GLStateManager.glCallList(parent);
+ GLSMDraws.glCallList(parent);
assertEquals(playback, GbufferPrograms.getCurrentPhase());
assertNull(GbufferPrograms.getOverridePhase());
assertEquals(playback == WorldRenderingPhase.ENTITIES ? pipeline.entityProgram : pipeline.blockProgram,
@@ -538,7 +544,7 @@ class IrisDisplayListStateTest {
}
}
} finally {
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
GbufferPrograms.setOverridePhase(previousOverride);
Reflect.set(manager, "pipeline", previousPipeline);
}
@@ -567,14 +573,14 @@ class IrisDisplayListStateTest {
}
private void bind() {
- IrisDisplayListState.runProgramTransition(() -> GLStateManager.glUseProgram(
+ IrisDisplayListState.runProgramTransition(() -> GLSMPrograms.glUseProgram(
getPhase() == WorldRenderingPhase.ENTITIES ? entityProgram : blockProgram));
}
}
private static int itemUniform(int program) {
IntBuffer result = BufferUtils.createIntBuffer(1);
- GL20.glGetUniform(program, GLStateManager.glGetUniformLocation(program, "itemId"), result);
+ GL20.glGetUniform(program, GLSMPrograms.glGetUniformLocation(program, "itemId"), result);
return result.get(0);
}
@@ -591,7 +597,7 @@ class IrisDisplayListStateTest {
final String registered = EntityList.getEntityString(entity);
final NamespacedId name = new NamespacedId(registered == null ? entity.getClass().getSimpleName() : registered);
final int program = program();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
final ProgramUniforms.Builder builder = ProgramUniforms.builder("cached entity", program);
// The fixture's active int uniform carries the entity ID here.
builder.uniform1i("itemId", state::getCurrentRenderedEntity, state.getEntityIdNotifier());
@@ -607,7 +613,7 @@ class IrisDisplayListStateTest {
expected[0] = -1;
state.setCurrentEntityAndItem(111, 112);
final int child = newList();
- GLStateManager.glNewList(child, mode);
+ GLSMDraws.glNewList(child, mode);
state.pushCurrentEntityAndItem();
state.setCurrentRenderedEntity(entity);
DisplayListManager.recordStateCommand(() -> {
@@ -617,30 +623,30 @@ class IrisDisplayListStateTest {
assertEquals(52, state.getCurrentRenderedBlockEntity(), "the cage keeps its block ID");
});
state.popCurrentEntityAndItem();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(111, state.getCurrentRenderedEntity());
assertEquals(112, state.getCurrentRenderedItem());
final int parent = newList();
- GLStateManager.glNewList(parent, mode);
+ GLSMDraws.glNewList(parent, mode);
state.pushCurrentEntityAndItem();
state.setCurrentRenderedEntity(entity);
ItemIdManager.pushItemId();
ItemIdManager.setItemIdRaw(73);
- GLStateManager.glCallList(child);
+ GLSMDraws.glCallList(child);
DisplayListManager.recordStateCommand(() -> {
assertEquals(expected[0], state.getCurrentRenderedEntity());
assertEquals(73, state.getCurrentRenderedItem(), "nested entity restores outer item ID");
});
ItemIdManager.popItemId();
state.popCurrentEntityAndItem();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
for (int id : new int[] { 45010, 45011, -1 }) {
settings.setEntityIds(key -> name.equals(key) ? id : -1);
expected[0] = id;
state.setCurrentEntityAndItem(222, 223);
- GLStateManager.glCallList(parent);
+ GLSMDraws.glCallList(parent);
assertEquals(222, state.getCurrentRenderedEntity());
assertEquals(222, itemUniform(program));
assertEquals(223, state.getCurrentRenderedItem());
@@ -648,7 +654,7 @@ class IrisDisplayListStateTest {
}
}
} finally {
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
ProgramUniforms.clearActiveUniforms();
settings.setEntityIds(previousIds);
settings.setEntityNbtMap(previousNbt);
@@ -666,7 +672,7 @@ class IrisDisplayListStateTest {
Item item = new Item();
NamespacedId name = new NamespacedId("angelica", "cached_item_test");
int program = program();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
ProgramUniforms.Builder builder = ProgramUniforms.builder("cached item", program);
builder.uniform1i("itemId", ItemIdManager::getItemId, CapturedRenderingState.INSTANCE.getItemIdNotifier());
ProgramUniforms uniforms = builder.buildUniforms();
@@ -681,7 +687,7 @@ class IrisDisplayListStateTest {
ItemIdManager.setItemIdRaw(111);
ItemStack stack = new ItemStack(item);
int list = newList();
- GLStateManager.glNewList(list, mode);
+ GLSMDraws.glNewList(list, mode);
ItemIdManager.pushItemId();
ItemIdManager.setItemId(stack);
DisplayListManager.recordStateCommand(() -> {
@@ -689,7 +695,7 @@ class IrisDisplayListStateTest {
assertEquals(expected[0], itemUniform(program));
});
ItemIdManager.popItemId();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(111, ItemIdManager.getItemId());
// A renderer may reuse its ItemStack after compiling a list.
stack.func_150996_a(new Item());
@@ -700,13 +706,13 @@ class IrisDisplayListStateTest {
Reflect.>getStatic(ItemMaterialHelper.class, "ITEM_NAME_CACHE").put(item, name);
expected[0] = id;
ItemIdManager.setItemIdRaw(222);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(222, ItemIdManager.getItemId());
assertEquals(222, itemUniform(program));
}
}
} finally {
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
ProgramUniforms.clearActiveUniforms();
settings.setItemIds(previousIds);
settings.setItemNbtMap(previousNbt);
@@ -719,7 +725,7 @@ class IrisDisplayListStateTest {
void compileOnlyItemNotificationsDoNotUploadToLiveProgram() {
int program = program();
int original = ItemIdManager.getItemId();
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
ItemIdManager.setItemIdRaw(111);
ProgramUniforms.Builder builder = ProgramUniforms.builder("review", program);
builder.uniform1i("itemId", ItemIdManager::getItemId, CapturedRenderingState.INSTANCE.getItemIdNotifier());
@@ -729,16 +735,16 @@ class IrisDisplayListStateTest {
dynamic.get(0).update();
try {
int list = newList();
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
ItemIdManager.pushItemId();
ItemIdManager.setItemIdRaw(42);
uniforms.update();
assertEquals(111, itemUniform(program));
ItemIdManager.popItemId();
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
ItemIdManager.setItemIdRaw(222);
assertEquals(222, itemUniform(program));
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(222, itemUniform(program));
} finally {
ProgramUniforms.clearActiveUniforms();
diff --git a/src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java b/src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java
new file mode 100644
index 000000000..0ea5d032e
--- /dev/null
+++ b/src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java
@@ -0,0 +1,130 @@
+package com.gtnewhorizons.angelica.loading;
+
+import com.gtnewhorizons.angelica.glsm.testutil.DefiningClassLoader;
+import com.gtnewhorizons.angelica.loading.shared.transformers.AngelicaRedirector;
+import org.junit.jupiter.api.Test;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.LineNumberNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TypeInsnNode;
+import org.objectweb.asm.tree.VarInsnNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+
+class GLSMApiRedirectsTest {
+
+ private static final String CLASS_NAME = "com/example/OutsideMod";
+ private static final String GLSM = "com/gtnewhorizons/angelica/glsm/GLStateManager";
+ private static final String FOG_STATE_STACK = "com/gtnewhorizons/angelica/glsm/stacks/FogStateStack";
+ private static final String GL_STATE = "com/gtnewhorizons/angelica/api/glstate/GLState";
+ private static final String VECTOR3D = "org/joml/Vector3d";
+ private static final String GLSM_FOG = "com/gtnewhorizons/angelica/glsm/GLSMFog";
+
+ private static ClassNode outsideClass() {
+ final ClassNode cn = new ClassNode();
+ cn.version = Opcodes.V1_8;
+ cn.access = Opcodes.ACC_PUBLIC;
+ cn.name = CLASS_NAME;
+ cn.superName = "java/lang/Object";
+
+ final MethodNode fogBuffer = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fogRed", "()F", null, null);
+ final LabelNode line = new LabelNode();
+ fogBuffer.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GLSM, "getFogState", "()L" + FOG_STATE_STACK + ";", false));
+ fogBuffer.instructions.add(line);
+ fogBuffer.instructions.add(new LineNumberNode(7, line));
+ fogBuffer.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, FOG_STATE_STACK, "getFogColorBuffer", "()Ljava/nio/FloatBuffer;", false));
+ fogBuffer.instructions.add(new InsnNode(Opcodes.ICONST_0));
+ fogBuffer.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/nio/FloatBuffer", "get", "(I)F", false));
+ fogBuffer.instructions.add(new InsnNode(Opcodes.FRETURN));
+ cn.methods.add(fogBuffer);
+
+ final MethodNode fogColor = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fogColorX", "()D", null, null);
+ fogColor.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GLSM, "getFogColor", "()L" + VECTOR3D + ";", false));
+ fogColor.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, VECTOR3D, "x", "D"));
+ fogColor.instructions.add(new InsnNode(Opcodes.DRETURN));
+ cn.methods.add(fogColor);
+
+ final MethodNode fogMode = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fogMode", "()I", null, null);
+ fogMode.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GLSM, "getFogState", "()L" + FOG_STATE_STACK + ";", false));
+ fogMode.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, FOG_STATE_STACK, "getFogMode", "()I", false));
+ fogMode.instructions.add(new InsnNode(Opcodes.IRETURN));
+ cn.methods.add(fogMode);
+
+ final MethodNode ctor = new MethodNode(Opcodes.ACC_PUBLIC, "", "()V", null, null);
+ ctor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
+ ctor.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V", false));
+ ctor.instructions.add(new InsnNode(Opcodes.RETURN));
+ cn.methods.add(ctor);
+ return cn;
+ }
+
+ private static List code(ClassNode cn, String name) {
+ final MethodNode mn = cn.methods.stream().filter(m -> m.name.equals(name)).findFirst().orElseThrow();
+ final List out = new ArrayList<>();
+ for (AbstractInsnNode node : mn.instructions.toArray()) {
+ if (node.getOpcode() < 0) continue;
+ if (node instanceof MethodInsnNode m) {
+ out.add(op(m.getOpcode(), m.owner + "." + m.name + m.desc));
+ } else if (node instanceof FieldInsnNode f) {
+ out.add(op(f.getOpcode(), f.owner + "." + f.name));
+ } else if (node instanceof TypeInsnNode t) {
+ out.add(op(t.getOpcode(), t.desc));
+ } else {
+ out.add(op(node.getOpcode()));
+ }
+ }
+ return out;
+ }
+
+ private static String op(int opcode) {
+ return String.valueOf(opcode);
+ }
+
+ private static String op(int opcode, String operand) {
+ return opcode + " " + operand;
+ }
+
+ @Test
+ void fogCallsBecomeGLStateCalls() {
+ final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+ outsideClass().accept(cw);
+ final byte[] original = cw.toByteArray();
+ final byte[] bytes = AngelicaRedirector.create().transform(CLASS_NAME.replace('/', '.'), original, null);
+ assertNotSame(original, bytes, "redirector left the class untouched");
+ DefiningClassLoader.define(CLASS_NAME.replace('/', '.'), bytes);
+
+ final ClassNode cn = new ClassNode();
+ new ClassReader(bytes).accept(cn, 0);
+ assertEquals(List.of(
+ op(Opcodes.ICONST_4),
+ op(Opcodes.INVOKESTATIC, "java/nio/FloatBuffer.allocate(I)Ljava/nio/FloatBuffer;"),
+ op(Opcodes.DUP),
+ op(Opcodes.INVOKESTATIC, GL_STATE + ".getFogColor(Ljava/nio/FloatBuffer;)V"),
+ op(Opcodes.ICONST_0),
+ op(Opcodes.INVOKEVIRTUAL, "java/nio/FloatBuffer.get(I)F"),
+ op(Opcodes.FRETURN)), code(cn, "fogRed"));
+ assertEquals(List.of(
+ op(Opcodes.NEW, VECTOR3D),
+ op(Opcodes.DUP),
+ op(Opcodes.INVOKESPECIAL, VECTOR3D + ".()V"),
+ op(Opcodes.INVOKESTATIC, GL_STATE + ".getFogColor(L" + VECTOR3D + ";)L" + VECTOR3D + ";"),
+ op(Opcodes.GETFIELD, VECTOR3D + ".x"),
+ op(Opcodes.DRETURN)), code(cn, "fogColorX"));
+ assertEquals(List.of(
+ op(Opcodes.INVOKESTATIC, GLSM_FOG + ".getFogState()L" + FOG_STATE_STACK + ";"),
+ op(Opcodes.INVOKEVIRTUAL, FOG_STATE_STACK + ".getFogMode()I"),
+ op(Opcodes.IRETURN)), code(cn, "fogMode"));
+ }
+}
diff --git a/src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java b/src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java
new file mode 100644
index 000000000..cbec90c0f
--- /dev/null
+++ b/src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java
@@ -0,0 +1,69 @@
+package com.gtnewhorizons.angelica.loading.fml.compat;
+
+import com.gtnewhorizons.angelica.glsm.testutil.DefiningClassLoader;
+import com.gtnewhorizons.angelica.loading.fml.compat.transformers.specific.KaizPatchXTransformer;
+import org.junit.jupiter.api.Test;
+import org.spongepowered.asm.lib.ClassWriter;
+import org.spongepowered.asm.lib.Label;
+import org.spongepowered.asm.lib.MethodVisitor;
+import org.spongepowered.asm.lib.Opcodes;
+
+import java.lang.reflect.Method;
+
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class KaizPatchXTransformerTest {
+
+ private static final String INTERNAL = "jp/kaiz/kaizpatch/compat/AngelicaCompat";
+ private static final String DOTTED = "jp.kaiz.kaizpatch.compat.AngelicaCompat";
+ private static final String DESC = "(Ljava/lang/String;)Ljava/lang/String;";
+
+ private static ClassWriter angelicaCompat() {
+ final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
+ cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, INTERNAL, null, "java/lang/Object", null);
+ final MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "transformScript", DESC, null, null);
+ mv.visitCode();
+ final Label nonEmpty = new Label();
+ mv.visitVarInsn(Opcodes.ALOAD, 0);
+ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "isEmpty", "()Z", false);
+ mv.visitJumpInsn(Opcodes.IFEQ, nonEmpty);
+ mv.visitLdcInsn("GL11.glPushMatrix();");
+ mv.visitInsn(Opcodes.ARETURN);
+ mv.visitLabel(nonEmpty);
+ mv.visitVarInsn(Opcodes.ALOAD, 0);
+ mv.visitLdcInsn("");
+ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "concat", DESC, false);
+ mv.visitInsn(Opcodes.ARETURN);
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ return cw;
+ }
+
+ @Test
+ void redirectsEveryReturn() throws ReflectiveOperationException {
+ final ClassWriter cw = angelicaCompat();
+ cw.visitEnd();
+ final byte[] out = new KaizPatchXTransformer().transform(DOTTED, DOTTED, cw.toByteArray());
+ final Method transformScript = DefiningClassLoader.define(DOTTED, out).getMethod("transformScript", String.class);
+ for (String script : new String[] {"", "GLStateManager.glPopMatrix();"}) {
+ final String result = (String) transformScript.invoke(null, script);
+ assertTrue(result.contains("GLSMMatrices."), result);
+ }
+ }
+
+ @Test
+ void adoptedClassPassesThrough() {
+ final ClassWriter cw = angelicaCompat();
+ final MethodVisitor init = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "init", "()V", null, null);
+ init.visitCode();
+ init.visitLdcInsn("redirectScript");
+ init.visitInsn(Opcodes.POP);
+ init.visitInsn(Opcodes.RETURN);
+ init.visitMaxs(0, 0);
+ init.visitEnd();
+ cw.visitEnd();
+ final byte[] original = cw.toByteArray();
+ assertSame(original, new KaizPatchXTransformer().transform(DOTTED, DOTTED, original));
+ }
+}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java
index 6ec5e85c3..f52af7431 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java
@@ -1,6 +1,9 @@
package com.gtnewhorizons.angelica.rendering;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.QuadConverter;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
@@ -69,13 +72,13 @@ class PlayerReflectionSsboMappingTest {
@AfterEach
void cleanup() {
- GLStateManager.glUseProgram(0);
- GLStateManager.glBindVertexArray(0);
- if (program != 0) GLStateManager.glDeleteProgram(program);
- if (vbo != 0) GLStateManager.glDeleteBuffers(vbo);
- if (ssbo != 0) GLStateManager.glDeleteBuffers(ssbo);
- if (visitedSsbo != 0) GLStateManager.glDeleteBuffers(visitedSsbo);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
+ GLSMPrograms.glUseProgram(0);
+ GLSMVertexInput.glBindVertexArray(0);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
+ if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo);
+ if (ssbo != 0) GLSMBuffers.glDeleteBuffers(ssbo);
+ if (visitedSsbo != 0) GLSMBuffers.glDeleteBuffers(visitedSsbo);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
program = vao = vbo = ssbo = visitedSsbo = 0;
}
@@ -103,38 +106,38 @@ class PlayerReflectionSsboMappingTest {
final FloatBuffer verts = BufferUtils.createFloatBuffer(xyzuv.length);
verts.put(xyzuv).flip();
- vao = GLStateManager.glGenVertexArrays();
- vbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ vbo = GLSMBuffers.glGenBuffers();
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW);
final int stride = PlayerReflectionTestSupport.FLOATS * 4;
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, stride, 0L);
GL20.glEnableVertexAttribArray(0);
GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, stride, 12L);
GL20.glEnableVertexAttribArray(1);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private void allocateSsbo() {
- ssbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(SSBO_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW);
+ ssbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(SSBO_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW);
GL30.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BINDING, ssbo);
- visitedSsbo = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visitedSsbo);
- GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(VISITED_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW);
+ visitedSsbo = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visitedSsbo);
+ GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(VISITED_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW);
GL30.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, VISITED_BINDING, visitedSsbo);
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
}
private ByteBuffer readback(int buffer, int bytes) {
GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT | GL42.GL_BUFFER_UPDATE_BARRIER_BIT);
final ByteBuffer out = BufferUtils.createByteBuffer(bytes);
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer);
- GLStateManager.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, out);
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer);
+ GLSMBuffers.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, out);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
return out;
}
@@ -146,8 +149,8 @@ class PlayerReflectionSsboMappingTest {
uploadVertices(xyzuv);
allocateSsbo();
- GLStateManager.glUseProgram(program);
- GLStateManager.glBindVertexArray(vao);
+ GLSMPrograms.glUseProgram(program);
+ GLSMVertexInput.glBindVertexArray(vao);
QuadConverter.drawQuadsAsTriangles(GLStateManager.ctx(), 0, PlayerReflectionCapture.VERTEX_COUNT);
return xyzuv;
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java
index d4336c329..78fd63c32 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.rendering.celeritas;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import org.embeddedt.embeddium.impl.gl.attribute.GlVertexAttribute;
import org.embeddedt.embeddium.impl.gl.shader.ShaderConstants;
@@ -96,22 +96,22 @@ class TerrainShaderLinkTest {
int program = 0;
try {
fsh = compile(GL20.GL_FRAGMENT_SHADER, FSH, constants);
- program = GLStateManager.glCreateProgram();
- GLStateManager.glAttachShader(program, vsh);
- GLStateManager.glAttachShader(program, fsh);
+ program = GLSMPrograms.glCreateProgram();
+ GLSMPrograms.glAttachShader(program, vsh);
+ GLSMPrograms.glAttachShader(program, fsh);
int i = 0;
for (GlVertexAttribute attr : vertexType.getVertexFormat().getAttributes()) {
- GLStateManager.glBindAttribLocation(program, i++, attr.getName());
+ GLSMPrograms.glBindAttribLocation(program, i++, attr.getName());
}
- GLStateManager.glBindFragDataLocation(program, ChunkShaderBindingPoints.FRAG_COLOR, "fragColor");
- GLStateManager.glLinkProgram(program);
+ GLSMPrograms.glBindFragDataLocation(program, ChunkShaderBindingPoints.FRAG_COLOR, "fragColor");
+ GLSMPrograms.glLinkProgram(program);
final int linked = program;
- assertEquals(GL11.GL_TRUE, GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS),
- () -> "terrain program failed to link with " + constants.getDefineStrings() + ":\n" + GLStateManager.glGetProgramInfoLog(linked, 8192));
+ assertEquals(GL11.GL_TRUE, GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS),
+ () -> "terrain program failed to link with " + constants.getDefineStrings() + ":\n" + GLSMPrograms.glGetProgramInfoLog(linked, 8192));
} finally {
- if (program != 0) GLStateManager.glDeleteProgram(program);
- if (fsh != 0) GLStateManager.glDeleteShader(fsh);
- GLStateManager.glDeleteShader(vsh);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
+ if (fsh != 0) GLSMPrograms.glDeleteShader(fsh);
+ GLSMPrograms.glDeleteShader(vsh);
}
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java
index f3ed7fc93..6dce5ac9c 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.rendering.culling;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.junit.jupiter.api.Test;
@@ -26,7 +26,7 @@ class CullingShaderCompileTest {
private static void assertCompiles(String name) throws IOException {
assumeTrue(RenderSystem.supportsCompute(), "compute shaders unsupported");
- GLStateManager.glDeleteShader(GlTestSupport.compile(GL43.GL_COMPUTE_SHADER, source(name)));
+ GLSMPrograms.glDeleteShader(GlTestSupport.compile(GL43.GL_COMPUTE_SHADER, source(name)));
}
@Test
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java
index 53738cefb..9e087161c 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java
@@ -8,7 +8,14 @@ import org.embeddedt.embeddium.impl.render.chunk.compile.sorting.QuadPrimitiveTy
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizons.angelica.config.GpuCullingMode;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.rendering.RenderRegionKeys;
import com.gtnewhorizons.angelica.rendering.celeritas.IndividualDrawBatch;
@@ -151,22 +158,22 @@ class IndirectCullDrawParityTest {
Fbo() {
try {
- textures[0] = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, FBO_SIZE, FBO_SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ textures[0] = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, FBO_SIZE, FBO_SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- textures[1] = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[1]);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ textures[1] = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[1]);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- id = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, id);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, textures[0], 0);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, textures[1], 0);
- assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "parity FBO incomplete");
+ id = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, id);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, textures[0], 0);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, textures[1], 0);
+ assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "parity FBO incomplete");
} catch (RuntimeException | Error e) {
close();
throw e;
@@ -175,10 +182,10 @@ class IndirectCullDrawParityTest {
@Override
public void close() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- if (id != 0) GLStateManager.glDeleteFramebuffers(id);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ if (id != 0) GLSMFramebuffer.glDeleteFramebuffers(id);
for (int tex : textures) {
- if (tex != 0) GLStateManager.glDeleteTextures(tex);
+ if (tex != 0) GLSMTextures.glDeleteTextures(tex);
}
}
}
@@ -192,16 +199,16 @@ class IndirectCullDrawParityTest {
@AfterAll
static void tearDownDevice() {
- if (program != 0) GLStateManager.glDeleteProgram(program);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
RenderDevice.exitManagedCode();
}
@AfterEach
void resetGlState() {
- GLStateManager.glUseProgram(0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glViewport(0, 0, 800, 600);
+ GLSMPrograms.glUseProgram(0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
}
private static final String FLAT_VS = "#version 330 core\n"
@@ -323,22 +330,22 @@ class IndirectCullDrawParityTest {
}
private static void beginDrawing(int fbo) {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glViewport(0, 0, FBO_SIZE, FBO_SIZE);
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glDepthMask(true);
- GLStateManager.disableCull();
- GLStateManager.glClearDepth(1.0);
- GLStateManager.glClearColor(0f, 0f, 0f, 0f);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glUseProgram(program);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMRasterizer.glViewport(0, 0, FBO_SIZE, FBO_SIZE);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMRasterizer.disableCull();
+ GLSMDepthStencilAlpha.glClearDepth(1.0);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 0f);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
+ GLSMPrograms.glUseProgram(program);
}
private static FloatBuffer readDepth(int fbo) {
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo);
final FloatBuffer depth = BufferUtils.createFloatBuffer(FBO_SIZE * FBO_SIZE);
- GLStateManager.glReadPixels(0, 0, FBO_SIZE, FBO_SIZE, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth);
+ GLSMFramebuffer.glReadPixels(0, 0, FBO_SIZE, FBO_SIZE, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth);
return depth;
}
@@ -557,9 +564,9 @@ class IndirectCullDrawParityTest {
private static void assertIndirectBufferMatches(int bufferId, List expected, String label) {
assertNotEquals(0, bufferId, label + ": no indirect buffer was created");
final ByteBuffer readback = BufferUtils.createByteBuffer(expected.size() * CMD_INTS * 4).order(ByteOrder.nativeOrder());
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, bufferId);
- GLStateManager.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, readback);
- GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, bufferId);
+ GLSMBuffers.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, readback);
+ GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
final String[] fieldNames = { "count", "instanceCount", "firstIndex", "baseVertex", "baseInstance" };
for (int c = 0; c < expected.size(); c++) {
for (int i = 0; i < CMD_INTS; i++) {
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java
index c2288f952..eda3cee92 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java
@@ -2,7 +2,11 @@ package com.gtnewhorizons.angelica.rendering.culling;
import com.gtnewhorizons.angelica.glsm.CompatUniformManager;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.joml.Matrix4f;
@@ -48,7 +52,7 @@ class MultiDrawCompatStompTest {
private static Matrix4f readUniform(int program, int location) {
final FloatBuffer buf = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetUniform(program, location, buf);
+ GLSMPrograms.glGetUniform(program, location, buf);
return new Matrix4f(buf);
}
@@ -56,60 +60,60 @@ class MultiDrawCompatStompTest {
void armSentinel() {
program = GlTestSupport.program(IRIS_MVM_VS, GlTestSupport.TRIVIAL_FS);
assertTrue(CompatUniformManager.hasProgram(program), "program with iris_ModelViewMatrix was not registered by CompatUniformManager at link");
- location = GLStateManager.glGetUniformLocation(program, "iris_ModelViewMatrix");
+ location = GLSMPrograms.glGetUniformLocation(program, "iris_ModelViewMatrix");
assertTrue(location >= 0, "iris_ModelViewMatrix location not found");
- vao = GLStateManager.glGenVertexArrays();
- GLStateManager.glBindVertexArray(vao);
- elementBuffer = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
- GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, BufferUtils.createByteBuffer(12), GL15.GL_STATIC_DRAW);
- indirectBuffer = GLStateManager.glGenBuffers();
- GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectBuffer);
+ vao = GLSMVertexInput.glGenVertexArrays();
+ GLSMVertexInput.glBindVertexArray(vao);
+ elementBuffer = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
+ GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, BufferUtils.createByteBuffer(12), GL15.GL_STATIC_DRAW);
+ indirectBuffer = GLSMBuffers.glGenBuffers();
+ GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectBuffer);
final ByteBuffer zeroCommand = BufferUtils.createByteBuffer(20).order(ByteOrder.nativeOrder());
- GLStateManager.glBufferData(GL40.GL_DRAW_INDIRECT_BUFFER, zeroCommand, GL15.GL_STATIC_DRAW);
+ GLSMBuffers.glBufferData(GL40.GL_DRAW_INDIRECT_BUFFER, zeroCommand, GL15.GL_STATIC_DRAW);
final FloatBuffer matBuf = BufferUtils.createFloatBuffer(16);
- GLStateManager.glUseProgram(program);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMPrograms.glUseProgram(program);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
putMatrix(LEGACY_CAMERA, matBuf);
- GLStateManager.glLoadMatrix(matBuf);
+ GLSMMatrices.glLoadMatrix(matBuf);
putMatrix(SENTINEL, matBuf);
- GLStateManager.glUniformMatrix4(location, false, matBuf);
+ GLSMPrograms.glUniformMatrix4(location, false, matBuf);
assertEquals(SENTINEL, readUniform(program, location), "sentinel upload did not take");
}
@AfterEach
void tearDown() {
- GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glUseProgram(0);
- if (vao != 0) GLStateManager.glDeleteVertexArrays(vao);
- if (indirectBuffer != 0) GLStateManager.glDeleteBuffers(indirectBuffer);
- if (elementBuffer != 0) GLStateManager.glDeleteBuffers(elementBuffer);
- GLStateManager.glDeleteProgram(program);
+ GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMPrograms.glUseProgram(0);
+ if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao);
+ if (indirectBuffer != 0) GLSMBuffers.glDeleteBuffers(indirectBuffer);
+ if (elementBuffer != 0) GLSMBuffers.glDeleteBuffers(elementBuffer);
+ GLSMPrograms.glDeleteProgram(program);
final FloatBuffer identity = BufferUtils.createFloatBuffer(16);
new Matrix4f().get(identity);
- GLStateManager.glLoadMatrix(identity);
+ GLSMMatrices.glLoadMatrix(identity);
}
@Test
void multiDrawIndirectDoesNotStompIrisMatrix() {
assumeTrue(RenderSystem.supportsMultiDrawIndirect(), "glMultiDrawElementsIndirect needs GL 4.3 / ARB_multi_draw_indirect; macOS core profile caps at 4.1");
- GLStateManager.glMultiDrawElementsIndirect(GL11.GL_TRIANGLES, GL11.GL_UNSIGNED_INT, 0L, 1, 0);
+ GLSMDraws.glMultiDrawElementsIndirect(GL11.GL_TRIANGLES, GL11.GL_UNSIGNED_INT, 0L, 1, 0);
assertEquals(SENTINEL, readUniform(program, location), "glMultiDrawElementsIndirect stomped iris_ModelViewMatrix from the legacy matrix stack; celeritas-managed programs own this uniform and the shadow pass renders with the camera view if it is overwritten");
}
@Test
void baseVertexDrawsDoNotStompIrisMatrixButRegularDrawDoes() {
- GLStateManager.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L, 0);
+ GLSMDraws.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L, 0);
assertEquals(SENTINEL, readUniform(program, location), "glDrawElementsBaseVertex stomped iris_ModelViewMatrix; the Individual draw emitter renders shadows with the camera view if it is overwritten");
- GLStateManager.glDrawRangeElementsBaseVertex(GL11.GL_TRIANGLES, 0, 0, 0, GL11.GL_UNSIGNED_INT, 0L, 0);
+ GLSMDraws.glDrawRangeElementsBaseVertex(GL11.GL_TRIANGLES, 0, 0, 0, GL11.GL_UNSIGNED_INT, 0L, 0);
assertEquals(SENTINEL, readUniform(program, location), "glDrawRangeElementsBaseVertex stomped iris_ModelViewMatrix");
- GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L);
+ GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L);
final Matrix4f afterRegularDraw = readUniform(program, location);
assertNotEquals(SENTINEL, afterRegularDraw, "regular glDrawElements no longer refreshes compat uniforms; entity/hand programs rely on the legacy-stack upload");
assertTrue(afterRegularDraw.equals(LEGACY_CAMERA, 1e-6f), "regular draw refreshed iris_ModelViewMatrix but not from the legacy modelview stack");
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java
index fc816a35a..5fa8d8a23 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java
@@ -1,7 +1,11 @@
package com.gtnewhorizons.angelica.rendering.culling;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -36,48 +40,48 @@ class ShadowSnapshotBlitTest {
@AfterEach
void deleteTargets() {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(srcFbo);
- GLStateManager.glDeleteFramebuffers(cacheFbo);
- GLStateManager.glDeleteTextures(srcTex);
- GLStateManager.glDeleteTextures(cacheTex);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(srcFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(cacheFbo);
+ GLSMTextures.glDeleteTextures(srcTex);
+ GLSMTextures.glDeleteTextures(cacheTex);
}
private static int newDepthTexture() {
- final int tex = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, SIZE, SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (java.nio.ByteBuffer) null);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int tex = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, SIZE, SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (java.nio.ByteBuffer) null);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return tex;
}
private static int newDepthFbo(int tex) {
- final int fbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, tex, 0);
- assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "depth-only FBO incomplete");
+ final int fbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, tex, 0);
+ assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "depth-only FBO incomplete");
return fbo;
}
private static void fillPattern(int fbo) {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
- GLStateManager.glDepthMask(true);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glClearDepth(FAR);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, SIZE / 2, SIZE / 2);
- GLStateManager.glClearDepth(NEAR_PATCH);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMDepthStencilAlpha.glClearDepth(FAR);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE / 2);
+ GLSMDepthStencilAlpha.glClearDepth(NEAR_PATCH);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
}
private static float readDepth(int fbo, int x, int y) {
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo);
final FloatBuffer buf = BufferUtils.createFloatBuffer(1);
- GLStateManager.glReadPixels(x, y, 1, 1, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, buf);
+ GLSMFramebuffer.glReadPixels(x, y, 1, 1, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, buf);
return buf.get(0);
}
@@ -91,10 +95,10 @@ class ShadowSnapshotBlitTest {
assertEquals(NEAR_PATCH, readDepth(cacheFbo, 10, 10), 1e-4f, "capture blit did not copy the near patch into the cache");
assertEquals(FAR, readDepth(cacheFbo, SIZE - 10, SIZE - 10), 1e-4f, "capture blit did not copy the far background into the cache");
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, srcFbo);
- GLStateManager.glDepthMask(true);
- GLStateManager.glClearDepth(FAR);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, srcFbo);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glClearDepth(FAR);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
assertEquals(FAR, readDepth(srcFbo, 10, 10), 1e-4f, "source not cleared before restore");
RenderSystem.blitFramebuffer(cacheFbo, srcFbo, 0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST);
@@ -105,14 +109,14 @@ class ShadowSnapshotBlitTest {
@Test
void depthBlitIsNotAffectedByScissorState() {
fillPattern(srcFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo);
- GLStateManager.glClearDepth(FAR);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo);
+ GLSMDepthStencilAlpha.glClearDepth(FAR);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, 4, 4);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, 4, 4);
RenderSystem.blitFramebuffer(srcFbo, cacheFbo, 0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
assertEquals(NEAR_PATCH, readDepth(cacheFbo, 100, 100), 1e-4f, "scissor clipped the snapshot blit; the cache only received the scissor box");
}
@@ -120,16 +124,16 @@ class ShadowSnapshotBlitTest {
@Test
void rawBlitStaysScissorClipped() {
fillPattern(srcFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo);
- GLStateManager.glClearDepth(FAR);
- GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo);
+ GLSMDepthStencilAlpha.glClearDepth(FAR);
+ GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT);
- GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo);
- GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, cacheFbo);
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
- GLStateManager.glScissor(0, 0, 4, 4);
- GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, cacheFbo);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMRasterizer.glScissor(0, 0, 4, 4);
+ GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
assertEquals(NEAR_PATCH, readDepth(cacheFbo, 1, 1), 1e-4f, "raw blit copied nothing inside the scissor box");
assertEquals(FAR, readDepth(cacheFbo, 100, 100), 1e-4f, "raw glBlitFramebuffer ignored scissor");
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java
index cc80e6bd2..60aeed4c8 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java
@@ -5,7 +5,9 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.compat.draconicevolution.PlacedItemRenderCompat;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.rendering.tesr.AngelicaTesrMeshCache;
@@ -162,7 +164,7 @@ class ItemTemplateCaptureGLTest {
final ShaderManager shaders = ShaderManager.getInstance();
final boolean ffp = shaders.isEnabled();
final ModelPartBatcher batcher = ModelPartBatcher.INSTANCE;
- final Matrix4f originalMatrix = new Matrix4f(GLStateManager.getModelViewMatrix());
+ final Matrix4f originalMatrix = new Matrix4f(GLSMMatrices.getModelViewMatrix());
final ItemPropCache> icons = Reflect.getStatic(DroppedItemInstancer.class, "icons");
final Object[] templates = new Object[2];
try {
@@ -172,39 +174,39 @@ class ItemTemplateCaptureGLTest {
testMinecraft.thePlayer = mock(EntityClientPlayerMP.class);
Reflect.setStatic(Minecraft.class, "theMinecraft", testMinecraft);
shaders.enable();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
batcher.begin(ModelPartBatcher.Mode.BLOCK_ENTITIES);
assertTrue(batcher.isActive());
- ModelPartBatcher.onTextureBind(new ResourceLocation("test", "placed-items"), GLStateManager.getBoundTextureForServerState());
+ ModelPartBatcher.onTextureBind(new ResourceLocation("test", "placed-items"), GLSMTextures.getBoundTextureForServerState());
final long parts = batcher.statParts();
final long instances = DroppedItemInstancer.statInstanced();
- BatchEligibility.begin(BatchEligibility.DENIED, GLStateManager.drawCalls);
+ BatchEligibility.begin(BatchEligibility.DENIED, GLSMDraws.drawCalls);
try {
for (int item = 0; item < 2; item++) {
final int rotation = item * 90;
assertEquals(SAFE, PlacedItemRenderCompat.renderWithBatchState(item, 0, 0, SAFE, () -> {
- GLStateManager.glRotatef(rotation, 0, 1, 0);
+ GLSMMatrices.glRotatef(rotation, 0, 1, 0);
DroppedItemInstancer.batchIcon(EntityMaterials.DROPPED_ITEM_CUTOUT, false, 1f, 0f, 0f, 1f, 16, 16, 0.0625f);
}));
templates[item] = Reflect.get(icons.get(1f, 0f, 0f, 1f, 16, 16, 0.0625f), "template");
PlacedItemRenderCompat.renderWithBatchState(0, 0, 0, BatchEligibility.DENIED, () -> {
- final long before = GLStateManager.drawCalls;
- GLStateManager.drawCalls++;
- BatchEligibility.onPartFallback(before, GLStateManager.drawCalls);
+ final long before = GLSMDraws.drawCalls;
+ GLSMDraws.drawCalls++;
+ BatchEligibility.onPartFallback(before, GLSMDraws.drawCalls);
});
}
} finally {
- BatchEligibility.end(BatchEligibility.DENIED, GLStateManager.drawCalls);
+ BatchEligibility.end(BatchEligibility.DENIED, GLSMDraws.drawCalls);
}
assertNotNull(templates[0]);
assertSame(templates[0], templates[1], "the second placement must reuse the icon mesh");
assertEquals(2, batcher.statParts() - parts, "both transforms reach the shared batcher");
assertEquals(2, DroppedItemInstancer.statInstanced() - instances);
- assertTrue(new Matrix4f().equals(GLStateManager.getModelViewMatrix(), 1e-5f));
+ assertTrue(new Matrix4f().equals(GLSMMatrices.getModelViewMatrix(), 1e-5f));
} finally {
batcher.clear();
- GLStateManager.setModelViewMatrix(originalMatrix);
+ GLSMMatrices.setModelViewMatrix(originalMatrix);
AngelicaConfig.enableEntityBatching = batching;
AngelicaConfig.itemRendererCacheSize = capacity;
Reflect.setStatic(Minecraft.class, "theMinecraft", minecraft);
@@ -219,14 +221,14 @@ class ItemTemplateCaptureGLTest {
final RenderBlocks rb = new RenderBlocks() {
@Override
public void renderBlockAsItem(Block b, int meta, float brightness) {
- if (calls[0]++ > 0) GLStateManager.drawCalls++;
+ if (calls[0]++ > 0) GLSMDraws.drawCalls++;
}
};
- BatchEligibility.begin(SAFE, GLStateManager.drawCalls);
+ BatchEligibility.begin(SAFE, GLSMDraws.drawCalls);
drawBlock(rb, block);
drawBlock(rb, block);
- assertEquals(SAFE, BatchEligibility.end(SAFE, GLStateManager.drawCalls), "a block with no cached template draws vanilla and reports no part");
+ assertEquals(SAFE, BatchEligibility.end(SAFE, GLSMDraws.drawCalls), "a block with no cached template draws vanilla and reports no part");
assertEquals(3, calls[0], "one capture, then a vanilla draw on the miss and on the cached null template");
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java
index 32a4a5067..f4d83dd63 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.rendering.particles;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import com.gtnewhorizons.angelica.glsm.ffp.ParticleParityFixture.Rotation;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
@@ -264,7 +264,7 @@ class ParticleInstancingGLTest {
private static ParticleRenderState checkFrame(ParticleDescriptor descriptor, EntityFX reference, EntityFX candidate, float partialTicks, Rotation r, int startBrightness) {
final NoOpTessellator run = new NoOpTessellator();
final ParticleCaptureTessellator capture = new ParticleCaptureTessellator();
- capture.begin(startBrightness, run, GLStateManager.getModelViewMatrix());
+ capture.begin(startBrightness, run, GLSMMatrices.getModelViewMatrix());
reference.renderParticle(capture, partialTicks, r.x(), r.xz(), r.z(), r.yz(), r.xy());
assertFalse(capture.spilled());
@@ -518,7 +518,7 @@ class ParticleInstancingGLTest {
final EntityFireworkSparkFX reference = twinklingSpark(age);
final EntityFireworkSparkFX candidate = twinklingSpark(age);
final ParticleCaptureTessellator capture = new ParticleCaptureTessellator();
- capture.begin(100, new NoOpTessellator(), GLStateManager.getModelViewMatrix());
+ capture.begin(100, new NoOpTessellator(), GLSMMatrices.getModelViewMatrix());
reference.renderParticle(capture, 0.4f, r.x(), r.xz(), r.z(), r.yz(), r.xy());
assertFalse(capture.spilled());
if (capture.captured() == 0) {
@@ -607,7 +607,7 @@ class ParticleInstancingGLTest {
private static ParticleCaptureTessellator capturedQuad(RecordingTessellator run) {
final ParticleCaptureTessellator capture = new ParticleCaptureTessellator();
- capture.begin(100, run, GLStateManager.getModelViewMatrix());
+ capture.begin(100, run, GLSMMatrices.getModelViewMatrix());
capture.setColorRGBA(5, 6, 7, 8);
feedQuad(capture);
return capture;
@@ -680,7 +680,7 @@ class ParticleInstancingGLTest {
final RecordingTessellator run = new RecordingTessellator();
final ParticleCaptureTessellator capture = new ParticleCaptureTessellator();
- capture.begin(0, run, GLStateManager.getModelViewMatrix());
+ capture.begin(0, run, GLSMMatrices.getModelViewMatrix());
capture.setColorRGBA(1, 1, 1, 1);
capture.addVertexWithUV(0.0, 0.0, 0.0, 0.0, 0.0);
capture.addVertexWithUV(0.0, 1.0, 0.0, 0.0, 1.0);
@@ -700,7 +700,7 @@ class ParticleInstancingGLTest {
final RecordingTessellator run = new RecordingTessellator();
final ParticleCaptureTessellator capture = new ParticleCaptureTessellator();
- capture.begin(0, run, GLStateManager.getModelViewMatrix());
+ capture.begin(0, run, GLSMMatrices.getModelViewMatrix());
capture.addVertex(3.0, 4.0, 5.0);
assertTrue(capture.spilled());
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java
index 09122e0d0..f43962513 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java
@@ -1,7 +1,8 @@
package com.gtnewhorizons.angelica.rendering.particles;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
import net.coderbot.iris.gl.blending.BlendModeStorage;
import net.coderbot.iris.gl.blending.DepthColorStorage;
@@ -20,20 +21,20 @@ class ParticleRenderStateGLTest {
void restoreOverrides() {
BlendModeStorage.restoreBlend();
DepthColorStorage.unlockDepthColor();
- GLStateManager.getBlendMode().setVanillaLayer(null);
- GLStateManager.getBlendState().setVanillaLayer(null);
- GLStateManager.getDepthState().setVanillaLayer(null);
+ GLSMBlend.getBlendMode().setVanillaLayer(null);
+ GLSMBlend.getBlendState().setVanillaLayer(null);
+ GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(null);
}
@Test
void sampleUsesVanillaStateHiddenByPackOverrides() {
- GLStateManager.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER);
- GLStateManager.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER);
- GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
+ GLSMBlend.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER);
+ GLSMBlend.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER);
+ GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.glDepthMask(true);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.glDepthMask(true);
final BlendState packBlend = new BlendState();
packBlend.setAll(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE);
@@ -49,6 +50,6 @@ class ParticleRenderStateGLTest {
assertEquals(GL11.GL_ONE, sampled.blendSrcAlpha);
assertEquals(GL11.GL_ZERO, sampled.blendDstAlpha);
assertTrue(sampled.depthMask);
- assertFalse(GLStateManager.getDepthState().isEnabled(), "the pack override remains active at the raw layer");
+ assertFalse(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "the pack override remains active at the raw layer");
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java
index bf31092e3..8ab87f10e 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java
@@ -1,6 +1,18 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard;
@@ -30,19 +42,19 @@ class BatchStateGuardGLTest {
void saveState() {
previousFlush = BatchStateGuard.flush;
BatchStateGuard.flush = null;
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
@AfterEach
void restoreState() {
BatchStateGuard.flush = null;
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.glPopAttrib();
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glPopMatrix();
+ GLSMAttribStack.glPopAttrib();
BatchStateGuard.flush = previousFlush;
}
@@ -65,82 +77,82 @@ class BatchStateGuardGLTest {
} finally {
BatchStateGuard.flush = null;
cleanup.run();
- GLStateManager.glDrawBuffer(drawBuffer);
+ GLSMFramebuffer.glDrawBuffer(drawBuffer);
}
}
static Stream flushCases() {
return Stream.of(
- Arguments.of("fog", (Runnable) () -> GLStateManager.glFogf(GL11.GL_FOG_START, 17),
- (Runnable) () -> assertEquals(17f, GLStateManager.getFogState().getStart()),
+ Arguments.of("fog", (Runnable) () -> GLSMFog.glFogf(GL11.GL_FOG_START, 17),
+ (Runnable) () -> assertEquals(17f, GLSMFog.getFogState().getStart()),
(Runnable) () -> {
- GLStateManager.glFogf(GL11.GL_FOG_START, 29);
- assertEquals(29f, GLStateManager.getFogState().getStart());
+ GLSMFog.glFogf(GL11.GL_FOG_START, 29);
+ assertEquals(29f, GLSMFog.getFogState().getStart());
}, 1, NOTHING),
- Arguments.of("stencil", (Runnable) () -> GLStateManager.glDisable(GL11.GL_STENCIL_TEST),
- (Runnable) () -> assertFalse(GLStateManager.glIsEnabled(GL11.GL_STENCIL_TEST)),
- (Runnable) () -> GLStateManager.glEnable(GL11.GL_STENCIL_TEST), 1, NOTHING),
+ Arguments.of("stencil", (Runnable) () -> GLSMEnable.glDisable(GL11.GL_STENCIL_TEST),
+ (Runnable) () -> assertFalse(GLSMEnable.glIsEnabled(GL11.GL_STENCIL_TEST)),
+ (Runnable) () -> GLSMEnable.glEnable(GL11.GL_STENCIL_TEST), 1, NOTHING),
Arguments.of("polygon mode", NOTHING,
- (Runnable) () -> assertEquals(GL11.GL_FILL, GLStateManager.getPolygonState().getFrontMode()),
+ (Runnable) () -> assertEquals(GL11.GL_FILL, GLSMRasterizer.getPolygonState().getFrontMode()),
(Runnable) () -> {
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
- GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
+ GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
}, 1, NOTHING),
Arguments.of("depth range", NOTHING,
- (Runnable) () -> assertEquals(1.0, GLStateManager.getViewportState().depthRangeFar),
+ (Runnable) () -> assertEquals(1.0, GLSMRasterizer.getViewportState().depthRangeFar),
(Runnable) () -> {
- GLStateManager.glDepthRange(0.0, 0.5);
- GLStateManager.glDepthRange(0.0, 0.5);
+ GLSMDepthStencilAlpha.glDepthRange(0.0, 0.5);
+ GLSMDepthStencilAlpha.glDepthRange(0.0, 0.5);
}, 1, NOTHING),
Arguments.of("logic op and color sum", NOTHING, NOTHING,
(Runnable) () -> {
- GLStateManager.glEnable(GL11.GL_COLOR_LOGIC_OP);
- GLStateManager.glLogicOp(GL11.GL_XOR);
- GLStateManager.glEnable(GL14.GL_COLOR_SUM);
+ GLSMEnable.glEnable(GL11.GL_COLOR_LOGIC_OP);
+ GLSMBlend.glLogicOp(GL11.GL_XOR);
+ GLSMEnable.glEnable(GL14.GL_COLOR_SUM);
}, 3, NOTHING),
Arguments.of("sample and discard state", NOTHING, NOTHING,
(Runnable) () -> {
- GLStateManager.glEnable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE);
- GLStateManager.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE);
- GLStateManager.glEnable(GL30.GL_RASTERIZER_DISCARD);
- GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD);
- GLStateManager.glSampleCoverage(0.5f, false);
- }, 5, (Runnable) () -> GLStateManager.glSampleCoverage(1.0f, false)),
+ GLSMEnable.glEnable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE);
+ GLSMEnable.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE);
+ GLSMEnable.glEnable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD);
+ GLSMRasterizer.glSampleCoverage(0.5f, false);
+ }, 5, (Runnable) () -> GLSMRasterizer.glSampleCoverage(1.0f, false)),
Arguments.of("draw buffer", NOTHING, NOTHING,
(Runnable) () -> {
- GLStateManager.glDrawBuffer(GL11.GL_NONE);
- GLStateManager.glDrawBuffer(GL11.GL_NONE);
+ GLSMFramebuffer.glDrawBuffer(GL11.GL_NONE);
+ GLSMFramebuffer.glDrawBuffer(GL11.GL_NONE);
}, 1, NOTHING),
- Arguments.of("draw buffers", NOTHING, NOTHING, (Runnable) () -> GLStateManager.glDrawBuffers(GL11.GL_NONE), 1, NOTHING),
- Arguments.of("projection matrix", (Runnable) () -> GLStateManager.glMatrixMode(GL11.GL_PROJECTION),
+ Arguments.of("draw buffers", NOTHING, NOTHING, (Runnable) () -> GLSMFramebuffer.glDrawBuffers(GL11.GL_NONE), 1, NOTHING),
+ Arguments.of("projection matrix", (Runnable) () -> GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION),
(Runnable) () -> {
- assertEquals(1f, GLStateManager.getProjectionMatrix().m00());
- GLStateManager.glScissor(0, 0, 8, 8);
+ assertEquals(1f, GLSMMatrices.getProjectionMatrix().m00());
+ GLSMRasterizer.glScissor(0, 0, 8, 8);
},
(Runnable) () -> {
- GLStateManager.glScalef(2, 3, 1);
- assertEquals(2f, GLStateManager.getProjectionMatrix().m00());
+ GLSMMatrices.glScalef(2, 3, 1);
+ assertEquals(2f, GLSMMatrices.getProjectionMatrix().m00());
}, 1, NOTHING),
Arguments.of("texture matrix unit 2", (Runnable) () -> {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
},
- (Runnable) () -> assertEquals(0f, GLStateManager.getTextures().getTextureUnitMatrix(2).m30()),
- (Runnable) () -> GLStateManager.glTranslatef(0.5f, 0, 0), 1,
+ (Runnable) () -> assertEquals(0f, GLSMTextures.getTextures().getTextureUnitMatrix(2).m30()),
+ (Runnable) () -> GLSMMatrices.glTranslatef(0.5f, 0, 0), 1,
(Runnable) () -> {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glPopMatrix();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMMatrices.glPopMatrix();
}),
Arguments.of("texture matrix unit 0 stays instanced", (Runnable) () -> {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
}, NOTHING,
(Runnable) () -> {
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(0.5f, 0, 0);
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(0.5f, 0, 0);
+ GLSMMatrices.glPopMatrix();
}, 0, NOTHING));
}
@@ -153,26 +165,26 @@ class BatchStateGuardGLTest {
static Stream undrainedCases() {
return Stream.of(
Arguments.of("matrices color and blend", (Runnable) () -> {
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(1, 2, 3);
- GLStateManager.glPopMatrix();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glColor4f(0.5f, 1, 1, 1);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glTranslatef(1, 2, 3);
+ GLSMMatrices.glPopMatrix();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMCurrentAttribs.glColor4f(0.5f, 1, 1, 1);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
}),
Arguments.of("managed pass setup", (Runnable) () -> IrisDisplayListState.runProgramTransition(() -> {
- GLStateManager.glFogf(GL11.GL_FOG_START, 123);
- GLStateManager.glViewport(0, 0, 8, 8);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 123);
+ GLSMRasterizer.glViewport(0, 0, 8, 8);
})),
Arguments.of("lighting", (Runnable) () -> {
- GLStateManager.glEnable(GL11.GL_LIGHT0);
- GLStateManager.glDisable(GL11.GL_LIGHT0);
- GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL);
- GLStateManager.glEnable(GL11.GL_NORMALIZE);
- GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f);
+ GLSMEnable.glEnable(GL11.GL_LIGHT0);
+ GLSMEnable.glDisable(GL11.GL_LIGHT0);
+ GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL);
+ GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL);
+ GLSMEnable.glEnable(GL11.GL_NORMALIZE);
+ GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f);
}));
}
@@ -187,44 +199,44 @@ class BatchStateGuardGLTest {
@Test
void extraTextureBindingsAndAttributeRestoresCannotOvertakeQueuedDraws() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
- final int texture = GLStateManager.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ final int texture = GLSMTextures.glGenTextures();
try {
BatchStateGuard.flush = () -> {
- assertEquals(0, GLStateManager.getBoundTextureForServerState(2));
+ assertEquals(0, GLSMTextures.getBoundTextureForServerState(2));
flushes.incrementAndGet();
};
RenderSystem.bindTextureToUnit(GL11.GL_TEXTURE_2D, 2, texture);
assertTrue(flushes.get() > 0);
flushes.set(0);
BatchStateGuard.flush = () -> {
- assertEquals(texture, GLStateManager.getBoundTextureForServerState(2));
+ assertEquals(texture, GLSMTextures.getBoundTextureForServerState(2));
flushes.incrementAndGet();
};
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPopAttrib();
assertTrue(flushes.get() > 0);
- assertEquals(0, GLStateManager.getBoundTextureForServerState(2));
+ assertEquals(0, GLSMTextures.getBoundTextureForServerState(2));
} finally {
BatchStateGuard.flush = null;
- GLStateManager.glDeleteTextures(texture);
+ GLSMTextures.glDeleteTextures(texture);
}
}
@Test
void compileOnlyDefersTheBarrierUntilPlayback() {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
countFlushes();
try {
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glScissor(1, 2, 3, 4);
- GLStateManager.glEndList();
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMRasterizer.glScissor(1, 2, 3, 4);
+ GLSMDraws.glEndList();
assertEquals(0, flushes.get());
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
assertEquals(1, flushes.get());
} finally {
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glDeleteLists(list, 1);
}
}
@@ -232,53 +244,53 @@ class BatchStateGuardGLTest {
void perUnitCapsFlushExceptTheTexturesBatchLayersOwn() {
countFlushes();
try {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
assertEquals(0, flushes.get(), "albedo and lightmap enables are stored with each layer");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
flushes.set(0);
BatchStateGuard.flush = () -> {
- assertFalse(GLStateManager.getTextures().getTextureUnitStates(2).isEnabled());
+ assertFalse(GLSMTextures.getTextures().getTextureUnitStates(2).isEnabled());
flushes.incrementAndGet();
};
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
assertEquals(1, flushes.get());
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
assertEquals(1, flushes.get(), "unchanged enable does not flush");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S);
flushes.set(0);
countFlushes();
- GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_S);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_S);
assertEquals(1, flushes.get());
} finally {
BatchStateGuard.flush = null;
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
@Test
void secondaryColorFlushesOnlyWhileColorSumIsOn() {
- GLStateManager.glSecondaryColor3f(0f, 0f, 0f);
+ GLSMCurrentAttribs.glSecondaryColor3f(0f, 0f, 0f);
countFlushes();
try {
- GLStateManager.glSecondaryColor3f(0.5f, 0f, 0f);
+ GLSMCurrentAttribs.glSecondaryColor3f(0.5f, 0f, 0f);
assertEquals(0, flushes.get(), "secondary color is unused while color sum is off");
- GLStateManager.glEnable(GL14.GL_COLOR_SUM);
+ GLSMEnable.glEnable(GL14.GL_COLOR_SUM);
flushes.set(0);
- GLStateManager.glSecondaryColor3f(0.25f, 0f, 0f);
+ GLSMCurrentAttribs.glSecondaryColor3f(0.25f, 0f, 0f);
assertEquals(1, flushes.get());
} finally {
BatchStateGuard.flush = null;
- GLStateManager.glDisable(GL14.GL_COLOR_SUM);
- GLStateManager.glSecondaryColor3f(0f, 0f, 0f);
+ GLSMEnable.glDisable(GL14.GL_COLOR_SUM);
+ GLSMCurrentAttribs.glSecondaryColor3f(0f, 0f, 0f);
}
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java
index df275e8f0..06f4236c9 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java
@@ -4,7 +4,17 @@ import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.CubeParams;
import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs;
@@ -281,14 +291,14 @@ class EntityShadowReplayGLTest {
when(manager.getEntityRenderObject(entity)).thenReturn(renderer);
EntityShadowReplay.clear();
EntityShadowReplay.beginFrame();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.enableTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.setTextureMatrix(0, new Matrix4f());
- GLStateManager.glColor4f(1, 1, 1, 1);
- GLStateManager.setOverlayColor(0, 0, 0, 0);
- GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(true);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.enableTexture();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMMatrices.setTextureMatrix(0, new Matrix4f());
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ GLSMCurrentAttribs.setOverlayColor(0, 0, 0, 0);
+ GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(true);
ModelPartBatcher.onTextureBind(new ResourceLocation("angelica", "test/replay"), 0);
RenderManager.renderPosX = 1000000.25;
RenderManager.renderPosY = 7.74;
@@ -304,9 +314,9 @@ class EntityShadowReplayGLTest {
target.beginPass(new Matrix4f(), 0, 0, 0, new InstancedTemplateRenderer(new InstanceRing()),
new RetainedTesrTestSupport.CountingPipeline(true, true));
Reflect.set(batcher, "activeGroups", target);
- GLStateManager.setModelViewMatrix(shadowView);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(1, 1);
+ GLSMMatrices.setModelViewMatrix(shadowView);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(1, 1);
ShadowRenderer.ACTIVE = true;
EntityShadowReplay.beginPass(true, 0);
}
@@ -325,21 +335,21 @@ class EntityShadowReplayGLTest {
}
private void beginCapture(Entity captured) {
- captureEntry.set(GLStateManager.getModelViewMatrix());
+ captureEntry.set(GLSMMatrices.getModelViewMatrix());
captureOpen = !EntityShadowReplay.isExcluded(captured.getClass()) && !captured.shouldRenderInPass(1);
assertEquals(captureOpen, EntityShadowReplay.beginEntity(captured, TICK_DELTA));
}
private void setCapturePose(Matrix4f pose) {
closeCapturePose();
- GLStateManager.glPushMatrix();
+ GLSMMatrices.glPushMatrix();
capturePoseOpen = true;
- GLStateManager.applyMultMatrix(pose);
+ GLSMMatrices.applyMultMatrix(pose);
}
private void closeCapturePose() {
if (!capturePoseOpen) return;
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
capturePoseOpen = false;
}
@@ -352,8 +362,8 @@ class EntityShadowReplayGLTest {
private void capture() {
beginCapture(entity);
assertEquals(captureOpen, EntityShadowReplay.beginRenderer(renderer, entity, TICK_DELTA, BatchEligibility.SAFE));
- GLStateManager.glColor4f(1, 1, 1, 1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
setCapturePose(model);
assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT));
}
@@ -378,9 +388,9 @@ class EntityShadowReplayGLTest {
RenderManager.renderPosX -= 0.5;
RenderManager.renderPosY -= 0.12;
RenderManager.renderPosZ += 0.25;
- GLStateManager.setModelViewMatrix(mainView);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(0, 0);
+ GLSMMatrices.setModelViewMatrix(mainView);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(0, 0);
target = new RetainedTesrGroups(new AngelicaBufferSource());
final AngelicaBufferSource source = Reflect.get(target, "source");
source.setIdKind(AngelicaBufferSource.GroupIdKind.ENTITY);
@@ -392,10 +402,10 @@ class EntityShadowReplayGLTest {
@Test
void replayUsesTheMainCameraAndInheritsMainEntryState() {
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
capture();
endCaptureAndStartMainPass();
- GLStateManager.glShadeModel(GL11.GL_FLAT);
+ GLSMRasterizer.glShadeModel(GL11.GL_FLAT);
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
final RetainedTesrGroups.Group group = onlyGroup(target);
final Matrix4f expected = new Matrix4f(mainView).translate(0.5f, 0.12f, -0.25f).mul(model);
@@ -404,22 +414,22 @@ class EntityShadowReplayGLTest {
assertEquals(0, group.layer.getState().getOffsetFactor());
assertEquals(0, group.layer.getState().getOffsetUnits());
assertTrue(group.layer.getState().isLightmap());
- assertEquals(GL11.GL_FLAT, GLStateManager.getShadeModelState().getValue());
+ assertEquals(GL11.GL_FLAT, GLSMRasterizer.getShadeModelState().getValue());
}
@ParameterizedTest
@ValueSource(strings = {"inherited", "explicitNoOp", "popped"})
void bodyLightingUsesMainInheritanceWhileGlintRemainsUnlit(String kind) {
prepareGlintCapture();
- GLStateManager.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
final GlintCapture armor = new GlintCapture();
captureGlint(entity, renderer, () -> {
if (kind.equals("explicitNoOp")) {
- GLStateManager.glDisable(GL11.GL_LIGHTING);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
} else if (kind.equals("popped")) {
- GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT);
- GLStateManager.glEnable(GL11.GL_LIGHTING);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
+ GLSMAttribStack.glPopAttrib();
}
setCapturePose(model);
assertTrue(batcher.beginArmorCapture(armor));
@@ -429,13 +439,13 @@ class EntityShadowReplayGLTest {
});
assertFalse(onlyMaterialGroup(EntityMaterials.CUTOUT).layer.getState().isLit());
mainPass();
- GLStateManager.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
final boolean inherited = !kind.equals("explicitNoOp");
assertEquals(inherited, onlyMaterialGroup(EntityMaterials.CUTOUT).layer.getState().isLit());
assertFalse(onlyMaterialGroup(EntityMaterials.GLINT).layer.getState().isLit());
- assertEquals(inherited, GLStateManager.getLightingState().isEnabled(),
+ assertEquals(inherited, GLSMLighting.getLightingState().isEnabled(),
"untouched or restored lighting must preserve main entry state; an explicit no-op disable must still apply");
}
@@ -445,17 +455,17 @@ class EntityShadowReplayGLTest {
final boolean scoped = kind.equals("scoped") || kind.equals("afterPop");
final boolean inheritedDraw = kind.equals("afterPop");
final boolean enabled = !kind.equals("explicitNoOp");
- final var lightmap = GLStateManager.getTextures().getTextureUnitStates(1);
+ final var lightmap = GLSMTextures.getTextures().getTextureUnitStates(1);
lightmap.setEnabled(false);
beginCapture(entity);
assertTrue(EntityShadowReplay.beginRenderer(renderer, entity, TICK_DELTA, BatchEligibility.SAFE));
setCapturePose(model);
- if (scoped) GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT);
+ if (scoped) GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT);
try {
lightmap.setEnabled(enabled);
assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT));
} finally {
- if (scoped) GLStateManager.glPopAttrib();
+ if (scoped) GLSMAttribStack.glPopAttrib();
}
if (inheritedDraw) assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT));
endCaptureAndStartMainPass();
@@ -485,7 +495,7 @@ class EntityShadowReplayGLTest {
assertFalse(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
assertEquals(0, target.groupCount());
assertEquals(1, rejections(EntityShadowReplay.Rejection.EXIT_STATE_UNSUPPORTED));
- assertTrue(mainView.equals(GLStateManager.getModelViewMatrix(), 0));
+ assertTrue(mainView.equals(GLSMMatrices.getModelViewMatrix(), 0));
}
@ParameterizedTest
@@ -500,48 +510,48 @@ class EntityShadowReplayGLTest {
applyGlintExit(kind);
endCaptureAndStartMainPass();
- GLStateManager.glColor4f(0.2f, 0.3f, 0.4f, 0.5f);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE);
- GLStateManager.glDisable(GL11.GL_LIGHTING);
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glDepthMask(false);
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.63f);
+ GLSMCurrentAttribs.glColor4f(0.2f, 0.3f, 0.4f, 0.5f);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE);
+ GLSMEnable.glDisable(GL11.GL_LIGHTING);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.63f);
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
final boolean armor = kind.equals("armor");
final boolean held = kind.equals("held");
- assertEquals(armor ? 1 : 0.5f * 0.76f, GLStateManager.getColor().getRed());
- assertEquals(armor ? 1 : 0.25f * 0.76f, GLStateManager.getColor().getGreen());
- assertEquals(armor ? 1 : 0.8f * 0.76f, GLStateManager.getColor().getBlue());
- assertEquals(1, GLStateManager.getColor().getAlpha());
- assertFalse(GLStateManager.isEffectiveBlendEnabled());
- assertTrue(GLStateManager.getLightingState().isEnabled());
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc());
- assertEquals(armor, GLStateManager.isEffectiveDepthMaskEnabled());
- assertEquals(GL11.GL_SRC_COLOR, GLStateManager.getBlendState().getSrcRgb());
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getDstRgb());
- assertEquals(held ? GL11.GL_ONE : GL11.GL_SRC_COLOR, GLStateManager.getBlendState().getSrcAlpha());
- assertEquals(held ? GL11.GL_ZERO : GL11.GL_ONE, GLStateManager.getBlendState().getDstAlpha());
- assertEquals(0.63f, GLStateManager.getAlphaState().getReference(), "an untouched exit field must retain the main entry value");
- assertTrue(mainView.equals(GLStateManager.getModelViewMatrix(), 0));
+ assertEquals(armor ? 1 : 0.5f * 0.76f, GLSMCurrentAttribs.getColor().getRed());
+ assertEquals(armor ? 1 : 0.25f * 0.76f, GLSMCurrentAttribs.getColor().getGreen());
+ assertEquals(armor ? 1 : 0.8f * 0.76f, GLSMCurrentAttribs.getColor().getBlue());
+ assertEquals(1, GLSMCurrentAttribs.getColor().getAlpha());
+ assertFalse(GLSMBlend.isEffectiveBlendEnabled());
+ assertTrue(GLSMLighting.getLightingState().isEnabled());
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc());
+ assertEquals(armor, GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled());
+ assertEquals(GL11.GL_SRC_COLOR, GLSMBlend.getBlendState().getSrcRgb());
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getDstRgb());
+ assertEquals(held ? GL11.GL_ONE : GL11.GL_SRC_COLOR, GLSMBlend.getBlendState().getSrcAlpha());
+ assertEquals(held ? GL11.GL_ZERO : GL11.GL_ONE, GLSMBlend.getBlendState().getDstAlpha());
+ assertEquals(0.63f, GLSMDepthStencilAlpha.getAlphaState().getReference(), "an untouched exit field must retain the main entry value");
+ assertTrue(mainView.equals(GLSMMatrices.getModelViewMatrix(), 0));
}
@Test
void followingLiveModelInheritsTheFinalTextureBoundAfterCapturedGeometry() {
final ResourceLocation finalTexture = new ResourceLocation("angelica", "test/final_binding");
final ResourceLocation liveTexture = new ResourceLocation("angelica", "test/preceding_live_binding");
- final int capturedId = GLStateManager.glGenTextures();
- final int liveId = GLStateManager.glGenTextures();
+ final int capturedId = GLSMTextures.glGenTextures();
+ final int liveId = GLSMTextures.glGenTextures();
try {
capture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, capturedId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, capturedId);
ModelPartBatcher.onTextureBind(finalTexture, capturedId);
endCaptureAndStartMainPass();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, liveId);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, liveId);
ModelPartBatcher.onTextureBind(liveTexture, liveId);
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
- assertEquals(capturedId, GLStateManager.getBoundTextureForServerState(0));
+ assertEquals(capturedId, GLSMTextures.getBoundTextureForServerState(0));
final TemplateBuffer following = template();
assertTrue(batcher.queueTemplate(following, EntityMaterials.CUTOUT), "the next live renderer must inherit matching texture metadata");
@@ -558,8 +568,8 @@ class EntityShadowReplayGLTest {
}
assertTrue(found, "the final texture can differ from every captured geometry command's texture");
} finally {
- GLStateManager.glDeleteTextures(capturedId);
- GLStateManager.glDeleteTextures(liveId);
+ GLSMTextures.glDeleteTextures(capturedId);
+ GLSMTextures.glDeleteTextures(liveId);
}
}
@@ -568,37 +578,37 @@ class EntityShadowReplayGLTest {
void polygonOffsetAndTextureMatrixKeepOnlyTheWritesTheCaptureMade(String operation) {
final Matrix4f texture = new Matrix4f().translation(0.2f, 0.3f, 0);
if (operation.equals("enableOnly") || operation.equals("valuesOnly")) {
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
}
beginCapture(entity);
assertTrue(EntityShadowReplay.beginRenderer(renderer, entity, TICK_DELTA, BatchEligibility.SAFE));
switch (operation) {
case "explicitNoOp" -> {
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(1, 1);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(1, 1);
}
- case "enableOnly" -> GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- case "valuesOnly" -> GLStateManager.glPolygonOffset(-2, -3);
+ case "enableOnly" -> GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ case "valuesOnly" -> GLSMRasterizer.glPolygonOffset(-2, -3);
case "explicit" -> {
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(-2, -3);
- GLStateManager.setTextureMatrix(0, texture);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(-2, -3);
+ GLSMMatrices.setTextureMatrix(0, texture);
}
case "popped" -> {
- GLStateManager.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_ENABLE_BIT);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(7, 8);
- GLStateManager.glPopAttrib();
+ GLSMAttribStack.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_ENABLE_BIT);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(7, 8);
+ GLSMAttribStack.glPopAttrib();
}
default -> {
}
}
assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT));
endCaptureAndStartMainPass();
- GLStateManager.setTextureMatrix(0, new Matrix4f());
- GLStateManager.glPolygonOffset(-4, -5);
+ GLSMMatrices.setTextureMatrix(0, new Matrix4f());
+ GLSMRasterizer.glPolygonOffset(-4, -5);
if (!operation.equals("explicitNoOp") && !operation.equals("enableOnly")) {
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
}
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
@@ -616,8 +626,8 @@ class EntityShadowReplayGLTest {
final TemplateBuffer second = template();
final Matrix4f secondModel = new Matrix4f(model).translate(2, 3, 4);
setCapturePose(secondModel);
- GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1);
- GLStateManager.setOverlayColor(1, 0, 0, 0.5f);
+ GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1);
+ GLSMCurrentAttribs.setOverlayColor(1, 0, 0, 0.5f);
assertTrue(batcher.queueTemplate(second, EntityMaterials.CUTOUT));
EntityShadowReplay.endRenderer(true, BatchEligibility.SAFE);
final ObjectArrayList entries = commands();
@@ -626,7 +636,7 @@ class EntityShadowReplayGLTest {
assertSame(shadow.templateColumns, captured.source);
assertEquals(2, captured.end - captured.start);
final float[] original = shadow.templateColumns.matrices.clone();
- GLStateManager.setOverlayColor(0, 0, 0, 0);
+ GLSMCurrentAttribs.setOverlayColor(0, 0, 0, 0);
mainPass();
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
final RetainedTesrGroups.InstanceColumns actual = onlyGroup(target).templateColumns;
@@ -738,7 +748,7 @@ class EntityShadowReplayGLTest {
final Matrix4f secondPose = new Matrix4f(model).rotateX(0.3f).translate(-0.5f, 1.25f, 0.75f);
final Matrix4f otherPose = new Matrix4f(model).translate(5, 2, -3).rotateZ(0.4f);
final GlintCapture capture = new GlintCapture();
- final long drawsBefore = GLStateManager.drawCalls;
+ final long drawsBefore = GLSMDraws.drawCalls;
captureGlint(entity, renderer, () -> {
setCapturePose(model);
assertTrue(batcher.queueTemplate(body, EntityMaterials.CUTOUT));
@@ -761,7 +771,7 @@ class EntityShadowReplayGLTest {
capture.reset();
assertEquals(4, onlyGroup(target).templateColumns.size, "the shadow pass must only queue base geometry");
mainPass();
- final Matrix4f callerMatrix = new Matrix4f(GLStateManager.getModelViewMatrix());
+ final Matrix4f callerMatrix = new Matrix4f(GLSMMatrices.getModelViewMatrix());
assertTrue(EntityShadowReplay.replay(manager, other, TICK_DELTA, 0));
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
assertEquals(List.of(otherArmor, body, firstArmor, secondArmor), onlyMaterialGroup(EntityMaterials.CUTOUT).templateColumns.templates);
@@ -772,8 +782,8 @@ class EntityShadowReplayGLTest {
new Matrix4f[]{mainPose(otherPose), mainPose(firstPose), mainPose(secondPose)}, 0L, 0);
assertEquals(0, glint.layer.getState().getOffsetFactor());
assertEquals(0, glint.layer.getState().getOffsetUnits());
- assertEquals(drawsBefore, GLStateManager.drawCalls, "capture and replay must leave draws to the batch flush");
- assertTrue(callerMatrix.equals(GLStateManager.getModelViewMatrix(), 0));
+ assertEquals(drawsBefore, GLSMDraws.drawCalls, "capture and replay must leave draws to the batch flush");
+ assertTrue(callerMatrix.equals(GLSMMatrices.getModelViewMatrix(), 0));
}
@ParameterizedTest
@@ -799,7 +809,7 @@ class EntityShadowReplayGLTest {
for (EntityRenderCommands.Model base : bases) assertEquals(sourceNull, base.source == null);
final EntityRenderCommands.Glint capturedGlint = bases.getFirst().glint;
mainPass();
- GLStateManager.setModelViewMatrix(mainPose(new Matrix4f(model).translate(-3, 0, 0)));
+ GLSMMatrices.setModelViewMatrix(mainPose(new Matrix4f(model).translate(-3, 0, 0)));
queueCubes(unrelated, cube);
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
final RetainedTesrGroups.InstanceColumns mainBase = onlyMaterialGroup(EntityMaterials.CUTOUT).cubeColumns;
@@ -929,7 +939,7 @@ class EntityShadowReplayGLTest {
final int overlay = AngelicaBufferSource.packAbgr(0.25f, 0.5f, 0.75f, 1);
final TemplateBuffer item = template(), laterLayer = template();
final Matrix4f pose = new Matrix4f(model).rotateXYZ(0.17f, -0.29f, 0.41f).translate(0.37f, -0.63f, 1.19f);
- final long drawsBefore = GLStateManager.drawCalls;
+ final long drawsBefore = GLSMDraws.drawCalls;
captureGlint(entity, renderer, () -> {
setCapturePose(pose);
assertTrue(batcher.queueTemplate(item, EntityMaterials.DROPPED_ITEM_CUTOUT));
@@ -941,7 +951,7 @@ class EntityShadowReplayGLTest {
state.setCurrentEntityAndItem(89, 29);
state.setCurrentBlockEntity(31);
state.setCurrentEntityColor(1, 0, 0, 0.5f);
- final Matrix4f callerMatrix = new Matrix4f(GLStateManager.getModelViewMatrix());
+ final Matrix4f callerMatrix = new Matrix4f(GLSMMatrices.getModelViewMatrix());
assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
final RetainedTesrGroups.Group glint = onlyMaterialGroup(glintMaterial);
assertEquals(ItemGlint.texture(), glint.layer.getTextureId());
@@ -960,9 +970,9 @@ class EntityShadowReplayGLTest {
assertGlintMatchesBase(glint, group.templateColumns);
}
}
- assertEquals(drawsBefore, GLStateManager.drawCalls);
- assertTrue(callerMatrix.equals(GLStateManager.getModelViewMatrix(), 0));
- assertTrue(new Matrix4f().equals(GLStateManager.getTextures().getTextureUnitMatrix(0), 0));
+ assertEquals(drawsBefore, GLSMDraws.drawCalls);
+ assertTrue(callerMatrix.equals(GLSMMatrices.getModelViewMatrix(), 0));
+ assertTrue(new Matrix4f().equals(GLSMTextures.getTextures().getTextureUnitMatrix(0), 0));
assertEquals(89, state.getCurrentRenderedEntity());
assertEquals(31, state.getCurrentRenderedBlockEntity());
assertEquals(29, state.getCurrentRenderedItem());
@@ -974,12 +984,12 @@ class EntityShadowReplayGLTest {
@ValueSource(ints = {1, 2, 3, 4})
void droppedStackGlintKeepsEachCopyPoseWhenEntitiesReplayInReverseOrder(int copies) {
prepareGlintCapture();
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF);
final Entity other = mock(Entity.class);
final TemplateBuffer[] items = {template(), template()};
final Matrix4f[][] poses = new Matrix4f[2][copies];
- final long drawsBefore = GLStateManager.drawCalls;
+ final long drawsBefore = GLSMDraws.drawCalls;
for (int entityIndex = 0; entityIndex < 2; entityIndex++) {
final int index = entityIndex;
captureGlint(index == 0 ? entity : other, renderer, () -> {
@@ -1010,8 +1020,8 @@ class EntityShadowReplayGLTest {
assertGlintLayers(glint, ItemGlint.firstMatrix(), ItemGlint.secondMatrix(), expectedTemplates, expectedPoses, 0, 0);
assertGlintMatchesBase(glint, base.templateColumns);
assertTrue(materialGroups(EntityMaterials.ITEM_GLINT).isEmpty(), "dropped copies must not use held-item stencil deduplication");
- assertEquals(GL11.GL_EQUAL, GLStateManager.getStencilState().getFuncFront());
- assertEquals(drawsBefore, GLStateManager.drawCalls);
+ assertEquals(GL11.GL_EQUAL, GLSMDepthStencilAlpha.getStencilState().getFuncFront());
+ assertEquals(drawsBefore, GLSMDraws.drawCalls);
}
@Test
@@ -1024,7 +1034,7 @@ class EntityShadowReplayGLTest {
assertTrue(batcher.queueSkippedItemGlint(item, EntityMaterials.GLINT));
});
EntityShadowReplay.beginFrame();
- GLStateManager.setModelViewMatrix(shadowView);
+ GLSMMatrices.setModelViewMatrix(shadowView);
EntityShadowReplay.beginPass(true, 0);
final TemplateBuffer first = template(), second = template();
final Matrix4f secondPose = new Matrix4f(model).translate(0.31f, 0.47f, -0.59f);
@@ -1080,8 +1090,8 @@ class EntityShadowReplayGLTest {
case "stale" -> laterSource.clear();
case "instancing" -> target.beginPass(new Matrix4f(), 0, 0, 0);
case "stencil" -> {
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF);
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF);
}
}
assertFalse(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0));
@@ -1140,7 +1150,7 @@ class EntityShadowReplayGLTest {
assertTrue(batcher.queueSkippedItemGlint(held, EntityMaterials.ITEM_GLINT));
});
EntityShadowReplay.beginFrame();
- GLStateManager.setModelViewMatrix(shadowView);
+ GLSMMatrices.setModelViewMatrix(shadowView);
EntityShadowReplay.beginPass(true, 0);
captureGlint(entity, renderer, () -> {
setCapturePose(model);
@@ -1172,8 +1182,8 @@ class EntityShadowReplayGLTest {
private void prepareGlintCapture() {
Reflect.set(batcher, "instancedThisCycle", true);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
GlintClock.beginFrame(123456789L);
}
@@ -1181,13 +1191,13 @@ class EntityShadowReplayGLTest {
when(manager.getEntityRenderObject(captured)).thenReturn(render);
beginCapture(captured);
assertTrue(EntityShadowReplay.beginRenderer(render, captured, TICK_DELTA, BatchEligibility.SAFE));
- assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls));
+ assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls));
boolean completed = false;
try {
queue.run();
completed = true;
} finally {
- EntityShadowReplay.endRenderer(completed, BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls));
+ EntityShadowReplay.endRenderer(completed, BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls));
finishCapture(completed);
}
}
@@ -1215,13 +1225,13 @@ class EntityShadowReplayGLTest {
void incompleteOrChangedRecordsNeverQueuePartialGeometry(String reason) {
capture();
switch (reason) {
- case "foreign" -> GLStateManager.drawCalls++;
+ case "foreign" -> GLSMDraws.drawCalls++;
case "expected" -> {
- BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls);
- BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls);
- GLStateManager.drawCalls++;
- BatchEligibility.endExpectedDraws(GLStateManager.drawCalls);
- BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls);
+ BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls);
+ BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls);
+ GLSMDraws.drawCalls++;
+ BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls);
+ BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls);
}
case "bail" -> BatchEligibility.onBail(ModelPartBatcher.BailReason.TEXTURE);
case "shadowOnly" -> EntityShadowReplay.rejectShadowOnly();
@@ -1230,13 +1240,13 @@ class EntityShadowReplayGLTest {
case "nestedEntity" -> assertFalse(EntityShadowReplay.beginEntity(mock(Entity.class), TICK_DELTA));
}
EntityShadowReplay.endRenderer(!reason.equals("failed"), BatchEligibility.SAFE);
- if (reason.equals("afterRenderer")) GLStateManager.drawCalls++;
+ if (reason.equals("afterRenderer")) GLSMDraws.drawCalls++;
if (reason.equals("outerFailed")) finishCapture(false);
if (reason.equals("nextFrame")) EntityShadowReplay.beginFrame();
mainPass();
switch (reason) {
case "camera" -> RenderManager.instance.playerViewY = 0.2f;
- case "lightmap" -> GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(false);
+ case "lightmap" -> GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(false);
case "renderer" -> when(manager.getEntityRenderObject(entity)).thenReturn(mock(Render.class));
}
assertFalse(EntityShadowReplay.replay(manager, entity, reason.equals("partialTicks") ? 0.5f : TICK_DELTA, reason.equals("passOne") ? 1 : 0));
@@ -1259,7 +1269,7 @@ class EntityShadowReplayGLTest {
final RetainedTesrGroups.InstanceColumns columns = shadow.templateColumns;
final TemplateBuffer extra = template();
final Matrix4f pose = new Matrix4f(shadowView).mul(model).translate(2, 0, 0);
- final long draws = GLStateManager.drawCalls;
+ final long draws = GLSMDraws.drawCalls;
switch (operation) {
case "queue" -> target.queue(0, extra, shadow.layer, EntityMaterials.CUTOUT, pose, 0, -1, 0, 0L, 0, null);
case "copyRange" -> target.copyInstances(columns, 0, 1, shadow.layer, EntityMaterials.CUTOUT,
@@ -1278,7 +1288,7 @@ class EntityShadowReplayGLTest {
} else {
assertEquals(2, columns.size, "unrecorded submission must still reach shadow storage");
}
- assertEquals(draws, GLStateManager.drawCalls, "rejection must not force an immediate shadow draw");
+ assertEquals(draws, GLSMDraws.drawCalls, "rejection must not force an immediate shadow draw");
endCaptureAndStartMainPass();
resetBossStatus();
@@ -1349,27 +1359,27 @@ class EntityShadowReplayGLTest {
}
private void queueFire(int[] vertices, int vertexCount) {
- GLStateManager.glEnable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMEnable.glEnable(GL11.GL_DEPTH_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
final Tessellator tess = mock(Tessellator.class);
tess.isDrawing = true;
tess.drawMode = GL11.GL_QUADS;
tess.rawBuffer = vertices;
tess.vertexCount = vertexCount;
tess.rawBufferIndex = tess.rawBuffer.length;
- final long draws = GLStateManager.drawCalls;
+ final long draws = GLSMDraws.drawCalls;
batcher.beginEntityFire();
try {
ModelPartBatcher.drawTessellator(tess);
} finally {
batcher.endEntityFire();
}
- assertEquals(draws, GLStateManager.drawCalls);
+ assertEquals(draws, GLSMDraws.drawCalls);
}
@Test
@@ -1455,23 +1465,23 @@ class EntityShadowReplayGLTest {
queueAura(callback, livingRenderer, rendered, new float[]{TICK_DELTA, 1, 2, 3, 4, 5, 0.0625f},
new Matrix4f(shadowView).mul(model));
if (reason.equals("dragonEyes")) {
- final int depth = GLStateManager.pushState(StateSet.BATCH);
+ final int depth = GLSMAttribStack.pushState(StateSet.BATCH);
try {
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.glEnable(GL11.GL_BLEND);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMEnable.glEnable(GL11.GL_BLEND);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
assertFalse(batcher.queueTemplate(template(), null));
} finally {
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
}
}
endCaptureAndStartMainPass();
if (reason.equals("program")) {
final DeferredWorldRenderingPipeline pipeline = mock(DeferredWorldRenderingPipeline.class);
- when(pipeline.getActivePassProgramId()).thenReturn(GLStateManager.getActiveProgram() + 1);
+ when(pipeline.getActivePassProgramId()).thenReturn(GLSMPrograms.getActiveProgram() + 1);
Reflect.set(batcher, "shaderPipeline", pipeline);
assertTrue(batcher.entityPassActive(), "program ownership must not disable the active pass's fallback flushing");
}
@@ -1497,7 +1507,7 @@ class EntityShadowReplayGLTest {
observeBossStatus(first, true);
endCapture();
EntityShadowReplay.beginFrame();
- GLStateManager.setModelViewMatrix(shadowView);
+ GLSMMatrices.setModelViewMatrix(shadowView);
EntityShadowReplay.beginPass(true, 0);
final Entity next;
if (nextIsBoss) {
@@ -1545,14 +1555,14 @@ class EntityShadowReplayGLTest {
mainPass();
queueAura(liveCallback, creeperRenderer, live, liveArgs, liveAura);
assertSame(recycled, deferred.getFirst(), "the live aura must overwrite a recycled shadow queue entry");
- final long draws = GLStateManager.drawCalls;
+ final long draws = GLSMDraws.drawCalls;
assertTrue(EntityShadowReplay.replay(manager, second, TICK_DELTA, 0));
assertTrue(EntityShadowReplay.replay(manager, first, TICK_DELTA, 0));
assertEquals(2, onlyGroup(target).templateColumns.size, "both bodies must still replay");
assertEquals(3, deferred.size(), "replay must enqueue both captured auras after the live main aura");
- assertEquals(draws, GLStateManager.drawCalls, "replay must leave aura drawing to the deferred phase");
+ assertEquals(draws, GLSMDraws.drawCalls, "replay must leave aura drawing to the deferred phase");
verifyNoInteractions(callback, liveCallback, creeperRenderer);
- assertTrue(liveAura.equals(GLStateManager.getModelViewMatrix(), 0));
+ assertTrue(liveAura.equals(GLSMMatrices.getModelViewMatrix(), 0));
EntityShadowReplay.beginFrame();
assertAura(deferred.get(0), liveCallback, creeperRenderer, live, liveArgs, liveAura);
@@ -1574,19 +1584,19 @@ class EntityShadowReplayGLTest {
new Matrix4f(shadowView).mul(model));
endCapture();
EntityShadowReplay.beginFrame();
- GLStateManager.setModelViewMatrix(shadowView);
+ GLSMMatrices.setModelViewMatrix(shadowView);
EntityShadowReplay.beginPass(true, 0);
captureLiving(creeper, creeperRenderer);
assertTrue(batcher.queueTemplate(template(), EntityMaterials.TRANSLUCENT));
if (markOnly) DeferredEntityOverlay.markOverlayPass(callback, creeperRenderer, creeper, TICK_DELTA);
DeferredEntityOverlay.clearStaleOverlayFlag();
endCaptureAndStartMainPass();
- final long draws = GLStateManager.drawCalls;
+ final long draws = GLSMDraws.drawCalls;
assertTrue(EntityShadowReplay.replay(manager, creeper, TICK_DELTA, 0));
assertEquals(2, target.groupCount(), "the previous aura entry must be reusable as a model range");
final List> deferred = Reflect.getStatic(DeferredEntityOverlay.class, "deferred");
assertTrue(deferred.isEmpty());
- assertEquals(draws, GLStateManager.drawCalls);
+ assertEquals(draws, GLSMDraws.drawCalls);
verifyNoInteractions(callback, creeperRenderer);
});
}
@@ -1633,11 +1643,11 @@ class EntityShadowReplayGLTest {
DeferredEntityOverlay.clearStaleOverlayFlag();
endCaptureAndStartMainPass();
resetBossStatus();
- final long draws = GLStateManager.drawCalls;
+ final long draws = GLSMDraws.drawCalls;
assertTrue(EntityShadowReplay.replay(manager, wither, TICK_DELTA, 0));
assertBossStatus(wither, true);
assertEquals(1, onlyGroup(target).templateColumns.size);
- assertEquals(draws, GLStateManager.drawCalls);
+ assertEquals(draws, GLSMDraws.drawCalls);
final List> deferred = Reflect.getStatic(DeferredEntityOverlay.class, "deferred");
assertEquals(armor.equals("armored") ? 1 : 0, deferred.size());
verifyNoInteractions(callback, armorModel, witherRenderer);
@@ -1662,7 +1672,7 @@ class EntityShadowReplayGLTest {
assertTrue(deferred.isEmpty());
assertFalse(DeferredEntityOverlay.isOverlayPassActive());
assertFalse(DeferredEntityOverlay.isReplaying());
- assertTrue(mainView.equals(GLStateManager.getModelViewMatrix(), 0));
+ assertTrue(mainView.equals(GLSMMatrices.getModelViewMatrix(), 0));
assertBossStatus(wither, true);
}));
}
@@ -1678,7 +1688,7 @@ class EntityShadowReplayGLTest {
private void queueAura(DeferredEntityOverlay.ShouldRenderPassFn callback, RendererLivingEntity renderer,
EntityLivingBase entity, float[] args, Matrix4f matrix) {
if (captureOpen) setCapturePose(new Matrix4f(captureEntry).invert().mul(matrix));
- else GLStateManager.setModelViewMatrix(matrix);
+ else GLSMMatrices.setModelViewMatrix(matrix);
DeferredEntityOverlay.markOverlayPass(callback, renderer, entity, args[0]);
DeferredEntityOverlay.deferRender(args[1], args[2], args[3], args[4], args[5], args[6]);
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java
index 3093d9b60..4831814f6 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java
@@ -3,6 +3,9 @@ package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.ExitState;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.testutil.Reflect;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
@@ -67,9 +70,9 @@ class EntityTextureAtlasGLTest {
Reflect.setStatic(Minecraft.class, "theMinecraft", minecraft);
passColor = texture(GL11.GL_NEAREST, 0);
- passFbo = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, passColor, 0);
+ passFbo = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, passColor, 0);
source = texture(GL11.GL_NEAREST, 0);
}
@@ -77,10 +80,10 @@ class EntityTextureAtlasGLTest {
void tearDown() {
GLStateManager.cancelExitCapture();
EntityTextureAtlas.INSTANCE.freePages();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(passFbo);
- GLStateManager.glDeleteTextures(source);
- GLStateManager.glDeleteTextures(passColor);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(passFbo);
+ GLSMTextures.glDeleteTextures(source);
+ GLSMTextures.glDeleteTextures(passColor);
Reflect.setStatic(Minecraft.class, "theMinecraft", previous);
}
@@ -144,17 +147,17 @@ class EntityTextureAtlasGLTest {
Reflect.set(batcher, "activeGroups", previousGroups);
AngelicaConfig.enableEntityTextureAtlas = atlasEnabled;
groups.clear();
- GLStateManager.glDeleteTextures(otherTexture);
+ GLSMTextures.glDeleteTextures(otherTexture);
}
}
private static int texture(int filter, int seed) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, WIDTH, HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(seed));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, WIDTH, HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(seed));
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return id;
}
@@ -172,9 +175,9 @@ class EntityTextureAtlasGLTest {
private void assertSlotHolds(EntityTextureAtlas.Slot slot, int seed) {
final ByteBuffer page = BufferUtils.createByteBuffer(PAGE * PAGE * 4);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, pages.get(0).getGlTextureId());
- GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, page);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, pages.get(0).getGlTextureId());
+ GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, page);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
for (int y = -1; y <= HEIGHT; y++) {
for (int x = -1; x <= WIDTH; x++) {
final int at = ((slot.y + 1 + y) * PAGE + slot.x + 1 + x) * 4;
@@ -192,8 +195,8 @@ class EntityTextureAtlasGLTest {
final EntityTextureAtlas.Slot slot = EntityTextureAtlas.INSTANCE.slotFor(source, false);
assertTrue(GLStateManager.finishExitCapture(state), "first-use atlas resources are internal batch operations");
assertNotNull(slot);
- assertEquals(passFbo, GLStateManager.getDrawFramebuffer(), "draw framebuffer restored");
- assertEquals(passFbo, GLStateManager.getReadFramebuffer(), "read framebuffer restored");
+ assertEquals(passFbo, GLSMFramebuffer.getDrawFramebuffer(), "draw framebuffer restored");
+ assertEquals(passFbo, GLSMFramebuffer.getReadFramebuffer(), "read framebuffer restored");
assertEquals((slot.x + 1) / (float) PAGE, slot.u);
assertEquals(WIDTH / (float) PAGE, slot.w);
assertSlotHolds(slot, 0);
@@ -202,9 +205,9 @@ class EntityTextureAtlasGLTest {
@Test
void reuploadingTheTextureRefreshesItsSlot() {
final EntityTextureAtlas.Slot slot = EntityTextureAtlas.INSTANCE.slotFor(source, false);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, source);
- GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(7));
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, source);
+ GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(7));
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
assertSame(slot, EntityTextureAtlas.INSTANCE.slotFor(source, false));
assertSlotHolds(slot, 7);
}
@@ -215,7 +218,7 @@ class EntityTextureAtlasGLTest {
try {
assertNull(EntityTextureAtlas.INSTANCE.slotFor(filtered, false));
} finally {
- GLStateManager.glDeleteTextures(filtered);
+ GLSMTextures.glDeleteTextures(filtered);
}
}
@@ -223,28 +226,28 @@ class EntityTextureAtlasGLTest {
void switchingToLinearFilteringDropsTheSlot() {
final EntityTextureAtlas.Slot slot = EntityTextureAtlas.INSTANCE.slotFor(source, false);
assertNotNull(slot);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, source);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, source);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
assertNull(EntityTextureAtlas.INSTANCE.slotFor(source, false), "integer filter change");
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
assertSame(slot, EntityTextureAtlas.INSTANCE.slotFor(source, false), "the kept slot comes back");
- GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
assertNull(EntityTextureAtlas.INSTANCE.slotFor(source, false), "float filter change");
}
@Test
void drawingIntoTheTextureDropsItsSlot() {
assertNotNull(EntityTextureAtlas.INSTANCE.slotFor(source, false));
- final int target = GLStateManager.glGenFramebuffers();
+ final int target = GLSMFramebuffer.glGenFramebuffers();
try {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target);
- GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0);
- GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target);
+ GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0);
+ GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
} finally {
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo);
- GLStateManager.glDeleteFramebuffers(target);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo);
+ GLSMFramebuffer.glDeleteFramebuffers(target);
}
assertNull(EntityTextureAtlas.INSTANCE.slotFor(source, false));
}
@@ -265,7 +268,7 @@ class EntityTextureAtlasGLTest {
void aDeletedTexturesRegionIsReusedOnlyFromTheNextPass() {
final EntityTextureAtlas.Slot first = EntityTextureAtlas.INSTANCE.slotFor(source, false);
assertNotNull(first);
- GLStateManager.glDeleteTextures(source);
+ GLSMTextures.glDeleteTextures(source);
final int samePass = texture(GL11.GL_NEAREST, 3);
try {
final EntityTextureAtlas.Slot taken = EntityTextureAtlas.INSTANCE.slotFor(samePass, false);
@@ -279,7 +282,7 @@ class EntityTextureAtlasGLTest {
assertEquals(first.y, reused.y);
assertSlotHolds(reused, 5);
} finally {
- GLStateManager.glDeleteTextures(samePass);
+ GLSMTextures.glDeleteTextures(samePass);
}
}
@@ -294,18 +297,18 @@ class EntityTextureAtlasGLTest {
assertNull(EntityTextureAtlas.INSTANCE.slotFor(filling[filling.length - 1], false), "no page has room for another 512");
assertNotNull(EntityTextureAtlas.INSTANCE.slotFor(small, false), "shelves still have room for a small texture");
} finally {
- for (int id : filling) if (id != 0) GLStateManager.glDeleteTextures(id);
- GLStateManager.glDeleteTextures(small);
+ for (int id : filling) if (id != 0) GLSMTextures.glDeleteTextures(id);
+ GLSMTextures.glDeleteTextures(small);
}
}
private static int blankTexture(int size) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
return id;
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java
index 0b0493245..179e80331 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java
@@ -8,7 +8,21 @@ import com.gtnewhorizons.angelica.api.tesr.TesrShader;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.CubeParams;
@@ -116,16 +130,16 @@ class RetainedTesrGroupsGLTest {
@BeforeEach
void drawableState() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glLoadIdentity();
- GLStateManager.glViewport(0, 0, 800, 600);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.disableFog();
- GLStateManager.disableLighting();
- GLStateManager.glColor4f(1f, 1f, 1f, 1f);
+ GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadIdentity();
+ GLSMRasterizer.glViewport(0, 0, 800, 600);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMFog.disableFog();
+ GLSMLighting.disableLighting();
+ GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f);
final ShaderManager ffp = ShaderManager.getInstance();
ShaderManager.enable();
@@ -142,30 +156,30 @@ class RetainedTesrGroupsGLTest {
void cleanup() {
onBufferSetup = null;
source.discard();
- GLStateManager.setFfpInstancing(Instancing.NONE);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMPrograms.setFfpInstancing(Instancing.NONE);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
groups.clear();
instanced.clear();
ring.delete();
TesrShaderPrograms.invalidateAll();
final ShaderManager ffp = ShaderManager.getInstance();
if (ffp.isActive()) ffp.deactivate();
- if (baseTexture != 0) GLStateManager.glDeleteTextures(baseTexture);
- if (glintTexture != 0) GLStateManager.glDeleteTextures(glintTexture);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- GLStateManager.glDisable(GL11.GL_BLEND);
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
- GLStateManager.disableFog();
- GLStateManager.glDepthMask(true);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDisable(GL11.GL_DEPTH_TEST);
- GLStateManager.glDisable(GL11.GL_ALPHA_TEST);
+ if (baseTexture != 0) GLSMTextures.glDeleteTextures(baseTexture);
+ if (glintTexture != 0) GLSMTextures.glDeleteTextures(glintTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMEnable.glDisable(GL11.GL_BLEND);
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMFog.disableFog();
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMEnable.glDisable(GL11.GL_DEPTH_TEST);
+ GLSMEnable.glDisable(GL11.GL_ALPHA_TEST);
}
private static TemplateBuffer template(float[] xyz, int colorABGR, int drawMode) {
@@ -480,8 +494,8 @@ class RetainedTesrGroupsGLTest {
assertEquals(4, groups.instancedDraws, "three texture-matrix template runs (A,B,A never merge non-adjacent) plus the single identity cube run");
assertEquals(3, groups.texMatrixRuns, "one non-identity glLoadMatrix per drawn template run, not per distinct matrix value");
- assertEquals(GL11.GL_MODELVIEW, GLStateManager.getMatrixMode().getMode(), "matrix mode must be restored after the texture-matrix runs");
- assertTrue(MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0)), "unit-0 texture matrix must be restored to identity");
+ assertEquals(GL11.GL_MODELVIEW, GLSMMatrices.getMatrixMode().getMode(), "matrix mode must be restored after the texture-matrix runs");
+ assertTrue(MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0)), "unit-0 texture matrix must be restored to identity");
}
@Test
@@ -532,9 +546,9 @@ class RetainedTesrGroupsGLTest {
@Test
void drawTemplatesBakesThePerInstanceModelviewIntoScreenPosition() {
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.disableTexture();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMTextures.disableTexture();
final Matrix4f translated = new Matrix4f().translation(0.3f, -0.2f, 0f);
final int tx = (int) ((translated.m30() * 0.5f + 0.5f) * 800);
@@ -543,8 +557,8 @@ class RetainedTesrGroupsGLTest {
final int originY = 300;
final TemplateBuffer template = template(TRIANGLE, COLOR_ABGR, GL11.GL_TRIANGLES);
- GLStateManager.glClearColor(0f, 0f, 0f, 1f);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMBlend.glClearColor(0f, 0f, 0f, 1f);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
drawSingleInstance(instanced, template, translated, COLOR_ABGR);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "instanced draw must not raise a GL error");
@@ -554,7 +568,7 @@ class RetainedTesrGroupsGLTest {
final int[] atOrigin = FfpFixture.readPixel(originX, originY);
assertTrue(atOrigin[0] < 50 && atOrigin[1] < 50 && atOrigin[2] < 50, "the untranslated origin must stay background, got " + atOrigin[0] + "," + atOrigin[1] + "," + atOrigin[2]);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
drawSingleInstance(instanced, template, new Matrix4f(), COLOR_ABGR);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "instanced draw must not raise a GL error");
@@ -563,10 +577,10 @@ class RetainedTesrGroupsGLTest {
}
private void queueTriangleOnClearedTarget() {
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.disableTexture();
- GLStateManager.glDisable(GL11.GL_SCISSOR_TEST);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMTextures.disableTexture();
+ GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST);
FfpFixture.clear();
queueTriangle(groups, new Matrix4f());
}
@@ -594,11 +608,11 @@ class RetainedTesrGroupsGLTest {
@Test
void scissorChangeDrainsQueuedGeometryBeforeClippingAndEndsModelBatching() {
- GLStateManager.glScissor(0, 0, 0, 0);
+ GLSMRasterizer.glScissor(0, 0, 0, 0);
queueTriangleOnClearedTarget();
final ModelPartBatcher models = ModelPartBatcher.INSTANCE;
withBatcherFields(models, () -> {
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
assertTrue(models.isActive(), "batching must resume for the rest of the pass after the flush");
assertFalse(models.hasQueuedGeometry(), "the flush must drain what was queued before the change");
assertTrue(FfpFixture.readPixel(400, 300)[0] > 200, "queued geometry must draw before the zero-area scissor takes effect");
@@ -607,7 +621,7 @@ class RetainedTesrGroupsGLTest {
@Test
void heldEntityTranslucentsSurviveUncapturedStateChange() {
- GLStateManager.glScissor(0, 0, 0, 0);
+ GLSMRasterizer.glScissor(0, 0, 0, 0);
queueTriangleOnClearedTarget();
final AngelicaBufferSource blockEntitySource = new AngelicaBufferSource();
final RetainedTesrGroups blockEntityGroups = new RetainedTesrGroups(blockEntitySource, () -> clock[0]);
@@ -616,7 +630,7 @@ class RetainedTesrGroupsGLTest {
final ModelPartBatcher models = ModelPartBatcher.INSTANCE;
withBatcherFields(models, () -> {
assertTrue(models.hasQueuedGeometry(), "sanity: the block-entity pass has queued geometry to drain");
- GLStateManager.glEnable(GL11.GL_SCISSOR_TEST);
+ GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST);
assertTrue(FfpFixture.readPixel(600, 300)[0] > 200, "the active block-entity batch must draw before the zero-area scissor takes effect");
assertTrue(FfpFixture.readPixel(400, 300)[0] < 50, "held entity geometry must not draw before deferred");
assertTrue(models.hasHeldEntities(), "held entity translucents wait for the post-deferred flush");
@@ -637,7 +651,7 @@ class RetainedTesrGroupsGLTest {
retained[0] = groups;
try {
withBatcherFields(renderer, () -> {
- GLStateManager.enableFog();
+ GLSMFog.enableFog();
assertFalse(renderer.hasPendingGeometry());
assertTrue(FfpFixture.readPixel(400, 300)[0] > 200, "provider geometry must reach the framebuffer before fog is enabled");
}, "bufferSource", source, "activePass", 0);
@@ -652,12 +666,12 @@ class RetainedTesrGroupsGLTest {
withBatcherFields(renderer, () -> {
net.coderbot.iris.layer.GbufferPrograms.setBlockEntityDefaults();
assertTrue(renderer.hasActivePass(), "default attributes before the first renderer must not disable shadow batching");
- BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls);
+ BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls);
try {
- GLStateManager.glScissor(0, 0, 8, 8);
+ GLSMRasterizer.glScissor(0, 0, 8, 8);
assertFalse(renderer.hasActivePass(), "unsupported renderer state needs fallback even before its first model part");
} finally {
- assertEquals(BatchEligibility.DENIED, BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls));
+ assertEquals(BatchEligibility.DENIED, BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls));
}
}, "bufferSource", source, "activePass", TesrBatchRenderer.PASS_SHADOW);
}
@@ -673,10 +687,10 @@ class RetainedTesrGroupsGLTest {
for (int i = 0; i < icon.vertexCount; i++) {
icon.data[i * VERTEX_SIZE + COLOR_INDEX] = i < 8 ? 0xFF0000FF : 0xFF00FF00;
}
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glFrontFace(GL11.GL_CCW);
- GLStateManager.disableCull();
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
+ GLSMRasterizer.disableCull();
final RenderLayer base = RetainedTesrTestSupport.capturedLayer(EntityMaterials.DROPPED_ITEM_CUTOUT);
final RenderLayer glint = RetainedTesrTestSupport.capturedLayer(
TesrMaterial.builder().glint().depthEqual().noDepthWrite().unlit().stream().build());
@@ -692,25 +706,25 @@ class RetainedTesrGroupsGLTest {
}
private int[][] drawItemAndGlint(TemplateBuffer icon, Matrix4f mv, RenderLayer base, RenderLayer glint, boolean reference) {
- GLStateManager.disableLighting();
- GLStateManager.glDepthMask(true);
+ GLSMLighting.disableLighting();
+ GLSMDepthStencilAlpha.glDepthMask(true);
FfpFixture.clear();
- GLStateManager.enableCull();
- final int depth = GLStateManager.pushState(StateSet.BATCH);
+ GLSMRasterizer.enableCull();
+ final int depth = GLSMAttribStack.pushState(StateSet.BATCH);
base.startDrawing();
- if (reference) GLStateManager.disableCull();
+ if (reference) GLSMRasterizer.disableCull();
drawSingleInstance(instanced, icon, mv, 0xFF808080);
final int[] basePixels = FfpFixture.readRegion(SIZE);
base.endDrawing();
glint.startDrawing();
- if (reference) GLStateManager.disableCull();
+ if (reference) GLSMRasterizer.disableCull();
assertTrue(GL11.glIsEnabled(GL11.GL_DEPTH_TEST));
assertEquals(GL11.GL_EQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC));
assertFalse(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK));
drawSingleInstance(instanced, icon, mv, 0xFF808080);
final int[] glintPixels = FfpFixture.readRegion(SIZE);
glint.endDrawing();
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE), "the batch bracket restores the flush caller's culling");
return new int[][] { basePixels, glintPixels };
}
@@ -744,7 +758,7 @@ class RetainedTesrGroupsGLTest {
}
private void glintState() {
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
layer = RenderLayer.tesr(GLINT_TEXTURE, TesrMaterial.CURRENT_STATE, PassOverride.NONE, 0f, 0f, ShaderGlint.NO_TINT, DrawState.DISABLED, false, true);
GlintClock.beginFrame(123456789L);
@@ -766,13 +780,13 @@ class RetainedTesrGroupsGLTest {
}
private static int createGlintTexture(boolean opaque) {
- final int id = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
+ final int id = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
final ByteBuffer texels = BufferUtils.createByteBuffer(4 * 4 * 4);
for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
@@ -780,47 +794,47 @@ class RetainedTesrGroupsGLTest {
}
}
texels.flip();
- GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
+ GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels);
return id;
}
private void bindBase() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, baseTexture);
- GLStateManager.enableTexture();
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, baseTexture);
+ GLSMTextures.enableTexture();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
}
private static void setGlintBlendState() {
- GLStateManager.disableAlphaTest();
- GLStateManager.glDepthFunc(GL11.GL_EQUAL);
- GLStateManager.glDepthMask(false);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
}
private void applyGlintTexMatrix(Matrix4f m) {
bindGlint();
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
final FloatBuffer buf = BufferUtils.createFloatBuffer(16);
m.get(buf);
- GLStateManager.glLoadMatrix(buf);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glLoadMatrix(buf);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
private static void restoreTexMatrix() {
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
}
private void bindGlint() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture);
}
private int[] drawBaseTemplates() {
@@ -951,10 +965,10 @@ class RetainedTesrGroupsGLTest {
capture.end();
applyGlintTexMatrix(glintMatrixB);
if (!cubes) {
- GLStateManager.glColor4f(0.5f, 1, 1, 1);
+ GLSMCurrentAttribs.glColor4f(0.5f, 1, 1, 1);
assertFalse(capture.replay(groups), "changed layer color must retain the original render call");
- GLStateManager.glColor4f(1, 1, 1, 1);
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMCurrentAttribs.glColor4f(1, 1, 1, 1);
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
assertFalse(capture.replay(groups), "changed layer blending must retain the original render call");
setGlintBlendState();
}
@@ -970,7 +984,7 @@ class RetainedTesrGroupsGLTest {
glintState();
drawBaseTemplates();
setGlintBlendState();
- GLStateManager.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
applyGlintTexMatrix(glintMatrixA);
drawSingleInstance(instanced, glintTemplate, templateE1, 0xFFFFFFFF);
applyGlintTexMatrix(glintMatrixB);
@@ -984,7 +998,7 @@ class RetainedTesrGroupsGLTest {
groups.queue(SCOPE, glintTemplate, layer, EntityMaterials.CUTOUT, templateE1, 0, 0xFF123456, 0, 0L, 0, null);
base.end();
setGlintBlendState();
- GLStateManager.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
applyGlintTexMatrix(glintMatrixA);
ModelPartBatcher.onTextureBind(new ResourceLocation("angelica", "test/glint"), glintTexture);
final ModelPartBatcher batcher = ModelPartBatcher.INSTANCE;
@@ -993,9 +1007,9 @@ class RetainedTesrGroupsGLTest {
try {
final GlintCapture glint = new GlintCapture();
assertTrue(glint.begin(groups));
- GLStateManager.glTranslatef(0.1f, 0, 0);
+ GLSMMatrices.glTranslatef(0.1f, 0, 0);
assertFalse(base.copyBase(batcher, groups), "a different parent pose must use the original model call");
- GLStateManager.glLoadIdentity();
+ GLSMMatrices.glLoadIdentity();
assertTrue(base.copyBase(batcher, groups));
glint.end();
assertTrue(glint.replay(groups, glintMatrixB), "the second layer can be queued without rerunning legacy texture setup");
@@ -1015,7 +1029,7 @@ class RetainedTesrGroupsGLTest {
@ValueSource(strings = {"armorTemplate", "armorCubes", "held", "heldMirrored", "dropped", "droppedStack"})
void shadowGlintReplayMatchesLiveMainPixels(String kind) {
glintState();
- GLStateManager.glDeleteTextures(glintTexture);
+ GLSMTextures.glDeleteTextures(glintTexture);
glintTexture = createGlintTexture(true);
final boolean held = kind.startsWith("held"), dropped = kind.startsWith("dropped"), cubes = kind.equals("armorCubes");
final TemplateBuffer baseTemplate;
@@ -1053,17 +1067,17 @@ class RetainedTesrGroupsGLTest {
Reflect.set(batcher, "active", true);
Reflect.set(batcher, "mode", ModelPartBatcher.Mode.ENTITIES);
Reflect.set(batcher, "instancedThisCycle", true);
- GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(false);
- GLStateManager.setOverlayColor(0, 0, 0, 0);
- GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(false);
+ GLSMCurrentAttribs.setOverlayColor(0, 0, 0, 0);
+ GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
RenderManager.renderPosX = 1000000;
RenderManager.renderPosY = RenderManager.renderPosZ = 0;
groups.beginPass(new Matrix4f(), 0, 0, 0, instanced);
Reflect.set(batcher, "activeGroups", groups);
Reflect.set(batcher, "shadow", false);
ShadowRenderer.ACTIVE = false;
- GLStateManager.setModelViewMatrix(mainView);
+ GLSMMatrices.setModelViewMatrix(mainView);
queueEntityGlint(batcher, kind, baseTemplate, pose, true);
final int[][] reference = drawEntityGlint(kind);
@@ -1071,7 +1085,7 @@ class RetainedTesrGroupsGLTest {
Reflect.set(batcher, "activeGroups", shadowGroups);
Reflect.set(batcher, "shadow", true);
ShadowRenderer.ACTIVE = true;
- GLStateManager.setModelViewMatrix(shadowView);
+ GLSMMatrices.setModelViewMatrix(shadowView);
EntityShadowReplay.beginPass(true, 0);
BatchStateGuard.resume();
try {
@@ -1089,7 +1103,7 @@ class RetainedTesrGroupsGLTest {
Reflect.set(batcher, "activeGroups", groups);
Reflect.set(batcher, "shadow", false);
ShadowRenderer.ACTIVE = false;
- GLStateManager.setModelViewMatrix(mainView);
+ GLSMMatrices.setModelViewMatrix(mainView);
EntityShadowReplay.beginPass(false, 0);
assertTrue(EntityShadowReplay.replay(manager, entity, 0.25f, 0));
final int[][] replayed = drawEntityGlint(kind);
@@ -1109,7 +1123,7 @@ class RetainedTesrGroupsGLTest {
RenderManager.renderPosX = previousX;
RenderManager.renderPosY = previousY;
RenderManager.renderPosZ = previousZ;
- GLStateManager.glDisable(GL11.GL_STENCIL_TEST);
+ GLSMEnable.glDisable(GL11.GL_STENCIL_TEST);
BatchStateGuard.resume();
}
}
@@ -1125,12 +1139,12 @@ class RetainedTesrGroupsGLTest {
final boolean held = kind.startsWith("held"), dropped = kind.startsWith("dropped"), cubes = kind.equals("armorCubes");
bindBase();
restoreTexMatrix();
- GLStateManager.glPushMatrix();
- GLStateManager.applyMultMatrix(pose);
- GLStateManager.glColor4f(0.4f, 0.6f, 0.8f, 1);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.applyMultMatrix(pose);
+ GLSMCurrentAttribs.glColor4f(0.4f, 0.6f, 0.8f, 1);
ModelPartBatcher.onTextureBind(new ResourceLocation("angelica", "test/base"), baseTexture);
final GlintCapture capture = new GlintCapture();
- assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls));
+ assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls));
try {
if (!held && !dropped) assertTrue(batcher.beginArmorCapture(capture));
assertTrue(Reflect.invoke(batcher, "queueTemplate",
@@ -1139,11 +1153,11 @@ class RetainedTesrGroupsGLTest {
if (held) {
assertTrue(batcher.queueSkippedItemGlint(glintTemplate, EntityMaterials.ITEM_GLINT));
} else if (dropped && legacyDropped) {
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture);
ModelPartBatcher.onTextureBind(GLINT_TEXTURE, glintTexture);
- GLStateManager.glColor4f(0.5f * 0.76f, 0.25f * 0.76f, 0.8f * 0.76f, 1);
+ GLSMCurrentAttribs.glColor4f(0.5f * 0.76f, 0.25f * 0.76f, 0.8f * 0.76f, 1);
for (Matrix4f matrix : new Matrix4f[] {ItemGlint.firstMatrix(), ItemGlint.secondMatrix()}) {
- GLStateManager.setTextureMatrix(0, matrix);
+ GLSMMatrices.setTextureMatrix(0, matrix);
assertTrue(batcher.queueTemplate(glintTemplate, EntityMaterials.GLINT));
}
restoreTexMatrix();
@@ -1154,16 +1168,16 @@ class RetainedTesrGroupsGLTest {
assertTrue(batcher.queueSkippedArmorGlint(capture, GLINT_TEXTURE));
}
} finally {
- BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls);
+ BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls);
capture.reset();
- GLStateManager.glPopMatrix();
+ GLSMMatrices.glPopMatrix();
}
}
private int[][] drawEntityGlint(String kind) {
final boolean held = kind.startsWith("held"), dropped = kind.startsWith("dropped");
FfpFixture.clear();
- final int depth = GLStateManager.pushState(StateSet.BATCH);
+ final int depth = GLSMAttribStack.pushState(StateSet.BATCH);
try {
int[] base = null;
for (TesrMaterial material : new TesrMaterial[] {held || dropped ? EntityMaterials.DROPPED_ITEM_CUTOUT : EntityMaterials.CUTOUT,
@@ -1171,11 +1185,11 @@ class RetainedTesrGroupsGLTest {
for (var layers : RetainedTesrTestSupport.byLayer(groups).values()) for (Group group : layers) {
if (group.material != material) continue;
group.layer.getState().apply();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, base == null ? baseTexture : glintTexture);
- GLStateManager.enableTexture();
- GLStateManager.glEnable(GL11.GL_STENCIL_TEST);
- GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 3, 0xFF);
- GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, base == null ? baseTexture : glintTexture);
+ GLSMTextures.enableTexture();
+ GLSMEnable.glEnable(GL11.GL_STENCIL_TEST);
+ GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 3, 0xFF);
+ GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP);
groups.drawLayer(group.layer);
assertEquals(GL11.GL_ALWAYS, GL11.glGetInteger(GL11.GL_STENCIL_FUNC));
assertEquals(3, GL11.glGetInteger(GL11.GL_STENCIL_REF));
@@ -1185,27 +1199,27 @@ class RetainedTesrGroupsGLTest {
ring.endFrame();
return new int[][] {base, FfpFixture.readRegion(SIZE)};
} finally {
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
}
}
@Test
void mirroredModelViewUnderCullFrontBatchesLikeTheImmediateDraw() {
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.disableTexture();
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glShadeModel(GL11.GL_SMOOTH);
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMTextures.disableTexture();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH);
final TemplateBuffer quad = capturedQuad(0.5);
final Matrix4f mirrored = new Matrix4f().scaling(-1f, 1f, 1f);
assertTrue(mirrored.determinant() < 0f, "the sky stone chest TESR matrix is mirrored, got determinant " + mirrored.determinant());
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
final int cullCode = DrawState.liveCull();
final int center = SIZE / 2 * SIZE + SIZE / 2;
@@ -1220,7 +1234,7 @@ class RetainedTesrGroupsGLTest {
FfpFixture.clear();
groups.beginPass(new Matrix4f(), 0, 0, 0, instanced);
groups.queue(SCOPE, quad, culled, RetainedTesrTestSupport.STREAM, mirrored, 0, COLOR_ABGR, 0, 0L, 1, null);
- GLStateManager.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
source.endBatch(groups);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "the batched draw must not raise a GL error");
@@ -1231,34 +1245,34 @@ class RetainedTesrGroupsGLTest {
@Test
void flushRestoresCallerStateOnEveryGuardedAxis() {
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.disableTexture();
- GLStateManager.disableAlphaTest();
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMTextures.disableTexture();
+ GLSMDepthStencilAlpha.disableAlphaTest();
- GLStateManager.enableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
- GLStateManager.glDepthMask(false);
- GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
- GLStateManager.glPolygonOffset(1.0f, 1.0f);
+ GLSMRasterizer.enableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ GLSMRasterizer.glPolygonOffset(1.0f, 1.0f);
- final boolean cullEnabledBefore = GLStateManager.getCullState().isEnabled();
- final int cullFaceBefore = GLStateManager.getPolygonState().getCullFaceMode();
+ final boolean cullEnabledBefore = GLSMRasterizer.getCullState().isEnabled();
+ final int cullFaceBefore = GLSMRasterizer.getPolygonState().getCullFaceMode();
final boolean glCullEnabledBefore = GL11.glIsEnabled(GL11.GL_CULL_FACE);
final int glCullFaceBefore = GL11.glGetInteger(GL11.GL_CULL_FACE_MODE);
- final boolean blendEnabledBefore = GLStateManager.isEffectiveBlendEnabled();
+ final boolean blendEnabledBefore = GLSMBlend.isEffectiveBlendEnabled();
final boolean glBlendEnabledBefore = GL11.glIsEnabled(GL11.GL_BLEND);
- final int blendSrcBefore = GLStateManager.getEffectiveBlendState(new BlendState()).getSrcRgb();
+ final int blendSrcBefore = GLSMBlend.getEffectiveBlendState(new BlendState()).getSrcRgb();
final int glBlendSrcBefore = GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB);
- final boolean depthMaskBefore = GLStateManager.isEffectiveDepthMaskEnabled();
+ final boolean depthMaskBefore = GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled();
final boolean glDepthMaskBefore = GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK);
- final boolean offsetFillBefore = GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL);
+ final boolean offsetFillBefore = GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL);
final boolean glOffsetFillBefore = GL11.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL);
- final float offsetFactorBefore = GLStateManager.getPolygonState().getOffsetFactor();
+ final float offsetFactorBefore = GLSMRasterizer.getPolygonState().getOffsetFactor();
final float glOffsetFactorBefore = GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR);
final TemplateBuffer quad = capturedQuad(0.5);
@@ -1271,22 +1285,22 @@ class RetainedTesrGroupsGLTest {
source.endBatch(groups);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "the flush must not raise a GL error");
- assertEquals(cullEnabledBefore, GLStateManager.getCullState().isEnabled(), "cache cull enable must be restored");
- assertEquals(cullFaceBefore, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face must be restored");
+ assertEquals(cullEnabledBefore, GLSMRasterizer.getCullState().isEnabled(), "cache cull enable must be restored");
+ assertEquals(cullFaceBefore, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face must be restored");
assertEquals(glCullEnabledBefore, GL11.glIsEnabled(GL11.GL_CULL_FACE), "driver cull enable must be restored");
assertEquals(glCullFaceBefore, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face must be restored");
- assertEquals(blendEnabledBefore, GLStateManager.isEffectiveBlendEnabled(), "cache blend enable must be restored");
+ assertEquals(blendEnabledBefore, GLSMBlend.isEffectiveBlendEnabled(), "cache blend enable must be restored");
assertEquals(glBlendEnabledBefore, GL11.glIsEnabled(GL11.GL_BLEND), "driver blend enable must be restored");
- assertEquals(blendSrcBefore, GLStateManager.getEffectiveBlendState(new BlendState()).getSrcRgb(), "cache blend func must be restored");
+ assertEquals(blendSrcBefore, GLSMBlend.getEffectiveBlendState(new BlendState()).getSrcRgb(), "cache blend func must be restored");
assertEquals(glBlendSrcBefore, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend func must be restored");
- assertEquals(depthMaskBefore, GLStateManager.isEffectiveDepthMaskEnabled(), "cache depth mask must be restored");
+ assertEquals(depthMaskBefore, GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled(), "cache depth mask must be restored");
assertEquals(glDepthMaskBefore, GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth mask must be restored");
- assertEquals(offsetFillBefore, GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "cache polygon offset fill must be restored");
+ assertEquals(offsetFillBefore, GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "cache polygon offset fill must be restored");
assertEquals(glOffsetFillBefore, GL11.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "driver polygon offset fill must be restored");
- assertEquals(offsetFactorBefore, GLStateManager.getPolygonState().getOffsetFactor(), 0.0001f, "cache polygon offset factor must be restored");
+ assertEquals(offsetFactorBefore, GLSMRasterizer.getPolygonState().getOffsetFactor(), 0.0001f, "cache polygon offset factor must be restored");
assertEquals(glOffsetFactorBefore, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR), 0.0001f, "driver polygon offset factor must be restored");
}
@@ -1325,15 +1339,15 @@ class RetainedTesrGroupsGLTest {
@Test
void shaderLayerBindsTheInstancedProgramOnceAndMatchesTheRetainedDraw() {
final TesrShader shader = RetainedTesrTestSupport.linkedSource("angelica:test_gl_source_shader").shader;
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
long bakedBinds = TesrShaderPrograms.bakedBinds;
long instancedBinds = TesrShaderPrograms.instancedBinds;
final int[][] instancedPixels = drawShaderLayer(queueShaderPair(TesrMaterial.builder().stream().shader(shader).build(), true));
assertEquals(1, TesrShaderPrograms.bakedBinds - bakedBinds, "the layer hook binds the baked variant once");
assertEquals(1, TesrShaderPrograms.instancedBinds - instancedBinds, "the instanced variant binds once for the layer");
- assertEquals(0, GLStateManager.getActiveProgram(), "release must restore the caller's program");
+ assertEquals(0, GLSMPrograms.getActiveProgram(), "release must restore the caller's program");
assertEquals(1, groups.instancedDraws, "both instances share one template run");
assertEquals(2, groups.instancedInstances);
@@ -1367,11 +1381,11 @@ class RetainedTesrGroupsGLTest {
final TemplateBuffer template = capturedQuad(0.6);
final String path = instancing ? "instanced" : "baked";
- final Matrix4f savedProjection = new Matrix4f(GLStateManager.getProjectionMatrix());
- GLStateManager.glViewport(0, 0, SIZE, SIZE);
- GLStateManager.setProjectionMatrix(new Matrix4f().setPerspective(1.2217f, 1.3713f, 0.0517f, 173.31f));
- GLStateManager.disableTexture();
- GLStateManager.glDepthMask(true);
+ final Matrix4f savedProjection = new Matrix4f(GLSMMatrices.getProjectionMatrix());
+ GLSMRasterizer.glViewport(0, 0, SIZE, SIZE);
+ GLSMMatrices.setProjectionMatrix(new Matrix4f().setPerspective(1.2217f, 1.3713f, 0.0517f, 173.31f));
+ GLSMTextures.disableTexture();
+ GLSMDepthStencilAlpha.glDepthMask(true);
FfpFixture.clear();
try {
final Matrix4f view = new Matrix4f().translation(0.0713f, -0.0291f, -2.3177f).rotateX(0.413f);
@@ -1416,14 +1430,14 @@ class RetainedTesrGroupsGLTest {
assertEquals(0, missed, path + ": depth-equal overlay missed " + missed + " of " + covered + " base pixels");
return new Group[] { RetainedTesrTestSupport.groupsOn(groups, baseLayer).get(0), RetainedTesrTestSupport.groupsOn(groups, overlayLayer).get(0) };
} finally {
- GLStateManager.setProjectionMatrix(savedProjection);
+ GLSMMatrices.setProjectionMatrix(savedProjection);
}
}
@Test
void depthEqualSetMembersBakeAgainstOneAnchor() {
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
final double[] first = { 1000.3, 70.6, -2000.7 };
final double[] moved = { 1300.4, 75.8, -1750.4 };
final Group[] pair = drawDepthEqualPair(null, false, first, moved);
@@ -1435,8 +1449,8 @@ class RetainedTesrGroupsGLTest {
@Test
void failedInstancedRelinkDrawsQueuedInstancesOnTheCpuPath() {
final TesrShaderPrograms.Entry entry = RetainedTesrTestSupport.linkedSource("angelica:test_gl_relink_failure_shader");
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
final RenderLayer shaderLayer = queueShaderPair(TesrMaterial.builder().stream().shader(entry.shader).build(), true);
assertEquals(1, RetainedTesrTestSupport.onlyGroup(groups).templateColumns.runs.size(), "sanity: both parts queued as instances");
@@ -1455,8 +1469,8 @@ class RetainedTesrGroupsGLTest {
@Test
void shaderOverlayDepthEqualsItsEmulatedBaseOnBothPaths() {
final TesrShader shader = RetainedTesrTestSupport.linkedSource("angelica:test_gl_depth_parity_shader").shader;
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
drawDepthEqualPair(shader, false);
drawDepthEqualPair(shader, true);
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java
index 55a48b7f2..117ca66b1 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java
@@ -1,7 +1,11 @@
package com.gtnewhorizons.angelica.rendering.tesr;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
@@ -67,16 +71,16 @@ class StateSetOverrideGLTest {
AlphaTestStorage.restoreAlphaTest();
DepthColorStorage.unlockDepthColor();
VanillaLayerRig.clear();
- GLStateManager.disableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.disableCull();
- GLStateManager.glUseProgram(0);
- if (program != 0) GLStateManager.glDeleteProgram(program);
- if (otherProgram != 0) GLStateManager.glDeleteProgram(otherProgram);
+ GLSMBlend.disableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.disableCull();
+ GLSMPrograms.glUseProgram(0);
+ if (program != 0) GLSMPrograms.glDeleteProgram(program);
+ if (otherProgram != 0) GLSMPrograms.glDeleteProgram(otherProgram);
}
private static int[] driverBlendFunc() {
@@ -94,8 +98,8 @@ class StateSetOverrideGLTest {
private static void overrideVanillaBlend() {
VanillaLayerRig.installBlend();
- GLStateManager.enableBlend();
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMBlend.enableBlend();
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
BlendModeStorage.overrideBlend(new BlendState(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE));
}
@@ -103,15 +107,15 @@ class StateSetOverrideGLTest {
private static void overrideVanillaAlpha() {
VanillaLayerRig.installAlpha();
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
AlphaTestStorage.overrideAlphaTest(new AlphaTest(AlphaTestFunction.LEQUAL, 0.25f));
}
static Stream blendFuncSetters() {
return Stream.of(
- Arguments.of("glBlendFunc", (Runnable) () -> GLStateManager.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO)),
- Arguments.of("tryBlendFuncSeparate", (Runnable) () -> GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO)));
+ Arguments.of("glBlendFunc", (Runnable) () -> GLSMBlend.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO)),
+ Arguments.of("tryBlendFuncSeparate", (Runnable) () -> GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO)));
}
@ParameterizedTest(name = "{0}")
@@ -119,19 +123,19 @@ class StateSetOverrideGLTest {
void blendBracketUnderOverrideRestoresVanillaShadowAndLeavesLiveStateUntouched(String name, Runnable setBlendFunc) {
overrideVanillaBlend();
- final boolean liveEnabledBefore = GLStateManager.getBlendMode().isEnabled();
- final BlendState liveBefore = new BlendState().set(GLStateManager.getBlendState());
+ final boolean liveEnabledBefore = GLSMBlend.getBlendMode().isEnabled();
+ final BlendState liveBefore = new BlendState().set(GLSMBlend.getBlendState());
final boolean driverEnabledBefore = GL11.glIsEnabled(GL11.GL_BLEND);
final int[] driverFuncBefore = driverBlendFunc();
assertTrue(driverEnabledBefore, "driver blend enable carries the override");
assertArrayEquals(new int[] {GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE}, driverFuncBefore, "driver blend func carries the override");
- final int d = GLStateManager.pushState(StateSet.BLEND);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
final boolean vanillaEnabledBefore = BlendModeStorage.ENABLE_LAYER.getVanilla();
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
assertNotEquals(vanillaEnabledBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "the defer branch changes the vanilla shadow immediately");
setBlendFunc.run();
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
assertEquals(driverEnabledBefore, GL11.glIsEnabled(GL11.GL_BLEND), "driver blend enable left untouched by the bracket");
assertArrayEquals(driverFuncBefore, driverBlendFunc(), "driver blend func left untouched by the bracket");
@@ -144,35 +148,35 @@ class StateSetOverrideGLTest {
assertEquals(GL11.GL_ONE, vanillaAfter.getSrcAlpha(), "vanilla shadow src alpha restored");
assertEquals(GL11.GL_ZERO, vanillaAfter.getDstAlpha(), "vanilla shadow dst alpha restored");
- assertEquals(liveEnabledBefore, GLStateManager.getBlendMode().isEnabled(), "live overridden enable left untouched by the bracket");
- assertEquals(liveBefore.getSrcRgb(), GLStateManager.getBlendState().getSrcRgb(), "live overridden src rgb left untouched");
- assertEquals(liveBefore.getDstRgb(), GLStateManager.getBlendState().getDstRgb(), "live overridden dst rgb left untouched");
- assertEquals(liveBefore.getSrcAlpha(), GLStateManager.getBlendState().getSrcAlpha(), "live overridden src alpha left untouched");
- assertEquals(liveBefore.getDstAlpha(), GLStateManager.getBlendState().getDstAlpha(), "live overridden dst alpha left untouched");
+ assertEquals(liveEnabledBefore, GLSMBlend.getBlendMode().isEnabled(), "live overridden enable left untouched by the bracket");
+ assertEquals(liveBefore.getSrcRgb(), GLSMBlend.getBlendState().getSrcRgb(), "live overridden src rgb left untouched");
+ assertEquals(liveBefore.getDstRgb(), GLSMBlend.getBlendState().getDstRgb(), "live overridden dst rgb left untouched");
+ assertEquals(liveBefore.getSrcAlpha(), GLSMBlend.getBlendState().getSrcAlpha(), "live overridden src alpha left untouched");
+ assertEquals(liveBefore.getDstAlpha(), GLSMBlend.getBlendState().getDstAlpha(), "live overridden dst alpha left untouched");
}
@Test
void alphaBracketUnderOverrideRestoresVanillaShadowAndLeavesLiveStateUntouched() {
overrideVanillaAlpha();
- final boolean liveEnabledBefore = GLStateManager.getAlphaTest().isEnabled();
- final int liveFuncBefore = GLStateManager.getAlphaState().getFunction();
- final float liveRefBefore = GLStateManager.getAlphaState().getReference();
+ final boolean liveEnabledBefore = GLSMDepthStencilAlpha.getAlphaTest().isEnabled();
+ final int liveFuncBefore = GLSMDepthStencilAlpha.getAlphaState().getFunction();
+ final float liveRefBefore = GLSMDepthStencilAlpha.getAlphaState().getReference();
- final int d = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f);
+ final int d = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f);
final int[] calls = { 0 };
final AlphaState shadow = new AlphaState();
listener = () -> {
calls[0]++;
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction());
- assertEquals(0.25f, GLStateManager.getAlphaState().getReference());
- assertTrue(GLStateManager.isEffectiveAlphaTestEnabled());
- assertEquals(GL11.GL_GREATER, GLStateManager.getEffectiveAlphaState(shadow).getFunction());
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction());
+ assertEquals(0.25f, GLSMDepthStencilAlpha.getAlphaState().getReference());
+ assertTrue(GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled());
+ assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getEffectiveAlphaState(shadow).getFunction());
assertEquals(0.5f, shadow.getReference());
};
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
assertEquals(1, calls[0]);
assertTrue(AlphaTestStorage.ENABLE_LAYER.getVanilla(), "vanilla shadow enable restored to the pre-bracket value");
@@ -181,31 +185,31 @@ class StateSetOverrideGLTest {
assertEquals(GL11.GL_GREATER, vanillaAfter.getFunction(), "vanilla shadow func restored");
assertEquals(0.5f, vanillaAfter.getReference(), 0.0001f, "vanilla shadow ref restored");
- assertEquals(liveEnabledBefore, GLStateManager.getAlphaTest().isEnabled(), "live overridden enable left untouched by the bracket");
- assertEquals(liveFuncBefore, GLStateManager.getAlphaState().getFunction(), "live overridden func left untouched");
- assertEquals(liveRefBefore, GLStateManager.getAlphaState().getReference(), 0.0001f, "live overridden ref left untouched");
+ assertEquals(liveEnabledBefore, GLSMDepthStencilAlpha.getAlphaTest().isEnabled(), "live overridden enable left untouched by the bracket");
+ assertEquals(liveFuncBefore, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "live overridden func left untouched");
+ assertEquals(liveRefBefore, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "live overridden ref left untouched");
}
@Test
void masksBracketUnderOverrideRestoresVanillaShadowAndLeavesLiveStateUntouched() {
VanillaLayerRig.installDepthColor();
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, false, true, false);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, false, true, false);
DepthColorStorage.disableDepthColor();
- final boolean liveMaskBefore = GLStateManager.getDepthState().isEnabled();
- final ColorMask liveColorBefore = new ColorMask().set(GLStateManager.getColorMask());
+ final boolean liveMaskBefore = GLSMDepthStencilAlpha.getDepthState().isEnabled();
+ final ColorMask liveColorBefore = new ColorMask().set(GLSMBlend.getColorMask());
final boolean driverDepthBefore = GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK);
final boolean[] driverColorBefore = driverColorMask();
assertFalse(driverDepthBefore, "driver depth mask carries the held-off value");
assertFalse(driverColorBefore[0] || driverColorBefore[1] || driverColorBefore[2] || driverColorBefore[3], "driver color mask carries the held-off value");
- final int d = GLStateManager.pushState(StateSet.MASKS);
- GLStateManager.glDepthMask(false);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.MASKS);
+ GLSMDepthStencilAlpha.glDepthMask(false);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMAttribStack.popStateTo(d);
assertEquals(driverDepthBefore, GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth mask left untouched by the bracket");
assertArrayEquals(driverColorBefore, driverColorMask(), "driver color mask left untouched by the bracket");
@@ -221,11 +225,11 @@ class StateSetOverrideGLTest {
assertTrue(vanillaColorAfter.blue, "vanilla shadow color blue restored");
assertFalse(vanillaColorAfter.alpha, "vanilla shadow color alpha restored");
- assertEquals(liveMaskBefore, GLStateManager.getDepthState().isEnabled(), "live overridden depth mask left untouched by the bracket");
- assertEquals(liveColorBefore.red, GLStateManager.getColorMask().red, "live overridden color red left untouched");
- assertEquals(liveColorBefore.green, GLStateManager.getColorMask().green, "live overridden color green left untouched");
- assertEquals(liveColorBefore.blue, GLStateManager.getColorMask().blue, "live overridden color blue left untouched");
- assertEquals(liveColorBefore.alpha, GLStateManager.getColorMask().alpha, "live overridden color alpha left untouched");
+ assertEquals(liveMaskBefore, GLSMDepthStencilAlpha.getDepthState().isEnabled(), "live overridden depth mask left untouched by the bracket");
+ assertEquals(liveColorBefore.red, GLSMBlend.getColorMask().red, "live overridden color red left untouched");
+ assertEquals(liveColorBefore.green, GLSMBlend.getColorMask().green, "live overridden color green left untouched");
+ assertEquals(liveColorBefore.blue, GLSMBlend.getColorMask().blue, "live overridden color blue left untouched");
+ assertEquals(liveColorBefore.alpha, GLSMBlend.getColorMask().alpha, "live overridden color alpha left untouched");
}
@Test
@@ -235,35 +239,35 @@ class StateSetOverrideGLTest {
final boolean vanillaEnabledBefore = BlendModeStorage.ENABLE_LAYER.getVanilla();
final BlendState vanillaBefore = new BlendState();
BlendModeStorage.FUNC_LAYER.readVanilla(vanillaBefore);
- final boolean liveEnabledBefore = GLStateManager.getBlendMode().isEnabled();
- final BlendState liveBefore = new BlendState().set(GLStateManager.getBlendState());
+ final boolean liveEnabledBefore = GLSMBlend.getBlendMode().isEnabled();
+ final BlendState liveBefore = new BlendState().set(GLSMBlend.getBlendState());
- final int d = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.popStateTo(d);
+ final int d = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMAttribStack.popStateTo(d);
assertEquals(vanillaEnabledBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "untouched bracket leaves the vanilla enable shadow intact");
final BlendState vanillaAfter = new BlendState();
BlendModeStorage.FUNC_LAYER.readVanilla(vanillaAfter);
assertEquals(vanillaBefore.getSrcRgb(), vanillaAfter.getSrcRgb(), "untouched bracket leaves the vanilla func shadow intact");
- assertEquals(liveEnabledBefore, GLStateManager.getBlendMode().isEnabled(), "untouched bracket leaves the live overridden enable intact");
- assertEquals(liveBefore.getSrcRgb(), GLStateManager.getBlendState().getSrcRgb(), "untouched bracket leaves the live overridden func intact");
+ assertEquals(liveEnabledBefore, GLSMBlend.getBlendMode().isEnabled(), "untouched bracket leaves the live overridden enable intact");
+ assertEquals(liveBefore.getSrcRgb(), GLSMBlend.getBlendState().getSrcRgb(), "untouched bracket leaves the live overridden func intact");
}
@Test
void overrideAcquiredMidBracket() {
VanillaLayerRig.installAlpha();
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
- final int d = GLStateManager.pushState(StateSet.ALPHA);
+ final int d = GLSMAttribStack.pushState(StateSet.ALPHA);
AlphaTestStorage.overrideAlphaTest(new AlphaTest(AlphaTestFunction.LEQUAL, 0.25f));
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction(), "the override value is visible live immediately after acquiring mid-bracket");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "the override value is visible live immediately after acquiring mid-bracket");
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction(), "the live cache still shows the override value after pop: the vanilla-layer-aware restore writes the pre-bracket baseline into the vanilla shadow, not the live cache, while the override is held");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "the live cache still shows the override value after pop: the vanilla-layer-aware restore writes the pre-bracket baseline into the vanilla shadow, not the live cache, while the override is held");
final AlphaState vanillaAfter = new AlphaState();
AlphaTestStorage.FUNC_LAYER.readVanilla(vanillaAfter);
assertEquals(GL11.GL_GREATER, vanillaAfter.getFunction(), "the vanilla shadow is restored to the pre-bracket baseline by the bracket pop");
@@ -275,18 +279,18 @@ class StateSetOverrideGLTest {
void overrideReleasedMidBracket() {
overrideVanillaAlpha();
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction(), "the override value is visible live before the bracket opens");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "the override value is visible live before the bracket opens");
- final int d = GLStateManager.pushState(StateSet.ALPHA);
+ final int d = GLSMAttribStack.pushState(StateSet.ALPHA);
AlphaTestStorage.restoreAlphaTest();
- assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "releasing mid-bracket writes the vanilla value back through the live path immediately");
+ assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "releasing mid-bracket writes the vanilla value back through the live path immediately");
- GLStateManager.glAlphaFunc(GL11.GL_NEVER, 0.9f);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_NEVER, 0.9f);
- GLStateManager.popStateTo(d);
+ GLSMAttribStack.popStateTo(d);
- assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "once released, the bracket pop restores the live cache to the vanilla baseline captured at push time through the vanilla-layer-aware slot, proving the pop actually acted rather than the assertion coincidentally already holding");
+ assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "once released, the bracket pop restores the live cache to the vanilla baseline captured at push time through the vanilla-layer-aware slot, proving the pop actually acted rather than the assertion coincidentally already holding");
}
@Test
@@ -295,41 +299,41 @@ class StateSetOverrideGLTest {
final boolean vanillaBefore = BlendModeStorage.ENABLE_LAYER.getVanilla();
- final int outer = GLStateManager.pushState(StateSet.BLEND);
- GLStateManager.pushState(StateSet.CULL);
+ final int outer = GLSMAttribStack.pushState(StateSet.BLEND);
+ GLSMAttribStack.pushState(StateSet.CULL);
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
assertNotEquals(vanillaBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "the defer branch changes the vanilla shadow immediately");
- GLStateManager.popState();
+ GLSMAttribStack.popState();
assertNotEquals(vanillaBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "a non-member bracket pop does not restore the change, it carries to the parent");
- GLStateManager.popStateTo(outer);
+ GLSMAttribStack.popStateTo(outer);
assertEquals(vanillaBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "the enclosing member bracket pop restores the change that carried through the non-member pop");
}
@Test
void functionEnableAndCombinedRestorationPostExactlyOnce() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
for (int changes = 1; changes <= 3; changes++) {
- final int depth = GLStateManager.pushState(StateSet.ALPHA);
- if ((changes & 1) != 0) GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.25f);
- if ((changes & 2) != 0) GLStateManager.disableAlphaTest();
+ final int depth = GLSMAttribStack.pushState(StateSet.ALPHA);
+ if ((changes & 1) != 0) GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.25f);
+ if ((changes & 2) != 0) GLSMDepthStencilAlpha.disableAlphaTest();
final int[] calls = { 0 };
listener = () -> {
calls[0]++;
- assertFalse(GLStateManager.isPoppingAttributes());
- assertEquals(depth, GLStateManager.getAttribDepth());
- assertTrue(GLStateManager.getAlphaTest().isEnabled());
- assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction());
- assertEquals(0.5f, GLStateManager.getAlphaState().getReference());
- final int nested = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.popStateTo(nested);
+ assertFalse(GLSMAttribStack.isPoppingAttributes());
+ assertEquals(depth, GLSMAttribStack.getAttribDepth());
+ assertTrue(GLSMDepthStencilAlpha.getAlphaTest().isEnabled());
+ assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction());
+ assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference());
+ final int nested = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMAttribStack.popStateTo(nested);
};
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
assertEquals(1, calls[0]);
listener = null;
}
@@ -337,56 +341,56 @@ class StateSetOverrideGLTest {
@Test
void unchangedAndNonmemberPopsDoNotPostAndOuterMemberDoes() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
final int[] calls = { 0 };
listener = () -> calls[0]++;
- final int outer = GLStateManager.pushState(StateSet.ALPHA);
- final int unchanged = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.popStateTo(unchanged);
+ final int outer = GLSMAttribStack.pushState(StateSet.ALPHA);
+ final int unchanged = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMAttribStack.popStateTo(unchanged);
assertEquals(0, calls[0]);
- final int inner = GLStateManager.pushState(StateSet.CULL);
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.25f);
+ final int inner = GLSMAttribStack.pushState(StateSet.CULL);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.25f);
calls[0] = 0;
- GLStateManager.popStateTo(inner);
+ GLSMAttribStack.popStateTo(inner);
assertEquals(0, calls[0]);
- GLStateManager.popStateTo(outer);
+ GLSMAttribStack.popStateTo(outer);
assertEquals(1, calls[0]);
}
@Test
void dynamicUniformsUpdateWithoutRebindingAndAfterProgramRestoration() {
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f);
program = createProgram();
otherProgram = createProgram();
- GLStateManager.glUseProgram(program);
- final int referenceLocation = GLStateManager.glGetUniformLocation(program, "alphaReference");
- final int functionLocation = GLStateManager.glGetUniformLocation(program, "alphaFunction");
+ GLSMPrograms.glUseProgram(program);
+ final int referenceLocation = GLSMPrograms.glGetUniformLocation(program, "alphaReference");
+ final int functionLocation = GLSMPrograms.glGetUniformLocation(program, "alphaFunction");
Reflect.setStatic(ProgramUniforms.class, "active", ProgramUniforms.builder("alpha", program).buildUniforms());
final Runnable[] updates = new Runnable[2];
- final FloatUniform reference = newFloatUniform(referenceLocation, () -> GLStateManager.getAlphaState().getReference(), update -> updates[0] = update);
- final IntUniform function = newIntUniform(functionLocation, () -> GLStateManager.getAlphaState().getFunction(), update -> updates[1] = update);
+ final FloatUniform reference = newFloatUniform(referenceLocation, () -> GLSMDepthStencilAlpha.getAlphaState().getReference(), update -> updates[0] = update);
+ final IntUniform function = newIntUniform(functionLocation, () -> GLSMDepthStencilAlpha.getAlphaState().getFunction(), update -> updates[1] = update);
reference.update();
function.update();
listener = () -> {
- assertEquals(program, GLStateManager.getActiveProgram());
+ assertEquals(program, GLSMPrograms.getActiveProgram());
assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- assertFalse(GLStateManager.isPoppingAttributes());
+ assertFalse(GLSMAttribStack.isPoppingAttributes());
updates[0].run();
updates[1].run();
};
- final int depth = GLStateManager.pushState(StateSet.ALPHA);
- GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.25f);
+ final int depth = GLSMAttribStack.pushState(StateSet.ALPHA);
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.25f);
assertUniforms(referenceLocation, functionLocation, 0.25f, GL11.GL_LESS);
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
assertUniforms(referenceLocation, functionLocation, 0.5f, GL11.GL_GREATER);
- final int saved = GLStateManager.pushState(StateSet.FONT);
- GLStateManager.disableAlphaTest();
- GLStateManager.glUseProgram(otherProgram);
- GLStateManager.popStateTo(saved);
- assertTrue(GLStateManager.getAlphaTest().isEnabled());
- assertEquals(program, GLStateManager.getActiveProgram());
+ final int saved = GLSMAttribStack.pushState(StateSet.FONT);
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMPrograms.glUseProgram(otherProgram);
+ GLSMAttribStack.popStateTo(saved);
+ assertTrue(GLSMDepthStencilAlpha.getAlphaTest().isEnabled());
+ assertEquals(program, GLSMPrograms.getActiveProgram());
}
private void assertUniforms(int referenceLocation, int functionLocation, float reference, int function) {
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java
index 5e82d52e6..7a84aed2e 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java
@@ -5,7 +5,17 @@ import com.gtnewhorizons.angelica.api.tesr.TesrMaterial;
import com.gtnewhorizons.angelica.api.tesr.TesrShaders;
import com.gtnewhorizons.angelica.compat.mojang.RenderLayer;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.StateSet;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
@@ -65,16 +75,16 @@ class TesrLayerStateTest {
@BeforeEach
void liveState() {
- GLStateManager.disableFog();
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.enableDepthTest();
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.disableBlend();
- GLStateManager.enableCull();
- GLStateManager.enableLighting();
+ GLSMFog.disableFog();
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMDepthStencilAlpha.enableDepthTest();
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMBlend.disableBlend();
+ GLSMRasterizer.enableCull();
+ GLSMLighting.enableLighting();
}
@AfterEach
@@ -85,22 +95,22 @@ class TesrLayerStateTest {
ModelPartBatcher.INSTANCE.clear();
TesrShaderPrograms.invalidateAll();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
final ShaderManager ffp = ShaderManager.getInstance();
if (ffp.isActive()) ffp.deactivate();
- GLStateManager.disableBlend();
- GLStateManager.disableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0f);
- GLStateManager.glDepthFunc(GL11.GL_LESS);
- GLStateManager.glDepthMask(true);
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glDisable(GL11.GL_TEXTURE_2D);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.disableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS);
+ GLSMDepthStencilAlpha.glDepthMask(true);
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMEnable.glDisable(GL11.GL_TEXTURE_2D);
}
private static void assertDriverColorMask(boolean expected) {
@@ -117,9 +127,9 @@ class TesrLayerStateTest {
@ValueSource(booleans = { false, true })
void batchBracketRestoresCallerDepthAfterGlint(boolean held) {
for (boolean enabled : new boolean[] { true, false }) {
- GLStateManager.getDepthTest().setEnabled(enabled);
- GLStateManager.glDepthFunc(GL11.GL_GREATER);
- final int depth = GLStateManager.pushState(StateSet.BATCH);
+ GLSMDepthStencilAlpha.getDepthTest().setEnabled(enabled);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_GREATER);
+ final int depth = GLSMAttribStack.pushState(StateSet.BATCH);
final RenderLayer base = layer(EntityMaterials.DROPPED_ITEM_CUTOUT);
final RenderLayer glint = layer(held ? EntityMaterials.ITEM_GLINT : EntityMaterials.GLINT);
base.startDrawing();
@@ -130,15 +140,15 @@ class TesrLayerStateTest {
assertSame(SpecialCondition.GLINT, GbufferPrograms.getSpecialCondition());
glint.endDrawing();
assertNull(GbufferPrograms.getSpecialCondition());
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
assertDepth(enabled, GL11.GL_GREATER);
}
}
private static void assertDepth(boolean enabled, int function) {
- assertEquals(enabled, GLStateManager.getDepthTest().isEnabled(), "cached depth enable");
+ assertEquals(enabled, GLSMDepthStencilAlpha.getDepthTest().isEnabled(), "cached depth enable");
assertEquals(enabled, GL11.glIsEnabled(GL11.GL_DEPTH_TEST), "driver depth enable");
- assertEquals(function, GLStateManager.getDepthState().getFunc(), "cached depth function");
+ assertEquals(function, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cached depth function");
assertEquals(function, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth function");
}
@@ -146,16 +156,16 @@ class TesrLayerStateTest {
@ValueSource(booleans = { false, true })
void skippedDroppedGlintPreservesDepthMaskAndTextureMatrix(boolean depthWrite) {
final Matrix4f textureMatrix = new Matrix4f().translation(0.13f, 0.27f, 0);
- GLStateManager.setTextureMatrix(0, textureMatrix);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glDepthMask(depthWrite);
- GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
+ GLSMMatrices.setTextureMatrix(0, textureMatrix);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMDepthStencilAlpha.glDepthMask(depthWrite);
+ GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO);
SkippedGlintBlock.applyDroppedItemExitState();
- assertEquals(depthWrite, GLStateManager.isEffectiveDepthMaskEnabled());
- assertEquals(textureMatrix, GLStateManager.getTextures().getTextureUnitMatrix(0));
- assertEquals(GL11.GL_MODELVIEW, GLStateManager.getMatrixMode().getMode());
- assertEquals(GL11.GL_SRC_COLOR, GLStateManager.getBlendState().getSrcAlpha(), "dropped glint blends alpha like color, unlike held");
- assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getDstAlpha());
+ assertEquals(depthWrite, GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled());
+ assertEquals(textureMatrix, GLSMTextures.getTextures().getTextureUnitMatrix(0));
+ assertEquals(GL11.GL_MODELVIEW, GLSMMatrices.getMatrixMode().getMode());
+ assertEquals(GL11.GL_SRC_COLOR, GLSMBlend.getBlendState().getSrcAlpha(), "dropped glint blends alpha like color, unlike held");
+ assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getDstAlpha());
}
@Test
@@ -196,62 +206,62 @@ class TesrLayerStateTest {
static Stream batchDrawCases() {
return Stream.of(
Arguments.of("texture matrix and iris override", (Supplier) () -> {
- GLStateManager.setTextureMatrix(0, new Matrix4f().translation(0.25f, 0f, 0f));
+ GLSMMatrices.setTextureMatrix(0, new Matrix4f().translation(0.25f, 0f, 0f));
GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.GLINT);
GbufferPrograms.pushOverridePhase(WorldRenderingPhase.TERRAIN_CUTOUT);
return new BatchScenario(
() -> {
- assertTrue(MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0)), "unit 0 texture matrix during batch draw");
+ assertTrue(MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0)), "unit 0 texture matrix during batch draw");
assertNull(GbufferPrograms.getSpecialCondition(), "special condition during batch draw");
assertNull(GbufferPrograms.getOverridePhase(), "override phase during batch draw");
},
() -> {
- assertEquals(0.25f, GLStateManager.getTextures().getTextureUnitMatrix(0).m30(), "caller texture matrix restored");
+ assertEquals(0.25f, GLSMTextures.getTextures().getTextureUnitMatrix(0).m30(), "caller texture matrix restored");
assertEquals(SpecialCondition.GLINT, GbufferPrograms.getSpecialCondition(), "caller special condition restored");
assertEquals(WorldRenderingPhase.TERRAIN_CUTOUT, GbufferPrograms.getOverridePhase(), "caller override phase restored");
},
() -> {
GbufferPrograms.popOverridePhase();
GbufferPrograms.teardownSpecialRenderCondition();
- GLStateManager.setTextureMatrix(0, new Matrix4f());
+ GLSMMatrices.setTextureMatrix(0, new Matrix4f());
});
}),
Arguments.of("foreign program and framebuffer", (Supplier) () -> {
final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
- final int framebuffer = GLStateManager.glGenFramebuffers();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ final int framebuffer = GLSMFramebuffer.glGenFramebuffers();
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
BatchDrawDefaults.capturePassFramebuffer();
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
- GLStateManager.glUseProgram(program);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
+ GLSMPrograms.glUseProgram(program);
return new BatchScenario(
() -> {
- assertEquals(0, GLStateManager.getActiveProgram(), "program during batch draw");
- assertEquals(0, GLStateManager.getDrawFramebuffer(), "framebuffer during batch draw");
+ assertEquals(0, GLSMPrograms.getActiveProgram(), "program during batch draw");
+ assertEquals(0, GLSMFramebuffer.getDrawFramebuffer(), "framebuffer during batch draw");
assertEquals(0, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver draw framebuffer during batch draw");
},
() -> {
- assertEquals(program, GLStateManager.getActiveProgram(), "caller program restored");
- assertEquals(framebuffer, GLStateManager.getDrawFramebuffer(), "caller framebuffer restored");
+ assertEquals(program, GLSMPrograms.getActiveProgram(), "caller program restored");
+ assertEquals(framebuffer, GLSMFramebuffer.getDrawFramebuffer(), "caller framebuffer restored");
assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "driver caller program restored");
assertEquals(framebuffer, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver caller framebuffer restored");
},
() -> {
- GLStateManager.glUseProgram(0);
- GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
- GLStateManager.glDeleteFramebuffers(framebuffer);
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glUseProgram(0);
+ GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
+ GLSMFramebuffer.glDeleteFramebuffers(framebuffer);
+ GLSMPrograms.glDeleteProgram(program);
});
}),
Arguments.of("filter from before an item renderer's blur window", (Supplier) () -> {
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
// What TextureUtil.func_152777_a(false, false, 1) does around an item render.
TextureUtilHooks.captureBoundFilterTexture();
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
return new BatchScenario(
() -> {
assertEquals(GL11.GL_LINEAR, TextureInfoCache.INSTANCE.getInfo(texture).getMinFilter(), "filter from before the window");
@@ -265,8 +275,8 @@ class TesrLayerStateTest {
},
() -> {
TextureUtilHooks.clearSavedFilterTexture();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(texture);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(texture);
});
}));
}
@@ -305,23 +315,23 @@ class TesrLayerStateTest {
@Test
void clockwiseFrontFaceIsStoredWithTheLayer() {
- GLStateManager.glCullFace(GL11.GL_BACK);
- GLStateManager.glFrontFace(GL11.GL_CW);
+ GLSMRasterizer.glCullFace(GL11.GL_BACK);
+ GLSMRasterizer.glFrontFace(GL11.GL_CW);
try {
final int cull = DrawState.liveCull();
assertEquals(DrawState.CULL_BACK | DrawState.FRONT_FACE_CLOCKWISE, cull);
final RenderLayer layer = RenderLayer.tesr(null, TesrMaterial.builder().build(), PassOverride.NONE, 0f, 0f, ShaderGlint.NO_TINT, cull, true, true);
- GLStateManager.glFrontFace(GL11.GL_CCW);
- final int depth = GLStateManager.pushState(StateSet.BATCH);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
+ final int depth = GLSMAttribStack.pushState(StateSet.BATCH);
layer.startDrawing();
- assertEquals(GL11.GL_CW, GLStateManager.getPolygonState().getFrontFace(), "cached front face");
+ assertEquals(GL11.GL_CW, GLSMRasterizer.getPolygonState().getFrontFace(), "cached front face");
assertEquals(GL11.GL_CW, GL11.glGetInteger(GL11.GL_FRONT_FACE), "driver front face");
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE), "cull stays on");
layer.endDrawing();
- GLStateManager.popStateTo(depth);
- assertEquals(GL11.GL_CCW, GLStateManager.getPolygonState().getFrontFace(), "front face restored by BATCH pop");
+ GLSMAttribStack.popStateTo(depth);
+ assertEquals(GL11.GL_CCW, GLSMRasterizer.getPolygonState().getFrontFace(), "front face restored by BATCH pop");
} finally {
- GLStateManager.glFrontFace(GL11.GL_CCW);
+ GLSMRasterizer.glFrontFace(GL11.GL_CCW);
}
}
@@ -395,11 +405,11 @@ class TesrLayerStateTest {
}
private static void drawInBatch(RenderLayer layer, boolean culled) {
- final int depth = GLStateManager.pushState(StateSet.BATCH);
+ final int depth = GLSMAttribStack.pushState(StateSet.BATCH);
layer.startDrawing();
assertEquals(culled, GL11.glIsEnabled(GL11.GL_CULL_FACE));
layer.endDrawing();
- GLStateManager.popStateTo(depth);
+ GLSMAttribStack.popStateTo(depth);
}
static Stream layerCaches() {
@@ -414,18 +424,18 @@ class TesrLayerStateTest {
@MethodSource("layerCaches")
void queuedCullingSplitsLayerCachesAndRestoresTheDrawCaller(String name, Function layerFor, TesrMaterial[] materials) {
for (TesrMaterial material : materials) {
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
final RenderLayer twoSided = layerFor.apply(material);
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
final RenderLayer culled = layerFor.apply(material);
assertNotSame(twoSided, culled, "the last-layer shortcut must include culling");
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
assertSame(twoSided, layerFor.apply(material), "the layer map must retain both states");
}
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
final RenderLayer twoSided = layerFor.apply(materials[0]);
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
final RenderLayer culled = layerFor.apply(materials[0]);
twoSided.startDrawing();
assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE));
@@ -433,15 +443,15 @@ class TesrLayerStateTest {
assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK));
twoSided.endDrawing();
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
drawInBatch(twoSided, false);
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE));
- GLStateManager.disableCull();
+ GLSMRasterizer.disableCull();
drawInBatch(culled, true);
assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE));
- GLStateManager.enableCull();
+ GLSMRasterizer.enableCull();
drawInBatch(layerFor.apply(TesrMaterial.builder().noCull().build()), false);
assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE));
}
@@ -449,21 +459,21 @@ class TesrLayerStateTest {
static Stream axisCases() {
return Stream.of(
Arguments.of("current state over a dirty caller", (Runnable) () -> {
- GLStateManager.disableCull();
- GLStateManager.glCullFace(GL11.GL_FRONT);
- GLStateManager.disableLighting();
- GLStateManager.glColorMask(false, false, false, false);
+ GLSMRasterizer.disableCull();
+ GLSMRasterizer.glCullFace(GL11.GL_FRONT);
+ GLSMLighting.disableLighting();
+ GLSMBlend.glColorMask(false, false, false, false);
}, TesrMaterial.CURRENT_STATE, (Runnable) () -> {
- assertFalse(GLStateManager.getAlphaTest().isEnabled(), "no cutout");
- assertTrue(GLStateManager.getDepthTest().isEnabled(), "depth test");
- assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc());
- assertTrue(GLStateManager.getDepthState().isEnabled(), "depth write");
- assertFalse(GLStateManager.getBlendMode().isEnabled(), "opaque");
- assertTrue(GLStateManager.getCullState().isEnabled(), "cull pinned on");
- assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cull face pinned to back");
- assertTrue(GLStateManager.getLightingState().isEnabled(), "lit");
- assertTrue(GLStateManager.getColorMask().red, "color mask pinned on");
- assertFalse(GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "no polygon offset");
+ assertFalse(GLSMDepthStencilAlpha.getAlphaTest().isEnabled(), "no cutout");
+ assertTrue(GLSMDepthStencilAlpha.getDepthTest().isEnabled(), "depth test");
+ assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc());
+ assertTrue(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "depth write");
+ assertFalse(GLSMBlend.getBlendMode().isEnabled(), "opaque");
+ assertTrue(GLSMRasterizer.getCullState().isEnabled(), "cull pinned on");
+ assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cull face pinned to back");
+ assertTrue(GLSMLighting.getLightingState().isEnabled(), "lit");
+ assertTrue(GLSMBlend.getColorMask().red, "color mask pinned on");
+ assertFalse(GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "no polygon offset");
assertTrue(GL11.glIsEnabled(GL11.GL_DEPTH_TEST), "driver depth test");
assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func");
assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth write");
@@ -475,15 +485,15 @@ class TesrLayerStateTest {
}),
Arguments.of("every material toggle", (Runnable) () -> { },
TesrMaterial.builder().noCull().unlit().noDepthWrite().cutout(0.5f).translucent().depthEqual().build(), (Runnable) () -> {
- assertFalse(GLStateManager.getCullState().isEnabled(), "noCull");
- assertFalse(GLStateManager.getLightingState().isEnabled(), "unlit");
- assertFalse(GLStateManager.getDepthState().isEnabled(), "noDepthWrite");
- assertTrue(GLStateManager.getAlphaTest().isEnabled(), "cutout");
- assertEquals(0.5f, GLStateManager.getAlphaState().getReference(), "cutout threshold");
- assertTrue(GLStateManager.getBlendMode().isEnabled(), "translucent");
- assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb());
- assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLStateManager.getBlendState().getDstRgb());
- assertEquals(GL11.GL_EQUAL, GLStateManager.getDepthState().getFunc(), "depthEqual");
+ assertFalse(GLSMRasterizer.getCullState().isEnabled(), "noCull");
+ assertFalse(GLSMLighting.getLightingState().isEnabled(), "unlit");
+ assertFalse(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "noDepthWrite");
+ assertTrue(GLSMDepthStencilAlpha.getAlphaTest().isEnabled(), "cutout");
+ assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference(), "cutout threshold");
+ assertTrue(GLSMBlend.getBlendMode().isEnabled(), "translucent");
+ assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb());
+ assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLSMBlend.getBlendState().getDstRgb());
+ assertEquals(GL11.GL_EQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "depthEqual");
assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE), "driver noCull");
assertFalse(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver noDepthWrite");
assertTrue(GL11.glIsEnabled(GL11.GL_BLEND), "driver translucent");
@@ -504,15 +514,15 @@ class TesrLayerStateTest {
static Stream effectiveStateCases() {
return Stream.of(
Arguments.of("alpha test", (Runnable) () -> {
- GLStateManager.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER);
- GLStateManager.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER);
+ GLSMDepthStencilAlpha.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER);
+ GLSMDepthStencilAlpha.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER);
- GLStateManager.disableBlend();
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMBlend.disableBlend();
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
AlphaTestStorage.overrideAlphaTest(null);
@@ -520,29 +530,29 @@ class TesrLayerStateTest {
assertSame(EntityMaterials.DROPPED_ITEM_CUTOUT, EntityMaterials.itemFromCurrentState(true));
}),
Arguments.of("depth mask", (Runnable) () -> {
- GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
- GLStateManager.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER);
+ GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
+ GLSMBlend.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.enableBlend();
- GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMBlend.enableBlend();
+ GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
DepthColorStorage.disableDepthColor();
assertSame(EntityMaterials.TRANSLUCENT_DEPTH_WRITE, EntityMaterials.fromCurrentState(true), "raw depth mask held off by another pass; the effective vanilla mask must pick the depth-write variant");
}),
Arguments.of("color mask", (Runnable) () -> {
- GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
- GLStateManager.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER);
+ GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
+ GLSMBlend.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER);
- GLStateManager.glEnable(GL11.GL_TEXTURE_2D);
- GLStateManager.disableBlend();
- GLStateManager.enableAlphaTest();
- GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f);
- GLStateManager.glDepthFunc(GL11.GL_LEQUAL);
- GLStateManager.glDepthMask(true);
+ GLSMEnable.glEnable(GL11.GL_TEXTURE_2D);
+ GLSMBlend.disableBlend();
+ GLSMDepthStencilAlpha.enableAlphaTest();
+ GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f);
+ GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL);
+ GLSMDepthStencilAlpha.glDepthMask(true);
DepthColorStorage.disableDepthColor();
assertSame(EntityMaterials.CUTOUT, EntityMaterials.fromCurrentState(true), "raw color mask held off by another pass is not a depth-only draw");
@@ -568,48 +578,48 @@ class TesrLayerStateTest {
@Test
void memoTracksTextureModeOperationsOnUnitZero() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
final ShaderManager ffp = ShaderManager.getInstance();
ShaderManager.enable();
ffp.activate();
assertTrue(unitTexIdentity(), "a freshly loaded identity unit-0 matrix must read as identity");
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(0.3f, 0.1f, 0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(0.3f, 0.1f, 0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertFalse(unitTexIdentity(), "a translate in texture mode must stop reading as identity");
assertEquals(new Matrix4f().translation(0.3f, 0.1f, 0f), texMatrixScratch(), "the scratch copy must hold the unit-0 matrix once it stops being identity");
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPushMatrix();
- GLStateManager.glLoadIdentity();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPushMatrix();
+ GLSMMatrices.glLoadIdentity();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertTrue(unitTexIdentity(), "loadIdentity after a push must read as identity again");
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glPopMatrix();
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glPopMatrix();
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertFalse(unitTexIdentity(), "popping back to the earlier translate must stop reading as identity");
assertEquals(new Matrix4f().translation(0.3f, 0.1f, 0f), texMatrixScratch(), "pop must restore the memo to the popped matrix");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glTranslatef(0.5f, 0.5f, 0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glTranslatef(0.5f, 0.5f, 0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertFalse(unitTexIdentity(), "a unit-1 operation forces a recompute, but unit 0 itself is unchanged and stays non-identity");
assertEquals(new Matrix4f().translation(0.3f, 0.1f, 0f), texMatrixScratch(), "the recompute must copy unit 0, not the active unit 1");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glMatrixMode(GL11.GL_TEXTURE);
- GLStateManager.glLoadIdentity();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glTranslatef(0.5f, 0.5f, 0f);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE);
+ GLSMMatrices.glLoadIdentity();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMMatrices.glTranslatef(0.5f, 0.5f, 0f);
+ GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW);
assertTrue(unitTexIdentity(), "an identity unit 0 must read as identity while a non-identity unit 1 is active");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java
index 50739c9d1..857371661 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java
@@ -5,6 +5,11 @@ import com.gtnewhorizons.angelica.api.tesr.TesrShaderUniforms;
import com.gtnewhorizons.angelica.api.tesr.TesrShaders;
import com.gtnewhorizons.angelica.glsm.CompatUniformManager;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFog;
+import com.gtnewhorizons.angelica.glsm.GLSMLighting;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
@@ -115,16 +120,16 @@ class TesrShaderProgramsGLTest {
@AfterEach
void cleanup() {
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
TesrShaderPrograms.invalidateAll();
Reflect.setStatic(Minecraft.class, "theMinecraft", savedMinecraft);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0);
- GLStateManager.glDeleteTextures(lightmapTexture);
- GLStateManager.glDeleteTextures(otherTexture);
- GLStateManager.disableFog();
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0);
+ GLSMTextures.glDeleteTextures(lightmapTexture);
+ GLSMTextures.glDeleteTextures(otherTexture);
+ GLSMFog.disableFog();
final ShaderManager ffp = ShaderManager.getInstance();
if (ffp.isActive()) ffp.deactivate();
}
@@ -165,12 +170,12 @@ class TesrShaderProgramsGLTest {
assertNotEquals(0, entry.baked.program);
assertNotEquals(0, entry.instanced.program, "the first layer bind links the instanced variant too");
assertTrue(TesrShaderPrograms.instancedAvailable(entry));
- assertEquals(entry.baked.program, GLStateManager.getActiveProgram());
+ assertEquals(entry.baked.program, GLSMPrograms.getActiveProgram());
assertTrue(TesrShaderPrograms.bindInstanced(entry));
- assertEquals(entry.instanced.program, GLStateManager.getActiveProgram());
+ assertEquals(entry.instanced.program, GLSMPrograms.getActiveProgram());
TesrShaderPrograms.release(entry);
- assertEquals(0, GLStateManager.getActiveProgram(), "release restores the program bound before the layer");
+ assertEquals(0, GLSMPrograms.getActiveProgram(), "release restores the program bound before the layer");
assertTrue(TesrShaderPrograms.bindBaked(entry, false));
TesrShaderPrograms.release(entry);
@@ -181,14 +186,14 @@ class TesrShaderProgramsGLTest {
void linkWaitsWhileADisplayListRecords() {
final TesrShaderPrograms.Entry entry = entry(UNLIT_VERTEX, UNLIT_FRAGMENT, null);
final long failures = TesrShaderPrograms.linkFailures;
- final int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
+ final int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
try {
assertFalse(TesrShaderPrograms.bindBaked(entry, false), "a recording list would capture the link's program switches");
TesrShaderPrograms.release(entry);
} finally {
- GLStateManager.glEndList();
- GLStateManager.glDeleteLists(list, 1);
+ GLSMDraws.glEndList();
+ GLSMDraws.glDeleteLists(list, 1);
}
assertEquals(0, reads);
assertEquals(failures, TesrShaderPrograms.linkFailures, "the variants stay unlinked, not failed");
@@ -206,7 +211,7 @@ class TesrShaderProgramsGLTest {
final long fallbacks = TesrShaderPrograms.fallbacks;
assertFalse(TesrShaderPrograms.bindBaked(entry, false));
- assertEquals(0, GLStateManager.getActiveProgram(), "a failed bind leaves the emulation bound");
+ assertEquals(0, GLSMPrograms.getActiveProgram(), "a failed bind leaves the emulation bound");
TesrShaderPrograms.release(entry);
final int readsAfterFirstBind = reads;
assertFalse(TesrShaderPrograms.bindBaked(entry, false));
@@ -216,7 +221,7 @@ class TesrShaderProgramsGLTest {
assertEquals(2, TesrShaderPrograms.linkFailures - failures, "each variant reports its failure once, not per bind");
assertEquals(2, TesrShaderPrograms.fallbacks - fallbacks);
assertEquals(readsAfterFirstBind, reads, "a failed variant is not retried");
- assertEquals(0, GLStateManager.getActiveProgram());
+ assertEquals(0, GLSMPrograms.getActiveProgram());
}
@Test
@@ -225,11 +230,11 @@ class TesrShaderProgramsGLTest {
final long failures = TesrShaderPrograms.linkFailures;
assertTrue(TesrShaderPrograms.bindBaked(entry, false), "the baked variant still draws");
- assertEquals(entry.baked.program, GLStateManager.getActiveProgram());
+ assertEquals(entry.baked.program, GLSMPrograms.getActiveProgram());
assertFalse(TesrShaderPrograms.instancedAvailable(entry), "the body names a uniform only the baked variant declares");
assertEquals(1, TesrShaderPrograms.linkFailures - failures);
assertFalse(TesrShaderPrograms.bindInstanced(entry));
- assertEquals(entry.baked.program, GLStateManager.getActiveProgram(), "a failed instanced bind leaves the baked variant bound");
+ assertEquals(entry.baked.program, GLSMPrograms.getActiveProgram(), "a failed instanced bind leaves the baked variant bound");
TesrShaderPrograms.release(entry);
assertEquals(1, TesrShaderPrograms.linkFailures - failures, "a failed variant is not retried");
}
@@ -241,7 +246,7 @@ class TesrShaderProgramsGLTest {
final TesrShaderUniforms uniforms = new TesrShaderUniforms() {
@Override
public void angelica$linked(int program, boolean instanced) {
- assertEquals(program, GLStateManager.getActiveProgram(), "the variant is bound while locations resolve");
+ assertEquals(program, GLSMPrograms.getActiveProgram(), "the variant is bound while locations resolve");
linked[instanced ? 1 : 0]++;
}
@@ -277,26 +282,26 @@ class TesrShaderProgramsGLTest {
@Test
void lightmapBoundOnUnitOneAndRestored() {
final TesrShaderPrograms.Entry entry = entry(LIT_VERTEX, LIT_FRAGMENT, null);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
assertTrue(TesrShaderPrograms.bindBaked(entry, false));
- assertEquals(otherTexture, GLStateManager.getBoundTextureForServerState(1), "a layer without the lightmap flag leaves unit 1 alone");
+ assertEquals(otherTexture, GLSMTextures.getBoundTextureForServerState(1), "a layer without the lightmap flag leaves unit 1 alone");
TesrShaderPrograms.release(entry);
assertTrue(TesrShaderPrograms.bindBaked(entry, true));
- assertEquals(lightmapTexture, GLStateManager.getBoundTextureForServerState(1));
- assertEquals(0, GLStateManager.getActiveTextureUnit(), "the bind must not move the active unit");
+ assertEquals(lightmapTexture, GLSMTextures.getBoundTextureForServerState(1));
+ assertEquals(0, GLSMTextures.getActiveTextureUnit(), "the bind must not move the active unit");
assertEquals(1, uniformInt(entry.baked.program, TesrShaderPrelude.LIGHTMAP_SAMPLER));
assertTrue(TesrShaderPrograms.bindInstanced(entry));
- assertEquals(lightmapTexture, GLStateManager.getBoundTextureForServerState(1));
+ assertEquals(lightmapTexture, GLSMTextures.getBoundTextureForServerState(1));
TesrShaderPrograms.release(entry);
- assertEquals(otherTexture, GLStateManager.getBoundTextureForServerState(1), "release restores the caller's unit-1 texture");
- assertEquals(0, GLStateManager.getActiveTextureUnit());
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE1);
+ assertEquals(otherTexture, GLSMTextures.getBoundTextureForServerState(1), "release restores the caller's unit-1 texture");
+ assertEquals(0, GLSMTextures.getActiveTextureUnit());
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1);
assertEquals(otherTexture, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "the driver binding is restored too");
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
@Test
@@ -305,32 +310,32 @@ class TesrShaderProgramsGLTest {
assertTrue(TesrShaderPrograms.bindBaked(entry, false));
final int program = entry.baked.program;
- GLStateManager.disableFog();
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GLSMFog.disableFog();
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
refresh(program);
assertEquals(0, uniformInt(program, "angelica_FogMode"), "disabled fog is mode 0 whatever the fog function");
- GLStateManager.enableFog();
+ GLSMFog.enableFog();
refresh(program);
assertEquals(1, uniformInt(program, "angelica_FogMode"));
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
refresh(program);
assertEquals(2, uniformInt(program, "angelica_FogMode"));
- GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2);
+ GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2);
refresh(program);
assertEquals(3, uniformInt(program, "angelica_FogMode"));
- GLStateManager.disableFog();
+ GLSMFog.disableFog();
refresh(program);
assertEquals(0, uniformInt(program, "angelica_FogMode"));
- GLStateManager.glFogf(GL11.GL_FOG_START, 2f);
- GLStateManager.glFogf(GL11.GL_FOG_END, 10f);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 2f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 10f);
refresh(program);
final FloatBuffer params = BufferUtils.createFloatBuffer(4);
GL20.glGetUniform(program, GL20.glGetUniformLocation(program, "angelica_FogParams"), params);
assertEquals(-1f / 8f, params.get(0), 1e-6f, "a fog range change re-uploads the params");
TesrShaderPrograms.release(entry);
- GLStateManager.glFogf(GL11.GL_FOG_START, 0f);
- GLStateManager.glFogf(GL11.GL_FOG_END, 1f);
+ GLSMFog.glFogf(GL11.GL_FOG_START, 0f);
+ GLSMFog.glFogf(GL11.GL_FOG_END, 1f);
}
@Test
@@ -340,7 +345,7 @@ class TesrShaderProgramsGLTest {
final int program = entry.baked.program;
final FloatBuffer diffuse = BufferUtils.createFloatBuffer(4);
diffuse.put(0.25f).put(0.5f).put(0.75f).put(1f).flip();
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse);
refresh(program);
final int location = GL20.glGetUniformLocation(program, "angelica_LightSource[1].diffuse");
@@ -352,6 +357,6 @@ class TesrShaderProgramsGLTest {
TesrShaderPrograms.release(entry);
diffuse.clear();
diffuse.put(0f).put(0f).put(0f).put(1f).flip();
- GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse);
+ GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse);
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java
index fb96c567e..71312fc2f 100644
--- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java
+++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java
@@ -1,6 +1,7 @@
package com.gtnewhorizons.angelica.rendering.tesr;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
import com.gtnewhorizons.angelica.glsm.hooks.DeferredAlphaHandler;
import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler;
@@ -88,20 +89,20 @@ public final class VanillaLayerRig {
}
public static void installBlend() {
- GLStateManager.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER);
- GLStateManager.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER);
+ GLSMBlend.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER);
+ GLSMBlend.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER);
GLSMHooks.blendHandler = new RealBlendHandler();
}
public static void installAlpha() {
- GLStateManager.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER);
- GLStateManager.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER);
+ GLSMDepthStencilAlpha.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER);
+ GLSMDepthStencilAlpha.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER);
GLSMHooks.alphaHandler = new RealAlphaHandler();
}
public static void installDepthColor() {
- GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
- GLStateManager.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER);
+ GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER);
+ GLSMBlend.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER);
GLSMHooks.depthColorHandler = new RealDepthColorHandler();
}
@@ -112,12 +113,12 @@ public final class VanillaLayerRig {
}
public static void clear() {
- GLStateManager.getBlendMode().setVanillaLayer(null);
- GLStateManager.getBlendState().setVanillaLayer(null);
- GLStateManager.getAlphaTest().setVanillaLayer(null);
- GLStateManager.getAlphaState().setVanillaLayer(null);
- GLStateManager.getDepthState().setVanillaLayer(null);
- GLStateManager.getColorMask().setVanillaLayer(null);
+ GLSMBlend.getBlendMode().setVanillaLayer(null);
+ GLSMBlend.getBlendState().setVanillaLayer(null);
+ GLSMDepthStencilAlpha.getAlphaTest().setVanillaLayer(null);
+ GLSMDepthStencilAlpha.getAlphaState().setVanillaLayer(null);
+ GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(null);
+ GLSMBlend.getColorMask().setVanillaLayer(null);
GLSMHooks.blendHandler = null;
GLSMHooks.alphaHandler = null;
GLSMHooks.depthColorHandler = null;
diff --git a/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java b/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java
index 9d389f761..b62c9c7d5 100644
--- a/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.utils;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
import com.gtnewhorizons.angelica.glsm.recording.GLCommand;
import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite;
import org.junit.jupiter.api.Test;
@@ -60,21 +60,21 @@ class DisplayListTextureAnimationTest {
void cachedDrawMarksItsSpriteEveryFrame() {
final IPatchedTextureAtlasSprite sprite = mock(IPatchedTextureAtlasSprite.class);
for (int mode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
try {
- GLStateManager.glNewList(list, mode);
+ GLSMDraws.glNewList(list, mode);
for (int vertex = 0; vertex < 1000; vertex++) AnimationsRenderUtils.recordSpriteUsage(sprite);
- GLStateManager.glEndList();
+ GLSMDraws.glEndList();
assertEquals(1, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.COMPLEX_REF),
"repeated UV accesses should record only one notification");
for (int frame = 0; frame < 3; frame++) {
clearInvocations(sprite);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
verify(sprite).angelica$markNeedsAnimationUpdate();
}
} finally {
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
- GLStateManager.glDeleteLists(list, 1);
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
+ GLSMDraws.glDeleteLists(list, 1);
}
}
}
diff --git a/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java b/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java
index 749f8aee1..a3f33beef 100644
--- a/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java
+++ b/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java
@@ -3,7 +3,8 @@ package net.coderbot.iris.gl.program;
import com.google.common.collect.ImmutableSet;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
import com.gtnewhorizons.angelica.glsm.backend.RenderBackend;
@@ -35,55 +36,55 @@ class ProgramBindingRegressionTest {
final int caller = linkedProgram();
try {
for (int mode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) {
- final int list = GLStateManager.glGenLists(1);
+ final int list = GLSMDraws.glGenLists(1);
Program initialized = null;
- GLStateManager.glUseProgram(caller);
+ GLSMPrograms.glUseProgram(caller);
try {
- GLStateManager.glNewList(list, mode);
+ GLSMDraws.glNewList(list, mode);
initialized = ProgramBuilder.begin("fallback-test", vertex, null, fragment, ImmutableSet.of(0)).build();
assertEquals(mode == GL11.GL_COMPILE ? DisplayListManager.RecordMode.COMPILE
: DisplayListManager.RecordMode.COMPILE_AND_EXECUTE, DisplayListManager.getRecordMode());
- assertEquals(caller, GLStateManager.getActiveProgram());
+ assertEquals(caller, GLSMPrograms.getActiveProgram());
assertEquals(caller, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- GLStateManager.glEndList();
- final int location = GLStateManager.glGetUniformLocation(initialized.getProgramId(), "alphaTestRef");
+ GLSMDraws.glEndList();
+ final int location = GLSMPrograms.glGetUniformLocation(initialized.getProgramId(), "alphaTestRef");
assertNotEquals(-1, location);
final FloatBuffer value = BufferUtils.createFloatBuffer(4);
- GLStateManager.glGetUniform(initialized.getProgramId(), location, value);
+ GLSMPrograms.glGetUniform(initialized.getProgramId(), location, value);
assertEquals(-1f, value.get(0));
assertEquals(0, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.USE_PROGRAM));
- GLStateManager.glCallList(list);
- assertEquals(caller, GLStateManager.getActiveProgram());
+ GLSMDraws.glCallList(list);
+ assertEquals(caller, GLSMPrograms.getActiveProgram());
} finally {
- if (DisplayListManager.isRecording()) GLStateManager.glEndList();
- GLStateManager.glDeleteLists(list, 1);
+ if (DisplayListManager.isRecording()) GLSMDraws.glEndList();
+ GLSMDraws.glDeleteLists(list, 1);
if (initialized != null) initialized.destroy();
}
}
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(caller);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(caller);
}
}
@Test
void deletionBookkeepingRetainsOnlyDeferredDeletes() {
final int bound = linkedProgram();
- GLStateManager.glUseProgram(bound);
- GLStateManager.glDeleteProgram(bound);
- assertTrue(GLStateManager.isProgramPendingDeletion(bound));
+ GLSMPrograms.glUseProgram(bound);
+ GLSMPrograms.glDeleteProgram(bound);
+ assertTrue(GLSMPrograms.isProgramPendingDeletion(bound));
assertTrue(GL20.glIsProgram(bound), "driver keeps the bound program alive");
final int other = linkedProgram();
- GLStateManager.glUseProgram(other);
+ GLSMPrograms.glUseProgram(other);
for (int i = 0; i < 8; i++) {
- final int unused = GLStateManager.glCreateProgram();
- GLStateManager.glDeleteProgram(unused);
- assertFalse(GLStateManager.isProgramPendingDeletion(unused));
+ final int unused = GLSMPrograms.glCreateProgram();
+ GLSMPrograms.glDeleteProgram(unused);
+ assertFalse(GLSMPrograms.isProgramPendingDeletion(unused));
assertFalse(GL20.glIsProgram(unused), "driver deletes an unbound program immediately");
- assertFalse(GLStateManager.isProgramPendingDeletion(bound));
+ assertFalse(GLSMPrograms.isProgramPendingDeletion(bound));
}
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(other);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(other);
}
private static int linkedProgram() {
@@ -108,22 +109,22 @@ class ProgramBindingRegressionTest {
Reflect.setStaticFinal(Iris.class, "enabled", boolean.class, true);
try {
for (int i = 0; i < 3; i++) {
- GLStateManager.glUseProgram(other);
+ GLSMPrograms.glUseProgram(other);
program.use();
verify(uniforms, times(i + 1)).update();
assertFalse(Program.isManagedBind(id));
}
program.use(); // Cached binds must still update dynamic uniforms.
verify(uniforms, times(4)).update();
- GLStateManager.glUseProgram(other);
- GLStateManager.glUseProgram(id);
+ GLSMPrograms.glUseProgram(other);
+ GLSMPrograms.glUseProgram(id);
verify(uniforms, times(5)).update();
} finally {
Reflect.setStaticFinal(Iris.class, "enabled", boolean.class, enabled);
Reflect.set(manager, "pipeline", previous);
- GLStateManager.glUseProgram(0);
+ GLSMPrograms.glUseProgram(0);
program.destroy();
- GLStateManager.glDeleteProgram(other);
+ GLSMPrograms.glDeleteProgram(other);
}
}
@@ -131,44 +132,44 @@ class ProgramBindingRegressionTest {
void replayCachesValidityAndRevalidatesDeletionIncludingBoundPrograms() {
int id = linkedProgram();
int other = linkedProgram();
- int list = GLStateManager.glGenLists(1);
- GLStateManager.glNewList(list, GL11.GL_COMPILE);
- GLStateManager.glUseProgram(id);
- GLStateManager.glEndList();
+ int list = GLSMDraws.glGenLists(1);
+ GLSMDraws.glNewList(list, GL11.GL_COMPILE);
+ GLSMPrograms.glUseProgram(id);
+ GLSMDraws.glEndList();
RenderBackend original = BackendManager.RENDER_BACKEND;
RenderBackend backend = mock(RenderBackend.class, delegatesTo(original));
Reflect.setStaticFinal(BackendManager.class, "RENDER_BACKEND", RenderBackend.class, backend);
boolean idDeleted = false;
boolean otherDeleted = false;
try {
- for (int i = 0; i < 5; i++) GLStateManager.glCallList(list);
+ for (int i = 0; i < 5; i++) GLSMDraws.glCallList(list);
verify(backend, times(1)).isProgram(id);
- assertEquals(id, GLStateManager.getActiveProgram());
+ assertEquals(id, GLSMPrograms.getActiveProgram());
assertEquals(id, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- GLStateManager.glDeleteProgram(id);
+ GLSMPrograms.glDeleteProgram(id);
idDeleted = true;
- GLStateManager.glCallList(list); // Still valid while bound, but must not be cached.
- assertEquals(id, GLStateManager.getActiveProgram());
+ GLSMDraws.glCallList(list); // Still valid while bound, but must not be cached.
+ assertEquals(id, GLSMPrograms.getActiveProgram());
assertEquals(id, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM));
- GLStateManager.glUseProgram(other); // Completes deferred deletion.
- GLStateManager.glCallList(list);
- assertEquals(0, GLStateManager.getActiveProgram());
+ GLSMPrograms.glUseProgram(other); // Completes deferred deletion.
+ GLSMDraws.glCallList(list);
+ assertEquals(0, GLSMPrograms.getActiveProgram());
verify(backend, times(4)).isProgram(id);
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
verify(backend, times(4)).isProgram(id);
- GLStateManager.glDeleteProgram(other);
+ GLSMPrograms.glDeleteProgram(other);
otherDeleted = true;
- GLStateManager.glCallList(list);
+ GLSMDraws.glCallList(list);
verify(backend, times(5)).isProgram(id);
} finally {
Reflect.setStaticFinal(BackendManager.class, "RENDER_BACKEND", RenderBackend.class, original);
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteLists(list, 1);
+ GLSMPrograms.glUseProgram(0);
+ GLSMDraws.glDeleteLists(list, 1);
// FFP's glUseProgram(0) is lazy, so other stays current; deleting it again is GL_INVALID_OPERATION on macOS
- if (!idDeleted) GLStateManager.glDeleteProgram(id);
- if (!otherDeleted) GLStateManager.glDeleteProgram(other);
+ if (!idDeleted) GLSMPrograms.glDeleteProgram(id);
+ if (!otherDeleted) GLSMPrograms.glDeleteProgram(other);
}
}
}
diff --git a/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java b/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java
index 005ed689c..5c4b162eb 100644
--- a/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java
+++ b/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java
@@ -1,7 +1,7 @@
package net.coderbot.iris.pipeline;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
import com.gtnewhorizons.angelica.glsm.shader.ShaderType;
import net.coderbot.iris.gbuffer_overrides.matching.InputAvailability;
import net.coderbot.iris.gl.shader.GlShader;
@@ -102,10 +102,10 @@ class AttributeTransformerLinkGLTest {
final Map result = TransformPatcher.patchAttributesWideLines(COMPAT_VERTEX, null, null, null, COMPAT_FRAGMENT, InputAvailability.NONE);
final int program = link("wideLines", result);
try {
- assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_LineWidth"), () -> result.get(PatchShaderType.VERTEX));
- assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_ScreenSize"), () -> result.get(PatchShaderType.VERTEX));
+ assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_LineWidth"), () -> result.get(PatchShaderType.VERTEX));
+ assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_ScreenSize"), () -> result.get(PatchShaderType.VERTEX));
} finally {
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
}
}
@@ -115,17 +115,17 @@ class AttributeTransformerLinkGLTest {
final int program = link("coreProfileInputs", result);
try {
for (String input : new String[] {"vaPosition", "vaNormal", "vaColor", "vaUV2"}) {
- assertEquals(-1, GLStateManager.glGetAttribLocation(program, input), () -> input + " left unmapped:\n" + result.get(PatchShaderType.VERTEX));
+ assertEquals(-1, GLSMPrograms.glGetAttribLocation(program, input), () -> input + " left unmapped:\n" + result.get(PatchShaderType.VERTEX));
}
- assertEquals(0, GLStateManager.glGetAttribLocation(program, "iris_Vertex"));
- assertEquals(1, GLStateManager.glGetAttribLocation(program, "iris_Color"));
- assertEquals(4, GLStateManager.glGetAttribLocation(program, "iris_Normal"));
- assertEquals(-1, GLStateManager.glGetUniformLocation(program, "modelViewMatrix"));
- assertEquals(-1, GLStateManager.glGetUniformLocation(program, "projectionMatrix"));
- assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_ModelViewMatrix"));
- assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_ProjectionMatrix"));
+ assertEquals(0, GLSMPrograms.glGetAttribLocation(program, "iris_Vertex"));
+ assertEquals(1, GLSMPrograms.glGetAttribLocation(program, "iris_Color"));
+ assertEquals(4, GLSMPrograms.glGetAttribLocation(program, "iris_Normal"));
+ assertEquals(-1, GLSMPrograms.glGetUniformLocation(program, "modelViewMatrix"));
+ assertEquals(-1, GLSMPrograms.glGetUniformLocation(program, "projectionMatrix"));
+ assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_ModelViewMatrix"));
+ assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_ProjectionMatrix"));
} finally {
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glDeleteProgram(program);
}
}
}
diff --git a/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java b/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java
index e311281af..cbd176b2f 100644
--- a/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java
+++ b/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java
@@ -2,6 +2,16 @@ package net.coderbot.iris.pipeline;
import com.gtnewhorizons.angelica.glsm.EntityIdsOnlyHandler;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
+import com.gtnewhorizons.angelica.glsm.GLSMAttribStack;
+import com.gtnewhorizons.angelica.glsm.GLSMBlend;
+import com.gtnewhorizons.angelica.glsm.GLSMBuffers;
+import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs;
+import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMRasterizer;
+import com.gtnewhorizons.angelica.glsm.GLSMVertexInput;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.ffp.Instancing;
@@ -180,7 +190,7 @@ class IrisInstancingGLTest {
@BeforeEach
void setUp() {
TransformTestSupport.clearCaches();
- GLStateManager.disableBlend();
+ GLSMBlend.disableBlend();
}
@AfterEach
@@ -209,7 +219,7 @@ class IrisInstancingGLTest {
@Test
void settersDeferInsideASafeBatchWindowAndResolveWhenItCloses() {
final DeferredWorldRenderingPipeline pipeline = newPipeline(WorldRenderingPhase.ENTITIES, true);
- final long dc = GLStateManager.drawCalls;
+ final long dc = GLSMDraws.drawCalls;
BatchEligibility.begin(BatchEligibility.SAFE, dc);
BatchEligibility.begin(BatchEligibility.SAFE, dc);
@@ -252,7 +262,7 @@ class IrisInstancingGLTest {
final DeferredWorldRenderingPipeline pipeline = newPipeline(WorldRenderingPhase.ENTITIES, true);
Reflect.set(pipeline, "currentCondition", RenderCondition.ENTITIES);
- final long dc = GLStateManager.drawCalls;
+ final long dc = GLSMDraws.drawCalls;
BatchEligibility.begin(BatchEligibility.SAFE, dc);
pipeline.setInputs(InputAvailability.of(true, true));
assertSame(pipeline, GLSMHooks.pendingProgramSelection);
@@ -268,12 +278,12 @@ class IrisInstancingGLTest {
void rebindCurrentPassResolvesBeforeItsOwnNullPassFallback() {
final DeferredWorldRenderingPipeline pipeline = newPipeline(WorldRenderingPhase.ENTITIES, true);
- final int program = GLStateManager.glCreateProgram();
- GLStateManager.glUseProgram(program);
+ final int program = GLSMPrograms.glCreateProgram();
+ GLSMPrograms.glUseProgram(program);
// Never linked, so the driver rejects the bind; GLSM still tracks it as the active program.
assertEquals(GL11.GL_INVALID_OPERATION, GL11.glGetError());
try {
- final long dc = GLStateManager.drawCalls;
+ final long dc = GLSMDraws.drawCalls;
BatchEligibility.begin(BatchEligibility.SAFE, dc);
pipeline.setInputs(InputAvailability.of(true, true));
assertSame(pipeline, GLSMHooks.pendingProgramSelection);
@@ -284,8 +294,8 @@ class IrisInstancingGLTest {
BatchEligibility.end(BatchEligibility.SAFE, dc);
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
}
}
@@ -321,7 +331,7 @@ class IrisInstancingGLTest {
}
private static void link(String name, Map result) {
- GLStateManager.glDeleteProgram(linkProgram(name, result));
+ GLSMPrograms.glDeleteProgram(linkProgram(name, result));
}
@ParameterizedTest
@@ -344,21 +354,21 @@ class IrisInstancingGLTest {
final int program = linkProgram("entityTint", kind == Instancing.NONE
? TransformPatcher.patchAttributes(vertexSource, null, fragmentSource, TEX_LM)
: TransformPatcher.patchAttributesInstanced(vertexSource, null, null, null, fragmentSource, TEX_LM, false, kind));
- final int vao = GLStateManager.glGenVertexArrays();
- final int buffer = GLStateManager.glGenBuffers();
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ final int vao = GLSMVertexInput.glGenVertexArrays();
+ final int buffer = GLSMBuffers.glGenBuffers();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
try {
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glViewport(0, 0, 8, 8);
- GLStateManager.glUseProgram(program);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.glViewport(0, 0, 8, 8);
+ GLSMPrograms.glUseProgram(program);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
InstancedAttribs.pointHead(0, InstancedAttribs.HEAD_SIZE);
- GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_OVERLAY);
- GLStateManager.glVertexAttribDivisor(InstancedAttribs.LOC_OVERLAY, 1);
+ GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_OVERLAY);
+ GLSMVertexInput.glVertexAttribDivisor(InstancedAttribs.LOC_OVERLAY, 1);
final ByteBuffer data = BufferUtils.createByteBuffer(InstancedAttribs.HEAD_SIZE);
final var builder = ProgramUniforms.builder("entityTint", program);
builder.uniform4f("entityColor", state::getCurrentEntityColor, state.getEntityColorNotifier());
@@ -366,11 +376,11 @@ class IrisInstancingGLTest {
final Consumer checkPixel = expected -> {
for (Uniform uniform : uniforms) uniform.update();
data.putInt(InstancedAttribs.OFFSET_OVERLAY, AngelicaBufferSource.packEntityColor(state.getCurrentEntityColor()));
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
- GLStateManager.glClearColor(0, 0, 0, 1);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- if (kind == Instancing.NONE) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
- else GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ GLSMBlend.glClearColor(0, 0, 0, 1);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ if (kind == Instancing.NONE) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ else GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "draw error");
final int[] pixel = FfpFixture.readPixel(0, 0);
for (int channel = 0; channel < 4; channel++) {
@@ -385,13 +395,13 @@ class IrisInstancingGLTest {
checkPixel.accept(new int[] {0, 0, 255, 255});
} finally {
state.getEntityColorNotifier().setListener(null);
- GLStateManager.glUseProgram(0);
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteBuffers(buffer);
- GLStateManager.glDeleteVertexArrays(vao);
- GLStateManager.glDeleteProgram(program);
- GLStateManager.glPopAttrib();
+ GLSMPrograms.glUseProgram(0);
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(buffer);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
+ GLSMPrograms.glDeleteProgram(program);
+ GLSMAttribStack.glPopAttrib();
}
}
@@ -418,41 +428,41 @@ class IrisInstancingGLTest {
}
""";
final int[] ids = { -1, 0, 32767, 32768, 45020, 50020, 50072, 65534 };
- final int vao = GLStateManager.glGenVertexArrays();
- final int buffer = GLStateManager.glGenBuffers();
- GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
- GLStateManager.disableDepthTest();
- GLStateManager.disableCull();
- GLStateManager.glColorMask(true, true, true, true);
- GLStateManager.glViewport(0, 0, 8, 8);
+ final int vao = GLSMVertexInput.glGenVertexArrays();
+ final int buffer = GLSMBuffers.glGenBuffers();
+ GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GLSMDepthStencilAlpha.disableDepthTest();
+ GLSMRasterizer.disableCull();
+ GLSMBlend.glColorMask(true, true, true, true);
+ GLSMRasterizer.glViewport(0, 0, 8, 8);
try {
for (Instancing kind : new Instancing[] { Instancing.TEMPLATE, Instancing.CUBE }) {
final int program = linkProgram("highIds", TransformPatcher.patchAttributesInstanced(
vertexSource, null, null, null, fragmentSource, TEX_LM, false, kind));
try {
- GLStateManager.glUseProgram(program);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7);
- GLStateManager.glBindVertexArray(vao);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
+ GLSMPrograms.glUseProgram(program);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7);
+ GLSMVertexInput.glBindVertexArray(vao);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer);
InstancedAttribs.pointHead(0, InstancedAttribs.HEAD_SIZE);
- GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_ENTITY);
- GLStateManager.glVertexAttribDivisor(InstancedAttribs.LOC_ENTITY, 1);
+ GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_ENTITY);
+ GLSMVertexInput.glVertexAttribDivisor(InstancedAttribs.LOC_ENTITY, 1);
final ByteBuffer data = BufferUtils.createByteBuffer(InstancedAttribs.HEAD_SIZE);
for (int id : ids) {
data.putLong(InstancedAttribs.OFFSET_ENTITY, InstancedAttribs.packEntityInfo(id, id, id));
- GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "expectedId"), id);
- GLStateManager.glClearColor(0, 0, 0, 1);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1);
+ GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "expectedId"), id);
+ GLSMBlend.glClearColor(0, 0, 0, 1);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1);
assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "draw program");
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "draw error");
final int[] pixel = FfpFixture.readPixel(0, 0);
assertEquals(255, pixel[1], kind + " material ID " + id + " pixel " + Arrays.toString(pixel));
}
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
}
}
@@ -460,31 +470,31 @@ class IrisInstancingGLTest {
final ImmediateExtendedAttribHandler previousHandler = GLSMHooks.immediateExtendedHandler;
try {
EntityIdsOnlyHandler.install();
- GLStateManager.glUseProgram(program);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7);
- GLStateManager.glBindVertexArray(vao);
+ GLSMPrograms.glUseProgram(program);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7);
+ GLSMVertexInput.glBindVertexArray(vao);
for (int id : ids) {
- GLStateManager.setEntityIds(id, id, id);
- GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "expectedId"), id);
- GLStateManager.glClearColor(0, 0, 0, 1);
- GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT);
- GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
+ GLSMCurrentAttribs.setEntityIds(id, id, id);
+ GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "expectedId"), id);
+ GLSMBlend.glClearColor(0, 0, 0, 1);
+ GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT);
+ GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "draw error");
final int[] pixel = FfpFixture.readPixel(0, 0);
assertEquals(255, pixel[1], "immediate material ID " + id + " pixel " + Arrays.toString(pixel));
}
} finally {
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
GLSMHooks.immediateExtendedHandler = previousHandler;
- GLStateManager.setEntityIds(-1, 0, -1);
+ GLSMCurrentAttribs.setEntityIds(-1, 0, -1);
}
} finally {
- GLStateManager.glBindVertexArray(0);
- GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
- GLStateManager.glDeleteBuffers(buffer);
- GLStateManager.glDeleteVertexArrays(vao);
- GLStateManager.glPopAttrib();
+ GLSMVertexInput.glBindVertexArray(0);
+ GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
+ GLSMBuffers.glDeleteBuffers(buffer);
+ GLSMVertexInput.glDeleteVertexArrays(vao);
+ GLSMAttribStack.glPopAttrib();
}
}
@@ -512,6 +522,6 @@ class IrisInstancingGLTest {
}
private static void compile(int type, String source) {
- GLStateManager.glDeleteShader(GlTestSupport.compile(type, source));
+ GLSMPrograms.glDeleteShader(GlTestSupport.compile(type, source));
}
}
diff --git a/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java b/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java
index a925b1ebf..c239011d4 100644
--- a/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java
+++ b/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java
@@ -1,7 +1,8 @@
package net.coderbot.iris.pipeline;
import com.gtnewhorizons.angelica.glsm.GLCoreTest;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMPrograms;
+import com.gtnewhorizons.angelica.glsm.GLSMTextures;
import com.gtnewhorizons.angelica.glsm.GlTestSupport;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import com.gtnewhorizons.angelica.glsm.backend.BackendManager;
@@ -72,7 +73,7 @@ class PbrSamplerBindingGLTest {
BlockRenderingSettings.INSTANCE.setBreaksAnisotropy(false);
program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS,
TestPaths.readString("src/test/resources/assets/angelica/shaders/pbrSamplerBindingTest.fsh"));
- GLStateManager.glUseProgram(program);
+ GLSMPrograms.glUseProgram(program);
normal = texture();
specular = texture();
custom = texture();
@@ -82,20 +83,20 @@ class PbrSamplerBindingGLTest {
void tearDown() {
ProgramSamplers.clearActiveSamplers();
BlockRenderingSettings.INSTANCE.setBreaksAnisotropy(false);
- GLStateManager.glUseProgram(0);
- GLStateManager.glDeleteProgram(program);
- GLStateManager.glDeleteTextures(normal);
- GLStateManager.glDeleteTextures(specular);
- GLStateManager.glDeleteTextures(custom);
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
+ GLSMPrograms.glUseProgram(0);
+ GLSMPrograms.glDeleteProgram(program);
+ GLSMTextures.glDeleteTextures(normal);
+ GLSMTextures.glDeleteTextures(specular);
+ GLSMTextures.glDeleteTextures(custom);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
}
private static int texture() {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0);
- final int texture = GLStateManager.glGenTextures();
- GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
- GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
+ final int texture = GLSMTextures.glGenTextures();
+ GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
+ GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
return texture;
}
@@ -116,7 +117,7 @@ class PbrSamplerBindingGLTest {
}
private static int boundSampler(int unit) {
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit);
return GL11.glGetInteger(GL33.GL_SAMPLER_BINDING);
}
@@ -246,7 +247,7 @@ class PbrSamplerBindingGLTest {
assertNotEquals(0, boundSampler(5));
assertNotEquals(0, boundSampler(6));
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
switch (kind) {
case GRAPHICS -> Program.unbind();
case COMPUTE -> ComputeProgram.unbind();
@@ -268,7 +269,7 @@ class PbrSamplerBindingGLTest {
() -> { throw new IllegalStateException("Failed sampler lookup"); }, "specular");
final ProgramSamplers samplers = builder.build();
- GLStateManager.glActiveTexture(GL13.GL_TEXTURE2);
+ GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2);
assertThrows(IllegalStateException.class, samplers::update);
assertEquals(GL13.GL_TEXTURE2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE));
assertEquals(0, boundSampler(NORMAL_UNIT));
diff --git a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java
index 58192ecf8..4a8e5e157 100644
--- a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java
+++ b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java
@@ -1,5 +1,6 @@
package com.gtnewhorizons.umbra.mixins.early.glsm;
+import com.gtnewhorizons.angelica.glsm.GLSMEnable;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.hooks.FrameHooks;
@@ -39,7 +40,7 @@ public class MixinMinecraft_FrameHook {
at = @At(value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onRenderTickEnd(F)V", shift = At.Shift.AFTER, remap = false)
)
private void umbra$injectLightingFixPostRenderTick(CallbackInfo ci) {
- GLStateManager.glEnable(GL11.GL_LIGHTING);
+ GLSMEnable.glEnable(GL11.GL_LIGHTING);
}
@Inject(method = "runGameLoop", at = @At("RETURN"))
diff --git a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java
index 79ed12239..e05510829 100644
--- a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java
+++ b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java
@@ -10,7 +10,8 @@ import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.GLSMDraws;
+import com.gtnewhorizons.angelica.glsm.GLSMMatrices;
import net.minecraftforge.client.ForgeHooksClient;
@Mixin(WorldRenderer.class)
@@ -24,8 +25,8 @@ public class MixinWorldRenderer_VertexState {
// Can't get vertex state from DirectTessellator, draw and return
Tessellator.instance.draw();
ForgeHooksClient.onPostRenderWorld((WorldRenderer)(Object)this, pass);
- GLStateManager.glPopMatrix();
- GLStateManager.glEndList();
+ GLSMMatrices.glPopMatrix();
+ GLSMDraws.glEndList();
ci.cancel();
}
}