From 37717bd4dbbd68f63757ae656eb2c61c165d71e5 Mon Sep 17 00:00:00 2001
From: Jason Mitchell
Date: Thu, 19 Mar 2026 22:53:47 -0700
Subject: [PATCH] GLSM Extraction (#1527)
---
.gitignore | 1 +
build.gradle.kts | 24 +-
dependencies.gradle | 3 +-
glsm/build.gradle.kts | 190 ++++++
glsm/gradle.properties | 14 +
.../angelica/glsm/CommandBufferBuilder.java | 0
.../glsm/CompatShaderTransformer.java | 59 +-
.../angelica/glsm/CompatUniformManager.java | 49 +-
.../angelica/glsm/DisplayListIDAllocator.java | 0
.../angelica/glsm/DisplayListManager.java | 38 +-
.../gtnewhorizons/angelica/glsm/Feature.java | 0
.../angelica/glsm/FeedbackManager.java | 9 +-
.../gtnewhorizons/angelica/glsm/GLDebug.java | 348 +++++-----
.../angelica/glsm/GLStateManager.java | 613 ++++++++++--------
.../angelica/glsm/GlslTransformUtils.java | 0
.../angelica/glsm/QuadConverter.java | 0
.../angelica/glsm/RenderSystem.java | 550 ++++++++++++++++
.../angelica/glsm/TransformOptimizer.java | 6 +-
.../gtnewhorizons/angelica/glsm/Vendor.java | 0
.../angelica/glsm/compat/FogHelper.java | 0
.../glsm/compat/lwjgl/AngelicaCylinder.java | 0
.../glsm/compat/lwjgl/AngelicaDisk.java | 0
.../compat/lwjgl/AngelicaPartialDisk.java | 3 +-
.../glsm/compat/lwjgl/AngelicaSphere.java | 0
.../angelica/glsm/dsa/DSAARB.java | 0
.../angelica/glsm/dsa/DSAAccess.java | 0
.../angelica/glsm/dsa/DSACore.java | 0
.../angelica/glsm/dsa/DSAEXT.java | 0
.../angelica/glsm/dsa/DSAUnsupported.java | 0
.../angelica/glsm/ffp/FragmentKey.java | 6 +-
.../glsm/ffp/FragmentShaderGenerator.java | 0
.../glsm/ffp/GeometryShaderGenerator.java | 0
.../angelica/glsm/ffp/Program.java | 9 +-
.../angelica/glsm/ffp/ShaderCache.java | 14 +-
.../angelica/glsm/ffp/ShaderManager.java | 42 +-
.../angelica/glsm/ffp/Uniforms.java | 10 +-
.../angelica/glsm/ffp/VertexKey.java | 0
.../glsm/ffp/VertexShaderGenerator.java | 0
.../glsm/hooks/DeferredAlphaHandler.java | 7 +
.../glsm/hooks/DeferredBlendHandler.java | 8 +
.../glsm/hooks/DeferredDepthColorHandler.java | 7 +
.../angelica/glsm/hooks/GLSMConfig.java | 12 +
.../angelica/glsm/hooks/GLSMHooks.java | 37 ++
.../angelica/glsm/hooks/GLSMInitConfig.java | 103 +++
.../hooks/events/BlendFuncChangeEvent.java | 10 +
.../hooks/events/FogStateChangeEvent.java | 6 +
.../hooks/events/LightmapCoordsEvent.java | 8 +
.../glsm/hooks/events/ProgramChangeEvent.java | 8 +
.../glsm/hooks/events/TextureBindEvent.java | 7 +
.../glsm/hooks/events/TextureDeleteEvent.java | 7 +
.../hooks/events/TextureUnitStateEvent.java | 8 +
.../glsm/recording/AccumulatedDraw.java | 0
.../glsm/recording/CommandBuffer.java | 0
.../glsm/recording/CommandBufferExecutor.java | 8 +-
.../recording/CommandBufferProcessor.java | 10 +-
.../glsm/recording/CommandRecorder.java | 0
.../glsm/recording/CompiledDisplayList.java | 0
.../glsm/recording/DisplayListVBO.java | 0
.../glsm/recording/DisplayListVBOBuilder.java | 0
.../angelica/glsm/recording/GLCommand.java | 0
.../glsm/recording/ImmediateModeRecorder.java | 7 +-
.../commands/DisplayListCommand.java | 0
.../recording/commands/MultMatrixCmd.java | 2 -
.../recording/commands/TexImage2DCmd.java | 2 -
.../recording/commands/TexSubImage2DCmd.java | 2 -
.../angelica/glsm/stacks/AlphaStateStack.java | 0
.../angelica/glsm/stacks/BlendStateStack.java | 0
.../glsm/stacks/BooleanStateStack.java | 0
.../angelica/glsm/stacks/Color4Stack.java | 0
.../angelica/glsm/stacks/ColorMaskStack.java | 0
.../angelica/glsm/stacks/DepthStateStack.java | 0
.../angelica/glsm/stacks/FogStateStack.java | 0
.../glsm/stacks/IntegerStateStack.java | 0
.../glsm/stacks/LightModelStateStack.java | 0
.../angelica/glsm/stacks/LightStateStack.java | 0
.../angelica/glsm/stacks/LineStateStack.java | 0
.../glsm/stacks/MaterialStateStack.java | 0
.../angelica/glsm/stacks/MatrixModeStack.java | 0
.../angelica/glsm/stacks/PointStateStack.java | 0
.../glsm/stacks/PolygonStateStack.java | 0
.../glsm/stacks/StencilStateStack.java | 0
.../glsm/stacks/TextureBindingStack.java | 0
.../stacks/TextureUnitBooleanStateStack.java | 0
.../angelica/glsm/stacks/Vec3fStack.java | 0
.../angelica/glsm/stacks/Vec4fStack.java | 0
.../glsm/stacks/ViewPortStateStack.java | 0
.../angelica/glsm/states/AlphaState.java | 0
.../angelica/glsm/states/BlendState.java | 0
.../angelica/glsm/states/BooleanState.java | 0
.../angelica/glsm/states/ClipPlaneState.java | 0
.../angelica/glsm/states/Color4.java | 0
.../angelica/glsm/states/ColorMask.java | 0
.../angelica/glsm/states/DepthState.java | 0
.../angelica/glsm/states/FogState.java | 0
.../angelica/glsm/states/ISettableState.java | 0
.../angelica/glsm/states/IntegerState.java | 0
.../angelica/glsm/states/LightModelState.java | 0
.../angelica/glsm/states/LightState.java | 0
.../angelica/glsm/states/LineState.java | 0
.../angelica/glsm/states/MaterialState.java | 0
.../angelica/glsm/states/MatrixMode.java | 0
.../angelica/glsm/states/PointState.java | 0
.../angelica/glsm/states/PolygonState.java | 0
.../angelica/glsm/states/StencilState.java | 0
.../angelica/glsm/states/TexEnvState.java | 0
.../angelica/glsm/states/TexGenState.java | 0
.../angelica/glsm/states/TextureBinding.java | 0
.../glsm/states/TextureUnitArray.java | 0
.../glsm/states/VertexAttribState.java | 0
.../angelica/glsm/states/ViewportState.java | 0
.../glsm/streaming/OrphanStreamingBuffer.java | 0
.../streaming/PersistentStreamingBuffer.java | 0
.../glsm/streaming/StreamingBuffer.java | 0
.../glsm/streaming/StreamingUploader.java | 25 +-
.../angelica/glsm/texture/TextureInfo.java | 0
.../glsm/texture/TextureInfoCache.java | 0
.../client/renderer/Tessellator.java | 46 ++
.../client/shader/TesselatorVertexState.java | 23 +
.../glsm/CompatShaderTransformerTest.java | 0
.../glsm/CompatUniformManagerTest.java | 3 +-
.../glsm/DisplayListCompilationGLSMTest.java | 65 +-
.../glsm/DisplayListCompilationRawGLTest.java | 3 +-
.../glsm/DisplayListIdAllocatorTest.java | 0
.../angelica/glsm/DisplayListTestHelper.java | 0
.../angelica/glsm/FeedbackManagerTest.java | 3 +-
.../angelica/glsm/GLSMExtension.java | 57 +-
.../glsm/GLSM_BlendUnknownState_UnitTest.java | 3 +-
.../glsm/GLSM_DisplayList_Batching_Test.java | 3 +-
...M_DisplayList_FormatOptimization_Test.java | 3 +-
.../glsm/GLSM_DisplayList_Nesting_Test.java | 3 +-
.../glsm/GLSM_DisplayList_Stress_Test.java | 3 +-
..._DisplayList_TransformCollapsing_Test.java | 3 +-
.../glsm/GLSM_DisplayList_UnitTest.java | 3 +-
.../angelica/glsm/GLSM_GLU_UnitTest.java | 3 +-
.../angelica/glsm/GLSM_Lighting_UnitTest.java | 3 +-
.../glsm/GLSM_MatrixStack_UnitTest.java | 3 +-
.../angelica/glsm/GLSM_PushPop_UnitTest.java | 3 +-
.../glsm/GLSM_ServerSideState_UnitTest.java | 3 +-
.../glsm/GLSM_TextureInfoCache_UnitTest.java | 3 +-
.../angelica/glsm/GLSM_VAO_UnitTest.java | 10 +-
.../glsm/VertexAttribDefaultBridgeTest.java | 3 +-
.../glsm/ffp/FFPCombineShaderTest.java | 4 +-
.../RecordingDataStructuresTest.java | 4 +-
.../glsm/streaming/StreamingBufferTest.java | 4 +-
.../gtnewhorizons/angelica/util/GLBit.java | 0
.../gtnewhorizons/angelica/util/GLSMUtil.java | 0
.../net/minecraft/launchwrapper/Launch.java | 15 +
repositories.gradle | 7 +
settings.gradle.kts | 4 +-
.../debug/OpenGLDebugging.java | 2 +-
.../rendering}/AngelicaFogService.java | 3 +-
.../AngelicaGLStateManagerService.java | 3 +-
.../AngelicaRenderSystemService.java | 3 +-
.../rendering}/DeferredBatchTessellator.java | 2 +-
.../rendering}/DeferredDrawBatcher.java | 2 +-
.../rendering}/GlUniformFloat2v.java | 2 +-
.../TessellatorStreamingDrawer.java | 7 +-
.../client/rendering/TextureTracker.java | 54 ++
.../rendering}/ThreadedBlockData.java | 2 +-
.../angelica/glsm/RenderSystem.java | 533 ---------------
.../angelica/glsm/texture/TextureTracker.java | 56 --
.../angelica/hudcaching/HUDCaching.java | 3 +
.../angelica/iris/IrisGLSMBridge.java | 124 ++++
.../transformers/CeleritasBlockTransform.java | 2 +-
.../gtnewhorizons/angelica/mixins/Mixins.java | 1 +
.../angelica/proxy/ClientProxy.java | 55 +-
.../angelica/render/CloudRenderer.java | 2 +-
.../angelica/render/PanoramaRenderer.java | 2 +-
.../angelica/render/SelectionBoxRenderer.java | 2 +-
.../CeleritasDebugScreenHandler.java | 2 +-
.../iris/gl/blending/DepthColorStorage.java | 17 +-
.../iris/gl/program/ComputeProgram.java | 4 +
.../net/coderbot/iris/gl/program/Program.java | 4 +
.../DeferredWorldRenderingPipeline.java | 16 +
.../iris/texture/pbr/PBRTextureManager.java | 2 +-
.../iris/uniforms/CommonUniforms.java | 2 +-
.../com.mitchej123.glsm.GLStateManagerService | 2 +-
.../com.mitchej123.glsm.RenderSystemService | 2 +-
...embeddium.impl.render.chunk.fog.FogService | 2 +-
.../mixins/early/angelica/MixinMinecraft.java | 2 +-
.../ffp/MixinTessellator_CoreProfile.java | 2 +-
.../MixinEffectRenderer_DeferredBatch.java | 2 +-
.../startup/MixinInitGLStateManager.java | 35 +-
.../mixins/early/rendering/MixinBlock.java | 2 +-
.../mixins/early/shaders/MixinGlProgram.java | 25 +
.../shaders/startup/MixinAbstractTexture.java | 2 +-
.../rendering}/DeferredDrawBatcherTest.java | 2 +-
.../angelica/utils/BufferUtilTest.java | 3 -
.../transform/ShaderTransformerTest.java | 13 +
189 files changed, 2198 insertions(+), 1365 deletions(-)
create mode 100644 glsm/build.gradle.kts
create mode 100644 glsm/gradle.properties
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/CommandBufferBuilder.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java (90%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java (90%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/DisplayListIDAllocator.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java (97%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/Feature.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java (97%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java (77%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java (93%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/GlslTransformUtils.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java (100%)
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java (94%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/Vendor.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/compat/FogHelper.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java (98%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAAccess.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSACore.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAEXT.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java (98%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentShaderGenerator.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/GeometryShaderGenerator.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java (96%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java (94%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java (82%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java (98%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexShaderGenerator.java (100%)
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredAlphaHandler.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredBlendHandler.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredDepthColorHandler.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMConfig.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMHooks.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMInitConfig.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/BlendFuncChangeEvent.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/FogStateChangeEvent.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/LightmapCoordsEvent.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/ProgramChangeEvent.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureBindEvent.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureDeleteEvent.java
create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureUnitStateEvent.java
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/AccumulatedDraw.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBuffer.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java (98%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java (95%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandRecorder.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/GLCommand.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java (97%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/DisplayListCommand.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java (95%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java (98%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java (98%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/AlphaStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/BlendStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/Color4Stack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/ColorMaskStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/DepthStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/FogStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/IntegerStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightModelStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/LineStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/MaterialStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/MatrixModeStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/PointStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/PolygonStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/StencilStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureBindingStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec3fStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec4fStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/stacks/ViewPortStateStack.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/AlphaState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/BlendState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/ClipPlaneState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/Color4.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/ColorMask.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/DepthState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/FogState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/ISettableState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/IntegerState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/LineState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/MatrixMode.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/PointState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/PolygonState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/StencilState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/TexEnvState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/TexGenState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/TextureBinding.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/TextureUnitArray.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/VertexAttribState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/states/ViewportState.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/streaming/PersistentStreamingBuffer.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBuffer.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java (73%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java (100%)
rename {src => glsm/src}/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java (100%)
create mode 100644 glsm/src/stubs/java/net/minecraft/client/renderer/Tessellator.java
create mode 100644 glsm/src/stubs/java/net/minecraft/client/shader/TesselatorVertexState.java
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformerTest.java (100%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java (98%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java (78%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/DisplayListIdAllocatorTest.java (100%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java (100%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java (98%)
rename src/test/java/com/gtnewhorizons/angelica/AngelicaExtension.java => glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java (68%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java (97%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java (98%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java (98%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java (97%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java (95%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java (92%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java (98%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java (99%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java (97%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java (98%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/util/GLBit.java (100%)
rename {src => glsm/src}/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java (100%)
create mode 100644 glsm/src/test/java/net/minecraft/launchwrapper/Launch.java
rename src/main/java/com/gtnewhorizons/angelica/{glsm => client}/debug/OpenGLDebugging.java (99%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm => client/rendering}/AngelicaFogService.java (92%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm => client/rendering}/AngelicaGLStateManagerService.java (98%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm => client/rendering}/AngelicaRenderSystemService.java (98%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm/ffp => client/rendering}/DeferredBatchTessellator.java (98%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm/ffp => client/rendering}/DeferredDrawBatcher.java (99%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm/uniform => client/rendering}/GlUniformFloat2v.java (91%)
rename src/main/java/com/gtnewhorizons/angelica/{glsm/ffp => client/rendering}/TessellatorStreamingDrawer.java (96%)
create mode 100644 src/main/java/com/gtnewhorizons/angelica/client/rendering/TextureTracker.java
rename src/main/java/com/gtnewhorizons/angelica/{glsm => client/rendering}/ThreadedBlockData.java (93%)
delete mode 100644 src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
delete mode 100644 src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureTracker.java
create mode 100644 src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java
create mode 100644 src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGlProgram.java
rename src/test/java/com/gtnewhorizons/angelica/{glsm/ffp => client/rendering}/DeferredDrawBatcherTest.java (99%)
diff --git a/.gitignore b/.gitignore
index 83b80c31d..50d5501c7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
/.vscode/
/run/
/build/
+/glsm/build/
/eclipse/
.classpath
.project
diff --git a/build.gradle.kts b/build.gradle.kts
index 64e76e813..5283f3c2a 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -19,8 +19,7 @@ tasks.test {
events("passed", "skipped", "failed")
}
// On macOS ARM64, use an ARM64-compatible JVM for tests
- val isMacOsArm64 = System.getProperty("os.name").lowercase().contains("mac") &&
- System.getProperty("os.arch") == "aarch64"
+ val isMacOsArm64 = System.getProperty("os.name").lowercase().contains("mac") && System.getProperty("os.arch") == "aarch64"
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(8)
if (isMacOsArm64) {
@@ -48,20 +47,31 @@ tasks.register("copyDependencies") {
val embedOnly: Configuration by configurations
-// Downgrade embedOnly jars for the tests
+val stripModuleInfoFromEmbeds by tasks.registering(Jar::class) {
+ dependsOn(embedOnly)
+ from(embedOnly.map(::zipTree))
+ exclude("module-info.class")
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+ archiveClassifier = "embeds-stripped"
+}
+
+// Downgrade embedOnly jars for the tests.
val downgradeEmbedOnlyForTest by tasks.registering(DowngradeFiles::class) {
- inputCollection = embedOnly
+ inputCollection = files(stripModuleInfoFromEmbeds.map { it.archiveFile })
+ outputs.dir(temporaryDir)
}
tasks.test {
dependsOn(downgradeEmbedOnlyForTest)
- classpath = classpath
- .minus(embedOnly)
- .plus(files(downgradeEmbedOnlyForTest.map { it.outputCollection }))
+ classpath = classpath.plus(files({ fileTree(downgradeEmbedOnlyForTest.get().temporaryDir) }))
}
tasks.shadowJar {
+ dependsOn(embedOnly)
from(embedOnly.map(::zipTree))
+ minimize {
+ exclude(project(":glsm"))
+ }
relocate("com.mitchej123", "com.mitchej123")
relocate("org.embeddedt", "org.embeddedt")
}
diff --git a/dependencies.gradle b/dependencies.gradle
index d6175c088..f2ade81ba 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -53,7 +53,6 @@ configurations {
embedOnly.canBeResolved = true
compileClasspath.extendsFrom(embedOnly)
testCompileClasspath.extendsFrom(embedOnly)
- testRuntimeClasspath.extendsFrom(embedOnly)
}
@@ -74,6 +73,8 @@ dependencies {
compileOnly('org.jetbrains:annotations:26.0.2')
api("com.github.GTNewHorizons:GTNHLib:0.9.36:dev")
+ embedOnly(project(":glsm")) { transitive = false }
+ embedOnly("net.minecraftforge:eventbus:7.0-beta.15")
shadowImplementation("org.anarres:jcpp:1.4.14") // Apache 2.0
shadowImplementation("org.taumc:glsl-transformation-lib:0.2.0-26.g5ee7d96-GTNH") {
exclude module: "antlr4" // we only want to shadow the runtime module
diff --git a/glsm/build.gradle.kts b/glsm/build.gradle.kts
new file mode 100644
index 000000000..0d7cc3e49
--- /dev/null
+++ b/glsm/build.gradle.kts
@@ -0,0 +1,190 @@
+import xyz.wagyourtail.jvmdg.gradle.task.files.DowngradeFiles
+
+plugins {
+ `java-library`
+ `maven-publish`
+}
+
+apply(plugin = "xyz.wagyourtail.jvmdowngrader")
+
+version = rootProject.version
+
+java {
+ toolchain.languageVersion.set(JavaLanguageVersion.of(21))
+ withSourcesJar()
+}
+
+// RFG variant attributes: the root Angelica project uses RetroFuturaGradle which expects
+// these attributes on dependencies. Without them, Gradle can't resolve the subproject variant.
+val rfgObfAttr = Attribute.of("com.gtnewhorizons.retrofuturagradle.obfuscation", String::class.java)
+val rfgTransformedAttr = Attribute.of("rfgDeobfuscatorTransformed", Boolean::class.javaObjectType)
+
+configurations {
+ listOf("apiElements", "runtimeElements").forEach { name ->
+ named(name) {
+ attributes {
+ attribute(rfgObfAttr, "mcp")
+ attribute(rfgTransformedAttr, true)
+ }
+ }
+ }
+}
+
+// Compile stubs: MC class signatures needed to resolve GTNHLib's type hierarchy.
+// Not included in the published jar — real MC classes are on the classpath at runtime.
+sourceSets {
+ create("stubs") {
+ java.srcDir("src/stubs/java")
+ }
+}
+
+// Exclude stubs from all output jars
+tasks.withType().configureEach {
+ exclude("net/minecraft/**")
+}
+
+repositories {
+ maven {
+ name = "Mojang"
+ url = uri("https://libraries.minecraft.net")
+ }
+ maven {
+ name = "GTNH Maven"
+ url = uri("https://nexus.gtnewhorizons.com/repository/public/")
+ }
+ maven {
+ name = "Forge"
+ url = uri("https://maven.minecraftforge.net/")
+ }
+ maven {
+ name = "taumc"
+ url = uri("https://maven.taumc.org/releases")
+ }
+ maven {
+ name = "WagYourTail"
+ url = uri("https://maven.wagyourtail.xyz/releases")
+ content { includeGroup("xyz.wagyourtail.jvmdowngrader") }
+ }
+ mavenCentral()
+}
+
+dependencies {
+ // MC compile stubs
+ compileOnly(sourceSets["stubs"].output)
+
+ // LWJGL
+ compileOnly("org.lwjgl.lwjgl:lwjgl:${property("lwjglVersion")}")
+ compileOnly("org.lwjgl.lwjgl:lwjgl_util:${property("lwjglVersion")}")
+
+ // Our Deps
+ api("com.github.GTNewHorizons:GTNHLib:${property("gtnhlibVersion")}:dev")
+ api("net.minecraftforge:eventbus:${property("eventbusVersion")}")
+
+ compileOnly("org.embeddedt.celeritas:celeritas-common:${property("celeritasVersion")}") { isTransitive = false }
+ implementation("org.taumc:glsl-transformation-lib:${property("glslTransformLibVersion")}") { exclude(module = "antlr4") }
+ implementation("org.antlr:antlr4-runtime:${property("antlr4RuntimeVersion")}")
+ implementation("org.anarres:jcpp:${property("jcppVersion")}")
+
+ compileOnly("org.projectlombok:lombok:${property("lombokVersion")}") { isTransitive = false }
+ annotationProcessor("org.projectlombok:lombok:${property("lombokVersion")}")
+ compileOnly("org.jetbrains:annotations:${property("jetbrainsAnnotationsVersion")}")
+ compileOnly("org.apache.logging.log4j:log4j-api:${property("log4jVersion")}")
+
+ // Deps (normally from MC) - compile only, but needed at test runtime
+ compileOnly("com.google.guava:guava:${property("guavaVersion")}")
+ testRuntimeOnly("com.google.guava:guava:${property("guavaVersion")}")
+
+ // Test
+ testImplementation(sourceSets["stubs"].output)
+ testImplementation(platform("org.junit:junit-bom:${property("junitBomVersion")}"))
+ testImplementation("org.junit.jupiter:junit-jupiter")
+ testImplementation("org.lwjgl.lwjgl:lwjgl:${property("lwjglVersion")}")
+ testRuntimeOnly("org.junit.platform:junit-platform-launcher")
+ testRuntimeOnly("org.apache.logging.log4j:log4j-core:${property("log4jVersion")}")
+ testRuntimeOnly("org.embeddedt.celeritas:celeritas-lwjgl2-service:${property("celeritasVersion")}") { isTransitive = false }
+ testRuntimeOnly("xyz.wagyourtail.jvmdowngrader:jvmdowngrader-java-api:${property("jvmDowngraderVersion")}:downgraded-8")
+ testRuntimeOnly("org.apache.commons:commons-lang3:${property("commonsLang3Version")}")
+}
+
+val depsToDowngrade by configurations.creating {
+ isCanBeConsumed = false
+ isCanBeResolved = true
+}
+
+dependencies {
+ depsToDowngrade("net.minecraftforge:eventbus:${property("eventbusVersion")}")
+ depsToDowngrade("org.embeddedt.celeritas:celeritas-common:${property("celeritasVersion")}") { isTransitive = false }
+}
+
+tasks.withType().configureEach {
+ downgradeTo.set(JavaVersion.VERSION_1_8)
+ multiReleaseOriginal.set(false)
+ multiReleaseVersions.set(emptySet())
+}
+
+val downgradeDepsForTest by tasks.registering(DowngradeFiles::class) {
+ inputCollection = depsToDowngrade
+}
+
+val downgradeMainClasses by tasks.registering(DowngradeFiles::class) {
+ inputCollection = sourceSets["main"].output.classesDirs.plus(sourceSets["stubs"].output.classesDirs)
+ classpath = sourceSets["main"].compileClasspath
+ dependsOn(tasks.named("classes"), tasks.named("stubsClasses"))
+}
+
+val downgradeTestClasses by tasks.registering(DowngradeFiles::class) {
+ inputCollection = sourceSets["test"].output.classesDirs
+ classpath = sourceSets["test"].compileClasspath
+ dependsOn(tasks.named("testClasses"))
+}
+
+tasks.test {
+ useJUnitPlatform()
+
+ javaLauncher = javaToolchains.launcherFor {
+ languageVersion = JavaLanguageVersion.of(8)
+ }
+
+ dependsOn(downgradeMainClasses, downgradeTestClasses, downgradeDepsForTest)
+
+ val mainClassesDirs = sourceSets["main"].output.classesDirs
+ .plus(sourceSets["stubs"].output.classesDirs)
+ val testClassesDirs = sourceSets["test"].output.classesDirs
+
+ val downgradedTest = files(downgradeTestClasses.map { it.outputCollection })
+ val downgradedMain = files(downgradeMainClasses.map { it.outputCollection })
+ val downgradedDeps = files(downgradeDepsForTest.map { it.outputCollection })
+
+ setTestClassesDirs(downgradedTest)
+ classpath = downgradedTest
+ .plus(downgradedMain)
+ .plus(downgradedDeps)
+ .plus(classpath.minus(mainClassesDirs).minus(testClassesDirs).minus(depsToDowngrade))
+
+ val extractNatives = rootProject.tasks.named("extractNatives2")
+ dependsOn(extractNatives)
+ jvmArgs("-Djava.library.path=${extractNatives.get().property("destinationFolder").let { (it as DirectoryProperty).asFile.get().path }}")
+}
+
+publishing {
+ publications {
+ create("mavenJava") {
+ groupId = "com.gtnewhorizons.angelica"
+ artifactId = "glsm"
+ version = rootProject.version.toString()
+ from(components["java"])
+ }
+ }
+ repositories {
+ if (System.getenv("MAVEN_USER") != null) {
+ maven {
+ name = "GTNHMaven"
+ url = uri(rootProject.findProperty("mavenPublishUrl")?.toString() ?: "https://nexus.gtnewhorizons.com/repository/releases/")
+ credentials {
+ username = System.getenv("MAVEN_USER")
+ password = System.getenv("MAVEN_PASSWORD")
+ }
+ }
+ }
+ }
+}
diff --git a/glsm/gradle.properties b/glsm/gradle.properties
new file mode 100644
index 000000000..9b285bf50
--- /dev/null
+++ b/glsm/gradle.properties
@@ -0,0 +1,14 @@
+lwjglVersion = 2.9.4-nightly-20150209
+eventbusVersion = 7.0-beta.15
+celeritasVersion = 2.5.3-GTNH
+lombokVersion = 1.18.42
+log4jVersion = 2.0-beta9
+guavaVersion = 18.0
+gtnhlibVersion = 0.9.36
+glslTransformLibVersion = 0.2.0-26.g5ee7d96-GTNH
+antlr4RuntimeVersion = 4.13.2
+jcppVersion = 1.4.14
+jetbrainsAnnotationsVersion = 26.0.2
+junitBomVersion = 5.14.1
+jvmDowngraderVersion = 1.3.5
+commonsLang3Version = 3.17.0
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/CommandBufferBuilder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CommandBufferBuilder.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/CommandBufferBuilder.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CommandBufferBuilder.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java
similarity index 90%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java
index 587577b28..4150b1b09 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformer.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import net.minecraft.launchwrapper.Launch;
import org.taumc.glsl.ShaderParser;
import org.taumc.glsl.Transformer;
@@ -18,8 +17,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
-
/**
* Compat transformation for mod shaders running under core profile.
*
@@ -39,13 +36,11 @@ import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
*/
public class CompatShaderTransformer {
- private static final Pattern VERSION_PATTERN =
- Pattern.compile("#version[ \\t]+(\\d+)(?:[ \\t]+(\\w+))?");
+ private static final Pattern VERSION_PATTERN = Pattern.compile("#version[ \\t]+(\\d+)(?:[ \\t]+(\\w+))?");
- private static final Pattern DEFINE_PATTERN =
- Pattern.compile("^\\s*#\\s*define\\s+.+$", Pattern.MULTILINE);
+ private static final Pattern DEFINE_PATTERN = Pattern.compile("^\\s*#\\s*define\\s+.+$", Pattern.MULTILINE);
- /** Compat builtins that trigger AST transformation. */
+ /** Compat builtins that trigger AST transformation. */
private static final Set COMPAT_BUILTINS = Set.of(
"gl_ModelView", "gl_Projection", "gl_NormalMatrix", "gl_TextureMatrix",
"gl_FragColor", "gl_Fog", "gl_FrontColor", "gl_Color",
@@ -69,14 +64,9 @@ public class CompatShaderTransformer {
private static final Path DUMP_DIR;
private static final AtomicInteger dumpCounter = new AtomicInteger(0);
+
static {
- boolean isDev = false;
- try {
- final Object deobfEnv = Launch.blackboard != null ? Launch.blackboard.get("fml.deobfuscatedEnvironment") : null;
- isDev = Boolean.TRUE.equals(deobfEnv);
- } catch (Exception ignored) {}
- DUMP_DIR = (isDev || Boolean.parseBoolean(System.getProperty("angelica.compat.dumpShaders", "false")))
- ? Paths.get("compat_shaders") : null;
+ DUMP_DIR = Boolean.parseBoolean(System.getProperty("angelica.dumpShaders", "false")) ? Paths.get("compat_shaders") : null;
}
private static final int CACHE_SIZE = 32;
@@ -84,9 +74,9 @@ public class CompatShaderTransformer {
private static final Map cache = Collections.synchronizedMap(
new LinkedHashMap<>(32, 0.75f, true) {
@Override protected boolean removeEldestEntry(Map.Entry eldest) {
- return size() > CACHE_SIZE;
- }
- });
+ return size() > CACHE_SIZE;
+ }
+ });
public static void clearCache() {
cache.clear();
@@ -112,7 +102,7 @@ public class CompatShaderTransformer {
result = transformInternal(source, isFragment);
cache.put(key, result);
} catch (Exception e) {
- LOGGER.warn("CompatShaderTransformer: AST transformation failed, falling back to version fixup only", e);
+ GLStateManager.LOGGER.warn("CompatShaderTransformer: AST transformation failed, falling back to version fixup only", e);
result = fixupVersion(source);
}
}
@@ -160,22 +150,20 @@ public class CompatShaderTransformer {
// gl_LightSource[i] → struct + uniform array (both via injectFunction to keep struct before uniform)
if (source.contains("gl_LightSource")) {
- transformer.injectFunction(
- "struct angelica_LightSourceParameters {"
- + "vec4 ambient;vec4 diffuse;vec4 specular;vec4 position;vec4 halfVector;"
- + "vec3 spotDirection;float spotExponent;float spotCutoff;float spotCosCutoff;"
- + "float constantAttenuation;float linearAttenuation;float quadraticAttenuation;"
- + "};");
+ transformer.injectFunction("struct angelica_LightSourceParameters {"
+ + "vec4 ambient;vec4 diffuse;vec4 specular;vec4 position;vec4 halfVector;"
+ + "vec3 spotDirection;float spotExponent;float spotCutoff;float spotCosCutoff;"
+ + "float constantAttenuation;float linearAttenuation;float quadraticAttenuation;"
+ + "};");
transformer.injectFunction("uniform angelica_LightSourceParameters angelica_LightSource[2];");
transformer.rename("gl_LightSource", "angelica_LightSource");
}
// gl_FrontMaterial → struct + uniform (both via injectFunction to keep struct before uniform)
if (source.contains("gl_FrontMaterial")) {
- transformer.injectFunction(
- "struct angelica_MaterialParameters {"
- + "vec4 emission;vec4 ambient;vec4 diffuse;vec4 specular;float shininess;"
- + "};");
+ transformer.injectFunction("struct angelica_MaterialParameters {"
+ + "vec4 emission;vec4 ambient;vec4 diffuse;vec4 specular;float shininess;"
+ + "};");
transformer.injectFunction("uniform angelica_MaterialParameters angelica_FrontMaterial;");
transformer.rename("gl_FrontMaterial", "angelica_FrontMaterial");
}
@@ -263,7 +251,9 @@ public class CompatShaderTransformer {
transformer.replaceExpression("gl_ModelViewProjectionMatrix", "(angelica_ProjectionMatrix * angelica_ModelViewMatrix)");
transformer.replaceExpression("gl_TextureMatrix[0]", "mat4(1.0)");
transformer.replaceExpression("gl_TextureMatrix[1]", "angelica_LightmapTextureMatrix");
- transformer.replaceExpression("gl_TextureMatrix", "mat4[8](mat4(1.0), angelica_LightmapTextureMatrix, mat4(1.0), mat4(1.0), mat4(1.0), mat4(1.0), mat4(1.0), mat4(1.0))");
+ transformer.replaceExpression(
+ "gl_TextureMatrix",
+ "mat4[8](mat4(1.0), angelica_LightmapTextureMatrix, mat4(1.0), mat4(1.0), mat4(1.0), mat4(1.0), mat4(1.0), mat4(1.0))");
}
/**
@@ -306,10 +296,9 @@ public class CompatShaderTransformer {
transformer.injectVariable("uniform float angelica_FogEnd;");
transformer.injectVariable("uniform vec4 angelica_FogColor;");
transformer.injectFunction("struct angelica_FogParameters {vec4 color;float density;float start;float end;float scale;};");
- transformer.injectFunction(
- "angelica_FogParameters angelica_Fog = angelica_FogParameters("
- + "angelica_FogColor, angelica_FogDensity, angelica_FogStart, angelica_FogEnd, "
- + "1.0 / (angelica_FogEnd - angelica_FogStart));");
+ transformer.injectFunction("angelica_FogParameters angelica_Fog = angelica_FogParameters("
+ + "angelica_FogColor, angelica_FogDensity, angelica_FogStart, angelica_FogEnd, "
+ + "1.0 / (angelica_FogEnd - angelica_FogStart));");
}
/**
@@ -356,7 +345,7 @@ public class CompatShaderTransformer {
Files.writeString(DUMP_DIR.resolve(id + "_original" + suffix), header + original, StandardCharsets.UTF_8);
Files.writeString(DUMP_DIR.resolve(id + "_transformed" + suffix), header + transformed, StandardCharsets.UTF_8);
} catch (IOException e) {
- LOGGER.warn("Failed to dump compat shader: {}", e.getMessage());
+ GLStateManager.LOGGER.warn("Failed to dump compat shader: {}", e.getMessage());
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
similarity index 90%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
index fad00478a..37480e6cb 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
@@ -15,12 +15,11 @@ import org.lwjgl.opengl.GL20;
import java.nio.FloatBuffer;
-import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
-
/**
* Per-program compat uniform location cache and upload manager.
*
- * Manages {@code angelica_*} uniforms injected by {@link CompatShaderTransformer} and {@code iris_*} matrix uniforms used by Iris/celeritas shader programs.
+ *
Manages {@code angelica_*} uniforms injected by {@link CompatShaderTransformer} and {@code iris_*} matrix uniforms used by Iris/celeritas shader
+ * programs.
*/
public class CompatUniformManager {
@@ -69,6 +68,7 @@ public class CompatUniformManager {
};
private static final String[] UNIFORM_NAMES;
+
static {
UNIFORM_NAMES = new String[LOC_COUNT];
UNIFORM_NAMES[LOC_MODELVIEW] = "angelica_ModelViewMatrix";
@@ -91,8 +91,7 @@ public class CompatUniformManager {
UNIFORM_NAMES[LOC_CLIP_PLANES_ENABLED] = "angelica_ClipPlanesEnabled";
for (int li = 0; li < 2; li++) {
for (int fi = 0; fi < LIGHT_FIELDS; fi++) {
- UNIFORM_NAMES[LOC_LIGHT_BASE + li * LIGHT_FIELDS + fi] =
- "angelica_LightSource[" + li + "]." + LIGHT_FIELD_NAMES[fi];
+ UNIFORM_NAMES[LOC_LIGHT_BASE + li * LIGHT_FIELDS + fi] = "angelica_LightSource[" + li + "]." + LIGHT_FIELD_NAMES[fi];
}
}
for (int fi = 0; fi < MAT_FIELDS; fi++) {
@@ -113,6 +112,7 @@ public class CompatUniformManager {
private static final float LIGHTMAP_SCALE = 1.0f / 256.0f;
private static final FloatBuffer lightmapMatrixBuf;
+
static {
lightmapMatrixBuf = BufferUtils.createFloatBuffer(16);
new Matrix4f().scale(LIGHTMAP_SCALE).translate(8.0f, 8.0f, 8.0f).get(lightmapMatrixBuf);
@@ -140,7 +140,7 @@ public class CompatUniformManager {
if (hasAny) {
programLocations.put(program, locs);
- LOGGER.debug("CompatUniformManager: program {} has compat uniforms", program);
+ GLStateManager.LOGGER.debug("CompatUniformManager: program {} has compat uniforms", program);
}
}
@@ -277,8 +277,7 @@ public class CompatUniformManager {
}
if (locs[LOC_FOG_COLOR] != -1) {
vec4Buf.clear();
- vec4Buf.put((float) fog.getFogColor().x).put((float) fog.getFogColor().y)
- .put((float) fog.getFogColor().z).put(fog.getFogAlpha());
+ vec4Buf.put((float) fog.getFogColor().x).put((float) fog.getFogColor().y).put((float) fog.getFogColor().z).put(fog.getFogAlpha());
vec4Buf.flip();
GL20.glUniform4(locs[LOC_FOG_COLOR], vec4Buf);
}
@@ -287,8 +286,7 @@ 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 (!GLStateManager.getAlphaTest().isEnabled() || GLStateManager.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
ref = -1.0f;
} else {
ref = GLStateManager.getAlphaState().getReference();
@@ -298,8 +296,7 @@ public class CompatUniformManager {
}
/**
- * Scene color = emission + ambient * lightModel.ambient, alpha = diffuse.a
- * Same computation as {@code Uniforms.uploadLightingPreComputed()}.
+ * 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();
@@ -333,8 +330,9 @@ public class CompatUniformManager {
// halfVector = normalize(normalize(position.xyz) + eye), eye=(0,0,1) for infinite viewer
float hx, hy, hz;
if (light.position.w == 0.0f) {
- float len = (float) Math.sqrt(light.position.x * light.position.x
- + light.position.y * light.position.y + light.position.z * light.position.z);
+ final float len = (float) Math.sqrt(light.position.x * light.position.x
+ + light.position.y * light.position.y
+ + light.position.z * light.position.z);
if (len > 0) {
hx = light.position.x / len;
hy = light.position.y / len;
@@ -345,24 +343,17 @@ public class CompatUniformManager {
} else {
hx = 0; hy = 0; hz = 1;
}
- float hlen = (float) Math.sqrt(hx * hx + hy * hy + hz * hz);
+ final float hlen = (float) Math.sqrt(hx * hx + hy * hy + hz * hz);
if (hlen > 0) { hx /= hlen; hy /= hlen; hz /= hlen; }
GL20.glUniform4f(locs[base + LF_HALF_VECTOR], hx, hy, hz, 0.0f);
}
- if (locs[base + LF_SPOT_DIRECTION] != -1)
- GL20.glUniform3f(locs[base + LF_SPOT_DIRECTION], light.spotDirection.x, light.spotDirection.y, light.spotDirection.z);
- if (locs[base + LF_SPOT_EXPONENT] != -1)
- GL20.glUniform1f(locs[base + LF_SPOT_EXPONENT], light.spotExponent);
- if (locs[base + LF_SPOT_CUTOFF] != -1)
- GL20.glUniform1f(locs[base + LF_SPOT_CUTOFF], light.spotCutoff);
- if (locs[base + LF_SPOT_COS_CUTOFF] != -1)
- GL20.glUniform1f(locs[base + LF_SPOT_COS_CUTOFF], light.spotCosCutoff);
- if (locs[base + LF_CONSTANT_ATTEN] != -1)
- GL20.glUniform1f(locs[base + LF_CONSTANT_ATTEN], light.constantAttenuation);
- if (locs[base + LF_LINEAR_ATTEN] != -1)
- GL20.glUniform1f(locs[base + LF_LINEAR_ATTEN], light.linearAttenuation);
- if (locs[base + LF_QUADRATIC_ATTEN] != -1)
- GL20.glUniform1f(locs[base + LF_QUADRATIC_ATTEN], light.quadraticAttenuation);
+ if (locs[base + LF_SPOT_DIRECTION] != -1) GL20.glUniform3f(locs[base + LF_SPOT_DIRECTION], light.spotDirection.x, light.spotDirection.y, light.spotDirection.z);
+ if (locs[base + LF_SPOT_EXPONENT] != -1) GL20.glUniform1f(locs[base + LF_SPOT_EXPONENT], light.spotExponent);
+ if (locs[base + LF_SPOT_CUTOFF] != -1) GL20.glUniform1f(locs[base + LF_SPOT_CUTOFF], light.spotCutoff);
+ if (locs[base + LF_SPOT_COS_CUTOFF] != -1) GL20.glUniform1f(locs[base + LF_SPOT_COS_CUTOFF], light.spotCosCutoff);
+ if (locs[base + LF_CONSTANT_ATTEN] != -1) GL20.glUniform1f(locs[base + LF_CONSTANT_ATTEN], light.constantAttenuation);
+ if (locs[base + LF_LINEAR_ATTEN] != -1) GL20.glUniform1f(locs[base + LF_LINEAR_ATTEN], light.linearAttenuation);
+ if (locs[base + LF_QUADRATIC_ATTEN] != -1) GL20.glUniform1f(locs[base + LF_QUADRATIC_ATTEN], light.quadraticAttenuation);
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListIDAllocator.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListIDAllocator.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListIDAllocator.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListIDAllocator.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
similarity index 97%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
index be7a86c8c..802acc5f8 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.github.bsideup.jabel.Desugar;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
@@ -8,6 +7,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VBOManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
import com.gtnewhorizons.angelica.glsm.recording.AccumulatedDraw;
+import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder;
import com.gtnewhorizons.angelica.glsm.recording.CommandBuffer;
import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder;
import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList;
@@ -19,8 +19,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import lombok.Getter;
import lombok.experimental.UtilityClass;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.joml.Matrix4f;
import org.joml.Matrix4fStack;
import org.joml.Vector3f;
@@ -49,8 +47,6 @@ import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memGetInt;
*/
@UtilityClass
public class DisplayListManager {
- private static final Logger LOGGER = LogManager.getLogger("DisplayListManager");
-
// -Dangelica.debugDisplayLists: disable transform collapsing and draw merging
private static final boolean DEBUG_DISPLAY_LISTS = Boolean.getBoolean("angelica.debugDisplayLists");
@@ -60,7 +56,7 @@ public class DisplayListManager {
static {
LOG_DISPLAY_LIST_COMPILATION = Boolean.getBoolean("angelica.logDisplayListCompilation");
if (LOG_DISPLAY_LIST_COMPILATION) {
- LogManager.getLogger("DisplayListManager").warn("Display list compilation logging ENABLED (-Dangelica.logDisplayListCompilation=true)");
+ GLStateManager.LOGGER.warn("Display list compilation logging ENABLED (-Dangelica.logDisplayListCompilation=true)");
}
}
@@ -113,7 +109,6 @@ public class DisplayListManager {
* Compilation context for a single display list being compiled.
* Used to support nested glNewList() calls (spec-violating but needed for mod compatibility).
*/
- @Desugar
private record CompilationContext(
int listId,
int listMode,
@@ -144,6 +139,16 @@ public class DisplayListManager {
return glListMode == GL11.GL_COMPILE_AND_EXECUTE;
}
+ public static CommandRecorder pauseRecording() {
+ final CommandRecorder r = currentRecorder;
+ currentRecorder = null;
+ return r;
+ }
+
+ public static void resumeRecording(CommandRecorder r) {
+ currentRecorder = r;
+ }
+
/**
* Emit accumulated transform as MultMatrix if non-identity, then reset.
*/
@@ -160,7 +165,7 @@ public class DisplayListManager {
// Save pending transform ops for logging (before we clear them)
if (multMatrixSources != null && pendingTransformOps != null) {
if (pendingTransformOps.isEmpty()) {
- LOGGER.warn("flushMatrix: non-identity transform with no tracked ops");
+ GLStateManager.LOGGER.warn("flushMatrix: non-identity transform with no tracked ops");
multMatrixSources.add(Collections.singletonList("(unknown source)"));
} else {
multMatrixSources.add(new ArrayList<>(pendingTransformOps));
@@ -174,11 +179,6 @@ public class DisplayListManager {
stateGeneration++;
}
- // COMPILE_AND_EXECUTE: apply to GLSM software stack
- if (glListMode == GL11.GL_COMPILE_AND_EXECUTE) {
- GLStateManager.getMatrixStack().mul(relativeTransform);
- }
-
// Reset to identity - we're now synchronized with GL
relativeTransform.identity();
@@ -258,6 +258,9 @@ public class DisplayListManager {
if (currentRecorder == null) return;
drawBarrier();
currentRecorder.recordColor(r, g, b, a);
+ if (ImmediateModeRecorder.isDrawing()) {
+ ImmediateModeRecorder.setColor(r, g, b, a);
+ }
}
public static void recordColorMask(boolean r, boolean g, boolean b, boolean a) {
@@ -624,9 +627,6 @@ public class DisplayListManager {
final Matrix4f singleTransform = new Matrix4f();
applyTransformOp(singleTransform, x, y, z, op, rotationAxis);
if (currentRecorder != null) currentRecorder.recordMultMatrix(singleTransform);
- if (glListMode == GL11.GL_COMPILE_AND_EXECUTE) {
- GLStateManager.getMatrixStack().mul(singleTransform);
- }
return;
}
@@ -660,10 +660,6 @@ public class DisplayListManager {
if (currentRecorder != null) {
currentRecorder.recordMultMatrix(matrix);
}
-
- if (glListMode == GL11.GL_COMPILE_AND_EXECUTE) {
- GLStateManager.getMatrixStack().mul(matrix);
- }
return;
}
@@ -969,7 +965,7 @@ public class DisplayListManager {
// ==================== DEBUG LOGGING ====================
public static void logCompiledDisplayList(int listId, CompiledDisplayList compiled, StackTraceElement[] stackTrace) {
- LOGGER.debug(getCompiledDisplayListString(listId, compiled, stackTrace));
+ GLStateManager.LOGGER.debug(getCompiledDisplayListString(listId, compiled, stackTrace));
}
public static String getCompiledDisplayListString(int listId, CompiledDisplayList compiled, StackTraceElement[] stackTrace) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
similarity index 97%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
index 15b8a3a88..cc0f6f843 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java
@@ -3,7 +3,6 @@ package com.gtnewhorizons.angelica.glsm;
import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder;
import com.gtnewhorizons.angelica.glsm.states.VertexAttribState;
import com.gtnewhorizons.angelica.glsm.states.ViewportState;
-import com.gtnewhorizons.angelica.loading.AngelicaTweaker;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import org.lwjgl.opengl.GL11;
@@ -39,6 +38,7 @@ public class FeedbackManager {
@FunctionalInterface
private interface IndexReader {
+
int read(int i);
}
@@ -48,7 +48,7 @@ public class FeedbackManager {
public static void glFeedbackBuffer(int type, FloatBuffer buffer) {
if (renderMode == GL11.GL_FEEDBACK) {
- AngelicaTweaker.LOGGER.error("glFeedbackBuffer called while already in feedback mode");
+ GLStateManager.LOGGER.error("glFeedbackBuffer called while already in feedback mode");
return;
}
feedbackBuffer = buffer;
@@ -65,7 +65,7 @@ public class FeedbackManager {
};
if (mode == GL11.GL_SELECT) {
- AngelicaTweaker.LOGGER.warn("glRenderMode(GL_SELECT): selection mode not emulated");
+ GLStateManager.LOGGER.warn("glRenderMode(GL_SELECT): selection mode not emulated");
}
feedbackCount = 0;
@@ -118,8 +118,7 @@ public class FeedbackManager {
final ViewportState vp = GLStateManager.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;
+ final float winZ = (float) ((vp.depthRangeFar - vp.depthRangeNear) * ndcZ + (vp.depthRangeFar + vp.depthRangeNear)) * 0.5f;
final float winW = 1.0f / w;
feedbackVertex(winX, winY, winZ, winW);
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java
similarity index 77%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java
index 3ccc1a9e1..482a45186 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLDebug.java
@@ -19,79 +19,81 @@ import org.lwjgl.opengl.GL43;
import org.lwjgl.opengl.KHRDebug;
import org.lwjgl.opengl.KHRDebugCallback;
-import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
import static org.lwjgl.opengl.ARBDebugOutput.glDebugMessageCallbackARB;
public final class GLDebug {
+
/**
* Sets up debug callbacks
+ *
* @return 0 for failure, 1 for success, 2 for restart required.
*/
public static int setupDebugMessageCallback() {
if (Thread.currentThread() != GLStateManager.getMainThread()) {
- LOGGER.warn("setupDebugMessageCallback called from non-main thread!");
+ GLStateManager.LOGGER.warn("setupDebugMessageCallback called from non-main thread!");
return 0;
}
return setupDebugMessageCallbackImpl();
}
- public static Throwable filterStackTrace(Throwable throwable, int offset) {
- StackTraceElement[] elems = throwable.getStackTrace();
- StackTraceElement[] filtered = new StackTraceElement[elems.length];
- int j = 0;
- for (int i = offset; i < elems.length; i++) {
- String className = elems[i].getClassName();
- if (className == null) {
- className = "";
- }
- filtered[j++] = elems[i];
- }
- StackTraceElement[] newElems = new StackTraceElement[j];
- System.arraycopy(filtered, 0, newElems, 0, j);
- throwable.setStackTrace(newElems);
- return throwable;
- }
+ public static Throwable filterStackTrace(Throwable throwable, int offset) {
+ StackTraceElement[] elems = throwable.getStackTrace();
+ StackTraceElement[] filtered = new StackTraceElement[elems.length];
+ int j = 0;
+ for (int i = offset; i < elems.length; i++) {
+ String className = elems[i].getClassName();
+ if (className == null) {
+ className = "";
+ }
+ filtered[j++] = elems[i];
+ }
+ StackTraceElement[] newElems = new StackTraceElement[j];
+ System.arraycopy(filtered, 0, newElems, 0, j);
+ throwable.setStackTrace(newElems);
+ return throwable;
+ }
- private static String buildStackTrace() {
- StackTraceElement[] elems = filterStackTrace(new Throwable(), 4).getStackTrace();
- StringBuilder sb = new StringBuilder();
- for (StackTraceElement elem : elems) {
- sb.append("\n\t").append(elem.toString());
- }
- return sb.toString();
- }
+ private static String buildStackTrace() {
+ StackTraceElement[] elems = filterStackTrace(new Throwable(), 4).getStackTrace();
+ StringBuilder sb = new StringBuilder();
+ for (StackTraceElement elem : elems) {
+ sb.append("\n\t").append(elem.toString());
+ }
+ return sb.toString();
+ }
- private static void logDebugMessage(int id, String source, String type, String severity, String message) {
- String fullMessage = String.format("[GL] %s %s (0x%X) from %s: %s%s", severity, type, id, source, message, buildStackTrace());
+ private static void logDebugMessage(int id, String source, String type, String severity, String message) {
+ String fullMessage = String.format("[GL] %s %s (0x%X) from %s: %s%s", severity, type, id, source, message, buildStackTrace());
- if ("HIGH".equals(severity)) {
- LOGGER.error(fullMessage);
- } else if ("MEDIUM".equals(severity)) {
- LOGGER.warn(fullMessage);
- } else {
- LOGGER.info(fullMessage);
- }
- }
+ if ("HIGH".equals(severity)) {
+ GLStateManager.LOGGER.error(fullMessage);
+ } else if ("MEDIUM".equals(severity)) {
+ GLStateManager.LOGGER.warn(fullMessage);
+ } else {
+ GLStateManager.LOGGER.info(fullMessage);
+ }
+ }
- private static void logDebugMessageAMD(int id, String category, String severity, String message) {
- String fullMessage = String.format("[GL] %s %s (0x%X): %s%s", severity, category, id, message, buildStackTrace());
+ private static void logDebugMessageAMD(int id, String category, String severity, String message) {
+ String fullMessage = String.format("[GL] %s %s (0x%X): %s%s", severity, category, id, message, buildStackTrace());
- if ("HIGH".equals(severity)) {
- LOGGER.error(fullMessage);
- } else if ("MEDIUM".equals(severity)) {
- LOGGER.warn(fullMessage);
- } else {
- LOGGER.info(fullMessage);
- }
- }
+ if ("HIGH".equals(severity)) {
+ GLStateManager.LOGGER.error(fullMessage);
+ } else if ("MEDIUM".equals(severity)) {
+ GLStateManager.LOGGER.warn(fullMessage);
+ } else {
+ GLStateManager.LOGGER.info(fullMessage);
+ }
+ }
/**
* Sets up debug callbacks
+ *
* @return 0 for failure, 1 for success, 2 for restart required.
*/
private static int setupDebugMessageCallbackImpl() {
if (GLStateManager.capabilities.OpenGL43 || GLStateManager.capabilities.GL_KHR_debug) {
- LOGGER.info("[GL] Using OpenGL 4.3 for error logging.");
+ GLStateManager.LOGGER.info("[GL] Using OpenGL 4.3 for error logging.");
final KHRDebugCallback proc = new KHRDebugCallback((source, type, id, severity, message) -> {
logDebugMessage(id, getDebugSource(source), getDebugType(type), getDebugSeverity(severity), message);
});
@@ -105,13 +107,13 @@ public final class GLDebug {
GL11.glEnable(GL43.GL_DEBUG_OUTPUT_SYNCHRONOUS);
if ((GL11.glGetInteger(GL30.GL_CONTEXT_FLAGS) & GL43.GL_CONTEXT_FLAG_DEBUG_BIT) == 0) {
- LOGGER.warn("[GL] Warning: A non-debug context may not produce any debug output.");
+ GLStateManager.LOGGER.warn("[GL] Warning: A non-debug context may not produce any debug output.");
GL11.glEnable(GL43.GL_DEBUG_OUTPUT);
return 2;
}
return 1;
} else if (GLStateManager.capabilities.GL_ARB_debug_output) {
- LOGGER.info("[GL] Using ARB_debug_output for error logging.");
+ GLStateManager.LOGGER.info("[GL] Using ARB_debug_output for error logging.");
final ARBDebugOutputCallback proc = new ARBDebugOutputCallback((source, type, id, severity, message) -> {
logDebugMessage(id, getSourceARB(source), getTypeARB(type), getSeverityARB(severity), message);
});
@@ -125,7 +127,7 @@ public final class GLDebug {
GL11.glEnable(ARBDebugOutput.GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
return 1;
} else if (GLStateManager.capabilities.GL_AMD_debug_output) {
- LOGGER.info("[GL] Using AMD_debug_output for error logging.");
+ GLStateManager.LOGGER.info("[GL] Using AMD_debug_output for error logging.");
final AMDDebugOutputCallback proc = new AMDDebugOutputCallback((id, category, severity, message) -> {
logDebugMessageAMD(id, getCategoryAMD(category), getSeverityAMD(severity), message);
});
@@ -136,35 +138,34 @@ public final class GLDebug {
AMDDebugOutput.glDebugMessageCallbackAMD(proc);
return 1;
} else {
- LOGGER.info("[GL] No debug output implementation is available, cannot return debug info.");
+ GLStateManager.LOGGER.info("[GL] No debug output implementation is available, cannot return debug info.");
return 0;
}
}
- public static int disableDebugMessages() {
- if (GLStateManager.capabilities.OpenGL43) {
- GL43.glDebugMessageCallback(null);
- return 1;
- } else if (GLStateManager.capabilities.GL_KHR_debug) {
- KHRDebug.glDebugMessageCallback(null);
- if (GLStateManager.capabilities.OpenGL30 && (GL11.glGetInteger(GL30.GL_CONTEXT_FLAGS) & 2) == 0) {
+ public static int disableDebugMessages() {
+ if (GLStateManager.capabilities.OpenGL43) {
+ GL43.glDebugMessageCallback(null);
+ return 1;
+ } else if (GLStateManager.capabilities.GL_KHR_debug) {
+ KHRDebug.glDebugMessageCallback(null);
+ if (GLStateManager.capabilities.OpenGL30 && (GL11.glGetInteger(GL30.GL_CONTEXT_FLAGS) & 2) == 0) {
GL11.glDisable(GL43.GL_DEBUG_OUTPUT);
- }
- return 1;
- } else if (GLStateManager.capabilities.GL_ARB_debug_output) {
- glDebugMessageCallbackARB(null);
- return 1;
- } else if (GLStateManager.capabilities.GL_AMD_debug_output) {
- AMDDebugOutput.glDebugMessageCallbackAMD(null);
- return 1;
- } else {
- LOGGER.info("[GL] No debug output implementation is available, cannot disable debug info.");
- return 0;
- }
- }
+ }
+ return 1;
+ } else if (GLStateManager.capabilities.GL_ARB_debug_output) {
+ glDebugMessageCallbackARB(null);
+ return 1;
+ } else if (GLStateManager.capabilities.GL_AMD_debug_output) {
+ AMDDebugOutput.glDebugMessageCallbackAMD(null);
+ return 1;
+ } else {
+ GLStateManager.LOGGER.info("[GL] No debug output implementation is available, cannot disable debug info.");
+ return 0;
+ }
+ }
-
- private static String getDebugSource(int source) {
+ private static String getDebugSource(int source) {
return switch (source) {
case GL43.GL_DEBUG_SOURCE_API -> "API";
case GL43.GL_DEBUG_SOURCE_WINDOW_SYSTEM -> "WINDOW SYSTEM";
@@ -174,9 +175,9 @@ public final class GLDebug {
case GL43.GL_DEBUG_SOURCE_OTHER -> "OTHER";
default -> String.format("Unknown [0x%X]", source);
};
- }
+ }
- private static String getDebugType(int type) {
+ private static String getDebugType(int type) {
return switch (type) {
case GL43.GL_DEBUG_TYPE_ERROR -> "ERROR";
case GL43.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR -> "DEPRECATED BEHAVIOR";
@@ -187,9 +188,9 @@ public final class GLDebug {
case GL43.GL_DEBUG_TYPE_MARKER -> "MARKER";
default -> String.format("Unknown [0x%X]", type);
};
- }
+ }
- private static String getDebugSeverity(int severity) {
+ private static String getDebugSeverity(int severity) {
return switch (severity) {
case GL43.GL_DEBUG_SEVERITY_NOTIFICATION -> "NOTIFICATION";
case GL43.GL_DEBUG_SEVERITY_HIGH -> "HIGH";
@@ -197,7 +198,7 @@ public final class GLDebug {
case GL43.GL_DEBUG_SEVERITY_LOW -> "LOW";
default -> String.format("Unknown [0x%X]", severity);
};
- }
+ }
private static String getSourceARB(int source) {
return switch (source) {
@@ -232,7 +233,7 @@ public final class GLDebug {
};
}
- private static String getCategoryAMD(int category) {
+ private static String getCategoryAMD(int category) {
return switch (category) {
case AMDDebugOutput.GL_DEBUG_CATEGORY_API_ERROR_AMD -> "API ERROR";
case AMDDebugOutput.GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD -> "WINDOW SYSTEM";
@@ -244,18 +245,18 @@ public final class GLDebug {
case AMDDebugOutput.GL_DEBUG_CATEGORY_OTHER_AMD -> "OTHER";
default -> String.format("Unknown [0x%X]", category);
};
- }
+ }
- private static String getSeverityAMD(int severity) {
+ private static String getSeverityAMD(int severity) {
return switch (severity) {
case AMDDebugOutput.GL_DEBUG_SEVERITY_HIGH_AMD -> "HIGH";
case AMDDebugOutput.GL_DEBUG_SEVERITY_MEDIUM_AMD -> "MEDIUM";
case AMDDebugOutput.GL_DEBUG_SEVERITY_LOW_AMD -> "LOW";
default -> String.format("Unknown [0x%X]", severity);
};
- }
+ }
- public static String getMatrixModeName(int mode) {
+ public static String getMatrixModeName(int mode) {
return switch (mode) {
case GL11.GL_MODELVIEW -> "MODELVIEW";
case GL11.GL_PROJECTION -> "PROJECTION";
@@ -263,9 +264,9 @@ public final class GLDebug {
case GL11.GL_COLOR -> "COLOR";
default -> String.format("0x%X", mode);
};
- }
+ }
- public static String getCapabilityName(int cap) {
+ public static String getCapabilityName(int cap) {
return switch (cap) {
case GL11.GL_ALPHA_TEST -> "ALPHA_TEST";
case GL11.GL_BLEND -> "BLEND";
@@ -295,9 +296,9 @@ public final class GLDebug {
case GL11.GL_LIGHT7 -> "LIGHT7";
default -> String.format("0x%X", cap);
};
- }
+ }
- public static String getComparisonFuncName(int func) {
+ public static String getComparisonFuncName(int func) {
return switch (func) {
case GL11.GL_NEVER -> "NEVER";
case GL11.GL_LESS -> "LESS";
@@ -309,9 +310,9 @@ public final class GLDebug {
case GL11.GL_ALWAYS -> "ALWAYS";
default -> String.format("0x%X", func);
};
- }
+ }
- public static String getBlendFactorName(int factor) {
+ public static String getBlendFactorName(int factor) {
return switch (factor) {
case GL11.GL_ZERO -> "ZERO";
case GL11.GL_ONE -> "ONE";
@@ -330,17 +331,17 @@ public final class GLDebug {
case GL11.GL_SRC_ALPHA_SATURATE -> "SRC_ALPHA_SATURATE";
default -> String.format("0x%X", factor);
};
- }
+ }
- public static String getShadeModelName(int mode) {
+ public static String getShadeModelName(int mode) {
return switch (mode) {
case GL11.GL_FLAT -> "FLAT";
case GL11.GL_SMOOTH -> "SMOOTH";
default -> String.format("0x%X", mode);
};
- }
+ }
- public static String getTextureTargetName(int target) {
+ public static String getTextureTargetName(int target) {
return switch (target) {
case GL11.GL_TEXTURE_1D -> "TEXTURE_1D";
case GL11.GL_TEXTURE_2D -> "TEXTURE_2D";
@@ -348,9 +349,9 @@ public final class GLDebug {
case GL13.GL_TEXTURE_CUBE_MAP -> "TEXTURE_CUBE_MAP";
default -> String.format("0x%X", target);
};
- }
+ }
- public static String getTexturePnameName(int pname) {
+ public static String getTexturePnameName(int pname) {
return switch (pname) {
case GL11.GL_TEXTURE_MIN_FILTER -> "TEXTURE_MIN_FILTER";
case GL11.GL_TEXTURE_MAG_FILTER -> "TEXTURE_MAG_FILTER";
@@ -367,9 +368,9 @@ public final class GLDebug {
case GL14.GL_GENERATE_MIPMAP -> "GENERATE_MIPMAP";
default -> String.format("0x%X", pname);
};
- }
+ }
- public static String getTextureFormatName(int format) {
+ public static String getTextureFormatName(int format) {
return switch (format) {
case GL11.GL_RED -> "RED";
case GL11.GL_GREEN -> "GREEN";
@@ -392,9 +393,9 @@ public final class GLDebug {
case GL11.GL_LUMINANCE8_ALPHA8 -> "LUMINANCE8_ALPHA8";
default -> String.format("0x%X", format);
};
- }
+ }
- public static String getDataTypeName(int type) {
+ public static String getDataTypeName(int type) {
return switch (type) {
case GL11.GL_UNSIGNED_BYTE -> "UNSIGNED_BYTE";
case GL11.GL_BYTE -> "BYTE";
@@ -411,9 +412,9 @@ public final class GLDebug {
case GL12.GL_UNSIGNED_INT_10_10_10_2 -> "UNSIGNED_INT_10_10_10_2";
default -> String.format("0x%X", type);
};
- }
+ }
- public static String getLightName(int light) {
+ public static String getLightName(int light) {
return switch (light) {
case GL11.GL_LIGHT0 -> "LIGHT0";
case GL11.GL_LIGHT1 -> "LIGHT1";
@@ -425,9 +426,9 @@ public final class GLDebug {
case GL11.GL_LIGHT7 -> "LIGHT7";
default -> String.format("0x%X", light);
};
- }
+ }
- public static String getLightPnameName(int pname) {
+ public static String getLightPnameName(int pname) {
return switch (pname) {
case GL11.GL_AMBIENT -> "AMBIENT";
case GL11.GL_DIFFUSE -> "DIFFUSE";
@@ -441,9 +442,9 @@ public final class GLDebug {
case GL11.GL_QUADRATIC_ATTENUATION -> "QUADRATIC_ATTENUATION";
default -> String.format("0x%X", pname);
};
- }
+ }
- public static String getMaterialPnameName(int pname) {
+ public static String getMaterialPnameName(int pname) {
return switch (pname) {
case GL11.GL_AMBIENT -> "AMBIENT";
case GL11.GL_DIFFUSE -> "DIFFUSE";
@@ -454,18 +455,18 @@ public final class GLDebug {
case GL11.GL_COLOR_INDEXES -> "COLOR_INDEXES";
default -> String.format("0x%X", pname);
};
- }
+ }
- public static String getFaceName(int face) {
+ public static String getFaceName(int face) {
return switch (face) {
case GL11.GL_FRONT -> "FRONT";
case GL11.GL_BACK -> "BACK";
case GL11.GL_FRONT_AND_BACK -> "FRONT_AND_BACK";
default -> String.format("0x%X", face);
};
- }
+ }
- public static String getColorMaterialModeName(int mode) {
+ public static String getColorMaterialModeName(int mode) {
return switch (mode) {
case GL11.GL_AMBIENT -> "AMBIENT";
case GL11.GL_DIFFUSE -> "DIFFUSE";
@@ -474,9 +475,9 @@ public final class GLDebug {
case GL11.GL_AMBIENT_AND_DIFFUSE -> "AMBIENT_AND_DIFFUSE";
default -> String.format("0x%X", mode);
};
- }
+ }
- public static String getFogPnameName(int pname) {
+ public static String getFogPnameName(int pname) {
return switch (pname) {
case GL11.GL_FOG_MODE -> "FOG_MODE";
case GL11.GL_FOG_DENSITY -> "FOG_DENSITY";
@@ -486,9 +487,9 @@ public final class GLDebug {
case GL11.GL_FOG_COLOR -> "FOG_COLOR";
default -> String.format("0x%X", pname);
};
- }
+ }
- public static String getLightModelPnameName(int pname) {
+ public static String getLightModelPnameName(int pname) {
return switch (pname) {
case GL11.GL_LIGHT_MODEL_AMBIENT -> "LIGHT_MODEL_AMBIENT";
case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> "LIGHT_MODEL_LOCAL_VIEWER";
@@ -496,9 +497,9 @@ public final class GLDebug {
case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> "LIGHT_MODEL_COLOR_CONTROL";
default -> String.format("0x%X", pname);
};
- }
+ }
- public static String getClearMaskString(int mask) {
+ public static String getClearMaskString(int mask) {
StringBuilder sb = new StringBuilder();
boolean first = true;
if ((mask & GL11.GL_COLOR_BUFFER_BIT) != 0) {
@@ -520,18 +521,18 @@ public final class GLDebug {
sb.append("ACCUM");
}
return sb.toString();
- }
+ }
- public static String getCullFaceName(int mode) {
+ public static String getCullFaceName(int mode) {
return switch (mode) {
case GL11.GL_FRONT -> "FRONT";
case GL11.GL_BACK -> "BACK";
case GL11.GL_FRONT_AND_BACK -> "FRONT_AND_BACK";
default -> String.format("0x%X", mode);
};
- }
+ }
- public static String getLogicOpName(int opcode) {
+ public static String getLogicOpName(int opcode) {
return switch (opcode) {
case GL11.GL_CLEAR -> "CLEAR";
case GL11.GL_AND -> "AND";
@@ -551,9 +552,9 @@ public final class GLDebug {
case GL11.GL_SET -> "SET";
default -> String.format("0x%X", opcode);
};
- }
+ }
- public static String getFramebufferStatusName(int status) {
+ public static String getFramebufferStatusName(int status) {
return switch (status) {
case GL30.GL_FRAMEBUFFER_COMPLETE -> "COMPLETE";
case GL30.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT -> "INCOMPLETE_ATTACHMENT";
@@ -565,9 +566,9 @@ public final class GLDebug {
case 0 -> "NO_FRAMEBUFFER_BOUND";
default -> String.format("UNKNOWN(0x%X)", status);
};
- }
+ }
- public static String getInternalFormatName(int format) {
+ public static String getInternalFormatName(int format) {
return switch (format) {
// Basic
case GL11.GL_RGBA -> "RGBA";
@@ -602,33 +603,38 @@ public final class GLDebug {
case GL11.GL_RGB10_A2 -> "RGB10_A2";
default -> String.format("0x%X", format);
};
- }
+ }
- private static DebugState debugState;
+ private static DebugState debugState;
private interface DebugState {
- void nameObject(int id, int object, String name);
- void pushGroup(String name);
- void popGroup();
+
+ void nameObject(int id, int object, String name);
+
+ void pushGroup(String name);
+
+ void popGroup();
+
void debugMessage(String name);
String getObjectLabel(int glProgram, int program);
}
- private static class KHRDebugState implements DebugState {
+ private static class KHRDebugState implements DebugState {
+
private static final int ID = 0;
- private int depth = 0;
+ private int depth = 0;
private static final int maxDepth = GL11.glGetInteger(KHRDebug.GL_MAX_DEBUG_GROUP_STACK_DEPTH);
private static final int maxNameLength = GL11.glGetInteger(KHRDebug.GL_MAX_LABEL_LENGTH);
private final String[] groupStack = new String[maxDepth + 1];
- @Override
- public void nameObject(int id, int object, String name) {
- KHRDebug.glObjectLabel(id, object, name);
- }
+ @Override
+ public void nameObject(int id, int object, String name) {
+ KHRDebug.glObjectLabel(id, object, name);
+ }
- @Override
- public void pushGroup(String name) {
+ @Override
+ public void pushGroup(String name) {
if (depth + 1 > maxDepth) {
final StringBuilder sb = new StringBuilder();
sb.append("Debug group stack overflow (maxDepth=").append(maxDepth).append("), current stack:\n");
@@ -639,46 +645,51 @@ public final class GLDebug {
throw new RuntimeException(sb.toString());
}
groupStack[depth] = name;
- KHRDebug.glPushDebugGroup(KHRDebug.GL_DEBUG_SOURCE_APPLICATION, ID, name);
+ KHRDebug.glPushDebugGroup(KHRDebug.GL_DEBUG_SOURCE_APPLICATION, ID, name);
depth++;
- }
+ }
- @Override
- public void popGroup() {
+ @Override
+ public void popGroup() {
if (depth - 1 < 0) {
throw new RuntimeException("Stack underflow");
}
KHRDebug.glPopDebugGroup();
depth--;
groupStack[depth] = null;
- }
+ }
@Override
public void debugMessage(String message) {
- KHRDebug.glDebugMessageInsert(KHRDebug.GL_DEBUG_SOURCE_APPLICATION, KHRDebug.GL_DEBUG_TYPE_MARKER, ID, KHRDebug.GL_DEBUG_SEVERITY_NOTIFICATION, message);
+ KHRDebug.glDebugMessageInsert(
+ KHRDebug.GL_DEBUG_SOURCE_APPLICATION,
+ KHRDebug.GL_DEBUG_TYPE_MARKER,
+ ID,
+ KHRDebug.GL_DEBUG_SEVERITY_NOTIFICATION,
+ message);
}
@Override
public String getObjectLabel(int glProgram, int program) {
- if(program == 0)
- return "";
+ if (program == 0) return "";
return KHRDebug.glGetObjectLabel(glProgram, program, maxNameLength);
}
}
- private static class UnsupportedDebugState implements DebugState {
- @Override
- public void nameObject(int id, int object, String name) {
- }
+ private static class UnsupportedDebugState implements DebugState {
- @Override
- public void pushGroup(String name) {
- }
+ @Override
+ public void nameObject(int id, int object, String name) {
+ }
- @Override
- public void popGroup() {
- }
+ @Override
+ public void pushGroup(String name) {
+ }
+
+ @Override
+ public void popGroup() {
+ }
@Override
public void debugMessage(String name) {
@@ -691,40 +702,43 @@ public final class GLDebug {
}
}
- public static void initDebugState() {
- if (GLStateManager.capabilities.GL_KHR_debug || GLStateManager.capabilities.OpenGL43) {
- debugState = new KHRDebugState();
- } else {
- debugState = new UnsupportedDebugState();
- }
- }
+ public static void initDebugState() {
+ if (GLStateManager.capabilities.GL_KHR_debug || GLStateManager.capabilities.OpenGL43) {
+ debugState = new KHRDebugState();
+ } else {
+ debugState = new UnsupportedDebugState();
+ }
+ }
public static void nameObject(int id, int object, String name) {
- if(debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
+ if (debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
debugState.nameObject(id, object, name);
}
}
+
public static void pushGroup(String group) {
- if(debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
+ if (debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
debugState.pushGroup(group);
}
}
+
public static void popGroup() {
- if(debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
+ if (debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
debugState.popGroup();
}
}
+
public static void debugMessage(String message) {
- if(debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
+ if (debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
debugState.debugMessage(message);
}
}
+
public static String getObjectLabel(int glProgram, int program) {
- if(debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
+ if (debugState != null && Thread.currentThread() == GLStateManager.getMainThread()) {
return debugState.getObjectLabel(glProgram, program);
}
return "";
}
-
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
similarity index 93%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
index 12aeac5fa..2186b4adf 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java
@@ -1,16 +1,20 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizon.gtnhlib.client.opengl.UniversalVAO;
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.gtnewhorizon.gtnhlib.client.opengl.UniversalVAO;
import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.stacks.IStateStack;
-import com.gtnewhorizons.angelica.AngelicaMod;
+import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
+import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage;
import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode;
-import com.gtnewhorizons.angelica.render.SelectionBoxRenderer;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
-import com.gtnewhorizons.angelica.glsm.ffp.TessellatorStreamingDrawer;
+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.GLSMInitConfig;
+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.TexImage2DCmd;
@@ -32,17 +36,13 @@ import com.gtnewhorizons.angelica.glsm.stacks.PointStateStack;
import com.gtnewhorizons.angelica.glsm.stacks.PolygonStateStack;
import com.gtnewhorizons.angelica.glsm.stacks.StencilStateStack;
import com.gtnewhorizons.angelica.glsm.stacks.ViewPortStateStack;
-import com.gtnewhorizons.angelica.glsm.states.VertexAttribState;
import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState;
import com.gtnewhorizons.angelica.glsm.states.Color4;
import com.gtnewhorizons.angelica.glsm.states.TextureBinding;
import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray;
+import com.gtnewhorizons.angelica.glsm.states.VertexAttribState;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
-import com.gtnewhorizons.angelica.glsm.texture.TextureTracker;
-import com.gtnewhorizons.angelica.hudcaching.HUDCaching;
-import com.gtnewhorizons.angelica.loading.AngelicaTweaker;
-import cpw.mods.fml.relauncher.ReflectionHelper;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
@@ -50,16 +50,8 @@ import it.unimi.dsi.fastutil.ints.IntStack;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;
-import net.coderbot.iris.Iris;
-import net.coderbot.iris.gbuffer_overrides.state.StateTracker;
-import net.coderbot.iris.gl.blending.AlphaTestStorage;
-import net.coderbot.iris.gl.blending.BlendModeStorage;
-import net.coderbot.iris.gl.blending.DepthColorStorage;
-import net.coderbot.iris.gl.program.ProgramUniforms;
-import net.coderbot.iris.samplers.IrisSamplers;
-import net.coderbot.iris.texture.pbr.PBRTextureManager;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.OpenGlHelper;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.joml.Matrix4d;
import org.joml.Matrix4f;
import org.joml.Matrix4fStack;
@@ -105,7 +97,6 @@ import static com.gtnewhorizons.angelica.glsm.Vendor.AMD;
import static com.gtnewhorizons.angelica.glsm.Vendor.INTEL;
import static com.gtnewhorizons.angelica.glsm.Vendor.MESA;
import static com.gtnewhorizons.angelica.glsm.Vendor.NVIDIA;
-import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
/**
* OpenGL State Manager - Provides cached state tracking and management for OpenGL operations.
@@ -115,12 +106,14 @@ import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
*
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 #preInit()} after GL context creation to initialize runtime state
+ * Call {@link #initialize(GLSMInitConfig)} after GL context creation to initialize runtime state
*
*/
@SuppressWarnings("unused") // Used in ASM
public class GLStateManager {
+ public static final Logger LOGGER = LogManager.getLogger("GLSM");
+
// Thread Checking - must be early in static init order so isMainThread() works for state initialization
@Getter private static final Thread MainThread = Thread.currentThread();
@@ -128,6 +121,8 @@ public class GLStateManager {
return Thread.currentThread() == MainThread;
}
+ @Getter private static GLSMInitConfig initConfig;
+
public static ContextCapabilities capabilities;
@Getter protected static boolean poppingAttributes;
@@ -160,10 +155,10 @@ public class GLStateManager {
/** Flush deferred vertex attribute uploads. Called before draw to ensure default attrib values are current. */
public static void flushDeferredVertexAttribs() {
- if (dirtyColorAttrib) {
- GL20.glVertexAttrib4f(Usage.COLOR.getAttributeLocation(), color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
- dirtyColorAttrib = false;
- }
+ GL20.glVertexAttrib4f(Usage.COLOR.getAttributeLocation(), color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
+ dirtyColorAttrib = false;
+ GL20.glVertexAttrib4f(Usage.SECONDARY_UV.getAttributeLocation(), GLSMConfig.lastBrightnessX, GLSMConfig.lastBrightnessY, 0.0f, 1.0f);
+ dirtyLightmapAttrib = false;
if (dirtyNormalAttrib) {
final var n = ShaderManager.getCurrentNormal();
GL20.glVertexAttrib3f(Usage.NORMAL.getAttributeLocation(), n.x, n.y, n.z);
@@ -174,14 +169,12 @@ public class GLStateManager {
GL20.glVertexAttrib4f(Usage.PRIMARY_UV.getAttributeLocation(), tc.x, tc.y, tc.z, tc.w);
dirtyTexCoordAttrib = false;
}
- if (dirtyLightmapAttrib) {
- GL20.glVertexAttrib4f(Usage.SECONDARY_UV.getAttributeLocation(), OpenGlHelper.lastBrightnessX, OpenGlHelper.lastBrightnessY, 0.0f, 1.0f);
- dirtyLightmapAttrib = false;
- }
}
// Highest texture unit index that has ever had a non-zero binding; limits onDeleteTexture scan range
private static int maxBoundTextureUnit = 0;
+ // Lock guard for texture bind callback (prevents recursion from RenderSystem.bindTextureToUnit)
+ private static boolean lockBindCallback;
// Deferred texture deletion: names kept valid until glGenTextures recycles them.
// Emulates Mesa/compat-profile behavior where delete-then-bind doesn't error.
@@ -193,7 +186,6 @@ public class GLStateManager {
// This setting varies depending on driver, so it gets queried at runtime
public static final int DEFAULT_DRAW_BUFFER = GL11.glGetInteger(GL11.GL_DRAW_BUFFER);
-
private static Thread CurrentThread = MainThread;
@Setter @Getter private static boolean runningSplash = true;
@@ -208,17 +200,15 @@ public class GLStateManager {
}
/**
- * Check if splash screen is complete.
- * After splash, there's only one GL context and no locking is needed.
+ * Check if splash screen is complete. After splash, there's only one GL context and no locking is needed.
*/
public static boolean isSplashComplete() {
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.
+ * 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()) {
@@ -263,6 +253,7 @@ public class GLStateManager {
@Getter private static int attribDepth = 0;
@SuppressWarnings("unchecked")
private static final List>[] modifiedAtDepth = new List[MAX_ATTRIB_STACK_DEPTH];
+
static {
for (int i = 0; i < MAX_ATTRIB_STACK_DEPTH; i++) {
modifiedAtDepth[i] = new ArrayList<>();
@@ -285,6 +276,7 @@ public class GLStateManager {
modifiedAtDepth[attribDepth - 1].add(stack);
}
}
+
protected static final IntegerStateStack activeTextureUnit = new IntegerStateStack(0);
private static int clientActiveTextureUnit = 0;
protected static final IntegerStateStack shadeModelState = new IntegerStateStack(GL11.GL_SMOOTH);
@@ -341,7 +333,10 @@ public class GLStateManager {
static float lineWidthMax = 1.0f;
/** True when the driver cannot render wide lines natively (Mesa forward-compat). GS emulation handles widths > 1.0. */
public static boolean wideLineEmulationEnabled = false;
- /** Set per draw call: true when the current draw is a line primitive that needs GS expansion. Read by {@link com.gtnewhorizons.angelica.glsm.ffp.VertexKey}. */
+ /**
+ * Set per draw call: true when the current draw is a line primitive that needs GS expansion. Read by
+ * {@link com.gtnewhorizons.angelica.glsm.ffp.VertexKey}.
+ */
public static boolean wideLineEmulationActive = false;
// Point state (GL_POINT_BIT)
@@ -395,7 +390,7 @@ public class GLStateManager {
private static final MethodHandle MAT4_STACK_CURR_DEPTH;
static {
- for (int i = 0; i < lightStates.length; i ++) {
+ for (int i = 0; i < lightStates.length; i++) {
lightStates[i] = new BooleanStateStack(GL11.GL_LIGHT0 + i, false, true);
lightDataStates[i] = new LightStateStack(GL11.GL_LIGHT0 + i);
}
@@ -405,10 +400,10 @@ public class GLStateManager {
}
try {
- final Field curr = ReflectionHelper.findField(Matrix4fStack.class, "curr");
+ final Field curr = Matrix4fStack.class.getDeclaredField("curr");
curr.setAccessible(true);
MAT4_STACK_CURR_DEPTH = MethodHandles.lookup().unreflectGetter(curr);
- } catch (IllegalAccessException e) {
+ } catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
@@ -422,6 +417,7 @@ public class GLStateManager {
@Getter protected static int boundEBO;
@Getter protected static int boundVAO;
private static final Int2IntOpenHashMap vaoEboMap = new Int2IntOpenHashMap();
+
static {
vaoEboMap.defaultReturnValue(0);
}
@@ -429,17 +425,17 @@ public class GLStateManager {
public static void reset() {
runningSplash = true;
- while(!attribs.isEmpty()) {
+ while (!attribs.isEmpty()) {
attribs.popInt();
}
final List> stacks = Feature.maskToFeatures(GL11.GL_ALL_ATTRIB_BITS);
final int size = stacks.size();
- for(int i = 0; i < size; i++) {
+ for (int i = 0; i < size; i++) {
final IStateStack> stack = stacks.get(i);
- while(!stack.isEmpty()) {
+ while (!stack.isEmpty()) {
stack.pop();
}
}
@@ -451,8 +447,7 @@ public class GLStateManager {
}
/**
- * Check if a display list exists (has been compiled and stored).
- * Delegates to DisplayListManager.
+ * 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
@@ -472,7 +467,13 @@ public class GLStateManager {
}
- public static void preInit() {
+ public static void initialize(GLSMInitConfig config) {
+ initConfig = config;
+ preInit(config.getDisplayWidth(), config.getDisplayHeight());
+ init(config.getPostInitCallback());
+ }
+
+ static void preInit(int displayWidth, int displayHeight) {
capabilities = GLContext.getCapabilities();
HAS_MULTIPLE_SET
.addFeature(GL11.GL_ACCUM_CLEAR_VALUE)
@@ -559,22 +560,20 @@ public class GLStateManager {
GL20.glVertexAttrib4f(1, 1.0f, 1.0f, 1.0f, 1.0f); // COLOR = white
GL20.glVertexAttrib3f(4, 0.0f, 0.0f, 1.0f); // NORMAL = +Z
- final Minecraft mc = Minecraft.getMinecraft();
- if (mc != null) {
+ if (displayWidth > 0 && displayHeight > 0) {
// Initialize viewport state from display dimensions.
// After Display.create(), viewport is (0, 0, width, height)
- viewportState.setViewPort(0, 0, mc.displayWidth, mc.displayHeight);
+ viewportState.setViewPort(0, 0, displayWidth, displayHeight);
}
}
- public static void init() {
+ static void init(Runnable initCallback) {
RenderSystem.initRenderer();
- IrisSamplers.initRenderer();
- if(BYPASS_CACHE) {
+ if (BYPASS_CACHE) {
LOGGER.info("GLStateManager cache bypassed");
}
- if(AngelicaMod.lwjglDebug) {
+ if (initConfig != null && initConfig.isLwjglDebug()) {
LOGGER.info("Enabling additional LWJGL debug output");
GLDebug.setupDebugMessageCallback();
@@ -587,7 +586,9 @@ public class GLStateManager {
GL30.glBindVertexArray(defaultVAO);
boundVAO = defaultVAO;
VertexAttribState.init(defaultVAO);
- SelectionBoxRenderer.init();
+ if (initCallback != null) {
+ initCallback.run();
+ }
// 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.
@@ -597,7 +598,6 @@ public class GLStateManager {
}
}
-
public static void assertMainThread() {
if (Thread.currentThread() != CurrentThread && !runningSplash) {
LOGGER.info("Call from not the Current Thread! - " + Thread.currentThread().getName() + " Current thread: " + CurrentThread.getName());
@@ -610,16 +610,13 @@ public class GLStateManager {
}
/**
- * Returns true if we should use DSA for texture operations.
- * DSA relies on cached texture bindings, which aren't tracked when caching is disabled.
- * Also, proxy textures are special query textures that shouldn't use DSA.
+ * Returns true if we should use DSA for texture operations. DSA relies on cached texture bindings, which aren't tracked when caching is disabled. Also,
+ * proxy textures are special query textures that shouldn't use DSA.
*/
private static boolean shouldUseDSA(int target) {
if (!isCachingEnabled()) return false;
// Proxy textures are for capability queries, not real textures
- return target != GL11.GL_PROXY_TEXTURE_1D
- && target != GL11.GL_PROXY_TEXTURE_2D
- && target != GL12.GL_PROXY_TEXTURE_3D;
+ return target != GL11.GL_PROXY_TEXTURE_1D && target != GL11.GL_PROXY_TEXTURE_2D && target != GL12.GL_PROXY_TEXTURE_3D;
}
// LWJGL Overrides
@@ -784,7 +781,7 @@ public class GLStateManager {
}
public static boolean glIsEnabled(int cap) {
- if(shouldBypassCache()) {
+ if (shouldBypassCache()) {
return GL11.glIsEnabled(cap);
}
// Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
@@ -858,7 +855,7 @@ public class GLStateManager {
}
public static boolean glGetBoolean(int pname) {
- if(shouldBypassCache()) {
+ if (shouldBypassCache()) {
return GL11.glGetBoolean(pname);
}
// Handle clip planes dynamically (supports up to MAX_CLIP_PLANES)
@@ -935,7 +932,7 @@ public class GLStateManager {
}
public static void glGetBoolean(int pname, ByteBuffer params) {
- if(shouldBypassCache()) {
+ if (shouldBypassCache()) {
GL11.glGetBoolean(pname, params);
return;
}
@@ -948,7 +945,7 @@ public class GLStateManager {
params.put((byte) (colorMask.alpha ? GL11.GL_TRUE : GL11.GL_FALSE));
}
default -> {
- if(!HAS_MULTIPLE_SET.contains(pname)) {
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
params.put(0, (byte) (glGetBoolean(pname) ? GL11.GL_TRUE : GL11.GL_FALSE));
} else {
GL11.glGetBoolean(pname, params);
@@ -964,7 +961,7 @@ public class GLStateManager {
}
public static int glGetInteger(int pname) {
- if(shouldBypassCache()) {
+ if (shouldBypassCache()) {
return GL11.glGetInteger(pname);
}
@@ -1022,7 +1019,7 @@ public class GLStateManager {
}
public static void glGetInteger(int pname, IntBuffer params) {
- if(shouldBypassCache()) {
+ if (shouldBypassCache()) {
GL11.glGetInteger(pname, params);
return;
}
@@ -1030,7 +1027,7 @@ public class GLStateManager {
switch (pname) {
case GL11.GL_VIEWPORT -> viewportState.get(params);
default -> {
- if(!HAS_MULTIPLE_SET.contains(pname)) {
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
params.put(0, glGetInteger(pname));
} else {
GL11.glGetInteger(pname, params);
@@ -1043,7 +1040,7 @@ public class GLStateManager {
final MaterialStateStack state;
if (face == GL11.GL_FRONT) {
state = frontMaterial;
- } else if (face == GL11.GL_BACK) {
+ } else if (face == GL11.GL_BACK) {
state = backMaterial;
} else {
throw new RuntimeException("Invalid face parameter specified to glGetMaterial: " + face);
@@ -1056,7 +1053,8 @@ public class GLStateManager {
case GL11.GL_EMISSION -> state.emission.get(0, params);
case GL11.GL_SHININESS -> params.put(state.shininess);
case GL11.GL_COLOR_INDEXES -> state.colorIndexes.get(0, params);
- default -> {}
+ default -> {
+ }
}
}
@@ -1073,12 +1071,13 @@ public class GLStateManager {
case GL11.GL_CONSTANT_ATTENUATION -> params.put(state.constantAttenuation);
case GL11.GL_LINEAR_ATTENUATION -> params.put(state.linearAttenuation);
case GL11.GL_QUADRATIC_ATTENUATION -> params.put(state.quadraticAttenuation);
- default -> {}
+ default -> {
+ }
}
}
public static void glGetFloat(int pname, FloatBuffer params) {
- if(shouldBypassCache()) {
+ if (shouldBypassCache()) {
GL11.glGetFloat(pname, params);
return;
}
@@ -1108,7 +1107,7 @@ public class GLStateManager {
}
case GL11.GL_LIGHT_MODEL_AMBIENT -> lightModel.ambient.get(0, params);
default -> {
- if(!HAS_MULTIPLE_SET.contains(pname)) {
+ if (!HAS_MULTIPLE_SET.contains(pname)) {
params.put(0, glGetFloat(pname));
} else {
GL11.glGetFloat(pname, params);
@@ -1142,8 +1141,7 @@ public class GLStateManager {
}
final boolean caching = isCachingEnabled();
final boolean bypass = BYPASS_CACHE || !caching;
- if (bypass || red != blendState.getBlendColorR() || green != blendState.getBlendColorG()
- || blue != blendState.getBlendColorB() || alpha != blendState.getBlendColorA()) {
+ if (bypass || red != blendState.getBlendColorR() || green != blendState.getBlendColorG() || blue != blendState.getBlendColorB() || alpha != blendState.getBlendColorA()) {
if (caching) {
blendState.setBlendColorR(red);
blendState.setBlendColorG(green);
@@ -1162,11 +1160,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (BlendModeStorage.isBlendLocked()) {
- BlendModeStorage.deferBlendModeToggle(true);
- return;
- }
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ bh.deferBlendModeToggle(true);
+ return;
}
blendMode.enable();
}
@@ -1179,11 +1176,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (BlendModeStorage.isBlendLocked()) {
- BlendModeStorage.deferBlendModeToggle(false);
- return;
- }
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ bh.deferBlendModeToggle(false);
+ return;
}
blendMode.disable();
}
@@ -1218,24 +1214,40 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (BlendModeStorage.isBlendLocked()) {
- BlendModeStorage.deferBlendFunc(srcFactor, dstFactor, srcFactor, dstFactor);
- return;
- }
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ bh.deferBlendFunc(srcFactor, dstFactor, srcFactor, dstFactor);
+ return;
}
// Cache thread check - only update state on main thread, but always make GL call if needed
final boolean caching = isCachingEnabled();
- if (HUDCaching.renderingCacheOverride) {
+ if (GLSMConfig.hudCacheOverride) {
if (caching) blendState.setAll(srcFactor, dstFactor, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
- OpenGlHelper.glBlendFunc(srcFactor, dstFactor, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL14.glBlendFuncSeparate(srcFactor, dstFactor, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) {
+ GLSMHooks.blendFuncChangeEvent.srcRgb = srcFactor;
+ GLSMHooks.blendFuncChangeEvent.dstRgb = dstFactor;
+ GLSMHooks.blendFuncChangeEvent.srcAlpha = GL11.GL_ONE;
+ GLSMHooks.blendFuncChangeEvent.dstAlpha = GL11.GL_ONE_MINUS_SRC_ALPHA;
+ GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent);
+ }
return;
}
final boolean bypass = BYPASS_CACHE || !caching;
- if (bypass || blendState.getSrcRgb() != srcFactor || blendState.getDstRgb() != dstFactor
- || blendState.getSrcAlpha() != srcFactor || blendState.getDstAlpha() != dstFactor) {
+ if (bypass
+ || blendState.getSrcRgb() != srcFactor
+ || blendState.getDstRgb() != dstFactor
+ || blendState.getSrcAlpha() != srcFactor
+ || blendState.getDstAlpha() != dstFactor) {
if (caching) blendState.setAll(srcFactor, dstFactor, srcFactor, dstFactor);
GL11.glBlendFunc(srcFactor, dstFactor);
+ if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) {
+ GLSMHooks.blendFuncChangeEvent.srcRgb = srcFactor;
+ GLSMHooks.blendFuncChangeEvent.dstRgb = dstFactor;
+ GLSMHooks.blendFuncChangeEvent.srcAlpha = srcFactor;
+ GLSMHooks.blendFuncChangeEvent.dstAlpha = dstFactor;
+ GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent);
+ }
}
}
@@ -1277,13 +1289,12 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (BlendModeStorage.isBlendLocked()) {
- BlendModeStorage.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
- return;
- }
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null && bh.isBlendLocked()) {
+ bh.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ return;
}
- if (HUDCaching.renderingCacheOverride && dstAlpha != GL11.GL_ONE_MINUS_SRC_ALPHA) {
+ if (GLSMConfig.hudCacheOverride && dstAlpha != GL11.GL_ONE_MINUS_SRC_ALPHA) {
srcAlpha = GL11.GL_ONE;
dstAlpha = GL11.GL_ONE_MINUS_SRC_ALPHA;
}
@@ -1292,13 +1303,21 @@ public class GLStateManager {
final boolean bypass = BYPASS_CACHE || !caching;
if (bypass || blendState.getSrcRgb() != srcRgb || blendState.getDstRgb() != dstRgb || blendState.getSrcAlpha() != srcAlpha || blendState.getDstAlpha() != dstAlpha) {
if (caching) blendState.setAll(srcRgb, dstRgb, srcAlpha, dstAlpha);
- OpenGlHelper.glBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ GL14.glBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) {
+ GLSMHooks.blendFuncChangeEvent.srcRgb = srcRgb;
+ GLSMHooks.blendFuncChangeEvent.dstRgb = dstRgb;
+ GLSMHooks.blendFuncChangeEvent.srcAlpha = srcAlpha;
+ GLSMHooks.blendFuncChangeEvent.dstAlpha = dstAlpha;
+ GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent);
+ }
}
}
public static void checkCompiling() {
checkCompiling("");
}
+
public static void checkCompiling(String name) {
if (DisplayListManager.isRecording()) {
throw new UnsupportedOperationException("Not yet implemented (" + name + ")");
@@ -1317,6 +1336,7 @@ public class GLStateManager {
}
dirtyNormalAttrib = true;
}
+
public static void glNormal3d(double nx, double ny, double nz) {
final float fnx = (float) nx, fny = (float) ny, fnz = (float) nz;
ShaderManager.setCurrentNormal(fnx, fny, fnz);
@@ -1326,6 +1346,7 @@ public class GLStateManager {
}
dirtyNormalAttrib = true;
}
+
public static void glNormal3f(float nx, float ny, float nz) {
ShaderManager.setCurrentNormal(nx, ny, nz);
if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
@@ -1334,6 +1355,7 @@ public class GLStateManager {
}
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;
ShaderManager.setCurrentNormal(fnx, fny, fnz);
@@ -1367,11 +1389,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (DepthColorStorage.isDepthColorLocked()) {
- DepthColorStorage.deferDepthEnable(mask);
- return;
- }
+ final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
+ if (dch != null && dch.isDepthColorLocked()) {
+ dch.deferDepthEnable(mask);
+ return;
}
final boolean caching = isCachingEnabled();
if (BYPASS_CACHE || !caching || mask != depthState.isEnabled()) {
@@ -1480,7 +1501,7 @@ public class GLStateManager {
return ((b - Byte.MIN_VALUE) & 0xFF) / 255.0F;
}
- public static float i2f(int i) { return ((i - Integer.MIN_VALUE) & 0xFFFFFFFFL) / 4294967295.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) {
// Helper function for glColor*
@@ -1503,6 +1524,7 @@ public class GLStateManager {
}
private static final Color4 DirtyColor = new Color4(-1.0F, -1.0F, -1.0F, -1.0F);
+
public static void clearCurrentColor() {
// Marks the cache dirty, doesn't actually reset the color
color.set(DirtyColor);
@@ -1516,11 +1538,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (DepthColorStorage.isDepthColorLocked()) {
- DepthColorStorage.deferColorMask(red, green, blue, alpha);
- return;
- }
+ final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler;
+ if (dch != null && dch.isDepthColorLocked()) {
+ dch.deferColorMask(red, green, blue, alpha);
+ return;
}
// Cache thread check - only update state on main thread, but always make GL call if needed
final boolean caching = isCachingEnabled();
@@ -1573,11 +1594,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (AlphaTestStorage.isAlphaTestLocked()) {
- AlphaTestStorage.deferAlphaTestToggle(true);
- return;
- }
+ final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
+ if (ah != null && ah.isAlphaTestLocked()) {
+ ah.deferAlphaTestToggle(true);
+ return;
}
alphaTest.enable();
fragmentGeneration++;
@@ -1591,11 +1611,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (AlphaTestStorage.isAlphaTestLocked()) {
- AlphaTestStorage.deferAlphaTestToggle(false);
- return;
- }
+ final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
+ if (ah != null && ah.isAlphaTestLocked()) {
+ ah.deferAlphaTestToggle(false);
+ return;
}
alphaTest.disable();
fragmentGeneration++;
@@ -1609,11 +1628,10 @@ public class GLStateManager {
return;
}
}
- if (Iris.enabled) {
- if (AlphaTestStorage.isAlphaTestLocked()) {
- AlphaTestStorage.deferAlphaFunc(function, reference);
- return;
- }
+ final DeferredAlphaHandler ah = GLSMHooks.alphaHandler;
+ if (ah != null && ah.isAlphaTestLocked()) {
+ ah.deferAlphaFunc(function, reference);
+ return;
}
if (isCachingEnabled()) {
alphaState.setFunction(function);
@@ -1714,14 +1732,22 @@ public class GLStateManager {
if (texture != 0 && activeUnit > maxBoundTextureUnit) {
maxBoundTextureUnit = activeUnit;
}
- TextureTracker.INSTANCE.onBindTexture(texture);
+ if (!lockBindCallback && activeTextureUnit.getValue() == 0) {
+ lockBindCallback = true;
+ if (GLSMHooks.TEXTURE_BIND.hasListeners()) {
+ GLSMHooks.textureBindEvent.textureId = texture;
+ GLSMHooks.TEXTURE_BIND.post(GLSMHooks.textureBindEvent);
+ }
+ RenderSystem.bindTextureToUnit(0, texture);
+ lockBindCallback = false;
+ }
}
}
private static int changeFormatIfDeprecated(int internalformat) {
switch (internalformat) {
- case GL11.GL_ALPHA4 -> internalformat = GL11.GL_RGBA4;
- case GL11.GL_ALPHA8 -> internalformat = GL11.GL_RGBA8;
+ case GL11.GL_ALPHA4 -> internalformat = GL11.GL_RGBA4;
+ case GL11.GL_ALPHA8 -> internalformat = GL11.GL_RGBA8;
case GL11.GL_ALPHA12 -> internalformat = GL11.GL_RGBA12;
case GL11.GL_ALPHA16 -> internalformat = GL11.GL_RGBA16;
}
@@ -1828,6 +1854,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord(s, 0.0f, 0.0f, 1.0f);
dirtyTexCoordAttrib = true;
}
+
public static void glTexCoord1d(double s) {
if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
ImmediateModeRecorder.setTexCoord((float) s, 0.0f);
@@ -1836,6 +1863,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord((float) s, 0.0f, 0.0f, 1.0f);
dirtyTexCoordAttrib = true;
}
+
public static void glTexCoord2f(float s, float t) {
if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
ImmediateModeRecorder.setTexCoord(s, t);
@@ -1844,6 +1872,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord(s, t, 0.0f, 1.0f);
dirtyTexCoordAttrib = true;
}
+
public static void glTexCoord2d(double s, double t) {
if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
ImmediateModeRecorder.setTexCoord((float) s, (float) t);
@@ -1852,6 +1881,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord((float) s, (float) t, 0.0f, 1.0f);
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
@@ -1860,6 +1890,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord(s, t, r, 1.0f);
dirtyTexCoordAttrib = true;
}
+
public static void glTexCoord3d(double s, double t, double r) {
if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
ImmediateModeRecorder.setTexCoord((float) s, (float) t);
@@ -1868,6 +1899,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord((float) s, (float) t, (float) r, 1.0f);
dirtyTexCoordAttrib = true;
}
+
public static void glTexCoord4f(float s, float t, float r, float q) {
if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) {
ImmediateModeRecorder.setTexCoord(s, t);
@@ -1876,6 +1908,7 @@ public class GLStateManager {
ShaderManager.setCurrentTexCoord(s, t, r, q);
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);
@@ -1891,7 +1924,7 @@ public class GLStateManager {
}
public static void glDeleteTextures(IntBuffer ids) {
- for(int i = 0; i < ids.remaining(); i++) {
+ for (int i = 0; i < ids.remaining(); i++) {
final int id = ids.get(ids.position() + i);
deferDeleteTexture(id);
onDeleteTexture(id);
@@ -1960,20 +1993,10 @@ public class GLStateManager {
}
}
final int textureUnit = getActiveTextureUnit();
- if (Iris.enabled) {
- // Iris
- boolean updatePipeline = false;
- if (textureUnit == IrisSamplers.ALBEDO_TEXTURE_UNIT) {
- StateTracker.INSTANCE.albedoSampler = true;
- updatePipeline = true;
- } else if (textureUnit == IrisSamplers.LIGHTMAP_TEXTURE_UNIT) {
- StateTracker.INSTANCE.lightmapSampler = true;
- updatePipeline = true;
- }
-
- if (updatePipeline) {
- Iris.getPipelineManager().getPipeline().ifPresent(p -> p.setInputs(StateTracker.INSTANCE.getInputs()));
- }
+ if (GLSMHooks.TEXTURE_UNIT_STATE.hasListeners()) {
+ GLSMHooks.textureUnitStateEvent.unit = textureUnit;
+ GLSMHooks.textureUnitStateEvent.enabled = true;
+ GLSMHooks.TEXTURE_UNIT_STATE.post(GLSMHooks.textureUnitStateEvent);
}
textures.getTextureUnitStates(textureUnit).enable();
}
@@ -1987,20 +2010,10 @@ public class GLStateManager {
}
}
final int textureUnit = getActiveTextureUnit();
- if (Iris.enabled) {
- // Iris
- boolean updatePipeline = false;
- if (textureUnit == IrisSamplers.ALBEDO_TEXTURE_UNIT) {
- StateTracker.INSTANCE.albedoSampler = false;
- updatePipeline = true;
- } else if (textureUnit == IrisSamplers.LIGHTMAP_TEXTURE_UNIT) {
- StateTracker.INSTANCE.lightmapSampler = false;
- updatePipeline = true;
- }
-
- if (updatePipeline) {
- Iris.getPipelineManager().getPipeline().ifPresent(p -> p.setInputs(StateTracker.INSTANCE.getInputs()));
- }
+ if (GLSMHooks.TEXTURE_UNIT_STATE.hasListeners()) {
+ GLSMHooks.textureUnitStateEvent.unit = textureUnit;
+ GLSMHooks.textureUnitStateEvent.enabled = false;
+ GLSMHooks.TEXTURE_UNIT_STATE.post(GLSMHooks.textureUnitStateEvent);
}
textures.getTextureUnitStates(textureUnit).disable();
}
@@ -2052,13 +2065,19 @@ public class GLStateManager {
if (DisplayListManager.isRecording()) {
final DirectTessellator result = ImmediateModeRecorder.end();
if (result != null) {
+ if (DisplayListManager.isCompileAndExecute() && initConfig != null && initConfig.getDirectDrawer() != null) {
+ DisplayListManager.flushMatrix();
+ final var recorder = DisplayListManager.pauseRecording();
+ initConfig.getDirectDrawer().accept(result);
+ DisplayListManager.resumeRecording(recorder);
+ }
DisplayListManager.addImmediateModeDraw(result);
}
return;
}
final DirectTessellator result = ImmediateModeRecorder.end();
- if (result != null) {
- TessellatorStreamingDrawer.drawDirect(result);
+ if (result != null && initConfig != null && initConfig.getDirectDrawer() != null) {
+ initConfig.getDirectDrawer().accept(result);
}
}
@@ -2164,6 +2183,7 @@ public class GLStateManager {
}
public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) {
+ CommandRecorder savedRecorder = null;
final RecordMode recordMode = DisplayListManager.getRecordMode();
if (recordMode != RecordMode.NONE) {
if (isVAOBound()) {
@@ -2179,8 +2199,8 @@ public class GLStateManager {
if (recordMode == RecordMode.COMPILE) {
return;
}
- }
- if (FeedbackManager.isFeedbackMode()) {
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
FeedbackManager.processDrawElements(mode, indices_count, type, indices_buffer_offset);
return;
}
@@ -2191,6 +2211,7 @@ public class GLStateManager {
} else {
GL11.glDrawElements(mode, indices_count, type, indices_buffer_offset);
}
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
}
public static void glDrawBuffer(int mode) {
@@ -2206,14 +2227,18 @@ public class GLStateManager {
}
public static void glDrawArrays(int mode, int first, int count) {
- if (DisplayListManager.isRecording()) {
+ 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);
}
- return;
- }
- if (FeedbackManager.isFeedbackMode()) {
+ if (recordMode == RecordMode.COMPILE) {
+ return;
+ }
+ savedRecorder = DisplayListManager.pauseRecording();
+ } else if (FeedbackManager.isFeedbackMode()) {
FeedbackManager.processDrawArrays(mode, first, count);
return;
}
@@ -2224,6 +2249,7 @@ public class GLStateManager {
} else {
GL11.glDrawArrays(mode, first, count);
}
+ if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder);
}
public static void glVertexPointer(int size, int stride, IntBuffer pointer) {
@@ -2764,6 +2790,9 @@ public class GLStateManager {
}
}
fogMode.enable();
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
}
public static void disableFog() {
@@ -2775,6 +2804,9 @@ public class GLStateManager {
}
}
fogMode.disable();
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
}
public static void glFog(int pname, FloatBuffer param) {
@@ -2785,7 +2817,6 @@ public class GLStateManager {
return;
}
}
- // TODO: Iris Notifier
if (HAS_MULTIPLE_SET.contains(pname)) {
if (pname == GL11.GL_FOG_COLOR && isCachingEnabled()) {
final float red = param.get(0);
@@ -2797,6 +2828,9 @@ public class GLStateManager {
fogState.getFogColorBuffer().clear();
fogState.getFogColorBuffer().put((FloatBuffer) param.position(0)).flip();
fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
}
} else {
GLStateManager.glFogf(pname, param.get(0));
@@ -2816,6 +2850,9 @@ public class GLStateManager {
fogState.getFogColorBuffer().clear();
fogState.getFogColorBuffer().put(red).put(green).put(blue).put(alpha).flip();
fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
}
}
}
@@ -2830,11 +2867,16 @@ public class GLStateManager {
}
// Update cached state (FFP shader reads from cache)
if (isCachingEnabled()) {
+ boolean changed = true;
switch (pname) {
case GL11.GL_FOG_DENSITY -> { fogState.setDensity(param); fragmentGeneration++; }
case GL11.GL_FOG_START -> { fogState.setStart(param); fragmentGeneration++; }
case GL11.GL_FOG_END -> { fogState.setEnd(param); fragmentGeneration++; }
case GL11.GL_FOG_MODE -> { fogState.setFogMode((int) param); fragmentGeneration++; }
+ default -> changed = false;
+ }
+ if (changed && GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
}
}
}
@@ -2851,6 +2893,9 @@ public class GLStateManager {
if (isCachingEnabled() && pname == GL11.GL_FOG_MODE) {
fogState.setFogMode(param);
fragmentGeneration++;
+ if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) {
+ GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent);
+ }
}
}
@@ -2879,10 +2924,10 @@ public class GLStateManager {
// Iris Functions
private static void onDeleteTexture(int id) {
- TextureTracker.INSTANCE.onDeleteTexture(id);
TextureInfoCache.INSTANCE.onDeleteTexture(id);
- if (Iris.enabled) {
- PBRTextureManager.INSTANCE.onDeleteTexture(id);
+ if (GLSMHooks.TEXTURE_DELETE.hasListeners()) {
+ GLSMHooks.textureDeleteEvent.textureId = id;
+ GLSMHooks.TEXTURE_DELETE.post(GLSMHooks.textureDeleteEvent);
}
// Always delete
@@ -2916,8 +2961,7 @@ public class GLStateManager {
if (drawableGL != null && drawable == drawableGL) {
// Switching TO DrawableGL - enable caching for this thread
drawableGLHolder = CurrentThread;
- }
- else if (drawableGLHolder == CurrentThread) {
+ } else if (drawableGLHolder == CurrentThread) {
// This thread held DrawableGL but is switching AWAY - disable caching
drawableGLHolder = null;
}
@@ -2925,8 +2969,7 @@ public class GLStateManager {
}
/**
- * Mark splash as complete - enables fast path that always caches.
- * Called when finish() permanently switches to DrawableGL for the main game loop.
+ * Mark splash as complete - enables fast path that always caches. Called when finish() permanently switches to DrawableGL for the main game loop.
*/
public static void markSplashComplete() {
splashComplete = true;
@@ -2972,8 +3015,8 @@ public class GLStateManager {
}
/**
- * Get a compiled display list from the cache.
- * Used for executing nested display lists.
+ * 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
*/
@@ -3126,6 +3169,7 @@ public class GLStateManager {
}
GL11.glClear(mask);
}
+
public static void glPushAttrib(int mask) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
@@ -3182,7 +3226,10 @@ public class GLStateManager {
return;
}
}
- if (isCachingEnabled()) { getMatrixStack().set(m); bumpMatrixGeneration(); }
+ if (isCachingEnabled()) {
+ getMatrixStack().set(m);
+ bumpMatrixGeneration();
+ }
}
public static void glLoadMatrix(DoubleBuffer m) {
@@ -3241,46 +3288,62 @@ public class GLStateManager {
return;
}
}
- if (isCachingEnabled()) { getMatrixStack().identity(); bumpMatrixGeneration(); }
+ if (isCachingEnabled()) {
+ getMatrixStack().identity();
+ bumpMatrixGeneration();
+ }
}
public static void glTranslatef(float x, float y, float z) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransform(x, y, z, DisplayListManager.TransformOp.TRANSLATE, null);
- return;
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().translate(x, y, z);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().translate(x, y, z); bumpMatrixGeneration(); }
}
public static void glTranslated(double x, double y, double z) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransform((float) x, (float) y, (float) z, DisplayListManager.TransformOp.TRANSLATE, null);
- return;
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().translate((float) x, (float) y, (float) z);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().translate((float) x, (float) y, (float) z); bumpMatrixGeneration(); }
}
public static void glScalef(float x, float y, float z) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransform(x, y, z, DisplayListManager.TransformOp.SCALE, null);
- return;
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().scale(x, y, z);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().scale(x, y, z); bumpMatrixGeneration(); }
}
public static void glScaled(double x, double y, double z) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransform((float) x, (float) y, (float) z, DisplayListManager.TransformOp.SCALE, null);
- return;
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().scale((float) x, (float) y, (float) z);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().scale((float) x, (float) y, (float) z); bumpMatrixGeneration(); }
}
private static final Matrix4f multMatrix = new Matrix4f();
+
public static void glMultMatrix(FloatBuffer floatBuffer) {
multMatrix.set(floatBuffer);
final int currentMode = matrixMode.getMode();
@@ -3288,13 +3351,17 @@ public class GLStateManager {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransform(multMatrix);
- return;
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().mul(multMatrix);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().mul(multMatrix); bumpMatrixGeneration(); }
}
public static final Matrix4d conversionMatrix4d = new Matrix4d();
public static final Matrix4f conversionMatrix4f = new Matrix4f();
+
public static void glMultMatrix(DoubleBuffer matrix) {
conversionMatrix4d.set(matrix);
conversionMatrix4f.set(conversionMatrix4d);
@@ -3302,12 +3369,16 @@ public class GLStateManager {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransform(conversionMatrix4f);
- return;
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().mul(conversionMatrix4f);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().mul(conversionMatrix4f); bumpMatrixGeneration(); }
}
private static final Vector3f rotation = new Vector3f();
+
public static void glRotatef(float angle, float x, float y, float z) {
final float lenSq = x * x + y * y + z * z;
if (lenSq == 0.0f) return;
@@ -3315,11 +3386,11 @@ public class GLStateManager {
if (mode != RecordMode.NONE) {
rotation.set(x, y, z).normalize();
DisplayListManager.updateRelativeTransform(angle, 0, 0, DisplayListManager.TransformOp.ROTATE, rotation);
- return;
+ if (mode == RecordMode.COMPILE) return;
}
if (isCachingEnabled()) {
rotation.set(x, y, z).normalize();
- getMatrixStack().rotate((float)Math.toRadians(angle), rotation);
+ getMatrixStack().rotate((float) Math.toRadians(angle), rotation);
bumpMatrixGeneration();
}
}
@@ -3331,11 +3402,11 @@ public class GLStateManager {
if (mode != RecordMode.NONE) {
rotation.set((float) x, (float) y, (float) z).normalize();
DisplayListManager.updateRelativeTransform((float) angle, 0, 0, DisplayListManager.TransformOp.ROTATE, rotation);
- return;
+ if (mode == RecordMode.COMPILE) return;
}
if (isCachingEnabled()) {
rotation.set((float) x, (float) y, (float) z).normalize();
- getMatrixStack().rotate((float)Math.toRadians(angle), rotation);
+ getMatrixStack().rotate((float) Math.toRadians(angle), rotation);
bumpMatrixGeneration();
}
}
@@ -3344,19 +3415,26 @@ public class GLStateManager {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransformOrtho(left, right, bottom, top, zNear, zFar);
- return; // Transform accumulated, will be emitted at barriers
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().ortho((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().ortho((float)left, (float)right, (float)bottom, (float)top, (float)zNear, (float)zFar); bumpMatrixGeneration(); }
}
public static void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
DisplayListManager.updateRelativeTransformFrustum(left, right, bottom, top, zNear, zFar);
- return; // Transform accumulated, will be emitted at barriers
+ if (mode == RecordMode.COMPILE) return;
+ }
+ if (isCachingEnabled()) {
+ getMatrixStack().frustum((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar);
+ bumpMatrixGeneration();
}
- if (isCachingEnabled()) { getMatrixStack().frustum((float)left, (float)right, (float)bottom, (float)top, (float)zNear, (float)zFar); bumpMatrixGeneration(); }
}
+
public static void glPushMatrix() {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
@@ -3369,9 +3447,8 @@ public class GLStateManager {
if (isCachingEnabled()) {
try {
getMatrixStack().pushMatrix();
- } catch(IllegalStateException ignored) {
- if(AngelicaMod.lwjglDebug)
- AngelicaTweaker.LOGGER.warn("Matrix stack overflow ", new Throwable());
+ } catch (IllegalStateException ignored) {
+ if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack overflow ", new Throwable());
}
}
}
@@ -3389,9 +3466,8 @@ public class GLStateManager {
try {
getMatrixStack().popMatrix();
bumpMatrixGeneration();
- } catch(IllegalStateException ignored) {
- if(AngelicaMod.lwjglDebug)
- AngelicaTweaker.LOGGER.warn("Matrix stack underflow ", new Throwable());
+ } catch (IllegalStateException ignored) {
+ if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack underflow ", new Throwable());
}
}
}
@@ -3400,7 +3476,7 @@ public class GLStateManager {
private static final FloatBuffer gluBuffer = BufferUtils.createFloatBuffer(16);
public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) {
- gluMatrix.identity().perspective((float)Math.toRadians(fovy), aspect, zNear, zFar);
+ gluMatrix.identity().perspective((float) Math.toRadians(fovy), aspect, zNear, zFar);
gluMatrix.get(0, gluBuffer);
GLStateManager.glMultMatrix(gluBuffer);
}
@@ -3418,13 +3494,10 @@ public class GLStateManager {
public static void gluPickMatrix(float x, float y, float deltaX, float deltaY, IntBuffer viewport) {
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);
+ (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 void glViewport(int x, int y, int width, int height) {
@@ -3450,7 +3523,6 @@ public class GLStateManager {
return DisplayListManager.getListMode();
}
-
public static boolean updateTexParameteriCache(int target, int texture, int pname, int param) {
if (target != GL11.GL_TEXTURE_2D) {
return true;
@@ -3461,49 +3533,48 @@ public class GLStateManager {
}
switch (pname) {
case GL11.GL_TEXTURE_MIN_FILTER -> {
- if(info.getMinFilter() == param && !shouldBypassCache()) return false;
+ if (info.getMinFilter() == param && !shouldBypassCache()) return false;
info.setMinFilter(param);
}
case GL11.GL_TEXTURE_MAG_FILTER -> {
- if(info.getMagFilter() == param && !shouldBypassCache()) return false;
+ if (info.getMagFilter() == param && !shouldBypassCache()) return false;
info.setMagFilter(param);
}
case GL11.GL_TEXTURE_WRAP_S -> {
- if(info.getWrapS() == param && !shouldBypassCache()) return false;
+ if (info.getWrapS() == param && !shouldBypassCache()) return false;
info.setWrapS(param);
}
case GL11.GL_TEXTURE_WRAP_T -> {
- if(info.getWrapT() == param && !shouldBypassCache()) return false;
+ if (info.getWrapT() == param && !shouldBypassCache()) return false;
info.setWrapT(param);
}
case GL12.GL_TEXTURE_MAX_LEVEL -> {
- if(info.getMaxLevel() == param && !shouldBypassCache()) return false;
+ if (info.getMaxLevel() == param && !shouldBypassCache()) return false;
info.setMaxLevel(param);
}
case GL12.GL_TEXTURE_MIN_LOD -> {
- if(info.getMinLod() == param && !shouldBypassCache()) return false;
+ if (info.getMinLod() == param && !shouldBypassCache()) return false;
info.setMinLod(param);
}
case GL12.GL_TEXTURE_MAX_LOD -> {
- if(info.getMaxLod() == param && !shouldBypassCache()) return false;
+ if (info.getMaxLod() == param && !shouldBypassCache()) return false;
info.setMaxLod(param);
}
}
return true;
}
-
public static void glTexParameter(int target, 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);
}
- if (target != GL11.GL_TEXTURE_2D || params.remaining() != 1 ) {
+ if (target != GL11.GL_TEXTURE_2D || params.remaining() != 1) {
GL11.glTexParameter(target, pname, params);
return;
}
- if(!updateTexParameteriCache(target, getBoundTextureForServerState(), pname, params.get(0))) return;
+ if (!updateTexParameteriCache(target, getBoundTextureForServerState(), pname, params.get(0))) return;
GL11.glTexParameter(target, pname, params);
}
@@ -3514,11 +3585,11 @@ public class GLStateManager {
final float remapped = remapTexClamp(pname, val);
if (remapped != val) params.put(params.position(), remapped);
}
- if (target != GL11.GL_TEXTURE_2D || params.remaining() != 1 ) {
+ if (target != GL11.GL_TEXTURE_2D || params.remaining() != 1) {
GL11.glTexParameter(target, pname, params);
return;
}
- if(!updateTexParameterfCache(target, getBoundTextureForServerState(), pname, params.get(0))) return;
+ if (!updateTexParameterfCache(target, getBoundTextureForServerState(), pname, params.get(0))) return;
GL11.glTexParameter(target, pname, params);
}
@@ -3541,7 +3612,6 @@ public class GLStateManager {
GL11.glTexParameteri(target, pname, param);
}
-
public static boolean updateTexParameterfCache(int target, int texture, int pname, float param) {
if (target != GL11.GL_TEXTURE_2D) {
return true;
@@ -3552,11 +3622,11 @@ public class GLStateManager {
}
switch (pname) {
case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> {
- if(info.getMaxAnisotropy() == param && !shouldBypassCache()) return false;
+ if (info.getMaxAnisotropy() == param && !shouldBypassCache()) return false;
info.setMaxAnisotropy(param);
}
case GL14.GL_TEXTURE_LOD_BIAS -> {
- if(info.getLodBias() == param && !shouldBypassCache()) return false;
+ if (info.getLodBias() == param && !shouldBypassCache()) return false;
info.setLodBias(param);
}
}
@@ -3609,6 +3679,7 @@ public class GLStateManager {
}
};
}
+
public static int glGetTexParameteri(int target, int pname) {
if (target != GL11.GL_TEXTURE_2D || shouldBypassCache()) {
return GL11.glGetTexParameteri(target, pname);
@@ -3908,7 +3979,8 @@ public class GLStateManager {
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 -> {}
+ default -> {
+ }
}
lightingGeneration++;
}
@@ -3925,10 +3997,12 @@ public class GLStateManager {
case GL11.GL_LIGHT_MODEL_AMBIENT -> lightModel.setAmbient(params);
case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> lightModel.setLocalViewer(params);
case GL11.GL_LIGHT_MODEL_TWO_SIDE -> lightModel.setTwoSide(params);
- default -> {}
+ default -> {
+ }
}
lightingGeneration++;
}
+
public static void glLightModel(int pname, IntBuffer params) {
// For IntBuffer version, we need to convert to float for recording
final RecordMode mode = DisplayListManager.getRecordMode();
@@ -3950,10 +4024,12 @@ public class GLStateManager {
case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> lightModel.setColorControl(params);
case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> lightModel.setLocalViewer(params);
case GL11.GL_LIGHT_MODEL_TWO_SIDE -> lightModel.setTwoSide(params);
- default -> {}
+ default -> {
+ }
}
lightingGeneration++;
}
+
public static void glLightModelf(int pname, float param) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
@@ -3967,11 +4043,13 @@ public class GLStateManager {
switch (pname) {
case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> lightModel.setLocalViewer(param);
case GL11.GL_LIGHT_MODEL_TWO_SIDE -> lightModel.setTwoSide(param);
- default -> {}
+ default -> {
+ }
}
lightingGeneration++;
}
}
+
public static void glLightModeli(int pname, int param) {
final RecordMode mode = DisplayListManager.getRecordMode();
if (mode != RecordMode.NONE) {
@@ -3986,7 +4064,8 @@ public class GLStateManager {
case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> lightModel.setColorControl(param);
case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> lightModel.setLocalViewer(param);
case GL11.GL_LIGHT_MODEL_TWO_SIDE -> lightModel.setTwoSide(param);
- default -> {}
+ default -> {
+ }
}
lightingGeneration++;
}
@@ -4026,12 +4105,16 @@ public class GLStateManager {
final ShaderManager ffp = ShaderManager.getInstance();
if (program == 0 && ffp.isEnabled()) {
+ final int prev = activeProgram;
final boolean caching = isCachingEnabled();
if (caching) {
activeProgram = 0; // Track that FFP was requested
}
- // Deregister Iris ValueUpdateNotifier listeners so they don't fire
- ProgramUniforms.clearActiveUniforms();
+ if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
+ GLSMHooks.programChangeEvent.previousProgram = prev;
+ GLSMHooks.programChangeEvent.newProgram = 0;
+ GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent);
+ }
ffp.activate();
return;
}
@@ -4043,12 +4126,16 @@ public class GLStateManager {
final boolean caching = isCachingEnabled();
if (BYPASS_CACHE || !caching || program != activeProgram) {
+ final int prev = activeProgram;
if (caching) {
activeProgram = program;
}
- // Deregister Iris ValueUpdateNotifier listeners before switching programs.
- ProgramUniforms.clearActiveUniforms();
- if (AngelicaMod.lwjglDebug) {
+ if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) {
+ GLSMHooks.programChangeEvent.previousProgram = prev;
+ GLSMHooks.programChangeEvent.newProgram = program;
+ 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);
}
@@ -4107,7 +4194,9 @@ public class GLStateManager {
}
public static void prepareWideLineEmulation(int drawMode) {
- wideLineEmulationActive = wideLineEmulationEnabled && (drawMode == GL11.GL_LINES || drawMode == GL11.GL_LINE_STRIP || drawMode == GL11.GL_LINE_LOOP) && lineState.getWidth() > 1.0f;
+ wideLineEmulationActive = wideLineEmulationEnabled
+ && (drawMode == GL11.GL_LINES || drawMode == GL11.GL_LINE_STRIP || drawMode == GL11.GL_LINE_LOOP)
+ && lineState.getWidth() > 1.0f;
}
public static void glShaderSource(int shader, CharSequence source) {
@@ -4800,9 +4889,14 @@ public class GLStateManager {
public static void setLightmapTextureCoords(int unit, float x, float y) {
if (unit == GL13.GL_TEXTURE1) {
- OpenGlHelper.lastBrightnessX = x;
- OpenGlHelper.lastBrightnessY = y;
+ GLSMConfig.lastBrightnessX = x;
+ GLSMConfig.lastBrightnessY = y;
dirtyLightmapAttrib = true;
+ if (GLSMHooks.LIGHTMAP_COORDS.hasListeners()) {
+ GLSMHooks.lightmapCoordsEvent.x = x;
+ GLSMHooks.lightmapCoordsEvent.y = y;
+ GLSMHooks.LIGHTMAP_COORDS.post(GLSMHooks.lightmapCoordsEvent);
+ }
}
}
@@ -4813,11 +4907,10 @@ public class GLStateManager {
}
public static boolean isFramebufferEnabled() {
- return OpenGlHelper.framebufferSupported && Minecraft.getMinecraft().gameSettings.fboEnable;
+ return initConfig != null && initConfig.isFramebufferSupported() && initConfig.isFboEnabled();
}
- private static final boolean FFP_WARN_ON_UNSUPPORTED = Boolean.parseBoolean(
- System.getProperty("angelica.ffp.warnOnUnsupported", "false"));
+ private static final boolean FFP_WARN_ON_UNSUPPORTED = Boolean.parseBoolean(System.getProperty("angelica.ffp.warnOnUnsupported", "false"));
private static final Set warnedFFPFunctions = new HashSet<>();
@@ -4838,8 +4931,8 @@ public class GLStateManager {
}
/**
- * 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).
+ * 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)) {
@@ -4849,8 +4942,7 @@ public class GLStateManager {
}
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)) {
+ 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;
@@ -4884,7 +4976,9 @@ public class GLStateManager {
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.");
+ 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)
@@ -4897,9 +4991,8 @@ public class GLStateManager {
}
/**
- * 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.
+ * 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) {
if (target == GL14.GL_TEXTURE_FILTER_CONTROL) {
@@ -5207,6 +5300,7 @@ public class GLStateManager {
}
private static boolean selectWarned = false;
+
public static void glSelectBuffer(IntBuffer buffer) {
if (!selectWarned) {
LOGGER.warn("glSelectBuffer: selection mode not emulated");
@@ -5215,8 +5309,11 @@ public class GLStateManager {
}
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) {
@@ -5230,8 +5327,7 @@ public class GLStateManager {
private static final IntBuffer SHADER_BUF = BufferUtils.createIntBuffer(8);
/**
- * 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.
+ * 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 int shaderCount = GL20.glGetProgrami(program, GL20.GL_ATTACHED_SHADERS);
@@ -5265,12 +5361,12 @@ public class GLStateManager {
if (GL20.glGetShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
final String log = GL20.glGetShaderInfoLog(vertShader, 8192);
- AngelicaTweaker.LOGGER.warn("CompatShaderTransformer: Generated passthrough vertex shader failed to compile:\n{}\nSource:\n{}", log, vertSource);
+ LOGGER.warn("CompatShaderTransformer: Generated passthrough vertex shader failed to compile:\n{}\nSource:\n{}", log, vertSource);
GL20.glDeleteShader(vertShader);
return;
}
- AngelicaTweaker.LOGGER.debug("CompatShaderTransformer: Generated passthrough vertex shader for fragment-only program {}", program);
+ LOGGER.debug("CompatShaderTransformer: Generated passthrough vertex shader for fragment-only program {}", program);
GL20.glAttachShader(program, vertShader);
GL20.glDeleteShader(vertShader);
}
@@ -5337,6 +5433,7 @@ public class GLStateManager {
}
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;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/GlslTransformUtils.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GlslTransformUtils.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/GlslTransformUtils.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GlslTransformUtils.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
new file mode 100644
index 000000000..a8a056a76
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
@@ -0,0 +1,550 @@
+package com.gtnewhorizons.angelica.glsm;
+
+import com.gtnewhorizons.angelica.glsm.dsa.DSAARB;
+import com.gtnewhorizons.angelica.glsm.dsa.DSAAccess;
+import com.gtnewhorizons.angelica.glsm.dsa.DSACore;
+import com.gtnewhorizons.angelica.glsm.dsa.DSAEXT;
+import com.gtnewhorizons.angelica.glsm.dsa.DSAUnsupported;
+import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
+import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Matrix4f;
+import org.joml.Vector3i;
+import org.lwjgl.BufferUtils;
+import org.lwjgl.opengl.ARBBufferStorage;
+import org.lwjgl.opengl.ARBClearBufferObject;
+import org.lwjgl.opengl.ARBClearTexture;
+import org.lwjgl.opengl.ARBShaderImageLoadStore;
+import org.lwjgl.opengl.ARBShaderStorageBufferObject;
+import org.lwjgl.opengl.EXTShaderImageLoadStore;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+import org.lwjgl.opengl.GL15;
+import org.lwjgl.opengl.GL20;
+import org.lwjgl.opengl.GL30;
+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.GL44;
+import org.lwjgl.opengl.NVXGpuMemoryInfo;
+
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * This class is responsible for abstracting calls to OpenGL and asserting that calls are run on the render thread.
+ */
+public class RenderSystem {
+ private static DSAAccess dsaState;
+ private static boolean supportsCompute;
+ private static boolean supportsImageLoadStore;
+ private static boolean supportsSSBO;
+ private static boolean supportsBufferStorage;
+ private static boolean supportsClearTexture;
+ private static boolean supportsTesselation;
+ private static boolean supportsSamplerObjects;
+ private static int maxImageUnits;
+ private static int maxSSBOBindings;
+ private static int maxGlslVersion;
+ private static boolean supportsGpuShader4;
+
+ // Sampler object state tracking (null if unsupported)
+ private static int[] samplers;
+
+ private static final Pattern SEMVER_PATTERN = Pattern.compile("(?\\d+)\\.(?\\d+)\\.*(?\\d*)(.*)");
+
+ private RenderSystem() {}
+
+ public static void initRenderer() {
+ try {
+ if (GLStateManager.capabilities.OpenGL45) {
+ dsaState = (Runtime.version().feature() > 8 && GLStateManager.capabilities.GL_EXT_direct_state_access) ? new DSAEXT() : new DSACore();
+ GLStateManager.LOGGER.info("OpenGL 4.5 detected, enabling DSA.");
+ }
+
+ } catch (NoSuchFieldError ignored) {
+ }
+ try {
+ if (dsaState == null && GLStateManager.capabilities.GL_ARB_direct_state_access) {
+ dsaState = new DSAARB();
+ GLStateManager.LOGGER.info("ARB_direct_state_access detected, enabling DSA.");
+ }
+ } catch (NoSuchFieldError ignored) {
+ }
+ if (dsaState == null) {
+ dsaState = new DSAUnsupported();
+ GLStateManager.LOGGER.info("No DSA support detected, falling back to legacy OpenGL.");
+ }
+
+ supportsCompute = supportsCompute();
+ supportsTesselation = GLStateManager.capabilities.GL_ARB_tessellation_shader || GLStateManager.capabilities.OpenGL40;
+
+ supportsImageLoadStore = GLStateManager.capabilities.OpenGL42
+ || GLStateManager.capabilities.GL_ARB_shader_image_load_store
+ || GLStateManager.capabilities.GL_EXT_shader_image_load_store;
+ supportsSSBO = GLStateManager.capabilities.OpenGL43 || GLStateManager.capabilities.GL_ARB_shader_storage_buffer_object;
+ supportsBufferStorage = GLStateManager.capabilities.OpenGL44 || GLStateManager.capabilities.GL_ARB_buffer_storage;
+ supportsClearTexture = GLStateManager.capabilities.OpenGL44 || GLStateManager.capabilities.GL_ARB_clear_texture;
+
+ // Cache maximum image units
+ if (supportsImageLoadStore) {
+ if (GLStateManager.capabilities.OpenGL42) {
+ maxImageUnits = GL11.glGetInteger(GL42.GL_MAX_IMAGE_UNITS);
+ } else if (GLStateManager.capabilities.GL_ARB_shader_image_load_store) {
+ maxImageUnits = GL11.glGetInteger(ARBShaderImageLoadStore.GL_MAX_IMAGE_UNITS);
+ } else {
+ maxImageUnits = GL11.glGetInteger(EXTShaderImageLoadStore.GL_MAX_IMAGE_UNITS_EXT);
+ }
+ } else {
+ maxImageUnits = 0;
+ }
+
+ // Cache maximum SSBO bindings
+ if (supportsSSBO) {
+ if (GLStateManager.capabilities.OpenGL43) {
+ maxSSBOBindings = GL11.glGetInteger(GL43.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS);
+ } else {
+ maxSSBOBindings = GL11.glGetInteger(ARBShaderStorageBufferObject.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS);
+ }
+ } else {
+ maxSSBOBindings = 0;
+ }
+
+ // Check for sampler objects support (GL 3.3+ or ARB extension)
+ supportsSamplerObjects = GLStateManager.capabilities.OpenGL33 || GLStateManager.capabilities.GL_ARB_sampler_objects;
+ if (supportsSamplerObjects) {
+ samplers = new int[GL11.glGetInteger(GL20.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS)];
+ }
+
+ maxGlslVersion = Integer.parseInt(parseGlVersionString(GL11.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION)));
+ supportsGpuShader4 = GLStateManager.capabilities.GL_EXT_gpu_shader4;
+
+ GLStateManager.LOGGER.info("Max GLSL version: {}, GPU Shader4: {}", maxGlslVersion, supportsGpuShader4);
+ GLStateManager.LOGGER.info("Image Load/Store: {}, Max Image Units: {}", supportsImageLoadStore, maxImageUnits);
+ GLStateManager.LOGGER.info("SSBO: {}, Max SSBO Bindings: {}", supportsSSBO, maxSSBOBindings);
+ GLStateManager.LOGGER.info("Buffer Storage: {}, Clear Texture: {}, Sampler Objects: {}", supportsBufferStorage, supportsClearTexture, supportsSamplerObjects);
+
+ if (GLStateManager.capabilities.OpenGL32) {
+ final int profileMask = GL11.glGetInteger(GL32.GL_CONTEXT_PROFILE_MASK);
+ if ((profileMask & GL32.GL_CONTEXT_CORE_PROFILE_BIT) != 0) {
+ GLStateManager.LOGGER.info("GL 3.3 core profile detected, enabling FFP shader emulation.");
+ ShaderManager.getInstance().enable();
+ }
+ }
+ }
+
+ public static void generateMipmaps(int texture, int mipmapTarget) {
+ dsaState.generateMipmaps(texture, mipmapTarget);
+ }
+
+ public static void bindAttributeLocation(int program, int index, CharSequence name) {
+ GL20.glBindAttribLocation(program, index, name);
+ }
+
+ 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.glBindTexture(target, texture);
+ GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ if (target == GL11.GL_TEXTURE_2D && level == 0) {
+ TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+ }
+ }
+
+ public static void uniformMatrix4fv(int location, boolean transpose, FloatBuffer matrix) {
+ GL20.glUniformMatrix4(location, transpose, matrix);
+ }
+
+ 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);
+ }
+
+ public static void uniform1f(int location, float v0) {
+ GL20.glUniform1f(location, v0);
+ }
+
+ public static void uniform1i(int location, int v0) {
+ GL20.glUniform1i(location, v0);
+ }
+
+ public static void uniform2f(int location, float v0, float v1) {
+ GL20.glUniform2f(location, v0, v1);
+ }
+
+ public static void uniform2i(int location, int v0, int v1) {
+ GL20.glUniform2i(location, v0, v1);
+ }
+
+ public static void uniform3f(int location, float v0, float v1, float v2) {
+ GL20.glUniform3f(location, v0, v1, v2);
+ }
+
+ public static void uniform3i(int location, int v0, int v1, int v2) {GL20.glUniform3i(location, v0, v1, v2);}
+
+ public static void uniform4f(int location, float v0, float v1, float v2, float v3) {
+ GL20.glUniform4f(location, v0, v1, v2, v3);
+ }
+
+ public static void uniform4i(int location, int v0, int v1, int v2, int v3) {
+ GL20.glUniform4i(location, v0, v1, v2, v3);
+ }
+
+ public static int getAttribLocation(int programId, String name) {
+ return GL20.glGetAttribLocation(programId, name);
+ }
+
+ public static int getUniformLocation(int programId, String name) {
+ return GL20.glGetUniformLocation(programId, name);
+ }
+
+ public static void texParameteriv(int texture, int target, int pname, IntBuffer params) {
+ dsaState.texParameteriv(texture, target, pname, params);
+ }
+
+ public static void copyTexSubImage2D(int destTexture, int target, int i, int i1, int i2, int i3, int i4, int width, int height) {
+ dsaState.copyTexSubImage2D(destTexture, target, i, i1, i2, i3, i4, width, height);
+ }
+
+ public static void texParameteri(int texture, int target, int pname, int param) {
+ dsaState.texParameteri(texture, target, pname, param);
+ }
+
+ public static void texParameterf(int texture, int target, int pname, float param) {
+ dsaState.texParameterf(texture, target, pname, param);
+ }
+
+ public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
+ dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels);
+ }
+
+ public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) {
+ dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels);
+ }
+
+ public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) {
+ dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
+ }
+
+ public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) {
+ dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
+ }
+
+ public static void texImage1D(int texture, int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) {
+ GL11.glBindTexture(target, texture);
+ GL11.glTexImage1D(target, level, internalformat, width, border, format, type, pixels);
+ }
+
+ 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) {
+ GL11.glBindTexture(target, texture);
+ GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+ }
+
+ public static String getProgramInfoLog(int program) {
+ return GL20.glGetProgramInfoLog(program, GL20.glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH));
+ }
+
+ public static String getShaderInfoLog(int shader) {
+ return GL20.glGetShaderInfoLog(shader, GL20.glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH));
+ }
+
+ public static void drawBuffers(int framebuffer, IntBuffer buffers) {
+ dsaState.drawBuffers(framebuffer, buffers);
+ }
+
+ public static void readBuffer(int framebuffer, int buffer) {
+ dsaState.readBuffer(framebuffer, buffer);
+ }
+
+ public static String getActiveUniform(int program, int index, int maxLength, IntBuffer sizeType) {
+ return GL20.glGetActiveUniform(program, index, maxLength, sizeType);
+ }
+
+ public static void readPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) {
+ GL11.glReadPixels(x, y, width, height, format, type, pixels);
+ }
+
+ public static void bufferData(int target, FloatBuffer data, int usage) {
+ GL15.glBufferData(target, data, usage);
+ }
+
+ public static int bufferStorage(int target, FloatBuffer data, int usage) {
+ return dsaState.bufferStorage(target, data, usage);
+ }
+
+ public static void vertexAttrib4f(int index, float v0, float v1, float v2, float v3) {
+ GL20.glVertexAttrib4f(index, v0, v1, v2, v3);
+ }
+
+ public static void detachShader(int program, int shader) {
+ GL20.glDetachShader(program, shader);
+ }
+
+ public static void framebufferTexture2D(int fb, int fbtarget, int attachment, int target, int texture, int levels) {
+ dsaState.framebufferTexture2D(fb, fbtarget, attachment, target, texture, levels);
+ }
+
+ public static int getTexParameteri(int texture, int target, int pname) {
+ return dsaState.getTexParameteri(texture, target, pname);
+ }
+
+ public static int getTexLevelParameteri(int texture, int level, int pname) {
+ return dsaState.getTexLevelParameteri(texture, level, pname);
+ }
+
+ public static void bindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) {
+ if (GLStateManager.capabilities.OpenGL42) {
+ GL42.glBindImageTexture(unit, texture, level, layered, layer, access, format);
+ } else {
+ EXTShaderImageLoadStore.glBindImageTextureEXT(unit, texture, level, layered, layer, access, format);
+ }
+ }
+
+ public static int getMaxImageUnits() {
+ return maxImageUnits;
+ }
+
+ public static boolean supportsImageLoadStore() {
+ return supportsImageLoadStore;
+ }
+
+ public static boolean supportsSSBO() {
+ return supportsSSBO;
+ }
+
+ public static boolean supportsBufferStorage() {
+ return supportsBufferStorage;
+ }
+
+ public static boolean supportsClearTexture() {
+ return supportsClearTexture;
+ }
+
+ public static int getMaxSSBOBindings() {
+ return maxSSBOBindings;
+ }
+
+ public static void getProgramiv(int program, int value, IntBuffer storage) {
+ GL20.glGetProgram(program, value, storage);
+ }
+
+ public static void dispatchCompute(int workX, int workY, int workZ) {
+ GL43.glDispatchCompute(workX, workY, workZ);
+ }
+
+ public static void dispatchCompute(Vector3i workGroups) {
+ GL43.glDispatchCompute(workGroups.x, workGroups.y, workGroups.z);
+ }
+
+ public static void dispatchComputeIndirect(long offset) {
+ GL43.glDispatchComputeIndirect(offset);
+ }
+
+ public static void bindBuffer(int target, int buffer) {
+ GLStateManager.glBindBuffer(target, buffer);
+ }
+
+ public static void memoryBarrier(int barriers) {
+ if (supportsCompute) {
+ GL42.glMemoryBarrier(barriers);
+ }
+ }
+
+ public static boolean supportsBufferBlending() {
+ return GLStateManager.capabilities.GL_ARB_draw_buffers_blend || GLStateManager.capabilities.OpenGL40;
+ }
+
+ public static void disableBufferBlend(int buffer) {
+ GL30.glDisablei(GL11.GL_BLEND, buffer);
+ GLStateManager.getBlendMode().setUnknownState();
+ }
+
+ public static void enableBufferBlend(int buffer) {
+ GL30.glEnablei(GL11.GL_BLEND, buffer);
+ GLStateManager.getBlendMode().setUnknownState();
+ }
+
+ public static void blendFuncSeparatei(int buffer, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
+ GL40.glBlendFuncSeparatei(buffer, srcRGB, dstRGB, srcAlpha, dstAlpha);
+ }
+
+ public static void bindTextureToUnit(int unit, int texture) {
+ dsaState.bindTextureToUnit(unit, texture);
+ }
+
+ public static void bindTextureToUnit(int target, int unit, int texture) {
+ dsaState.bindTextureToUnit(target, unit, texture);
+ }
+
+ public static final FloatBuffer PROJECTION_MATRIX_BUFFER = BufferUtils.createFloatBuffer(16);
+
+ public static void setupProjectionMatrix(Matrix4f matrix) {
+ GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
+ GLStateManager.glPushMatrix();
+ matrix.get(0, PROJECTION_MATRIX_BUFFER);
+ GLStateManager.glLoadMatrix(PROJECTION_MATRIX_BUFFER);
+ GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
+ }
+
+ public static void restoreProjectionMatrix() {
+ GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
+ GLStateManager.glPopMatrix();
+ GLStateManager.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) {
+ dsaState.blitFramebuffer(source, dest, offsetX, offsetY, width, height, offsetX2, offsetY2, width2, height2, bufferChoice, filter);
+ }
+
+ public static int createFramebuffer() {
+ return dsaState.createFramebuffer();
+ }
+
+ public static int createTexture(int target) {
+ return dsaState.createTexture(target);
+ }
+
+ // TODO: Proper notification of compute support
+ public static boolean supportsCompute() {
+ try {
+ return GLStateManager.capabilities.GL_ARB_compute_shader;
+ } catch (Exception ignored) {
+ return false;
+ }
+ }
+
+ public static int createBuffers() {
+ return GL15.glGenBuffers();
+ }
+
+ public static void bindBufferBase(int target, int index, int buffer) {
+ GL30.glBindBufferBase(target, index, buffer);
+ }
+
+ public static void bufferStorage(int target, long size, int flags) {
+ if (GLStateManager.capabilities.OpenGL44) {
+ GL44.glBufferStorage(target, size, flags);
+ } else if (GLStateManager.capabilities.GL_ARB_buffer_storage) {
+ ARBBufferStorage.glBufferStorage(target, size, flags);
+ } else {
+ // Fallback: use mutable storage
+ GL15.glBufferData(target, size, GL15.GL_DYNAMIC_DRAW);
+ }
+ }
+
+ 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);
+ if (GLStateManager.capabilities.OpenGL43) {
+ GL43.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf);
+ } else if (GLStateManager.capabilities.GL_ARB_clear_buffer_object) {
+ ARBClearBufferObject.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf);
+ }
+ }
+
+ public static void deleteBuffers(int buffer) {
+ GL15.glDeleteBuffers(buffer);
+ }
+
+ public static long getVRAM() {
+ if (GLStateManager.capabilities.GL_NVX_gpu_memory_info) {
+ return GL11.glGetInteger(NVXGpuMemoryInfo.GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX) * 1024L;
+ } else {
+ // Default to 4GB if we can't query VRAM
+ return 4294967296L;
+ }
+ }
+
+ public static void clearTexImage(int texture, int target, int level, int format, int type) {
+ if (GLStateManager.capabilities.OpenGL44) {
+ GL44.glClearTexImage(texture, level, format, type, (ByteBuffer) null);
+ } else {
+ ARBClearTexture.glClearTexImage(texture, level, format, type, (ByteBuffer) null);
+ }
+ }
+
+ public static void textureStorage1D(int texture, int target, int levels, int internalFormat, int width) {
+ dsaState.textureStorage1D(texture, target, levels, internalFormat, width);
+ }
+
+ public static void textureStorage2D(int texture, int target, int levels, int internalFormat, int width, int height) {
+ dsaState.textureStorage2D(texture, target, levels, internalFormat, width, height);
+ }
+
+ public static void textureStorage3D(int texture, int target, int levels, int internalFormat, int width, int height, int depth) {
+ dsaState.textureStorage3D(texture, target, levels, internalFormat, width, height, depth);
+ }
+
+ public static int getMaxGlslVersion() {
+ return maxGlslVersion;
+ }
+
+ public static boolean supportsGpuShader4() {
+ return supportsGpuShader4;
+ }
+
+ public static boolean supportsSnormFormats() {
+ return GLStateManager.capabilities.OpenGL31;
+ }
+
+ public static boolean supportsPackedFloatRenderable() {
+ return GLStateManager.capabilities.OpenGL30 && maxGlslVersion >= 130;
+ }
+
+ public static boolean supportsTesselation() {
+ return supportsTesselation;
+ }
+
+ public static boolean supportsSamplerObjects() {
+ return supportsSamplerObjects;
+ }
+
+ public static int genSampler() {
+ if (!supportsSamplerObjects) return 0;
+ return GL33.glGenSamplers();
+ }
+
+ public static void destroySampler(int sampler) {
+ if (!supportsSamplerObjects || sampler == 0) return;
+ GL33.glDeleteSamplers(sampler);
+ }
+
+ public static void samplerParameteri(int sampler, int pname, int param) {
+ if (!supportsSamplerObjects || sampler == 0) return;
+ GL33.glSamplerParameteri(sampler, pname, param);
+ }
+
+ public static void bindSamplerToUnit(int unit, int sampler) {
+ if (!supportsSamplerObjects) return;
+ if (samplers[unit] == sampler) return;
+ GL33.glBindSampler(unit, sampler);
+ samplers[unit] = sampler;
+ }
+
+ public static void unbindAllSamplers() {
+ if (!supportsSamplerObjects) return;
+ for (int i = 0; i < samplers.length; i++) {
+ if (samplers[i] != 0) {
+ GL33.glBindSampler(i, 0);
+ samplers[i] = 0;
+ }
+ }
+ }
+
+ /** Parse a GL version string (e.g. "4.6.0 NVIDIA ...") into concatenated digits "460". Inlined from StandardMacros.getGlVersion(). */
+ static String parseGlVersionString(String info) {
+ final Matcher matcher = SEMVER_PATTERN.matcher(Objects.requireNonNull(info));
+ if (!matcher.matches()) {
+ throw new IllegalStateException("Could not parse GL version from \"" + info + "\"");
+ }
+ final String major = matcher.group("major");
+ final String minor = matcher.group("minor");
+ String bugfix = matcher.group("bugfix");
+ if (bugfix == null || bugfix.isEmpty()) bugfix = "0";
+ return major + minor + bugfix;
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java
similarity index 94%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java
index de91a3bf0..49f110778 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/TransformOptimizer.java
@@ -2,8 +2,6 @@ package com.gtnewhorizons.angelica.glsm;
import com.gtnewhorizons.angelica.glsm.recording.commands.DisplayListCommand;
import com.gtnewhorizons.angelica.glsm.recording.commands.MultMatrixCmd;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.joml.Matrix4f;
import java.util.ArrayDeque;
@@ -20,8 +18,6 @@ import java.util.List;
*
*/
class TransformOptimizer {
- private static final Logger LOGGER = LogManager.getLogger("TransformOptimizer");
-
private final Matrix4f accumulated = new Matrix4f(); // Current accumulated transform
private final Matrix4f lastEmitted = new Matrix4f(); // Last emitted transform
private final Deque stack = new ArrayDeque<>(); // For Push/Pop
@@ -53,7 +49,7 @@ class TransformOptimizer {
// After Pop, GL state is restored to the pushed value so lastEmitted should also reflect this
lastEmitted.set(accumulated);
} else {
- LOGGER.warn("[TransformOptimizer] list={} Pop with empty stack - resetting to identity", listId);
+ GLStateManager.LOGGER.warn("[TransformOptimizer] list={} Pop with empty stack - resetting to identity", listId);
accumulated.identity();
lastEmitted.identity();
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/Vendor.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Vendor.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/Vendor.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Vendor.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/compat/FogHelper.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/FogHelper.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/compat/FogHelper.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/FogHelper.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
index e6b98e97a..c3fcd4d2e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java
@@ -3,7 +3,6 @@ package com.gtnewhorizons.angelica.glsm.compat.lwjgl;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.lwjgl.util.glu.PartialDisk;
-import static com.gtnewhorizons.angelica.loading.AngelicaTweaker.LOGGER;
import static org.lwjgl.opengl.GL11.GL_LINE_STRIP;
import static org.lwjgl.opengl.GL11.GL_POINTS;
import static org.lwjgl.opengl.GL11.GL_TRIANGLE_FAN;
@@ -35,7 +34,7 @@ public class AngelicaPartialDisk extends PartialDisk {
if (slices >= CACHE_SIZE) slices = CACHE_SIZE - 1;
if (slices < 2 || loops < 1 || outerRadius <= 0.0f || innerRadius < 0.0f || innerRadius > outerRadius) {
- LOGGER.warn("PartialDisk: GLU_INVALID_VALUE (slices={}, loops={}, innerRadius={}, outerRadius={})", slices, loops, innerRadius, outerRadius);
+ GLStateManager.LOGGER.warn("PartialDisk: GLU_INVALID_VALUE (slices={}, loops={}, innerRadius={}, outerRadius={})", slices, loops, innerRadius, outerRadius);
return;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAAccess.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAAccess.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAAccess.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAAccess.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSACore.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSACore.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSACore.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSACore.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAEXT.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAEXT.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAEXT.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAEXT.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java
index 318cad69a..8a5153e55 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentKey.java
@@ -4,8 +4,6 @@ import java.util.Arrays;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.TexEnvState;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL13;
@@ -34,8 +32,6 @@ import org.lwjgl.opengl.GL13;
* 42-46: arg2 Alpha
*/
public final class FragmentKey {
- private static final Logger LOGGER = LogManager.getLogger("FragmentKey");
-
public static final int TEX_ENV_MODULATE = 0;
public static final int TEX_ENV_REPLACE = 1;
public static final int TEX_ENV_ADD = 2;
@@ -297,7 +293,7 @@ public final class FragmentKey {
case GL13.GL_PRIMARY_COLOR -> SRC_PRIMARY_COLOR;
case GL13.GL_PREVIOUS -> SRC_PREVIOUS;
default -> {
- LOGGER.debug("Unknown TexEnv source 0x{}, falling back to SRC_PREVIOUS", Integer.toHexString(glSource));
+ GLStateManager.LOGGER.debug("Unknown TexEnv source 0x{}, falling back to SRC_PREVIOUS", Integer.toHexString(glSource));
yield SRC_PREVIOUS;
}
};
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentShaderGenerator.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentShaderGenerator.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentShaderGenerator.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FragmentShaderGenerator.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/GeometryShaderGenerator.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/GeometryShaderGenerator.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/GeometryShaderGenerator.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/GeometryShaderGenerator.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
similarity index 96%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
index 386c30ae1..84bd5067c 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java
@@ -4,8 +4,6 @@ import com.gtnewhorizons.angelica.glsm.GLDebug;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import lombok.Getter;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL32;
@@ -20,7 +18,6 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class Program {
- private static final Logger LOGGER = LogManager.getLogger("FFPProgram");
private static final AtomicInteger PROGRAM_COUNTER = new AtomicInteger();
@Getter private final int programId;
@@ -206,7 +203,7 @@ public class Program {
final String log = RenderSystem.getProgramInfoLog(program);
if (!log.isEmpty()) {
- LOGGER.warn("FFP program link log (vk=0x{}, fk={}): {}", vkHex, fk, log);
+ GLStateManager.LOGGER.warn("FFP program link log (vk=0x{}, fk={}): {}", vkHex, fk, log);
}
if (GL20.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) {
@@ -258,12 +255,12 @@ public class Program {
final String log = RenderSystem.getShaderInfoLog(shader);
if (!log.isEmpty()) {
- LOGGER.warn("FFP {} shader compilation log for {}: {}", typeName, name, log);
+ GLStateManager.LOGGER.warn("FFP {} shader compilation log for {}: {}", typeName, name, log);
}
final int result = GL20.glGetShaderi(shader, GL20.GL_COMPILE_STATUS);
if (result != GL11.GL_TRUE) {
- LOGGER.error("FFP {} shader source:\n{}", typeName, src);
+ GLStateManager.LOGGER.error("FFP {} shader source:\n{}", typeName, src);
GL20.glDeleteShader(shader);
throw new RuntimeException("FFP " + typeName + " shader compilation failed for " + name + ": " + log);
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java
similarity index 94%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java
index 267c283c5..7f1edd1d4 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderCache.java
@@ -2,8 +2,7 @@ package com.gtnewhorizons.angelica.glsm.ffp;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import lombok.Setter;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@@ -26,7 +25,6 @@ import java.util.IdentityHashMap;
*
*/
public class ShaderCache {
- private static final Logger LOGGER = LogManager.getLogger("FFPShaderCache");
private static final int SLOT_STRIDE = 6;
private static final int INITIAL_CAPACITY = 64; // power of 2
private static final long EMPTY_MARKER = 0L; // slot [1] == 0 means empty (fkLen >= 1 guarantees nonzero)
@@ -123,7 +121,7 @@ public class ShaderCache {
setLastUsed(vkPacked, fkPacked, fkLen, program);
- LOGGER.debug("FFP variant compiled: {} + {} (total: {} programs)", vk, fk, count);
+ GLStateManager.LOGGER.debug("FFP variant compiled: {} + {} (total: {} programs)", vk, fk, count);
if (dumpDir != null) {
dumpShader(Long.toHexString(vkPacked), ".vert.glsl", vertSrc);
@@ -234,7 +232,7 @@ public class ShaderCache {
Files.writeString(file, source, StandardCharsets.UTF_8);
}
} catch (IOException e) {
- LOGGER.warn("Failed to dump FFP shader to {}: {}", dumpDir, e.getMessage());
+ GLStateManager.LOGGER.warn("Failed to dump FFP shader to {}: {}", dumpDir, e.getMessage());
}
}
@@ -256,10 +254,10 @@ public class ShaderCache {
for (var entry : geometrySourceCache.entrySet()) {
dumpShader(Long.toHexString(entry.getKey()), ".geom.glsl", entry.getValue());
}
- LOGGER.info("Dumped {} vertex, {} geometry, and {} fragment FFP shader sources to {}",
+ GLStateManager.LOGGER.info("Dumped {} vertex, {} geometry, and {} fragment FFP shader sources to {}",
vertexSourceCache.size(), geometrySourceCache.size(), seen.size(), outputDir);
} catch (IOException e) {
- LOGGER.warn("Failed to dump FFP shaders: {}", e.getMessage());
+ GLStateManager.LOGGER.warn("Failed to dump FFP shaders: {}", e.getMessage());
}
}
@@ -279,7 +277,7 @@ public class ShaderCache {
geometrySourceCache.clear();
lastProgram = null;
lastVK = Long.MIN_VALUE;
- LOGGER.debug("FFP shader cache cleared");
+ GLStateManager.LOGGER.debug("FFP shader cache cleared");
}
public int getProgramCount() {
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
similarity index 82%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
index 5fc8d86b7..a27188001 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java
@@ -1,33 +1,32 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import java.util.Arrays;
-
-import com.gtnewhorizon.gtnhlib.client.renderer.stacks.IStateStack;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.glsm.CompatUniformManager;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
import com.gtnewhorizons.angelica.glsm.stacks.Vec3fStack;
import com.gtnewhorizons.angelica.glsm.stacks.Vec4fStack;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMInitConfig;
import lombok.Getter;
-import net.coderbot.iris.gl.blending.BlendModeStorage;
-import net.minecraft.launchwrapper.Launch;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.joml.Vector3f;
import org.joml.Vector4f;
import org.lwjgl.opengl.GL20;
import java.nio.file.Paths;
+import java.util.Arrays;
/**
* FFP shader manager
*/
public class ShaderManager {
- private static final Logger LOGGER = LogManager.getLogger("FFPShaderManager");
- private static final class Holder { static final ShaderManager INSTANCE = new ShaderManager(); }
+ private static final class Holder {
+
+ static final ShaderManager INSTANCE = new ShaderManager();
+ }
private final ShaderCache cache = new ShaderCache();
private final Uniforms uniforms = new Uniforms();
@@ -52,12 +51,7 @@ public class ShaderManager {
private ShaderManager() {
vaoVertexFlags.defaultReturnValue(-1);
- boolean isDev = false;
- try {
- final Object deobfEnv = Launch.blackboard != null ? Launch.blackboard.get("fml.deobfuscatedEnvironment") : null;
- isDev = Boolean.TRUE.equals(deobfEnv);
- } catch (Exception ignored) {}
- if (isDev || Boolean.parseBoolean(System.getProperty("angelica.ffp.dumpShaders", "false"))) {
+ if (Boolean.parseBoolean(System.getProperty("angelica.dumpShaders", "false"))) {
cache.setDumpDir(Paths.get("ffp_shaders"));
}
}
@@ -75,7 +69,7 @@ public class ShaderManager {
return false;
});
- LOGGER.info("FFP shader emulation enabled");
+ GLStateManager.LOGGER.info("FFP shader emulation enabled");
}
public void disable() {
@@ -95,11 +89,10 @@ public class ShaderManager {
currentFKLen = 0;
}
-
-
public void preDraw(boolean hasColor, boolean hasNormal, boolean hasTexCoord, boolean hasLightmap) {
GLStateManager.flushDeferredVertexAttribs();
- BlendModeStorage.flushDeferredBlend();
+ final DeferredBlendHandler bh = GLSMHooks.blendHandler;
+ if (bh != null) bh.flushDeferredBlend();
if (!active) {
if (enabled) {
@@ -171,10 +164,10 @@ public class ShaderManager {
public static void bumpNormalGeneration() { normalGeneration++; }
public static void bumpTexCoordGeneration() { texCoordGeneration++; }
- public void enableClientVertexFlag(int flag) { currentVertexFlags |= flag; }
- public void disableClientVertexFlag(int flag) { currentVertexFlags &= ~flag; }
- public int getCurrentVertexFlags() { return currentVertexFlags; }
- public void setCurrentVertexFlags(int flags) { currentVertexFlags = flags; }
+ public void enableClientVertexFlag(int flag) {currentVertexFlags |= flag;}
+ public void disableClientVertexFlag(int flag) {currentVertexFlags &= ~flag;}
+ public int getCurrentVertexFlags() {return currentVertexFlags;}
+ public void setCurrentVertexFlags(int flags) {currentVertexFlags = flags;}
public void onBindVertexArray(int vaoId) {
final int flags = vaoVertexFlags.get(vaoId);
@@ -190,7 +183,8 @@ public class ShaderManager {
public void destroy() {
cache.destroy();
uniforms.destroy();
- TessellatorStreamingDrawer.destroy();
+ final GLSMInitConfig config = GLStateManager.getInitConfig();
+ if (config != null && config.getStreamingDrawerDestroy() != null) config.getStreamingDrawerDestroy().run();
com.gtnewhorizons.angelica.glsm.QuadConverter.destroy();
active = false;
currentProgram = null;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
index e7f4188c3..af2623b48 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java
@@ -6,7 +6,7 @@ import com.gtnewhorizons.angelica.glsm.states.FogState;
import com.gtnewhorizons.angelica.glsm.states.LightState;
import com.gtnewhorizons.angelica.glsm.states.MaterialState;
import com.gtnewhorizons.angelica.glsm.states.TexGenState;
-import net.minecraft.client.renderer.OpenGlHelper;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Vector4f;
@@ -119,10 +119,10 @@ public class Uniforms {
}
if (program.getVertexKey().lightmapEnabled() && !program.getVertexKey().hasVertexLightmap()) {
- if (programChanged || OpenGlHelper.lastBrightnessX != lastLightmapX || OpenGlHelper.lastBrightnessY != lastLightmapY) {
+ if (programChanged || GLSMConfig.lastBrightnessX != lastLightmapX || GLSMConfig.lastBrightnessY != lastLightmapY) {
uploadCurrentLightmapCoord(program);
- lastLightmapX = OpenGlHelper.lastBrightnessX;
- lastLightmapY = OpenGlHelper.lastBrightnessY;
+ lastLightmapX = GLSMConfig.lastBrightnessX;
+ lastLightmapY = GLSMConfig.lastBrightnessY;
}
}
@@ -332,7 +332,7 @@ public class Uniforms {
private void uploadCurrentLightmapCoord(Program program) {
if (program.locCurrentLightmapCoord == -1) return;
GL20.glUniform2f(program.locCurrentLightmapCoord,
- OpenGlHelper.lastBrightnessX, OpenGlHelper.lastBrightnessY);
+ GLSMConfig.lastBrightnessX, GLSMConfig.lastBrightnessY);
}
private void uploadCurrentNormal(Program program) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexShaderGenerator.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexShaderGenerator.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexShaderGenerator.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexShaderGenerator.java
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredAlphaHandler.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredAlphaHandler.java
new file mode 100644
index 000000000..402ae459c
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredAlphaHandler.java
@@ -0,0 +1,7 @@
+package com.gtnewhorizons.angelica.glsm.hooks;
+
+public interface DeferredAlphaHandler {
+ boolean isAlphaTestLocked();
+ void deferAlphaTestToggle(boolean enabled);
+ void deferAlphaFunc(int function, float reference);
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredBlendHandler.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredBlendHandler.java
new file mode 100644
index 000000000..6d62cbc49
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredBlendHandler.java
@@ -0,0 +1,8 @@
+package com.gtnewhorizons.angelica.glsm.hooks;
+
+public interface DeferredBlendHandler {
+ boolean isBlendLocked();
+ void deferBlendModeToggle(boolean enabled);
+ void deferBlendFunc(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha);
+ void flushDeferredBlend();
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredDepthColorHandler.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredDepthColorHandler.java
new file mode 100644
index 000000000..1e715c089
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/DeferredDepthColorHandler.java
@@ -0,0 +1,7 @@
+package com.gtnewhorizons.angelica.glsm.hooks;
+
+public interface DeferredDepthColorHandler {
+ boolean isDepthColorLocked();
+ void deferDepthEnable(boolean enabled);
+ void deferColorMask(boolean r, boolean g, boolean b, boolean a);
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMConfig.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMConfig.java
new file mode 100644
index 000000000..60fc9879b
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMConfig.java
@@ -0,0 +1,12 @@
+package com.gtnewhorizons.angelica.glsm.hooks;
+
+public final class GLSMConfig {
+
+ // Lightmap (replaces OpenGlHelper.lastBrightnessX/Y)
+ public static float lastBrightnessX;
+ public static float lastBrightnessY;
+
+ public static boolean hudCacheOverride;
+
+ private GLSMConfig() {}
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMHooks.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMHooks.java
new file mode 100644
index 000000000..2d46dcac7
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMHooks.java
@@ -0,0 +1,37 @@
+package com.gtnewhorizons.angelica.glsm.hooks;
+
+import com.gtnewhorizons.angelica.glsm.hooks.events.BlendFuncChangeEvent;
+import com.gtnewhorizons.angelica.glsm.hooks.events.FogStateChangeEvent;
+import com.gtnewhorizons.angelica.glsm.hooks.events.LightmapCoordsEvent;
+import com.gtnewhorizons.angelica.glsm.hooks.events.ProgramChangeEvent;
+import com.gtnewhorizons.angelica.glsm.hooks.events.TextureBindEvent;
+import com.gtnewhorizons.angelica.glsm.hooks.events.TextureDeleteEvent;
+import com.gtnewhorizons.angelica.glsm.hooks.events.TextureUnitStateEvent;
+import net.minecraftforge.eventbus.api.bus.EventBus;
+
+public final class GLSMHooks {
+
+ public static DeferredBlendHandler blendHandler;
+ public static DeferredAlphaHandler alphaHandler;
+ public static DeferredDepthColorHandler depthColorHandler;
+
+ // EventBus instances
+ public static final EventBus TEXTURE_BIND = EventBus.create(TextureBindEvent.class);
+ public static final EventBus TEXTURE_DELETE = EventBus.create(TextureDeleteEvent.class);
+ public static final EventBus TEXTURE_UNIT_STATE = EventBus.create(TextureUnitStateEvent.class);
+ public static final EventBus PROGRAM_CHANGE = EventBus.create(ProgramChangeEvent.class);
+ public static final EventBus BLEND_FUNC_CHANGE = EventBus.create(BlendFuncChangeEvent.class);
+ public static final EventBus FOG_STATE_CHANGE = EventBus.create(FogStateChangeEvent.class);
+ public static final EventBus LIGHTMAP_COORDS = EventBus.create(LightmapCoordsEvent.class);
+
+ // Reusable event instances
+ public static final TextureBindEvent textureBindEvent = new TextureBindEvent();
+ public static final TextureDeleteEvent textureDeleteEvent = new TextureDeleteEvent();
+ public static final TextureUnitStateEvent textureUnitStateEvent = new TextureUnitStateEvent();
+ public static final ProgramChangeEvent programChangeEvent = new ProgramChangeEvent();
+ public static final BlendFuncChangeEvent blendFuncChangeEvent = new BlendFuncChangeEvent();
+ public static final FogStateChangeEvent fogStateChangeEvent = new FogStateChangeEvent();
+ public static final LightmapCoordsEvent lightmapCoordsEvent = new LightmapCoordsEvent();
+
+ private GLSMHooks() {}
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMInitConfig.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMInitConfig.java
new file mode 100644
index 000000000..bd1053d47
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/GLSMInitConfig.java
@@ -0,0 +1,103 @@
+package com.gtnewhorizons.angelica.glsm.hooks;
+
+import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
+import com.gtnewhorizons.angelica.glsm.streaming.StreamingUploader;
+
+import java.util.function.Consumer;
+
+public final class GLSMInitConfig {
+ private final boolean lwjglDebug;
+ private final StreamingUploader.UploadStrategy streamingUploadStrategy;
+ private final boolean framebufferSupported;
+ private final boolean fboEnabled;
+ private final Consumer directDrawer;
+ private final Runnable streamingDrawerDestroy;
+ private final int displayWidth;
+ private final int displayHeight;
+ private final Runnable postInitCallback;
+
+ private GLSMInitConfig(Builder builder) {
+ this.lwjglDebug = builder.lwjglDebug;
+ this.streamingUploadStrategy = builder.streamingUploadStrategy;
+ this.framebufferSupported = builder.framebufferSupported;
+ this.fboEnabled = builder.fboEnabled;
+ this.directDrawer = builder.directDrawer;
+ this.streamingDrawerDestroy = builder.streamingDrawerDestroy;
+ this.displayWidth = builder.displayWidth;
+ this.displayHeight = builder.displayHeight;
+ this.postInitCallback = builder.postInitCallback;
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public boolean isLwjglDebug() { return lwjglDebug; }
+ public StreamingUploader.UploadStrategy getStreamingUploadStrategy() { return streamingUploadStrategy; }
+ public boolean isFramebufferSupported() { return framebufferSupported; }
+ public boolean isFboEnabled() { return fboEnabled; }
+ public Consumer getDirectDrawer() { return directDrawer; }
+ public Runnable getStreamingDrawerDestroy() { return streamingDrawerDestroy; }
+ public int getDisplayWidth() { return displayWidth; }
+ public int getDisplayHeight() { return displayHeight; }
+ public Runnable getPostInitCallback() { return postInitCallback; }
+
+ public static final class Builder {
+ private boolean lwjglDebug = false;
+ private StreamingUploader.UploadStrategy streamingUploadStrategy = StreamingUploader.UploadStrategy.BUFFER_DATA;
+ private boolean framebufferSupported = false;
+ private boolean fboEnabled = false;
+ private Consumer directDrawer = null;
+ private Runnable streamingDrawerDestroy = null;
+ private int displayWidth = 0;
+ private int displayHeight = 0;
+ private Runnable postInitCallback = null;
+
+ private Builder() {}
+
+ public Builder lwjglDebug(boolean lwjglDebug) {
+ this.lwjglDebug = lwjglDebug;
+ return this;
+ }
+
+ public Builder streamingUploadStrategy(StreamingUploader.UploadStrategy strategy) {
+ this.streamingUploadStrategy = strategy;
+ return this;
+ }
+
+ public Builder framebufferSupported(boolean framebufferSupported) {
+ this.framebufferSupported = framebufferSupported;
+ return this;
+ }
+
+ public Builder fboEnabled(boolean fboEnabled) {
+ this.fboEnabled = fboEnabled;
+ return this;
+ }
+
+ public Builder directDrawer(Consumer directDrawer) {
+ this.directDrawer = directDrawer;
+ return this;
+ }
+
+ public Builder streamingDrawerDestroy(Runnable streamingDrawerDestroy) {
+ this.streamingDrawerDestroy = streamingDrawerDestroy;
+ return this;
+ }
+
+ public Builder displaySize(int width, int height) {
+ this.displayWidth = width;
+ this.displayHeight = height;
+ return this;
+ }
+
+ public Builder postInitCallback(Runnable callback) {
+ this.postInitCallback = callback;
+ return this;
+ }
+
+ public GLSMInitConfig build() {
+ return new GLSMInitConfig(this);
+ }
+ }
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/BlendFuncChangeEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/BlendFuncChangeEvent.java
new file mode 100644
index 000000000..f6e06fc23
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/BlendFuncChangeEvent.java
@@ -0,0 +1,10 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+public final class BlendFuncChangeEvent extends MutableEvent {
+ public int srcRgb;
+ public int dstRgb;
+ public int srcAlpha;
+ public int dstAlpha;
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/FogStateChangeEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/FogStateChangeEvent.java
new file mode 100644
index 000000000..a693e48e2
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/FogStateChangeEvent.java
@@ -0,0 +1,6 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+/** FogState changed - Listeners should query GLSM fog state directly if they care what changed. */
+public final class FogStateChangeEvent extends MutableEvent {}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/LightmapCoordsEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/LightmapCoordsEvent.java
new file mode 100644
index 000000000..fa5602077
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/LightmapCoordsEvent.java
@@ -0,0 +1,8 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+public final class LightmapCoordsEvent extends MutableEvent {
+ public float x;
+ public float y;
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/ProgramChangeEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/ProgramChangeEvent.java
new file mode 100644
index 000000000..65f4a362b
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/ProgramChangeEvent.java
@@ -0,0 +1,8 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+public final class ProgramChangeEvent extends MutableEvent {
+ public int previousProgram;
+ public int newProgram;
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureBindEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureBindEvent.java
new file mode 100644
index 000000000..3fc9f730f
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureBindEvent.java
@@ -0,0 +1,7 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+public final class TextureBindEvent extends MutableEvent {
+ public int textureId;
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureDeleteEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureDeleteEvent.java
new file mode 100644
index 000000000..bdc55ca6f
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureDeleteEvent.java
@@ -0,0 +1,7 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+public final class TextureDeleteEvent extends MutableEvent {
+ public int textureId;
+}
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureUnitStateEvent.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureUnitStateEvent.java
new file mode 100644
index 000000000..c60a76564
--- /dev/null
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/events/TextureUnitStateEvent.java
@@ -0,0 +1,8 @@
+package com.gtnewhorizons.angelica.glsm.hooks.events;
+
+import net.minecraftforge.eventbus.api.event.MutableEvent;
+
+public final class TextureUnitStateEvent extends MutableEvent {
+ public int unit;
+ public boolean enabled;
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AccumulatedDraw.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AccumulatedDraw.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/AccumulatedDraw.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AccumulatedDraw.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBuffer.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBuffer.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBuffer.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
index 52ae83738..42ec4ceee 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java
@@ -490,10 +490,10 @@ public final class CommandBufferExecutor {
// Restore attributes based on flags
if ((flags & VertexFlags.COLOR_BIT) != 0) {
final int color = memGetInt(ptr + 8);
- byte a = (byte) ((color >> 24) & 0xFF);
- byte r = (byte) ((color >> 16) & 0xFF);
- byte g = (byte) ((color >> 8) & 0xFF);
- byte b = (byte) ((color & 0xFF));
+ final byte a = (byte) ((color >> 24) & 0xFF);
+ 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);
}
if ((flags & VertexFlags.NORMAL_BIT) != 0) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java
similarity index 95%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java
index 3fa822c7b..a7a15d848 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferProcessor.java
@@ -1,18 +1,12 @@
package com.gtnewhorizons.angelica.glsm.recording;
-import com.gtnewhorizons.angelica.glsm.DisplayListManager;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.recording.commands.DisplayListCommand;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.joml.Matrix4f;
-import org.lwjgl.opengl.GL11;
import java.nio.FloatBuffer;
-import java.util.ArrayDeque;
-import java.util.Deque;
public final class CommandBufferProcessor {
- private static final Logger LOGGER = LogManager.getLogger("CommandBufferProcessor");
private static final Matrix4f tempMatrix = new Matrix4f();
private CommandBufferProcessor() {}
@@ -168,7 +162,7 @@ public final class CommandBufferProcessor {
out.writeComplexRef((DisplayListCommand) obj);
}
- default -> LOGGER.warn("[CommandBufferProcessor] Unknown opcode in buffer copy: {}", opcode);
+ default -> GLStateManager.LOGGER.warn("[CommandBufferProcessor] Unknown opcode in buffer copy: {}", opcode);
}
}
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandRecorder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandRecorder.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandRecorder.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandRecorder.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/GLCommand.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/GLCommand.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/GLCommand.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/GLCommand.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
similarity index 97%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
index 44463c2ce..d557554d4 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java
@@ -6,8 +6,6 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.VertexAttribState;
import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
@@ -19,7 +17,6 @@ import java.util.Arrays;
* Used both during display list compilation and for live immediate mode emulation in core profile.
*/
public final class ImmediateModeRecorder {
- private static final Logger LOGGER = LogManager.getLogger("ImmediateModeRecorder");
private static final DirectTessellator tessellator = new DirectTessellator(TessellatorManager.DEFAULT_BUFFER_SIZE);
/** Separate tessellator for the splash thread. Nulled after splash completes. */
@@ -234,7 +231,7 @@ public final class ImmediateModeRecorder {
final int eboReadOffset = (int) indicesOffset;
final int eboReadSize = indicesCount * indexSize;
if (eboReadOffset + eboReadSize > eboSize) {
- LOGGER.warn("[EBO] Read range {}+{} exceeds buffer size {}", eboReadOffset, eboReadSize, eboSize);
+ GLStateManager.LOGGER.warn("[EBO] Read range {}+{} exceeds buffer size {}", eboReadOffset, eboReadSize, eboSize);
GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO);
return null;
}
@@ -286,7 +283,7 @@ public final class ImmediateModeRecorder {
GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId);
final int bufferSize = GL15.glGetBufferParameteri(GL15.GL_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE);
if (bufferSize <= 0) {
- LOGGER.warn("[VBO Readback] GL_BUFFER_SIZE={} for VBO {}", bufferSize, a.vboId);
+ GLStateManager.LOGGER.warn("[VBO Readback] GL_BUFFER_SIZE={} for VBO {}", bufferSize, a.vboId);
continue;
}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/DisplayListCommand.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/DisplayListCommand.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/DisplayListCommand.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/DisplayListCommand.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java
similarity index 95%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java
index da2e43e81..640207549 100644
--- a/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,5 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
-import com.github.bsideup.jabel.Desugar;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.jetbrains.annotations.NotNull;
import org.joml.Matrix4f;
@@ -12,7 +11,6 @@ import java.nio.FloatBuffer;
* Command: glMultMatrix(matrix)
* Multiplies the current matrix by the specified matrix.
*/
-@Desugar
public record MultMatrixCmd(Matrix4f matrix, FloatBuffer buffer) implements DisplayListCommand {
/**
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java
index 8bccfe828..48ab79fe9 100644
--- a/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,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
-import com.github.bsideup.jabel.Desugar;
import com.gtnewhorizons.angelica.glsm.GLDebug;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.jetbrains.annotations.NotNull;
@@ -16,7 +15,6 @@ import java.nio.IntBuffer;
* Command: glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels)
* Specifies a two-dimensional texture image during display list playback.
*/
-@Desugar
public record TexImage2DCmd(
int target,
int level,
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java
index 479923d9f..0808b7314 100644
--- a/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,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm.recording.commands;
-import com.github.bsideup.jabel.Desugar;
import com.gtnewhorizons.angelica.glsm.GLDebug;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.jetbrains.annotations.NotNull;
@@ -16,7 +15,6 @@ import java.nio.IntBuffer;
* Command: glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels)
* Updates a portion of an existing two-dimensional texture image during display list playback.
*/
-@Desugar
public record TexSubImage2DCmd(
int target,
int level,
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/AlphaStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/AlphaStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/AlphaStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/AlphaStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BlendStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BlendStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BlendStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BlendStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Color4Stack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Color4Stack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Color4Stack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Color4Stack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ColorMaskStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ColorMaskStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ColorMaskStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ColorMaskStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/DepthStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/DepthStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/DepthStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/DepthStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/FogStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/FogStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/FogStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/FogStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/IntegerStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/IntegerStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/IntegerStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/IntegerStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightModelStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightModelStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightModelStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightModelStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LightStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LineStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LineStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LineStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/LineStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MaterialStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MaterialStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MaterialStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MaterialStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MatrixModeStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MatrixModeStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MatrixModeStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/MatrixModeStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PointStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PointStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PointStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PointStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PolygonStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PolygonStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PolygonStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/PolygonStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/StencilStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/StencilStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/StencilStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/StencilStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureBindingStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureBindingStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureBindingStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureBindingStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec3fStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec3fStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec3fStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec3fStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec4fStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec4fStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec4fStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/Vec4fStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ViewPortStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ViewPortStateStack.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ViewPortStateStack.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/ViewPortStateStack.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/AlphaState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/AlphaState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/AlphaState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/AlphaState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/BlendState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BlendState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/BlendState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BlendState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/ClipPlaneState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ClipPlaneState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/ClipPlaneState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ClipPlaneState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/Color4.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/Color4.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/Color4.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/Color4.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/ColorMask.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ColorMask.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/ColorMask.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ColorMask.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/DepthState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/DepthState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/DepthState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/DepthState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/FogState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/FogState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/FogState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/FogState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/ISettableState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ISettableState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/ISettableState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ISettableState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/IntegerState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/IntegerState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/IntegerState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/IntegerState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/LineState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LineState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/LineState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LineState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/MatrixMode.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MatrixMode.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/MatrixMode.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MatrixMode.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/PointState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/PointState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/PointState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/PointState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/PolygonState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/PolygonState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/PolygonState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/PolygonState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/StencilState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/StencilState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/StencilState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/StencilState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/TexEnvState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TexEnvState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/TexEnvState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TexEnvState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/TexGenState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TexGenState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/TexGenState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TexGenState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureBinding.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureBinding.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureBinding.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureBinding.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureUnitArray.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureUnitArray.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureUnitArray.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/TextureUnitArray.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/VertexAttribState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/VertexAttribState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/VertexAttribState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/VertexAttribState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/states/ViewportState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ViewportState.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/states/ViewportState.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/ViewportState.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/PersistentStreamingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/PersistentStreamingBuffer.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/streaming/PersistentStreamingBuffer.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/PersistentStreamingBuffer.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBuffer.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBuffer.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBuffer.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
similarity index 73%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
index 8ac72297b..1546dba0a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java
@@ -1,7 +1,6 @@
package com.gtnewhorizons.angelica.glsm.streaming;
-import com.gtnewhorizons.angelica.AngelicaMod;
-import me.jellysquid.mods.sodium.client.gui.options.named.NamedState;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL30;
@@ -13,28 +12,16 @@ import static com.mitchej123.lwjgl.LWJGLServiceProvider.LWJGL;
public final class StreamingUploader {
- public enum UploadStrategy implements NamedState {
- BUFFER_DATA("sodium.options.upload_method.buffer_data"),
- BUFFER_SUB_DATA("sodium.options.upload_method.buffer_subdata"),
- MAP_BUFFER_RANGE("sodium.options.upload_method.map_buffer");
-
-
- private final String key;
-
- UploadStrategy(String key) {
- this.key = key;
- }
-
- @Override
- public String getKey() {
- return this.key;
- }
+ public enum UploadStrategy {
+ BUFFER_DATA,
+ BUFFER_SUB_DATA,
+ MAP_BUFFER_RANGE
}
private static final int MAP_WRITE_INVALIDATE_BUFFER = GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_BUFFER_BIT;
public static int upload(ByteBuffer data, int capacity) {
- return upload(AngelicaMod.options().advanced.streamingUploadStrategy, data, capacity);
+ return upload(GLStateManager.getInitConfig().getStreamingUploadStrategy(), data, capacity);
}
public static int upload(UploadStrategy strategy, ByteBuffer data, int capacity) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java
similarity index 100%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java
rename to glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java
diff --git a/glsm/src/stubs/java/net/minecraft/client/renderer/Tessellator.java b/glsm/src/stubs/java/net/minecraft/client/renderer/Tessellator.java
new file mode 100644
index 000000000..1344e20be
--- /dev/null
+++ b/glsm/src/stubs/java/net/minecraft/client/renderer/Tessellator.java
@@ -0,0 +1,46 @@
+package net.minecraft.client.renderer;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * Compile stub for MC's Tessellator. DirectTessellator (GTNHLib) extends this.
+ */
+public class Tessellator {
+
+ public static ByteBuffer byteBuffer = ByteBuffer.allocateDirect(0x200000 * 4).order(ByteOrder.nativeOrder());
+ public static boolean renderingWorldRenderer;
+ public static final Tessellator instance = new Tessellator();
+
+ public boolean defaultTexture;
+ public int[] rawBuffer;
+ public int rawBufferSize;
+ public int textureID;
+ public int rawBufferIndex;
+ public int vertexCount;
+ public int addedVertices;
+ public int drawMode;
+ public boolean isDrawing;
+ public boolean isColorDisabled;
+ public boolean hasColor;
+ public boolean hasTexture;
+ public boolean hasBrightness;
+ public boolean hasNormals;
+ public double textureU;
+ public double textureV;
+ public int brightness;
+ public int color;
+ public int normal;
+ public double xOffset;
+ public double yOffset;
+ public double zOffset;
+ public int bufferSize;
+
+ public Tessellator() {}
+
+ public int draw() { return 0; }
+
+ public void reset() {}
+
+ public void startDrawing(int mode) {}
+}
diff --git a/glsm/src/stubs/java/net/minecraft/client/shader/TesselatorVertexState.java b/glsm/src/stubs/java/net/minecraft/client/shader/TesselatorVertexState.java
new file mode 100644
index 000000000..1b6068b23
--- /dev/null
+++ b/glsm/src/stubs/java/net/minecraft/client/shader/TesselatorVertexState.java
@@ -0,0 +1,23 @@
+package net.minecraft.client.shader;
+
+/**
+ * Compile stub. DirectTessellator references this type.
+ */
+public class TesselatorVertexState {
+
+ public TesselatorVertexState(int[] rawBuffer, int rawBufferIndex, int vertexCount, boolean hasTexture, boolean hasBrightness, boolean hasNormals, boolean hasColor) {}
+
+ public int[] getRawBuffer() {return null;}
+
+ public int getRawBufferIndex() {return 0;}
+
+ public int getVertexCount() {return 0;}
+
+ public boolean getHasTexture() {return false;}
+
+ public boolean getHasBrightness() {return false;}
+
+ public boolean getHasNormals() {return false;}
+
+ public boolean getHasColor() {return false;}
+}
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformerTest.java
similarity index 100%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformerTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatShaderTransformerTest.java
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
similarity index 98%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
index 58cf5c867..bbdf98d69 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -13,7 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class CompatUniformManagerTest {
private int program = 0;
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java
similarity index 78%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java
index 99b0bb6ed..f34b3bd16 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationGLSMTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -16,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** Tests GLSM display list behavior matches OpenGL spec. */
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class DisplayListCompilationGLSMTest {
private int testList = -1;
@@ -102,30 +101,28 @@ class DisplayListCompilationGLSMTest {
}
@Test
- void glsm_compileAndExecute_transformQueuedUntilFlush() {
- // Transforms queue until draw/glEndList (state commands don't flush)
- FloatBuffer identity = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, identity);
-
+ void glsm_compileAndExecute_transformAppliedImmediately() {
+ // COMPILE_AND_EXECUTE: transforms apply to GLSM stack immediately (not deferred). This is required because state commands between transforms and draws
+ // may trigger Iris program activation, which reads the matrix from the GLSM stack.
testList = GL11.glGenLists(1);
GLStateManager.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE);
- GLStateManager.glTranslatef(10, 0, 0); // Queued
+ GLStateManager.glTranslatef(10, 0, 0); // Applied immediately
- FloatBuffer beforeFlush = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, beforeFlush);
- assertMatrixEquals(identity, beforeFlush, "Before flush: transform queued");
+ FloatBuffer afterTranslate = BufferUtils.createFloatBuffer(16);
+ GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterTranslate);
+ assertEquals(10.0f, afterTranslate.get(12), 0.001f, "After translate: applied immediately");
- GLStateManager.enableBlend(); // State commands DON'T flush transforms anymore
+ GLStateManager.enableBlend();
FloatBuffer afterStateCmd = BufferUtils.createFloatBuffer(16);
GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterStateCmd);
- assertMatrixEquals(identity, afterStateCmd, "After state cmd: transform still queued");
+ assertEquals(10.0f, afterStateCmd.get(12), 0.001f, "After state cmd: still applied");
- GLStateManager.glEndList(); // glEndList flushes pending transforms
+ GLStateManager.glEndList();
FloatBuffer afterEndList = BufferUtils.createFloatBuffer(16);
GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterEndList);
- assertEquals(10.0f, afterEndList.get(12), 0.001f, "After glEndList: transform applied");
+ assertEquals(10.0f, afterEndList.get(12), 0.001f, "After glEndList: still applied");
}
@Test
@@ -209,7 +206,7 @@ class DisplayListCompilationGLSMTest {
}
@Test
- void glsm_compileAndExecute_matrixModeFlushesTransforms() {
+ void glsm_compileAndExecute_matrixModeWithTransforms() {
GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
GLStateManager.glLoadIdentity();
GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
@@ -217,18 +214,14 @@ class DisplayListCompilationGLSMTest {
testList = GL11.glGenLists(1);
GLStateManager.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE);
- GLStateManager.glTranslatef(10, 0, 0); // Queued
- GLStateManager.glRotatef(45, 0, 1, 0); // Queued
+ GLStateManager.glTranslatef(10, 0, 0); // Applied immediately
+ GLStateManager.glRotatef(45, 0, 1, 0); // Applied immediately
- FloatBuffer beforeMode = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, beforeMode);
- assertEquals(0.0f, beforeMode.get(12), 0.001f, "Before MatrixMode: queued");
+ FloatBuffer afterTransforms = BufferUtils.createFloatBuffer(16);
+ GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterTransforms);
+ assertNotEquals(0.0f, afterTransforms.get(12), "After transforms: applied immediately");
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION); // Barrier - flushes
-
- FloatBuffer afterMode = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterMode);
- assertNotEquals(0.0f, afterMode.get(12), "After MatrixMode: flushed to MODELVIEW");
+ GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
FloatBuffer proj = BufferUtils.createFloatBuffer(16);
GLStateManager.glGetFloat(GL11.GL_PROJECTION_MATRIX, proj);
@@ -241,25 +234,19 @@ class DisplayListCompilationGLSMTest {
}
@Test
- void glsm_compileAndExecute_pushPopMatrixQueued() {
- // State commands don't flush, but push/pop ARE matrix barriers
+ void glsm_compileAndExecute_pushPopMatrix() {
+ // Push/pop work correctly with immediate transform application
testList = GL11.glGenLists(1);
GLStateManager.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE);
GLStateManager.glPushMatrix();
- GLStateManager.glTranslatef(10, 0, 0);
+ GLStateManager.glTranslatef(10, 0, 0); // Applied immediately
- FloatBuffer beforeFlush = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, beforeFlush);
- assertEquals(0.0f, beforeFlush.get(12), 0.001f, "Before flush: queued");
+ FloatBuffer afterTranslate = BufferUtils.createFloatBuffer(16);
+ GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterTranslate);
+ assertEquals(10.0f, afterTranslate.get(12), 0.001f, "After translate: applied immediately");
- GLStateManager.enableBlend(); // NOT a barrier in new model
-
- FloatBuffer afterStateCmd = BufferUtils.createFloatBuffer(16);
- GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterStateCmd);
- assertEquals(0.0f, afterStateCmd.get(12), 0.001f, "After state cmd: still queued");
-
- GLStateManager.glPopMatrix(); // Matrix barrier: flushes transform, then pops
+ GLStateManager.glPopMatrix(); // Pops back to pre-push state
FloatBuffer afterPop = BufferUtils.createFloatBuffer(16);
GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, afterPop);
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java
index d6abfc701..287141f7a 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationRawGLTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -13,7 +12,7 @@ import java.nio.FloatBuffer;
import static org.junit.jupiter.api.Assertions.*;
/** Tests raw GL11 display list behavior (reference for GLSM). */
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class DisplayListCompilationRawGLTest {
private int testList = -1;
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListIdAllocatorTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListIdAllocatorTest.java
similarity index 100%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListIdAllocatorTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListIdAllocatorTest.java
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java
similarity index 100%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
similarity index 98%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
index b8570ad46..df5326764 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -14,7 +13,7 @@ import java.nio.FloatBuffer;
import static org.junit.jupiter.api.Assertions.*;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class FeedbackManagerTest {
@BeforeEach
diff --git a/src/test/java/com/gtnewhorizons/angelica/AngelicaExtension.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java
similarity index 68%
rename from src/test/java/com/gtnewhorizons/angelica/AngelicaExtension.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java
index 54bbf6339..e482da32e 100644
--- a/src/test/java/com/gtnewhorizons/angelica/AngelicaExtension.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java
@@ -1,9 +1,8 @@
-package com.gtnewhorizons.angelica;
+package com.gtnewhorizons.angelica.glsm;
import com.gtnewhorizons.angelica.glsm.GLDebug;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
-import com.gtnewhorizons.angelica.glsm.RenderSystem;
-import com.gtnewhorizons.angelica.glsm.states.VertexAttribState;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMInitConfig;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
@@ -20,7 +19,18 @@ import java.lang.reflect.Field;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL;
-public class AngelicaExtension implements BeforeAllCallback, BeforeEachCallback, AfterEachCallback, ExtensionContext.Store.CloseableResource {
+public class GLSMExtension implements BeforeAllCallback, BeforeEachCallback, AfterEachCallback, ExtensionContext.Store.CloseableResource {
+
+ private static final Unsafe theUnsafe;
+ static {
+ try {
+ final Field f = Unsafe.class.getDeclaredField("theUnsafe");
+ f.setAccessible(true);
+ theUnsafe = (Unsafe) f.get(null);
+ } catch (ReflectiveOperationException e) {
+ throw new RuntimeException(e);
+ }
+ }
private static boolean started = false;
private static DisplayMode displayMode;
@@ -45,13 +55,13 @@ public class AngelicaExtension implements BeforeAllCallback, BeforeEachCallback,
setMainThread(Thread.currentThread());
- GLStateManager.preInit();
- VertexAttribState.init(0);
+ GLStateManager.initialize(GLSMInitConfig.builder()
+ .displaySize(displayMode.getWidth(), displayMode.getHeight())
+ .build());
GLStateManager.setRunningSplash(false);
GLStateManager.markSplashComplete();
GLStateManager.BYPASS_CACHE = false;
- RenderSystem.initRenderer();
- context.getRoot().getStore(GLOBAL).put("AngelicaExtension", this);
+ context.getRoot().getStore(GLOBAL).put("GLSMExtension", this);
glVendor = GL11.glGetString(GL11.GL_VENDOR);
glRenderer = GL11.glGetString(GL11.GL_RENDERER);
glVersion = GL11.glGetString(GL11.GL_VERSION);
@@ -62,18 +72,24 @@ public class AngelicaExtension implements BeforeAllCallback, BeforeEachCallback,
}
}
+ private static void forceBoundVAO(int value) {
+ try {
+ final Field f = GLStateManager.class.getDeclaredField("boundVAO");
+ final Object base = theUnsafe.staticFieldBase(f);
+ final long offset = theUnsafe.staticFieldOffset(f);
+ theUnsafe.putInt(base, offset, value);
+ } catch (NoSuchFieldException e) {
+ throw new RuntimeException("Failed to force boundVAO", e);
+ }
+ }
+
private static void setMainThread(Thread thread) {
try {
- // Use Unsafe to set final static field - works on all Java versions
- final Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
- unsafeField.setAccessible(true);
- final Unsafe unsafe = (Unsafe) unsafeField.get(null);
-
- final Field mainThreadField = GLStateManager.class.getDeclaredField("MainThread");
- final Object base = unsafe.staticFieldBase(mainThreadField);
- final long offset = unsafe.staticFieldOffset(mainThreadField);
- unsafe.putObject(base, offset, thread);
- } catch (NoSuchFieldException | IllegalAccessException e) {
+ final Field f = GLStateManager.class.getDeclaredField("MainThread");
+ final Object base = theUnsafe.staticFieldBase(f);
+ final long offset = theUnsafe.staticFieldOffset(f);
+ theUnsafe.putObject(base, offset, thread);
+ } catch (NoSuchFieldException e) {
throw new RuntimeException("Failed to set MainThread for tests", e);
}
}
@@ -87,6 +103,11 @@ public class AngelicaExtension implements BeforeAllCallback, BeforeEachCallback,
public void beforeEach(ExtensionContext context) throws Exception {
while (GL11.glGetError() != GL11.GL_NO_ERROR) {}
+ // 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.
+ forceBoundVAO(-1);
+ GLStateManager.glBindVertexArray(0);
+
GL11.glMatrixMode(GL11.GL_MODELVIEW);
while (GL11.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH) > EXPECTED_MODELVIEW_STACK_DEPTH) {
GL11.glPopMatrix();
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
similarity index 97%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
index 83d0eb5f2..63ae6b19e 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -17,7 +16,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
* Verifies that per-buffer blend operations (glEnablei/glDisablei) properly invalidate
* the GLSM blend cache so subsequent global blend enable/disable calls are not skipped.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_BlendUnknownState_UnitTest {
@BeforeEach
diff --git a/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
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java
index 086b2bdac..8b4a2e135 100644
--- a/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
@@ -1,7 +1,6 @@
package com.gtnewhorizons.angelica.glsm;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.IVertexBuffer;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList;
import com.gtnewhorizons.angelica.glsm.recording.DisplayListVBO;
import com.gtnewhorizons.angelica.glsm.recording.GLCommand;
@@ -25,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.*;
* Different formats produce separate VBOs
*
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_DisplayList_Batching_Test {
private static int getVBOCount(CompiledDisplayList compiledDisplayList) {
diff --git a/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
similarity index 98%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java
index cb6dbda97..f67a3880d 100644
--- a/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
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -13,7 +12,7 @@ import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyState;
* Verifies that display lists work correctly with different vertex attribute combinations
* and that optimal formats are selected.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_DisplayList_FormatOptimization_Test {
private int displayList = -1;
diff --git a/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
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java
index a0307418a..8569310cd 100644
--- a/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
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.joml.Matrix4f;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
@@ -16,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
* Tests for nested display list execution.
* Verifies that child display lists compose correctly with parent transforms.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_DisplayList_Nesting_Test {
private int parentList = -1;
diff --git a/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
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java
index 9850be095..0d80edbcf 100644
--- a/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
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.joml.Matrix4f;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
@@ -24,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
* need the full Minecraft environment. These tests focus on matrix
* operations and display list lifecycle which work with raw GL calls.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_DisplayList_Stress_Test {
private final List testLists = new ArrayList<>();
diff --git a/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
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java
index 79f12b488..5b33c350c 100644
--- a/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
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList;
import com.gtnewhorizons.angelica.glsm.recording.GLCommand;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
@@ -19,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** Tests for transform collapsing optimization in display lists. */
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_DisplayList_TransformCollapsing_Test {
private int testList = -1;
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
index 538432140..21f3889f4 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -9,7 +8,7 @@ import org.lwjgl.opengl.GL11;
import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyState;
import static org.junit.jupiter.api.Assertions.assertEquals;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_DisplayList_UnitTest {
@Test
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
similarity index 98%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
index 9d10fcf0d..f5c4bc23b 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.joml.Matrix4f;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -15,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Tests that GLStateManager's GLU implementations produce the same matrices as the equivalent JOML operations.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
public class GLSM_GLU_UnitTest {
private static final FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
index 57a94402d..047da48de 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.lwjgl.opengl.GL11;
@@ -14,7 +13,7 @@ import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyLightState;
import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyState;
import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyMaterialState;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
public class GLSM_Lighting_UnitTest {
static final FloatBuffer f4b = ByteBuffer.allocateDirect(4 << 2).order(ByteOrder.nativeOrder()).asFloatBuffer();
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
similarity index 97%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
index 7ed3ba8f1..195862140 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.joml.Matrix4f;
import org.joml.Matrix4fStack;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -13,7 +12,7 @@ import java.nio.FloatBuffer;
import static org.junit.jupiter.api.Assertions.assertTrue;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
public class GLSM_MatrixStack_UnitTest {
final static FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
index 1f3d38baf..09f659d52 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import com.gtnewhorizons.angelica.util.GLBit;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -22,7 +21,7 @@ import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyLightState;
import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyState;
import static org.junit.jupiter.api.Assertions.assertTrue;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class GLSM_PushPop_UnitTest {
@BeforeEach
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
index d8ac88c33..83c9005e8 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -25,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.*;
* be properly synchronized in the GLSM cache. Client-side state (texture bindings, active unit)
* is per-context and should NOT be shared.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
public class GLSM_ServerSideState_UnitTest {
private SharedDrawable sharedDrawable;
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
similarity index 95%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
index 925a2f9aa..e48de33ed 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
import org.junit.jupiter.api.Test;
@@ -13,7 +12,7 @@ import java.nio.ByteBuffer;
import static org.junit.jupiter.api.Assertions.*;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
public class GLSM_TextureInfoCache_UnitTest {
/**
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
similarity index 92%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
index 20f18af24..8e5a52379 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.glsm;
import com.gtnewhorizon.gtnhlib.client.opengl.UniversalVAO;
-import com.gtnewhorizons.angelica.AngelicaExtension;
+import com.gtnewhorizons.angelica.glsm.states.VertexAttribState;
import com.gtnewhorizons.angelica.util.GLSMUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -13,12 +13,12 @@ import org.lwjgl.opengl.GL30;
import static com.gtnewhorizons.angelica.util.GLSMUtil.verifyState;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
public class GLSM_VAO_UnitTest {
@Test
void testDefaultStates() {
- verifyState(GL30.GL_VERTEX_ARRAY_BINDING, 0, "GL_VERTEX_ARRAY_BINDING Initial State");
+ verifyState(GL30.GL_VERTEX_ARRAY_BINDING, GLStateManager.getDefaultVAO(), "GL_VERTEX_ARRAY_BINDING Initial State");
verifyState(GL13.GL_CLIENT_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "GL_CLIENT_ACTIVE_TEXTURE Initial State");
testClientStates();
}
@@ -85,7 +85,7 @@ public class GLSM_VAO_UnitTest {
// Check if everything got reset to default
glBindVertexArray(0);
- verifyState(GL30.GL_VERTEX_ARRAY_BINDING, 0, "GL_VERTEX_ARRAY_BINDING - Unbound");
+ verifyState(GL30.GL_VERTEX_ARRAY_BINDING, GLStateManager.getDefaultVAO(), "GL_VERTEX_ARRAY_BINDING - Unbound");
verifyState(GL15.GL_ARRAY_BUFFER_BINDING, 0, "GL_ARRAY_BUFFER_BINDING - Unbound");
verifyState(GL11.GL_VERTEX_ARRAY, defaultVertexEnabled, "GL_VERTEX_ARRAY - Reset");
@@ -131,7 +131,9 @@ public class GLSM_VAO_UnitTest {
}
private static void glBindVertexArray(int array) {
+ if (array == 0) array = GLStateManager.getDefaultVAO();
GLStateManager.boundVAO = array;
+ VertexAttribState.onBindVertexArray(array);
UniversalVAO.bindVertexArray(array);
}
}
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
similarity index 98%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
index 1f1958b6c..df36a84cd 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java
@@ -1,6 +1,5 @@
package com.gtnewhorizons.angelica.glsm;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.lwjgl.BufferUtils;
@@ -11,7 +10,7 @@ import java.nio.FloatBuffer;
import static org.junit.jupiter.api.Assertions.assertEquals;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class VertexAttribDefaultBridgeTest {
private static final int COLOR_ATTRIB = 1; // VertexFormatElement.Usage.COLOR
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java
index e540cb389..c038f6bfe 100644
--- a/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,6 @@
package com.gtnewhorizons.angelica.glsm.ffp;
-import com.gtnewhorizons.angelica.AngelicaExtension;
+import com.gtnewhorizons.angelica.glsm.GLSMExtension;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.TexEnvState;
import org.junit.jupiter.api.AfterEach;
@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.*;
* Tests for FFP TexEnv COMBINE / multi-unit features:
* TexEnvState tracking, FragmentKey packing, FragmentShaderGenerator COMBINE codegen, and glMultiTexCoord routing.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class FFPCombineShaderTest {
private final List shadersToDelete = new ArrayList<>();
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
similarity index 97%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
index ba246904a..fe44f5dc5 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.glsm.recording;
import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
-import com.gtnewhorizons.angelica.AngelicaExtension;
+import com.gtnewhorizons.angelica.glsm.GLSMExtension;
import com.gtnewhorizons.angelica.glsm.DisplayListManager;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.junit.jupiter.api.AfterEach;
@@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
/**
* Unit tests for display list recording data structures.
*/
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class RecordingDataStructuresTest {
private int testList = -1;
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java
similarity index 98%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java
index 5e9ae3736..e6ef7299c 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java
+++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBufferTest.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.glsm.streaming;
-import com.gtnewhorizons.angelica.AngelicaExtension;
+import com.gtnewhorizons.angelica.glsm.GLSMExtension;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -17,7 +17,7 @@ import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memAlloc;
import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memFree;
import static org.junit.jupiter.api.Assertions.*;
-@ExtendWith(AngelicaExtension.class)
+@ExtendWith(GLSMExtension.class)
class StreamingBufferTest {
@ParameterizedTest
diff --git a/src/test/java/com/gtnewhorizons/angelica/util/GLBit.java b/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLBit.java
similarity index 100%
rename from src/test/java/com/gtnewhorizons/angelica/util/GLBit.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/util/GLBit.java
diff --git a/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java b/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java
similarity index 100%
rename from src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java
rename to glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java
diff --git a/glsm/src/test/java/net/minecraft/launchwrapper/Launch.java b/glsm/src/test/java/net/minecraft/launchwrapper/Launch.java
new file mode 100644
index 000000000..e73f2cf3b
--- /dev/null
+++ b/glsm/src/test/java/net/minecraft/launchwrapper/Launch.java
@@ -0,0 +1,15 @@
+package net.minecraft.launchwrapper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Stub for tests - provides blackboard without loading real launchwrapper.
+ */
+public class Launch {
+ public static Map blackboard = new HashMap<>();
+
+ static {
+ blackboard.put("lwjgl3ify:rfb-booted", Boolean.FALSE);
+ }
+}
diff --git a/repositories.gradle b/repositories.gradle
index 76adac3eb..be4bbed7a 100644
--- a/repositories.gradle
+++ b/repositories.gradle
@@ -22,6 +22,13 @@ repositories {
includeGroup 'org.taumc'
}
}
+ maven {
+ name = 'forge'
+ url = 'https://maven.minecraftforge.net/'
+ content {
+ includeGroup 'net.minecraftforge'
+ }
+ }
ivy {
name = 'modernsplash-github'
url = 'https://github.com/MalTeeez/ModernSplash/releases/download/'
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 40a1eff15..e28d11fbc 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -16,5 +16,7 @@ pluginManagement {
}
plugins {
- id("com.gtnewhorizons.gtnhsettingsconvention") version("2.0.23")
+ id("com.gtnewhorizons.gtnhsettingsconvention") version ("2.0.24")
}
+
+include("glsm")
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/debug/OpenGLDebugging.java b/src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java
similarity index 99%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/debug/OpenGLDebugging.java
rename to src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java
index 18c0790f5..9623031bb 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/debug/OpenGLDebugging.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/debug/OpenGLDebugging.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm.debug;
+package com.gtnewhorizons.angelica.client.debug;
import com.gtnewhorizons.angelica.glsm.GLDebug;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaFogService.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java
similarity index 92%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaFogService.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java
index 06cfabf13..b14b05bfe 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaFogService.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java
@@ -1,5 +1,6 @@
-package com.gtnewhorizons.angelica.glsm;
+package com.gtnewhorizons.angelica.client.rendering;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
import org.embeddedt.embeddium.impl.render.chunk.fog.FogService;
import org.embeddedt.embeddium.impl.render.chunk.shader.ChunkFogMode;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaGLStateManagerService.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaGLStateManagerService.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaGLStateManagerService.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaGLStateManagerService.java
index 6b4ff1dae..37ce290f9 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaGLStateManagerService.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaGLStateManagerService.java
@@ -1,6 +1,7 @@
-package com.gtnewhorizons.angelica.glsm;
+package com.gtnewhorizons.angelica.client.rendering;
import com.gtnewhorizon.gtnhlib.client.opengl.UniversalVAO;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.mitchej123.glsm.GLStateManagerService;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaRenderSystemService.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaRenderSystemService.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java
index a8d8c2040..d763449b1 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/AngelicaRenderSystemService.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaRenderSystemService.java
@@ -1,5 +1,6 @@
-package com.gtnewhorizons.angelica.glsm;
+package com.gtnewhorizons.angelica.client.rendering;
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.mitchej123.glsm.RenderSystemService;
import org.joml.Matrix4f;
import org.lwjgl.BufferUtils;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredBatchTessellator.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredBatchTessellator.java
similarity index 98%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredBatchTessellator.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredBatchTessellator.java
index 1ad221c27..6cb7d29e8 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredBatchTessellator.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredBatchTessellator.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm.ffp;
+package com.gtnewhorizons.angelica.client.rendering;
import com.github.bsideup.jabel.Desugar;
import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredDrawBatcher.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java
similarity index 99%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredDrawBatcher.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java
index 768c5e15b..d1f638960 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredDrawBatcher.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm.ffp;
+package com.gtnewhorizons.angelica.client.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/uniform/GlUniformFloat2v.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java
similarity index 91%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/uniform/GlUniformFloat2v.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java
index 717782b19..d2d914f8e 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/uniform/GlUniformFloat2v.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm.uniform;
+package com.gtnewhorizons.angelica.client.rendering;
import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform;
import org.lwjgl.opengl.GL20;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/TessellatorStreamingDrawer.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/TessellatorStreamingDrawer.java
similarity index 96%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ffp/TessellatorStreamingDrawer.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/TessellatorStreamingDrawer.java
index ba32eb4bf..36db97bf7 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/TessellatorStreamingDrawer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/TessellatorStreamingDrawer.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm.ffp;
+package com.gtnewhorizons.angelica.client.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
@@ -7,6 +7,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.QuadConverter;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
+import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
import com.gtnewhorizons.angelica.glsm.streaming.OrphanStreamingBuffer;
import com.gtnewhorizons.angelica.glsm.streaming.PersistentStreamingBuffer;
import net.minecraft.client.renderer.Tessellator;
@@ -225,6 +226,10 @@ public class TessellatorStreamingDrawer {
ShaderManager.getInstance().preDraw(flags);
drawWithQuadConversion(drawMode, firstVertex, vertexCount);
GLStateManager.glBindVertexArray(0);
+ GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY);
+ GLStateManager.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
+ GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY);
+ GLStateManager.glDisableClientState(GL11.GL_NORMAL_ARRAY);
}
private static void drawWithQuadConversion(int drawMode, int firstVertex, int vertexCount) {
diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/TextureTracker.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/TextureTracker.java
new file mode 100644
index 000000000..a08b6649e
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/TextureTracker.java
@@ -0,0 +1,54 @@
+package com.gtnewhorizons.angelica.client.rendering;
+
+import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.RenderSystem;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import net.minecraft.client.renderer.texture.AbstractTexture;
+import org.jetbrains.annotations.Nullable;
+
+public class TextureTracker {
+
+ /**
+ * Adapted from Iris for use in GLSM
+ */
+
+ public static final TextureTracker INSTANCE = new TextureTracker();
+
+ private final Int2ObjectMap textures = new Int2ObjectOpenHashMap<>();
+
+ private boolean lockBindCallback;
+
+ private TextureTracker() {
+ }
+
+ public void trackTexture(int id, AbstractTexture texture) {
+ textures.put(id, texture);
+ }
+
+ @Nullable
+ public AbstractTexture getTexture(int id) {
+ return textures.get(id);
+ }
+
+ public void onBindTexture(int id) {
+ if (lockBindCallback) {
+ return;
+ }
+ if (GLStateManager.getActiveTextureUnit() == 0) {
+ lockBindCallback = true;
+ if (GLSMHooks.TEXTURE_BIND.hasListeners()) {
+ GLSMHooks.textureBindEvent.textureId = id;
+ GLSMHooks.TEXTURE_BIND.post(GLSMHooks.textureBindEvent);
+ }
+ // Reset texture state
+ RenderSystem.bindTextureToUnit(0, id);
+ lockBindCallback = false;
+ }
+ }
+
+ public void onDeleteTexture(int id) {
+ textures.remove(id);
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/ThreadedBlockData.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/ThreadedBlockData.java
similarity index 93%
rename from src/main/java/com/gtnewhorizons/angelica/glsm/ThreadedBlockData.java
rename to src/main/java/com/gtnewhorizons/angelica/client/rendering/ThreadedBlockData.java
index 843b6c0d2..60517ba95 100644
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/ThreadedBlockData.java
+++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/ThreadedBlockData.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm;
+package com.gtnewhorizons.angelica.client.rendering;
import net.minecraft.block.Block;
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java b/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
deleted file mode 100644
index 36d9197fb..000000000
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java
+++ /dev/null
@@ -1,533 +0,0 @@
-package com.gtnewhorizons.angelica.glsm;
-
-import com.gtnewhorizons.angelica.glsm.dsa.DSAAccess;
-import com.gtnewhorizons.angelica.glsm.dsa.DSAARB;
-import com.gtnewhorizons.angelica.glsm.dsa.DSACore;
-import com.gtnewhorizons.angelica.glsm.dsa.DSAEXT;
-import com.gtnewhorizons.angelica.glsm.dsa.DSAUnsupported;
-import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
-import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
-import net.coderbot.iris.gl.shader.StandardMacros;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.jetbrains.annotations.Nullable;
-import org.joml.Matrix4f;
-import org.joml.Vector3i;
-import org.lwjgl.BufferUtils;
-import org.lwjgl.opengl.ARBBufferStorage;
-import org.lwjgl.opengl.ARBClearBufferObject;
-import org.lwjgl.opengl.ARBClearTexture;
-import org.lwjgl.opengl.ARBShaderImageLoadStore;
-import org.lwjgl.opengl.ARBShaderStorageBufferObject;
-import org.lwjgl.opengl.EXTShaderImageLoadStore;
-import org.lwjgl.opengl.GL11;
-import org.lwjgl.opengl.GL12;
-import org.lwjgl.opengl.GL15;
-import org.lwjgl.opengl.GL20;
-import org.lwjgl.opengl.GL30;
-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.GL44;
-import org.lwjgl.opengl.NVXGpuMemoryInfo;
-
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-import java.nio.IntBuffer;
-
-
-/**
- * This class is responsible for abstracting calls to OpenGL and asserting that calls are run on the render thread.
- */
-public class RenderSystem {
- private static final Logger LOGGER = LogManager.getLogger("RenderSystem");
- private static DSAAccess dsaState;
- private static boolean supportsCompute;
- private static boolean supportsImageLoadStore;
- private static boolean supportsSSBO;
- private static boolean supportsBufferStorage;
- private static boolean supportsClearTexture;
- private static boolean supportsTesselation;
- private static boolean supportsSamplerObjects;
- private static int maxImageUnits;
- private static int maxSSBOBindings;
- private static int maxGlslVersion;
- private static boolean supportsGpuShader4;
-
- // Sampler object state tracking (null if unsupported)
- private static int[] samplers;
-
- private RenderSystem() {}
-
- public static void initRenderer() {
- try {
- if (GLStateManager.capabilities.OpenGL45) {
- dsaState = (Runtime.version().feature() > 8 && GLStateManager.capabilities.GL_EXT_direct_state_access) ? new DSAEXT() : new DSACore();
- LOGGER.info("OpenGL 4.5 detected, enabling DSA.");
- }
-
- } catch (NoSuchFieldError ignored) {}
- try {
- if (dsaState == null && GLStateManager.capabilities.GL_ARB_direct_state_access) {
- dsaState = new DSAARB();
- LOGGER.info("ARB_direct_state_access detected, enabling DSA.");
- }
- } catch (NoSuchFieldError ignored) {}
- if (dsaState == null) {
- dsaState = new DSAUnsupported();
- LOGGER.info("No DSA support detected, falling back to legacy OpenGL.");
- }
-
- supportsCompute = supportsCompute();
- supportsTesselation = GLStateManager.capabilities.GL_ARB_tessellation_shader || GLStateManager.capabilities.OpenGL40;
-
- supportsImageLoadStore = GLStateManager.capabilities.OpenGL42 || GLStateManager.capabilities.GL_ARB_shader_image_load_store || GLStateManager.capabilities.GL_EXT_shader_image_load_store;
- supportsSSBO = GLStateManager.capabilities.OpenGL43 || GLStateManager.capabilities.GL_ARB_shader_storage_buffer_object;
- supportsBufferStorage = GLStateManager.capabilities.OpenGL44 || GLStateManager.capabilities.GL_ARB_buffer_storage;
- supportsClearTexture = GLStateManager.capabilities.OpenGL44 || GLStateManager.capabilities.GL_ARB_clear_texture;
-
- // Cache maximum image units
- if (supportsImageLoadStore) {
- if (GLStateManager.capabilities.OpenGL42) {
- maxImageUnits = GL11.glGetInteger(GL42.GL_MAX_IMAGE_UNITS);
- } else if (GLStateManager.capabilities.GL_ARB_shader_image_load_store) {
- maxImageUnits = GL11.glGetInteger(ARBShaderImageLoadStore.GL_MAX_IMAGE_UNITS);
- } else {
- maxImageUnits = GL11.glGetInteger(EXTShaderImageLoadStore.GL_MAX_IMAGE_UNITS_EXT);
- }
- } else {
- maxImageUnits = 0;
- }
-
- // Cache maximum SSBO bindings
- if (supportsSSBO) {
- if (GLStateManager.capabilities.OpenGL43) {
- maxSSBOBindings = GL11.glGetInteger(GL43.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS);
- } else {
- maxSSBOBindings = GL11.glGetInteger(ARBShaderStorageBufferObject.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS);
- }
- } else {
- maxSSBOBindings = 0;
- }
-
- // Check for sampler objects support (GL 3.3+ or ARB extension)
- supportsSamplerObjects = GLStateManager.capabilities.OpenGL33
- || GLStateManager.capabilities.GL_ARB_sampler_objects;
- if (supportsSamplerObjects) {
- samplers = new int[GL11.glGetInteger(GL20.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS)];
- }
-
- maxGlslVersion = Integer.parseInt(StandardMacros.getGlVersion(GL20.GL_SHADING_LANGUAGE_VERSION));
- supportsGpuShader4 = GLStateManager.capabilities.GL_EXT_gpu_shader4;
-
- LOGGER.info("Max GLSL version: {}, GPU Shader4: {}", maxGlslVersion, supportsGpuShader4);
- LOGGER.info("Image Load/Store: {}, Max Image Units: {}", supportsImageLoadStore, maxImageUnits);
- LOGGER.info("SSBO: {}, Max SSBO Bindings: {}", supportsSSBO, maxSSBOBindings);
- LOGGER.info("Buffer Storage: {}, Clear Texture: {}, Sampler Objects: {}", supportsBufferStorage, supportsClearTexture, supportsSamplerObjects);
-
- if (GLStateManager.capabilities.OpenGL32) {
- final int profileMask = GL11.glGetInteger(GL32.GL_CONTEXT_PROFILE_MASK);
- if ((profileMask & GL32.GL_CONTEXT_CORE_PROFILE_BIT) != 0) {
- LOGGER.info("GL 3.3 core profile detected, enabling FFP shader emulation.");
- ShaderManager.getInstance().enable();
- }
- }
- }
-
- public static void generateMipmaps(int texture, int mipmapTarget) {
- dsaState.generateMipmaps(texture, mipmapTarget);
- }
-
- public static void bindAttributeLocation(int program, int index, CharSequence name) {
- GL20.glBindAttribLocation(program, index, name);
- }
-
- 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.glBindTexture(target, texture);
- GL11.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- if (target == GL11.GL_TEXTURE_2D && level == 0) {
- TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
- }
- }
-
- public static void uniformMatrix4fv(int location, boolean transpose, FloatBuffer matrix) {
- GL20.glUniformMatrix4(location, transpose, matrix);
- }
-
- 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);
- }
-
- public static void uniform1f(int location, float v0) {
- GL20.glUniform1f(location, v0);
- }
-
- public static void uniform1i(int location, int v0) {
- GL20.glUniform1i(location, v0);
- }
-
- public static void uniform2f(int location, float v0, float v1) {
- GL20.glUniform2f(location, v0, v1);
- }
-
- public static void uniform2i(int location, int v0, int v1) {
- GL20.glUniform2i(location, v0, v1);
- }
-
- public static void uniform3f(int location, float v0, float v1, float v2) {
- GL20.glUniform3f(location, v0, v1, v2);
- }
-
- public static void uniform3i(int location, int v0, int v1, int v2) { GL20.glUniform3i(location, v0, v1, v2); }
-
- public static void uniform4f(int location, float v0, float v1, float v2, float v3) {
- GL20.glUniform4f(location, v0, v1, v2, v3);
- }
-
- public static void uniform4i(int location, int v0, int v1, int v2, int v3) {
- GL20.glUniform4i(location, v0, v1, v2, v3);
- }
-
- public static int getAttribLocation(int programId, String name) {
- return GL20.glGetAttribLocation(programId, name);
- }
-
- public static int getUniformLocation(int programId, String name) {
- return GL20.glGetUniformLocation(programId, name);
- }
-
- public static void texParameteriv(int texture, int target, int pname, IntBuffer params) {
- dsaState.texParameteriv(texture, target, pname, params);
- }
-
- public static void copyTexSubImage2D(int destTexture, int target, int i, int i1, int i2, int i3, int i4, int width, int height) {
- dsaState.copyTexSubImage2D(destTexture, target, i, i1, i2, i3, i4, width, height);
- }
-
- public static void texParameteri(int texture, int target, int pname, int param) {
- dsaState.texParameteri(texture, target, pname, param);
- }
-
- public static void texParameterf(int texture, int target, int pname, float param) {
- dsaState.texParameterf(texture, target, pname, param);
- }
-
- public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) {
- dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels);
- }
-
- public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) {
- dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels);
- }
-
- public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) {
- dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
- }
-
- public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) {
- dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels);
- }
-
-
- public static void texImage1D(int texture, int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) {
- GL11.glBindTexture(target, texture);
- GL11.glTexImage1D(target, level, internalformat, width, border, format, type, pixels);
- }
-
- 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) {
- GL11.glBindTexture(target, texture);
- GL12.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
- }
-
- public static String getProgramInfoLog(int program) {
- return GL20.glGetProgramInfoLog(program, GL20.glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH));
- }
-
- public static String getShaderInfoLog(int shader) {
- return GL20.glGetShaderInfoLog(shader, GL20.glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH));
- }
-
- public static void drawBuffers(int framebuffer, IntBuffer buffers) {
- dsaState.drawBuffers(framebuffer, buffers);
- }
-
- public static void readBuffer(int framebuffer, int buffer) {
- dsaState.readBuffer(framebuffer, buffer);
- }
-
- public static String getActiveUniform(int program, int index, int maxLength, IntBuffer sizeType) {
- return GL20.glGetActiveUniform(program, index, maxLength, sizeType);
- }
-
- public static void readPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) {
- GL11.glReadPixels(x, y, width, height, format, type, pixels);
- }
-
- public static void bufferData(int target, FloatBuffer data, int usage) {
- GL15.glBufferData(target, data, usage);
- }
-
- public static int bufferStorage(int target, FloatBuffer data, int usage) {
- return dsaState.bufferStorage(target, data, usage);
- }
-
- public static void vertexAttrib4f(int index, float v0, float v1, float v2, float v3) {
- GL20.glVertexAttrib4f(index, v0, v1, v2, v3);
- }
-
- public static void detachShader(int program, int shader) {
- GL20.glDetachShader(program, shader);
- }
-
- public static void framebufferTexture2D(int fb, int fbtarget, int attachment, int target, int texture, int levels) {
- dsaState.framebufferTexture2D(fb, fbtarget, attachment, target, texture, levels);
- }
-
- public static int getTexParameteri(int texture, int target, int pname) {
- return dsaState.getTexParameteri(texture, target, pname);
- }
-
- public static int getTexLevelParameteri(int texture, int level, int pname) {
- return dsaState.getTexLevelParameteri(texture, level, pname);
- }
-
- public static void bindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) {
- if (GLStateManager.capabilities.OpenGL42) {
- GL42.glBindImageTexture(unit, texture, level, layered, layer, access, format);
- } else {
- EXTShaderImageLoadStore.glBindImageTextureEXT(unit, texture, level, layered, layer, access, format);
- }
- }
-
- public static int getMaxImageUnits() {
- return maxImageUnits;
- }
-
- public static boolean supportsImageLoadStore() {
- return supportsImageLoadStore;
- }
-
- public static boolean supportsSSBO() {
- return supportsSSBO;
- }
-
- public static boolean supportsBufferStorage() {
- return supportsBufferStorage;
- }
-
- public static boolean supportsClearTexture() {
- return supportsClearTexture;
- }
-
- public static int getMaxSSBOBindings() {
- return maxSSBOBindings;
- }
-
- public static void getProgramiv(int program, int value, IntBuffer storage) {
- GL20.glGetProgram(program, value, storage);
- }
-
- public static void dispatchCompute(int workX, int workY, int workZ) {
- GL43.glDispatchCompute(workX, workY, workZ);
- }
-
- public static void dispatchCompute(Vector3i workGroups) {
- GL43.glDispatchCompute(workGroups.x, workGroups.y, workGroups.z);
- }
-
- public static void dispatchComputeIndirect(long offset) {
- GL43.glDispatchComputeIndirect(offset);
- }
-
- public static void bindBuffer(int target, int buffer) {
- GLStateManager.glBindBuffer(target, buffer);
- }
-
- public static void memoryBarrier(int barriers) {
- if (supportsCompute) {
- GL42.glMemoryBarrier(barriers);
- }
- }
-
- public static boolean supportsBufferBlending() {
- return GLStateManager.capabilities.GL_ARB_draw_buffers_blend || GLStateManager.capabilities.OpenGL40;
- }
-
- public static void disableBufferBlend(int buffer) {
- GL30.glDisablei(GL11.GL_BLEND, buffer);
- GLStateManager.getBlendMode().setUnknownState();
- }
-
- public static void enableBufferBlend(int buffer) {
- GL30.glEnablei(GL11.GL_BLEND, buffer);
- GLStateManager.getBlendMode().setUnknownState();
- }
-
- public static void blendFuncSeparatei(int buffer, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) {
- GL40.glBlendFuncSeparatei(buffer, srcRGB, dstRGB, srcAlpha, dstAlpha);
- }
-
- public static void bindTextureToUnit(int unit, int texture) {
- dsaState.bindTextureToUnit(unit, texture);
- }
-
- public static void bindTextureToUnit(int target, int unit, int texture) {
- dsaState.bindTextureToUnit(target, unit, texture);
- }
-
- public static final FloatBuffer PROJECTION_MATRIX_BUFFER = BufferUtils.createFloatBuffer(16);
- public static void setupProjectionMatrix(Matrix4f matrix) {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPushMatrix();
- matrix.get(0, PROJECTION_MATRIX_BUFFER);
- GLStateManager.glLoadMatrix(PROJECTION_MATRIX_BUFFER);
- GLStateManager.glMatrixMode(GL11.GL_MODELVIEW);
- }
-
- public static void restoreProjectionMatrix() {
- GLStateManager.glMatrixMode(GL11.GL_PROJECTION);
- GLStateManager.glPopMatrix();
- GLStateManager.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) {
- dsaState.blitFramebuffer(source, dest, offsetX, offsetY, width, height, offsetX2, offsetY2, width2, height2, bufferChoice, filter);
- }
-
- public static int createFramebuffer() {
- return dsaState.createFramebuffer();
- }
-
- public static int createTexture(int target) {
- return dsaState.createTexture(target);
- }
-
- // TODO: Proper notification of compute support
- public static boolean supportsCompute() {
- try {
- return GLStateManager.capabilities.GL_ARB_compute_shader;
- } catch(Exception ignored) {
- return false;
- }
- }
-
- public static int createBuffers() {
- return GL15.glGenBuffers();
- }
-
- public static void bindBufferBase(int target, int index, int buffer) {
- GL30.glBindBufferBase(target, index, buffer);
- }
-
- public static void bufferStorage(int target, long size, int flags) {
- if (GLStateManager.capabilities.OpenGL44) {
- GL44.glBufferStorage(target, size, flags);
- } else if (GLStateManager.capabilities.GL_ARB_buffer_storage) {
- ARBBufferStorage.glBufferStorage(target, size, flags);
- } else {
- // Fallback: use mutable storage
- GL15.glBufferData(target, size, GL15.GL_DYNAMIC_DRAW);
- }
- }
-
- 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);
- if (GLStateManager.capabilities.OpenGL43) {
- GL43.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf);
- } else if (GLStateManager.capabilities.GL_ARB_clear_buffer_object) {
- ARBClearBufferObject.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf);
- }
- }
-
- public static void deleteBuffers(int buffer) {
- GL15.glDeleteBuffers(buffer);
- }
-
- public static long getVRAM() {
- if (GLStateManager.capabilities.GL_NVX_gpu_memory_info) {
- return GL11.glGetInteger(NVXGpuMemoryInfo.GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX) * 1024L;
- } else {
- // Default to 4GB if we can't query VRAM
- return 4294967296L;
- }
- }
-
- public static void clearTexImage(int texture, int target, int level, int format, int type) {
- if (GLStateManager.capabilities.OpenGL44) {
- GL44.glClearTexImage(texture, level, format, type, (ByteBuffer) null);
- } else {
- ARBClearTexture.glClearTexImage(texture, level, format, type, (ByteBuffer) null);
- }
- }
-
- public static void textureStorage1D(int texture, int target, int levels, int internalFormat, int width) {
- dsaState.textureStorage1D(texture, target, levels, internalFormat, width);
- }
-
- public static void textureStorage2D(int texture, int target, int levels, int internalFormat, int width, int height) {
- dsaState.textureStorage2D(texture, target, levels, internalFormat, width, height);
- }
-
- public static void textureStorage3D(int texture, int target, int levels, int internalFormat, int width, int height, int depth) {
- dsaState.textureStorage3D(texture, target, levels, internalFormat, width, height, depth);
- }
-
- public static int getMaxGlslVersion() {
- return maxGlslVersion;
- }
-
- public static boolean supportsGpuShader4() {
- return supportsGpuShader4;
- }
-
- public static boolean supportsSnormFormats() {
- return GLStateManager.capabilities.OpenGL31;
- }
-
- public static boolean supportsPackedFloatRenderable() {
- return GLStateManager.capabilities.OpenGL30 && maxGlslVersion >= 130;
- }
-
- public static boolean supportsTesselation() {
- return supportsTesselation;
- }
-
- public static boolean supportsSamplerObjects() {
- return supportsSamplerObjects;
- }
-
- public static int genSampler() {
- if (!supportsSamplerObjects) return 0;
- return GL33.glGenSamplers();
- }
-
- public static void destroySampler(int sampler) {
- if (!supportsSamplerObjects || sampler == 0) return;
- GL33.glDeleteSamplers(sampler);
- }
-
- public static void samplerParameteri(int sampler, int pname, int param) {
- if (!supportsSamplerObjects || sampler == 0) return;
- GL33.glSamplerParameteri(sampler, pname, param);
- }
-
- public static void bindSamplerToUnit(int unit, int sampler) {
- if (!supportsSamplerObjects) return;
- if (samplers[unit] == sampler) return;
- GL33.glBindSampler(unit, sampler);
- samplers[unit] = sampler;
- }
-
- public static void unbindAllSamplers() {
- if (!supportsSamplerObjects) return;
- for (int i = 0; i < samplers.length; i++) {
- if (samplers[i] != 0) {
- GL33.glBindSampler(i, 0);
- samplers[i] = 0;
- }
- }
- }
-}
diff --git a/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureTracker.java b/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureTracker.java
deleted file mode 100644
index 60bdaac0d..000000000
--- a/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureTracker.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.gtnewhorizons.angelica.glsm.texture;
-
-import com.gtnewhorizons.angelica.glsm.GLStateManager;
-import com.gtnewhorizons.angelica.glsm.RenderSystem;
-import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
-import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
-import net.coderbot.iris.Iris;
-import net.coderbot.iris.pipeline.WorldRenderingPipeline;
-import net.minecraft.client.renderer.texture.AbstractTexture;
-import org.jetbrains.annotations.Nullable;
-
-public class TextureTracker {
- /**
- * Adapted from Iris for use in GLSM
- */
-
- public static final TextureTracker INSTANCE = new TextureTracker();
-
- private final Int2ObjectMap textures = new Int2ObjectOpenHashMap<>();
-
- private boolean lockBindCallback;
-
- private TextureTracker() {
- }
-
- public void trackTexture(int id, AbstractTexture texture) {
- textures.put(id, texture);
- }
-
- @Nullable
- public AbstractTexture getTexture(int id) {
- return textures.get(id);
- }
-
- public void onBindTexture(int id) {
- if (lockBindCallback) {
- return;
- }
- if (GLStateManager.getActiveTextureUnit() == 0) {
- lockBindCallback = true;
- if(Iris.enabled) {
- final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable();
- if (pipeline != null) {
- pipeline.onBindTexture(id);
- }
- }
- // Reset texture state
- RenderSystem.bindTextureToUnit(0, id);
- lockBindCallback = false;
- }
- }
-
- public void onDeleteTexture(int id) {
- textures.remove(id);
- }
-}
diff --git a/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java b/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java
index a00caccbc..7eb122f45 100644
--- a/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java
+++ b/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java
@@ -12,6 +12,7 @@ import com.gtnewhorizons.angelica.compat.ModStatus;
import com.gtnewhorizons.angelica.compat.holoinventory.HoloInventoryReflectionCompat;
import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig;
import com.gtnewhorizons.angelica.mixins.interfaces.GuiIngameAccessor;
import com.gtnewhorizons.angelica.mixins.interfaces.GuiIngameForgeAccessor;
import com.gtnewhorizons.angelica.mixins.interfaces.RenderGameOverlayEventAccessor;
@@ -86,8 +87,10 @@ public class HUDCaching {
framebuffer.clearBindFramebuffer();
}
renderingCacheOverride = true;
+ GLSMConfig.hudCacheOverride = true;
ingame.renderGameOverlay(partialTicks, hasScreen, mouseX, mouseY);
renderingCacheOverride = false;
+ GLSMConfig.hudCacheOverride = false;
mc.getFramebuffer().bindFramebuffer(false);
} else {
renderer.setupOverlayRendering();
diff --git a/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java b/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java
new file mode 100644
index 000000000..063705b91
--- /dev/null
+++ b/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java
@@ -0,0 +1,124 @@
+package com.gtnewhorizons.angelica.iris;
+
+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.GLSMHooks;
+import net.coderbot.iris.Iris;
+import net.coderbot.iris.gbuffer_overrides.state.StateTracker;
+import net.coderbot.iris.gl.blending.AlphaTestStorage;
+import net.coderbot.iris.gl.blending.BlendModeStorage;
+import net.coderbot.iris.gl.blending.DepthColorStorage;
+import net.coderbot.iris.gl.program.ProgramUniforms;
+import net.coderbot.iris.pipeline.DeferredWorldRenderingPipeline;
+import net.coderbot.iris.pipeline.WorldRenderingPipeline;
+import net.coderbot.iris.samplers.IrisSamplers;
+import net.coderbot.iris.texture.pbr.PBRTextureManager;
+
+public class IrisGLSMBridge {
+
+ public static void register() {
+ IrisSamplers.initRenderer();
+ GLSMHooks.blendHandler = new DeferredBlendHandler() {
+ @Override
+ public boolean isBlendLocked() {
+ return Iris.enabled && BlendModeStorage.isBlendLocked();
+ }
+
+ @Override
+ public void deferBlendModeToggle(boolean enabled) {
+ BlendModeStorage.deferBlendModeToggle(enabled);
+ }
+
+ @Override
+ public void deferBlendFunc(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) {
+ BlendModeStorage.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha);
+ }
+
+ @Override
+ public void flushDeferredBlend() {
+ BlendModeStorage.flushDeferredBlend();
+ }
+ };
+
+ GLSMHooks.alphaHandler = new DeferredAlphaHandler() {
+ @Override
+ public boolean isAlphaTestLocked() {
+ return Iris.enabled && AlphaTestStorage.isAlphaTestLocked();
+ }
+
+ @Override
+ public void deferAlphaTestToggle(boolean enabled) {
+ AlphaTestStorage.deferAlphaTestToggle(enabled);
+ }
+
+ @Override
+ public void deferAlphaFunc(int function, float reference) {
+ AlphaTestStorage.deferAlphaFunc(function, reference);
+ }
+ };
+
+ GLSMHooks.depthColorHandler = new DeferredDepthColorHandler() {
+ @Override
+ public boolean isDepthColorLocked() {
+ return Iris.enabled && DepthColorStorage.isDepthColorLocked();
+ }
+
+ @Override
+ public void deferDepthEnable(boolean enabled) {
+ DepthColorStorage.deferDepthEnable(enabled);
+ }
+
+ @Override
+ public void deferColorMask(boolean r, boolean g, boolean b, boolean a) {
+ DepthColorStorage.deferColorMask(r, g, b, a);
+ }
+ };
+
+ GLSMHooks.TEXTURE_BIND.addListener(event -> {
+ if (Iris.enabled) {
+ final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable();
+ if (pipeline != null) {
+ pipeline.onBindTexture(event.textureId);
+ }
+ }
+ });
+
+ GLSMHooks.TEXTURE_DELETE.addListener(event -> {
+ if (Iris.enabled) {
+ PBRTextureManager.INSTANCE.onDeleteTexture(event.textureId);
+ }
+ });
+
+ GLSMHooks.TEXTURE_UNIT_STATE.addListener(event -> {
+ if (!Iris.enabled) return;
+ boolean updatePipeline = false;
+ if (event.unit == IrisSamplers.ALBEDO_TEXTURE_UNIT) {
+ StateTracker.INSTANCE.albedoSampler = event.enabled;
+ updatePipeline = true;
+ } else if (event.unit == IrisSamplers.LIGHTMAP_TEXTURE_UNIT) {
+ StateTracker.INSTANCE.lightmapSampler = event.enabled;
+ updatePipeline = true;
+ }
+ if (updatePipeline) {
+ Iris.getPipelineManager().getPipeline().ifPresent(p -> p.setInputs(StateTracker.INSTANCE.getInputs()));
+ }
+ });
+
+ GLSMHooks.PROGRAM_CHANGE.addListener(event -> ProgramUniforms.clearActiveUniforms());
+
+ GLSMHooks.PROGRAM_CHANGE.addListener(event -> {
+ if (!Iris.enabled) return;
+ final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable();
+ if (!(pipeline instanceof DeferredWorldRenderingPipeline drp)) return;
+ if (!drp.shouldOverrideShaders()) return;
+ if (drp.getActivePassProgramId() == -1) return;
+
+ if (DepthColorStorage.isOwnedProgram(event.newProgram)) {
+ DepthColorStorage.unlockDepthColor();
+ } else {
+ DepthColorStorage.disableDepthColor();
+ }
+ });
+ }
+}
diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/CeleritasBlockTransform.java b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/CeleritasBlockTransform.java
index c672c09f2..43675ac9c 100644
--- a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/CeleritasBlockTransform.java
+++ b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/CeleritasBlockTransform.java
@@ -30,7 +30,7 @@ public final class CeleritasBlockTransform implements Opcodes {
private static final boolean LOG_SPAM = Boolean.getBoolean("angelica.redirectorLogspam");
private static final Logger LOGGER = LogManager.getLogger("CeleritasBlockTransformer");
private static final String BlockClass = "net/minecraft/block/Block";
- private static final String ThreadedBlockData = "com/gtnewhorizons/angelica/glsm/ThreadedBlockData";
+ private static final String ThreadedBlockData = "com/gtnewhorizons/angelica/client/rendering/ThreadedBlockData";
private final Map fieldNameToRedirect = new HashMap<>();
private final Set blockSubclasses = Collections.newSetFromMap(new ConcurrentHashMap<>());
diff --git a/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java b/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java
index ddc3a26bb..76d4ff05a 100644
--- a/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java
+++ b/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java
@@ -237,6 +237,7 @@ public enum Mixins implements IMixins {
, "shaders.MixinTileEntityBeaconRenderer"
, "shaders.MixinRenderEndPortal"
, "shaders.MixinTileEntityRendererDispatcher"
+ , "shaders.MixinGlProgram"
)
),
diff --git a/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java b/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java
index 34e15545e..931e75a2b 100644
--- a/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java
+++ b/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java
@@ -14,9 +14,9 @@ import com.gtnewhorizons.angelica.debug.TPSGraph;
import com.gtnewhorizons.angelica.dynamiclights.DynamicLights;
import com.gtnewhorizons.angelica.dynamiclights.config.EntityLightConfig;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
-import com.gtnewhorizons.angelica.glsm.debug.OpenGLDebugging;
+import com.gtnewhorizons.angelica.client.debug.OpenGLDebugging;
import com.gtnewhorizons.angelica.hudcaching.HUDCaching;
-
+import com.gtnewhorizons.angelica.iris.IrisGLSMBridge;
import com.gtnewhorizons.angelica.loading.AngelicaTweaker;
import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt;
import com.gtnewhorizons.angelica.render.CloudRenderer;
@@ -127,6 +127,7 @@ public class ClientProxy extends CommonProxy {
LOGGER.info("Celeritas is disabled, skipping initialization from init()");
}
if (AngelicaConfig.enableIris) {
+ IrisGLSMBridge.register();
MinecraftForge.EVENT_BUS.register(IrisDebugScreenHandler.INSTANCE);
Iris.INSTANCE.fmlInitEvent();
@@ -244,8 +245,8 @@ public class ClientProxy extends CommonProxy {
for (int i = 0; i < event.left.size() - 3; i++) {
/* These checks should not be inefficient as most of the time the first one will already fail */
if (!hasReplacedXYZ && Objects.firstNonNull(event.left.get(i), "").startsWith("x:") && Objects.firstNonNull(event.left.get(i + 1), "")
- .startsWith("y:") && Objects.firstNonNull(event.left.get(i + 2), "").startsWith("z:") && Objects.firstNonNull(event.left.get(i + 3), "")
- .startsWith("f:")) {
+ .startsWith("y:") && Objects.firstNonNull(event.left.get(i + 2), "").startsWith("z:") && Objects.firstNonNull(event.left.get(i + 3), "")
+ .startsWith("f:")) {
hasReplacedXYZ = true;
int heading = MathHelper.floor_double((double) (mc.thePlayer.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
String heading_str = switch (heading) {
@@ -261,25 +262,27 @@ public class ClientProxy extends CommonProxy {
int bZ = MathHelper.floor_double(mc.thePlayer.posZ);
event.left.set(i + 1, String.format("Block: %d %d %d [%d %d %d]", bX, bY, bZ, bX & 15, bY & 15, bZ & 15));
event.left.set(i + 2, String.format("Chunk: %d %d %d", bX >> 4, bY >> 4, bZ >> 4));
- event.left.set(i + 3, String.format(
- "Facing: %s (%s) (%.1f / %.1f)",
- Direction.directions[heading].toLowerCase(Locale.ROOT),
- heading_str,
- MathHelper.wrapAngleTo180_float(mc.thePlayer.rotationYaw),
- MathHelper.wrapAngleTo180_float(mc.thePlayer.rotationPitch)));
+ event.left.set(
+ i + 3, String.format(
+ "Facing: %s (%s) (%.1f / %.1f)",
+ Direction.directions[heading].toLowerCase(Locale.ROOT),
+ heading_str,
+ MathHelper.wrapAngleTo180_float(mc.thePlayer.rotationYaw),
+ MathHelper.wrapAngleTo180_float(mc.thePlayer.rotationPitch)));
Chunk chunk = this.mc.theWorld.getChunkFromBlockCoords(bX, bZ);
- event.left.set(i + 4, String.format(
- "lc: %d b: %s bl: %d sl: %d rl: %d",
- chunk.getTopFilledSegment() + 15,
- chunk.getBiomeGenForWorldCoords(bX & 15, bZ & 15, mc.theWorld.getWorldChunkManager()).biomeName,
- chunk.getSavedLightValue(EnumSkyBlock.Block, bX & 15, MathHelper.clamp_int(bY, 0, 255), bZ & 15),
- chunk.getSavedLightValue(EnumSkyBlock.Sky, bX & 15, MathHelper.clamp_int(bY, 0, 255), bZ & 15),
- chunk.getBlockLightValue(bX & 15, MathHelper.clamp_int(bY, 0, 255), bZ & 15, 0)));
+ event.left.set(
+ i + 4, String.format(
+ "lc: %d b: %s bl: %d sl: %d rl: %d",
+ chunk.getTopFilledSegment() + 15,
+ chunk.getBiomeGenForWorldCoords(bX & 15, bZ & 15, mc.theWorld.getWorldChunkManager()).biomeName,
+ chunk.getSavedLightValue(EnumSkyBlock.Block, bX & 15, MathHelper.clamp_int(bY, 0, 255), bZ & 15),
+ chunk.getSavedLightValue(EnumSkyBlock.Sky, bX & 15, MathHelper.clamp_int(bY, 0, 255), bZ & 15),
+ chunk.getBlockLightValue(bX & 15, MathHelper.clamp_int(bY, 0, 255), bZ & 15, 0)));
}
}
// Draw a frametime graph
- if (((IGameSettingsExt)mc.gameSettings).angelica$showFpsGraph()) {
+ if (((IGameSettingsExt) mc.gameSettings).angelica$showFpsGraph()) {
frametimeGraph.render();
if (Minecraft.getMinecraft().isSingleplayer()) {
tpsGraph.render();
@@ -293,7 +296,7 @@ public class ClientProxy extends CommonProxy {
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onGuiOpen(GuiOpenEvent event) {
if (!event.isCanceled()) {
- if (event.gui instanceof GuiMainMenu && gameStartTime == -1 ) {
+ if (event.gui instanceof GuiMainMenu && gameStartTime == -1) {
gameStartTime = ManagementFactory.getRuntimeMXBean().getUptime() / 1000f;
LOGGER.info("The game loaded in {} seconds.", gameStartTime);
}
@@ -305,11 +308,17 @@ public class ClientProxy extends CommonProxy {
@SubscribeEvent
public void onGuiInit(GuiScreenEvent.InitGuiEvent.Pre event) {
- if(event.gui instanceof GuiVideoSettings eventGui) {
+ if (event.gui instanceof GuiVideoSettings eventGui) {
event.setCanceled(true);
- if(AngelicaConfig.enableNotFineOptions || GuiScreen.isShiftKeyDown()) {
- Minecraft.getMinecraft().displayGuiScreen(new GuiCustomMenu(eventGui.parentGuiScreen, NotFineGameOptionPages.general(), NotFineGameOptionPages.detail(), NotFineGameOptionPages.atmosphere(), NotFineGameOptionPages.particles(), NotFineGameOptionPages.other()));
- } else if(!AngelicaConfig.enableReesesSodiumOptions || GuiScreen.isCtrlKeyDown()) {
+ if (AngelicaConfig.enableNotFineOptions || GuiScreen.isShiftKeyDown()) {
+ Minecraft.getMinecraft().displayGuiScreen(new GuiCustomMenu(
+ eventGui.parentGuiScreen,
+ NotFineGameOptionPages.general(),
+ NotFineGameOptionPages.detail(),
+ NotFineGameOptionPages.atmosphere(),
+ NotFineGameOptionPages.particles(),
+ NotFineGameOptionPages.other()));
+ } else if (!AngelicaConfig.enableReesesSodiumOptions || GuiScreen.isCtrlKeyDown()) {
Minecraft.getMinecraft().displayGuiScreen(new SodiumOptionsGUI(eventGui.parentGuiScreen));
} else {
Minecraft.getMinecraft().displayGuiScreen(new ReeseSodiumVideoOptionsScreen(eventGui.parentGuiScreen));
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java
index d01ddf5f2..f28ed5878 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java
@@ -26,7 +26,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.gtnewhorizons.angelica.glsm.GLStateManager;
-import com.gtnewhorizons.angelica.glsm.uniform.GlUniformFloat2v;
+import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v;
import jss.notfine.core.Settings;
import jss.notfine.gui.options.named.GraphicsQualityOff;
import net.minecraft.client.Minecraft;
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java
index ae4a02dd4..047cd1883 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.render;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
-import com.gtnewhorizons.angelica.glsm.uniform.GlUniformFloat2v;
+import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v;
import net.minecraft.client.Minecraft;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
diff --git a/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java
index d61e55da3..39530e333 100644
--- a/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java
+++ b/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java
@@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.render;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.Color4;
-import com.gtnewhorizons.angelica.glsm.uniform.GlUniformFloat2v;
+import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v;
import net.minecraft.util.AxisAlignedBB;
import org.embeddedt.embeddium.impl.gl.shader.GlProgram;
import org.embeddedt.embeddium.impl.gl.shader.GlShader;
diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasDebugScreenHandler.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasDebugScreenHandler.java
index 6f4368cbb..e841c90fd 100644
--- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasDebugScreenHandler.java
+++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasDebugScreenHandler.java
@@ -5,7 +5,7 @@ import com.gtnewhorizons.angelica.config.AngelicaConfig;
import com.gtnewhorizons.angelica.dynamiclights.DynamicLights;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager;
-import com.gtnewhorizons.angelica.glsm.ffp.TessellatorStreamingDrawer;
+import com.gtnewhorizons.angelica.client.rendering.TessellatorStreamingDrawer;
import com.gtnewhorizons.angelica.glsm.states.FogState;
import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
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 6917ee5e8..c4abfa591 100644
--- a/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java
+++ b/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java
@@ -3,6 +3,7 @@ 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 it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import lombok.Getter;
public class DepthColorStorage {
@@ -11,10 +12,24 @@ public class DepthColorStorage {
@Getter
private static boolean depthColorLocked;
+ private static final IntOpenHashSet ownedPrograms = new IntOpenHashSet();
+
+ public static void registerOwnedProgram(int programId) {
+ ownedPrograms.add(programId);
+ }
+
+ public static void unregisterOwnedProgram(int programId) {
+ ownedPrograms.remove(programId);
+ }
+
+ public static boolean isOwnedProgram(int programId) {
+ return ownedPrograms.contains(programId);
+ }
+
public static void disableDepthColor() {
if (!depthColorLocked) {
// Only save the previous state if the depth and color mask wasn't already locked
- ColorMask colorMask = GLStateManager.getColorMask();
+ final ColorMask colorMask = GLStateManager.getColorMask();
final DepthState depthState = GLStateManager.getDepthState();
originalDepthEnable = depthState.isEnabled();
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 520354b79..b3e9329bc 100644
--- a/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java
+++ b/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java
@@ -3,6 +3,7 @@ package net.coderbot.iris.gl.program;
import com.gtnewhorizons.angelica.glsm.RenderSystem;
import net.coderbot.iris.Iris;
import net.coderbot.iris.gl.GlResource;
+import net.coderbot.iris.gl.blending.DepthColorStorage;
import net.coderbot.iris.pipeline.WorldRenderingPipeline;
import net.coderbot.iris.shaderpack.FilledIndirectPointer;
import org.joml.Vector2f;
@@ -34,6 +35,8 @@ public final class ComputeProgram extends GlResource {
this.uniforms = uniforms;
this.samplers = samplers;
this.images = images;
+
+ DepthColorStorage.registerOwnedProgram(program);
}
public void setWorkGroupInfo(Vector2f relativeWorkGroups, Vector3i absoluteWorkGroups, FilledIndirectPointer indirectPointer) {
@@ -89,6 +92,7 @@ public final class ComputeProgram extends GlResource {
@Override
public void destroyInternal() {
+ DepthColorStorage.unregisterOwnedProgram(getGlId());
GL20.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 60c073be5..dfa334d6d 100644
--- a/src/main/java/net/coderbot/iris/gl/program/Program.java
+++ b/src/main/java/net/coderbot/iris/gl/program/Program.java
@@ -1,6 +1,7 @@
package net.coderbot.iris.gl.program;
import net.coderbot.iris.gl.GlResource;
+import net.coderbot.iris.gl.blending.DepthColorStorage;
import org.lwjgl.opengl.GL20;
public final class Program extends GlResource {
@@ -14,6 +15,8 @@ public final class Program extends GlResource {
this.uniforms = uniforms;
this.samplers = samplers;
this.images = images;
+
+ DepthColorStorage.registerOwnedProgram(program);
}
public void use() {
@@ -32,6 +35,7 @@ public final class Program extends GlResource {
@Override
public void destroyInternal() {
+ DepthColorStorage.unregisterOwnedProgram(getGlId());
GL20.glDeleteProgram(getGlId());
}
diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java
index 85740e3f7..afe169c14 100644
--- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java
+++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java
@@ -23,6 +23,7 @@ import net.coderbot.iris.gbuffer_overrides.matching.SpecialCondition;
import net.coderbot.iris.gbuffer_overrides.state.RenderTargetStateListener;
import net.coderbot.iris.gl.blending.AlphaTestOverride;
import net.coderbot.iris.gl.blending.BlendModeOverride;
+import net.coderbot.iris.gl.blending.DepthColorStorage;
import net.coderbot.iris.gl.blending.BufferBlendOverride;
import net.coderbot.iris.gl.buffer.ShaderStorageBufferHolder;
import net.coderbot.iris.gl.buffer.ShaderStorageInfo;
@@ -738,6 +739,16 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
}
}
+ public boolean shouldOverrideShaders() {
+ return isRenderingWorld && !isRenderingFullScreenPass && !isPostChain && isMainBound;
+ }
+
+ public int getActivePassProgramId() {
+ if (current == null) return -1;
+ final Program p = current.getProgram();
+ return p != null ? p.getProgramId() : -1;
+ }
+
private void matchPass() {
if (!isRenderingWorld || isRenderingFullScreenPass || isPostChain || !isMainBound) {
return;
@@ -947,6 +958,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
}
public void use() {
+ DepthColorStorage.unlockDepthColor();
+
if (isBeforeTranslucent) {
framebufferBeforeTranslucents.bind();
} else {
@@ -986,6 +999,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
}
public void stopUsing() {
+ DepthColorStorage.unlockDepthColor();
+
if (alphaTestOverride != null) {
AlphaTestOverride.restore();
}
@@ -1009,6 +1024,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R
@Override
public void destroy() {
+ DepthColorStorage.unlockDepthColor();
BlendModeOverride.restore();
AlphaTestOverride.restore();
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 b56901708..1901cec3e 100644
--- a/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java
+++ b/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java
@@ -1,7 +1,7 @@
package net.coderbot.iris.texture.pbr;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
-import com.gtnewhorizons.angelica.glsm.texture.TextureTracker;
+import com.gtnewhorizons.angelica.client.rendering.TextureTracker;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.coderbot.iris.Iris;
diff --git a/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java b/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java
index 4964dd78b..4edc89ecf 100644
--- a/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java
+++ b/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java
@@ -5,7 +5,7 @@ import com.gtnewhorizons.angelica.glsm.GLStateManager;
import com.gtnewhorizons.angelica.glsm.states.BlendState;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfo;
import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache;
-import com.gtnewhorizons.angelica.glsm.texture.TextureTracker;
+import com.gtnewhorizons.angelica.client.rendering.TextureTracker;
import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor;
import net.coderbot.iris.gl.state.FogMode;
import net.coderbot.iris.gl.state.ValueUpdateNotifier;
diff --git a/src/main/resources/META-INF/services/com.mitchej123.glsm.GLStateManagerService b/src/main/resources/META-INF/services/com.mitchej123.glsm.GLStateManagerService
index 4826e3e81..07b99f451 100644
--- a/src/main/resources/META-INF/services/com.mitchej123.glsm.GLStateManagerService
+++ b/src/main/resources/META-INF/services/com.mitchej123.glsm.GLStateManagerService
@@ -1 +1 @@
-com.gtnewhorizons.angelica.glsm.AngelicaGLStateManagerService
+com.gtnewhorizons.angelica.client.rendering.AngelicaGLStateManagerService
diff --git a/src/main/resources/META-INF/services/com.mitchej123.glsm.RenderSystemService b/src/main/resources/META-INF/services/com.mitchej123.glsm.RenderSystemService
index 6d1337470..2b1c94854 100644
--- a/src/main/resources/META-INF/services/com.mitchej123.glsm.RenderSystemService
+++ b/src/main/resources/META-INF/services/com.mitchej123.glsm.RenderSystemService
@@ -1 +1 @@
-com.gtnewhorizons.angelica.glsm.AngelicaRenderSystemService
+com.gtnewhorizons.angelica.client.rendering.AngelicaRenderSystemService
diff --git a/src/main/resources/META-INF/services/org.embeddedt.embeddium.impl.render.chunk.fog.FogService b/src/main/resources/META-INF/services/org.embeddedt.embeddium.impl.render.chunk.fog.FogService
index f70a0435c..3f498cb80 100644
--- a/src/main/resources/META-INF/services/org.embeddedt.embeddium.impl.render.chunk.fog.FogService
+++ b/src/main/resources/META-INF/services/org.embeddedt.embeddium.impl.render.chunk.fog.FogService
@@ -1 +1 @@
-com.gtnewhorizons.angelica.glsm.AngelicaFogService
+com.gtnewhorizons.angelica.client.rendering.AngelicaFogService
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 30833aa76..a61da5708 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
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica;
import com.gtnewhorizons.angelica.AngelicaMod;
-import com.gtnewhorizons.angelica.glsm.ffp.TessellatorStreamingDrawer;
+import com.gtnewhorizons.angelica.client.rendering.TessellatorStreamingDrawer;
import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import net.minecraft.client.Minecraft;
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/ffp/MixinTessellator_CoreProfile.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/ffp/MixinTessellator_CoreProfile.java
index 62f9d16dd..d416c829e 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/ffp/MixinTessellator_CoreProfile.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/ffp/MixinTessellator_CoreProfile.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.ffp;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
-import com.gtnewhorizons.angelica.glsm.ffp.TessellatorStreamingDrawer;
+import com.gtnewhorizons.angelica.client.rendering.TessellatorStreamingDrawer;
import net.minecraft.client.renderer.Tessellator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/particles/MixinEffectRenderer_DeferredBatch.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/particles/MixinEffectRenderer_DeferredBatch.java
index 366474734..d60710dca 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/particles/MixinEffectRenderer_DeferredBatch.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/particles/MixinEffectRenderer_DeferredBatch.java
@@ -1,7 +1,7 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.particles;
import com.gtnewhorizons.angelica.AngelicaMod;
-import com.gtnewhorizons.angelica.glsm.ffp.DeferredDrawBatcher;
+import com.gtnewhorizons.angelica.client.rendering.DeferredDrawBatcher;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/startup/MixinInitGLStateManager.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/startup/MixinInitGLStateManager.java
index 3579c5c11..a870217ec 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/startup/MixinInitGLStateManager.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/startup/MixinInitGLStateManager.java
@@ -1,8 +1,16 @@
package com.gtnewhorizons.angelica.mixins.early.angelica.startup;
+import com.gtnewhorizons.angelica.AngelicaMod;
+import com.gtnewhorizons.angelica.client.rendering.TextureTracker;
+import com.gtnewhorizons.angelica.client.rendering.TessellatorStreamingDrawer;
import com.gtnewhorizons.angelica.compat.DriverCompatabilityCheck;
import com.gtnewhorizons.angelica.glsm.GLStateManager;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks;
+import com.gtnewhorizons.angelica.glsm.hooks.GLSMInitConfig;
+import com.gtnewhorizons.angelica.render.SelectionBoxRenderer;
+import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
+import net.minecraft.launchwrapper.Launch;
import org.lwjgl.opengl.Display;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@@ -11,11 +19,34 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = OpenGlHelper.class, priority = 100)
public class MixinInitGLStateManager {
+
@Inject(method = "initializeTextures", at = @At("RETURN"))
private static void angelica$initializeGLStateManager(CallbackInfo ci) {
+ final Minecraft mc = Minecraft.getMinecraft();
GLStateManager.setDrawableGL(Display.getDrawable());
- GLStateManager.preInit();
- GLStateManager.init();
+ GLStateManager.initialize(GLSMInitConfig.builder()
+ .displaySize(mc.displayWidth, mc.displayHeight)
+ .lwjglDebug(AngelicaMod.lwjglDebug)
+ .streamingUploadStrategy(AngelicaMod.options().advanced.streamingUploadStrategy)
+ .framebufferSupported(OpenGlHelper.framebufferSupported)
+ .fboEnabled(mc.gameSettings.fboEnable)
+ .directDrawer(TessellatorStreamingDrawer::drawDirect)
+ .streamingDrawerDestroy(TessellatorStreamingDrawer::destroy)
+ .postInitCallback(SelectionBoxRenderer::init)
+ .build());
+
+ if (Launch.blackboard != null && Boolean.TRUE.equals(Launch.blackboard.get("fml.deobfuscatedEnvironment"))) {
+ System.setProperty("angelica.dumpShaders", "true");
+ }
+
+ GLSMHooks.LIGHTMAP_COORDS.addListener(event -> {
+ OpenGlHelper.lastBrightnessX = event.x;
+ OpenGlHelper.lastBrightnessY = event.y;
+ });
+
+ GLSMHooks.TEXTURE_DELETE.addListener(event ->
+ TextureTracker.INSTANCE.onDeleteTexture(event.textureId));
+
DriverCompatabilityCheck.checkDriverCompatibility();
}
}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/rendering/MixinBlock.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/rendering/MixinBlock.java
index fd95de07b..6883e9070 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/rendering/MixinBlock.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/rendering/MixinBlock.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.rendering;
-import com.gtnewhorizons.angelica.glsm.ThreadedBlockData;
+import com.gtnewhorizons.angelica.client.rendering.ThreadedBlockData;
import net.minecraft.block.Block;
import org.spongepowered.asm.mixin.Mixin;
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGlProgram.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGlProgram.java
new file mode 100644
index 000000000..2958fcceb
--- /dev/null
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGlProgram.java
@@ -0,0 +1,25 @@
+package com.gtnewhorizons.angelica.mixins.early.shaders;
+
+import net.coderbot.iris.gl.blending.DepthColorStorage;
+import org.embeddedt.embeddium.impl.gl.GlObject;
+import org.embeddedt.embeddium.impl.gl.shader.GlProgram;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.function.Function;
+
+@Mixin(value = GlProgram.class, remap = false)
+public abstract class MixinGlProgram extends GlObject {
+
+ @Inject(method = "", at = @At("TAIL"))
+ private void iris$registerOwnedProgram(int program, Function, ?> interfaceFactory, CallbackInfo ci) {
+ DepthColorStorage.registerOwnedProgram(program);
+ }
+
+ @Inject(method = "destroyInternal", at = @At("HEAD"))
+ private void iris$unregisterOwnedProgram(CallbackInfo ci) {
+ DepthColorStorage.unregisterOwnedProgram(this.handle());
+ }
+}
diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/startup/MixinAbstractTexture.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/startup/MixinAbstractTexture.java
index e9789989e..6f11f4c0c 100644
--- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/startup/MixinAbstractTexture.java
+++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/startup/MixinAbstractTexture.java
@@ -1,6 +1,6 @@
package com.gtnewhorizons.angelica.mixins.early.shaders.startup;
-import com.gtnewhorizons.angelica.glsm.texture.TextureTracker;
+import com.gtnewhorizons.angelica.client.rendering.TextureTracker;
import net.minecraft.client.renderer.texture.AbstractTexture;
import org.spongepowered.asm.lib.Opcodes;
diff --git a/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredDrawBatcherTest.java b/src/test/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcherTest.java
similarity index 99%
rename from src/test/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredDrawBatcherTest.java
rename to src/test/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcherTest.java
index c7e9d1711..aa15002b9 100644
--- a/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/DeferredDrawBatcherTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcherTest.java
@@ -1,4 +1,4 @@
-package com.gtnewhorizons.angelica.glsm.ffp;
+package com.gtnewhorizons.angelica.client.rendering;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/com/gtnewhorizons/angelica/utils/BufferUtilTest.java b/src/test/java/com/gtnewhorizons/angelica/utils/BufferUtilTest.java
index 2ad6aa458..3507fa910 100644
--- a/src/test/java/com/gtnewhorizons/angelica/utils/BufferUtilTest.java
+++ b/src/test/java/com/gtnewhorizons/angelica/utils/BufferUtilTest.java
@@ -1,8 +1,6 @@
package com.gtnewhorizons.angelica.utils;
-import com.gtnewhorizons.angelica.AngelicaExtension;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
import java.nio.FloatBuffer;
@@ -13,7 +11,6 @@ import static org.junit.jupiter.api.Assertions.*;
/**
* Unit tests for BufferUtil.
*/
-@ExtendWith(AngelicaExtension.class)
class BufferUtilTest {
@Test
diff --git a/src/test/java/net/coderbot/iris/pipeline/transform/ShaderTransformerTest.java b/src/test/java/net/coderbot/iris/pipeline/transform/ShaderTransformerTest.java
index 1f9ac4276..f25248f3a 100644
--- a/src/test/java/net/coderbot/iris/pipeline/transform/ShaderTransformerTest.java
+++ b/src/test/java/net/coderbot/iris/pipeline/transform/ShaderTransformerTest.java
@@ -1,8 +1,11 @@
package net.coderbot.iris.pipeline.transform;
+import com.gtnewhorizons.angelica.glsm.RenderSystem;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.taumc.glsl.ShaderParser;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -17,6 +20,16 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
class ShaderTransformerTest {
+ @BeforeAll
+ static void initShaderTransformer() throws Exception {
+ Field maxGlsl = RenderSystem.class.getDeclaredField("maxGlslVersion");
+ maxGlsl.setAccessible(true);
+ maxGlsl.setInt(null, 460);
+
+ ShaderTransformer.clearCache();
+ ShaderTransformer.init();
+ }
+
@Test
void transformIsDeterministicUnderConcurrency() throws ExecutionException, InterruptedException {
TransformPatcher.clearCache();