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();