From 56529b75734a1aaff41201e487e2739effa17a34 Mon Sep 17 00:00:00 2001 From: douira Date: Sat, 9 May 2026 00:30:21 +0200 Subject: [PATCH 01/27] Bump version to 0.8.12-beta.1 and update changelog --- CHANGELOG.md | 33 ++++++++++++++----------- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7e3a4ab5e..ac153ceedd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,19 +4,24 @@ Everything above the line is ignored and not included in the changelog. Everything below will be in the changelog on GitHub, Modrinth and CurseForge. ---------- -Sodium [SodiumVersion]() for Minecraft [MCVersion]() makes some improvements to the options UI, introduces a new automatic publishing system, fixes some bugs, and introduces some small performance optimizations. +Sodium [SodiumVersion]() fixes a number of bugs, adds some new features, and improves memory usage. The release includes a new display of FPS percentiles which more accurately represent what you actually want to know about the FPS. +- The median (labeled p50) shows the typical frame rate ignoring the slow frames +- The 98th and 99.5th percentiles show the FPS of slow and very slow frames +The average, which is what Minecraft displays by default, can get pulled down by few slow frames even though otherwise the frame rate is pretty high. This leads to the average FPS being not very representative of the actual frame rate you're seeing most of the time. + +The new option to sort entities quads by their closest point allows correct rendering of similar translucent entities that have specific types of otherwise wrongly sorted geometry. This is disabled by default as it incurs a performance cost. + +The bug fixes include multiple crash fixes and changes to avoid retaining large memory allocations in specific scenarios. -- Workflow and Gradle based publishing setup with changelog system ([#3575](https://github.com/CaffeineMC/sodium/pull/3575), [#3622](https://github.com/CaffeineMC/sodium/pull/3622)) -- Invalidate cached search index sources to be properly indexed after language switch -- Jump to the mod's options when its header in the page list is clicked -- Show that an entry in the options page list leads to an external page more clearly -- Hide options search bar clear button when search bar is empty -- Implement Alt shortcuts and ESC discard behavior ([#2769](https://github.com/CaffeineMC/sodium/pull/2769)) ([#3604](https://github.com/CaffeineMC/sodium/pull/3604)) -- Reset button for options with hold-shift to reset functionality -- Fix rare translucency sorting crash when repeatedly interacting with specific chunks with some resource packs ([#3609](https://github.com/CaffeineMC/sodium/pull/3609)) -- Make the filtering mode configurable with an option and change the default to nearest -- Fix animated sprite mipping ([#3619](https://github.com/CaffeineMC/sodium/pull/3619)) -- Add caching to `GlStateManager#glViewport` ([#3309](https://github.com/CaffeineMC/sodium/pull/3309)) -- Add support for new fabric color provider API -- Fix tint on neoforge when blocks are rendered as items ([#3615](https://github.com/CaffeineMC/sodium/pull/3615)) - Fix the animation when fluid sprites are obtained directly via FluidModel ([#3630](https://github.com/CaffeineMC/sodium/pull/3630)) +- Avoid retaining large allocations created when heavy quad splitting takes place +- Fix buffer overflow caused by BSP Node reuse when quads were split +- Fix wrong applicability test in BaseBiForest that would cause wrong rendering at render distances >32 +- Fix post launch checks to actually run and fix duplicate module dialog ([#3624](https://github.com/CaffeineMC/sodium/pull/3624)) +- Implement optional percentile fps display ([#3633](https://github.com/CaffeineMC/sodium/pull/3633)) +- Fix flat fluid lighting being too dark ([#3620](https://github.com/CaffeineMC/sodium/pull/3620)) +- Significantly reduce memory consumption on the direct sorting fallback path +- Fix issues with fluid shaping in both "improved" and regular mode +- Fix #3612 by performing uniform binding on particle rendering ([#3637](https://github.com/CaffeineMC/sodium/pull/3637)) +- Fixed #3603 (incorrect AO and skylight level around light sources) ([#3631](https://github.com/CaffeineMC/sodium/pull/3631)) +- Add option to sort Entity Quads by Closest Point ([#3635](https://github.com/CaffeineMC/sodium/pull/3635)) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index ce2c8d3f2c..0c284390a2 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.8.11" + val MOD_VERSION: String = "0.8.12-beta.1" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From b0697968106fec97eeccb7a7408d552bcf6e5485 Mon Sep 17 00:00:00 2001 From: douira Date: Mon, 11 May 2026 02:12:23 +0200 Subject: [PATCH 02/27] Bump version to 0.8.12-beta.2 and update changelog --- CHANGELOG.md | 12 ++++++++---- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac153ceedd..f19b0d996c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,12 @@ Everything above the line is ignored and not included in the changelog. Everything below will be in the changelog on GitHub, Modrinth and CurseForge. ---------- -Sodium [SodiumVersion]() fixes a number of bugs, adds some new features, and improves memory usage. The release includes a new display of FPS percentiles which more accurately represent what you actually want to know about the FPS. +Sodium [SodiumVersion]() fixes a number of bugs, adds some new features, and improves memory usage. It also includes multiple improvements to lighting. + +The release includes a new display of FPS percentiles which more accurately represent what you actually want to know about the FPS. - The median (labeled p50) shows the typical frame rate ignoring the slow frames -- The 98th and 99.5th percentiles show the FPS of slow and very slow frames -The average, which is what Minecraft displays by default, can get pulled down by few slow frames even though otherwise the frame rate is pretty high. This leads to the average FPS being not very representative of the actual frame rate you're seeing most of the time. +- The 98th and 99.5th percentiles show the FPS of slow and very slow frames. +- The average, which is what Minecraft displays by default, can get pulled down by few slow frames even though otherwise the frame rate is pretty high. This leads to the average FPS being not very representative of the actual frame rate you're seeing most of the time. The new option to sort entities quads by their closest point allows correct rendering of similar translucent entities that have specific types of otherwise wrongly sorted geometry. This is disabled by default as it incurs a performance cost. @@ -18,10 +20,12 @@ The bug fixes include multiple crash fixes and changes to avoid retaining large - Fix buffer overflow caused by BSP Node reuse when quads were split - Fix wrong applicability test in BaseBiForest that would cause wrong rendering at render distances >32 - Fix post launch checks to actually run and fix duplicate module dialog ([#3624](https://github.com/CaffeineMC/sodium/pull/3624)) -- Implement optional percentile fps display ([#3633](https://github.com/CaffeineMC/sodium/pull/3633)) +- Implement optional percentile fps display ([#3633](https://github.com/CaffeineMC/sodium/pull/3633), [#3642](https://github.com/CaffeineMC/sodium/pull/3642)) - Fix flat fluid lighting being too dark ([#3620](https://github.com/CaffeineMC/sodium/pull/3620)) - Significantly reduce memory consumption on the direct sorting fallback path - Fix issues with fluid shaping in both "improved" and regular mode - Fix #3612 by performing uniform binding on particle rendering ([#3637](https://github.com/CaffeineMC/sodium/pull/3637)) - Fixed #3603 (incorrect AO and skylight level around light sources) ([#3631](https://github.com/CaffeineMC/sodium/pull/3631)) - Add option to sort Entity Quads by Closest Point ([#3635](https://github.com/CaffeineMC/sodium/pull/3635)) +- Fix Minecraft's CompactVectorArray#getZ returning the wrong value which broke some mods' rendering ([#3643](https://github.com/CaffeineMC/sodium/pull/3643)) +- Change fullbright blocks to only emit block light and no sky light ([#3640](https://github.com/CaffeineMC/sodium/pull/3640)) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index 0c284390a2..9ea1e0f5fd 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.8.12-beta.1" + val MOD_VERSION: String = "0.8.12-beta.2" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 3c37d930c89b00ccfa622aeac25267a3d92048cb Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 13 May 2026 20:16:11 +0200 Subject: [PATCH 03/27] Bump version to 0.8.12-beta.3 and update changelog --- CHANGELOG.md | 4 ++++ buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f19b0d996c..df4da59ec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,3 +29,7 @@ The bug fixes include multiple crash fixes and changes to avoid retaining large - Add option to sort Entity Quads by Closest Point ([#3635](https://github.com/CaffeineMC/sodium/pull/3635)) - Fix Minecraft's CompactVectorArray#getZ returning the wrong value which broke some mods' rendering ([#3643](https://github.com/CaffeineMC/sodium/pull/3643)) - Change fullbright blocks to only emit block light and no sky light ([#3640](https://github.com/CaffeineMC/sodium/pull/3640)) +- Fix clouds being invisible behind leaves with specific resource packs +- Refactor `ImprovedItemModelBuilder` for better mod compatibility ([#3648](https://github.com/CaffeineMC/sodium/pull/3648)) + +Please participate in testing this release and giving feedback on [our discord server](https://caffeinemc.net/discord). \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index 9ea1e0f5fd..692440b53f 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.8.12-beta.2" + val MOD_VERSION: String = "0.8.12-beta.3" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 6174916a113ea71de3ccec62e81eda93acded5d1 Mon Sep 17 00:00:00 2001 From: douira Date: Thu, 14 May 2026 14:34:01 +0200 Subject: [PATCH 04/27] Bump version to 0.8.12-beta.4 and update changelog --- CHANGELOG.md | 2 +- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df4da59ec9..2fec2f9ddd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,6 @@ The bug fixes include multiple crash fixes and changes to avoid retaining large - Fix Minecraft's CompactVectorArray#getZ returning the wrong value which broke some mods' rendering ([#3643](https://github.com/CaffeineMC/sodium/pull/3643)) - Change fullbright blocks to only emit block light and no sky light ([#3640](https://github.com/CaffeineMC/sodium/pull/3640)) - Fix clouds being invisible behind leaves with specific resource packs -- Refactor `ImprovedItemModelBuilder` for better mod compatibility ([#3648](https://github.com/CaffeineMC/sodium/pull/3648)) +- Refactor `ImprovedItemModelBuilder` for better mod compatibility and fixed crash from beta 3 ([#3648](https://github.com/CaffeineMC/sodium/pull/3648)) Please participate in testing this release and giving feedback on [our discord server](https://caffeinemc.net/discord). \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index 692440b53f..09001b5165 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.8.12-beta.3" + val MOD_VERSION: String = "0.8.12-beta.4" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From b030dec53b9ae220a80cae7c91225098ced68156 Mon Sep 17 00:00:00 2001 From: douira Date: Tue, 19 May 2026 00:05:45 +0200 Subject: [PATCH 05/27] Bump version to 0.8.12 and update changelog --- CHANGELOG.md | 6 +++--- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fec2f9ddd..5aae735531 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ The release includes a new display of FPS percentiles which more accurately repr The new option to sort entities quads by their closest point allows correct rendering of similar translucent entities that have specific types of otherwise wrongly sorted geometry. This is disabled by default as it incurs a performance cost. -The bug fixes include multiple crash fixes and changes to avoid retaining large memory allocations in specific scenarios. +Included are also multiple crash fixes and changes to avoid retaining large memory allocations in specific scenarios. - Fix the animation when fluid sprites are obtained directly via FluidModel ([#3630](https://github.com/CaffeineMC/sodium/pull/3630)) - Avoid retaining large allocations created when heavy quad splitting takes place @@ -31,5 +31,5 @@ The bug fixes include multiple crash fixes and changes to avoid retaining large - Change fullbright blocks to only emit block light and no sky light ([#3640](https://github.com/CaffeineMC/sodium/pull/3640)) - Fix clouds being invisible behind leaves with specific resource packs - Refactor `ImprovedItemModelBuilder` for better mod compatibility and fixed crash from beta 3 ([#3648](https://github.com/CaffeineMC/sodium/pull/3648)) - -Please participate in testing this release and giving feedback on [our discord server](https://caffeinemc.net/discord). \ No newline at end of file +- Fix the corrupted config screen to show up properly +- Fix fog flicker ([#3666](https://github.com/CaffeineMC/sodium/pull/3666)) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index 09001b5165..edd642fc50 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.8.12-beta.4" + val MOD_VERSION: String = "0.8.12" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 01900d09772e4672ce382c2a485e9b15e40f27ad Mon Sep 17 00:00:00 2001 From: douira Date: Mon, 15 Jun 2026 20:11:47 +0200 Subject: [PATCH 06/27] Bump version to 0.9.0-beta.1 and update changelog --- CHANGELOG.md | 37 +++++++------------------ buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 11 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aae735531..b1f49c7e45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,32 +4,15 @@ Everything above the line is ignored and not included in the changelog. Everything below will be in the changelog on GitHub, Modrinth and CurseForge. ---------- -Sodium [SodiumVersion]() fixes a number of bugs, adds some new features, and improves memory usage. It also includes multiple improvements to lighting. +Sodium [SodiumVersion]() for Minecraft [MCVersion]() introduces asynchronous occlusion culling alongside some other small improvements and bug fixes. -The release includes a new display of FPS percentiles which more accurately represent what you actually want to know about the FPS. -- The median (labeled p50) shows the typical frame rate ignoring the slow frames -- The 98th and 99.5th percentiles show the FPS of slow and very slow frames. -- The average, which is what Minecraft displays by default, can get pulled down by few slow frames even though otherwise the frame rate is pretty high. This leads to the average FPS being not very representative of the actual frame rate you're seeing most of the time. +This generally improves performance and avoids the frame rate dropping when the camera is moved, especially at high render distances. This feature has been in the works for a long time now, and together with the release for Minecraft 26.2, we've decided to release it. More work is planned, including improvements to the task scheduling system and optimizations to improve responsiveness. -The new option to sort entities quads by their closest point allows correct rendering of similar translucent entities that have specific types of otherwise wrongly sorted geometry. This is disabled by default as it incurs a performance cost. - -Included are also multiple crash fixes and changes to avoid retaining large memory allocations in specific scenarios. - -- Fix the animation when fluid sprites are obtained directly via FluidModel ([#3630](https://github.com/CaffeineMC/sodium/pull/3630)) -- Avoid retaining large allocations created when heavy quad splitting takes place -- Fix buffer overflow caused by BSP Node reuse when quads were split -- Fix wrong applicability test in BaseBiForest that would cause wrong rendering at render distances >32 -- Fix post launch checks to actually run and fix duplicate module dialog ([#3624](https://github.com/CaffeineMC/sodium/pull/3624)) -- Implement optional percentile fps display ([#3633](https://github.com/CaffeineMC/sodium/pull/3633), [#3642](https://github.com/CaffeineMC/sodium/pull/3642)) -- Fix flat fluid lighting being too dark ([#3620](https://github.com/CaffeineMC/sodium/pull/3620)) -- Significantly reduce memory consumption on the direct sorting fallback path -- Fix issues with fluid shaping in both "improved" and regular mode -- Fix #3612 by performing uniform binding on particle rendering ([#3637](https://github.com/CaffeineMC/sodium/pull/3637)) -- Fixed #3603 (incorrect AO and skylight level around light sources) ([#3631](https://github.com/CaffeineMC/sodium/pull/3631)) -- Add option to sort Entity Quads by Closest Point ([#3635](https://github.com/CaffeineMC/sodium/pull/3635)) -- Fix Minecraft's CompactVectorArray#getZ returning the wrong value which broke some mods' rendering ([#3643](https://github.com/CaffeineMC/sodium/pull/3643)) -- Change fullbright blocks to only emit block light and no sky light ([#3640](https://github.com/CaffeineMC/sodium/pull/3640)) -- Fix clouds being invisible behind leaves with specific resource packs -- Refactor `ImprovedItemModelBuilder` for better mod compatibility and fixed crash from beta 3 ([#3648](https://github.com/CaffeineMC/sodium/pull/3648)) -- Fix the corrupted config screen to show up properly -- Fix fog flicker ([#3666](https://github.com/CaffeineMC/sodium/pull/3666)) +- Implementation of Asynchronous Graph Culling and Frame-Independent Task Scheduling ([#2887](https://github.com/CaffeineMC/sodium/pull/2887)) +- Fix rare issues with chunk fading +- Fix crash when using `-Dmixin.debug=true` ([#3689](https://github.com/CaffeineMC/sodium/pull/3689)) +- Only make environment changes if the early window will create a gl context early ([#3697](https://github.com/CaffeineMC/sodium/pull/3697)) +- Improve the presentation and wording of some video options ([#3700](https://github.com/CaffeineMC/sodium/pull/3700)) +- Fix water color handling +- Fix broken block tinting by not incorrectly converting to the wrong color format +- Fix fluid color overrides not being applied ([#3729](https://github.com/CaffeineMC/sodium/pull/3729)) \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index edd642fc50..a5518a2501 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.8.12" + val MOD_VERSION: String = "0.9.0-beta.1" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 0cbf4af217f86abc86fd870d300725ea3059f981 Mon Sep 17 00:00:00 2001 From: douira Date: Tue, 16 Jun 2026 03:15:20 +0200 Subject: [PATCH 07/27] Update breaks clauses to reflect current incompatibilities --- fabric/src/main/resources/fabric.mod.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 5b66061a99..19b20f8b39 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -93,7 +93,7 @@ "custom_hud" : "<3.4.2", "farsight" : "<=1.21-4.3", "iceberg" : "<1.2.7", - "iris" : "<=1.10.8", + "iris" : "<=1.10.9", "movingelevators" : "<=1.4.7", "notenoughcrashes" : "<4.4.8", "noxesium" : "<2.3.3", @@ -105,7 +105,8 @@ "moreculling": "<1.6.0-beta.2", "simply-no-shading": "<7.6.2", "betterend" : "<=21.0.11", - "enchanteds_sodium_options" : "<1.0.1" + "enchanteds_sodium_options" : "<1.0.1", + "betterblockentities": "<1.3.5" }, "provides" : [ "indium" From e08e498920323da042929c5ee66f27359f74042b Mon Sep 17 00:00:00 2001 From: IMS Date: Tue, 16 Jun 2026 09:53:00 -0700 Subject: [PATCH 08/27] Bump version to 0.9.0 --- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index a5518a2501..a23465f972 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.9.0-beta.1" + val MOD_VERSION: String = "0.9.0" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 8e368e5cff1a885396a50f723c89fe6a1d4826f2 Mon Sep 17 00:00:00 2001 From: Yao Chung Hu <30311066+flashyreese@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:27:57 +0200 Subject: [PATCH 09/27] Skip rendering regions without resources (#3752) --- .../render/chunk/DefaultChunkRenderer.java | 22 ++++++++++--------- .../render/chunk/region/RenderRegion.java | 1 + 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java index 758aa13202..a506512f10 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java @@ -1,6 +1,7 @@ package net.caffeinemc.mods.sodium.client.render.chunk; import com.mojang.blaze3d.textures.GpuSampler; +import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import net.caffeinemc.mods.sodium.client.SodiumClientMod; import net.caffeinemc.mods.sodium.client.gl.buffer.GlBuffer; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; @@ -24,7 +25,6 @@ import net.caffeinemc.mods.sodium.client.util.BitwiseMath; import net.caffeinemc.mods.sodium.client.util.FogParameters; import net.caffeinemc.mods.sodium.client.util.UInt32; -import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import org.lwjgl.system.Pointer; import java.util.Iterator; @@ -73,6 +73,12 @@ public void render(ChunkRenderMatrices matrices, continue; } + var resources = region.getResources(); + if (resources == null) { + region.clearCachedBatchFor(renderPass); + continue; + } + var batch = region.getCachedBatch(renderPass); if (!batch.isFilled) { fillCommandBuffer(batch, region, storage, renderList, camera, renderPass, useBlockFaceCulling, useIndexedTessellation); @@ -91,12 +97,12 @@ public void render(ChunkRenderMatrices matrices, GlTessellation tessellation; if (useIndexedTessellation) { - tessellation = this.prepareIndexedTessellation(commandList, region); + tessellation = this.prepareIndexedTessellation(commandList, resources); } else { - tessellation = this.prepareTessellation(commandList, region); + tessellation = this.prepareTessellation(commandList, resources); } - setModelMatrixUniforms(shader, region, camera, region.getResources().prepareChunkData(commandList)); + setModelMatrixUniforms(shader, region, camera, resources.prepareChunkData(commandList)); executeDrawBatch(commandList, tessellation, batch); } @@ -320,9 +326,7 @@ private static float getCameraTranslation(int chunkBlockPos, int cameraBlockPos, return (chunkBlockPos - cameraBlockPos) - cameraPos; } - private GlTessellation prepareTessellation(CommandList commandList, RenderRegion region) { - var resources = region.getResources(); - + private GlTessellation prepareTessellation(CommandList commandList, RenderRegion.DeviceResources resources) { GlTessellation tessellation = resources.getTessellation(); if (tessellation == null) { tessellation = this.createRegionTessellation(commandList, resources, true); @@ -332,9 +336,7 @@ private GlTessellation prepareTessellation(CommandList commandList, RenderRegion return tessellation; } - private GlTessellation prepareIndexedTessellation(CommandList commandList, RenderRegion region) { - var resources = region.getResources(); - + private GlTessellation prepareIndexedTessellation(CommandList commandList, RenderRegion.DeviceResources resources) { GlTessellation tessellation = resources.getIndexedTessellation(); if (tessellation == null) { tessellation = this.createRegionTessellation(commandList, resources, false); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java index adb0e86422..29afd820f7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java @@ -309,6 +309,7 @@ public void update(CommandList commandList) { if (this.resources != null && this.resources.shouldDelete()) { this.resources.delete(commandList); this.resources = null; + this.clearAllCachedBatches(); } } From 7c01fa9a1f60950b87d5f1f5de7f4cd438e8d8ca Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 24 Jun 2026 15:50:21 +0200 Subject: [PATCH 10/27] Fix TS Crashes Resulting from Unsafe Concurrency (#3757) * Fix crashes resulting from unsafe concurrency handling when multiple sorting tasks run for the same translucent topo data * Fix "geometryPlanes is null" NPEs due to state corruption from incorrect handling of potentially racing meshing tasks --- .../render/chunk/RenderSectionManager.java | 2 +- .../tasks/ChunkBuilderMeshingTask.java | 4 +- .../tasks/ChunkBuilderSortingTask.java | 4 +- .../data/AnyOrderData.java | 2 +- .../data/DynamicBSPData.java | 6 +- .../translucent_sorting/data/DynamicData.java | 11 ++-- .../data/DynamicSorter.java | 18 ++++-- .../data/DynamicTopoData.java | 61 ++++++++----------- .../data/PresentTranslucentData.java | 4 +- .../data/SharedIndexSorter.java | 2 +- .../translucent_sorting/data/Sorter.java | 2 +- .../data/StaticNormalRelativeData.java | 2 +- .../data/StaticSorter.java | 2 +- .../data/StaticTopoData.java | 2 +- .../data/TopoGraphSorting.java | 4 ++ .../trigger/DirectTriggers.java | 1 - .../trigger/GFNITriggers.java | 8 +-- .../trigger/SortTriggering.java | 33 +++++----- 18 files changed, 80 insertions(+), 88 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java index 274c656cda..1ee2e7ea32 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java @@ -570,7 +570,7 @@ private int processChunkBuildResults(ArrayList results, Viewp this.meshTaskSizeEstimator.addData(this.meshTaskSizeEstimator.resultForSection(section, resultSize)); if (buildOutput.translucentData != null) { - this.sortTriggering.integrateTranslucentData(oldData, buildOutput.translucentData, this.cameraPosition, this::scheduleSort); + this.sortTriggering.integrateTranslucentData(oldData, buildOutput.translucentData, buildOutput.getSorter(), this.cameraPosition, this::scheduleSort); // a rebuild always generates new translucent data which means applyTriggerChanges isn't necessary section.setTranslucentData(buildOutput.translucentData); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java index 3a3b9bb3aa..c72b6c9c35 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java @@ -237,8 +237,8 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke output.markAsNotContainingNewIndexData(); } else if (translucentData instanceof PresentTranslucentData present) { try { - var sorter = present.getSorter(); - sorter.writeIndexBuffer(this, true); + var sorter = present.getSorter(true); + sorter.writeIndexBuffer(this); output.setSorter(sorter); } catch (Exception ex) { // Create a new crash report for exceptions thrown during sorting diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderSortingTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderSortingTask.java index feef81bfc1..57ae7fcf93 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderSortingTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderSortingTask.java @@ -28,7 +28,7 @@ public ChunkSortOutput execute(ChunkBuildContext context, CancellationToken canc ProfilerFiller profiler = Profiler.get(); profiler.push("translucency sorting"); - this.sorter.writeIndexBuffer(this, false); + this.sorter.writeIndexBuffer(this); profiler.pop(); return new ChunkSortOutput(this.section, this.submitTime, this.sorter); @@ -36,7 +36,7 @@ public ChunkSortOutput execute(ChunkBuildContext context, CancellationToken canc public static ChunkBuilderSortingTask createTask(RenderSection render, int frame, Vector3dc absoluteCameraPos) { if (render.getTranslucentData() instanceof DynamicData dynamicData) { - return new ChunkBuilderSortingTask(render, frame, absoluteCameraPos, dynamicData.getSorter()); + return new ChunkBuilderSortingTask(render, frame, absoluteCameraPos, dynamicData.getSorter(false)); } return null; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/AnyOrderData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/AnyOrderData.java index 0d3b1109c5..8cd076af25 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/AnyOrderData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/AnyOrderData.java @@ -32,7 +32,7 @@ public SortType getSortType() { } @Override - public Sorter getSorter() { + public Sorter getSorter(boolean initial) { var sorter = this.sorterOnce; if (sorter == null) { throw new IllegalStateException("Sorter already used!"); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicBSPData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicBSPData.java index 14f37f5588..817d3a5474 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicBSPData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicBSPData.java @@ -41,11 +41,11 @@ private DynamicBSPData(SectionPos sectionPos, int inputQuadCount, BSPResult resu private class DynamicBSPSorter extends DynamicSorter { private DynamicBSPSorter(int quadCount) { - super(quadCount, DynamicBSPData.this); + super(quadCount, DynamicBSPData.this, DynamicBSPData.this.geometryPlanes); } @Override - void writeSort(CombinedCameraPos cameraPos, boolean initial) { + void writeSort(CombinedCameraPos cameraPos) { DynamicBSPData.this.rootNode.collectSortedQuads(this.getIndexBuffer(), cameraPos.getRelativeCameraPos()); } } @@ -62,7 +62,7 @@ public int getIndexQuadCount() { } @Override - public DynamicSorter getSorter() { + public DynamicSorter getSorter(boolean initial) { // release references to the modified quad list, // since we sort during the meshing task for the first time (in particular, when there was a non-null updated quad list) this.updatedQuadsList = null; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicData.java index ddc619fa63..90c166eb2d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicData.java @@ -6,7 +6,7 @@ import org.joml.Vector3dc; public abstract class DynamicData extends PresentTranslucentData { - private GeometryPlanes geometryPlanes; + protected GeometryPlanes geometryPlanes; private final Vector3dc initialCameraPos; DynamicData(SectionPos sectionPos, int inputQuadCount, GeometryPlanes geometryPlanes, Vector3dc initialCameraPos) { @@ -20,13 +20,10 @@ public SortType getSortType() { return SortType.DYNAMIC; } - public abstract DynamicSorter getSorter(); - - public GeometryPlanes getGeometryPlanes() { - return this.geometryPlanes; - } + @Override + public abstract DynamicSorter getSorter(boolean initial); - public void discardGeometryPlanes() { + public void discardGeometryPlanesAfterIntegration() { this.geometryPlanes = null; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java index f58dbdcd6f..f2fdb3e135 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java @@ -1,26 +1,34 @@ package net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data; +import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.trigger.GeometryPlanes; + public abstract class DynamicSorter extends PresentSorter { private final int quadCount; protected final TranslucentData sourceData; + private final GeometryPlanes geometryPlanes; - DynamicSorter(int quadCount, TranslucentData sourceData) { + DynamicSorter(int quadCount, DynamicData sourceData, GeometryPlanes geometryPlanes) { this.quadCount = quadCount; this.sourceData = sourceData; + this.geometryPlanes = geometryPlanes; } - abstract void writeSort(CombinedCameraPos cameraPos, boolean initial); + abstract void writeSort(CombinedCameraPos cameraPos); + + public GeometryPlanes getGeometryPlanes() { + return this.geometryPlanes; + } @Override - public void writeIndexBuffer(CombinedCameraPos cameraPos, boolean initial) { + public void writeIndexBuffer(CombinedCameraPos cameraPos) { this.initBufferWithQuadLength(this.quadCount); - this.writeSort(cameraPos, initial); + this.writeSort(cameraPos); } public int getQuadCount() { return this.quadCount; } - + public int getResultSize() { return TranslucentData.quadCountToIndexBytes(this.quadCount); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicTopoData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicTopoData.java index 9e8f557230..7d76ac0b34 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicTopoData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicTopoData.java @@ -73,8 +73,8 @@ private void computeCentroids(TQuad[] quads) { } @Override - public DynamicSorter getSorter() { - return new DynamicTopoSorter(this.getInputQuadCount(), this.pendingTriggerIsDirect, this.consecutiveTopoSortFailures, this.GFNITrigger, this.directTrigger); + public DynamicSorter getSorter(boolean initial) { + return new DynamicTopoSorter(this.getInputQuadCount(), this.pendingTriggerIsDirect, initial, this.consecutiveTopoSortFailures, this.GFNITrigger, this.directTrigger, this.quads, this.centroids, this.distancesByNormal); } public boolean GFNITriggerEnabled() { @@ -96,7 +96,12 @@ public void setDirectTriggerKey(double key) { public boolean checkAndApplyGFNITriggerOff(DynamicTopoSorter sorter) { if (this.GFNITrigger && !sorter.GFNITrigger) { this.GFNITrigger = false; - this.checkDirectSortingFallback(); + + // once the GFNI trigger is turned off, the topo sort data is never used again, so it can be freed to save memory. + this.computeCentroids(this.quads); + this.quads = null; + this.distancesByNormal = null; + return true; } return false; @@ -126,24 +131,6 @@ public void applyTopoSortFailureCounterChange(DynamicTopoSorter sorter) { } } - private void copyStateFrom(DynamicTopoSorter sorter) { - this.GFNITrigger = sorter.GFNITrigger; - this.directTrigger = sorter.directTrigger; - this.consecutiveTopoSortFailures = sorter.consecutiveTopoSortFailuresNew; - - this.checkDirectSortingFallback(); - } - - private void checkDirectSortingFallback() { - // once the GFNI trigger is turned off, the topo sort data is never used again, so it can be freed to save memory. - if (!this.GFNITrigger && this.quads != null) { - this.computeCentroids(this.quads); - - this.quads = null; - this.distancesByNormal = null; - } - } - @Override public void prepareTrigger(boolean isDirectTrigger) { this.pendingTriggerIsDirect = isDirectTrigger; @@ -151,6 +138,7 @@ public void prepareTrigger(boolean isDirectTrigger) { public class DynamicTopoSorter extends DynamicSorter implements IntConsumer { private final boolean isDirectTrigger; + private final boolean initial; private final int consecutiveTopoSortFailures; private boolean directTrigger; @@ -159,13 +147,22 @@ public class DynamicTopoSorter extends DynamicSorter implements IntConsumer { private IntBuffer intBuffer; - private DynamicTopoSorter(int quadCount, boolean isDirectTrigger, int consecutiveTopoSortFailures, boolean GFNITrigger, boolean directTrigger) { - super(quadCount, DynamicTopoData.this); + private final TQuad[] quads; + private final Vector3fc[] centroids; + private final Object2ReferenceMap distancesByNormal; + + private DynamicTopoSorter(int quadCount, boolean isDirectTrigger, boolean initial, int consecutiveTopoSortFailures, boolean GFNITrigger, boolean directTrigger, TQuad[] quads, Vector3fc[] centroids, Object2ReferenceMap distancesByNormal) { + super(quadCount, DynamicTopoData.this, DynamicTopoData.this.geometryPlanes); this.isDirectTrigger = isDirectTrigger; + this.initial = initial; this.consecutiveTopoSortFailures = consecutiveTopoSortFailures; this.consecutiveTopoSortFailuresNew = consecutiveTopoSortFailures; this.GFNITrigger = GFNITrigger; this.directTrigger = directTrigger; + + this.quads = quads; + this.centroids = centroids; + this.distancesByNormal = distancesByNormal; } private static int getAttemptsForTime(long ns) { @@ -186,23 +183,23 @@ public void accept(int value) { } @Override - void writeSort(CombinedCameraPos cameraPos, boolean initial) { + void writeSort(CombinedCameraPos cameraPos) { // uses a topo sort or a distance sort depending on what is enabled IntBuffer indexBuffer = this.getIntBuffer(); if (this.GFNITrigger && !this.isDirectTrigger) { this.intBuffer = indexBuffer; - var sortStart = initial ? 0 : System.nanoTime(); - var result = TopoGraphSorting.topoGraphSort(this, DynamicTopoData.this.quads, DynamicTopoData.this.distancesByNormal, cameraPos.getRelativeCameraPos(), false); + var sortStart = this.initial ? 0 : System.nanoTime(); + var result = TopoGraphSorting.topoGraphSort(this, this.quads, this.distancesByNormal, cameraPos.getRelativeCameraPos(), false); this.intBuffer = null; - var sortTime = initial ? 0 : System.nanoTime() - sortStart; + var sortTime = this.initial ? 0 : System.nanoTime() - sortStart; // if we've already failed, there's reduced patience for sorting since the // probability of failure and wasted compute time is higher. Initial sorting is - // often very slow when the cpu is loaded and the JIT isn't ready yet, so it's + // often very slow when the cpu is loaded, and the JIT isn't ready yet, so it's // ignored here. - if (!initial && sortTime > (this.consecutiveTopoSortFailuresNew > 0 + if (!this.initial && sortTime > (this.consecutiveTopoSortFailuresNew > 0 ? MAX_FAILING_TOPO_SORT_TIME_NS : MAX_TOPO_SORT_TIME_NS)) { this.directTrigger = true; @@ -227,11 +224,7 @@ void writeSort(CombinedCameraPos cameraPos, boolean initial) { if (this.directTrigger) { indexBuffer.rewind(); - distanceSortDirect(indexBuffer, DynamicTopoData.this.centroids, DynamicTopoData.this.quads, cameraPos.getRelativeCameraPos()); - } - - if (initial) { - DynamicTopoData.this.copyStateFrom(this); + distanceSortDirect(indexBuffer, this.centroids, this.quads, cameraPos.getRelativeCameraPos()); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/PresentTranslucentData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/PresentTranslucentData.java index c3bded590f..0ea525724c 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/PresentTranslucentData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/PresentTranslucentData.java @@ -1,8 +1,8 @@ package net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortType; -import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.quad.TQuad; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector; +import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.quad.TQuad; import net.minecraft.core.SectionPos; /** @@ -17,7 +17,7 @@ public abstract class PresentTranslucentData extends TranslucentData { this.inputQuadCount = inputQuadCount; } - public abstract Sorter getSorter(); + public abstract Sorter getSorter(boolean initial); @Override public boolean oldDataMatches(TranslucentGeometryCollector collector, SortType sortType, TQuad[] quads) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/SharedIndexSorter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/SharedIndexSorter.java index 9dc709a761..93e8d64bfa 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/SharedIndexSorter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/SharedIndexSorter.java @@ -16,7 +16,7 @@ public IntBuffer getIntBuffer() { } @Override - public void writeIndexBuffer(CombinedCameraPos cameraPos, boolean initial) { + public void writeIndexBuffer(CombinedCameraPos cameraPos) { // no-op } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/Sorter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/Sorter.java index 545e58a2b9..a46d9eb8b4 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/Sorter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/Sorter.java @@ -1,7 +1,7 @@ package net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data; public interface Sorter extends PresentSortData { - void writeIndexBuffer(CombinedCameraPos cameraPos, boolean initial); + void writeIndexBuffer(CombinedCameraPos cameraPos); void destroy(); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticNormalRelativeData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticNormalRelativeData.java index a77e8f033f..b0fc060bc3 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticNormalRelativeData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticNormalRelativeData.java @@ -26,7 +26,7 @@ public SortType getSortType() { } @Override - public Sorter getSorter() { + public Sorter getSorter(boolean initial) { var sorter = this.sorterOnce; if (sorter == null) { throw new IllegalStateException("Sorter already used!"); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticSorter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticSorter.java index cbc09e19ed..41a48fb42f 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticSorter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticSorter.java @@ -6,7 +6,7 @@ class StaticSorter extends PresentSorter { } @Override - public void writeIndexBuffer(CombinedCameraPos cameraPos, boolean initial) { + public void writeIndexBuffer(CombinedCameraPos cameraPos) { // no-op } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticTopoData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticTopoData.java index 6b9324d236..a5c07c5ac4 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticTopoData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/StaticTopoData.java @@ -25,7 +25,7 @@ public SortType getSortType() { } @Override - public Sorter getSorter() { + public Sorter getSorter(boolean initial) { var sorter = this.sorterOnce; if (sorter == null) { throw new IllegalStateException("Sorter already used!"); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TopoGraphSorting.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TopoGraphSorting.java index d3792db7a1..5b4dab95f2 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TopoGraphSorting.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TopoGraphSorting.java @@ -258,6 +258,10 @@ public static boolean topoGraphSort( IntConsumer indexConsumer, TQuad[] allQuads, Object2ReferenceMap distancesByNormal, Vector3fc cameraPos, boolean failOnIntersection) { + if (allQuads == null) { + var debug = true; + } + // if enabled, check for visibility and produce a mapping of indices TQuad[] quads; int[] activeToRealIndex = null; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java index de8d651c48..42d5ec0683 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java @@ -211,7 +211,6 @@ public void removeSection(long sectionPos, TranslucentData data) { } } - @Override public void integrateSection(SortTriggering ts, SectionPos sectionPos, DynamicTopoData data, CameraMovement movement) { // create data with last camera position diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/GFNITriggers.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/GFNITriggers.java index 61ab847648..656ec767e6 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/GFNITriggers.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/GFNITriggers.java @@ -59,10 +59,8 @@ public void removeSection(long sectionPos, TranslucentData data) { this.normalLists.values().removeIf(normalList -> this.removeSectionFromList(normalList, sectionPos)); } - @Override - public void integrateSection(SortTriggering ts, SectionPos pos, DynamicData data, CameraMovement movement) { - long sectionPos = pos.asLong(); - var geometryPlanes = data.getGeometryPlanes(); + public void integrateSection(SortTriggering ts, SectionPos pos, GeometryPlanes geometryPlanes, CameraMovement movement) { + var sectionPos = pos.asLong(); // go through all normal lists and check against the normals that the group // builder has. if the normal list has data for the section, but the group @@ -105,8 +103,6 @@ public void integrateSection(SortTriggering ts, SectionPos pos, DynamicData data } } - data.discardGeometryPlanes(); - // check if catchup trigger is necessary if (movement.hasChanged()) { for (var normalList : this.normalLists.values()) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/SortTriggering.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/SortTriggering.java index 6bb1cba501..9d84588ad0 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/SortTriggering.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/SortTriggering.java @@ -4,9 +4,7 @@ import net.caffeinemc.mods.sodium.client.SodiumClientMod; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortBehavior; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortType; -import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicData; -import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicTopoData; -import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.TranslucentData; +import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.*; import net.minecraft.core.SectionPos; import org.joml.Vector3dc; import org.joml.Vector3fc; @@ -21,7 +19,7 @@ *

* TODO: * - investigate why there's a similar number of STA and DYN sections. This might be normal, the counters might be broken or the heuristic is actually wrong. - * + * * @author douira (the translucent_sorting package) */ public class SortTriggering { @@ -63,13 +61,11 @@ interface SectionTriggers { void processTriggers(SortTriggering ts, CameraMovement movement); void removeSection(long sectionPos, TranslucentData data); - - void integrateSection(SortTriggering ts, SectionPos sectionPos, T data, CameraMovement movement); } /** * Triggers the sections that the given camera movement crosses face planes of. - * + * * @param triggerSectionCallback called for each section that is triggered * @param movement the camera movement to trigger for */ @@ -165,7 +161,7 @@ private void incrementSortTypeCounter(TranslucentData newData) { /** * Removes a section from direct and GFNI triggering. This removes all its face * planes. - * + * * @param oldData the data of the section to remove * @param sectionPos the section to remove */ @@ -179,12 +175,9 @@ public void removeSection(TranslucentData oldData, long sectionPos) { } /** - * Integrates the data from a geometry collector into GFNI. The geometry - * collector contains the translucent face planes of a single section. This - * method may also remove the section if it has become irrelevant. + * Integrates the data from a geometry collector into GFNI or direct triggering. */ - public void integrateTranslucentData(TranslucentData oldData, TranslucentData newData, Vector3dc cameraPos, - BiConsumer triggerSectionCallback) { + public void integrateTranslucentData(TranslucentData oldData, TranslucentData newData, Sorter sorter, Vector3dc cameraPos, BiConsumer triggerSectionCallback) { if (oldData == newData) { return; } @@ -200,21 +193,23 @@ public void integrateTranslucentData(TranslucentData oldData, TranslucentData ne this.catchupData = dynamicData; var movement = new CameraMovement(dynamicData.getInitialCameraPos(), cameraPos); + // retrieve the geometry planes for integrating this section from the sorter that was used. + /* This ensures that even if we delete the geometry planes from the data itself, any sorters that still have reference to it are able to re-integrate the dynamic TS data. The scenario is that when there are two racing meshing tasks, of which the second one can reuse the original data but the first one makes new data. The first one makes it so the old and new data are different, and then the second one re-uses the previous old data, which is still available because they were dispatched at the same time and before the first task was completed to update the TS data on the RS. This means that the old and new data are different, so that integration is necessary, but the new data was already integrated two results ago. The solution is that we store the geometry planes necessary for integration on the sorter, since it can hold a reference to them even if they get cleared from the TS data after it's been integrated.*/ + var geometryPlanes = ((DynamicSorter) sorter).getGeometryPlanes(); + if (dynamicData instanceof DynamicTopoData topoSortData) { if (topoSortData.GFNITriggerEnabled()) { - this.gfni.integrateSection(this, pos, topoSortData, movement); - } else { - // remove the trigger data since this section is never going to get gfni - // triggering (there's no option to add sections to GFNI later currently) - topoSortData.discardGeometryPlanes(); + this.gfni.integrateSection(this, pos, geometryPlanes, movement); } if (topoSortData.directTriggerEnabled()) { this.direct.integrateSection(this, pos, topoSortData, movement); } } else { - this.gfni.integrateSection(this, pos, dynamicData, movement); + this.gfni.integrateSection(this, pos, geometryPlanes, movement); } + dynamicData.discardGeometryPlanesAfterIntegration(); + this.triggerSectionCallback = null; this.catchupData = null; } else { From 7d86fa6814eacc17bcd85a1fcbb39943280ae7a7 Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 24 Jun 2026 16:48:23 +0200 Subject: [PATCH 11/27] Fix crashes resulting from unsafe concurrency in async culling (#3756) Add a new abstraction for concurrent access to the collection of RenderSections and implemented a queue-based storage system. It avoids unsafe concurrent access by avoiding it entirely and applying changes at natural checkpoints on the main thread. --- .../render/chunk/RenderSectionManager.java | 66 ++++++--- .../lists/FallbackVisibleChunkCollector.java | 12 +- .../chunk/occlusion/OcclusionCuller.java | 22 +-- .../chunk/storage/QueuedSectionStorage.java | 140 ++++++++++++++++++ .../render/chunk/storage/SectionStorage.java | 39 +++++ .../world/cloned/ClonedChunkSectionCache.java | 12 +- 6 files changed, 240 insertions(+), 51 deletions(-) create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/QueuedSectionStorage.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/SectionStorage.java diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java index 1ee2e7ea32..f90a9105ed 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java @@ -1,9 +1,6 @@ package net.caffeinemc.mods.sodium.client.render.chunk; import com.mojang.blaze3d.textures.GpuSampler; -import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; -import it.unimi.dsi.fastutil.longs.Long2ReferenceMaps; -import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; import it.unimi.dsi.fastutil.objects.*; import net.caffeinemc.mods.sodium.api.texture.SpriteUtil; import net.caffeinemc.mods.sodium.client.SodiumClientMod; @@ -24,6 +21,8 @@ import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.*; import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegion; import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegionManager; +import net.caffeinemc.mods.sodium.client.render.chunk.storage.QueuedSectionStorage; +import net.caffeinemc.mods.sodium.client.render.chunk.storage.SectionStorage; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortBehavior; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortBehavior.PriorityMode; @@ -60,6 +59,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; public class RenderSectionManager { private static final float NEARBY_REBUILD_DISTANCE = Mth.square(16.0f); @@ -74,7 +74,7 @@ public class RenderSectionManager { private final RenderRegionManager regions; private final ClonedChunkSectionCache sectionCache; - private final Long2ReferenceMap sectionByPosition = new Long2ReferenceOpenHashMap<>(); + private final SectionStorage renderSections = new QueuedSectionStorage(); private final ConcurrentLinkedDeque> buildResults = new ConcurrentLinkedDeque<>(); private final JobDurationEstimator jobDurationEstimator = new JobDurationEstimator(); @@ -149,7 +149,7 @@ public RenderSectionManager(ClientLevel level, int renderDistance, SortBehavior this.sectionCache = new ClonedChunkSectionCache(this.level); this.renderLists = SortedRenderLists.empty(); - this.occlusionCuller = new OcclusionCuller(Long2ReferenceMaps.unmodifiable(this.sectionByPosition), this.level); + this.occlusionCuller = new OcclusionCuller(this.renderSections, this.level); this.renderableSectionTree = new RemovableMultiForest(renderDistance); @@ -184,6 +184,9 @@ public void prepareRenderTrees(Camera camera, Viewport viewport, FogParameters f // cancel task if not in progress if (this.pendingTask != null && this.pendingTask.cancelIfNotStarted()) { this.pendingTask = null; + + // end the safe read phase on task cancellation + this.renderSections.endSafeReadPhase(); } // consume the results of completed tasks @@ -242,6 +245,9 @@ private void consumeCullTaskResults(boolean waitForCompletion) { this.invalidateRenderLists(); this.pendingTask = null; + + // end the safe read phase on task completion + this.renderSections.endSafeReadPhase(); } private static Thread makeAsyncCullThread(Runnable runnable) { @@ -261,6 +267,7 @@ private void scheduleAsyncWork(Camera camera, Viewport viewport, FogParameters f var useOcclusionCulling = this.shouldUseOcclusionCulling(camera, spectator); this.pendingTask = new CullTask(viewport, searchDistanceRegular, searchDistanceLocal, this.frame, this.occlusionCuller, useOcclusionCulling, this.level); + this.renderSections.startSafeReadPhase(); this.pendingTask.submitTo(this.asyncCullExecutor); // only clear the graph update if we actually scheduled a task. Otherwise, the currently running task might not pick up on the change and no additional task would have been scheduled. @@ -313,7 +320,7 @@ private void readRenderListFromTree(Viewport viewport, FogParameters fogParamete private void renderOutOfGraph(Viewport viewport, FogParameters fogParameters) { var searchDistance = this.getSearchDistance(fogParameters); - var visitor = new FallbackVisibleChunkCollector(viewport, searchDistance, this.frame, this.sectionByPosition, this.regions, this.level); + var visitor = new FallbackVisibleChunkCollector(viewport, searchDistance, this.frame, this.renderSections, this.regions, this.level); this.renderableSectionTree.prepareForTraversal(); this.renderableSectionTree.traverse(visitor, viewport, searchDistance); @@ -327,7 +334,9 @@ private void renderOutOfGraph(Viewport viewport, FogParameters fogParameters) { private boolean isOutOfGraph(SectionPos pos) { var sectionY = pos.getY(); - return this.level.getMinSectionY() <= sectionY && sectionY <= this.level.getMaxSectionY() && !this.sectionByPosition.containsKey(pos.asLong()); + return this.level.getMinSectionY() <= sectionY && + sectionY <= this.level.getMaxSectionY() && + !this.renderSections.hasSectionConsistent(pos.asLong()); } public void markGraphDirty() { @@ -387,7 +396,7 @@ public void beforeSectionUpdates() { public void onSectionAdded(int x, int y, int z) { long key = SectionPos.asLong(x, y, z); - if (this.sectionByPosition.containsKey(key)) { + if (this.renderSections.hasSectionConsistent(key)) { return; } @@ -396,7 +405,7 @@ public void onSectionAdded(int x, int y, int z) { RenderSection renderSection = new RenderSection(region, x, y, z); region.addSection(renderSection); - this.sectionByPosition.put(key, renderSection); + this.renderSections.queuePut(key, renderSection); ChunkAccess chunk = this.level.getChunk(x, z); LevelChunkSection section = chunk.getSections()[this.level.getSectionIndexFromSectionY(y)]; @@ -416,7 +425,7 @@ public void onSectionAdded(int x, int y, int z) { public void onSectionRemoved(int x, int y, int z) { long sectionPos = SectionPos.asLong(x, y, z); - RenderSection section = this.sectionByPosition.remove(sectionPos); + RenderSection section = this.renderSections.queueRemove(sectionPos); if (section == null) { return; @@ -480,8 +489,7 @@ public void tickVisibleRenders() { } private boolean isSectionEmpty(int x, int y, int z) { - long key = SectionPos.asLong(x, y, z); - RenderSection section = this.sectionByPosition.get(key); + RenderSection section = this.renderSections.getCurrent(x, y, z); if (section == null) { return true; @@ -777,7 +785,7 @@ private void submitDeferredSectionTasks(ChunkJobCollector collector, UploadResou } while (!this.taskLists.isEmpty() && collector.hasBudgetRemaining() && uploadBudget.isAvailable()) { - var section = this.sectionByPosition.get(this.taskLists.dequeueNextSectionPos()); + var section = this.renderSections.getConsistent(this.taskLists.dequeueNextSectionPos()); if (section != null) { submitSectionTask(collector, section, uploadBudget); } @@ -903,17 +911,24 @@ public ChunkBuilder getBuilder() { } public void destroy() { - this.builder.shutdown(); // stop all the workers, and cancel any tasks + // stop all the workers and cancel any tasks + this.builder.shutdown(); + // shutdown async task executor and wait for it to terminate this.asyncCullExecutor.shutdownNow(); + try { + if (!this.asyncCullExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + throw new RuntimeException("Shutting down async culling task executor timed out"); + } + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while waiting for async culling task executor to shutdown", e); + } for (var result : this.collectChunkBuildResults()) { result.destroy(); // delete resources for any pending tasks (including those that were cancelled) } - for (var section : this.sectionByPosition.values()) { - section.delete(); - } + this.renderSections.deleteAll(); this.sectionsWithGlobalEntities.clear(); @@ -926,7 +941,7 @@ public void destroy() { } public int getTotalSections() { - return this.sectionByPosition.size(); + return this.renderSections.size(); } public int getVisibleChunkCount() { @@ -966,7 +981,7 @@ private boolean upgradePendingUpdate(RenderSection section, int updateType) { } public void scheduleSort(long sectionPos, boolean isDirectTrigger) { - RenderSection section = this.sectionByPosition.get(sectionPos); + RenderSection section = this.renderSections.getConsistent(sectionPos); if (section != null) { int pendingUpdate = ChunkUpdateTypes.SORT; @@ -984,9 +999,10 @@ public void scheduleSort(long sectionPos, boolean isDirectTrigger) { public void scheduleRebuild(int x, int y, int z, boolean playerChanged) { RenderAsserts.validateCurrentThread(); - this.sectionCache.invalidate(x, y, z); + var key = SectionPos.asLong(x, y, z); + this.sectionCache.invalidate(key); - RenderSection section = this.sectionByPosition.get(SectionPos.asLong(x, y, z)); + RenderSection section = this.renderSections.getConsistent(key); if (section != null && section.isBuilt()) { int pendingUpdate; @@ -1051,7 +1067,7 @@ private void disconnectNeighborNodes(RenderSection render) { } private RenderSection getRenderSection(int x, int y, int z) { - return this.sectionByPosition.get(SectionPos.asLong(x, y, z)); + return this.renderSections.getConsistent(SectionPos.asLong(x, y, z)); } public Collection getDebugStrings(boolean verbose) { @@ -1131,7 +1147,11 @@ public Collection getDebugStrings(boolean verbose) { var cullState = this.pendingTask == null ? "Idle" : this.pendingTask.isDone() ? "Done" : "Running"; var cullDuration = this.averageCullDurationNanos == -1 ? "?" : String.format("%.1fms", this.averageCullDurationNanos / 1_000_000.0); - list.add(String.format("Async Culling: %s (avg %s)", cullState, cullDuration)); + if (verbose) { + list.add(String.format("%s AC: %s (avg %s)", this.renderSections.getDebugInfo(), cullState, cullDuration)); + } else { + list.add(String.format("Async Culling: %s (avg %s)", cullState, cullDuration)); + } return list; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/FallbackVisibleChunkCollector.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/FallbackVisibleChunkCollector.java index 83587acc72..bab6e49da2 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/FallbackVisibleChunkCollector.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/FallbackVisibleChunkCollector.java @@ -1,20 +1,18 @@ package net.caffeinemc.mods.sodium.client.render.chunk.lists; -import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; -import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.CullType; import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegionManager; +import net.caffeinemc.mods.sodium.client.render.chunk.storage.SectionStorage; import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; -import net.minecraft.core.SectionPos; import net.minecraft.world.level.Level; public class FallbackVisibleChunkCollector extends TaskCollectingTree implements CoordinateSectionVisitor { - private final Long2ReferenceMap sectionByPosition; + private final SectionStorage sections; private final VisibleChunkCollector renderListCollector; - public FallbackVisibleChunkCollector(Viewport viewport, float buildDistance, int frame, Long2ReferenceMap sectionByPosition, RenderRegionManager regions, Level level) { + public FallbackVisibleChunkCollector(Viewport viewport, float buildDistance, int frame, SectionStorage sections, RenderRegionManager regions, Level level) { super(viewport, buildDistance, frame, CullType.LOCAL, level); - this.sectionByPosition = sectionByPosition; + this.sections = sections; this.renderListCollector = new VisibleChunkCollector(regions, frame); } @@ -26,7 +24,7 @@ public SortedRenderLists createRenderLists(Viewport viewport) { public void visit(int x, int y, int z) { this.renderListCollector.visit(x, y, z); - var section = this.sectionByPosition.get(SectionPos.asLong(x, y, z)); + var section = this.sections.getCurrent(x, y, z); if (section == null) { return; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java index 3d0525a002..096811e510 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java @@ -1,7 +1,7 @@ package net.caffeinemc.mods.sodium.client.render.chunk.occlusion; -import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.caffeinemc.mods.sodium.client.render.chunk.storage.SectionStorage; import net.caffeinemc.mods.sodium.client.render.viewport.CameraTransform; import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.caffeinemc.mods.sodium.client.util.collections.DoubleBufferedQueue; @@ -19,7 +19,7 @@ * Not wide visible implies not regular visible implies not frustum visible. */ public class OcclusionCuller { - private final Long2ReferenceMap sections; + private final SectionStorage sections; private final Level level; private final DoubleBufferedQueue queue = new DoubleBufferedQueue<>(); @@ -204,7 +204,7 @@ private static int getOutwardDirectionsWide(SectionPos origin, RenderSection sec } - public OcclusionCuller(Long2ReferenceMap sections, Level level) { + public OcclusionCuller(SectionStorage sections, Level level) { this.sections = sections; this.level = level; } @@ -246,7 +246,7 @@ public void findVisible(GraphOcclusionVisitor visitorWide, } } - if (this.getRenderSection(this.origin) == null) { + if (this.sections.getCurrent(this.origin) == null) { // origin outside of world this.inBoundsOrigin = null; } @@ -506,7 +506,7 @@ private void addNearbySections(Viewport viewport) { continue; } - var section = this.getRenderSection(originX + dx, originY + dy, originZ + dz); + var section = this.sections.getCurrent(originX + dx, originY + dy, originZ + dz); // additionally render not yet visited but visible sections if (section != null && section.getSearchToken() != this.token && isWithinNearbySectionFrustum(viewport, section)) { @@ -538,7 +538,7 @@ private void init(WriteQueue queue) { } private void initWithinWorld(WriteQueue queue) { - var originSection = this.getRenderSection(this.origin.getX(), this.origin.getY(), this.origin.getZ()); + var originSection = this.sections.getCurrent(this.origin); if (originSection == null) { return; @@ -639,7 +639,7 @@ else if (layer <= 2 * radius) { } private void tryInitNode(WriteQueue queue, int x, int y, int z, int direction) { - var section = this.getRenderSection(x, y, z); + var section = this.sections.getCurrent(x, y, z); if (section == null) { return; @@ -647,12 +647,4 @@ private void tryInitNode(WriteQueue queue, int x, int y, int z, i this.visitNode(queue, section, direction, true, true, true); } - - private RenderSection getRenderSection(int x, int y, int z) { - return this.sections.get(SectionPos.asLong(x, y, z)); - } - - private RenderSection getRenderSection(SectionPos pos) { - return this.sections.get(pos.asLong()); - } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/QueuedSectionStorage.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/QueuedSectionStorage.java new file mode 100644 index 0000000000..d5fe21c846 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/QueuedSectionStorage.java @@ -0,0 +1,140 @@ +package net.caffeinemc.mods.sodium.client.render.chunk.storage; + +import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; +import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; +import it.unimi.dsi.fastutil.longs.LongOpenHashSet; +import it.unimi.dsi.fastutil.longs.LongSet; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.minecraft.core.SectionPos; + +public class QueuedSectionStorage implements SectionStorage { + private final Long2ReferenceMap sections = new Long2ReferenceOpenHashMap<>(); + private final Long2ReferenceMap queuedPuts = new Long2ReferenceOpenHashMap<>(); + private final LongSet queuedRemovals = new LongOpenHashSet(); + private boolean isQueueing = false; + private int lastPutQueueSize = 0; + private int lastRemoveQueueSize = 0; + + @Override + public RenderSection getCurrent(SectionPos pos) { + return this.sections.get(pos.asLong()); + } + + @Override + public RenderSection getCurrent(int x, int y, int z) { + return this.sections.get(SectionPos.asLong(x, y, z)); + } + + @Override + public RenderSection getCurrent(long key) { + return this.sections.get(key); + } + + @Override + public RenderSection getConsistent(long key) { + if (!this.isQueueing) { + return this.sections.get(key); + } + + var queuedPut = this.queuedPuts.get(key); + if (queuedPut != null) { + return queuedPut; + } + + if (this.queuedRemovals.contains(key)) { + return null; + } + + return this.sections.get(key); + } + + @Override + public boolean hasSectionConsistent(long key) { + return this.getConsistent(key) != null; + } + + @Override + public void queuePut(long key, RenderSection newSection) { + if (this.isQueueing) { + this.queuedRemovals.remove(key); + this.queuedPuts.put(key, newSection); + } else { + this.sections.put(key, newSection); + } + } + + @Override + public RenderSection queueRemove(long key) { + if (this.isQueueing) { + var present = this.sections.get(key); + if (present != null) { + this.queuedRemovals.add(key); + } + var removedPut = this.queuedPuts.remove(key); + if (removedPut != null) { + return removedPut; + } + return present; + } else { + return this.sections.remove(key); + } + } + + @Override + public void deleteAll() { + for (var section : this.sections.values()) { + section.delete(); + } + for (var section : this.queuedPuts.values()) { + section.delete(); + } + this.sections.clear(); + this.queuedPuts.clear(); + this.queuedRemovals.clear(); + } + + @Override + public int size() { + return this.sections.size(); + } + + @Override + public void startSafeReadPhase() { + this.isQueueing = true; + } + + @Override + public void endSafeReadPhase() { + if (this.isQueueing && (!this.queuedPuts.isEmpty() || !this.queuedRemovals.isEmpty())) { + this.lastPutQueueSize = this.queuedPuts.size(); + this.lastRemoveQueueSize = this.queuedRemovals.size(); + + // interleave puts and removals to avoid hashmap rehashing if possible + var putIterator = this.queuedPuts.long2ReferenceEntrySet().iterator(); + var removeIterator = this.queuedRemovals.longIterator(); + var madeChange = true; + while (madeChange) { + madeChange = false; + if (putIterator.hasNext()) { + var entry = putIterator.next(); + this.sections.put(entry.getLongKey(), entry.getValue()); + madeChange = true; + } + if (removeIterator.hasNext()) { + this.sections.remove(removeIterator.nextLong()); + madeChange = true; + } + } + + this.queuedPuts.clear(); + this.queuedRemovals.clear(); + } + + this.isQueueing = false; + } + + @Override + public String getDebugInfo() { + return String.format("QD: put %03d/del %03d", this.lastPutQueueSize, this.lastRemoveQueueSize); + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/SectionStorage.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/SectionStorage.java new file mode 100644 index 0000000000..79fce003e9 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/storage/SectionStorage.java @@ -0,0 +1,39 @@ +package net.caffeinemc.mods.sodium.client.render.chunk.storage; + +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.minecraft.core.SectionPos; + +/** + * Controls access to the map of render sections. + * + * During the safe read phase it is safe to call {@code getCurrent} methods on a thread other than the one that started the phase. Otherwise, only one thread may use this structure at a time, and starting and ending the safe phase is also not allowed concurrently with other operations. + */ +public interface SectionStorage { + default RenderSection getCurrent(SectionPos pos) { + return this.getCurrent(pos.asLong()); + } + + default RenderSection getCurrent(int x, int y, int z) { + return this.getCurrent(SectionPos.asLong(x, y, z)); + } + + RenderSection getCurrent(long key); + + RenderSection getConsistent(long key); + + boolean hasSectionConsistent(long key); + + void queuePut(long key, RenderSection newSection); + + RenderSection queueRemove(long key); + + void deleteAll(); + + int size(); + + void startSafeReadPhase(); + + void endSafeReadPhase(); + + String getDebugInfo(); +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSectionCache.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSectionCache.java index a1923f1a7d..bce9c897eb 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSectionCache.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSectionCache.java @@ -1,14 +1,14 @@ package net.caffeinemc.mods.sodium.client.world.cloned; import it.unimi.dsi.fastutil.longs.Long2ReferenceLinkedOpenHashMap; -import org.jspecify.annotations.NonNull; -import org.jspecify.annotations.Nullable; - -import java.util.concurrent.TimeUnit; import net.minecraft.core.SectionPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + +import java.util.concurrent.TimeUnit; public class ClonedChunkSectionCache { private static final int MAX_CACHE_SIZE = 512; /* number of entries */ @@ -68,8 +68,8 @@ private ClonedChunkSection clone(int x, int y, int z) { return new ClonedChunkSection(this.level, chunk, section, SectionPos.of(x, y, z)); } - public void invalidate(int x, int y, int z) { - this.positionToEntry.remove(SectionPos.asLong(x, y, z)); + public void invalidate(long key) { + this.positionToEntry.remove(key); } private static long getMonotonicTimeSource() { From 71959d655a7ca439b1e3c28b37b884e1a513e987 Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 24 Jun 2026 16:59:18 +0200 Subject: [PATCH 12/27] Update breaks clauses for iris --- fabric/src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 19b20f8b39..90c52bfe8e 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -93,7 +93,7 @@ "custom_hud" : "<3.4.2", "farsight" : "<=1.21-4.3", "iceberg" : "<1.2.7", - "iris" : "<=1.10.9", + "iris" : "<=1.11.1", "movingelevators" : "<=1.4.7", "notenoughcrashes" : "<4.4.8", "noxesium" : "<2.3.3", From e77be92aabd945cd58516addb47fccd55c08b908 Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 24 Jun 2026 17:09:53 +0200 Subject: [PATCH 13/27] Update changelog and bump version to 0.9.1-beta.2 --- CHANGELOG.md | 7 +++++-- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1f49c7e45..377a9c2bd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Everything above the line is ignored and not included in the changelog. Everything below will be in the changelog on GitHub, Modrinth and CurseForge. ---------- -Sodium [SodiumVersion]() for Minecraft [MCVersion]() introduces asynchronous occlusion culling alongside some other small improvements and bug fixes. +Sodium [SodiumVersion]() for Minecraft [MCVersion]() introduces asynchronous occlusion culling alongside other small improvements and fixes for crashes to improve stability. This generally improves performance and avoids the frame rate dropping when the camera is moved, especially at high render distances. This feature has been in the works for a long time now, and together with the release for Minecraft 26.2, we've decided to release it. More work is planned, including improvements to the task scheduling system and optimizations to improve responsiveness. @@ -15,4 +15,7 @@ This generally improves performance and avoids the frame rate dropping when the - Improve the presentation and wording of some video options ([#3700](https://github.com/CaffeineMC/sodium/pull/3700)) - Fix water color handling - Fix broken block tinting by not incorrectly converting to the wrong color format -- Fix fluid color overrides not being applied ([#3729](https://github.com/CaffeineMC/sodium/pull/3729)) \ No newline at end of file +- Fix fluid color overrides not being applied ([#3729](https://github.com/CaffeineMC/sodium/pull/3729)) +- Fix crash "getResources is null" ([#3752](https://github.com/CaffeineMC/sodium/pull/3752)) +- Fix crash "centroid is null," "allQuads is null," and "geometryPlanes is null" ([#3757](https://github.com/CaffeineMC/sodium/pull/3757)) +- Fix crashes resulting from unsafe concurrency in async culling "ArrayIndexOutOfBoundsException" ([#3756](https://github.com/CaffeineMC/sodium/pull/3756)) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index a23465f972..22fb7c312e 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.9.0" + val MOD_VERSION: String = "0.9.1-beta.2" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 2304571d9bc9ef4987c8286956758a3b87de98ab Mon Sep 17 00:00:00 2001 From: douira Date: Sat, 27 Jun 2026 15:44:55 +0200 Subject: [PATCH 14/27] Cleanup imports and apply .this qualifier where necessary --- .../blockentity/BlockEntityRenderHandler.java | 2 - .../api/config/option/SteppedValidator.java | 2 +- .../checks/PostLaunchChecks.java | 2 - .../compatibility/checks/PreLaunchChecks.java | 1 - .../environment/GlContextInfo.java | 1 - .../probe/GraphicsAdapterProbe.java | 1 - .../probe/GraphicsAdapterVendor.java | 1 - .../api/d3dkmt/D3DKMTEnumAdaptersStruct.java | 2 - .../windows/api/msgbox/MsgBoxCallbackI.java | 2 - .../config/builder/EnumOptionBuilderImpl.java | 6 +- .../ExternalButtonOptionBuilderImpl.java | 2 +- .../builder/IntegerOptionBuilderImpl.java | 4 +- .../config/builder/OptionBuilderImpl.java | 4 +- .../builder/StatefulOptionBuilderImpl.java | 16 +- .../builder/StaticOptionBuilderImpl.java | 2 +- .../client/config/structure/Config.java | 10 +- .../client/data/config/MixinConfig.java | 1 - .../sodium/client/gl/arena/GlBufferArena.java | 4 +- .../client/gl/attribute/GlVertexFormat.java | 3 +- .../client/gl/buffer/GlBufferStreamer.java | 27 +-- .../client/gl/device/GLRenderDevice.java | 7 +- .../sodium/client/gl/shader/ShaderLoader.java | 7 +- .../sodium/client/gl/shader/ShaderParser.java | 12 +- .../client/gui/FullscreenResolutionRange.java | 2 +- .../mods/sodium/client/gui/GUIScaleRange.java | 2 +- .../client/gui/VideoSettingsScreen.java | 14 +- .../gui/options/control/ControlElement.java | 4 +- .../gui/options/control/CyclingControl.java | 6 +- .../control/ExternalButtonControl.java | 2 +- .../gui/options/control/SliderControl.java | 4 +- .../control/StatefulControlElement.java | 2 +- .../gui/options/control/TickBoxControl.java | 6 +- .../client/gui/prompt/ScreenPrompt.java | 2 +- .../gui/widgets/CenteredFlatWidget.java | 6 +- .../client/gui/widgets/FlatButtonWidget.java | 4 +- .../client/gui/widgets/OptionListWidget.java | 2 +- .../model/color/DefaultColorProviders.java | 2 +- .../client/model/light/LightPipeline.java | 1 - .../light/flat/FlatFluidLightPipeline.java | 6 +- .../model/light/flat/FlatLightPipeline.java | 10 +- .../client/model/light/smooth/AoFaceData.java | 1 - .../light/smooth/SmoothLightPipeline.java | 18 +- .../sodium/client/model/quad/ModelQuad.java | 4 +- .../client/model/quad/ModelQuadView.java | 30 ++-- .../quad/properties/ModelQuadFacing.java | 3 +- .../client/render/SodiumWorldRenderer.java | 4 +- .../chunk/BlockEntityRenderHandlerImpl.java | 2 - .../render/chunk/ChunkRenderMatrices.java | 3 - .../render/chunk/ExtendedBlockEntityType.java | 2 - .../render/chunk/NonStoringBuilderPool.java | 6 +- .../render/chunk/RenderSectionManager.java | 18 +- .../buffers/BakedChunkModelBuilder.java | 4 +- .../compile/buffers/ChunkVertexConsumer.java | 24 +-- .../chunk/compile/estimation/Estimator.java | 4 +- .../estimation/MeshTaskSizeEstimator.java | 1 - .../chunk/compile/executor/ChunkBuilder.java | 2 +- .../chunk/compile/pipeline/BlockRenderer.java | 15 +- .../pipeline/DefaultFluidRenderer.java | 20 +-- .../chunk/compile/pipeline/FluidRenderer.java | 2 - .../tasks/ChunkBuilderMeshingTask.java | 8 +- .../chunk/lists/TaskCollectingTree.java | 2 +- .../chunk/occlusion/DirectionalVisGraph.java | 4 +- .../chunk/occlusion/OcclusionCuller.java | 20 +-- .../render/chunk/region/RenderRegion.java | 2 +- .../chunk/shader/DefaultShaderInterface.java | 6 +- .../terrain/DefaultTerrainRenderPasses.java | 1 - .../chunk/terrain/TerrainRenderPass.java | 5 +- .../TranslucentGeometryCollector.java | 4 +- .../bsp_tree/BSPSortState.java | 6 +- .../trigger/DirectTriggers.java | 12 +- .../trigger/NormalList.java | 1 - .../client/render/chunk/tree/Forest.java | 2 +- .../render/chunk/tree/TraversableTree.java | 8 +- .../builder/ChunkMeshBufferBuilder.java | 1 - .../client/render/helper/ModelHelper.java | 10 +- .../client/render/helper/NormalHelper.java | 3 +- .../model/ImprovedItemModelBuilderBase.java | 20 ++- .../model/AbstractBlockRenderContext.java | 17 +- .../client/render/model/EncodingFormat.java | 1 - .../render/model/MutableQuadViewImpl.java | 156 +++++++++--------- .../client/render/model/QuadViewImpl.java | 127 +++++++------- .../texture/SodiumSpriteFinderImpl.java | 44 ++--- .../viewport/frustum/SimpleFrustum.java | 94 +++++------ .../client/services/DefaultModelEmitter.java | 4 +- .../client/services/PlatformModelAccess.java | 4 +- .../client/services/PlatformModelEmitter.java | 4 +- .../services/SodiumModelDataContainer.java | 6 +- .../util/interval_tree/DoubleInterval.java | 34 ++-- .../client/util/interval_tree/Interval.java | 22 +-- .../client/util/interval_tree/TreeNode.java | 8 +- .../mods/sodium/client/world/LevelSlice.java | 15 +- .../client/world/biome/LevelColorCache.java | 2 +- .../world/cloned/ChunkRenderContext.java | 3 +- .../world/cloned/ClonedChunkSection.java | 6 +- .../mods/sodium/mixin/SodiumMixinPlugin.java | 4 +- .../mods/sodium/mixin/core/WindowMixin.java | 3 - .../core/render/BlockEntityTypeMixin.java | 10 +- .../mixin/core/render/TextureAtlasMixin.java | 2 +- .../render/frustum/GameRendererAccessor.java | 1 - .../consumer/BufferBuilderMixin.java | 2 +- .../consumer/VertexMultiConsumerMixin.java | 4 +- .../render/texture/TextureAtlasAccessor.java | 1 - .../world/ChunkSectionsToRenderMixin.java | 4 +- .../core/render/world/GameRendererMixin.java | 2 +- .../core/render/world/LevelRendererMixin.java | 4 +- .../core/world/biome/ClientLevelMixin.java | 3 - .../core/world/map/ClientChunkCacheMixin.java | 2 - .../gui/hooks/console/GameRendererMixin.java | 3 - .../hooks/debug/DebugEntryMemoryMixin.java | 2 - .../render/entity/ModelPartMixin.java | 11 +- .../shadows/ShadowFeatureRendererMixin.java | 11 +- .../render/gui/font/BakedGlyphMixin.java | 12 +- .../matrix_stack/VertexConsumerMixin.java | 1 - .../animations/tracking/GuiGraphicsMixin.java | 3 - .../tracking/ModelBlockRendererMixin.java | 5 +- .../tracking/SpriteContentsTickerMixin.java | 4 +- .../tracking/TextureSheetParticleMixin.java | 7 +- .../context_creation/WindowMixin.java | 17 -- .../event_loop/RenderSystemMixin.java | 2 - .../GameRendererMixin.java | 2 +- .../fabric/block/FabricBlockAccess.java | 16 +- .../fabric/level/FabricLevelAccess.java | 16 -- .../fabric/model/FabricModelAccess.java | 4 +- .../fabric/model/FabricMutableProvider.java | 8 +- .../fabric/render/FluidRendererImpl.java | 18 +- .../mixin/core/model/quad/BakedQuadMixin.java | 2 +- .../features/world/biome/BiomeMixin.java | 8 +- .../client/render/frapi/SodiumRenderer.java | 5 +- .../client/render/frapi/mesh/MeshImpl.java | 2 +- .../render/frapi/mesh/MeshViewImpl.java | 12 +- .../render/frapi/mesh/MutableMeshImpl.java | 50 +++--- .../frapi/render/ItemRenderContext.java | 52 +++--- .../render/NonTerrainBlockRenderContext.java | 64 +++---- .../render/frapi/render/QuadToPosPipe.java | 15 +- .../frapi/wrapper/MutableQuadViewWrapper.java | 85 +++++----- .../render/frapi/wrapper/QuadViewWrapper.java | 109 ++++++------ .../mixin/frapi/ItemFeatureRendererMixin.java | 24 ++- .../mixin/frapi/MutableQuadViewImplMixin.java | 7 +- .../sodium/mixin/frapi/QuadViewImplMixin.java | 4 +- .../mixin/core/model/quad/BakedQuadMixin.java | 2 +- .../features/world/biome/BiomeMixin.java | 8 +- .../platform/neoforge/ClientHooksMixin.java | 3 - .../platform/neoforge/LevelSliceMixin.java | 8 +- .../neoforge/ResourcePackLoaderMixin.java | 1 - .../neoforge/block/NeoForgeBlockAccess.java | 16 +- .../level/NeoForgeLevelRenderHooks.java | 8 +- .../model/NeoForgeDynamicColorProvider.java | 8 +- .../neoforge/model/NeoForgeModelAccess.java | 4 +- .../neoforge/render/FluidRendererImpl.java | 14 +- .../neoforge/render/ForgeColorProviders.java | 3 - 150 files changed, 789 insertions(+), 928 deletions(-) diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/blockentity/BlockEntityRenderHandler.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/blockentity/BlockEntityRenderHandler.java index b5de855a17..5a1e7054af 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/blockentity/BlockEntityRenderHandler.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/blockentity/BlockEntityRenderHandler.java @@ -1,7 +1,5 @@ package net.caffeinemc.mods.sodium.api.blockentity; -import java.util.function.Predicate; - import net.caffeinemc.mods.sodium.api.internal.DependencyInjection; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/config/option/SteppedValidator.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/config/option/SteppedValidator.java index d038304c8f..9bbc5db47d 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/config/option/SteppedValidator.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/config/option/SteppedValidator.java @@ -38,7 +38,7 @@ default boolean isValueValid(int value) { @Override default Integer getValidatedValue(Integer value, Supplier defaultValueSupplier) { - if (isValueValid(value)) { + if (this.isValueValid(value)) { return value; } return defaultValueSupplier.get(); diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PostLaunchChecks.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PostLaunchChecks.java index 6180199456..79be746ff2 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PostLaunchChecks.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PostLaunchChecks.java @@ -2,8 +2,6 @@ import net.caffeinemc.mods.sodium.client.compatibility.environment.GlContextInfo; import net.caffeinemc.mods.sodium.client.compatibility.workarounds.nvidia.NvidiaWorkarounds; -import net.caffeinemc.mods.sodium.client.console.Console; -import net.caffeinemc.mods.sodium.client.console.message.MessageLevel; import net.caffeinemc.mods.sodium.client.platform.NativeWindowHandle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PreLaunchChecks.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PreLaunchChecks.java index 069107aac8..044c49fb64 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PreLaunchChecks.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/checks/PreLaunchChecks.java @@ -8,7 +8,6 @@ import java.net.URL; import java.security.CodeSource; import java.security.ProtectionDomain; -import java.util.Locale; /** * Performs OpenGL driver validation before the game creates an OpenGL context. This runs during the earliest possible diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/GlContextInfo.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/GlContextInfo.java index 11c335e42e..f4aa02f263 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/GlContextInfo.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/GlContextInfo.java @@ -1,6 +1,5 @@ package net.caffeinemc.mods.sodium.client.compatibility.environment; -import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL11C; import java.util.Objects; diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterProbe.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterProbe.java index eb69a6451c..4b767e5934 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterProbe.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterProbe.java @@ -2,7 +2,6 @@ import net.caffeinemc.mods.sodium.client.compatibility.environment.OsUtils; import net.caffeinemc.mods.sodium.client.platform.windows.api.d3dkmt.D3DKMT; -import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterVendor.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterVendor.java index 657572d6eb..9fa33dcb2b 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterVendor.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/compatibility/environment/probe/GraphicsAdapterVendor.java @@ -3,7 +3,6 @@ import net.caffeinemc.mods.sodium.client.compatibility.environment.GlContextInfo; import org.jspecify.annotations.NonNull; -import java.util.Locale; import java.util.regex.Pattern; public enum GraphicsAdapterVendor { diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/d3dkmt/D3DKMTEnumAdaptersStruct.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/d3dkmt/D3DKMTEnumAdaptersStruct.java index 7a5f4d6850..8fdc427a3d 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/d3dkmt/D3DKMTEnumAdaptersStruct.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/d3dkmt/D3DKMTEnumAdaptersStruct.java @@ -8,8 +8,6 @@ import java.nio.ByteBuffer; -import static org.lwjgl.system.MemoryUtil.*; - // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/d3dkmthk/ns-d3dkmthk-_d3dkmt_enumadapters // typedef struct _D3DKMT_ENUMADAPTERS { // [in] ULONG NumAdapters; diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/msgbox/MsgBoxCallbackI.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/msgbox/MsgBoxCallbackI.java index f02c56a3ff..954fc8295a 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/msgbox/MsgBoxCallbackI.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/msgbox/MsgBoxCallbackI.java @@ -1,10 +1,8 @@ package net.caffeinemc.mods.sodium.client.platform.windows.api.msgbox; -import org.jspecify.annotations.NonNull; import org.lwjgl.system.Callback; import org.lwjgl.system.CallbackI; import org.lwjgl.system.NativeType; -import org.lwjgl.system.libffi.FFICIF; import java.lang.invoke.MethodHandles; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/EnumOptionBuilderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/EnumOptionBuilderImpl.java index dc0f8e17fb..5d337ba6e1 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/EnumOptionBuilderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/EnumOptionBuilderImpl.java @@ -82,15 +82,15 @@ Collection getDependencies() { } Class getEnumClass() { - return getFirstNotNull(this.enumClass, EnumOption::getEnumClass); + return this.getFirstNotNull(this.enumClass, EnumOption::getEnumClass); } DependentValue> getAllowedValues() { - return getFirstNotNull(this.allowedValues, EnumOption::getAllowedValues); + return this.getFirstNotNull(this.allowedValues, EnumOption::getAllowedValues); } Function getElementNameProvider() { - return getFirstNotNull(this.elementNameProvider, EnumOption::getElementNameProvider); + return this.getFirstNotNull(this.elementNameProvider, EnumOption::getElementNameProvider); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/ExternalButtonOptionBuilderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/ExternalButtonOptionBuilderImpl.java index 0abb62ec55..e5bf91dcec 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/ExternalButtonOptionBuilderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/ExternalButtonOptionBuilderImpl.java @@ -38,7 +38,7 @@ Class getOptionClass() { } Consumer getCurrentScreenConsumer() { - return getFirstNotNull(this.currentScreenConsumer, ExternalButtonOption::getCurrentScreenConsumer); + return this.getFirstNotNull(this.currentScreenConsumer, ExternalButtonOption::getCurrentScreenConsumer); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/IntegerOptionBuilderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/IntegerOptionBuilderImpl.java index 4822924fae..ec20606499 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/IntegerOptionBuilderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/IntegerOptionBuilderImpl.java @@ -67,11 +67,11 @@ Class getOptionClass() { } DependentValue getValidatorProvider() { - return getFirstNotNull(this.validatorProvider, IntegerOption::getValidatorProvider); + return this.getFirstNotNull(this.validatorProvider, IntegerOption::getValidatorProvider); } ControlValueFormatter getValueFormatter() { - return getFirstNotNull(this.valueFormatter, IntegerOption::getValueFormatter); + return this.getFirstNotNull(this.valueFormatter, IntegerOption::getValueFormatter); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/OptionBuilderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/OptionBuilderImpl.java index 2fca4a8518..c843ceba54 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/OptionBuilderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/OptionBuilderImpl.java @@ -70,11 +70,11 @@ public V getFirstNotNull(V overlayValue, Function extractor) { } Component getName() { - return getFirstNotNull(this.name, Option::getName); + return this.getFirstNotNull(this.name, Option::getName); } DependentValue getEnabled() { - return getFirstNotNull(this.enabled, Option::getEnabled); + return this.getFirstNotNull(this.enabled, Option::getEnabled); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StatefulOptionBuilderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StatefulOptionBuilderImpl.java index 55f2e3d8ff..7601defd33 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StatefulOptionBuilderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StatefulOptionBuilderImpl.java @@ -53,35 +53,35 @@ Collection getDependencies() { } StorageEventHandler getStorage() { - return getFirstNotNull(this.storage, StatefulOption::getStorage); + return this.getFirstNotNull(this.storage, StatefulOption::getStorage); } Function getTooltipProvider() { - return getFirstNotNull(this.tooltipProvider, StatefulOption::getTooltipProvider); + return this.getFirstNotNull(this.tooltipProvider, StatefulOption::getTooltipProvider); } OptionImpact getImpact() { - return getFirstNotNull(this.impact, StatefulOption::getImpact); + return this.getFirstNotNull(this.impact, StatefulOption::getImpact); } Set getFlags() { - return getFirstNotNull(this.flags, StatefulOption::getFlags); + return this.getFirstNotNull(this.flags, StatefulOption::getFlags); } DependentValue getDefaultValue() { - return getFirstNotNull(this.defaultValue, StatefulOption::getDefaultValue); + return this.getFirstNotNull(this.defaultValue, StatefulOption::getDefaultValue); } Boolean getControlHiddenWhenDisabled() { - return getFirstNotNull(this.controlHiddenWhenDisabled, StatefulOption::getControlHiddenWhenDisabled); + return this.getFirstNotNull(this.controlHiddenWhenDisabled, StatefulOption::getControlHiddenWhenDisabled); } OptionBinding getBinding() { - return getFirstNotNull(this.binding, StatefulOption::getBinding); + return this.getFirstNotNull(this.binding, StatefulOption::getBinding); } Consumer getApplyHook() { - return getFirstNotNull(this.applyHook, StatefulOption::getApplyHook); + return this.getFirstNotNull(this.applyHook, StatefulOption::getApplyHook); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StaticOptionBuilderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StaticOptionBuilderImpl.java index 89ebdf9bbc..6a813946ef 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StaticOptionBuilderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/builder/StaticOptionBuilderImpl.java @@ -20,7 +20,7 @@ void validateData() { } Component getTooltip() { - return getFirstNotNull(this.tooltip, StaticOption::getTooltip); + return this.getFirstNotNull(this.tooltip, StaticOption::getTooltip); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/Config.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/Config.java index 5cd875168e..c734880318 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/Config.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/Config.java @@ -41,7 +41,7 @@ public Config(List modOptions) { for (var option : this.options.values()) { option.loadValueInitial(); } - resetAllOptionsFromBindings(); + this.resetAllOptionsFromBindings(); } private void registerSearchIndex() { @@ -120,7 +120,7 @@ private void applyOptionChanges() { // apply override to option if it exists if (override != null) { var replacement = override.change(); - exchangeOption(options, i, replacement, option); + this.exchangeOption(options, i, replacement, option); } } } @@ -141,7 +141,7 @@ private void applyOptionChanges() { var change = overlay.change(); try { var overlaidOption = change.buildWithBaseOption(option); - exchangeOption(options, i, overlaidOption, option); + this.exchangeOption(options, i, overlaidOption, option); } catch (Exception e) { throw new IllegalArgumentException("Failed to apply overlay from '" + overlay.source() + "' to option '" + option.id + "'", e); } @@ -291,7 +291,7 @@ public void applyAllOptions() { if (flags == null) { return; } - processFlags(flags); + this.processFlags(flags); } public void applyOption(Identifier id) { @@ -307,7 +307,7 @@ public void applyOption(Identifier id) { if (flags == null) { return; } - processFlags(flags); + this.processFlags(flags); } public boolean anyOptionChanged() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/data/config/MixinConfig.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/data/config/MixinConfig.java index 022b4e75df..f4e90d69b5 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/data/config/MixinConfig.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/data/config/MixinConfig.java @@ -1,7 +1,6 @@ package net.caffeinemc.mods.sodium.client.data.config; import net.caffeinemc.mods.sodium.client.services.PlatformMixinOverrides; -import net.caffeinemc.mods.sodium.client.services.Services; import net.caffeinemc.mods.sodium.mixin.MixinOption; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/arena/GlBufferArena.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/arena/GlBufferArena.java index 2b5df04128..b3e5360f6a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/arena/GlBufferArena.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/arena/GlBufferArena.java @@ -345,7 +345,7 @@ public boolean upload(CommandList commandList, Stream stream, flo // If we weren't able to upload some buffers, they will have been left behind in the queue if (!queue.isEmpty()) { // resize to the new estimated capacity - this.resize(commandList, estimateNewCapacity(regionFillFractionInv, queue)); + this.resize(commandList, this.estimateNewCapacity(regionFillFractionInv, queue)); // Try again to upload any buffers that failed last time this.tryUploads(commandList, queue); @@ -361,7 +361,7 @@ public boolean upload(CommandList commandList, Stream stream, flo private long estimateNewCapacity(float regionFillFractionInv, List queue) { // Calculate the amount of memory needed for the remaining uploads - long requiredTotalSize = getRequiredTotalSize(queue); + long requiredTotalSize = this.getRequiredTotalSize(queue); int newSegmentCount = this.segmentCount + queue.size(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/attribute/GlVertexFormat.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/attribute/GlVertexFormat.java index b96f51860d..3034f1e257 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/attribute/GlVertexFormat.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/attribute/GlVertexFormat.java @@ -5,7 +5,6 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.caffeinemc.mods.sodium.client.render.vertex.VertexFormatAttribute; -import java.util.EnumMap; import java.util.Map; /** @@ -56,7 +55,7 @@ public String toString() { } public GlVertexAttributeBinding[] getShaderBindings() { - return bindings; + return this.bindings; } public static class Builder { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlBufferStreamer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlBufferStreamer.java index 15353f0d45..b9e00c71f1 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlBufferStreamer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlBufferStreamer.java @@ -1,12 +1,13 @@ package net.caffeinemc.mods.sodium.client.gl.buffer; +import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import net.caffeinemc.mods.sodium.client.SodiumClientMod; import net.caffeinemc.mods.sodium.client.gl.arena.staging.MappedStagingBuffer; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice; import net.caffeinemc.mods.sodium.client.gl.util.EnumBitField; -import org.lwjgl.opengl.*; -import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GL44C; import org.lwjgl.system.MemoryUtil; public class GlBufferStreamer { @@ -23,26 +24,26 @@ public GlBufferStreamer(CommandList commands, int initialCapacity, int stride) { this.stride = stride; if (SodiumClientMod.options().advanced.useAdvancedStagingBuffers && MappedStagingBuffer.isSupported(RenderDevice.INSTANCE) && (GL.getCapabilities().GL_ARB_shader_image_load_store && GL.getCapabilities().glMemoryBarrier != 0L)) { - this.buffer = commands.createImmutableBuffer(bufferSize, EnumBitField.of(GlBufferStorageFlags.PERSISTENT, GlBufferStorageFlags.MAP_WRITE)); + this.buffer = commands.createImmutableBuffer(this.bufferSize, EnumBitField.of(GlBufferStorageFlags.PERSISTENT, GlBufferStorageFlags.MAP_WRITE)); - this.mapping = commands.mapBuffer(this.buffer, 0, bufferSize, + this.mapping = commands.mapBuffer(this.buffer, 0, this.bufferSize, EnumBitField.of(GlBufferMapFlags.PERSISTENT, GlBufferMapFlags.WRITE, GlBufferMapFlags.EXPLICIT_FLUSH)); this.writeAddress = MemoryUtil.memAddress(this.mapping.getMemoryBuffer()); } else { this.buffer = commands.createMutableBuffer(); - commands.allocateStorage((GlMutableBuffer) this.buffer, bufferSize, GlBufferUsage.STREAM_DRAW); + commands.allocateStorage((GlMutableBuffer) this.buffer, this.bufferSize, GlBufferUsage.STREAM_DRAW); this.mapping = null; this.writeAddress = MemoryUtil.nmemAlloc(this.bufferSize); } - MemoryUtil.memSet(this.writeAddress, (byte) 0, bufferSize); // without this, I was getting random chunks with no fade. TODO: Check if this is still needed after the mesh check improvements + MemoryUtil.memSet(this.writeAddress, (byte) 0, this.bufferSize); // without this, I was getting random chunks with no fade. TODO: Check if this is still needed after the mesh check improvements } public void writeData(int index, int value) { // right now we only need int values... this could probably become more generic (if we ever need this again?) - int offset = index * stride; + int offset = index * this.stride; - if (offset + stride > bufferSize) { + if (offset + this.stride > this.bufferSize) { throw new IndexOutOfBoundsException("Attempted to write beyond the end of the buffer streamer"); } @@ -51,17 +52,17 @@ public void writeData(int index, int value) { // right now we only need int valu } public GlBuffer prepare(CommandList commandList) { // either flushes or uploads data. This could be replaced with a batching system, but I don't see the point with the tiny buffer we currently use it for. - if (requiresFlush) { - requiresFlush = false; + if (this.requiresFlush) { + this.requiresFlush = false; if (this.mapping != null) { - commandList.flushMappedRange(mapping, 0, (int) bufferSize); + commandList.flushMappedRange(this.mapping, 0, (int) this.bufferSize); GL44C.glMemoryBarrier(GL44C.GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); // TODO: I don't know yet if this is required. } else { - commandList.uploadDataToOffset((GlMutableBuffer) buffer, 0, writeAddress, (int) bufferSize); + commandList.uploadDataToOffset((GlMutableBuffer) this.buffer, 0, this.writeAddress, (int) this.bufferSize); } } - return buffer; + return this.buffer; } public void delete(CommandList commandList) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/GLRenderDevice.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/GLRenderDevice.java index acdc20d8aa..eb649c3d86 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/GLRenderDevice.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/GLRenderDevice.java @@ -9,6 +9,7 @@ import net.caffeinemc.mods.sodium.client.gl.tessellation.*; import net.caffeinemc.mods.sodium.client.gl.util.EnumBitField; import org.lwjgl.opengl.*; + import java.nio.ByteBuffer; public class GLRenderDevice implements RenderDevice { @@ -23,7 +24,7 @@ public class GLRenderDevice implements RenderDevice { @Override public CommandList createCommandList() { - GLRenderDevice.this.checkDeviceActive(); + this.checkDeviceActive(); return this.commandList; } @@ -222,7 +223,7 @@ public GlBufferMapping mapBuffer(GlBuffer buffer, long offset, long length, Enum @Override public void unmap(GlBufferMapping map) { - checkMapDisposed(map); + this.checkMapDisposed(map); GlBuffer buffer = map.getBufferObject(); @@ -235,7 +236,7 @@ public void unmap(GlBufferMapping map) { @Override public void flushMappedRange(GlBufferMapping map, int offset, int length) { - checkMapDisposed(map); + this.checkMapDisposed(map); GlBuffer buffer = map.getBufferObject(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderLoader.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderLoader.java index d690907f99..9099a35442 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderLoader.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderLoader.java @@ -1,15 +1,14 @@ package net.caffeinemc.mods.sodium.client.gl.shader; import com.google.common.base.Objects; -import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; +import net.minecraft.resources.Identifier; import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import net.minecraft.resources.Identifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ShaderLoader { private static final Logger LOGGER = LoggerFactory.getLogger("Sodium-ShaderLoader"); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderParser.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderParser.java index d464196006..b7b60cc016 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderParser.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/ShaderParser.java @@ -39,16 +39,16 @@ public void parseShader(String name, String src) { lineNumber++; if (line.startsWith("#version")) { this.lines.add(line); - this.lines.add(lineDirectiveFor(name, lineNumber)); + this.lines.add(this.lineDirectiveFor(name, lineNumber)); } else if (line.startsWith("#import")) { // add the original import statement as a comment for reference this.lines.add("// START " + line); - processImport(line); + this.processImport(line); // reset the line directive to the current file this.lines.add("// END " + line); - this.lines.add(lineDirectiveFor(name, lineNumber)); + this.lines.add(this.lineDirectiveFor(name, lineNumber)); } else { this.lines.add(line); } @@ -70,13 +70,13 @@ private String lineDirectiveFor(String name, int line) { } private void processImport(String line) { - Identifier name = parseImport(line); + Identifier name = this.parseImport(line); // mark the start of the imported file var nameString = name.toString(); - this.lines.add(lineDirectiveFor(nameString, 0)); + this.lines.add(this.lineDirectiveFor(nameString, 0)); - parseShader(nameString, ShaderLoader.getShaderSource(name)); + this.parseShader(nameString, ShaderLoader.getShaderSource(name)); } private static final Pattern IMPORT_PATTERN = Pattern.compile("#import <(?.*):(?.*)>"); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/FullscreenResolutionRange.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/FullscreenResolutionRange.java index afcb996f78..3a801c48a5 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/FullscreenResolutionRange.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/FullscreenResolutionRange.java @@ -29,6 +29,6 @@ public int step() { @Override public boolean isValueValid(int value) { - return value >= min(); + return value >= this.min(); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/GUIScaleRange.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/GUIScaleRange.java index c8e5ac4ba4..54c7b7a0d7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/GUIScaleRange.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/GUIScaleRange.java @@ -20,6 +20,6 @@ public int step() { @Override public boolean isValueValid(int value) { - return value >= min(); + return value >= this.min(); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/VideoSettingsScreen.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/VideoSettingsScreen.java index 247800518d..60f26b9fdb 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/VideoSettingsScreen.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/VideoSettingsScreen.java @@ -183,7 +183,7 @@ private void rebuild() { int topBarHeight = Layout.BUTTON_SHORT; this.searchWidget = new SearchWidget(this::onSearchResults, new Dim2i(x, y, w, topBarHeight)); - int topBarClear = topBarHeight + ifInsetY(Layout.INNER_MARGIN); + int topBarClear = topBarHeight + this.ifInsetY(Layout.INNER_MARGIN); this.pageList = new PageListWidget(new Dim2i(x, y + topBarClear, Layout.PAGE_LIST_WIDTH, h - topBarClear), this); this.addRenderableWidget(this.pageList); @@ -209,18 +209,18 @@ private void rebuild() { this.pageList.getLimitX(), y + topBarHeight + Layout.INNER_MARGIN, Layout.OPTION_WIDTH + Layout.OPTION_LIST_SCROLLBAR_OFFSET + Layout.SCROLLBAR_WIDTH, - h - topBarHeight - (reserveBottomSpace ? (Layout.INNER_MARGIN * 2 + Layout.BUTTON_SHORT) : Layout.INNER_MARGIN) - ifNotInsetY(Layout.INNER_MARGIN) + h - topBarHeight - (reserveBottomSpace ? (Layout.INNER_MARGIN * 2 + Layout.BUTTON_SHORT) : Layout.INNER_MARGIN) - this.ifNotInsetY(Layout.INNER_MARGIN) ); this.optionList = new OptionListWidget(this, optionListDim, this::onSectionFocused); this.addRenderableWidget(this.optionList); - var tooltipAreaY = y + topBarHeight + ifInsetY(Layout.TOOLTIP_OUTER_MARGIN); + var tooltipAreaY = y + topBarHeight + this.ifInsetY(Layout.TOOLTIP_OUTER_MARGIN); this.tooltip.setTooltipArea( new Dim2i( this.optionList.getLimitX(), tooltipAreaY, - this.getLimitX() - this.optionList.getLimitX() - ifNotInsetX(Layout.TOOLTIP_OUTER_MARGIN), - this.getLimitY() - tooltipAreaY - ifNotInsetY(Layout.TOOLTIP_OUTER_MARGIN) + this.getLimitX() - this.optionList.getLimitX() - this.ifNotInsetX(Layout.TOOLTIP_OUTER_MARGIN), + this.getLimitY() - tooltipAreaY - this.ifNotInsetY(Layout.TOOLTIP_OUTER_MARGIN) ) ); } @@ -228,8 +228,8 @@ private void rebuild() { private void rebuildActionButtons(boolean stackVertically) { int buttonW = Layout.BUTTON_LONG; int buttonH = Layout.BUTTON_SHORT; - int closeX = this.getLimitX() - buttonW - ifNotInsetX(Layout.INNER_MARGIN); - int closeY = this.getLimitY() - (ifNotInsetY(Layout.INNER_MARGIN) + buttonH); + int closeX = this.getLimitX() - buttonW - this.ifNotInsetX(Layout.INNER_MARGIN); + int closeY = this.getLimitY() - (this.ifNotInsetY(Layout.INNER_MARGIN) + buttonH); int dx = stackVertically ? 0 : -(Layout.INNER_MARGIN + buttonW); int dy = stackVertically ? -(Layout.INNER_MARGIN + buttonH) : 0; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ControlElement.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ControlElement.java index 08a9ff3ea8..ddba411166 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ControlElement.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ControlElement.java @@ -40,7 +40,7 @@ public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mo name = name + " *"; } - name = truncateLabelToFit(name); + name = this.truncateLabelToFit(name); String label; if (this.getOption().isEnabled()) { @@ -70,7 +70,7 @@ protected MutableComponent formatDisabledControlValue(Component value) { } protected String truncateLabelToFit(String name) { - return truncateTextToFit(name, this.getWidth() - this.getContentWidth() - Layout.OPTION_LABEL_END_PADDING); + return this.truncateTextToFit(name, this.getWidth() - this.getContentWidth() - Layout.OPTION_LABEL_END_PADDING); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java index 73553ee4be..7a81ce6ae4 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java @@ -82,7 +82,7 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { if (this.isResetOverlayActive()) return false; if (this.option.isEnabled() && event.button() == 0 && this.isMouseOver(event.x(), event.y())) { - cycleControl(Minecraft.getInstance().hasShiftDown()); + this.cycleControl(Minecraft.getInstance().hasShiftDown()); return true; } @@ -91,10 +91,10 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { @Override public boolean keyPressed(KeyEvent event) { - if (!isFocused()) return false; + if (!this.isFocused()) return false; if (event.isSelection()) { - cycleControl(Minecraft.getInstance().hasShiftDown()); + this.cycleControl(Minecraft.getInstance().hasShiftDown()); return true; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ExternalButtonControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ExternalButtonControl.java index 7109ad25b6..a603788e45 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ExternalButtonControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/ExternalButtonControl.java @@ -107,7 +107,7 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { @Override public boolean keyPressed(KeyEvent event) { - if (!isFocused()) return false; + if (!this.isFocused()) return false; if (event.isSelection()) { this.openScreen(this.screen); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java index 1ea1c0fcc6..117dd9cf64 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java @@ -164,7 +164,7 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { public boolean mouseReleased(MouseButtonEvent event) { if (this.option.isEnabled() && event.button() == 0 && this.sliderHeld) { this.sliderHeld = false; - playClickSound(); + this.playClickSound(); return true; } @@ -196,7 +196,7 @@ public void setValue(double newThumbPosition) { @Override public boolean keyPressed(KeyEvent event) { - if (!isFocused()) return false; + if (!this.isFocused()) return false; var range = this.option.getSteppedValidator(); var isLeft = event.isLeft(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/StatefulControlElement.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/StatefulControlElement.java index 275029ccc3..eb8cf37fbf 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/StatefulControlElement.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/StatefulControlElement.java @@ -40,6 +40,6 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { @Override protected String truncateLabelToFit(String name) { int rightReserve = this.isResetOverlayActive() ? this.resetButton.getWidth() : this.getContentWidth() + Layout.OPTION_LABEL_END_PADDING; - return truncateTextToFit(name, this.getWidth() - rightReserve); + return this.truncateTextToFit(name, this.getWidth() - rightReserve); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java index 8f82846812..ddcea3a57b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java @@ -104,7 +104,7 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { if (this.isResetOverlayActive()) return false; if (this.option.isEnabled() && event.button() == 0 && this.isMouseOver(event.x(), event.y())) { - toggleControl(); + this.toggleControl(); return true; } @@ -113,10 +113,10 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { @Override public boolean keyPressed(KeyEvent event) { - if (!isFocused()) return false; + if (!this.isFocused()) return false; if (event.isSelection()) { - toggleControl(); + this.toggleControl(); return true; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/prompt/ScreenPrompt.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/prompt/ScreenPrompt.java index dafba742e4..5ad7c37727 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/prompt/ScreenPrompt.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/prompt/ScreenPrompt.java @@ -91,7 +91,7 @@ public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mo textY += Layout.TEXT_PARAGRAPH_SPACING; } - for (var button : getWidgets()) { + for (var button : this.getWidgets()) { button.extractRenderState(graphics, mouseX, mouseY, delta); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/CenteredFlatWidget.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/CenteredFlatWidget.java index 6e605633dd..0041f32386 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/CenteredFlatWidget.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/CenteredFlatWidget.java @@ -45,7 +45,7 @@ public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mo this.hovered = this.isMouseOver(mouseX, mouseY); int backgroundColor = this.hovered ? this.theme.bgHighlight : (this.selected ? this.theme.bgDefault : this.theme.bgInactive); - int textColor = this.selected || !this.isSelectable ? this.theme.themeLighter : (this.hovered ? this.theme.theme : theme.themeDarker); + int textColor = this.selected || !this.isSelectable ? this.theme.themeLighter : (this.hovered ? this.theme.theme : this.theme.themeDarker); int x1 = this.getX(); int y1 = this.getY(); @@ -99,7 +99,7 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { } if (event.button() == 0 && this.isMouseOver(event.x(), event.y())) { - doAction(); + this.doAction(); return true; } @@ -113,7 +113,7 @@ public boolean keyPressed(KeyEvent event) { return false; if (event.isSelection()) { - doAction(); + this.doAction(); return true; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/FlatButtonWidget.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/FlatButtonWidget.java index ee506022bb..8f4467fafc 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/FlatButtonWidget.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/FlatButtonWidget.java @@ -100,7 +100,7 @@ public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { } if (event.button() == 0 && this.isMouseOver(event.x(), event.y())) { - doAction(); + this.doAction(); return true; } @@ -114,7 +114,7 @@ public boolean keyPressed(KeyEvent event) { return false; if (event.isSelection()) { - doAction(); + this.doAction(); return true; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/OptionListWidget.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/OptionListWidget.java index cbc8efd6a1..bdaa95bc82 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/OptionListWidget.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/OptionListWidget.java @@ -267,7 +267,7 @@ protected int rightReservedWidth() { } protected String truncateLabelToFit(String name, int padding) { - return truncateTextToFit(name, this.getWidth() - padding - this.rightReservedWidth()); + return this.truncateTextToFit(name, this.getWidth() - padding - this.rightReservedWidth()); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/color/DefaultColorProviders.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/color/DefaultColorProviders.java index d645a663d5..7e514ee1f1 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/color/DefaultColorProviders.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/color/DefaultColorProviders.java @@ -58,7 +58,7 @@ public VanillaAdapter(BlockTintSource[] colors) { @Override public void getColors(LevelSlice slice, BlockPos pos, BlockPos.MutableBlockPos scratchPos, BlockState state, ModelQuadView quad, int[] output, boolean smooth) { - if (quad.getTintIndex() >= color.length) { + if (quad.getTintIndex() >= this.color.length) { Arrays.fill(output, -1); return; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/LightPipeline.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/LightPipeline.java index a4c9e8c268..e2ecdddaec 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/LightPipeline.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/LightPipeline.java @@ -4,7 +4,6 @@ import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.level.material.FluidState; /** * Light pipelines allow model quads for any location in the level to be lit using various backends, including fluids diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatFluidLightPipeline.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatFluidLightPipeline.java index c2398383f1..ba3163ee10 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatFluidLightPipeline.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatFluidLightPipeline.java @@ -28,13 +28,13 @@ public FlatFluidLightPipeline(LightDataAccess lightCache) { public void calculate(ModelQuadView quad, BlockPos pos, QuadLightData out, Direction cullFace, Direction lightFace, boolean shade, boolean enhanced) { // this first part is a reduced implementation of FlatLightPipeline if (cullFace != null) { - Arrays.fill(out.br, getShade(this.lightCache.getLevel(), lightFace, shade)); + Arrays.fill(out.br, this.getShade(this.lightCache.getLevel(), lightFace, shade)); } else { int flags = quad.getFlags(); if ((flags & ModelQuadFlags.IS_ALIGNED) != 0 || ((flags & ModelQuadFlags.IS_PARALLEL) != 0 && unpackFC(this.lightCache.get(pos)))) { - Arrays.fill(out.br, getShade(this.lightCache.getLevel(), lightFace, shade)); + Arrays.fill(out.br, this.getShade(this.lightCache.getLevel(), lightFace, shade)); } else { - Arrays.fill(out.br, enhanced ? PlatformBlockAccess.getInstance().getNormalVectorShade(quad, this.lightCache.getLevel(), shade) : getShade(this.lightCache.getLevel(), lightFace, shade)); + Arrays.fill(out.br, enhanced ? PlatformBlockAccess.getInstance().getNormalVectorShade(quad, this.lightCache.getLevel(), shade) : this.getShade(this.lightCache.getLevel(), lightFace, shade)); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatLightPipeline.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatLightPipeline.java index 854d5e7554..07e4192236 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatLightPipeline.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/flat/FlatLightPipeline.java @@ -38,18 +38,18 @@ public void calculate(ModelQuadView quad, BlockPos pos, QuadLightData out, Direc // To match vanilla behavior, use the cull face if it exists/is available if (cullFace != null) { - lightmap = getOffsetLightmap(pos, cullFace); - Arrays.fill(out.br, getShade(this.lightCache.getLevel(), lightFace, shade)); + lightmap = this.getOffsetLightmap(pos, cullFace); + Arrays.fill(out.br, this.getShade(this.lightCache.getLevel(), lightFace, shade)); } else { int flags = quad.getFlags(); // If the face is aligned, use the light data above it // To match vanilla behavior, also treat the face as aligned if it is parallel and the block state is a full cube if ((flags & ModelQuadFlags.IS_ALIGNED) != 0 || ((flags & ModelQuadFlags.IS_PARALLEL) != 0 && unpackFC(this.lightCache.get(pos)))) { - lightmap = getOffsetLightmap(pos, lightFace); - Arrays.fill(out.br, getShade(this.lightCache.getLevel(), lightFace, shade)); + lightmap = this.getOffsetLightmap(pos, lightFace); + Arrays.fill(out.br, this.getShade(this.lightCache.getLevel(), lightFace, shade)); } else { lightmap = getEmissiveLightmap(this.lightCache.get(pos)); - Arrays.fill(out.br, enhanced ? PlatformBlockAccess.getInstance().getNormalVectorShade(quad, this.lightCache.getLevel(), shade) : getShade(this.lightCache.getLevel(), lightFace, shade)); + Arrays.fill(out.br, enhanced ? PlatformBlockAccess.getInstance().getNormalVectorShade(quad, this.lightCache.getLevel(), shade) : this.getShade(this.lightCache.getLevel(), lightFace, shade)); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/AoFaceData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/AoFaceData.java index 2f5fbeddc6..a7f413b8cb 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/AoFaceData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/AoFaceData.java @@ -3,7 +3,6 @@ import net.caffeinemc.mods.sodium.client.model.light.data.LightDataAccess; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.util.LightCoordsUtil; import static net.caffeinemc.mods.sodium.client.model.light.data.ArrayLightDataCache.*; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java index 6e567252c2..39efb8412a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/smooth/SmoothLightPipeline.java @@ -232,13 +232,13 @@ private AoFaceData gatherInsetFace(ModelQuadView quad, BlockPos blockPos, int ve final float w1 = AoNeighborInfo.get(lightFace).getDepth(quad.getX(vertexIndex), quad.getY(vertexIndex), quad.getZ(vertexIndex)); if (Mth.equal(w1, 0)) { - return getCachedFaceData(blockPos, lightFace, true, shade); + return this.getCachedFaceData(blockPos, lightFace, true, shade); } else if (Mth.equal(w1, 1)) { - return getCachedFaceData(blockPos, lightFace, false, shade); + return this.getCachedFaceData(blockPos, lightFace, false, shade); } else { - tmpFace.reset(); + this.tmpFace.reset(); final float w0 = 1 - w1; - return AoFaceData.weightedMean(getCachedFaceData(blockPos, lightFace, true, shade), w0, getCachedFaceData(blockPos, lightFace, false, shade), w1, tmpFace); + return AoFaceData.weightedMean(this.getCachedFaceData(blockPos, lightFace, true, shade), w0, this.getCachedFaceData(blockPos, lightFace, false, shade), w1, this.tmpFace); } } @@ -253,7 +253,7 @@ private void applyIrregularFace(BlockPos blockPos, ModelQuadView quad, QuadLight for (int i = 0; i < 4; i++) { // TODO: Avoid this if the accurate normal is the face normal - Vector3f normal = NormI8.unpack(quad.getAccurateNormal(i), vertexNormal); + Vector3f normal = NormI8.unpack(quad.getAccurateNormal(i), this.vertexNormal); float ao = 0, sky = 0, block = 0, maxAo = 0; float maxSky = 0, maxBlock = 0; @@ -261,7 +261,7 @@ private void applyIrregularFace(BlockPos blockPos, ModelQuadView quad, QuadLight if (!Mth.equal(0f, x)) { final Direction face = x > 0 ? Direction.EAST : Direction.WEST; - final AoFaceData fd = gatherInsetFace(quad, blockPos, i, face, shade); + final AoFaceData fd = this.gatherInsetFace(quad, blockPos, i, face, shade); AoNeighborInfo.get(face).calculateCornerWeights(quad.getX(i), quad.getY(i), quad.getZ(i), w); final float n = x * x; final float a = fd.getBlendedShade(w) * this.getAmbientBrightness(face, shade); @@ -279,7 +279,7 @@ private void applyIrregularFace(BlockPos blockPos, ModelQuadView quad, QuadLight if (!Mth.equal(0f, y)) { final Direction face = y > 0 ? Direction.UP : Direction.DOWN; - final AoFaceData fd = gatherInsetFace(quad, blockPos, i, face, shade); + final AoFaceData fd = this.gatherInsetFace(quad, blockPos, i, face, shade); AoNeighborInfo.get(face).calculateCornerWeights(quad.getX(i), quad.getY(i), quad.getZ(i), w); final float n = y * y; final float a = fd.getBlendedShade(w) * this.getAmbientBrightness(face, shade); @@ -297,7 +297,7 @@ private void applyIrregularFace(BlockPos blockPos, ModelQuadView quad, QuadLight if (!Mth.equal(0f, z)) { final Direction face = z > 0 ? Direction.SOUTH : Direction.NORTH; - final AoFaceData fd = gatherInsetFace(quad, blockPos, i, face, shade); + final AoFaceData fd = this.gatherInsetFace(quad, blockPos, i, face, shade); AoNeighborInfo.get(face).calculateCornerWeights(quad.getX(i), quad.getY(i), quad.getZ(i), w); final float n = z * z; final float a = fd.getBlendedShade(w) * this.getAmbientBrightness(face, shade); @@ -336,7 +336,7 @@ private void applyAmbientLighting(final float[] brightness, Direction face, bool * @param shade Whether the block face is receiving directional light */ private float getAmbientBrightness(Direction face, boolean shade) { - return shade ? lightCache.getLevel().cardinalLighting().byFace(face) : lightCache.getLevel().cardinalLighting().up(); + return shade ? this.lightCache.getLevel().cardinalLighting().byFace(face) : this.lightCache.getLevel().cardinalLighting().up(); } /** diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuad.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuad.java index 54a01fd3bf..aad850c99a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuad.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuad.java @@ -125,7 +125,7 @@ public int getVertexNormal(int idx) { @Override public int getFaceNormal() { - return faceNormal; + return this.faceNormal; } @Override @@ -150,6 +150,6 @@ public Direction getLightFace() { @Override public int getMaxLightQuad(int idx) { - return getLight(idx); + return this.getLight(idx); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuadView.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuadView.java index f04685e987..9912a0ac74 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuadView.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/ModelQuadView.java @@ -1,7 +1,7 @@ package net.caffeinemc.mods.sodium.client.model.quad; -import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFlags; import net.caffeinemc.mods.sodium.api.util.NormI8; +import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFlags; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; @@ -79,21 +79,21 @@ default boolean hasColor() { } default int calculateNormal() { - final float x0 = getX(0); - final float y0 = getY(0); - final float z0 = getZ(0); + final float x0 = this.getX(0); + final float y0 = this.getY(0); + final float z0 = this.getZ(0); - final float x1 = getX(1); - final float y1 = getY(1); - final float z1 = getZ(1); + final float x1 = this.getX(1); + final float y1 = this.getY(1); + final float z1 = this.getZ(1); - final float x2 = getX(2); - final float y2 = getY(2); - final float z2 = getZ(2); + final float x2 = this.getX(2); + final float y2 = this.getY(2); + final float z2 = this.getZ(2); - final float x3 = getX(3); - final float y3 = getY(3); - final float z3 = getZ(3); + final float x3 = this.getX(3); + final float y3 = this.getY(3); + final float z3 = this.getZ(3); final float dx0 = x2 - x0; final float dy0 = y2 - y0; @@ -123,9 +123,9 @@ default int calculateNormal() { * @return the per-vertex normal if it is set, otherwise the face normal. */ default int getAccurateNormal(int i) { - int normal = getVertexNormal(i); + int normal = this.getVertexNormal(i); - return normal == 0 ? getFaceNormal() : normal; + return normal == 0 ? this.getFaceNormal() : normal; } /** diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/properties/ModelQuadFacing.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/properties/ModelQuadFacing.java index 82c34b5164..9fbdffbb75 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/properties/ModelQuadFacing.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/quad/properties/ModelQuadFacing.java @@ -1,10 +1,9 @@ package net.caffeinemc.mods.sodium.client.model.quad.properties; -import net.caffeinemc.mods.sodium.client.util.DirectionUtil; import net.caffeinemc.mods.sodium.api.util.NormI8; +import net.caffeinemc.mods.sodium.client.util.DirectionUtil; import net.minecraft.core.Direction; import net.minecraft.util.Mth; -import org.joml.Math; import org.joml.Vector3f; import org.joml.Vector3fc; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java index da7f89e9db..6efe287023 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java @@ -343,7 +343,7 @@ public void extractBlockEntities(Camera camera, float tickDelta, Long2ObjectMap< } for (BlockEntity blockEntity : blockEntities) { - extractBlockEntity(blockEntity, stack, camera, tickDelta, progression, levelRenderState); + this.extractBlockEntity(blockEntity, stack, camera, tickDelta, progression, levelRenderState); } } } @@ -356,7 +356,7 @@ public void extractBlockEntities(Camera camera, float tickDelta, Long2ObjectMap< } for (var blockEntity : blockEntities) { - extractBlockEntity(blockEntity, stack, camera, tickDelta, progression, levelRenderState); + this.extractBlockEntity(blockEntity, stack, camera, tickDelta, progression, levelRenderState); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/BlockEntityRenderHandlerImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/BlockEntityRenderHandlerImpl.java index 56f323d708..e1809eabcb 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/BlockEntityRenderHandlerImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/BlockEntityRenderHandlerImpl.java @@ -1,7 +1,5 @@ package net.caffeinemc.mods.sodium.client.render.chunk; -import java.util.function.Predicate; - import net.caffeinemc.mods.sodium.api.blockentity.BlockEntityRenderHandler; import net.caffeinemc.mods.sodium.api.blockentity.BlockEntityRenderPredicate; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderMatrices.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderMatrices.java index 1511508cb6..cca6929b5b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderMatrices.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderMatrices.java @@ -1,8 +1,5 @@ package net.caffeinemc.mods.sodium.client.render.chunk; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import org.joml.Matrix4f; import org.joml.Matrix4fc; public record ChunkRenderMatrices(Matrix4fc projection, Matrix4fc modelView) { } \ No newline at end of file diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ExtendedBlockEntityType.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ExtendedBlockEntityType.java index c74e5712a6..bca68c35da 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ExtendedBlockEntityType.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ExtendedBlockEntityType.java @@ -6,8 +6,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import java.util.function.Predicate; - @SuppressWarnings("unchecked") public interface ExtendedBlockEntityType { BlockEntityRenderPredicate[] sodium$getRenderPredicates(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/NonStoringBuilderPool.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/NonStoringBuilderPool.java index d8a1f24b27..79eb66618a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/NonStoringBuilderPool.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/NonStoringBuilderPool.java @@ -1,13 +1,11 @@ package net.caffeinemc.mods.sodium.client.render.chunk; +import net.minecraft.client.renderer.SectionBufferBuilderPack; +import net.minecraft.client.renderer.SectionBufferBuilderPool; import org.jspecify.annotations.Nullable; -import java.util.Collections; import java.util.List; -import net.minecraft.client.renderer.SectionBufferBuilderPack; -import net.minecraft.client.renderer.SectionBufferBuilderPool; - public class NonStoringBuilderPool extends SectionBufferBuilderPool { public NonStoringBuilderPool() { var pack = new SectionBufferBuilderPack(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java index f90a9105ed..96cb5deae6 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java @@ -555,7 +555,7 @@ private boolean isSectionImmediatePresentationCandidate(Viewport viewport, Rende } private int processChunkBuildResults(ArrayList results, Viewport viewport) { - var sectionsWithOutputs = applyBuildOutputs(results); + var sectionsWithOutputs = this.applyBuildOutputs(results); var outputs = new ArrayList(); // prepare list of pending present patches if there are pending tasks that will need patches @@ -572,7 +572,7 @@ private int processChunkBuildResults(ArrayList results, Viewp var resultSize = buildOutput.getResultSize(); TranslucentData oldData = section.getTranslucentData(); - changes |= updateWithResult(viewport, section, buildOutput, pendingPresentPatches); + changes |= this.updateWithResult(viewport, section, buildOutput, pendingPresentPatches); section.setLastMeshResultSize(resultSize); this.meshTaskSizeEstimator.addData(this.meshTaskSizeEstimator.resultForSection(section, resultSize)); @@ -772,11 +772,11 @@ public void updateChunks(Viewport viewport, boolean updateImmediately) { private void submitSectionTasks( ChunkJobCollector importantCollector, ChunkJobCollector semiImportantCollector, ChunkJobCollector deferredCollector, UploadResourceBudget uploadBudget, Viewport viewport) { - submitImportantSectionTasks(importantCollector, uploadBudget, DeferMode.ZERO_FRAMES, viewport); - submitImportantSectionTasks(semiImportantCollector, uploadBudget, DeferMode.ONE_FRAME, viewport); - submitImportantSectionTasks(deferredCollector, uploadBudget, DeferMode.ALWAYS, viewport); + this.submitImportantSectionTasks(importantCollector, uploadBudget, DeferMode.ZERO_FRAMES, viewport); + this.submitImportantSectionTasks(semiImportantCollector, uploadBudget, DeferMode.ONE_FRAME, viewport); + this.submitImportantSectionTasks(deferredCollector, uploadBudget, DeferMode.ALWAYS, viewport); - submitDeferredSectionTasks(deferredCollector, uploadBudget); + this.submitDeferredSectionTasks(deferredCollector, uploadBudget); } private void submitDeferredSectionTasks(ChunkJobCollector collector, UploadResourceBudget uploadBudget) { @@ -787,7 +787,7 @@ private void submitDeferredSectionTasks(ChunkJobCollector collector, UploadResou while (!this.taskLists.isEmpty() && collector.hasBudgetRemaining() && uploadBudget.isAvailable()) { var section = this.renderSections.getConsistent(this.taskLists.dequeueNextSectionPos()); if (section != null) { - submitSectionTask(collector, section, uploadBudget); + this.submitSectionTask(collector, section, uploadBudget); } } } @@ -806,7 +806,7 @@ private void submitImportantSectionTasks(ChunkJobCollector collector, UploadReso if (pendingUpdate != 0 && this.getDeferModeForPendingUpdate(pendingUpdate) == deferMode && this.shouldPrioritizeTask(section, NEARBY_SORT_DISTANCE)) { // isSectionVisible includes a special case for not testing empty sections against the tree as they won't be in it if (this.renderTree == null || this.renderTree.isSectionVisible(viewport, section)) { - submitSectionTask(collector, section, pendingUpdate, uploadBudget, deferMode == DeferMode.ZERO_FRAMES); + this.submitSectionTask(collector, section, pendingUpdate, uploadBudget, deferMode == DeferMode.ZERO_FRAMES); } else { // don't remove if simply not visible currently but still relevant continue; @@ -825,7 +825,7 @@ private void submitSectionTask(ChunkJobCollector collector, @NotNull RenderSecti return; } - submitSectionTask(collector, section, type, uploadBudget, false); + this.submitSectionTask(collector, section, type, uploadBudget, false); } private void submitSectionTask(ChunkJobCollector collector, @NonNull RenderSection section, int type, UploadResourceBudget uploadBudget, boolean blocking) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java index 06b2a14a0c..7300bc7c9a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/BakedChunkModelBuilder.java @@ -31,8 +31,8 @@ public void addSprite(@NonNull TextureAtlasSprite sprite) { @Override public VertexConsumer asFallbackVertexConsumer(Material material, TranslucentGeometryCollector collector) { - fallbackVertexConsumer.setData(material, collector); - return fallbackVertexConsumer; + this.fallbackVertexConsumer.setData(material, collector); + return this.fallbackVertexConsumer; } public void destroy() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkVertexConsumer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkVertexConsumer.java index eb6f858c62..b18d6c4994 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkVertexConsumer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/buffers/ChunkVertexConsumer.java @@ -45,7 +45,7 @@ public void setData(Material material, TranslucentGeometryCollector collector) { vertex.z = z; vertex.ao = 1.0f; this.writtenAttributes |= ATTRIBUTE_POSITION_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } // Writing color ignores alpha since alpha is used as a color multiplier by Sodium. @@ -54,7 +54,7 @@ public void setData(Material material, TranslucentGeometryCollector collector) { ChunkVertexEncoder.Vertex vertex = this.vertices[this.vertexIndex]; vertex.color = ColorABGR.pack(red, green, blue, alpha); this.writtenAttributes |= ATTRIBUTE_COLOR_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override @@ -62,7 +62,7 @@ public void setData(Material material, TranslucentGeometryCollector collector) { ChunkVertexEncoder.Vertex vertex = this.vertices[this.vertexIndex]; vertex.color = ColorABGR.pack(red, green, blue, alpha); this.writtenAttributes |= ATTRIBUTE_COLOR_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override @@ -70,7 +70,7 @@ public void setData(Material material, TranslucentGeometryCollector collector) { ChunkVertexEncoder.Vertex vertex = this.vertices[this.vertexIndex]; vertex.color = ColorARGB.toABGR(argb); this.writtenAttributes |= ATTRIBUTE_COLOR_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override @@ -79,18 +79,18 @@ public void setData(Material material, TranslucentGeometryCollector collector) { vertex.u = u; vertex.v = v; this.writtenAttributes |= ATTRIBUTE_TEXTURE_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } // Overlay is ignored for chunk geometry. @Override public @NonNull VertexConsumer setUv1(int u, int v) { - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override public @NonNull VertexConsumer setOverlay(int uv) { - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override @@ -98,7 +98,7 @@ public void setData(Material material, TranslucentGeometryCollector collector) { ChunkVertexEncoder.Vertex vertex = this.vertices[this.vertexIndex]; vertex.light = ((v & 0xFFFF) << 16) | (u & 0xFFFF); this.writtenAttributes |= ATTRIBUTE_LIGHT_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override @@ -106,18 +106,18 @@ public void setData(Material material, TranslucentGeometryCollector collector) { ChunkVertexEncoder.Vertex vertex = this.vertices[this.vertexIndex]; vertex.light = uv; this.writtenAttributes |= ATTRIBUTE_LIGHT_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override public @NonNull VertexConsumer setNormal(float x, float y, float z) { this.writtenAttributes |= ATTRIBUTE_NORMAL_BIT; - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } @Override public VertexConsumer setLineWidth(float f) { - return potentiallyEndVertex(); + return this.potentiallyEndVertex(); } public VertexConsumer potentiallyEndVertex() { @@ -129,7 +129,7 @@ public VertexConsumer potentiallyEndVertex() { this.writtenAttributes = 0; if (this.vertexIndex == 4) { - int normal = calculateNormal(); + int normal = this.calculateNormal(); ModelQuadFacing cullFace = ModelQuadFacing.fromPackedNormal(normal); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/Estimator.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/Estimator.java index c7a475075d..2f87b0e5f7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/Estimator.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/Estimator.java @@ -19,8 +19,8 @@ public abstract class Estimator< TInput, TOutput, TModel extends Estimator.Model> { - protected final Map models = createMap(); - protected final Map batches = createMap(); + protected final Map models = this.createMap(); + protected final Map batches = this.createMap(); protected interface DataBatch { void addDataPoint(TBatchPoint input); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/MeshTaskSizeEstimator.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/MeshTaskSizeEstimator.java index 82aac38a10..16e803e3a3 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/MeshTaskSizeEstimator.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/estimation/MeshTaskSizeEstimator.java @@ -2,7 +2,6 @@ import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegion; -import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import java.util.EnumMap; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder.java index 5a9b594a71..78816229f9 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder.java @@ -186,7 +186,7 @@ public void run() { ChunkBuilder.this.busyThreadCount.getAndIncrement(); - Zone zone = TracyClient.beginZone(name, SharedConstants.IS_RUNNING_IN_IDE); + Zone zone = TracyClient.beginZone(this.name, SharedConstants.IS_RUNNING_IN_IDE); try { job.execute(this.context); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java index b7e482278d..3f77374067 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java @@ -15,8 +15,8 @@ import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector; import net.caffeinemc.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder; import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; -import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; +import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.SodiumShadeMode; import net.caffeinemc.mods.sodium.client.render.texture.SpriteFinderCache; import net.caffeinemc.mods.sodium.client.services.PlatformModelAccess; @@ -26,14 +26,13 @@ import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.util.TriState; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; import net.minecraft.world.phys.Vec3; -import org.jspecify.annotations.Nullable; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; public class BlockRenderer extends AbstractBlockRenderContext { private final ColorProviderRegistry colorProviderRegistry; @@ -90,11 +89,11 @@ public void renderModel(BlockStateModel model, BlockState state, BlockPos pos, B this.prepareCulling(true); - random.setSeed(state.getSeed(pos)); + this.random.setSeed(state.getSeed(pos)); this.forceOpaque = ModelBlockRenderer.forceOpaque(this.cutoutLeaves, state); - PlatformModelEmitter.getInstance().emitModel(model, this::isFaceCulled, getForEmitting(), random, level, pos, state, this::bufferDefaultModel); + PlatformModelEmitter.getInstance().emitModel(model, this::isFaceCulled, this.getForEmitting(), this.random, this.level, pos, state, this::bufferDefaultModel); this.forceOpaque = false; } @@ -115,7 +114,7 @@ protected void processQuad(MutableQuadViewImpl quad) { final boolean emissive = quad.emissive(); final ChunkSectionLayer blendMode = quad.getRenderType(); - final Material material = DefaultMaterials.forChunkLayer(forceOpaque ? ChunkSectionLayer.SOLID : blendMode); + final Material material = DefaultMaterials.forChunkLayer(this.forceOpaque ? ChunkSectionLayer.SOLID : blendMode); this.tintQuad(quad); this.shadeQuad(quad, lightMode, emissive, shadeMode); @@ -128,11 +127,11 @@ private void tintQuad(MutableQuadViewImpl quad) { if (tintIndex != -1) { ColorProvider colorProvider = this.colorProvider; - if (colorProvider == null && mutableColorProvider != null) colorProvider = mutableColorProvider; + if (colorProvider == null && this.mutableColorProvider != null) colorProvider = this.mutableColorProvider; if (colorProvider != null) { int[] vertexColors = this.vertexColors; - colorProvider.getColors(this.slice, this.pos, this.scratchPos, this.state, quad, vertexColors, slice.hasBiomeBlend()); + colorProvider.getColors(this.slice, this.pos, this.scratchPos, this.state, quad, vertexColors, this.slice.hasBiomeBlend()); for (int i = 0; i < 4; i++) { quad.setColor(i, ColorMixer.mulComponentWise(vertexColors[i], quad.baseColor(i))); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/DefaultFluidRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/DefaultFluidRenderer.java index 1870f444a5..18c78a83c3 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/DefaultFluidRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/DefaultFluidRenderer.java @@ -232,7 +232,7 @@ private boolean isSideExposedOffset(BlockAndTintGetter world, BlockState ownBloc * Calculates the combined visibility of a fluid face based on the neighboring block states and the fluid state. */ private boolean isFullBlockFluidVisible(BlockAndTintGetter world, BlockPos pos, Direction dir, BlockState blockState, FluidState fluid) { - return isFullBlockFluidSelfVisible(blockState, dir) && this.isFullBlockFluidSideVisible(world, pos, dir, fluid); + return this.isFullBlockFluidSelfVisible(blockState, dir) && this.isFullBlockFluidSideVisible(world, pos, dir, fluid); } /** @@ -305,13 +305,13 @@ private float fluidCornerHeight(BlockAndTintGetter world, BlockPos origin, Fluid return 1.0f; } - cornerHeight = sampleFluidCornerSmart(world, origin, fluid, dirA, dirB, fluidHeightA, fluidHeightB, exposedA, exposedB, filteredHeightA, filteredHeightB); + cornerHeight = this.sampleFluidCornerSmart(world, origin, fluid, dirA, dirB, fluidHeightA, fluidHeightB, exposedA, exposedB, filteredHeightA, filteredHeightB); } else { if (fluidHeightA >= 1.0f || fluidHeightB >= 1.0f) { return 1.0f; } - cornerHeight = sampleFluidCornerBasic(world, origin, fluid, dirA, dirB, fluidHeightA, fluidHeightB); + cornerHeight = this.sampleFluidCornerBasic(world, origin, fluid, dirA, dirB, fluidHeightA, fluidHeightB); } if (cornerHeight >= 1.0f) { return 1.0f; @@ -463,7 +463,7 @@ public void render(LevelSlice level, BlockState blockState, FluidState fluidStat // apply heuristic to not render up face it's in a flooded cave boolean inwardsUpFaceVisible = true; if (upVisible && fluidState.isSource()) { - var exposureResult = getUpFaceExposureByNeighbors(level, blockPos, fluidState); + var exposureResult = this.getUpFaceExposureByNeighbors(level, blockPos, fluidState); if (this.hiddenFluidCulling) { upVisible = exposureResult != NO_EXPOSURE; } @@ -699,7 +699,7 @@ private int getUpFaceExposureByNeighbors(BlockAndTintGetter level, BlockPos orig this.stack.clear(); var result = 0; - result |= visitExposureNeighbor(level, origin, fluidState, 0, 0); + result |= this.visitExposureNeighbor(level, origin, fluidState, 0, 0); if (result == BOTH_EXPOSED) { return result; } @@ -711,25 +711,25 @@ private int getUpFaceExposureByNeighbors(BlockAndTintGetter level, BlockPos orig // traverse into unvisited neighbors, return immediately if both faces are exposed (no further change possible) if (x < radius) { - result |= visitExposureNeighbor(level, origin, fluidState, x + 1, z); + result |= this.visitExposureNeighbor(level, origin, fluidState, x + 1, z); if (result == BOTH_EXPOSED) { return result; } } if (x > -radius) { - result |= visitExposureNeighbor(level, origin, fluidState, x - 1, z); + result |= this.visitExposureNeighbor(level, origin, fluidState, x - 1, z); if (result == BOTH_EXPOSED) { return result; } } if (z < radius) { - result |= visitExposureNeighbor(level, origin, fluidState, x, z + 1); + result |= this.visitExposureNeighbor(level, origin, fluidState, x, z + 1); if (result == BOTH_EXPOSED) { return result; } } if (z > -radius) { - result |= visitExposureNeighbor(level, origin, fluidState, x, z - 1); + result |= this.visitExposureNeighbor(level, origin, fluidState, x, z - 1); if (result == BOTH_EXPOSED) { return result; } @@ -745,7 +745,7 @@ private long offsetToMask(int x, int z) { private int visitExposureNeighbor(BlockAndTintGetter level, BlockPos origin, FluidState fluidState, int xOffset, int zOffset) { // stop if position was already visited previously - var upNeighborMask = offsetToMask(xOffset, zOffset); + var upNeighborMask = this.offsetToMask(xOffset, zOffset); if ((this.visited & upNeighborMask) != 0) { return NO_EXPOSURE; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/FluidRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/FluidRenderer.java index 5a9a16766d..b28456aa08 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/FluidRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/FluidRenderer.java @@ -1,7 +1,5 @@ package net.caffeinemc.mods.sodium.client.render.chunk.compile.pipeline; -import net.caffeinemc.mods.sodium.client.model.color.ColorProviderRegistry; -import net.caffeinemc.mods.sodium.client.model.light.LightPipelineProvider; import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector; import net.caffeinemc.mods.sodium.client.world.LevelSlice; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java index c72b6c9c35..6ce2b221d8 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java @@ -154,10 +154,10 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke } } catch (ReportedException ex) { // Propagate existing crashes (add context) - throw fillCrashInfo(ex.getReport(), slice, blockPos); + throw this.fillCrashInfo(ex.getReport(), slice, blockPos); } catch (Exception ex) { // Create a new crash report for other exceptions (e.g. thrown in getQuads) - throw fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while building chunk meshes"), slice, blockPos); + throw this.fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while building chunk meshes"), slice, blockPos); } profiler.popPush("mesh appenders"); @@ -194,7 +194,7 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke translucentData = collector.getTranslucentData(oldData, this); } catch (Exception ex) { // Create a new crash report for exceptions thrown during sort preparation - throw fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while preparing for translucency sorting"), slice, null); + throw this.fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while preparing for translucency sorting"), slice, null); } reuseUploadedData = !this.forceSort && translucentData == oldData; } @@ -242,7 +242,7 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke output.setSorter(sorter); } catch (Exception ex) { // Create a new crash report for exceptions thrown during sorting - throw fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while writing index buffer for translucent geometry"), slice, null); + throw this.fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while writing index buffer for translucent geometry"), slice, null); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/TaskCollectingTree.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/TaskCollectingTree.java index ef31cc65b3..d591eb40ee 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/TaskCollectingTree.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/TaskCollectingTree.java @@ -46,7 +46,7 @@ public void visit(RenderSection section, boolean inFrustum) { protected void addPendingSection(RenderSection section, int type, boolean inFrustum) { // start with a base priority value, lowest priority of task gets processed first - float priority = getSectionPriority(section, type, inFrustum); + float priority = this.getSectionPriority(section, type, inFrustum); // encode the absolute position of the section var localX = section.getChunkX() - this.baseOffsetX; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/DirectionalVisGraph.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/DirectionalVisGraph.java index 8c20ddc4f3..39de38ad65 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/DirectionalVisGraph.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/DirectionalVisGraph.java @@ -66,7 +66,7 @@ public VisibilitySet[] resolve() { // generate visibility data for each base perspective var results = new VisibilitySet[DIRECTION_SETS.length]; for (int i = 0; i < DIRECTION_SETS.length; i++) { - results[i] = resolveWithDirections(DIRECTION_SETS[i]); + results[i] = this.resolveWithDirections(DIRECTION_SETS[i]); } return results; @@ -102,7 +102,7 @@ private VisibilitySet resolveWithDirections(int directionSet) { for (int z = minZ; z <= maxZ; z++) { int originIndex = getIndex(x, y, z); if (!visited.getAndSet(originIndex)) { - search(visited, visibilitySet, stackPos, stackDirs, originDirection, directionSet, originIndex); + this.search(visited, visibilitySet, stackPos, stackDirs, originDirection, directionSet, originIndex); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java index 096811e510..b24c3a6a2a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/OcclusionCuller.java @@ -261,7 +261,7 @@ public void findVisible(GraphOcclusionVisitor visitorWide, this.outOfWorldRadius++; } - processQueue(this.queue.read(), this.queue.write()); + this.processQueue(this.queue.read(), this.queue.write()); } this.addNearbySections(viewport); @@ -333,7 +333,7 @@ private void processQueue(ReadQueue readQueue, outgoingRegular &= getOutwardDirectionsRegular(origin, section); outgoingLocal &= getOutwardDirectionsRegular(origin, section); - visitNeighbors(writeQueue, section, outgoingWide, outgoingRegular, outgoingLocal, this.inBoundsOrigin); + this.visitNeighbors(writeQueue, section, outgoingWide, outgoingRegular, outgoingLocal, this.inBoundsOrigin); } } @@ -384,12 +384,12 @@ private void visitNeighbors(WriteQueue queue, RenderSection secti // the viewpoint is outside the world, so the angle computations relying on propagating angle information // from the origin section to the others won't work. - tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentDown, GraphDirection.DOWN); - tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentUp, GraphDirection.UP); - tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentNorth, GraphDirection.NORTH); - tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentSouth, GraphDirection.SOUTH); - tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentWest, GraphDirection.WEST); - tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentEast, GraphDirection.EAST); + this.tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentDown, GraphDirection.DOWN); + this.tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentUp, GraphDirection.UP); + this.tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentNorth, GraphDirection.NORTH); + this.tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentSouth, GraphDirection.SOUTH); + this.tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentWest, GraphDirection.WEST); + this.tryVisitNode(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, section.adjacentEast, GraphDirection.EAST); } private void tryVisitNode(WriteQueue queue, RenderSection originSection, int outgoingWide, int outgoingRegular, int outgoingLocal, RenderSection section, int outgoingDirection) { @@ -414,7 +414,7 @@ private void tryVisitNode(WriteQueue queue, RenderSection originS return; } - visitNode(queue, section, outgoingDirection, hasLocalPath, hasRegularPath, hasWidePath); + this.visitNode(queue, section, outgoingDirection, hasLocalPath, hasRegularPath, hasWidePath); } private void visitNode(WriteQueue queue, RenderSection section, int outgoingDirection, boolean hasLocalPath, boolean hasRegularPath, boolean hasWidePath) { @@ -574,7 +574,7 @@ private void initWithinWorld(WriteQueue queue) { outgoingLocal = GraphDirectionSet.ALL; } - visitNeighbors(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, this.origin); + this.visitNeighbors(queue, originSection, outgoingWide, outgoingRegular, outgoingLocal, this.origin); } // Enqueues sections that are inside the viewport using diamond spiral iteration to avoid sorting and ensure a diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java index 29afd820f7..19e7e86af2 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java @@ -97,7 +97,7 @@ public int getZ() { } public long getCreationTime() { - return creationTime; + return this.creationTime; } public int getChunkX() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/shader/DefaultShaderInterface.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/shader/DefaultShaderInterface.java index 4c672b1b4f..19a9a748f7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/shader/DefaultShaderInterface.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/shader/DefaultShaderInterface.java @@ -89,7 +89,7 @@ public void setupState(TerrainRenderPass pass, FogParameters parameters, GpuSamp 1.0f / textureAtlas.sodium$getHeight() ); - uniformFadePeriod.setFloat((float) (1.0 / (Minecraft.getInstance().options.chunkSectionFadeInTime().get() * 1000.0))); // this is in seconds! + this.uniformFadePeriod.setFloat((float) (1.0 / (Minecraft.getInstance().options.chunkSectionFadeInTime().get() * 1000.0))); // this is in seconds! this.uniformRGSS.setBool(Minecraft.getInstance().options.textureFiltering().get() == TextureFilteringMethod.RGSS); @@ -116,8 +116,8 @@ private void bindTexture(ChunkShaderTextureSlot slot, GpuTextureView textureView @Override public void setChunkData(GlBuffer data, int time) { - uniformChunkData.bindBuffer(data); - uniformCurrentTime.set(time); + this.uniformChunkData.bindBuffer(data); + this.uniformCurrentTime.set(time); } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses.java index 7a5dd80e29..42f80b9795 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/DefaultTerrainRenderPasses.java @@ -1,6 +1,5 @@ package net.caffeinemc.mods.sodium.client.render.chunk.terrain; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; public class DefaultTerrainRenderPasses { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/TerrainRenderPass.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/TerrainRenderPass.java index 2d27641066..91daa5e10f 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/TerrainRenderPass.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/terrain/TerrainRenderPass.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.textures.GpuTextureView; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.texture.TextureAtlas; @@ -31,11 +30,11 @@ public boolean supportsFragmentDiscard() { } public RenderPipeline getPipeline() { - return renderType.pipeline(); + return this.renderType.pipeline(); } public RenderTarget getTarget() { - return (isTranslucent && Minecraft.useShaderTransparency()) ? Minecraft.getInstance().levelRenderer.getTranslucentTarget() : Minecraft.getInstance().getMainRenderTarget(); + return (this.isTranslucent && Minecraft.useShaderTransparency()) ? Minecraft.getInstance().levelRenderer.getTranslucentTarget() : Minecraft.getInstance().getMainRenderTarget(); } public GpuTextureView getAtlas() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/TranslucentGeometryCollector.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/TranslucentGeometryCollector.java index c4865c7212..50b4a9b1f7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/TranslucentGeometryCollector.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/TranslucentGeometryCollector.java @@ -261,7 +261,7 @@ private SortType sortTypeHeuristic() { } int alignedNormalCount = Integer.bitCount(this.alignedFacingBitmap); - int planeCount = getPlaneCount(alignedNormalCount); + int planeCount = this.getPlaneCount(alignedNormalCount); int unalignedNormalCount = this.untrackedUnalignedNormalCount; if (this.unalignedANormal != -1) { @@ -390,7 +390,7 @@ public SortType finishRendering() { } this.quadLists = null; // they're not needed anymore - this.sortType = filterSortType(sortTypeHeuristic(), this.sortBehavior); + this.sortType = filterSortType(this.sortTypeHeuristic(), this.sortBehavior); return this.sortType; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/bsp_tree/BSPSortState.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/bsp_tree/BSPSortState.java index e5d54689dc..eb9a87115d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/bsp_tree/BSPSortState.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/bsp_tree/BSPSortState.java @@ -54,10 +54,10 @@ private void checkModificationCounter(int reduceBy) { void writeIndex(int index) { if (this.indexMap != null) { TranslucentData.writeQuadVertexIndexes(this.indexBuffer, this.indexMap[index]); - checkModificationCounter(1); + this.checkModificationCounter(1); } else if (this.fixedIndexOffset != NO_FIXED_OFFSET) { TranslucentData.writeQuadVertexIndexes(this.indexBuffer, this.fixedIndexOffset + index); - checkModificationCounter(1); + this.checkModificationCounter(1); } else { TranslucentData.writeQuadVertexIndexes(this.indexBuffer, index); } @@ -312,7 +312,7 @@ void writeIndexes(int[] indexes) { // check if the index modification session is over. this is very important or // there's an exception if (useIndexMap || useFixedIndexOffset) { - checkModificationCounter(valueCount); + this.checkModificationCounter(valueCount); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java index 42d5ec0683..fedf9b5fce 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java @@ -87,9 +87,9 @@ private static class DirectTriggerData { Vector3dc getSectionCenter() { if (this.sectionCenter == null) { this.sectionCenter = new Vector3d( - sectionPos.minBlockX() + 8, - sectionPos.minBlockY() + 8, - sectionPos.minBlockZ() + 8); + this.sectionPos.minBlockX() + 8, + this.sectionPos.minBlockY() + 8, + this.sectionPos.minBlockZ() + 8); } return this.sectionCenter; } @@ -110,16 +110,16 @@ Vector3dc getSectionCenter() { * section. */ double getSectionCenterTriggerCameraDist() { - return Math.sqrt(getSectionCenterDistSquared(this.triggerCameraPos)); + return Math.sqrt(this.getSectionCenterDistSquared(this.triggerCameraPos)); } double getSectionCenterDistSquared(Vector3dc vector) { - Vector3dc sectionCenter = getSectionCenter(); + Vector3dc sectionCenter = this.getSectionCenter(); return sectionCenter.distanceSquared(vector); } boolean isAngleTriggering(Vector3dc vector) { - return getSectionCenterDistSquared(vector) > SECTION_CENTER_DIST_SQUARED; + return this.getSectionCenterDistSquared(vector) > SECTION_CENTER_DIST_SQUARED; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java index 4ce9902f94..7a5e086710 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java @@ -11,7 +11,6 @@ import net.caffeinemc.mods.sodium.client.util.interval_tree.Interval; import net.caffeinemc.mods.sodium.client.util.interval_tree.Interval.Bounded; import net.caffeinemc.mods.sodium.client.util.interval_tree.IntervalTree; -import org.joml.Vector3dc; import org.joml.Vector3fc; import java.util.Collection; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/Forest.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/Forest.java index 7e91ab9572..fd9603b641 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/Forest.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/Forest.java @@ -29,7 +29,7 @@ default void add(int x, int y, int z) { boolean add(int x, int y, int z, TreeAddMethod addMethod); default void add(RenderSection section) { - add(section.getChunkX(), section.getChunkY(), section.getChunkZ()); + this.add(section.getChunkX(), section.getChunkY(), section.getChunkZ()); } int getPresence(int x, int y, int z); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/TraversableTree.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/TraversableTree.java index 7fddf1a1e9..99e78fc13e 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/TraversableTree.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/tree/TraversableTree.java @@ -98,7 +98,7 @@ public void traverse(CoordinateSectionVisitor visitor, Viewport viewport, float // everything is already inside the distance limit if the build distance is smaller var initialInside = this.distanceLimit >= buildDistance ? INSIDE_DISTANCE : 0; - this.traverse(getChildOrderModulator(0, 0, 0, 1 << 5), 0, 5, initialInside); + this.traverse(this.getChildOrderModulator(0, 0, 0, 1 << 5), 0, 5, initialInside); this.visitor = null; this.viewport = null; @@ -130,7 +130,7 @@ void traverse(int orderModulator, int nodeOrigin, int level, int inside) { int y = deinterleave6(sectionOrigin >> 1) + this.offsetY; int z = deinterleave6(sectionOrigin >> 2) + this.offsetZ; - if (inside == FULLY_INSIDE || testLeafNode(x, y, z, inside)) { + if (inside == FULLY_INSIDE || this.testLeafNode(x, y, z, inside)) { this.visitor.visit(x, y, z); } } @@ -196,7 +196,7 @@ void testChild(int childOrigin, int childHalfDim, int level, int inside) { // immediately traverse if fully inside if (inside == FULLY_INSIDE) { level--; - this.traverse(getChildOrderModulator(x, y, z, 1 << level), childOrigin, level, inside); + this.traverse(this.getChildOrderModulator(x, y, z, 1 << level), childOrigin, level, inside); return; } @@ -244,7 +244,7 @@ void testChild(int childOrigin, int childHalfDim, int level, int inside) { if (visible) { level--; - this.traverse(getChildOrderModulator(x, y, z, 1 << level), childOrigin, level, inside); + this.traverse(this.getChildOrderModulator(x, y, z, 1 << level), childOrigin, level, inside); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/vertex/builder/ChunkMeshBufferBuilder.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/vertex/builder/ChunkMeshBufferBuilder.java index d5b211cb32..ad42316e3d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/vertex/builder/ChunkMeshBufferBuilder.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/vertex/builder/ChunkMeshBufferBuilder.java @@ -3,7 +3,6 @@ import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkVertexType; -import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import org.lwjgl.system.MemoryUtil; import java.lang.foreign.MemorySegment; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/ModelHelper.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/ModelHelper.java index cd01164df0..5cbdc61bab 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/ModelHelper.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/ModelHelper.java @@ -16,14 +16,10 @@ package net.caffeinemc.mods.sodium.client.render.helper; -import java.util.Arrays; -import java.util.List; - -import com.google.common.collect.ImmutableList; -import org.jspecify.annotations.Nullable; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.core.Direction; +import org.jspecify.annotations.Nullable; + +import java.util.Arrays; /** * Collection of utilities for model implementations. diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/NormalHelper.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/NormalHelper.java index c72f26fd4e..79a2802677 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/NormalHelper.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/helper/NormalHelper.java @@ -16,12 +16,11 @@ package net.caffeinemc.mods.sodium.client.render.helper; -import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView; import net.caffeinemc.mods.sodium.client.render.model.QuadViewImpl; import net.minecraft.core.Direction; import net.minecraft.core.Vec3i; -import org.jspecify.annotations.NonNull; import org.joml.Vector3f; +import org.jspecify.annotations.NonNull; /** * Static routines of general utility for renderer implementations. diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/ImprovedItemModelBuilderBase.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/ImprovedItemModelBuilderBase.java index 7d626be6d9..db337cfcfa 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/ImprovedItemModelBuilderBase.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/ImprovedItemModelBuilderBase.java @@ -5,7 +5,9 @@ import it.unimi.dsi.fastutil.objects.ReferenceArrayList; import net.minecraft.client.renderer.texture.SpriteContents; -import java.util.*; +import java.util.BitSet; +import java.util.Collection; +import java.util.List; import static net.minecraft.client.resources.model.cuboid.ItemModelGenerator.SideDirection; import static net.minecraft.client.resources.model.cuboid.ItemModelGenerator.isTransparent; @@ -122,10 +124,10 @@ public void tryInsertPixel( if (opaque) { // Try insert per-pixel side quads for each side of the pixel. - tryInsertFace(up, SideDirection.UP, sprite, frame, pixelX, pixelY, width, height); - tryInsertFace(down, SideDirection.DOWN, sprite, frame, pixelX, pixelY, width, height); - tryInsertFace(left, SideDirection.LEFT, sprite, frame, pixelX, pixelY, width, height); - tryInsertFace(right, SideDirection.RIGHT, sprite, frame, pixelX, pixelY, width, height); + tryInsertFace(this.up, SideDirection.UP, sprite, frame, pixelX, pixelY, width, height); + tryInsertFace(this.down, SideDirection.DOWN, sprite, frame, pixelX, pixelY, width, height); + tryInsertFace(this.left, SideDirection.LEFT, sprite, frame, pixelX, pixelY, width, height); + tryInsertFace(this.right, SideDirection.RIGHT, sprite, frame, pixelX, pixelY, width, height); } } @@ -133,10 +135,10 @@ public List buildSideFaces() { var output = new ReferenceArrayList(); // Merges and collects all faces from different directions. - buildMergedFaces(output, up, SideDirection.UP); - buildMergedFaces(output, down, SideDirection.DOWN); - buildMergedFaces(output, left, SideDirection.LEFT); - buildMergedFaces(output, right, SideDirection.RIGHT); + buildMergedFaces(output, this.up, SideDirection.UP); + buildMergedFaces(output, this.down, SideDirection.DOWN); + buildMergedFaces(output, this.left, SideDirection.LEFT); + buildMergedFaces(output, this.right, SideDirection.RIGHT); return output; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java index d6d9031e4e..1dd4889fc9 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java @@ -11,18 +11,15 @@ import net.caffeinemc.mods.sodium.client.render.helper.ModelHelper; import net.caffeinemc.mods.sodium.client.services.PlatformBlockAccess; import net.caffeinemc.mods.sodium.client.services.PlatformModelAccess; -import net.caffeinemc.mods.sodium.client.services.SodiumModelData; import net.caffeinemc.mods.sodium.client.util.DirectionUtil; import net.caffeinemc.mods.sodium.client.world.LevelSlice; -import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.resources.model.geometry.BakedQuad; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.RandomSource; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.VoxelShape; import org.jspecify.annotations.Nullable; @@ -40,13 +37,13 @@ public abstract class AbstractBlockRenderContext extends AbstractRenderContext { public class BlockEmitter extends MutableQuadViewImpl { { - data = new int[EncodingFormat.TOTAL_STRIDE]; - clear(); + this.data = new int[EncodingFormat.TOTAL_STRIDE]; + this.clear(); } @Override public void emitDirectly() { - renderQuad(this); + AbstractBlockRenderContext.this.renderQuad(this); } public void emitPart(BlockStateModelPart part, Predicate<@Nullable Direction> cullTest, Consumer emitter) { @@ -196,7 +193,7 @@ protected void prepareCulling(boolean enableCulling) { protected void prepareAoInfo(boolean modelAo) { this.useAmbientOcclusion = this.slice.useAmbientOcclusion(); // Ignore the incorrect IDEA warning here. - this.defaultLightMode = this.useAmbientOcclusion && modelAo && (state != null && PlatformBlockAccess.getInstance().getLightEmission(state, level, pos) == 0) ? LightMode.SMOOTH : LightMode.FLAT; + this.defaultLightMode = this.useAmbientOcclusion && modelAo && (this.state != null && PlatformBlockAccess.getInstance().getLightEmission(this.state, this.level, this.pos) == 0) ? LightMode.SMOOTH : LightMode.FLAT; } protected void shadeQuad(MutableQuadViewImpl quad, LightMode lightMode, boolean emissive, SodiumShadeMode shadeMode) { @@ -232,9 +229,9 @@ public void bufferDefaultModel(BlockStateModelPart part, Predicate cu } // TODO NeoForge 1.21.5 - final List quads = PlatformModelAccess.getInstance().getQuads(level, pos, part, state, cullFace, random); + final List quads = PlatformModelAccess.getInstance().getQuads(this.level, this.pos, part, this.state, cullFace, this.random); final int count = quads.size(); - AmbientOcclusionMode ao = PlatformBlockAccess.getInstance().usesAmbientOcclusion(part, state, null, slice, pos); + AmbientOcclusionMode ao = PlatformBlockAccess.getInstance().usesAmbientOcclusion(part, this.state, null, this.slice, this.pos); for (int j = 0; j < count; j++) { final BakedQuad q = quads.get(j); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/EncodingFormat.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/EncodingFormat.java index ee4a3d6b87..b6a6256b67 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/EncodingFormat.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/EncodingFormat.java @@ -18,7 +18,6 @@ import com.google.common.base.Preconditions; import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFacing; import net.caffeinemc.mods.sodium.client.render.helper.GeometryHelper; import net.caffeinemc.mods.sodium.client.render.helper.ModelHelper; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/MutableQuadViewImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/MutableQuadViewImpl.java index 0cd135d543..8ac35e6c78 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/MutableQuadViewImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/MutableQuadViewImpl.java @@ -22,11 +22,11 @@ import net.caffeinemc.mods.sodium.client.render.helper.TextureHelper; import net.caffeinemc.mods.sodium.client.render.texture.SodiumSpriteFinder; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.core.Direction; import net.minecraft.util.TriState; import org.jetbrains.annotations.Nullable; @@ -55,13 +55,13 @@ public abstract class MutableQuadViewImpl extends QuadViewImpl implements ListSt @Override public List clearAndGet() { - if (cachedList == null) { - cachedList = new ArrayList<>(); - return cachedList; + if (this.cachedList == null) { + this.cachedList = new ArrayList<>(); + return this.cachedList; } - cachedList.clear(); - return cachedList; + this.cachedList.clear(); + return this.cachedList; } /** Used for quick clearing of quad buffers. Implicitly has invalid geometry. */ @@ -94,77 +94,77 @@ public void emitDirectly() { @Nullable public TextureAtlasSprite cachedSprite() { - return cachedSprite; + return this.cachedSprite; } public void cachedSprite(@Nullable TextureAtlasSprite sprite) { - cachedSprite = sprite; + this.cachedSprite = sprite; } public TextureAtlasSprite sprite(SodiumSpriteFinder finder) { - TextureAtlasSprite sprite = cachedSprite; + TextureAtlasSprite sprite = this.cachedSprite; if (sprite == null) { sprite = finder.find(this); - cachedSprite = sprite; + this.cachedSprite = sprite; } return sprite; } public void clear() { - System.arraycopy(DEFAULT, 0, data, baseIndex, EncodingFormat.TOTAL_STRIDE); - isGeometryInvalid = true; - nominalFace = null; - cachedSprite(null); + System.arraycopy(DEFAULT, 0, this.data, this.baseIndex, EncodingFormat.TOTAL_STRIDE); + this.isGeometryInvalid = true; + this.nominalFace = null; + this.cachedSprite(null); } @Override public void load() { super.load(); - cachedSprite(null); + this.cachedSprite(null); } public MutableQuadViewImpl setPos(int vertexIndex, float x, float y, float z) { - final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; - data[index] = Float.floatToRawIntBits(x); - data[index + 1] = Float.floatToRawIntBits(y); - data[index + 2] = Float.floatToRawIntBits(z); - isGeometryInvalid = true; + final int index = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; + this.data[index] = Float.floatToRawIntBits(x); + this.data[index + 1] = Float.floatToRawIntBits(y); + this.data[index + 2] = Float.floatToRawIntBits(z); + this.isGeometryInvalid = true; return this; } public MutableQuadViewImpl setColor(int vertexIndex, int color) { - data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR] = color; + this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR] = color; return this; } public MutableQuadViewImpl setUV(int vertexIndex, float u, float v) { - final int i = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; - data[i] = Float.floatToRawIntBits(u); - data[i + 1] = Float.floatToRawIntBits(v); - cachedSprite(null); + final int i = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; + this.data[i] = Float.floatToRawIntBits(u); + this.data[i + 1] = Float.floatToRawIntBits(v); + this.cachedSprite(null); return this; } public MutableQuadViewImpl spriteBake(TextureAtlasSprite sprite, int bakeFlags) { TextureHelper.bakeSprite(this, sprite, bakeFlags); - cachedSprite(sprite); + this.cachedSprite(sprite); return this; } public MutableQuadViewImpl setLight(int vertexIndex, int lightmap) { - data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP] = lightmap; + this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_LIGHTMAP] = lightmap; return this; } protected void normalFlags(int flags) { - data[baseIndex + HEADER_BITS] = EncodingFormat.normalFlags(data[baseIndex + HEADER_BITS], flags); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.normalFlags(this.data[this.baseIndex + HEADER_BITS], flags); } public MutableQuadViewImpl setNormal(int vertexIndex, float x, float y, float z) { - normalFlags(normalFlags() | (1 << vertexIndex)); - data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL] = NormI8.pack(x, y, z); + this.normalFlags(this.normalFlags() | (1 << vertexIndex)); + this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL] = NormI8.pack(x, y, z); return this; } @@ -176,89 +176,89 @@ public final void populateMissingNormals() { if (normalFlags == 0b1111) return; - final int packedFaceNormal = packedFaceNormal(); + final int packedFaceNormal = this.packedFaceNormal(); for (int v = 0; v < 4; v++) { if ((normalFlags & (1 << v)) == 0) { - data[baseIndex + v * VERTEX_STRIDE + VERTEX_NORMAL] = packedFaceNormal; + this.data[this.baseIndex + v * VERTEX_STRIDE + VERTEX_NORMAL] = packedFaceNormal; } } - normalFlags(0b1111); + this.normalFlags(0b1111); } public final MutableQuadViewImpl setCullFace(@Nullable Direction face) { - data[baseIndex + HEADER_BITS] = EncodingFormat.cullFace(data[baseIndex + HEADER_BITS], face); - setNominalFace(face); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.cullFace(this.data[this.baseIndex + HEADER_BITS], face); + this.setNominalFace(face); return this; } public final MutableQuadViewImpl setNominalFace(@Nullable Direction face) { - nominalFace = face; + this.nominalFace = face; return this; } public MutableQuadViewImpl setRenderType(@Nullable ChunkSectionLayer renderLayer) { - data[baseIndex + HEADER_BITS] = EncodingFormat.renderLayer(data[baseIndex + HEADER_BITS], renderLayer); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.renderLayer(this.data[this.baseIndex + HEADER_BITS], renderLayer); return this; } public MutableQuadViewImpl setEmissive(boolean emissive) { - data[baseIndex + HEADER_BITS] = EncodingFormat.emissive(data[baseIndex + HEADER_BITS], emissive); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.emissive(this.data[this.baseIndex + HEADER_BITS], emissive); return this; } public MutableQuadViewImpl setDiffuseShade(boolean shade) { - data[baseIndex + HEADER_BITS] = EncodingFormat.diffuseShade(data[baseIndex + HEADER_BITS], shade); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.diffuseShade(this.data[this.baseIndex + HEADER_BITS], shade); return this; } public MutableQuadViewImpl setAmbientOcclusion(TriState ao) { Objects.requireNonNull(ao, "ambient occlusion TriState may not be null"); - data[baseIndex + HEADER_BITS] = EncodingFormat.ambientOcclusion(data[baseIndex + HEADER_BITS], ao); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.ambientOcclusion(this.data[this.baseIndex + HEADER_BITS], ao); return this; } public MutableQuadViewImpl setGlint(@Nullable ItemStackRenderState.FoilType glint) { - data[baseIndex + HEADER_BITS] = EncodingFormat.glint(data[baseIndex + HEADER_BITS], glint); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.glint(this.data[this.baseIndex + HEADER_BITS], glint); return this; } public MutableQuadViewImpl setShadeMode(SodiumShadeMode mode) { Objects.requireNonNull(mode, "ShadeMode may not be null"); - data[baseIndex + HEADER_BITS] = EncodingFormat.shadeMode(data[baseIndex + HEADER_BITS], mode); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.shadeMode(this.data[this.baseIndex + HEADER_BITS], mode); return this; } public final MutableQuadViewImpl setTintIndex(int tintIndex) { - data[baseIndex + HEADER_TINT_INDEX] = tintIndex; + this.data[this.baseIndex + HEADER_TINT_INDEX] = tintIndex; return this; } public final MutableQuadViewImpl setQuadAtlas(SodiumQuadAtlas atlas) { - data[baseIndex + HEADER_BITS] = EncodingFormat.quadAtlas(data[baseIndex + HEADER_BITS], atlas); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.quadAtlas(this.data[this.baseIndex + HEADER_BITS], atlas); return this; } public final MutableQuadViewImpl setTag(int tag) { - data[baseIndex + HEADER_TAG] = tag; + this.data[this.baseIndex + HEADER_TAG] = tag; return this; } public MutableQuadViewImpl copyFrom(QuadViewImpl q) { - System.arraycopy(q.data, q.baseIndex, data, baseIndex, EncodingFormat.TOTAL_STRIDE); - nominalFace = q.nominalFace; + System.arraycopy(q.data, q.baseIndex, this.data, this.baseIndex, EncodingFormat.TOTAL_STRIDE); + this.nominalFace = q.nominalFace; - isGeometryInvalid = q.isGeometryInvalid; + this.isGeometryInvalid = q.isGeometryInvalid; - if (!isGeometryInvalid) { - faceNormal.set(q.faceNormal); + if (!this.isGeometryInvalid) { + this.faceNormal.set(q.faceNormal); } if (q instanceof MutableQuadViewImpl mutableQuad) { - cachedSprite(mutableQuad.cachedSprite()); + this.cachedSprite(mutableQuad.cachedSprite()); } else { - cachedSprite(null); + this.cachedSprite(null); } @@ -269,38 +269,38 @@ private void fromVanillaInternal(BakedQuadView quadData) { boolean hasNormals = false; for (int i = 0; i < 4; i++) { - setPos(i, quadData.getX(i), quadData.getY(i), quadData.getZ(i)); - setColor(i, quadData.getColor(i)); - setUV(i, quadData.getTexU(i), quadData.getTexV(i)); - setLight(i, quadData.getMaxLightQuad(i)); + this.setPos(i, quadData.getX(i), quadData.getY(i), quadData.getZ(i)); + this.setColor(i, quadData.getColor(i)); + this.setUV(i, quadData.getTexU(i), quadData.getTexV(i)); + this.setLight(i, quadData.getMaxLightQuad(i)); int normal = quadData.getVertexNormal(i); if (normal != 0) hasNormals = true; - setNormal(i, NormI8.unpackX(normal), NormI8.unpackY(normal), NormI8.unpackZ(normal)); + this.setNormal(i, NormI8.unpackX(normal), NormI8.unpackY(normal), NormI8.unpackZ(normal)); } - normalFlags(hasNormals ? 0b1111 : 0); + this.normalFlags(hasNormals ? 0b1111 : 0); } public final MutableQuadViewImpl fromBakedQuad(BakedQuad quad) { - fromVanillaInternal(((BakedQuadView) (Object) quad)); - setNominalFace(quad.direction()); - setDiffuseShade(quad.materialInfo().shade()); - setTintIndex(quad.materialInfo().tintIndex()); - setAmbientOcclusion(((BakedQuadView) (Object) quad).hasAO() ? TriState.DEFAULT : TriState.FALSE); // TODO: TRUE, or DEFAULT? - setItemRenderType(quad.materialInfo().itemRenderType()); - setRenderType(quad.materialInfo().layer()); - setAnimated(quad.materialInfo().sprite().contents().isAnimated()); - setEmissive(quad.materialInfo().lightEmission() == 15); + this.fromVanillaInternal(((BakedQuadView) (Object) quad)); + this.setNominalFace(quad.direction()); + this.setDiffuseShade(quad.materialInfo().shade()); + this.setTintIndex(quad.materialInfo().tintIndex()); + this.setAmbientOcclusion(((BakedQuadView) (Object) quad).hasAO() ? TriState.DEFAULT : TriState.FALSE); // TODO: TRUE, or DEFAULT? + this.setItemRenderType(quad.materialInfo().itemRenderType()); + this.setRenderType(quad.materialInfo().layer()); + this.setAnimated(quad.materialInfo().sprite().contents().isAnimated()); + this.setEmissive(quad.materialInfo().lightEmission() == 15); // Copy geometry cached inside the quad BakedQuadView bakedView = (BakedQuadView) (Object) quad; - NormI8.unpack(bakedView.getFaceNormal(), faceNormal); - data[baseIndex + HEADER_FACE_NORMAL] = bakedView.getFaceNormal(); - int headerBits = EncodingFormat.lightFace(data[baseIndex + HEADER_BITS], bakedView.getLightFace()); + NormI8.unpack(bakedView.getFaceNormal(), this.faceNormal); + this.data[this.baseIndex + HEADER_FACE_NORMAL] = bakedView.getFaceNormal(); + int headerBits = EncodingFormat.lightFace(this.data[this.baseIndex + HEADER_BITS], bakedView.getLightFace()); headerBits = EncodingFormat.normalFace(headerBits, bakedView.getNormalFace()); - data[baseIndex + HEADER_BITS] = EncodingFormat.geometryFlags(headerBits, bakedView.getFlags()); - isGeometryInvalid = false; + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.geometryFlags(headerBits, bakedView.getFlags()); + this.isGeometryInvalid = false; SodiumQuadAtlas atlas = SodiumQuadAtlas.of(quad.materialInfo().sprite().atlasLocation()); @@ -308,8 +308,8 @@ public final MutableQuadViewImpl fromBakedQuad(BakedQuad quad) { atlas = SodiumQuadAtlas.BLOCK; } - setQuadAtlas(atlas); - cachedSprite(quad.materialInfo().sprite()); + this.setQuadAtlas(atlas); + this.cachedSprite(quad.materialInfo().sprite()); return this; } @@ -321,7 +321,7 @@ public final MutableQuadViewImpl fromBakedQuad(BakedQuad quad) { public MutableQuadViewImpl translate(float x, float y, float z) { for (int i = 0; i < 4; i++) { - setPos(i, getX(i) + x, getY(i) + y, getZ(i) + z); + this.setPos(i, this.getX(i) + x, this.getY(i) + y, this.getZ(i) + z); } return this; @@ -331,14 +331,14 @@ public MutableQuadViewImpl setItemRenderType(RenderType renderType) { ItemRenderType enumValue = ItemRenderType.RENDER_TYPE_2_ENUM.get(renderType); if (enumValue != null) { - data[baseIndex + HEADER_BITS] = EncodingFormat.itemRenderType(data[baseIndex + HEADER_BITS], enumValue); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.itemRenderType(this.data[this.baseIndex + HEADER_BITS], enumValue); } return this; } public MutableQuadViewImpl setAnimated(boolean b) { - data[baseIndex + HEADER_BITS] = EncodingFormat.animated(data[baseIndex + HEADER_BITS], b); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.animated(this.data[this.baseIndex + HEADER_BITS], b); return this; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/QuadViewImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/QuadViewImpl.java index ae773ac3a8..d0e3e92515 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/QuadViewImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/QuadViewImpl.java @@ -21,7 +21,6 @@ import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView; import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFacing; import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFlags; -import net.caffeinemc.mods.sodium.client.render.helper.ColorHelper; import net.caffeinemc.mods.sodium.client.render.helper.GeometryHelper; import net.caffeinemc.mods.sodium.client.render.helper.NormalHelper; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; @@ -58,39 +57,39 @@ public class QuadViewImpl implements ModelQuadView { * The encoded data must contain valid computed geometry. */ public void load() { - isGeometryInvalid = false; - nominalFace = getLightFace(); - NormI8.unpack(packedFaceNormal(), faceNormal); + this.isGeometryInvalid = false; + this.nominalFace = this.getLightFace(); + NormI8.unpack(this.packedFaceNormal(), this.faceNormal); } protected void computeGeometry() { - if (isGeometryInvalid) { - isGeometryInvalid = false; + if (this.isGeometryInvalid) { + this.isGeometryInvalid = false; - NormalHelper.computeFaceNormal(faceNormal, this); - int packedFaceNormal = NormI8.pack(faceNormal); - data[baseIndex + HEADER_FACE_NORMAL] = packedFaceNormal; + NormalHelper.computeFaceNormal(this.faceNormal, this); + int packedFaceNormal = NormI8.pack(this.faceNormal); + this.data[this.baseIndex + HEADER_FACE_NORMAL] = packedFaceNormal; // depends on face normal Direction lightFace = GeometryHelper.lightFace(this); - data[baseIndex + HEADER_BITS] = EncodingFormat.lightFace(data[baseIndex + HEADER_BITS], lightFace); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.lightFace(this.data[this.baseIndex + HEADER_BITS], lightFace); // depends on face normal - data[baseIndex + HEADER_BITS] = EncodingFormat.normalFace(data[baseIndex + HEADER_BITS], ModelQuadFacing.fromPackedNormal(packedFaceNormal)); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.normalFace(this.data[this.baseIndex + HEADER_BITS], ModelQuadFacing.fromPackedNormal(packedFaceNormal)); // depends on light face - data[baseIndex + HEADER_BITS] = EncodingFormat.geometryFlags(data[baseIndex + HEADER_BITS], ModelQuadFlags.getQuadFlags(this, lightFace)); + this.data[this.baseIndex + HEADER_BITS] = EncodingFormat.geometryFlags(this.data[this.baseIndex + HEADER_BITS], ModelQuadFlags.getQuadFlags(this, lightFace)); } } /** gets flags used for lighting - lazily computed via {@link ModelQuadFlags#getQuadFlags}. */ public int geometryFlags() { - computeGeometry(); - return EncodingFormat.geometryFlags(data[baseIndex + HEADER_BITS]); + this.computeGeometry(); + return EncodingFormat.geometryFlags(this.data[this.baseIndex + HEADER_BITS]); } public boolean hasShade() { - return diffuseShade(); + return this.diffuseShade(); } public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { @@ -98,38 +97,38 @@ public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { target = new Vector3f(); } - final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; - target.set(Float.intBitsToFloat(data[index]), Float.intBitsToFloat(data[index + 1]), Float.intBitsToFloat(data[index + 2])); + final int index = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_X; + target.set(Float.intBitsToFloat(this.data[index]), Float.intBitsToFloat(this.data[index + 1]), Float.intBitsToFloat(this.data[index + 2])); return target; } @Nullable public ChunkSectionLayer getRenderType() { - return EncodingFormat.renderLayer(data[baseIndex + HEADER_BITS]); + return EncodingFormat.renderLayer(this.data[this.baseIndex + HEADER_BITS]); } public boolean emissive() { - return EncodingFormat.emissive(data[baseIndex + HEADER_BITS]); + return EncodingFormat.emissive(this.data[this.baseIndex + HEADER_BITS]); } public boolean diffuseShade() { - return EncodingFormat.diffuseShade(data[baseIndex + HEADER_BITS]); + return EncodingFormat.diffuseShade(this.data[this.baseIndex + HEADER_BITS]); } public TriState ambientOcclusion() { - return EncodingFormat.ambientOcclusion(data[baseIndex + HEADER_BITS]); + return EncodingFormat.ambientOcclusion(this.data[this.baseIndex + HEADER_BITS]); } public ItemStackRenderState.@Nullable FoilType glint() { - return EncodingFormat.glint(data[baseIndex + HEADER_BITS]); + return EncodingFormat.glint(this.data[this.baseIndex + HEADER_BITS]); } public SodiumShadeMode getShadeMode() { - return EncodingFormat.shadeMode(data[baseIndex + HEADER_BITS]); + return EncodingFormat.shadeMode(this.data[this.baseIndex + HEADER_BITS]); } public int baseColor(int vertexIndex) { - return data[baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR]; + return this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_COLOR]; } public Vector2f copyUv(int vertexIndex, @Nullable Vector2f target) { @@ -137,60 +136,60 @@ public Vector2f copyUv(int vertexIndex, @Nullable Vector2f target) { target = new Vector2f(); } - final int index = baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; - target.set(Float.intBitsToFloat(data[index]), Float.intBitsToFloat(data[index + 1])); + final int index = this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_U; + target.set(Float.intBitsToFloat(this.data[index]), Float.intBitsToFloat(this.data[index + 1])); return target; } public int normalFlags() { - return EncodingFormat.normalFlags(data[baseIndex + HEADER_BITS]); + return EncodingFormat.normalFlags(this.data[this.baseIndex + HEADER_BITS]); } public boolean hasNormal(int vertexIndex) { - return (normalFlags() & (1 << vertexIndex)) != 0; + return (this.normalFlags() & (1 << vertexIndex)) != 0; } /** True if any vertex normal has been set. */ public boolean hasVertexNormals() { - return normalFlags() != 0; + return this.normalFlags() != 0; } /** True if all vertex normals have been set. */ public boolean hasAllVertexNormals() { - return (normalFlags() & 0b1111) == 0b1111; + return (this.normalFlags() & 0b1111) == 0b1111; } protected final int normalIndex(int vertexIndex) { - return baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL; + return this.baseIndex + vertexIndex * VERTEX_STRIDE + VERTEX_NORMAL; } /** * This method will only return a meaningful value if {@link #hasNormal} returns {@code true} for the same vertex index. */ public int packedNormal(int vertexIndex) { - return data[normalIndex(vertexIndex)]; + return this.data[this.normalIndex(vertexIndex)]; } public float normalX(int vertexIndex) { - return hasNormal(vertexIndex) ? NormI8.unpackX(data[normalIndex(vertexIndex)]) : Float.NaN; + return this.hasNormal(vertexIndex) ? NormI8.unpackX(this.data[this.normalIndex(vertexIndex)]) : Float.NaN; } public float normalY(int vertexIndex) { - return hasNormal(vertexIndex) ? NormI8.unpackY(data[normalIndex(vertexIndex)]) : Float.NaN; + return this.hasNormal(vertexIndex) ? NormI8.unpackY(this.data[this.normalIndex(vertexIndex)]) : Float.NaN; } public float normalZ(int vertexIndex) { - return hasNormal(vertexIndex) ? NormI8.unpackZ(data[normalIndex(vertexIndex)]) : Float.NaN; + return this.hasNormal(vertexIndex) ? NormI8.unpackZ(this.data[this.normalIndex(vertexIndex)]) : Float.NaN; } @Nullable public Vector3f copyNormal(int vertexIndex, @Nullable Vector3f target) { - if (hasNormal(vertexIndex)) { + if (this.hasNormal(vertexIndex)) { if (target == null) { target = new Vector3f(); } - final int normal = data[normalIndex(vertexIndex)]; + final int normal = this.data[this.normalIndex(vertexIndex)]; NormI8.unpack(normal, target); return target; } else { @@ -200,85 +199,85 @@ public Vector3f copyNormal(int vertexIndex, @Nullable Vector3f target) { @Nullable public final Direction getCullFace() { - return EncodingFormat.cullFace(data[baseIndex + HEADER_BITS]); + return EncodingFormat.cullFace(this.data[this.baseIndex + HEADER_BITS]); } public final ModelQuadFacing normalFace() { - computeGeometry(); - return EncodingFormat.normalFace(data[baseIndex + HEADER_BITS]); + this.computeGeometry(); + return EncodingFormat.normalFace(this.data[this.baseIndex + HEADER_BITS]); } @Nullable public final Direction getNominalFace() { - return nominalFace; + return this.nominalFace; } public final int packedFaceNormal() { - computeGeometry(); - return data[baseIndex + HEADER_FACE_NORMAL]; + this.computeGeometry(); + return this.data[this.baseIndex + HEADER_FACE_NORMAL]; } public final Vector3f faceNormal() { - computeGeometry(); - return faceNormal; + this.computeGeometry(); + return this.faceNormal; } public final int getTag() { - return data[baseIndex + HEADER_TAG]; + return this.data[this.baseIndex + HEADER_TAG]; } @Override public float getX(int idx) { - return Float.intBitsToFloat(data[baseIndex + idx * VERTEX_STRIDE + VERTEX_X]); + return Float.intBitsToFloat(this.data[this.baseIndex + idx * VERTEX_STRIDE + VERTEX_X]); } @Override public float getY(int idx) { - return Float.intBitsToFloat(data[baseIndex + idx * VERTEX_STRIDE + VERTEX_Y]); + return Float.intBitsToFloat(this.data[this.baseIndex + idx * VERTEX_STRIDE + VERTEX_Y]); } @Override public float getZ(int idx) { - return Float.intBitsToFloat(data[baseIndex + idx * VERTEX_STRIDE + VERTEX_Z]); + return Float.intBitsToFloat(this.data[this.baseIndex + idx * VERTEX_STRIDE + VERTEX_Z]); } public float posByIndex(int vertexIndex, int coordinateIndex) { // TODO: check - return Float.intBitsToFloat(data[baseIndex + vertexIndex * VERTEX_STRIDE + (VERTEX_X + coordinateIndex)]); + return Float.intBitsToFloat(this.data[this.baseIndex + vertexIndex * VERTEX_STRIDE + (VERTEX_X + coordinateIndex)]); } @Override public int getColor(int idx) { - return baseColor(idx); + return this.baseColor(idx); } @Override public float getTexU(int idx) { - return Float.intBitsToFloat(data[baseIndex + idx * VERTEX_STRIDE + VERTEX_U]); + return Float.intBitsToFloat(this.data[this.baseIndex + idx * VERTEX_STRIDE + VERTEX_U]); } @Override public float getTexV(int idx) { - return Float.intBitsToFloat(data[baseIndex + idx * VERTEX_STRIDE + VERTEX_V]); + return Float.intBitsToFloat(this.data[this.baseIndex + idx * VERTEX_STRIDE + VERTEX_V]); } @Override public int getVertexNormal(int idx) { - return data[normalIndex(idx)]; + return this.data[this.normalIndex(idx)]; } @Override public int getFaceNormal() { - return packedFaceNormal(); + return this.packedFaceNormal(); } @Override public int getLight(int idx) { - return data[baseIndex + idx * VERTEX_STRIDE + VERTEX_LIGHTMAP]; + return this.data[this.baseIndex + idx * VERTEX_STRIDE + VERTEX_LIGHTMAP]; } @Override public int getTintIndex() { - return data[baseIndex + HEADER_TINT_INDEX]; + return this.data[this.baseIndex + HEADER_TINT_INDEX]; } @Override @@ -288,29 +287,29 @@ public TextureAtlasSprite getSprite() { @Override public Direction getLightFace() { - computeGeometry(); - return EncodingFormat.lightFace(data[baseIndex + HEADER_BITS]); + this.computeGeometry(); + return EncodingFormat.lightFace(this.data[this.baseIndex + HEADER_BITS]); } @Override public int getMaxLightQuad(int idx) { - return getLight(idx); + return this.getLight(idx); } @Override public int getFlags() { - return geometryFlags(); + return this.geometryFlags(); } public SodiumQuadAtlas getQuadAtlas() { - return EncodingFormat.quadAtlas(data[baseIndex + HEADER_BITS]); + return EncodingFormat.quadAtlas(this.data[this.baseIndex + HEADER_BITS]); } public RenderType itemRenderType() { - return EncodingFormat.itemRenderType(data[baseIndex + HEADER_BITS]); + return EncodingFormat.itemRenderType(this.data[this.baseIndex + HEADER_BITS]); } public boolean animated() { - return EncodingFormat.animated(data[baseIndex + HEADER_BITS]); + return EncodingFormat.animated(this.data[this.baseIndex + HEADER_BITS]); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/texture/SodiumSpriteFinderImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/texture/SodiumSpriteFinderImpl.java index a1b3790881..1aa421a40a 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/texture/SodiumSpriteFinderImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/texture/SodiumSpriteFinderImpl.java @@ -16,8 +16,6 @@ package net.caffeinemc.mods.sodium.client.render.texture; -import java.util.Map; - import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView; import net.caffeinemc.mods.sodium.client.render.model.SodiumQuadAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -26,6 +24,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Map; + /** * Indexes an atlas sprite to allow fast lookup of Sprites from * baked vertex coordinates. Implementation is a straightforward @@ -44,10 +44,10 @@ public class SodiumSpriteFinderImpl implements SodiumSpriteFinder { private int badSpriteCount = 0; public SodiumSpriteFinderImpl(Map sprites, TextureAtlasSprite missingSprite, SodiumQuadAtlas atlas) { - root = new Node(0.5f, 0.5f, 0.25f); + this.root = new Node(0.5f, 0.5f, 0.25f); this.missingSprite = missingSprite; this.atlas = atlas; - sprites.values().forEach(root::add); + sprites.values().forEach(this.root::add); } @Override @@ -60,17 +60,17 @@ public TextureAtlasSprite find(ModelQuadView quad) { v += quad.getTexV(i); } - return find(u * 0.25f, v * 0.25f); + return this.find(u * 0.25f, v * 0.25f); } @Override public TextureAtlasSprite find(float u, float v) { - return root.find(u, v); + return this.root.find(u, v); } @Override public SodiumQuadAtlas getAtlas() { - return atlas; + return this.atlas; } private class Node { @@ -90,7 +90,7 @@ private class Node { Node(float midU, float midV, float radius) { this.midU = midU; this.midV = midV; - cellRadius = radius; + this.cellRadius = radius; } static final float EPS = 0.00001f; @@ -99,7 +99,7 @@ void add(TextureAtlasSprite sprite) { if (sprite.getU0() < 0 - EPS || sprite.getU1() > 1 + EPS || sprite.getV0() < 0 - EPS || sprite.getV1() > 1 + EPS) { // Sprite has broken bounds. This SHOULD NOT happen, but in the past some mods have broken this. // Prefer failing with a log warning rather than risking a stack overflow. - if (badSpriteCount++ < 5) { + if (SodiumSpriteFinderImpl.this.badSpriteCount++ < 5) { String errorMessage = "SpriteFinderImpl: Skipping sprite {} with broken bounds [{}, {}]x[{}, {}]. Sprite bounds should be between 0 and 1."; LOGGER.error(errorMessage, sprite.contents().name(), sprite.getU0(), sprite.getU1(), sprite.getV0(), sprite.getV1()); } @@ -107,25 +107,25 @@ void add(TextureAtlasSprite sprite) { return; } - final boolean lowU = sprite.getU0() < midU - EPS; - final boolean highU = sprite.getU1() > midU + EPS; - final boolean lowV = sprite.getV0() < midV - EPS; - final boolean highV = sprite.getV1() > midV + EPS; + final boolean lowU = sprite.getU0() < this.midU - EPS; + final boolean highU = sprite.getU1() > this.midU + EPS; + final boolean lowV = sprite.getV0() < this.midV - EPS; + final boolean highV = sprite.getV1() > this.midV + EPS; if (lowU && lowV) { - lowLow = addInner(sprite, lowLow, -1, -1); + this.lowLow = this.addInner(sprite, this.lowLow, -1, -1); } if (lowU && highV) { - lowHigh = addInner(sprite, lowHigh, -1, 1); + this.lowHigh = this.addInner(sprite, this.lowHigh, -1, 1); } if (highU && lowV) { - highLow = addInner(sprite, highLow, 1, -1); + this.highLow = this.addInner(sprite, this.highLow, 1, -1); } if (highU && highV) { - highHigh = addInner(sprite, highHigh, 1, 1); + this.highHigh = this.addInner(sprite, this.highHigh, 1, 1); } } @@ -136,7 +136,7 @@ private Object addInner(TextureAtlasSprite sprite, @Nullable Object quadrant, in node.add(sprite); return quadrant; } else { - Node n = new Node(midU + cellRadius * uStep, midV + cellRadius * vStep, cellRadius * 0.5f); + Node n = new Node(this.midU + this.cellRadius * uStep, this.midV + this.cellRadius * vStep, this.cellRadius * 0.5f); if (quadrant instanceof TextureAtlasSprite prevSprite) { n.add(prevSprite); @@ -148,10 +148,10 @@ private Object addInner(TextureAtlasSprite sprite, @Nullable Object quadrant, in } private TextureAtlasSprite find(float u, float v) { - if (u < midU) { - return v < midV ? findInner(lowLow, u, v) : findInner(lowHigh, u, v); + if (u < this.midU) { + return v < this.midV ? this.findInner(this.lowLow, u, v) : this.findInner(this.lowHigh, u, v); } else { - return v < midV ? findInner(highLow, u, v) : findInner(highHigh, u, v); + return v < this.midV ? this.findInner(this.highLow, u, v) : this.findInner(this.highHigh, u, v); } } @@ -161,7 +161,7 @@ private TextureAtlasSprite findInner(@Nullable Object quadrant, float u, float v } else if (quadrant instanceof TextureAtlasSprite sprite) { return sprite; } else { - return missingSprite; + return SodiumSpriteFinderImpl.this.missingSprite; } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java index 21b886322b..196f2b10c0 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java @@ -38,53 +38,53 @@ public SimpleFrustum(FrustumIntersection frustumIntersection) { throw new RuntimeException("Failed to access planes field in FrustumIntersection", e); } - nxX = planes[0].x; - nxY = planes[0].y; - nxZ = planes[0].z; - pxX = planes[1].x; - pxY = planes[1].y; - pxZ = planes[1].z; - nyX = planes[2].x; - nyY = planes[2].y; - nyZ = planes[2].z; - pyX = planes[3].x; - pyY = planes[3].y; - pyZ = planes[3].z; - nzX = planes[4].x; - nzY = planes[4].y; - nzZ = planes[4].z; - pzX = planes[5].x; - pzY = planes[5].y; - pzZ = planes[5].z; + this.nxX = planes[0].x; + this.nxY = planes[0].y; + this.nxZ = planes[0].z; + this.pxX = planes[1].x; + this.pxY = planes[1].y; + this.pxZ = planes[1].z; + this.nyX = planes[2].x; + this.nyY = planes[2].y; + this.nyZ = planes[2].z; + this.pyX = planes[3].x; + this.pyY = planes[3].y; + this.pyZ = planes[3].z; + this.nzX = planes[4].x; + this.nzY = planes[4].y; + this.nzZ = planes[4].z; + this.pzX = planes[5].x; + this.pzY = planes[5].y; + this.pzZ = planes[5].z; final float size = Viewport.CHUNK_SECTION_PADDED_RADIUS; - negNxW = -(planes[0].w + nxX * (nxX < 0 ? -size : size) + - nxY * (nxY < 0 ? -size : size) + - nxZ * (nxZ < 0 ? -size : size)); - negPxW = -(planes[1].w + pxX * (pxX < 0 ? -size : size) + - pxY * (pxY < 0 ? -size : size) + - pxZ * (pxZ < 0 ? -size : size)); - negNyW = -(planes[2].w + nyX * (nyX < 0 ? -size : size) + - nyY * (nyY < 0 ? -size : size) + - nyZ * (nyZ < 0 ? -size : size)); - negPyW = -(planes[3].w + pyX * (pyX < 0 ? -size : size) + - pyY * (pyY < 0 ? -size : size) + - pyZ * (pyZ < 0 ? -size : size)); - negNzW = -(planes[4].w + nzX * (nzX < 0 ? -size : size) + - nzY * (nzY < 0 ? -size : size) + - nzZ * (nzZ < 0 ? -size : size)); - negPzW = -(planes[5].w + pzX * (pzX < 0 ? -size : size) + - pzY * (pzY < 0 ? -size : size) + - pzZ * (pzZ < 0 ? -size : size)); + this.negNxW = -(planes[0].w + this.nxX * (this.nxX < 0 ? -size : size) + + this.nxY * (this.nxY < 0 ? -size : size) + + this.nxZ * (this.nxZ < 0 ? -size : size)); + this.negPxW = -(planes[1].w + this.pxX * (this.pxX < 0 ? -size : size) + + this.pxY * (this.pxY < 0 ? -size : size) + + this.pxZ * (this.pxZ < 0 ? -size : size)); + this.negNyW = -(planes[2].w + this.nyX * (this.nyX < 0 ? -size : size) + + this.nyY * (this.nyY < 0 ? -size : size) + + this.nyZ * (this.nyZ < 0 ? -size : size)); + this.negPyW = -(planes[3].w + this.pyX * (this.pyX < 0 ? -size : size) + + this.pyY * (this.pyY < 0 ? -size : size) + + this.pyZ * (this.pyZ < 0 ? -size : size)); + this.negNzW = -(planes[4].w + this.nzX * (this.nzX < 0 ? -size : size) + + this.nzY * (this.nzY < 0 ? -size : size) + + this.nzZ * (this.nzZ < 0 ? -size : size)); + this.negPzW = -(planes[5].w + this.pzX * (this.pzX < 0 ? -size : size) + + this.pzY * (this.pzY < 0 ? -size : size) + + this.pzZ * (this.pzZ < 0 ? -size : size)); } public boolean testSection(float x, float y, float z) { // Skip far plane checks because it has been ensured by searchDistance and isWithinRenderDistance check in OcclusionCuller - return nxX * x + nxY * y + nxZ * z >= negNxW && - pxX * x + pxY * y + pxZ * z >= negPxW && - nyX * x + nyY * y + nyZ * z >= negNyW && - pyX * x + pyY * y + pyZ * z >= negPyW && - nzX * x + nzY * y + nzZ * z >= negNzW; + return this.nxX * x + this.nxY * y + this.nxZ * z >= this.negNxW && + this.pxX * x + this.pxY * y + this.pxZ * z >= this.negPxW && + this.nyX * x + this.nyY * y + this.nyZ * z >= this.negNyW && + this.pyX * x + this.pyY * y + this.pyZ * z >= this.negPyW && + this.nzX * x + this.nzY * y + this.nzZ * z >= this.negNzW; } public boolean testSectionExpanded(float floatOriginX, float floatOriginY, float floatOriginZ, float extend) { @@ -95,12 +95,12 @@ public boolean testSectionExpanded(float floatOriginX, float floatOriginY, float float minZ = floatOriginZ - extend; float maxZ = floatOriginZ + extend; - return nxX * (nxX < 0 ? minX : maxX) + nxY * (nxY < 0 ? minY : maxY) + nxZ * (nxZ < 0 ? minZ : maxZ) >= negNxW && - pxX * (pxX < 0 ? minX : maxX) + pxY * (pxY < 0 ? minY : maxY) + pxZ * (pxZ < 0 ? minZ : maxZ) >= negPxW && - nyX * (nyX < 0 ? minX : maxX) + nyY * (nyY < 0 ? minY : maxY) + nyZ * (nyZ < 0 ? minZ : maxZ) >= negNyW && - pyX * (pyX < 0 ? minX : maxX) + pyY * (pyY < 0 ? minY : maxY) + pyZ * (pyZ < 0 ? minZ : maxZ) >= negPyW && - nzX * (nzX < 0 ? minX : maxX) + nzY * (nzY < 0 ? minY : maxY) + nzZ * (nzZ < 0 ? minZ : maxZ) >= negNzW && - pzX * (pzX < 0 ? minX : maxX) + pzY * (pzY < 0 ? minY : maxY) + pzZ * (pzZ < 0 ? minZ : maxZ) >= negPzW; + return this.nxX * (this.nxX < 0 ? minX : maxX) + this.nxY * (this.nxY < 0 ? minY : maxY) + this.nxZ * (this.nxZ < 0 ? minZ : maxZ) >= this.negNxW && + this.pxX * (this.pxX < 0 ? minX : maxX) + this.pxY * (this.pxY < 0 ? minY : maxY) + this.pxZ * (this.pxZ < 0 ? minZ : maxZ) >= this.negPxW && + this.nyX * (this.nyX < 0 ? minX : maxX) + this.nyY * (this.nyY < 0 ? minY : maxY) + this.nyZ * (this.nyZ < 0 ? minZ : maxZ) >= this.negNyW && + this.pyX * (this.pyX < 0 ? minX : maxX) + this.pyY * (this.pyY < 0 ? minY : maxY) + this.pyZ * (this.pyZ < 0 ? minZ : maxZ) >= this.negPyW && + this.nzX * (this.nzX < 0 ? minX : maxX) + this.nzY * (this.nzY < 0 ? minY : maxY) + this.nzZ * (this.nzZ < 0 ? minZ : maxZ) >= this.negNzW && + this.pzX * (this.pzX < 0 ? minX : maxX) + this.pzY * (this.pzY < 0 ? minY : maxY) + this.pzZ * (this.pzZ < 0 ? minZ : maxZ) >= this.negPzW; } @Override diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/DefaultModelEmitter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/DefaultModelEmitter.java index c1bcafefb3..abc17ef319 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/DefaultModelEmitter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/DefaultModelEmitter.java @@ -1,17 +1,15 @@ package net.caffeinemc.mods.sodium.client.services; -import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import java.util.List; -import java.util.function.BiConsumer; import java.util.function.Predicate; public class DefaultModelEmitter implements PlatformModelEmitter { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelAccess.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelAccess.java index 9a7e7a3af6..4bd502de92 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelAccess.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelAccess.java @@ -2,16 +2,14 @@ import net.caffeinemc.mods.sodium.client.model.color.ColorProvider; import net.caffeinemc.mods.sodium.client.render.helper.ListStorage; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.resources.model.geometry.BakedQuad; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; import net.minecraft.util.RandomSource; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.ApiStatus; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java index 04ddb6d33b..e5d5f3f6c6 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/PlatformModelEmitter.java @@ -1,16 +1,14 @@ package net.caffeinemc.mods.sodium.client.services; import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import org.apache.logging.log4j.util.TriConsumer; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Predicate; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/SodiumModelDataContainer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/SodiumModelDataContainer.java index acd20d8f67..a3c592a40b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/services/SodiumModelDataContainer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/services/SodiumModelDataContainer.java @@ -3,8 +3,6 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import net.minecraft.core.BlockPos; -import java.util.Map; - /** * A container that holds the platform's model data. */ @@ -18,10 +16,10 @@ public SodiumModelDataContainer(Long2ObjectMap modelDataMap) { } public SodiumModelData getModelData(BlockPos pos) { - return modelDataMap.getOrDefault(pos.asLong(), SodiumModelData.EMPTY); + return this.modelDataMap.getOrDefault(pos.asLong(), SodiumModelData.EMPTY); } public boolean isEmpty() { - return isEmpty; + return this.isEmpty; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/DoubleInterval.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/DoubleInterval.java index e5c60f3852..1d04236853 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/DoubleInterval.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/DoubleInterval.java @@ -92,14 +92,14 @@ protected Interval create() { */ @Override public boolean isEmpty() { - if (getStart() != null && getStart().isNaN()) + if (this.getStart() != null && this.getStart().isNaN()) return true; - if (getEnd() != null && getEnd().isNaN()) + if (this.getEnd() != null && this.getEnd().isNaN()) return true; - if (getStart() != null && getEnd() != null) { - if (getStart() == Double.POSITIVE_INFINITY && getEnd() == Double.POSITIVE_INFINITY) + if (this.getStart() != null && this.getEnd() != null) { + if (this.getStart() == Double.POSITIVE_INFINITY && this.getEnd() == Double.POSITIVE_INFINITY) return true; - if (getStart() == Double.NEGATIVE_INFINITY && getEnd() == Double.NEGATIVE_INFINITY) + if (this.getStart() == Double.NEGATIVE_INFINITY && this.getEnd() == Double.NEGATIVE_INFINITY) return true; } return super.isEmpty(); @@ -123,24 +123,24 @@ public boolean isEmpty() { */ @Override public Double getMidpoint() { - if (isEmpty()) + if (this.isEmpty()) return null; // Handle null values - if (getStart() == null && getEnd() == null) + if (this.getStart() == null && this.getEnd() == null) return 0.0; - if (getStart() == null) - return getEnd() - OFFSET; - if (getEnd() == null) - return getStart() + OFFSET; + if (this.getStart() == null) + return this.getEnd() - OFFSET; + if (this.getEnd() == null) + return this.getStart() + OFFSET; // Now we are sure there are no more null values involved - if (getStart() == Double.NEGATIVE_INFINITY && getEnd() == Double.POSITIVE_INFINITY) + if (this.getStart() == Double.NEGATIVE_INFINITY && this.getEnd() == Double.POSITIVE_INFINITY) return 0.0; - if (getStart() == Double.NEGATIVE_INFINITY) - return getEnd() - OFFSET; - if (getEnd() == Double.POSITIVE_INFINITY) - return getStart() + OFFSET; - return getStart() + (getEnd() - getStart()) / 2; + if (this.getStart() == Double.NEGATIVE_INFINITY) + return this.getEnd() - OFFSET; + if (this.getEnd() == Double.POSITIVE_INFINITY) + return this.getStart() + OFFSET; + return this.getStart() + (this.getEnd() - this.getStart()) / 2; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/Interval.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/Interval.java index 3c677ed151..3ca8ed67cd 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/Interval.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/Interval.java @@ -244,7 +244,7 @@ public boolean isEmpty() { * @return The newly created interval. */ protected Interval create(T start, boolean isStartInclusive, T end, boolean isEndInclusive) { - Interval interval = create(); + Interval interval = this.create(); interval.start = start; interval.isStartInclusive = isStartInclusive; interval.end = end; @@ -287,7 +287,7 @@ public boolean isEndInclusive() { * @return {@code true}, if the current interval contains the {@code query} point or false otherwise. */ public boolean contains(T query) { - if (isEmpty() || query == null) { + if (this.isEmpty() || query == null) { return false; } @@ -308,7 +308,7 @@ public boolean contains(T query) { * @return The intersection of the current interval wih the {@code other} interval. */ public Interval getIntersection(Interval other) { - if (other == null || isEmpty() || other.isEmpty()) + if (other == null || this.isEmpty() || other.isEmpty()) return null; // Make sure that the one with the smaller starting point gets intersected with the other. // If necessary, swap the intervals @@ -352,7 +352,7 @@ public Interval getIntersection(Interval other) { isNewEndInclusive = other.isEndInclusive; } } - Interval intersection = create(newStart, isNewStartInclusive, newEnd, isNewEndInclusive); + Interval intersection = this.create(newStart, isNewStartInclusive, newEnd, isNewEndInclusive); return intersection.isEmpty() ? null : intersection; } @@ -368,7 +368,7 @@ public Interval getIntersection(Interval other) { public boolean intersects(Interval query) { if (query == null) return false; - Interval intersection = getIntersection(query); + Interval intersection = this.getIntersection(query); return intersection != null; } @@ -391,7 +391,7 @@ public boolean isRightOf(T point, boolean inclusive) { int compare = point.compareTo(this.start); if (compare != 0) return compare < 0; - return !isStartInclusive() || !inclusive; + return !this.isStartInclusive() || !inclusive; } /** @@ -406,7 +406,7 @@ public boolean isRightOf(T point, boolean inclusive) { * interval, or {@code false} instead. */ public boolean isRightOf(T point) { - return isRightOf(point, true); + return this.isRightOf(point, true); } /** @@ -424,7 +424,7 @@ public boolean isRightOf(T point) { public boolean isRightOf(Interval other) { if (other == null || other.isEmpty()) return false; - return isRightOf(other.end, other.isEndInclusive()); + return this.isRightOf(other.end, other.isEndInclusive()); } /** @@ -446,7 +446,7 @@ public boolean isLeftOf(T point, boolean inclusive) { int compare = point.compareTo(this.end); if (compare != 0) return compare > 0; - return !isEndInclusive() || !inclusive; + return !this.isEndInclusive() || !inclusive; } /** @@ -461,7 +461,7 @@ public boolean isLeftOf(T point, boolean inclusive) { * interval, or {@code false} instead. */ public boolean isLeftOf(T point) { - return isLeftOf(point, true); + return this.isLeftOf(point, true); } /** @@ -479,7 +479,7 @@ public boolean isLeftOf(T point) { public boolean isLeftOf(Interval other) { if (other == null || other.isEmpty()) return false; - return isLeftOf(other.start, other.isStartInclusive()); + return this.isLeftOf(other.start, other.isStartInclusive()); } /** diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/TreeNode.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/TreeNode.java index 6845489a1c..cd4c7b7b91 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/TreeNode.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/interval_tree/TreeNode.java @@ -224,17 +224,17 @@ private TreeNode balanceOut() { // The tree is right-heavy. if (height(this.right.left) > height(this.right.right)) { this.right = this.right.rightRotate(); - return leftRotate(); + return this.leftRotate(); } else { - return leftRotate(); + return this.leftRotate(); } } else if (balance > 1) { // The tree is left-heavy. if (height(this.left.right) > height(this.left.left)) { this.left = this.left.leftRotate(); - return rightRotate(); + return this.rightRotate(); } else - return rightRotate(); + return this.rightRotate(); } else { // The tree is already balanced. return this; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/LevelSlice.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/LevelSlice.java index a840f4eb61..b5fa5b974e 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/LevelSlice.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/LevelSlice.java @@ -1,25 +1,24 @@ package net.caffeinemc.mods.sodium.client.world; import it.unimi.dsi.fastutil.ints.Int2ReferenceMap; -import net.caffeinemc.mods.sodium.client.services.*; -import net.caffeinemc.mods.sodium.client.world.biome.LevelColorCache; +import net.caffeinemc.mods.sodium.client.services.PlatformLevelRenderHooks; +import net.caffeinemc.mods.sodium.client.services.SodiumModelData; +import net.caffeinemc.mods.sodium.client.services.SodiumModelDataContainer; import net.caffeinemc.mods.sodium.client.world.biome.LevelBiomeSlice; +import net.caffeinemc.mods.sodium.client.world.biome.LevelColorCache; import net.caffeinemc.mods.sodium.client.world.cloned.ChunkRenderContext; import net.caffeinemc.mods.sodium.client.world.cloned.ClonedChunkSection; import net.caffeinemc.mods.sodium.client.world.cloned.ClonedChunkSectionCache; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Holder; import net.minecraft.core.SectionPos; import net.minecraft.util.Mth; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -350,7 +349,7 @@ public BlockEntity getBlockEntity(int blockX, int blockY, int blockZ) { @Override public CardinalLighting cardinalLighting() { - return level.cardinalLighting(); + return this.level.cardinalLighting(); } @Override @@ -400,6 +399,6 @@ public static int getLocalSectionIndex(int sectionX, int sectionY, int sectionZ) } public boolean useAmbientOcclusion() { - return ambientOcclusion; + return this.ambientOcclusion; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/biome/LevelColorCache.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/biome/LevelColorCache.java index a245f6f14d..582f62dd85 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/biome/LevelColorCache.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/biome/LevelColorCache.java @@ -110,7 +110,7 @@ private void updateColorBuffers(int relY, ColorResolver resolver, Slice slice) { } public int getBlendRadius() { - return blendRadius; + return this.blendRadius; } private static class Slice { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ChunkRenderContext.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ChunkRenderContext.java index 0242748dcc..9f31b4b998 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ChunkRenderContext.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ChunkRenderContext.java @@ -1,6 +1,5 @@ package net.caffeinemc.mods.sodium.client.world.cloned; -import net.caffeinemc.mods.sodium.client.services.SodiumModelDataContainer; import net.minecraft.core.SectionPos; import net.minecraft.world.level.levelgen.structure.BoundingBox; @@ -32,6 +31,6 @@ public BoundingBox getVolume() { } public List getRenderers() { - return renderers; + return this.renderers; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSection.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSection.java index 93c85499bf..81bfc3e496 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSection.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/world/cloned/ClonedChunkSection.java @@ -52,7 +52,7 @@ public ClonedChunkSection(Level level, LevelChunk chunk, @Nullable LevelChunkSec Int2ReferenceMap blockEntityMap = null; Int2ReferenceMap blockEntityRenderDataMap = null; SodiumModelDataContainer modelMap = PlatformModelAccess.getInstance().getModelDataContainer(level, pos); - auxLightManager = PlatformLevelAccess.INSTANCE.getLightManager(chunk, pos); + this.auxLightManager = PlatformLevelAccess.INSTANCE.getLightManager(chunk, pos); if (section != null) { if (!section.hasOnlyAir()) { @@ -248,7 +248,7 @@ public SectionPos getPosition() { } public SodiumModelDataContainer getModelMap() { - return modelMap; + return this.modelMap; } public @Nullable DataLayer getLightArray(LightLayer lightType) { @@ -264,6 +264,6 @@ public void setLastUsedTimestamp(long timestamp) { } public SodiumAuxiliaryLightManager getAuxLightManager() { - return auxLightManager; + return this.auxLightManager; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/SodiumMixinPlugin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/SodiumMixinPlugin.java index 091a950c4d..e5101ceb74 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/SodiumMixinPlugin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/SodiumMixinPlugin.java @@ -30,7 +30,7 @@ public void onLoad(String mixinPackage) { this.dependencyResolutionFailed = PlatformRuntimeInformation.getInstance().isModInLoadingList("embeddium"); - if (dependencyResolutionFailed) { + if (this.dependencyResolutionFailed) { this.logger.error("Not applying any Sodium mixins; dependency resolution has failed."); } @@ -45,7 +45,7 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (dependencyResolutionFailed) { + if (this.dependencyResolutionFailed) { return false; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/WindowMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/WindowMixin.java index 38b57dcc3f..4166a8d16e 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/WindowMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/WindowMixin.java @@ -1,14 +1,11 @@ package net.caffeinemc.mods.sodium.mixin.core; import com.mojang.blaze3d.opengl.GlBackend; -import net.caffeinemc.mods.sodium.client.platform.NativeWindowHandle; import net.caffeinemc.mods.sodium.client.SodiumClientMod; import net.caffeinemc.mods.sodium.client.compatibility.workarounds.Workarounds; import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; import org.lwjgl.glfw.GLFW; -import org.lwjgl.glfw.GLFWNativeWin32; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/BlockEntityTypeMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/BlockEntityTypeMixin.java index 63709d4ce4..ce89c509c2 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/BlockEntityTypeMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/BlockEntityTypeMixin.java @@ -1,7 +1,5 @@ package net.caffeinemc.mods.sodium.mixin.core.render; -import java.util.function.Predicate; - import net.caffeinemc.mods.sodium.api.blockentity.BlockEntityRenderPredicate; import net.caffeinemc.mods.sodium.client.render.chunk.ExtendedBlockEntityType; import net.minecraft.world.level.block.entity.BlockEntity; @@ -17,23 +15,23 @@ public class BlockEntityTypeMixin implements ExtendedBloc @Override public BlockEntityRenderPredicate[] sodium$getRenderPredicates() { - return sodium$renderPredicates; + return this.sodium$renderPredicates; } @Override public void sodium$addRenderPredicate(BlockEntityRenderPredicate predicate) { - sodium$renderPredicates = ArrayUtils.add(sodium$renderPredicates, predicate); + this.sodium$renderPredicates = ArrayUtils.add(this.sodium$renderPredicates, predicate); } @Override public boolean sodium$removeRenderPredicate(BlockEntityRenderPredicate predicate) { - int index = ArrayUtils.indexOf(sodium$renderPredicates, predicate); + int index = ArrayUtils.indexOf(this.sodium$renderPredicates, predicate); if (index == ArrayUtils.INDEX_NOT_FOUND) { return false; } - sodium$renderPredicates = ArrayUtils.remove(sodium$renderPredicates, index); + this.sodium$renderPredicates = ArrayUtils.remove(this.sodium$renderPredicates, index); return true; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/TextureAtlasMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/TextureAtlasMixin.java index 855d579fa4..8533fb562b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/TextureAtlasMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/TextureAtlasMixin.java @@ -49,6 +49,6 @@ public class TextureAtlasMixin implements ExtendedTextureAtlas { @Override public SodiumSpriteFinder sodium$getSpriteFinder() { - return new SodiumSpriteFinderImpl(this.texturesByName, this.missingSprite, isBlocks ? SodiumQuadAtlas.BLOCK : SodiumQuadAtlas.ITEM); + return new SodiumSpriteFinderImpl(this.texturesByName, this.missingSprite, this.isBlocks ? SodiumQuadAtlas.BLOCK : SodiumQuadAtlas.ITEM); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/frustum/GameRendererAccessor.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/frustum/GameRendererAccessor.java index acfe7521fc..791ea7a1c4 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/frustum/GameRendererAccessor.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/frustum/GameRendererAccessor.java @@ -1,7 +1,6 @@ package net.caffeinemc.mods.sodium.mixin.core.render.frustum; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.renderer.state.OptionsRenderState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java index ec198c1731..3f4d8818fe 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java @@ -66,7 +66,7 @@ public void push(MemoryStack stack, long src, int count, VertexFormat format) { } this.vertices += count; - this.vertexPointer = (dst + length) - vertexSize; + this.vertexPointer = (dst + length) - this.vertexSize; this.elementsToFill = 0; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java index 551492f3ea..3d9223fb6e 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java @@ -1,8 +1,8 @@ package net.caffeinemc.mods.sodium.mixin.core.render.immediate.consumer; -import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; import org.lwjgl.system.MemoryStack; import org.spongepowered.asm.mixin.Final; @@ -55,7 +55,7 @@ public static class MultipleMixin implements VertexBufferWriter { @Inject(method = "", at = @At("RETURN")) private void checkFullStatus(CallbackInfo ci) { - this.canUseIntrinsics = allDelegatesSupportIntrinsics(); + this.canUseIntrinsics = this.allDelegatesSupportIntrinsics(); } @Unique diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/texture/TextureAtlasAccessor.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/texture/TextureAtlasAccessor.java index eab2e12471..8d12e742bf 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/texture/TextureAtlasAccessor.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/texture/TextureAtlasAccessor.java @@ -2,7 +2,6 @@ import net.minecraft.client.renderer.texture.TextureAtlas; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(TextureAtlas.class) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/ChunkSectionsToRenderMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/ChunkSectionsToRenderMixin.java index 347c55a7f2..795e543d51 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/ChunkSectionsToRenderMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/ChunkSectionsToRenderMixin.java @@ -32,13 +32,13 @@ public class ChunkSectionsToRenderMixin implements SodiumChunkSection { @Inject(method = "renderGroup", at = @At("HEAD"), cancellable = true) private void sodium$renderGroup(ChunkSectionLayerGroup chunkSectionLayerGroup, GpuSampler gpuSampler, CallbackInfo ci) { - if (renderer != null) { + if (this.renderer != null) { ci.cancel(); RenderDevice.enterManagedCode(); try { - renderer.drawChunkLayer(chunkSectionLayerGroup, matrices, x, y, z, gpuSampler); + this.renderer.drawChunkLayer(chunkSectionLayerGroup, this.matrices, this.x, this.y, this.z, gpuSampler); } finally { RenderDevice.exitManagedCode(); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java index cf2e37d399..f3e810cdda 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java @@ -39,6 +39,6 @@ public class GameRendererMixin implements GameRendererStorage { @Override public Matrix4fc sodium$getProjectionMatrix() { - return projection; + return this.projection; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java index 32a795dda9..b275df814e 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java @@ -164,8 +164,8 @@ public ChunkSectionsToRender prepareChunkRenders(Matrix4fc matrix4fc) { @Inject(method = "renderLevel", at = @At(value = "HEAD")) private void getRenderState(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { - matrices = new ChunkRenderMatrices(((GameRendererStorage) Minecraft.getInstance().gameRenderer).sodium$getProjectionMatrix(), modelViewMatrix); - ((SodiumChunkSection) (Object) chunkSectionsToRender).sodium$setRendering(renderer, matrices, this.levelRenderState.cameraRenderState.pos.x, this.levelRenderState.cameraRenderState.pos.y, this.levelRenderState.cameraRenderState.pos.z); + this.matrices = new ChunkRenderMatrices(((GameRendererStorage) Minecraft.getInstance().gameRenderer).sodium$getProjectionMatrix(), modelViewMatrix); + ((SodiumChunkSection) (Object) chunkSectionsToRender).sodium$setRendering(this.renderer, this.matrices, this.levelRenderState.cameraRenderState.pos.x, this.levelRenderState.cameraRenderState.pos.y, this.levelRenderState.cameraRenderState.pos.z); // update the fog color here with the actual fog color being used to render the sky, since the fog color that SodiumWorldRenderer still has stored from FogRendererMixin is outdated. this.renderer.updateFogColor(fogColor); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/biome/ClientLevelMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/biome/ClientLevelMixin.java index 6c59f99d94..a0433b6012 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/biome/ClientLevelMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/biome/ClientLevelMixin.java @@ -6,7 +6,6 @@ import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; -import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; import org.spongepowered.asm.mixin.Mixin; @@ -15,8 +14,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.function.Supplier; - @Mixin(ClientLevel.class) public class ClientLevelMixin implements BiomeSeedProvider { @Unique diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/map/ClientChunkCacheMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/map/ClientChunkCacheMixin.java index 37be91932d..9a499d03b8 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/map/ClientChunkCacheMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/world/map/ClientChunkCacheMixin.java @@ -4,13 +4,11 @@ import net.caffeinemc.mods.sodium.client.render.chunk.map.ChunkTrackerHolder; import net.minecraft.client.multiplayer.ClientChunkCache; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.levelgen.Heightmap; -import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/console/GameRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/console/GameRendererMixin.java index 13f40746be..fe9ede29d9 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/console/GameRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/console/GameRendererMixin.java @@ -1,7 +1,6 @@ package net.caffeinemc.mods.sodium.mixin.features.gui.hooks.console; -import com.llamalad7.mixinextras.sugar.Local; import net.caffeinemc.mods.sodium.client.gui.console.ConsoleHooks; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; @@ -9,9 +8,7 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.state.GameRenderState; -import net.minecraft.client.renderer.state.gui.GuiRenderState; import net.minecraft.util.profiling.Profiler; -import net.minecraft.util.profiling.ProfilerFiller; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/debug/DebugEntryMemoryMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/debug/DebugEntryMemoryMixin.java index 14fe4be147..853ca2dcf3 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/debug/DebugEntryMemoryMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/gui/hooks/debug/DebugEntryMemoryMixin.java @@ -13,11 +13,9 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.lang.management.ManagementFactory; -import java.util.Locale; @Mixin(DebugEntryMemory.class) public class DebugEntryMemoryMixin { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/ModelPartMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/ModelPartMixin.java index e5a20fa916..08c31f6f13 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/ModelPartMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/ModelPartMixin.java @@ -1,14 +1,11 @@ package net.caffeinemc.mods.sodium.mixin.features.render.entity; -import net.caffeinemc.mods.sodium.client.render.immediate.model.EntityRenderer; +import com.mojang.blaze3d.vertex.PoseStack; import net.caffeinemc.mods.sodium.api.math.MatrixHelper; import net.minecraft.client.model.geom.ModelPart; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; @Mixin(ModelPart.class) public class ModelPartMixin { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/ShadowFeatureRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/ShadowFeatureRendererMixin.java index 35e5844e3d..c15ff34d98 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/ShadowFeatureRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/ShadowFeatureRendererMixin.java @@ -1,20 +1,21 @@ package net.caffeinemc.mods.sodium.mixin.features.render.entity.shadows; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.caffeinemc.mods.sodium.api.math.MatrixHelper; +import net.caffeinemc.mods.sodium.api.util.ColorABGR; import net.caffeinemc.mods.sodium.api.util.NormI8; -import net.caffeinemc.mods.sodium.client.render.vertex.VertexConsumerUtils; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; import net.caffeinemc.mods.sodium.api.vertex.format.common.EntityVertex; -import net.minecraft.client.renderer.*; +import net.caffeinemc.mods.sodium.client.render.vertex.VertexConsumerUtils; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollection; +import net.minecraft.client.renderer.SubmitNodeStorage; import net.minecraft.client.renderer.entity.state.EntityRenderState; import net.minecraft.client.renderer.feature.ShadowFeatureRenderer; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.phys.AABB; -import net.caffeinemc.mods.sodium.api.util.ColorABGR; -import net.caffeinemc.mods.sodium.api.math.MatrixHelper; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.lwjgl.system.MemoryStack; import org.spongepowered.asm.mixin.Final; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/gui/font/BakedGlyphMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/gui/font/BakedGlyphMixin.java index 78ae150827..e05b5b4281 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/gui/font/BakedGlyphMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/gui/font/BakedGlyphMixin.java @@ -1,17 +1,17 @@ package net.caffeinemc.mods.sodium.mixin.features.render.gui.font; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.caffeinemc.mods.sodium.api.math.MatrixHelper; import net.caffeinemc.mods.sodium.api.util.ColorARGB; -import net.caffeinemc.mods.sodium.client.render.vertex.VertexConsumerUtils; import net.caffeinemc.mods.sodium.api.vertex.format.common.GlyphVertex; -import net.minecraft.client.gui.font.glyphs.BakedGlyph; -import net.caffeinemc.mods.sodium.api.util.ColorABGR; -import net.caffeinemc.mods.sodium.api.math.MatrixHelper; +import net.caffeinemc.mods.sodium.client.render.vertex.VertexConsumerUtils; import net.minecraft.client.gui.font.glyphs.BakedSheetGlyph; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.lwjgl.system.MemoryStack; -import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/immediate/matrix_stack/VertexConsumerMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/immediate/matrix_stack/VertexConsumerMixin.java index 9e7a7b36ca..c2c959b410 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/immediate/matrix_stack/VertexConsumerMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/immediate/matrix_stack/VertexConsumerMixin.java @@ -5,7 +5,6 @@ import net.caffeinemc.mods.sodium.api.math.MatrixHelper; import org.joml.Math; import org.joml.Matrix3f; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/GuiGraphicsMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/GuiGraphicsMixin.java index 7fc54d271f..bb83686ee0 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/GuiGraphicsMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/GuiGraphicsMixin.java @@ -3,14 +3,11 @@ import com.mojang.blaze3d.pipeline.RenderPipeline; import net.caffeinemc.mods.sodium.api.texture.SpriteUtil; import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.Identifier; 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(GuiGraphicsExtractor.class) public class GuiGraphicsMixin { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/ModelBlockRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/ModelBlockRendererMixin.java index a8ff6a4a2a..9184260770 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/ModelBlockRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/ModelBlockRendererMixin.java @@ -1,17 +1,14 @@ package net.caffeinemc.mods.sodium.mixin.features.textures.animations.tracking; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.caffeinemc.mods.sodium.api.texture.SpriteUtil; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.BlockQuadOutput; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.core.BlockPos; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Coerce; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/SpriteContentsTickerMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/SpriteContentsTickerMixin.java index cc6a8413f8..e57eac7614 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/SpriteContentsTickerMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/SpriteContentsTickerMixin.java @@ -51,9 +51,9 @@ private void captureActiveState(CallbackInfo ci) { private void preTick(CallbackInfoReturnable cir) { boolean onDemand = SodiumClientMod.options().performance.animateOnlyVisibleTextures; - if (!hasUploadedAllOnce) { + if (!this.hasUploadedAllOnce) { if (this.frame == this.animationInfo.frames.size() - 1) { - hasUploadedAllOnce = true; + this.hasUploadedAllOnce = true; } else { return; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/TextureSheetParticleMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/TextureSheetParticleMixin.java index aa8cbd688a..b48a6caf35 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/TextureSheetParticleMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/textures/animations/tracking/TextureSheetParticleMixin.java @@ -1,9 +1,6 @@ package net.caffeinemc.mods.sodium.mixin.features.textures.animations.tracking; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.caffeinemc.mods.sodium.api.texture.SpriteUtil; -import net.minecraft.client.Camera; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.SingleQuadParticle; import net.minecraft.client.renderer.state.level.QuadParticleRenderState; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -30,8 +27,8 @@ private void afterSetSprite(TextureAtlasSprite sprite, CallbackInfo ci) { @Inject(method = "extractRotatedQuad(Lnet/minecraft/client/renderer/state/level/QuadParticleRenderState;Lorg/joml/Quaternionf;FFFF)V", at = @At("HEAD")) private void sodium$tickSprite(QuadParticleRenderState particleTypeRenderState, Quaternionf rotation, float x, float y, float z, float partialTickTime, CallbackInfo ci) { - if (shouldTickSprite) { - SpriteUtil.INSTANCE.markSpriteActive(sprite); + if (this.shouldTickSprite) { + SpriteUtil.INSTANCE.markSpriteActive(this.sprite); } } } \ No newline at end of file diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/context_creation/WindowMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/context_creation/WindowMixin.java index e36c63af46..ba707f8b6f 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/context_creation/WindowMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/context_creation/WindowMixin.java @@ -2,31 +2,14 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.platform.DisplayData; -import com.mojang.blaze3d.platform.ScreenManager; import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.platform.WindowEventHandler; -import net.caffeinemc.mods.sodium.client.compatibility.checks.ModuleScanner; -import net.caffeinemc.mods.sodium.client.compatibility.checks.PostLaunchChecks; import net.caffeinemc.mods.sodium.client.compatibility.workarounds.amd.AmdWorkarounds; import net.caffeinemc.mods.sodium.client.compatibility.workarounds.nvidia.NvidiaWorkarounds; -import net.caffeinemc.mods.sodium.client.compatibility.environment.GlContextInfo; -import net.caffeinemc.mods.sodium.client.platform.NativeWindowHandle; import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; -import net.minecraft.util.Util; import org.lwjgl.glfw.GLFW; -import org.lwjgl.glfw.GLFWNativeWin32; -import org.lwjgl.opengl.WGL; -import org.lwjgl.system.MemoryUtil; -import org.slf4j.Logger; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.function.IntSupplier; import java.util.function.LongSupplier; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/event_loop/RenderSystemMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/event_loop/RenderSystemMixin.java index 8ae0438f3c..9151697e40 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/event_loop/RenderSystemMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/event_loop/RenderSystemMixin.java @@ -2,8 +2,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(RenderSystem.class) public class RenderSystemMixin { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/window_minimized_state/GameRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/window_minimized_state/GameRendererMixin.java index 7905e77085..2c913eb60f 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/window_minimized_state/GameRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/workarounds/window_minimized_state/GameRendererMixin.java @@ -27,7 +27,7 @@ public class GameRendererMixin { @Redirect(method = "extractWindow", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/Window;isMinimized()Z")) private boolean redirectWindowMinimized(Window window) { - if (!sodium$redirectWindowMinimizedState) { + if (!this.sodium$redirectWindowMinimizedState) { return window.isMinimized(); } try (var stack = MemoryStack.stackPush()) { diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/block/FabricBlockAccess.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/block/FabricBlockAccess.java index 90411be0df..c949bab1bc 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/block/FabricBlockAccess.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/block/FabricBlockAccess.java @@ -6,11 +6,11 @@ import net.caffeinemc.mods.sodium.client.services.PlatformBlockAccess; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderingRegistry; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -28,26 +28,26 @@ private float normalShade(BlockAndTintGetter blockView, float normalX, float nor float div = 0; if (normalX > 0) { - sum += normalX * getShade(blockView, Direction.EAST, hasShade); + sum += normalX * this.getShade(blockView, Direction.EAST, hasShade); div += normalX; } else if (normalX < 0) { - sum += -normalX * getShade(blockView, Direction.WEST, hasShade); + sum += -normalX * this.getShade(blockView, Direction.WEST, hasShade); div -= normalX; } if (normalY > 0) { - sum += normalY * getShade(blockView, Direction.UP, hasShade); + sum += normalY * this.getShade(blockView, Direction.UP, hasShade); div += normalY; } else if (normalY < 0) { - sum += -normalY * getShade(blockView, Direction.DOWN, hasShade); + sum += -normalY * this.getShade(blockView, Direction.DOWN, hasShade); div -= normalY; } if (normalZ > 0) { - sum += normalZ * getShade(blockView, Direction.SOUTH, hasShade); + sum += normalZ * this.getShade(blockView, Direction.SOUTH, hasShade); div += normalZ; } else if (normalZ < 0) { - sum += -normalZ * getShade(blockView, Direction.NORTH, hasShade); + sum += -normalZ * this.getShade(blockView, Direction.NORTH, hasShade); div -= normalZ; } @@ -84,7 +84,7 @@ public boolean platformHasBlockData() { @Override public float getNormalVectorShade(ModelQuadView quad, BlockAndTintGetter level, boolean shade) { - return normalShade(level, NormI8.unpackX(quad.getFaceNormal()), NormI8.unpackY(quad.getFaceNormal()), NormI8.unpackZ(quad.getFaceNormal()), shade); + return this.normalShade(level, NormI8.unpackX(quad.getFaceNormal()), NormI8.unpackY(quad.getFaceNormal()), NormI8.unpackZ(quad.getFaceNormal()), shade); } @Override diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/level/FabricLevelAccess.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/level/FabricLevelAccess.java index a682586ad8..8a7b6ea32d 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/level/FabricLevelAccess.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/level/FabricLevelAccess.java @@ -1,27 +1,11 @@ package net.caffeinemc.mods.sodium.fabric.level; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.caffeinemc.mods.sodium.client.model.color.ColorProviderRegistry; -import net.caffeinemc.mods.sodium.client.model.light.LightPipelineProvider; -import net.caffeinemc.mods.sodium.client.render.chunk.compile.pipeline.FluidRenderer; import net.caffeinemc.mods.sodium.client.services.PlatformLevelAccess; -import net.caffeinemc.mods.sodium.client.world.LevelSlice; import net.caffeinemc.mods.sodium.client.world.SodiumAuxiliaryLightManager; -import net.caffeinemc.mods.sodium.fabric.render.FluidRendererImpl; -import net.minecraft.client.Camera; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.LevelChunk; import org.jspecify.annotations.Nullable; -import org.joml.Matrix4f; - -import java.util.List; -import java.util.function.Function; public class FabricLevelAccess implements PlatformLevelAccess { @Override diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricModelAccess.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricModelAccess.java index b57d7fda58..4395adf229 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricModelAccess.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricModelAccess.java @@ -3,19 +3,17 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import net.caffeinemc.mods.sodium.client.model.color.ColorProvider; import net.caffeinemc.mods.sodium.client.render.helper.ListStorage; -import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; import net.caffeinemc.mods.sodium.client.services.PlatformModelAccess; import net.caffeinemc.mods.sodium.client.services.SodiumModelData; import net.caffeinemc.mods.sodium.client.services.SodiumModelDataContainer; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.resources.model.geometry.BakedQuad; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; import net.minecraft.util.RandomSource; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import org.jspecify.annotations.Nullable; diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricMutableProvider.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricMutableProvider.java index 92aa4c1a34..9fee7af886 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricMutableProvider.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/model/FabricMutableProvider.java @@ -33,15 +33,15 @@ public void getColors(LevelSlice slice, BlockPos pos, BlockPos.MutableBlockPos s this.slice = slice; this.state = state; - list.clear(); - factory.collect(state, slice, pos, list); + this.list.clear(); + factory.collect(state, slice, pos, this.list); } - if (tintIndex < 0 || tintIndex >= list.size()) { + if (tintIndex < 0 || tintIndex >= this.list.size()) { Arrays.fill(output, 0xFFFFFFFF); return; } - Arrays.fill(output, list.getInt(tintIndex)); + Arrays.fill(output, this.list.getInt(tintIndex)); } } diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/render/FluidRendererImpl.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/render/FluidRendererImpl.java index dfceaeadbf..7c26e53d72 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/render/FluidRendererImpl.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/fabric/render/FluidRendererImpl.java @@ -39,14 +39,14 @@ public class FluidRendererImpl extends FluidRenderer { public FluidRendererImpl(ColorProviderRegistry colorProviderRegistry, LightPipelineProvider lighters) { this.colorProviderRegistry = colorProviderRegistry; - defaultRenderer = new DefaultFluidRenderer(lighters); - defaultContext = new DefaultRenderContext(); + this.defaultRenderer = new DefaultFluidRenderer(lighters); + this.defaultContext = new DefaultRenderContext(); this.fluidStates = Minecraft.getInstance().getModelManager().getFluidStateModelSet(); - this.fluidRenderer = new net.minecraft.client.renderer.block.FluidRenderer(fluidStates); + this.fluidRenderer = new net.minecraft.client.renderer.block.FluidRenderer(this.fluidStates); } public void render(LevelSlice level, BlockState blockState, FluidState fluidState, BlockPos blockPos, BlockPos offset, TranslucentGeometryCollector collector, ChunkBuildBuffers buffers) { - var material = DefaultMaterials.forChunkLayer(fluidStates.get(fluidState).layer()); + var material = DefaultMaterials.forChunkLayer(this.fluidStates.get(fluidState).layer()); var meshBuilder = buffers.get(material); FluidRenderHandler handler = FluidRenderingRegistry.get(fluidState.getType()); @@ -79,12 +79,12 @@ public void render(LevelSlice level, BlockState blockState, FluidState fluidStat // To allow invoking this method from the injector, where there is no local Sodium context, the renderer and // parameters are bundled into a DefaultRenderContext which is stored in a ThreadLocal. - defaultContext.setUp(this.colorProviderRegistry, this.defaultRenderer, level, blockState, fluidState, blockPos, offset, collector, meshBuilder, material, handler, hasModOverride, fluidStates); + this.defaultContext.setUp(this.colorProviderRegistry, this.defaultRenderer, level, blockState, fluidState, blockPos, offset, collector, meshBuilder, material, handler, hasModOverride, this.fluidStates); try { - FluidRendering.render(fluidRenderer, handler, level, blockPos, i -> meshBuilder.asFallbackVertexConsumer(DefaultMaterials.forChunkLayer(i), collector), blockState, fluidState, defaultContext); + FluidRendering.render(this.fluidRenderer, handler, level, blockPos, i -> meshBuilder.asFallbackVertexConsumer(DefaultMaterials.forChunkLayer(i), collector), blockState, fluidState, this.defaultContext); } finally { - defaultContext.clear(); + this.defaultContext.clear(); } } @@ -145,9 +145,9 @@ public ColorProvider getColorProvider(Fluid fluid, @Nullable BlockTi @Override public void render(net.minecraft.client.renderer.block.FluidRenderer fluidRenderer, FluidRenderHandler handler, BlockAndTintGetter level, BlockPos pos, net.minecraft.client.renderer.block.FluidRenderer.Output output, BlockState blockState, FluidState fluidState) { - var model = modelSet.get(this.fluidState); + var model = this.modelSet.get(this.fluidState); this.renderer.render(this.level, this.blockState, this.fluidState, this.blockPos, this.offset, this.collector, this.meshBuilder, this.material, - getColorProvider(fluidState.getType(), model.tintSource()), model); + this.getColorProvider(fluidState.getType(), model.tintSource()), model); } } diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java index 902ade44eb..95678224b7 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java @@ -120,7 +120,7 @@ public Direction getLightFace() { @Override public int getMaxLightQuad(int idx) { - return LightCoordsUtil.lightCoordsWithEmission(getLight(idx), this.materialInfo.lightEmission()); + return LightCoordsUtil.lightCoordsWithEmission(this.getLight(idx), this.materialInfo.lightEmission()); } @Override diff --git a/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java b/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java index 7672344fa7..85bc952fdd 100644 --- a/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java +++ b/fabric/src/main/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java @@ -38,12 +38,12 @@ public abstract class BiomeMixin { @Inject(method = "", at = @At("RETURN")) private void onInit(CallbackInfo ci) { - setupColors(); + this.setupColors(); } @Unique private void setupColors() { - this.cachedSpecialEffects = specialEffects; + this.cachedSpecialEffects = this.specialEffects; var grassColor = this.cachedSpecialEffects.grassColorOverride(); @@ -73,7 +73,7 @@ private void setupColors() { @Overwrite public int getGrassColor(double x, double z) { if (this.specialEffects != this.cachedSpecialEffects) { - setupColors(); + this.setupColors(); } int color; @@ -100,7 +100,7 @@ public int getGrassColor(double x, double z) { @Overwrite public int getFoliageColor() { if (this.specialEffects != this.cachedSpecialEffects) { - setupColors(); + this.setupColors(); } int color; diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRenderer.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRenderer.java index 7c7ca9952a..262ddb1b9f 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRenderer.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/SodiumRenderer.java @@ -16,7 +16,6 @@ package net.caffeinemc.mods.sodium.client.render.frapi; -import com.mojang.blaze3d.vertex.PoseStack; import net.caffeinemc.mods.sodium.client.render.frapi.mesh.MutableMeshImpl; import net.caffeinemc.mods.sodium.client.render.frapi.render.NonTerrainBlockRenderContext; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.ExtendedMutableQuadViewImpl; @@ -47,8 +46,8 @@ public QuadEmitter quadEmitter(Consumer consumer) { MutableQuadViewImpl impl = new MutableQuadViewImpl() { { - data = new int[EncodingFormat.TOTAL_STRIDE]; - clear(); + this.data = new int[EncodingFormat.TOTAL_STRIDE]; + this.clear(); } @Override diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshImpl.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshImpl.java index 21c5d133f5..06522dcaf3 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshImpl.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshImpl.java @@ -32,7 +32,7 @@ public class MeshImpl extends MeshViewImpl implements Mesh { MeshImpl(int[] data) { this.data = data; - limit = data.length; + this.limit = data.length; } MeshImpl() {} diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshViewImpl.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshViewImpl.java index 8b716a10ef..68cfedd9e8 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshViewImpl.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MeshViewImpl.java @@ -16,21 +16,19 @@ package net.caffeinemc.mods.sodium.client.render.frapi.mesh; -import java.util.function.Consumer; - import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.ExtendedMutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.ExtendedQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.MutableQuadViewWrapper; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.QuadViewWrapper; import net.caffeinemc.mods.sodium.client.render.model.EncodingFormat; import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.QuadViewImpl; -import org.jetbrains.annotations.Range; - import net.fabricmc.fabric.api.client.renderer.v1.mesh.MeshView; import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; +import org.jetbrains.annotations.Range; + +import java.util.function.Consumer; public class MeshViewImpl implements MeshView { /** Used to satisfy external calls to {@link #forEach(Consumer)}. */ @@ -45,7 +43,7 @@ public class MeshViewImpl implements MeshView { @Override @Range(from = 0, to = Integer.MAX_VALUE) public int size() { - return limit / EncodingFormat.TOTAL_STRIDE; + return this.limit / EncodingFormat.TOTAL_STRIDE; } @Override @@ -59,7 +57,7 @@ public void forEach(Consumer action) { cursor = pool.pop(); } - forEach(action, cursor); + this.forEach(action, cursor); pool.push(cursor); } diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MutableMeshImpl.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MutableMeshImpl.java index 0f9c621bf5..0c77ba0f23 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MutableMeshImpl.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/mesh/MutableMeshImpl.java @@ -40,57 +40,57 @@ public void emitDirectly() { // Necessary because the validity of geometry is not encoded; reading mesh data always // uses QuadViewImpl#load(), which assumes valid geometry. Built immutable meshes // should also have valid geometry for better performance. - computeGeometry(); - limit += EncodingFormat.TOTAL_STRIDE; - ensureCapacity(EncodingFormat.TOTAL_STRIDE); - baseIndex = limit; + this.computeGeometry(); + MutableMeshImpl.this.limit += EncodingFormat.TOTAL_STRIDE; + MutableMeshImpl.this.ensureCapacity(EncodingFormat.TOTAL_STRIDE); + this.baseIndex = MutableMeshImpl.this.limit; } }; public MutableMeshImpl() { - data = new int[8 * EncodingFormat.TOTAL_STRIDE]; - limit = 0; + this.data = new int[8 * EncodingFormat.TOTAL_STRIDE]; + this.limit = 0; - ensureCapacity(EncodingFormat.TOTAL_STRIDE); - emitter.data = data; - emitter.baseIndex = limit; - emitter.clear(); + this.ensureCapacity(EncodingFormat.TOTAL_STRIDE); + this.emitter.data = this.data; + this.emitter.baseIndex = this.limit; + this.emitter.clear(); } private void ensureCapacity(int stride) { - if (stride > data.length - limit) { - final int[] bigger = new int[data.length * 2]; - System.arraycopy(data, 0, bigger, 0, limit); - data = bigger; - emitter.data = data; + if (stride > this.data.length - this.limit) { + final int[] bigger = new int[this.data.length * 2]; + System.arraycopy(this.data, 0, bigger, 0, this.limit); + this.data = bigger; + this.emitter.data = this.data; } } @Override public QuadEmitter emitter() { - emitter.clear(); - return ((ExtendedMutableQuadViewImpl) emitter).getWrapper(); + this.emitter.clear(); + return ((ExtendedMutableQuadViewImpl) this.emitter).getWrapper(); } @Override public void forEachMutable(Consumer action) { // emitDirectly will not be called by forEach, so just reuse the main emitter. - forEach((a) -> action.accept((MutableQuadView) a), ((ExtendedMutableQuadViewImpl) emitter).getWrapper()); // TODO: probably wrong - emitter.data = data; - emitter.baseIndex = limit; + this.forEach((a) -> action.accept((MutableQuadView) a), ((ExtendedMutableQuadViewImpl) this.emitter).getWrapper()); // TODO: probably wrong + this.emitter.data = this.data; + this.emitter.baseIndex = this.limit; } @Override public Mesh immutableCopy() { - final int[] packed = new int[limit]; - System.arraycopy(data, 0, packed, 0, limit); + final int[] packed = new int[this.limit]; + System.arraycopy(this.data, 0, packed, 0, this.limit); return new MeshImpl(packed); } @Override public void clear() { - limit = 0; - emitter.baseIndex = limit; - emitter.clear(); + this.limit = 0; + this.emitter.baseIndex = this.limit; + this.emitter.clear(); } } diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/ItemRenderContext.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/ItemRenderContext.java index fcd6891d0c..b4fb140421 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/ItemRenderContext.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/ItemRenderContext.java @@ -1,26 +1,24 @@ package net.caffeinemc.mods.sodium.client.render.frapi.render; -import java.util.List; - import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.MutableQuadViewWrapper; import net.caffeinemc.mods.sodium.client.render.model.EncodingFormat; import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.mixin.frapi.ItemFeatureRendererAccessor; -import org.jspecify.annotations.Nullable; - +import net.fabricmc.fabric.api.client.renderer.v1.mesh.MeshView; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.client.renderer.v1.render.FabricLayerRenderState; +import net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.OutlineBufferSource; import net.minecraft.client.renderer.item.ItemStackRenderState; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.util.LightCoordsUtil; +import org.jspecify.annotations.Nullable; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.MeshView; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.client.renderer.v1.render.FabricLayerRenderState; -import net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection; +import java.util.List; /** * Used during item buffering to support geometry added through {@link FabricLayerRenderState#emitter()}. @@ -29,21 +27,21 @@ public class ItemRenderContext { private final MutableQuadViewWrapper emitter; public ItemRenderContext() { - emitter = new MutableQuadViewWrapper(null); + this.emitter = new MutableQuadViewWrapper(null); var x = new MutableQuadViewImpl() { { - data = new int[EncodingFormat.TOTAL_STRIDE]; - clear(); + this.data = new int[EncodingFormat.TOTAL_STRIDE]; + this.clear(); } @Override public void emitDirectly() { - bufferQuad(emitter); + ItemRenderContext.this.bufferQuad(ItemRenderContext.this.emitter); } }; - emitter.setDelegate(x); + this.emitter.setDelegate(x); } private MultiBufferSource bufferSource; @@ -60,20 +58,20 @@ public void prepare(MultiBufferSource.BufferSource bufferSource, OutlineBufferSo } public void clear() { - bufferSource = null; - outlineBufferSource = null; + this.bufferSource = null; + this.outlineBufferSource = null; } public void renderItem(FabricSubmitNodeCollection.ExtendedItemSubmit submit) { this.submit = submit; if (submit.outlineColor() != 0) { - outlineBufferSource.setColor(submit.outlineColor()); + this.outlineBufferSource.setColor(submit.outlineColor()); } - bufferQuads(submit.quads(), submit.mesh()); + this.bufferQuads(submit.quads(), submit.mesh()); - foilDecalPose = null; + this.foilDecalPose = null; } private void bufferQuads(List vanillaQuads, MeshView mesh) { @@ -94,12 +92,12 @@ private void bufferQuad(MutableQuadViewWrapper quad) { final RenderType renderType = quad.itemRenderType(); - if (renderType.hasBlending() != translucent) { + if (renderType.hasBlending() != this.translucent) { return; } - shadeQuad(quad, quad.emissive()); - tintQuad(quad); + this.shadeQuad(quad, quad.emissive()); + this.tintQuad(quad); final FabricSubmitNodeCollection.ExtendedItemSubmit submit = this.submit; final ItemStackRenderState.FoilType foilType = quad.foilType() == null ? submit.foilType() : quad.foilType(); @@ -117,30 +115,30 @@ private void bufferQuad(MutableQuadViewWrapper quad) { foilDecalPose = null; } - final VertexConsumer foilBuffer = ItemFeatureRendererAccessor.fabric_getFoilBuffer(bufferSource, renderType, foilDecalPose); + final VertexConsumer foilBuffer = ItemFeatureRendererAccessor.fabric_getFoilBuffer(this.bufferSource, renderType, foilDecalPose); quad.buffer(submit.overlayCoords(), submit.pose(), foilBuffer); } if (submit.outlineColor() != 0) { - quad.buffer(submit.overlayCoords(), submit.pose(), outlineBufferSource.getBuffer(renderType)); + quad.buffer(submit.overlayCoords(), submit.pose(), this.outlineBufferSource.getBuffer(renderType)); } - quad.buffer(submit.overlayCoords(), submit.pose(), bufferSource.getBuffer(renderType)); + quad.buffer(submit.overlayCoords(), submit.pose(), this.bufferSource.getBuffer(renderType)); } private void shadeQuad(MutableQuadViewWrapper quad, boolean emissive) { if (emissive) { quad.lightmap(LightCoordsUtil.FULL_BRIGHT, LightCoordsUtil.FULL_BRIGHT, LightCoordsUtil.FULL_BRIGHT, LightCoordsUtil.FULL_BRIGHT); } else { - quad.minLightmap(submit.lightCoords()); + quad.minLightmap(this.submit.lightCoords()); } } private void tintQuad(MutableQuadViewWrapper quad) { final int tintIndex = quad.tintIndex(); - if (tintIndex >= 0 && tintIndex < submit.tintLayers().length) { - quad.multiplyColor(submit.tintLayers()[tintIndex]); + if (tintIndex >= 0 && tintIndex < this.submit.tintLayers().length) { + quad.multiplyColor(this.submit.tintLayers()[tintIndex]); } } } \ No newline at end of file diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java index 42ede58e89..46c3393883 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java @@ -27,8 +27,8 @@ import net.caffeinemc.mods.sodium.client.model.light.LightPipelineProvider; import net.caffeinemc.mods.sodium.client.model.light.data.SingleBlockLightDataCache; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.MutableQuadViewWrapper; -import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; +import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.SodiumShadeMode; import net.caffeinemc.mods.sodium.client.render.texture.SpriteFinderCache; import net.fabricmc.fabric.api.client.renderer.v1.mesh.MutableQuadView; @@ -39,10 +39,10 @@ import net.fabricmc.fabric.api.client.rendering.v1.BlockTintsFactory; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.block.BlockTintSource; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.core.BlockPos; import net.minecraft.util.TriState; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; import net.minecraft.world.phys.Vec3; @@ -77,20 +77,20 @@ public NonTerrainBlockRenderContext(boolean ambientOcclusion, boolean cull, Bloc } private void configureTintCache(final BlockState blockState, BlockAndTintGetter level, BlockPos pos) { - List tintSources = colorMap.getTintSources(blockState); + List tintSources = this.colorMap.getTintSources(blockState); int tintSourceCount = tintSources.size(); if (tintSourceCount > 0) { this.tintSources.addAll(tintSources); for (int i = 0; i < tintSourceCount; ++i) { - computedTintValues.add(-1); + this.computedTintValues.add(-1); } } else { final BlockTintsFactory factory = BlockColorRegistry.getFactory(blockState); if (factory != null) { - factory.collect(blockState, level, pos, computedTintValues); + factory.collect(blockState, level, pos, this.computedTintValues); } if (!this.computedTintValues.isEmpty()) { @@ -102,44 +102,44 @@ private void configureTintCache(final BlockState blockState, BlockAndTintGetter } private int computeTintColor(final BlockAndTintGetter level, final BlockState state, final BlockPos pos, final int tintIndex) { - if (!tintSourcesInitialized) { - configureTintCache(state, level, pos); - tintSourcesInitialized = true; + if (!this.tintSourcesInitialized) { + this.configureTintCache(state, level, pos); + this.tintSourcesInitialized = true; } - if (tintIndex >= tintSources.size()) { + if (tintIndex >= this.tintSources.size()) { return -1; } else { - BlockTintSource tintSource = tintSources.set(tintIndex, null); + BlockTintSource tintSource = this.tintSources.set(tintIndex, null); if (tintSource != null) { int computedTintValue = tintSource.colorInWorld(state, level, pos); - computedTintValues.set(tintIndex, computedTintValue); + this.computedTintValues.set(tintIndex, computedTintValue); return computedTintValue; } else { - return computedTintValues.getInt(tintIndex); + return this.computedTintValues.getInt(tintIndex); } } } private int getTintColor(final BlockAndTintGetter level, final BlockState state, final BlockPos pos, final int tintIndex) { - if (tintCacheIndex == tintIndex) { - return tintCacheValue; + if (this.tintCacheIndex == tintIndex) { + return this.tintCacheValue; } else { - int tintColor = ColorARGB.toABGR(computeTintColor(level, state, pos, tintIndex)); - tintCacheIndex = tintIndex; - tintCacheValue = tintColor; + int tintColor = ColorARGB.toABGR(this.computeTintColor(level, state, pos, tintIndex)); + this.tintCacheIndex = tintIndex; + this.tintCacheValue = tintColor; return tintColor; } } private void resetTintCache() { - tintCacheIndex = -1; + this.tintCacheIndex = -1; - if (tintSourcesInitialized) { - tintSources.clear(); - computedTintValues.clear(); - tintSourcesInitialized = false; + if (this.tintSourcesInitialized) { + this.tintSources.clear(); + this.computedTintValues.clear(); + this.tintSourcesInitialized = false; } } @@ -152,17 +152,17 @@ public void tesselateBlock(QuadEmitter output, float x, float y, float z, BlockA this.output = output; Vec3 offset = blockState.getOffset(pos); this.offset.set(x + offset.x, y + offset.y, z + offset.z); - defaultAo = allowAO && blockState.getLightEmission() == 0; + this.defaultAo = this.allowAO && blockState.getLightEmission() == 0; this.lightDataCache.reset(pos, level); - this.prepareCulling(enableCulling); + this.prepareCulling(this.enableCulling); - random.setSeed(seed); + this.random.setSeed(seed); output.clear(); output.pushTransform(this); - model.emitQuads(output, level, pos, state, this.random, this::isFaceCulled); + model.emitQuads(output, level, pos, this.state, this.random, this::isFaceCulled); this.level = null; output.popTransform(); @@ -178,13 +178,13 @@ protected void processQuad(MutableQuadViewImpl quad) { if (aoMode == TriState.DEFAULT) { lightMode = this.defaultLightMode; } else { - lightMode = this.useAmbientOcclusion && aoMode != TriState.FALSE && defaultAo ? LightMode.SMOOTH : LightMode.FLAT; + lightMode = this.useAmbientOcclusion && aoMode != TriState.FALSE && this.defaultAo ? LightMode.SMOOTH : LightMode.FLAT; } final boolean emissive = quad.emissive(); - tintQuad(quad); - shadeQuad(quad, lightMode, emissive, shadeMode); - quad.translate(offset.x, offset.y, offset.z); + this.tintQuad(quad); + this.shadeQuad(quad, lightMode, emissive, shadeMode); + quad.translate(this.offset.x, this.offset.y, this.offset.z); var sprite = quad.sprite(SpriteFinderCache.forBlockAtlas()); if (sprite != null) { SpriteUtil.INSTANCE.markSpriteActive(sprite); @@ -195,7 +195,7 @@ private void tintQuad(MutableQuadViewImpl quad) { int tintIndex = quad.getTintIndex(); if (tintIndex != -1) { - int tint = getTintColor(level, state, pos, tintIndex); + int tint = this.getTintColor(this.level, this.state, this.pos, tintIndex); for (int i = 0; i < 4; i++) { quad.setColor(i, ColorMixer.mulComponentWise(tint, quad.baseColor(i))); @@ -216,7 +216,7 @@ protected void shadeQuad(MutableQuadViewImpl quad, LightMode lightMode, boolean @Override public boolean transform(MutableQuadView mutableQuadView) { - renderQuad(((MutableQuadViewWrapper) mutableQuadView).getOriginal()); + this.renderQuad(((MutableQuadViewWrapper) mutableQuadView).getOriginal()); return true; } } diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadToPosPipe.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadToPosPipe.java index 850e3dfe27..b41a4d73f3 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadToPosPipe.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadToPosPipe.java @@ -16,14 +16,13 @@ package net.caffeinemc.mods.sodium.client.render.frapi.render; -import java.util.function.Consumer; - import net.caffeinemc.mods.sodium.api.math.MatrixHelper; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; import org.joml.Matrix4fc; import org.joml.Vector3f; import org.joml.Vector3fc; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; +import java.util.function.Consumer; public class QuadToPosPipe implements Consumer { private final Consumer posConsumer; @@ -38,13 +37,13 @@ public QuadToPosPipe(Consumer posConsumer, Vector3f vec) { @Override public void accept(QuadView quad) { for (int i = 0; i < 4; i++) { - quad.copyPos(i, vec); + quad.copyPos(i, this.vec); - vec.x = MatrixHelper.transformPositionX(matrix, vec.x, vec.y, vec.z); - vec.y = MatrixHelper.transformPositionY(matrix, vec.x, vec.y, vec.z); - vec.z = MatrixHelper.transformPositionZ(matrix, vec.x, vec.y, vec.z); + this.vec.x = MatrixHelper.transformPositionX(this.matrix, this.vec.x, this.vec.y, this.vec.z); + this.vec.y = MatrixHelper.transformPositionY(this.matrix, this.vec.x, this.vec.y, this.vec.z); + this.vec.z = MatrixHelper.transformPositionZ(this.matrix, this.vec.x, this.vec.y, this.vec.z); - posConsumer.accept(vec); + this.posConsumer.accept(this.vec); } } } \ No newline at end of file diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/MutableQuadViewWrapper.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/MutableQuadViewWrapper.java index 07544610b5..cef32329fc 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/MutableQuadViewWrapper.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/MutableQuadViewWrapper.java @@ -6,11 +6,10 @@ import net.caffeinemc.mods.sodium.client.render.model.SodiumShadeMode; import net.fabricmc.fabric.api.client.renderer.v1.mesh.*; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.item.ItemStackRenderState; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.resources.model.geometry.BakedQuad; import net.minecraft.core.Direction; import org.jspecify.annotations.Nullable; @@ -26,10 +25,10 @@ public class MutableQuadViewWrapper extends QuadViewWrapper implements QuadEmitt protected QuadTransform activeTransform = NO_TRANSFORM; private final ObjectArrayList transformStack = new ObjectArrayList<>(); private final QuadTransform stackTransform = q -> { - int i = transformStack.size() - 1; + int i = this.transformStack.size() - 1; while (i >= 0) { - if (!transformStack.get(i--).transform(q)) { + if (!this.transformStack.get(i--).transform(q)) { return false; } } @@ -44,133 +43,133 @@ public MutableQuadViewWrapper(MutableQuadViewImpl quad) { @Override public QuadEmitter translate(float x, float y, float z) { - mutableQuad.translate(x, y, z); + this.mutableQuad.translate(x, y, z); return this; } @Override public QuadEmitter pos(int vertexIndex, float x, float y, float z) { - mutableQuad.setPos(vertexIndex, x, y, z); + this.mutableQuad.setPos(vertexIndex, x, y, z); return this; } @Override public QuadEmitter color(int vertexIndex, int color) { - mutableQuad.setColor(vertexIndex, color); + this.mutableQuad.setColor(vertexIndex, color); return this; } @Override public QuadEmitter uv(int vertexIndex, float u, float v) { - mutableQuad.setUV(vertexIndex, u, v); + this.mutableQuad.setUV(vertexIndex, u, v); return this; } @Override public QuadEmitter lightmap(int vertexIndex, int lightmap) { - mutableQuad.setLight(vertexIndex, lightmap); + this.mutableQuad.setLight(vertexIndex, lightmap); return this; } @Override public QuadEmitter normal(int vertexIndex, float x, float y, float z) { - mutableQuad.setNormal(vertexIndex, x, y, z); + this.mutableQuad.setNormal(vertexIndex, x, y, z); return this; } @Override public QuadEmitter nominalFace(@Nullable Direction face) { - mutableQuad.setNominalFace(face); + this.mutableQuad.setNominalFace(face); return this; } @Override public QuadEmitter cullFace(@Nullable Direction face) { - mutableQuad.setCullFace(face); + this.mutableQuad.setCullFace(face); return this; } @Override public QuadEmitter chunkLayer(@Nullable ChunkSectionLayer renderLayer) { - mutableQuad.setRenderType(renderLayer); + this.mutableQuad.setRenderType(renderLayer); return this; } @Override public QuadEmitter itemRenderType(RenderType renderType) { - mutableQuad.setItemRenderType(renderType); + this.mutableQuad.setItemRenderType(renderType); return this; } @Override public QuadEmitter emissive(boolean emissive) { - mutableQuad.setEmissive(emissive); + this.mutableQuad.setEmissive(emissive); return this; } @Override public QuadEmitter diffuseShade(boolean shade) { - mutableQuad.setDiffuseShade(shade); + this.mutableQuad.setDiffuseShade(shade); return this; } @Override public QuadEmitter ambientOcclusion(TriState ao) { - mutableQuad.setAmbientOcclusion(TO_SODIUM[ao.ordinal()]); + this.mutableQuad.setAmbientOcclusion(TO_SODIUM[ao.ordinal()]); return this; } @Override public QuadEmitter foilType(ItemStackRenderState.@Nullable FoilType glint) { - mutableQuad.setGlint(glint); + this.mutableQuad.setGlint(glint); return this; } @Override public QuadEmitter shadeMode(ShadeMode mode) { - mutableQuad.setShadeMode(mode == ShadeMode.ENHANCED ? SodiumShadeMode.ENHANCED : SodiumShadeMode.VANILLA); + this.mutableQuad.setShadeMode(mode == ShadeMode.ENHANCED ? SodiumShadeMode.ENHANCED : SodiumShadeMode.VANILLA); return this; } @Override public QuadEmitter animated(boolean b) { - mutableQuad.setAnimated(b); + this.mutableQuad.setAnimated(b); return this; } @Override public QuadEmitter atlas(QuadAtlas quadAtlas) { - mutableQuad.setQuadAtlas(quadAtlas == QuadAtlas.BLOCK ? SodiumQuadAtlas.BLOCK : SodiumQuadAtlas.ITEM); + this.mutableQuad.setQuadAtlas(quadAtlas == QuadAtlas.BLOCK ? SodiumQuadAtlas.BLOCK : SodiumQuadAtlas.ITEM); return this; } @Override public QuadEmitter tintIndex(int tintIndex) { - mutableQuad.setTintIndex(tintIndex); + this.mutableQuad.setTintIndex(tintIndex); return this; } @Override public QuadEmitter tag(int tag) { - mutableQuad.setTag(tag); + this.mutableQuad.setTag(tag); return this; } @Override public QuadEmitter copyFrom(QuadView quad) { - mutableQuad.copyFrom(((QuadViewWrapper) quad).getOriginal()); + this.mutableQuad.copyFrom(((QuadViewWrapper) quad).getOriginal()); return this; } @Override public QuadEmitter fromBakedQuad(BakedQuad quad) { - mutableQuad.fromBakedQuad(quad); + this.mutableQuad.fromBakedQuad(quad); return this; } @Override public QuadEmitter clear() { - mutableQuad.clear(); + this.mutableQuad.clear(); return this; } @@ -180,23 +179,23 @@ public void pushTransform(QuadTransform transform) { throw new NullPointerException("QuadTransform cannot be null!"); } - transformStack.push(transform); + this.transformStack.push(transform); - if (transformStack.size() == 1) { - activeTransform = transform; - } else if (transformStack.size() == 2) { - activeTransform = stackTransform; + if (this.transformStack.size() == 1) { + this.activeTransform = transform; + } else if (this.transformStack.size() == 2) { + this.activeTransform = this.stackTransform; } } @Override public void popTransform() { - transformStack.pop(); + this.transformStack.pop(); - if (transformStack.isEmpty()) { - activeTransform = NO_TRANSFORM; - } else if (transformStack.size() == 1) { - activeTransform = transformStack.getFirst(); + if (this.transformStack.isEmpty()) { + this.activeTransform = NO_TRANSFORM; + } else if (this.transformStack.size() == 1) { + this.activeTransform = this.transformStack.getFirst(); } } @@ -205,25 +204,25 @@ public void popTransform() { * Apply transforms and then if transforms return true, emit the quad without clearing the underlying data. */ public final void transformAndEmit() { - if (activeTransform.transform(this)) { - mutableQuad.emitDirectly(); + if (this.activeTransform.transform(this)) { + this.mutableQuad.emitDirectly(); } } @Override public final QuadEmitter emit() { - transformAndEmit(); - mutableQuad.clear(); + this.transformAndEmit(); + this.mutableQuad.clear(); return this; } public MutableQuadViewImpl getOriginal() { - return mutableQuad; + return this.mutableQuad; } @Override public QuadAtlas atlas() { - return mutableQuad.getQuadAtlas() == SodiumQuadAtlas.BLOCK ? QuadAtlas.BLOCK : QuadAtlas.ITEM; + return this.mutableQuad.getQuadAtlas() == SodiumQuadAtlas.BLOCK ? QuadAtlas.BLOCK : QuadAtlas.ITEM; } public void setDelegate(MutableQuadViewImpl impl) { diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/QuadViewWrapper.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/QuadViewWrapper.java index e57ca41061..0529d2ee2a 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/QuadViewWrapper.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/wrapper/QuadViewWrapper.java @@ -2,7 +2,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.QuadViewImpl; import net.caffeinemc.mods.sodium.client.render.model.SodiumQuadAtlas; import net.caffeinemc.mods.sodium.client.render.model.SodiumShadeMode; @@ -34,180 +33,180 @@ public QuadViewWrapper(QuadViewImpl quad) { @Override public float x(int vertexIndex) { - return quad.getX(vertexIndex); + return this.quad.getX(vertexIndex); } @Override public float y(int vertexIndex) { - return quad.getY(vertexIndex); + return this.quad.getY(vertexIndex); } @Override public float z(int vertexIndex) { - return quad.getZ(vertexIndex); + return this.quad.getZ(vertexIndex); } @Override public float posByIndex(int vertexIndex, int coordinateIndex) { - return quad.posByIndex(vertexIndex, coordinateIndex); + return this.quad.posByIndex(vertexIndex, coordinateIndex); } @Override public Vector3f copyPos(int vertexIndex, @Nullable Vector3f target) { - return quad.copyPos(vertexIndex, target); + return this.quad.copyPos(vertexIndex, target); } @Override public int color(int vertexIndex) { - return quad.getColor(vertexIndex); + return this.quad.getColor(vertexIndex); } @Override public float u(int vertexIndex) { - return quad.getTexU(vertexIndex); + return this.quad.getTexU(vertexIndex); } @Override public float v(int vertexIndex) { - return quad.getTexV(vertexIndex); + return this.quad.getTexV(vertexIndex); } @Override public Vector2f copyUv(int vertexIndex, @Nullable Vector2f target) { - return quad.copyUv(vertexIndex, target); + return this.quad.copyUv(vertexIndex, target); } @Override public int lightmap(int vertexIndex) { - return quad.getLight(vertexIndex); + return this.quad.getLight(vertexIndex); } @Override public boolean hasNormal(int vertexIndex) { - return quad.hasNormal(vertexIndex); + return this.quad.hasNormal(vertexIndex); } @Override public float normalX(int vertexIndex) { - return quad.normalX(vertexIndex); + return this.quad.normalX(vertexIndex); } @Override public float normalY(int vertexIndex) { - return quad.normalY(vertexIndex); + return this.quad.normalY(vertexIndex); } @Override public float normalZ(int vertexIndex) { - return quad.normalZ(vertexIndex); + return this.quad.normalZ(vertexIndex); } @Override public @Nullable Vector3f copyNormal(int vertexIndex, @Nullable Vector3f target) { - return quad.copyNormal(vertexIndex, target); + return this.quad.copyNormal(vertexIndex, target); } @Override public Vector3fc faceNormal() { - return quad.faceNormal(); + return this.quad.faceNormal(); } @Override public @NonNull Direction lightFace() { - return quad.getLightFace(); + return this.quad.getLightFace(); } @Override public @Nullable Direction nominalFace() { - return quad.getNominalFace(); + return this.quad.getNominalFace(); } @Override public @Nullable Direction cullFace() { - return quad.getCullFace(); + return this.quad.getCullFace(); } @Override public @Nullable ChunkSectionLayer chunkLayer() { - return quad.getRenderType(); + return this.quad.getRenderType(); } @Override public RenderType itemRenderType() { - return quad.itemRenderType(); + return this.quad.itemRenderType(); } @Override public boolean emissive() { - return quad.emissive(); + return this.quad.emissive(); } @Override public boolean diffuseShade() { - return quad.diffuseShade(); + return this.quad.diffuseShade(); } @Override public TriState ambientOcclusion() { - return TO_FABRIC[quad.ambientOcclusion().ordinal()]; + return TO_FABRIC[this.quad.ambientOcclusion().ordinal()]; } @Override public ItemStackRenderState.@Nullable FoilType foilType() { - return quad.glint(); + return this.quad.glint(); } @Override public ShadeMode shadeMode() { - return quad.getShadeMode() == SodiumShadeMode.ENHANCED ? ShadeMode.ENHANCED : ShadeMode.VANILLA; + return this.quad.getShadeMode() == SodiumShadeMode.ENHANCED ? ShadeMode.ENHANCED : ShadeMode.VANILLA; } @Override public boolean animated() { - return quad.animated(); + return this.quad.animated(); } public QuadAtlas atlas() { - return quad.getQuadAtlas() == SodiumQuadAtlas.BLOCK ? QuadAtlas.BLOCK : QuadAtlas.ITEM; + return this.quad.getQuadAtlas() == SodiumQuadAtlas.BLOCK ? QuadAtlas.BLOCK : QuadAtlas.ITEM; } @Override public int tintIndex() { - return quad.getTintIndex(); + return this.quad.getTintIndex(); } @Override public int tag() { - return quad.getTag(); + return this.quad.getTag(); } @Override public final void buffer(int overlayCoords, VertexConsumer vertexConsumer) { - if (!quad.hasVertexNormals()) { - final Vector3fc faceNormal = faceNormal(); + if (!this.quad.hasVertexNormals()) { + final Vector3fc faceNormal = this.faceNormal(); for (int i = 0; i < 4; i++) { - vertexConsumer.addVertex(x(i), y(i), z(i), color(i), u(i), v(i), overlayCoords, lightmap(i), faceNormal.x(), faceNormal.y(), faceNormal.z()); + vertexConsumer.addVertex(this.x(i), this.y(i), this.z(i), this.color(i), this.u(i), this.v(i), overlayCoords, this.lightmap(i), faceNormal.x(), faceNormal.y(), faceNormal.z()); } - } else if (quad.hasAllVertexNormals()) { + } else if (this.quad.hasAllVertexNormals()) { final Vector3f normalVec = this.normalVec; for (int i = 0; i < 4; i++) { - copyNormal(i, normalVec); - vertexConsumer.addVertex(x(i), y(i), z(i), color(i), u(i), v(i), overlayCoords, lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); + this.copyNormal(i, normalVec); + vertexConsumer.addVertex(this.x(i), this.y(i), this.z(i), this.color(i), this.u(i), this.v(i), overlayCoords, this.lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); } } else { final Vector3f normalVec = this.normalVec; - final Vector3fc faceNormal = faceNormal(); + final Vector3fc faceNormal = this.faceNormal(); for (int i = 0; i < 4; i++) { - if (hasNormal(i)) { - copyNormal(i, normalVec); + if (this.hasNormal(i)) { + this.copyNormal(i, normalVec); } else { normalVec.set(faceNormal); } - vertexConsumer.addVertex(x(i), y(i), z(i), color(i), u(i), v(i), overlayCoords, lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); + vertexConsumer.addVertex(this.x(i), this.y(i), this.z(i), this.color(i), this.u(i), this.v(i), overlayCoords, this.lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); } } } @@ -219,43 +218,43 @@ public final void buffer(int overlayCoords, PoseStack.Pose pose, VertexConsumer final Vector3f normalVec = this.normalVec; final Matrix4f posMatrix = pose.pose(); - if (!quad.hasVertexNormals()) { - pose.transformNormal(faceNormal(), normalVec); + if (!this.quad.hasVertexNormals()) { + pose.transformNormal(this.faceNormal(), normalVec); for (int i = 0; i < 4; i++) { - posVec.set(x(i), y(i), z(i), 1.0f); + posVec.set(this.x(i), this.y(i), this.z(i), 1.0f); posVec.mul(posMatrix); - vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z(), color(i), u(i), v(i), overlayCoords, lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); + vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z(), this.color(i), this.u(i), this.v(i), overlayCoords, this.lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); } - } else if (quad.hasAllVertexNormals()) { + } else if (this.quad.hasAllVertexNormals()) { for (int i = 0; i < 4; i++) { - posVec.set(x(i), y(i), z(i), 1.0f); + posVec.set(this.x(i), this.y(i), this.z(i), 1.0f); posVec.mul(posMatrix); - copyNormal(i, normalVec); + this.copyNormal(i, normalVec); pose.transformNormal(normalVec, normalVec); - vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z(), color(i), u(i), v(i), overlayCoords, lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); + vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z(), this.color(i), this.u(i), this.v(i), overlayCoords, this.lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); } } else { - final Vector3f transformedFaceNormal = pose.transformNormal(faceNormal(), normalVec1); + final Vector3f transformedFaceNormal = pose.transformNormal(this.faceNormal(), this.normalVec1); for (int i = 0; i < 4; i++) { - posVec.set(x(i), y(i), z(i), 1.0f); + posVec.set(this.x(i), this.y(i), this.z(i), 1.0f); posVec.mul(posMatrix); - if (hasNormal(i)) { - copyNormal(i, normalVec); + if (this.hasNormal(i)) { + this.copyNormal(i, normalVec); pose.transformNormal(normalVec, normalVec); } else { normalVec.set(transformedFaceNormal); } - vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z(), color(i), u(i), v(i), overlayCoords, lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); + vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z(), this.color(i), this.u(i), this.v(i), overlayCoords, this.lightmap(i), normalVec.x(), normalVec.y(), normalVec.z()); } } } public QuadViewImpl getOriginal() { - return quad; + return this.quad; } protected void setDelegate(QuadViewImpl impl) { diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/ItemFeatureRendererMixin.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/ItemFeatureRendererMixin.java index 0fb09a86a0..289e3668e6 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/ItemFeatureRendererMixin.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/ItemFeatureRendererMixin.java @@ -17,19 +17,17 @@ package net.caffeinemc.mods.sodium.mixin.frapi; import net.caffeinemc.mods.sodium.client.render.frapi.render.ItemRenderContext; +import net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.OutlineBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollection; +import net.minecraft.client.renderer.feature.ItemFeatureRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.OutlineBufferSource; -import net.minecraft.client.renderer.SubmitNodeCollection; -import net.minecraft.client.renderer.feature.ItemFeatureRenderer; - -import net.fabricmc.fabric.api.client.renderer.v1.render.FabricSubmitNodeCollection; - @Mixin(ItemFeatureRenderer.class) abstract class ItemFeatureRendererMixin { @Unique @@ -37,23 +35,23 @@ abstract class ItemFeatureRendererMixin { @Inject(method = "renderSolid", at = @At("RETURN")) private void onReturnRenderSolid(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, CallbackInfo ci) { - itemRenderContext.prepare(bufferSource, outlineBufferSource, false); + this.itemRenderContext.prepare(bufferSource, outlineBufferSource, false); for (FabricSubmitNodeCollection.ExtendedItemSubmit submit : nodeCollection.getExtendedItemSubmits()) { - itemRenderContext.renderItem(submit); + this.itemRenderContext.renderItem(submit); } - itemRenderContext.clear(); + this.itemRenderContext.clear(); } @Inject(method = "renderTranslucent", at = @At("RETURN")) private void onReturnRenderTranslucent(SubmitNodeCollection nodeCollection, MultiBufferSource.BufferSource bufferSource, OutlineBufferSource outlineBufferSource, CallbackInfo ci) { - itemRenderContext.prepare(bufferSource, outlineBufferSource, true); + this.itemRenderContext.prepare(bufferSource, outlineBufferSource, true); for (FabricSubmitNodeCollection.ExtendedItemSubmit submit : nodeCollection.getExtendedItemSubmits()) { - itemRenderContext.renderItem(submit); + this.itemRenderContext.renderItem(submit); } - itemRenderContext.clear(); + this.itemRenderContext.clear(); } } \ No newline at end of file diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/MutableQuadViewImplMixin.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/MutableQuadViewImplMixin.java index 28b6826c09..bc1ca5c8ad 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/MutableQuadViewImplMixin.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/MutableQuadViewImplMixin.java @@ -1,11 +1,8 @@ package net.caffeinemc.mods.sodium.mixin.frapi; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.ExtendedMutableQuadViewImpl; -import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.ExtendedQuadViewImpl; import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.MutableQuadViewWrapper; -import net.caffeinemc.mods.sodium.client.render.frapi.wrapper.QuadViewWrapper; import net.caffeinemc.mods.sodium.client.render.model.MutableQuadViewImpl; -import net.caffeinemc.mods.sodium.client.render.model.QuadViewImpl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -16,7 +13,7 @@ public class MutableQuadViewImplMixin implements ExtendedMutableQuadViewImpl { @Override public MutableQuadViewWrapper getWrapper() { - if (wrapper == null) wrapper = new MutableQuadViewWrapper((MutableQuadViewImpl) (Object) this); - return wrapper; + if (this.wrapper == null) this.wrapper = new MutableQuadViewWrapper((MutableQuadViewImpl) (Object) this); + return this.wrapper; } } diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/QuadViewImplMixin.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/QuadViewImplMixin.java index 85cc35a14b..1e0d780afa 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/QuadViewImplMixin.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/mixin/frapi/QuadViewImplMixin.java @@ -13,7 +13,7 @@ public class QuadViewImplMixin implements ExtendedQuadViewImpl { @Override public QuadViewWrapper getWrapper() { - if (wrapper == null) wrapper = new QuadViewWrapper((QuadViewImpl) (Object) this); - return wrapper; + if (this.wrapper == null) this.wrapper = new QuadViewWrapper((QuadViewImpl) (Object) this); + return this.wrapper; } } diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java index dde5356f06..7314a93f2d 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/core/model/quad/BakedQuadMixin.java @@ -129,7 +129,7 @@ public Direction getLightFace() { @Override public int getMaxLightQuad(int idx) { - return LightCoordsUtil.lightCoordsWithEmission(getLight(idx), this.materialInfo.lightEmission()); + return LightCoordsUtil.lightCoordsWithEmission(this.getLight(idx), this.materialInfo.lightEmission()); } @Override diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java index 12843fa5ad..8f9921a614 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/features/world/biome/BiomeMixin.java @@ -38,12 +38,12 @@ public abstract class BiomeMixin { @Inject(method = "", at = @At("RETURN")) private void onInit(CallbackInfo ci) { - setupColors(); + this.setupColors(); } @Unique private void setupColors() { - this.cachedSpecialEffects = getModifiedSpecialEffects(); + this.cachedSpecialEffects = this.getModifiedSpecialEffects(); var grassColor = this.cachedSpecialEffects.grassColorOverride(); @@ -73,7 +73,7 @@ private void setupColors() { @Overwrite public int getGrassColor(double x, double z) { if (this.getModifiedSpecialEffects() != this.cachedSpecialEffects) { - setupColors(); + this.setupColors(); } int color; @@ -100,7 +100,7 @@ public int getGrassColor(double x, double z) { @Overwrite public int getFoliageColor() { if (this.getModifiedSpecialEffects() != this.cachedSpecialEffects) { - setupColors(); + this.setupColors(); } int color; diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ClientHooksMixin.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ClientHooksMixin.java index 5ce2a45e8b..12764ee662 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ClientHooksMixin.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ClientHooksMixin.java @@ -1,10 +1,7 @@ package net.caffeinemc.mods.sodium.mixin.platform.neoforge; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.neoforged.neoforge.client.ClientHooks; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; /** * This mixin is used to fix Forge's item models having drastic seams with Sodium's changed shrink ratio. diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/LevelSliceMixin.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/LevelSliceMixin.java index 05f156aa91..ef1000dd40 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/LevelSliceMixin.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/LevelSliceMixin.java @@ -5,8 +5,8 @@ import net.caffeinemc.mods.sodium.client.world.LevelSlice; import net.caffeinemc.mods.sodium.client.world.SodiumAuxiliaryLightManager; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.core.BlockPos; import net.minecraft.world.level.ChunkPos; import net.neoforged.neoforge.common.world.AuxiliaryLightManager; import net.neoforged.neoforge.model.data.ModelData; @@ -43,7 +43,7 @@ public SodiumModelData getPlatformModelData(BlockPos pos) { @Override public ModelData getModelData(BlockPos pos) { - SodiumModelData modelData = getPlatformModelData(pos); + SodiumModelData modelData = this.getPlatformModelData(pos); return modelData != null ? (ModelData) (Object) modelData : null; } @@ -52,7 +52,7 @@ public ModelData getModelData(BlockPos pos) { int relChunkX = pos.x() - (this.originBlockX >> 4); int relChunkZ = pos.z() - (this.originBlockZ >> 4); - return (AuxiliaryLightManager) auxLightManager[getLocalSectionIndex(relChunkX, 0, relChunkZ)]; + return (AuxiliaryLightManager) this.auxLightManager[getLocalSectionIndex(relChunkX, 0, relChunkZ)]; } @Override @@ -61,6 +61,6 @@ public ModelData getModelData(BlockPos pos) { int relBlockY = pos.getY() - this.originBlockY; int relBlockZ = pos.getZ() - this.originBlockZ; - return (AuxiliaryLightManager) auxLightManager[getLocalSectionIndex(relBlockX >> 4, relBlockY >> 4, relBlockZ >> 4)]; + return (AuxiliaryLightManager) this.auxLightManager[getLocalSectionIndex(relBlockX >> 4, relBlockY >> 4, relBlockZ >> 4)]; } } diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ResourcePackLoaderMixin.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ResourcePackLoaderMixin.java index e6c27f82fb..bb2a54dc8a 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ResourcePackLoaderMixin.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/ResourcePackLoaderMixin.java @@ -3,7 +3,6 @@ import it.unimi.dsi.fastutil.objects.ReferenceLinkedOpenHashSet; import net.minecraft.server.packs.repository.Pack; import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.LoadingModList; import net.neoforged.neoforge.resource.ResourcePackLoader; import net.neoforged.neoforgespi.locating.IModFile; import org.spongepowered.asm.mixin.Mixin; diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/block/NeoForgeBlockAccess.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/block/NeoForgeBlockAccess.java index d2db5805b5..de01acf98b 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/block/NeoForgeBlockAccess.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/block/NeoForgeBlockAccess.java @@ -6,11 +6,11 @@ import net.caffeinemc.mods.sodium.client.services.PlatformBlockAccess; import net.caffeinemc.mods.sodium.client.util.DirectionUtil; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -39,26 +39,26 @@ private float normalShade(BlockAndTintGetter blockView, float normalX, float nor float div = 0; if (normalX > 0) { - sum += normalX * getShade(blockView, Direction.EAST, hasShade); + sum += normalX * this.getShade(blockView, Direction.EAST, hasShade); div += normalX; } else if (normalX < 0) { - sum += -normalX * getShade(blockView, Direction.WEST, hasShade); + sum += -normalX * this.getShade(blockView, Direction.WEST, hasShade); div -= normalX; } if (normalY > 0) { - sum += normalY * getShade(blockView, Direction.UP, hasShade); + sum += normalY * this.getShade(blockView, Direction.UP, hasShade); div += normalY; } else if (normalY < 0) { - sum += -normalY * getShade(blockView, Direction.DOWN, hasShade); + sum += -normalY * this.getShade(blockView, Direction.DOWN, hasShade); div -= normalY; } if (normalZ > 0) { - sum += normalZ * getShade(blockView, Direction.SOUTH, hasShade); + sum += normalZ * this.getShade(blockView, Direction.SOUTH, hasShade); div += normalZ; } else if (normalZ < 0) { - sum += -normalZ * getShade(blockView, Direction.NORTH, hasShade); + sum += -normalZ * this.getShade(blockView, Direction.NORTH, hasShade); div -= normalZ; } @@ -85,7 +85,7 @@ public boolean platformHasBlockData() { @Override public float getNormalVectorShade(ModelQuadView quad, BlockAndTintGetter level, boolean shade) { - return normalShade(level, NormI8.unpackX(quad.getFaceNormal()), NormI8.unpackY(quad.getFaceNormal()), NormI8.unpackZ(quad.getFaceNormal()), shade); + return this.normalShade(level, NormI8.unpackX(quad.getFaceNormal()), NormI8.unpackY(quad.getFaceNormal()), NormI8.unpackZ(quad.getFaceNormal()), shade); } @Override diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/level/NeoForgeLevelRenderHooks.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/level/NeoForgeLevelRenderHooks.java index 76b997d76b..56f4227ee6 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/level/NeoForgeLevelRenderHooks.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/level/NeoForgeLevelRenderHooks.java @@ -1,24 +1,24 @@ package net.caffeinemc.mods.sodium.neoforge.level; import com.mojang.blaze3d.vertex.VertexConsumer; -import java.util.List; -import java.util.function.Function; import net.caffeinemc.mods.sodium.client.services.PlatformLevelRenderHooks; import net.caffeinemc.mods.sodium.client.world.LevelSlice; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.neoforged.neoforge.client.ClientHooks; import net.neoforged.neoforge.client.event.AddSectionGeometryEvent; import org.joml.Matrix4f; +import java.util.List; +import java.util.function.Function; + public class NeoForgeLevelRenderHooks implements PlatformLevelRenderHooks { @Override public void runChunkLayerEvents(RenderType renderType, Level level, LevelRenderer levelRenderer, Matrix4f modelMatrix, Matrix4f projectionMatrix, int renderTick, Camera camera, Frustum frustum) { diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeDynamicColorProvider.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeDynamicColorProvider.java index 24e6fe31ec..7e1a811b6c 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeDynamicColorProvider.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeDynamicColorProvider.java @@ -26,15 +26,15 @@ public void getColors(LevelSlice slice, BlockPos pos, BlockPos.MutableBlockPos s this.slice = slice; this.state = state; - list.clear(); - IClientBlockExtensions.of(state).collectDynamicTintValues(state, slice, pos, list); + this.list.clear(); + IClientBlockExtensions.of(state).collectDynamicTintValues(state, slice, pos, this.list); } - if (tintIndex < 0 || tintIndex >= list.size()) { + if (tintIndex < 0 || tintIndex >= this.list.size()) { Arrays.fill(output, 0xFFFFFFFF); return; } - Arrays.fill(output, list.getInt(tintIndex)); + Arrays.fill(output, this.list.getInt(tintIndex)); } } diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeModelAccess.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeModelAccess.java index 62b4e99017..4606d4ab7a 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeModelAccess.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/model/NeoForgeModelAccess.java @@ -4,19 +4,17 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.caffeinemc.mods.sodium.client.model.color.ColorProvider; import net.caffeinemc.mods.sodium.client.render.helper.ListStorage; -import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; import net.caffeinemc.mods.sodium.client.services.PlatformModelAccess; import net.caffeinemc.mods.sodium.client.services.SodiumModelData; import net.caffeinemc.mods.sodium.client.services.SodiumModelDataContainer; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.resources.model.geometry.BakedQuad; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; import net.minecraft.util.RandomSource; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.model.data.ModelData; diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/FluidRendererImpl.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/FluidRendererImpl.java index ff139c8a82..1ab8f24671 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/FluidRendererImpl.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/FluidRendererImpl.java @@ -36,13 +36,13 @@ public class FluidRendererImpl extends FluidRenderer { public FluidRendererImpl(ColorProviderRegistry colorProviderRegistry, LightPipelineProvider lighters) { this.colorProviderRegistry = colorProviderRegistry; - defaultRenderer = new DefaultFluidRenderer(lighters); + this.defaultRenderer = new DefaultFluidRenderer(lighters); this.fluidStates = Minecraft.getInstance().getModelManager().getFluidStateModelSet(); - this.fluidRenderer = new net.minecraft.client.renderer.block.FluidRenderer(fluidStates); + this.fluidRenderer = new net.minecraft.client.renderer.block.FluidRenderer(this.fluidStates); } public void render(LevelSlice level, BlockState blockState, FluidState fluidState, BlockPos blockPos, BlockPos offset, TranslucentGeometryCollector collector, ChunkBuildBuffers buffers) { - var material = DefaultMaterials.forChunkLayer(fluidStates.get(fluidState).layer()); + var material = DefaultMaterials.forChunkLayer(this.fluidStates.get(fluidState).layer()); var meshBuilder = buffers.get(material); IClientFluidTypeExtensions handler = IClientFluidTypeExtensions.of(fluidState); @@ -69,11 +69,11 @@ public void render(LevelSlice level, BlockState blockState, FluidState fluidStat // parameters are bundled into a DefaultRenderContext which is stored in a ThreadLocal. DefaultRenderContext defaultContext = CURRENT_DEFAULT_CONTEXT.get(); - var model = fluidStates.get(fluidState); + var model = this.fluidStates.get(fluidState); defaultContext.setUp(this.colorProviderRegistry, this.defaultRenderer, level, blockState, fluidState, blockPos, offset, collector, meshBuilder, material, handler, model); try { - if (model.customRenderer() == null || !model.customRenderer().renderFluid(fluidRenderer, fluidState, level, blockPos, i -> meshBuilder.asFallbackVertexConsumer(DefaultMaterials.forChunkLayer(i), collector), blockState)) { + if (model.customRenderer() == null || !model.customRenderer().renderFluid(this.fluidRenderer, fluidState, level, blockPos, i -> meshBuilder.asFallbackVertexConsumer(DefaultMaterials.forChunkLayer(i), collector), blockState)) { defaultContext.render(); } } finally { @@ -131,12 +131,12 @@ public ColorProvider getColorProvider(Fluid fluid) { return override; } - return ForgeColorProviders.adapt(model.fluidTintSource()); + return ForgeColorProviders.adapt(this.model.fluidTintSource()); } public void render() { this.renderer.render(this.level, this.blockState, this.fluidState, this.blockPos, this.offset, this.collector, this.meshBuilder, this.material, - getColorProvider(fluidState.getType()), model); + this.getColorProvider(this.fluidState.getType()), this.model); } } diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/ForgeColorProviders.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/ForgeColorProviders.java index be36d56dae..05d5e92098 100644 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/ForgeColorProviders.java +++ b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/neoforge/render/ForgeColorProviders.java @@ -1,13 +1,10 @@ package net.caffeinemc.mods.sodium.neoforge.render; -import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.client.model.color.ColorProvider; import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView; import net.caffeinemc.mods.sodium.client.world.LevelSlice; -import net.minecraft.client.color.block.BlockTintSource; import net.minecraft.core.BlockPos; import net.minecraft.world.level.material.FluidState; -import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.client.fluid.FluidTintSource; import org.jspecify.annotations.Nullable; From 834652438ca10da2b13a07e61f32c6665dab3d22 Mon Sep 17 00:00:00 2001 From: douira Date: Sat, 27 Jun 2026 19:07:38 +0200 Subject: [PATCH 15/27] Rename section visibility methods to avoid repeated negation --- .../mods/sodium/client/render/chunk/RenderSection.java | 4 ++-- .../mods/sodium/client/render/chunk/RenderSectionFlags.java | 4 ++-- .../mods/sodium/client/render/chunk/RenderSectionManager.java | 4 ++-- .../sodium/client/render/chunk/occlusion/SectionTree.java | 4 ++-- .../mods/sodium/client/render/chunk/region/RenderRegion.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSection.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSection.java index 00d54fee0c..28b80c2732 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSection.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSection.java @@ -288,8 +288,8 @@ public RenderRegion getRegion() { return this.region; } - public boolean needsRender() { - return this.region.sectionNeedsRender(this.sectionIndex); + public boolean isInvisible() { + return this.region.sectionIsInvisible(this.sectionIndex); } public void resetOnFirstVisit(int token) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionFlags.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionFlags.java index e3d1e167dc..cca79feac9 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionFlags.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionFlags.java @@ -14,8 +14,8 @@ public class RenderSectionFlags { public static final int NONE = 0; - public static boolean needsRender(int flags) { - return (flags & MASK_NEEDS_RENDER) != 0; + public static boolean isInvisible(int flags) { + return (flags & MASK_NEEDS_RENDER) == 0; } public static boolean renderingMoreTypesNow(int prevFlags, int newFlags) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java index 96cb5deae6..1bae1a92fd 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java @@ -495,7 +495,7 @@ private boolean isSectionEmpty(int x, int y, int z) { return true; } - return !section.needsRender(); + return section.isInvisible(); } // renderTree is not necessarily frustum-filtered but that is ok since the caller makes sure to eventually also perform a frustum test on the box being tested (see EntityRendererMixin) @@ -661,7 +661,7 @@ private int updateWithResult(Viewport viewport, RenderSection section, ChunkBuil } private int updateSectionInfo(RenderSection render, BuiltSectionInfo info) { - if (info == null || !RenderSectionFlags.needsRender(info.flags)) { + if (info == null || RenderSectionFlags.isInvisible(info.flags)) { this.renderableSectionTree.remove(render); } else { this.renderableSectionTree.add(render); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/SectionTree.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/SectionTree.java index 78b447056d..2c801c4c15 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/SectionTree.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/SectionTree.java @@ -43,7 +43,7 @@ public boolean isValidFor(Viewport viewport, float searchDistance) { public void visit(RenderSection section, boolean inFrustum) { // discard invisible or sections that don't need to be rendered, // only perform this test if it hasn't already been done before - if (!section.needsRender()) { + if (section.isInvisible()) { return; } @@ -107,7 +107,7 @@ private boolean isWithinFrustum(Viewport viewport, RenderSection section) { public boolean isSectionVisible(Viewport viewport, RenderSection section) { // empty sections are not tested against the tree because the tree is not aware of them - return (!section.needsRender() || this.tree.isSectionPresent(section.getChunkX(), section.getChunkY(), section.getChunkZ())) && + return (section.isInvisible() || this.tree.isSectionPresent(section.getChunkX(), section.getChunkY(), section.getChunkZ())) && this.isWithinFrustum(viewport, section); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java index 19e7e86af2..53e0ab7167 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java @@ -236,8 +236,8 @@ public int getSectionFlags(int id) { return this.sectionFlags[id]; } - public boolean sectionNeedsRender(int id) { - return RenderSectionFlags.needsRender(this.sectionFlags[id]); + public boolean sectionIsInvisible(int id) { + return RenderSectionFlags.isInvisible(this.sectionFlags[id]); } /** From f475ccfe7f09837a7c6c68e9dfe0ba6892fe4f1c Mon Sep 17 00:00:00 2001 From: douira Date: Sat, 27 Jun 2026 18:42:32 +0200 Subject: [PATCH 16/27] Avoid repeated negation in the config ui's control visibility logic --- .../sodium/client/config/structure/StatefulOption.java | 8 ++++---- .../sodium/client/gui/options/control/CyclingControl.java | 2 +- .../sodium/client/gui/options/control/SliderControl.java | 2 +- .../sodium/client/gui/options/control/TickBoxControl.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/StatefulOption.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/StatefulOption.java index c06900d960..250dc7bb77 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/StatefulOption.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/structure/StatefulOption.java @@ -178,14 +178,14 @@ public Boolean getControlHiddenWhenDisabled() { return this.controlHiddenWhenDisabled; } - public boolean showControl() { + public boolean shouldHideControl() { if (this.isEnabled()) { - return true; + return false; } if (this.controlHiddenWhenDisabled == null) { - return false; + return true; } - return !this.controlHiddenWhenDisabled; + return this.controlHiddenWhenDisabled; } public OptionBinding getBinding() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java index 7a81ce6ae4..b7285b02ed 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/CyclingControl.java @@ -61,7 +61,7 @@ public EnumOption getOption() { public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { super.extractRenderState(graphics, mouseX, mouseY, delta); - if (!this.option.showControl() || this.isResetOverlayActive()) { + if (this.option.shouldHideControl() || this.isResetOverlayActive()) { return; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java index 117dd9cf64..650dedc13c 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/SliderControl.java @@ -79,7 +79,7 @@ public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mo // render the label first and then the slider to prevent the highlight rect from darkening the slider super.extractRenderState(graphics, mouseX, mouseY, delta); - if (!this.option.showControl() || this.isResetOverlayActive()) { + if (this.option.shouldHideControl() || this.isResetOverlayActive()) { return; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java index ddcea3a57b..c8f5fbfb1d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/options/control/TickBoxControl.java @@ -52,7 +52,7 @@ public BooleanOption getOption() { public void extractRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float delta) { super.extractRenderState(graphics, mouseX, mouseY, delta); - if (!this.option.showControl() || this.isResetOverlayActive()) { + if (this.option.shouldHideControl() || this.isResetOverlayActive()) { return; } From aabcf2106965d132de8c8037c4994253fa0be71d Mon Sep 17 00:00:00 2001 From: douira Date: Sat, 27 Jun 2026 18:42:32 +0200 Subject: [PATCH 17/27] Cleanup unused code, align with code style, avoid repeated negation, and remove unused parameters --- .../mods/sodium/api/util/ColorARGB.java | 2 +- .../api/vertex/format/common/ColorVertex.java | 30 ---------------- .../api/vertex/format/common/LineVertex.java | 24 ------------- .../client/platform/windows/api/Kernel32.java | 9 +++-- .../client/config/search/TextSource.java | 4 --- .../mods/sodium/client/gui/SodiumOptions.java | 3 +- .../gui/widgets/AbstractParentWidget.java | 5 --- .../model/light/data/HashLightDataCache.java | 36 ------------------- .../render/chunk/async/AsyncRenderTask.java | 2 +- .../chunk/compile/pipeline/BlockRenderer.java | 2 +- .../data/DynamicSorter.java | 4 --- .../data/TranslucentData.java | 4 --- .../chunk/translucent_sorting/quad/TQuad.java | 13 ------- .../trigger/DirectTriggers.java | 14 ++++---- .../trigger/NormalList.java | 2 +- .../model/AbstractBlockRenderContext.java | 3 -- .../viewport/frustum/SimpleFrustum.java | 12 +++---- .../mods/sodium/client/util/ListUtil.java | 16 --------- .../util/collections/DoubleBufferedQueue.java | 6 +--- .../core/model/colors/BlockColorsMixin.java | 2 +- .../core/render/world/GameRendererMixin.java | 2 +- .../render/NonTerrainBlockRenderContext.java | 10 ++---- .../AbstractBlockRenderContextMixin.java | 23 ------------ .../mod/resources/sodium-neoforge.mixins.json | 1 - 24 files changed, 27 insertions(+), 202 deletions(-) delete mode 100644 common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java delete mode 100644 common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java delete mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/data/HashLightDataCache.java delete mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/util/ListUtil.java delete mode 100644 neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/AbstractBlockRenderContextMixin.java diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/util/ColorARGB.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/util/ColorARGB.java index 8786262a31..2c55b35a26 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/util/ColorARGB.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/util/ColorARGB.java @@ -172,7 +172,7 @@ public static float[] toHSV(int color) { float cmax = Math.max(r, Math.max(g, b)); float cmin = Math.min(r, Math.min(g, b)); float diff = cmax - cmin; - float h = -1, s = -1; + float h = -1, s; if (cmax == cmin) { h = 0; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java deleted file mode 100644 index d58cacd6c9..0000000000 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.caffeinemc.mods.sodium.api.vertex.format.common; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; -import net.caffeinemc.mods.sodium.api.math.MatrixHelper; -import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; -import net.caffeinemc.mods.sodium.api.vertex.attributes.common.PositionAttribute; -import org.joml.Matrix4f; - -public final class ColorVertex { - public static final VertexFormat FORMAT = DefaultVertexFormat.POSITION_COLOR; - - public static final int STRIDE = 16; - - private static final int OFFSET_POSITION = 0; - private static final int OFFSET_COLOR = 12; - - public static void put(long ptr, Matrix4f matrix, float x, float y, float z, int color) { - float xt = MatrixHelper.transformPositionX(matrix, x, y, z); - float yt = MatrixHelper.transformPositionY(matrix, x, y, z); - float zt = MatrixHelper.transformPositionZ(matrix, x, y, z); - - put(ptr, xt, yt, zt, color); - } - - public static void put(long ptr, float x, float y, float z, int color) { - PositionAttribute.put(ptr + OFFSET_POSITION, x, y, z); - ColorAttribute.set(ptr + OFFSET_COLOR, color); - } -} diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java deleted file mode 100644 index 9695670635..0000000000 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.caffeinemc.mods.sodium.api.vertex.format.common; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; -import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; -import net.caffeinemc.mods.sodium.api.vertex.attributes.common.NormalAttribute; -import net.caffeinemc.mods.sodium.api.vertex.attributes.common.PositionAttribute; - -public final class LineVertex { - public static final VertexFormat FORMAT = DefaultVertexFormat.POSITION_COLOR_NORMAL; - - public static final int STRIDE = 20; - - private static final int OFFSET_POSITION = 0; - private static final int OFFSET_COLOR = 12; - private static final int OFFSET_NORMAL = 16; - - public static void put(long ptr, - float x, float y, float z, int color, int normal) { - PositionAttribute.put(ptr + OFFSET_POSITION, x, y, z); - ColorAttribute.set(ptr + OFFSET_COLOR, color); - NormalAttribute.set(ptr + OFFSET_NORMAL, normal); - } -} diff --git a/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/Kernel32.java b/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/Kernel32.java index d271d2716a..4bacd91081 100644 --- a/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/Kernel32.java +++ b/common/src/boot/java/net/caffeinemc/mods/sodium/client/platform/windows/api/Kernel32.java @@ -3,6 +3,7 @@ import org.jspecify.annotations.Nullable; import org.lwjgl.PointerBuffer; import org.lwjgl.system.*; + import java.nio.ByteBuffer; public class Kernel32 { @@ -82,12 +83,10 @@ public static long getModuleHandleByName(String name) { if (result == 0) { var error = getLastError(); - switch (error) { - case 126 /* ERROR_MOD_NOT_FOUND */: - return MemoryUtil.NULL; - default: - throw new RuntimeException("GetModuleHandleEx failed, error=" + error); + if (error == 126) { /* ERROR_MOD_NOT_FOUND */ + return MemoryUtil.NULL; } + throw new RuntimeException("GetModuleHandleEx failed, error=" + error); } return phModule.get(0); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/search/TextSource.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/search/TextSource.java index 0a03277cc2..a765c58e2b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/config/search/TextSource.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/config/search/TextSource.java @@ -19,10 +19,6 @@ void invalidateText() { this.text = null; } - public int getLength() { - return this.getText().length(); - } - public float getScore() { return this.score; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/SodiumOptions.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/SodiumOptions.java index e62408d8c1..292d9961f7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/SodiumOptions.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/SodiumOptions.java @@ -8,7 +8,6 @@ import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.QuadSplittingMode; import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; import net.caffeinemc.mods.sodium.client.util.FileUtil; -import org.jspecify.annotations.NonNull; import java.io.FileReader; import java.io.IOException; @@ -23,7 +22,7 @@ public class SodiumOptions { public final PerformanceSettings performance = new PerformanceSettings(); public final AdvancedSettings advanced = new AdvancedSettings(); - public @NonNull DebugSettings debug = new DebugSettings(); + public final DebugSettings debug = new DebugSettings(); public final NotificationSettings notifications = new NotificationSettings(); private boolean readOnly; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/AbstractParentWidget.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/AbstractParentWidget.java index 52e988d0d5..5875641a93 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/AbstractParentWidget.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gui/widgets/AbstractParentWidget.java @@ -35,11 +35,6 @@ protected T addRenderableChild(T eleme return element; } - protected void removeChild(GuiEventListener element) { - this.children.remove(element); - this.renderableChildren.remove(element); - } - protected void clearChildren() { this.children.clear(); this.renderableChildren.clear(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/data/HashLightDataCache.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/data/HashLightDataCache.java deleted file mode 100644 index 9f13a5bded..0000000000 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/model/light/data/HashLightDataCache.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.caffeinemc.mods.sodium.client.model.light.data; - -import it.unimi.dsi.fastutil.longs.Long2IntLinkedOpenHashMap; -import net.minecraft.core.BlockPos; -import net.minecraft.client.renderer.block.BlockAndTintGetter; - -/** - * A light data cache which uses a hash table to store previously accessed values. - */ -public class HashLightDataCache extends LightDataAccess { - private final Long2IntLinkedOpenHashMap map = new Long2IntLinkedOpenHashMap(1024, 0.50f); - - public HashLightDataCache(BlockAndTintGetter level) { - this.level = level; - } - - @Override - public int get(int x, int y, int z) { - long key = BlockPos.asLong(x, y, z); - int word = this.map.getAndMoveToFirst(key); - - if (word == 0) { - if (this.map.size() > 1024) { - this.map.removeLastInt(); - } - - this.map.put(key, word = this.compute(x, y, z)); - } - - return word; - } - - public void clearCache() { - this.map.clear(); - } -} \ No newline at end of file diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/async/AsyncRenderTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/async/AsyncRenderTask.java index e43f1b5e81..a16ba0c491 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/async/AsyncRenderTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/async/AsyncRenderTask.java @@ -64,7 +64,7 @@ public T getResult() { } @Override - public T call() throws Exception { + public T call() { if (this.state == CANCELLED) { return null; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java index 3f77374067..00cd381117 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/pipeline/BlockRenderer.java @@ -46,7 +46,7 @@ public class BlockRenderer extends AbstractBlockRenderContext { @Nullable private ColorProvider colorProvider; private TranslucentGeometryCollector collector; - private boolean cutoutLeaves; + private final boolean cutoutLeaves; private final ColorProvider mutableColorProvider = PlatformModelAccess.getInstance().createMutableColorProvider(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java index f2fdb3e135..acf4108495 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/DynamicSorter.java @@ -25,10 +25,6 @@ public void writeIndexBuffer(CombinedCameraPos cameraPos) { this.writeSort(cameraPos); } - public int getQuadCount() { - return this.quadCount; - } - public int getResultSize() { return TranslucentData.quadCountToIndexBytes(this.quadCount); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TranslucentData.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TranslucentData.java index 635201bd0f..c26c644a70 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TranslucentData.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/data/TranslucentData.java @@ -46,10 +46,6 @@ public void prepareTrigger(boolean isAngleTrigger) { // no-op for other translucent data than GFNI dynamic } - public static int vertexCountToQuadCount(int vertexCount) { - return vertexCount / VERTICES_PER_QUAD; - } - public static int quadCountToIndexBytes(int quadCount) { return quadCount * BYTES_PER_QUAD; } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/quad/TQuad.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/quad/TQuad.java index cfdd7eee94..22fdc45876 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/quad/TQuad.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/quad/TQuad.java @@ -284,19 +284,6 @@ public int getQuadHash() { return result; } - public boolean extentsEqual(float[] other) { - return extentsEqual(this.extents, other); - } - - public static boolean extentsEqual(float[] a, float[] b) { - for (int i = 0; i < 6; i++) { - if (a[i] != b[i]) { - return false; - } - } - return true; - } - public static boolean extentsIntersect(float[] extentsA, float[] extentsB) { for (int axis = 0; axis < 3; axis++) { var opposite = axis + 3; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java index fedf9b5fce..ddba69ad8d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/DirectTriggers.java @@ -32,7 +32,7 @@ class DirectTriggers implements SectionTriggers { * There will be precision issues at around 10^10 maybe, but it's still not a * concern. */ - private Double2ObjectRBTreeMap directTriggerSections = new Double2ObjectRBTreeMap<>(); + private final Double2ObjectRBTreeMap directTriggerSections = new Double2ObjectRBTreeMap<>(); private double accumulatedDistance = 0; /** @@ -130,13 +130,13 @@ private static double angleCos(double ax, double ay, double az, double bx, doubl return dot / (lengthA * lengthB); } - private void insertDirectAngleTrigger(DirectTriggerData data, Vector3dc cameraPos, double remainingAngle) { + private void insertDirectAngleTrigger(DirectTriggerData data, double remainingAngle) { double triggerCameraSectionCenterDist = data.getSectionCenterTriggerCameraDist(); double centerMinDistance = Math.tan(remainingAngle) * (triggerCameraSectionCenterDist - SECTION_CENTER_DIST); this.insertTrigger(this.accumulatedDistance + centerMinDistance, data); } - private void insertDirectDistanceTrigger(DirectTriggerData data, Vector3dc cameraPos, double remainingDistance) { + private void insertDirectDistanceTrigger(DirectTriggerData data, double remainingDistance) { this.insertTrigger(this.accumulatedDistance + remainingDistance, data); } @@ -184,7 +184,7 @@ private void processSingleTrigger(DirectTriggerData data, SortTriggering ts, Vec remainingAngle -= Math.acos(angleCos); } - this.insertDirectAngleTrigger(data, camera, remainingAngle); + this.insertDirectAngleTrigger(data, remainingAngle); } else { double remainingDistance = TRIGGER_DISTANCE; double lastTriggerCurrentCameraDistSquared = data.triggerCameraPos.distanceSquared(camera); @@ -196,7 +196,7 @@ private void processSingleTrigger(DirectTriggerData data, SortTriggering ts, Vec remainingDistance -= Math.sqrt(lastTriggerCurrentCameraDistSquared); } - this.insertDirectDistanceTrigger(data, camera, remainingDistance); + this.insertDirectDistanceTrigger(data, remainingDistance); } } @@ -222,9 +222,9 @@ public void integrateSection(SortTriggering ts, SectionPos sectionPos, DynamicTo this.processSingleTrigger(newData, ts, movement.end()); } else { if (newData.isAngleTriggering(cameraPos)) { - this.insertDirectAngleTrigger(newData, cameraPos, TRIGGER_ANGLE); + this.insertDirectAngleTrigger(newData, TRIGGER_ANGLE); } else { - this.insertDirectDistanceTrigger(newData, cameraPos, TRIGGER_DISTANCE); + this.insertDirectDistanceTrigger(newData, TRIGGER_DISTANCE); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java index 7a5e086710..da9e1ad74d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/translucent_sorting/trigger/NormalList.java @@ -93,7 +93,7 @@ void processMovement(SortTriggering ts, CameraMovement movement) { // to the collection of groups it maps to var interval = new DoubleInterval(start, end, Bounded.CLOSED); for (Interval groupInterval : this.intervalTree.query(interval)) { - for (Group group : this.groupsByInterval.get(groupInterval)) { + for (Group group : this.groupsByInterval.get((DoubleInterval) groupInterval)) { group.triggerRange(ts, start, end); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java index 1dd4889fc9..51b9bdca53 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/model/AbstractBlockRenderContext.java @@ -1,7 +1,6 @@ package net.caffeinemc.mods.sodium.client.render.model; import com.google.common.base.Suppliers; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.caffeinemc.mods.sodium.client.model.light.LightMode; import net.caffeinemc.mods.sodium.client.model.light.LightPipeline; import net.caffeinemc.mods.sodium.client.model.light.LightPipelineProvider; @@ -214,8 +213,6 @@ protected void shadeQuad(MutableQuadViewImpl quad, LightMode lightMode, boolean } } - private List parts = new ObjectArrayList<>(); - /* Handling of vanilla models - this is the hot path for non-modded models */ public void bufferDefaultModel(BlockStateModelPart part, Predicate cullTest, Consumer emitter) { MutableQuadViewImpl editorQuad = this.editorQuad; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java index 196f2b10c0..5944a43f36 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/viewport/frustum/SimpleFrustum.java @@ -9,12 +9,12 @@ import java.lang.reflect.Field; public final class SimpleFrustum implements Frustum { - private float nxX, nxY, nxZ, negNxW; - private float pxX, pxY, pxZ, negPxW; - private float nyX, nyY, nyZ, negNyW; - private float pyX, pyY, pyZ, negPyW; - private float nzX, nzY, nzZ, negNzW; - private float pzX, pzY, pzZ, negPzW; + private final float nxX, nxY, nxZ, negNxW; + private final float pxX, pxY, pxZ, negPxW; + private final float nyX, nyY, nyZ, negNyW; + private final float pyX, pyY, pyZ, negPyW; + private final float nzX, nzY, nzZ, negNzW; + private final float pzX, pzY, pzZ, negPzW; private final FrustumIntersection frustum; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/ListUtil.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/ListUtil.java deleted file mode 100644 index 2e886edc0b..0000000000 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/ListUtil.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.caffeinemc.mods.sodium.client.util; - -import java.util.Collection; - -public class ListUtil { - public static void updateList(Collection collection, Collection before, Collection after) { - if (!before.isEmpty()) { - collection.removeAll(before); - } - - if (!after.isEmpty()) { - collection.addAll(after); - } - } - -} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/collections/DoubleBufferedQueue.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/collections/DoubleBufferedQueue.java index 616e46263a..dcfd4a8808 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/util/collections/DoubleBufferedQueue.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/util/collections/DoubleBufferedQueue.java @@ -14,7 +14,7 @@ public DoubleBufferedQueue() { } public boolean flip() { - if (this.write.size() == 0) { + if (this.write.isEmpty()) { return false; } @@ -90,10 +90,6 @@ public void clear() { this.writeIndex = 0; } - public int size() { - return this.writeIndex - this.readIndex; - } - private void grow(int minimumSize) { this.resize(getNextSize(minimumSize, this.elements.length)); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/colors/BlockColorsMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/colors/BlockColorsMixin.java index 4f2a1118ee..3ce1da0a06 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/colors/BlockColorsMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/model/colors/BlockColorsMixin.java @@ -31,7 +31,7 @@ private void preRegisterColorProvider(List layers, Block[] bloc // it means a mod is using custom logic, and we need to disable per-vertex coloring if (this.blocksToColor.put(block, layers.toArray(BlockTintSource[]::new)) != null) { this.overridenBlocks.add(block); - SodiumClientMod.logger().info("Block {} had its color provider replaced with {} and will not use per-vertex coloring", BuiltInRegistries.BLOCK.getKey(block), layers.toString()); + SodiumClientMod.logger().info("Block {} had its color provider replaced with {} and will not use per-vertex coloring", BuiltInRegistries.BLOCK.getKey(block), layers); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java index f3e810cdda..2b24117181 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/GameRendererMixin.java @@ -24,7 +24,7 @@ public class GameRendererMixin implements GameRendererStorage { private FogRenderer fogRenderer; @Unique - private Matrix4f projection = new Matrix4f(); + private final Matrix4f projection = new Matrix4f(); @Override public FogParameters sodium$getFogParameters() { diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java index 46c3393883..bcb5922157 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java @@ -22,7 +22,6 @@ import net.caffeinemc.mods.sodium.api.texture.SpriteUtil; import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.ColorMixer; -import net.caffeinemc.mods.sodium.client.model.color.ColorProvider; import net.caffeinemc.mods.sodium.client.model.light.LightMode; import net.caffeinemc.mods.sodium.client.model.light.LightPipelineProvider; import net.caffeinemc.mods.sodium.client.model.light.data.SingleBlockLightDataCache; @@ -53,15 +52,11 @@ public class NonTerrainBlockRenderContext extends AbstractBlockRenderContext implements AltModelBlockRenderer, QuadTransform { private final boolean allowAO; - private BlockColors colorMap; + private final BlockColors colorMap; private final SingleBlockLightDataCache lightDataCache = new SingleBlockLightDataCache(); - private QuadEmitter output; private boolean defaultAo; - private Vector3f offset = new Vector3f (); - private int[] vertexColors = new int[4]; - private final BlockPos.MutableBlockPos scratchPos = new BlockPos.MutableBlockPos(); - private ColorProvider colorProvider; + private final Vector3f offset = new Vector3f(); private int tintCacheIndex = -1; private int tintCacheValue; private boolean tintSourcesInitialized; @@ -149,7 +144,6 @@ public void tesselateBlock(QuadEmitter output, float x, float y, float z, BlockA this.state = blockState; this.pos = pos; - this.output = output; Vec3 offset = blockState.getOffset(pos); this.offset.set(x + offset.x, y + offset.y, z + offset.z); this.defaultAo = this.allowAO && blockState.getLightEmission() == 0; diff --git a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/AbstractBlockRenderContextMixin.java b/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/AbstractBlockRenderContextMixin.java deleted file mode 100644 index f64fd62205..0000000000 --- a/neoforge/src/mod/java/net/caffeinemc/mods/sodium/mixin/platform/neoforge/AbstractBlockRenderContextMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.caffeinemc.mods.sodium.mixin.platform.neoforge; - -import net.caffeinemc.mods.sodium.client.render.model.AbstractBlockRenderContext; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(AbstractBlockRenderContext.BlockEmitter.class) -public abstract class AbstractBlockRenderContextMixin { - @Unique - private AbstractBlockRenderContext parent; - - /** - * @author IMS - * @reason Access parent - */ - @Inject(method = "", at = @At("RETURN")) - public void assignParent(AbstractBlockRenderContext parent, CallbackInfo ci) { - this.parent = parent; - } -} diff --git a/neoforge/src/mod/resources/sodium-neoforge.mixins.json b/neoforge/src/mod/resources/sodium-neoforge.mixins.json index 1643988c28..8fccfd041f 100644 --- a/neoforge/src/mod/resources/sodium-neoforge.mixins.json +++ b/neoforge/src/mod/resources/sodium-neoforge.mixins.json @@ -13,7 +13,6 @@ "core.model.quad.BakedQuadMixin", "features.render.model.ItemModelGeneratorMixin", "features.world.biome.BiomeMixin", - "platform.neoforge.AbstractBlockRenderContextMixin", "platform.neoforge.AuxiliaryLightManagerMixin", "platform.neoforge.ClientHooksMixin", "platform.neoforge.EntrypointMixin", From 8599e605a5ac46ef18ccb1c8373d916135b2285d Mon Sep 17 00:00:00 2001 From: douira Date: Sun, 28 Jun 2026 04:50:36 +0200 Subject: [PATCH 18/27] Cache max draw size in MultiDrawBatch instead of scanning every frame (#3773) Co-authored-by: ExodusCoder9 --- .../sodium/client/gl/device/MultiDrawBatch.java | 14 +++----------- .../client/render/chunk/DefaultChunkRenderer.java | 13 ++++++++++--- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/MultiDrawBatch.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/MultiDrawBatch.java index 9f81203edc..2dfe3d62aa 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/MultiDrawBatch.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/device/MultiDrawBatch.java @@ -1,9 +1,9 @@ package net.caffeinemc.mods.sodium.client.gl.device; import org.lwjgl.PointerBuffer; -import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.Pointer; + import java.nio.IntBuffer; /** @@ -17,6 +17,7 @@ public final class MultiDrawBatch { public int size; public boolean isFilled; + public long maxElementCount; public MultiDrawBatch(int capacity) { this.pElementPointer = MemoryUtil.nmemAlignedAlloc(32, (long) capacity * Pointer.POINTER_SIZE); @@ -29,6 +30,7 @@ public MultiDrawBatch(int capacity) { public void clear() { this.size = 0; this.isFilled = false; + this.maxElementCount = 0; } public void delete() { @@ -40,14 +42,4 @@ public void delete() { public boolean isEmpty() { return this.size <= 0; } - - public int getIndexBufferSize() { - int elements = 0; - - for (var index = 0; index < this.size; index++) { - elements = Math.max(elements, MemoryIntrinsics.getInt(this.pElementCount + ((long) index * Integer.BYTES))); - } - - return elements; - } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java index a506512f10..a45fc698fd 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java @@ -91,7 +91,7 @@ public void render(ChunkRenderMatrices matrices, // When the shared index buffer is being used, we must ensure the storage has been allocated *before* // the tessellation is prepared. if (!useIndexedTessellation) { - this.sharedIndexBuffer.ensureCapacity(commandList, batch.getIndexBufferSize()); + this.sharedIndexBuffer.ensureCapacity(commandList, UInt32.downcast(batch.maxElementCount)); } GlTessellation tessellation; @@ -182,6 +182,7 @@ private static void addLocalIndexedDrawCommands(MultiDrawBatch batch, long pMesh final var pElementCount = batch.pElementCount; int size = batch.size; + long maxElementCount = batch.maxElementCount; long elementOffset = SectionRenderDataUnsafe.getBaseElement(pMeshData); long baseVertex = SectionRenderDataUnsafe.getBaseVertex(pMeshData); @@ -190,6 +191,7 @@ private static void addLocalIndexedDrawCommands(MultiDrawBatch batch, long pMesh final long vertexCount = SectionRenderDataUnsafe.getVertexCount(pMeshData, facing); final long elementCount = (vertexCount >> 2) * 6; + maxElementCount = Math.max(maxElementCount, elementCount); MemoryIntrinsics.putInt(pElementCount + (size << 2), UInt32.uncheckedDowncast(elementCount)); MemoryIntrinsics.putInt(pBaseVertex + (size << 2), UInt32.uncheckedDowncast(baseVertex)); @@ -203,6 +205,7 @@ private static void addLocalIndexedDrawCommands(MultiDrawBatch batch, long pMesh } batch.size = size; + batch.maxElementCount = maxElementCount; } /** @@ -219,6 +222,7 @@ private static void addSharedIndexedDrawCommands(MultiDrawBatch batch, long pMes final var facingList = SectionRenderDataUnsafe.getFacingList(pMeshData); int size = batch.size; + long maxElementCount = batch.maxElementCount; long groupVertexCount = 0; long baseVertex = SectionRenderDataUnsafe.getBaseVertex(pMeshData); int lastMaskBit = 0; @@ -243,7 +247,9 @@ private static void addSharedIndexedDrawCommands(MultiDrawBatch batch, long pMes continue; } - MemoryIntrinsics.putInt(pElementCount + (size << 2), UInt32.uncheckedDowncast((groupVertexCount >> 2) * 6)); + var elementCount = (groupVertexCount >> 2) * 6; + maxElementCount = Math.max(maxElementCount, elementCount); + MemoryIntrinsics.putInt(pElementCount + (size << 2), UInt32.uncheckedDowncast(elementCount)); MemoryIntrinsics.putInt(pBaseVertex + (size << 2), UInt32.uncheckedDowncast(baseVertex)); MemoryIntrinsics.putAddress(pElementPointer + (size << Pointer.POINTER_SHIFT), elementOffsetBytes); size++; @@ -260,6 +266,7 @@ private static void addSharedIndexedDrawCommands(MultiDrawBatch batch, long pMes } batch.size = size; + batch.maxElementCount = maxElementCount; } private static final int MODEL_UNASSIGNED = ModelQuadFacing.UNASSIGNED.ordinal(); @@ -355,7 +362,7 @@ private GlTessellation createRegionTessellation(CommandList commandList, RenderR }); } - private static void executeDrawBatch(CommandList commandList, GlTessellation tessellation, MultiDrawBatch batch) { + private static void executeDrawBatch(CommandList commandList, GlTessellation tessellation, net.caffeinemc.mods.sodium.client.gl.device.MultiDrawBatch batch) { try (DrawCommandList drawCommandList = commandList.beginTessellating(tessellation)) { drawCommandList.multiDrawElementsBaseVertex(batch, GlIndexType.UNSIGNED_INT); } From 1a5003f6fd3b85f39fcfcc169528e63444b881bb Mon Sep 17 00:00:00 2001 From: IMS Date: Tue, 30 Jun 2026 18:31:18 -0700 Subject: [PATCH 19/27] Port 26.2 section time info + UBO to 26.1 (#3788) Co-authored-by: douira --- .../client/gl/buffer/GlTexelBuffer.java | 20 ++ .../gl/shader/uniform/GlUniformBlock.java | 6 + .../shader/uniform/GlUniformUnsignedInt.java | 18 ++ .../client/render/SodiumWorldRenderer.java | 68 ++++-- .../client/render/chunk/ChunkRenderer.java | 6 +- .../render/chunk/DefaultChunkRenderer.java | 23 +- .../sodium/client/render/chunk/IntPool.java | 30 +++ .../render/chunk/RenderSectionManager.java | 30 +-- .../render/chunk/ShaderChunkRenderer.java | 6 +- .../render/chunk/UniformBufferManager.java | 204 ++++++++++++++++++ .../render/chunk/region/RenderRegion.java | 24 ++- .../chunk/region/RenderRegionManager.java | 20 +- .../chunk/shader/ChunkShaderInterface.java | 14 +- .../chunk/shader/ChunkShaderTextureSlot.java | 3 +- .../chunk/shader/DefaultShaderInterface.java | 108 ++++------ .../sodium/mixin/core/GlBufferAccessor.java | 11 + .../core/render/world/LevelRendererMixin.java | 5 + .../shaders/blocks/block_layer_opaque.fsh | 7 +- .../shaders/blocks/block_layer_opaque.vsh | 17 +- .../shaders/include/chunk_matrices.glsl | 8 - .../sodium/shaders/include/globals.glsl | 14 ++ .../main/resources/sodium-common.mixins.json | 1 + 22 files changed, 465 insertions(+), 178 deletions(-) create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlTexelBuffer.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformUnsignedInt.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/IntPool.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/UniformBufferManager.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/GlBufferAccessor.java delete mode 100644 common/src/main/resources/assets/sodium/shaders/include/chunk_matrices.glsl create mode 100644 common/src/main/resources/assets/sodium/shaders/include/globals.glsl diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlTexelBuffer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlTexelBuffer.java new file mode 100644 index 0000000000..2d7ee47927 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/buffer/GlTexelBuffer.java @@ -0,0 +1,20 @@ +package net.caffeinemc.mods.sodium.client.gl.buffer; + +import com.mojang.blaze3d.opengl.GlStateManager; +import net.caffeinemc.mods.sodium.client.gl.GlObject; +import org.lwjgl.opengl.GL46C; + +public class GlTexelBuffer extends GlObject { + public GlTexelBuffer(int buffer, int format) { + super(); + + this.setHandle(GlStateManager._genTexture()); + GL46C.glBindTexture(GL46C.GL_TEXTURE_BUFFER, this.handle()); + GL46C.glTexBuffer(GL46C.GL_TEXTURE_BUFFER, format, buffer); + } + + public void destroy() { + GlStateManager._deleteTexture(this.handle()); + this.invalidateHandle(); + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java index a64d6f89c5..700b70f8e1 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformBlock.java @@ -1,6 +1,8 @@ package net.caffeinemc.mods.sodium.client.gl.shader.uniform; +import com.mojang.blaze3d.buffers.GpuBufferSlice; import net.caffeinemc.mods.sodium.client.gl.buffer.GlBuffer; +import net.caffeinemc.mods.sodium.mixin.core.GlBufferAccessor; import org.lwjgl.opengl.GL32C; public class GlUniformBlock { @@ -13,4 +15,8 @@ public GlUniformBlock(int uniformBlockBinding) { public void bindBuffer(GlBuffer buffer) { GL32C.glBindBufferBase(GL32C.GL_UNIFORM_BUFFER, this.binding, buffer.handle()); } + + public void bindBufferRange(GpuBufferSlice slice) { + GL32C.glBindBufferRange(GL32C.GL_UNIFORM_BUFFER, this.binding, ((GlBufferAccessor) slice.buffer()).sodium$getHandle(), slice.offset(), slice.length()); + } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformUnsignedInt.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformUnsignedInt.java new file mode 100644 index 0000000000..7738a9f6df --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/gl/shader/uniform/GlUniformUnsignedInt.java @@ -0,0 +1,18 @@ +package net.caffeinemc.mods.sodium.client.gl.shader.uniform; + +import org.lwjgl.opengl.GL30C; + +public class GlUniformUnsignedInt extends GlUniform { + public GlUniformUnsignedInt(int index) { + super(index); + } + + @Override + public void set(Integer value) { + this.setInt(value); + } + + public void setInt(int value) { + GL30C.glUniform1ui(this.index, value); + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java index 6efe287023..15acb76839 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java @@ -8,13 +8,16 @@ import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice; import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; +import net.caffeinemc.mods.sodium.client.render.chunk.UniformBufferManager; import net.caffeinemc.mods.sodium.client.render.chunk.lists.ChunkRenderList; import net.caffeinemc.mods.sodium.client.render.chunk.lists.SortedRenderLists; import net.caffeinemc.mods.sodium.client.render.chunk.map.ChunkTracker; import net.caffeinemc.mods.sodium.client.render.chunk.map.ChunkTrackerHolder; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; +import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortBehavior; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.trigger.CameraMovement; +import net.caffeinemc.mods.sodium.client.render.viewport.CameraTransform; import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.caffeinemc.mods.sodium.client.services.PlatformRuntimeInformation; import net.caffeinemc.mods.sodium.client.util.FogParameters; @@ -72,8 +75,10 @@ public class SodiumWorldRenderer { private Matrix4f cullMatrix; private boolean useEntityCulling; + private boolean useTranslucencySorting; private RenderSectionManager renderSectionManager; + private UniformBufferManager uniformBufferManager; /** * @return The SodiumWorldRenderer based on the current dimension @@ -113,7 +118,9 @@ public void setLevel(ClientLevel level) { // If we have a level is already loaded, unload the renderer if (this.level != null) { - this.unloadLevel(); + try (CommandList commandList = RenderDevice.INSTANCE.createCommandList()) { + this.unloadLevel(commandList); + } } // If we're loading a new level, load the renderer @@ -130,12 +137,19 @@ private void loadLevel(ClientLevel level) { } } - private void unloadLevel() { + private void deleteRendererState(CommandList commandList) { if (this.renderSectionManager != null) { this.renderSectionManager.destroy(); this.renderSectionManager = null; } + if (this.uniformBufferManager != null) { + this.uniformBufferManager.delete(); + this.uniformBufferManager = null; + } + } + private void unloadLevel(CommandList commandList) { + this.deleteRendererState(commandList); this.level = null; } @@ -178,9 +192,8 @@ public void setupTerrain(Camera camera, Matrix4f cullMatrix) { NativeBuffer.reclaim(false); - this.processChunkEvents(); - this.useEntityCulling = SodiumClientMod.options().performance.useEntityCulling; + this.processChunkEvents(); if (this.client.options.getEffectiveRenderDistance() != this.renderDistance) { this.reload(); @@ -223,6 +236,7 @@ public void setupTerrain(Camera camera, this.lastFogParameters = fogParameters; this.renderSectionManager.prepareFrame(pos); + this.uniformBufferManager.prepareFrame(); if (cameraLocationChanged) { profiler.popPush("translucent_triggering"); @@ -242,12 +256,12 @@ public void setupTerrain(Camera camera, profiler.popPush("chunk_update"); - this.renderSectionManager.cleanupAndFlip(); + this.renderSectionManager.cleanupAndFlip(uniformBufferManager); this.renderSectionManager.updateChunks(viewport, updateChunksImmediately); profiler.popPush("chunk_upload"); - this.renderSectionManager.processChunkBuilds(viewport); + this.renderSectionManager.processChunkBuilds(viewport, this.uniformBufferManager); if (!this.renderSectionManager.needsUpdate()) { break; @@ -274,17 +288,27 @@ private void processChunkEvents() { } /** - * Performs a render pass for the given {@link RenderType} and draws all visible chunks for it. + * Performs a render pass for the given {@link ChunkSectionLayerGroup} and draws all visible chunks for it. */ public void drawChunkLayer(ChunkSectionLayerGroup group, ChunkRenderMatrices matrices, double x, double y, double z, GpuSampler terrainSampler) { - if (group == ChunkSectionLayerGroup.OPAQUE) { - this.renderSectionManager.renderLayer(matrices, DefaultTerrainRenderPasses.SOLID, x, y, z, this.lastFogParameters, terrainSampler); - this.renderSectionManager.renderLayer(matrices, DefaultTerrainRenderPasses.CUTOUT, x, y, z, this.lastFogParameters, terrainSampler); - } else if (group == ChunkSectionLayerGroup.TRANSLUCENT) { - this.renderSectionManager.renderLayer(matrices, DefaultTerrainRenderPasses.TRANSLUCENT, x, y, z, this.lastFogParameters, terrainSampler); + try (CommandList commandList = RenderDevice.INSTANCE.createCommandList()) { + if (group == ChunkSectionLayerGroup.OPAQUE) { + this.renderLayer(commandList, matrices, DefaultTerrainRenderPasses.SOLID, x, y, z, this.lastFogParameters, terrainSampler); + this.renderLayer(commandList, matrices, DefaultTerrainRenderPasses.CUTOUT, x, y, z, this.lastFogParameters, terrainSampler); + } else if (group == ChunkSectionLayerGroup.TRANSLUCENT) { + this.renderLayer(commandList, matrices, DefaultTerrainRenderPasses.TRANSLUCENT, x, y, z, this.lastFogParameters, terrainSampler); + } } } + public void renderLayer(CommandList commandList, ChunkRenderMatrices matrices, TerrainRenderPass pass, double x, double y, double z, FogParameters fogParameters, GpuSampler terrainSampler) { + this.uniformBufferManager.update(matrices, fogParameters); + + this.renderSectionManager.getChunkRenderer().render(matrices, commandList, this.renderSectionManager.getRenderLists(), pass, + new CameraTransform(x, y, z), fogParameters, this.useTranslucencySorting, + terrainSampler, this.uniformBufferManager.getUniformBuffer(), this.uniformBufferManager.getSectionTimeInfoTexture()); + } + public void reload() { if (this.level == null) { return; @@ -295,23 +319,23 @@ public void reload() { } } - private void initRenderer(CommandList commandList) { - if (this.renderSectionManager != null) { - this.renderSectionManager.destroy(); - this.renderSectionManager = null; + public void endFrame() { + if (this.uniformBufferManager != null) { + this.uniformBufferManager.endFrame(); } + } - // translucency sorting can be disabled in development environments by setting the debug option in the config file - var sortBehavior = SortBehavior.DYNAMIC_DEFER_NEARBY_ZERO_FRAMES; + private void initRenderer(CommandList commandList) { + this.deleteRendererState(commandList); - if (PlatformRuntimeInformation.getInstance().isDevelopmentEnvironment() - && !SodiumClientMod.options().debug.terrainSortingEnabled) { - sortBehavior = SortBehavior.OFF; - } + // translucency sorting can be disabled in development environments by setting the debug option in the config file + this.useTranslucencySorting = !PlatformRuntimeInformation.getInstance().isDevelopmentEnvironment() || SodiumClientMod.options().debug.terrainSortingEnabled; + var sortBehavior = this.useTranslucencySorting ? SortBehavior.DYNAMIC_DEFER_NEARBY_ZERO_FRAMES : SortBehavior.OFF; this.renderDistance = this.client.options.getEffectiveRenderDistance(); this.renderSectionManager = new RenderSectionManager(this.level, this.renderDistance, sortBehavior, commandList); + this.uniformBufferManager = new UniformBufferManager(this.level, this.renderDistance); var tracker = ChunkTrackerHolder.get(this.level); ChunkTracker.forEachChunk(tracker.getReadyChunks(), this.renderSectionManager::onChunkAdded); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderer.java index eea03e2c63..8d11591895 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkRenderer.java @@ -1,6 +1,8 @@ package net.caffeinemc.mods.sodium.client.render.chunk; +import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.textures.GpuSampler; +import net.caffeinemc.mods.sodium.client.gl.buffer.GlTexelBuffer; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; import net.caffeinemc.mods.sodium.client.render.chunk.lists.ChunkRenderListIterable; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; @@ -23,8 +25,10 @@ public interface ChunkRenderer { * @param parameters The current fog state * @param indexedRenderingEnabled Whether indexed rendering is enabled * @param terrainSampler The sampler to use for the atlas + * @param uniformBuffer + * @param sectionTimeInfoTexture */ - void render(ChunkRenderMatrices matrices, CommandList commandList, ChunkRenderListIterable renderLists, TerrainRenderPass pass, CameraTransform camera, FogParameters parameters, boolean indexedRenderingEnabled, GpuSampler terrainSampler); + void render(ChunkRenderMatrices matrices, CommandList commandList, ChunkRenderListIterable renderLists, TerrainRenderPass pass, CameraTransform camera, FogParameters parameters, boolean indexedRenderingEnabled, GpuSampler terrainSampler, GpuBufferSlice uniformBuffer, GlTexelBuffer sectionTimeInfoTexture); /** * Deletes this render backend and any resources attached to it. diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java index a45fc698fd..3aefc0e08b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/DefaultChunkRenderer.java @@ -1,9 +1,11 @@ package net.caffeinemc.mods.sodium.client.render.chunk; +import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.textures.GpuSampler; import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import net.caffeinemc.mods.sodium.client.SodiumClientMod; import net.caffeinemc.mods.sodium.client.gl.buffer.GlBuffer; +import net.caffeinemc.mods.sodium.client.gl.buffer.GlTexelBuffer; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; import net.caffeinemc.mods.sodium.client.gl.device.DrawCommandList; import net.caffeinemc.mods.sodium.client.gl.device.MultiDrawBatch; @@ -51,15 +53,13 @@ public void render(ChunkRenderMatrices matrices, CameraTransform camera, FogParameters parameters, boolean indexedRenderingEnabled, - GpuSampler terrainSampler) { - super.begin(renderPass, parameters, terrainSampler); + GpuSampler terrainSampler, GpuBufferSlice uniformBuffer, GlTexelBuffer sectionTimeInfoTexture) { + super.begin(renderPass, parameters, terrainSampler, uniformBuffer, sectionTimeInfoTexture); final boolean useBlockFaceCulling = SodiumClientMod.options().performance.useBlockFaceCulling; final boolean useIndexedTessellation = renderPass.isTranslucent() && indexedRenderingEnabled; ChunkShaderInterface shader = this.activeProgram.getInterface(); - shader.setProjectionMatrix(matrices.projection()); - shader.setModelViewMatrix(matrices.modelView()); Iterator iterator = renderLists.iterator(renderPass.isTranslucent()); @@ -102,7 +102,7 @@ public void render(ChunkRenderMatrices matrices, tessellation = this.prepareTessellation(commandList, resources); } - setModelMatrixUniforms(shader, region, camera, resources.prepareChunkData(commandList)); + setModelMatrixUniforms(shader, region, camera); executeDrawBatch(commandList, tessellation, batch); } @@ -320,17 +320,8 @@ public static int getVisibleFaces(int originX, int originY, int originZ, int chu return planes; } - private static void setModelMatrixUniforms(ChunkShaderInterface shader, RenderRegion region, CameraTransform camera, GlBuffer chunKData) { - float x = getCameraTranslation(region.getOriginX(), camera.intX, camera.fracX); - float y = getCameraTranslation(region.getOriginY(), camera.intY, camera.fracY); - float z = getCameraTranslation(region.getOriginZ(), camera.intZ, camera.fracZ); - - shader.setRegionOffset(x, y, z); - shader.setChunkData(chunKData, Math.toIntExact(System.currentTimeMillis() - region.getCreationTime())); - } - - private static float getCameraTranslation(int chunkBlockPos, int cameraBlockPos, float cameraPos) { - return (chunkBlockPos - cameraBlockPos) - cameraPos; + private static void setModelMatrixUniforms(ChunkShaderInterface shader, RenderRegion region, CameraTransform camera) { + shader.setRegionData(camera, region); } private GlTessellation prepareTessellation(CommandList commandList, RenderRegion.DeviceResources resources) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/IntPool.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/IntPool.java new file mode 100644 index 0000000000..45eb7962d4 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/IntPool.java @@ -0,0 +1,30 @@ +package net.caffeinemc.mods.sodium.client.render.chunk; + +import java.util.BitSet; + +public final class IntPool { + private final BitSet used = new BitSet(); + + private int next = 0; + + public int acquire() { + int id = this.used.nextClearBit(this.next); + this.used.set(id); + this.next = this.used.nextClearBit(id + 1); + + return id; + } + + public void release(int id) { + this.used.clear(id); + + if (id < this.next) { + this.next = id; + } + } + + public void clear() { + this.used.clear(); + this.next = 0; + } +} \ No newline at end of file diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java index 1bae1a92fd..4d9ee005c5 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java @@ -452,15 +452,6 @@ public void onSectionRemoved(int x, int y, int z) { this.markGraphDirty(); } - public void renderLayer(ChunkRenderMatrices matrices, TerrainRenderPass pass, double x, double y, double z, FogParameters fogParameters, GpuSampler terrainSampler) { - RenderDevice device = RenderDevice.INSTANCE; - CommandList commandList = device.createCommandList(); - - this.chunkRenderer.render(matrices, commandList, this.renderLists, pass, new CameraTransform(x, y, z), fogParameters, this.sortBehavior != SortBehavior.OFF, terrainSampler); - - commandList.flush(); - } - public void tickVisibleRenders() { Iterator it = this.renderLists.iterator(); @@ -503,7 +494,7 @@ public boolean isBoxVisible(double x1, double y1, double z1, double x2, double y return this.renderTree == null || this.renderTree.isBoxVisible(x1, y1, z1, x2, y2, z2, this::isSectionEmpty); } - public void processChunkBuilds(Viewport viewport) { + public void processChunkBuilds(Viewport viewport, UniformBufferManager uniforms) { var results = this.collectChunkBuildResults(); if (results.isEmpty()) { @@ -511,7 +502,7 @@ public void processChunkBuilds(Viewport viewport) { } // processing build results can cause invalidation of the render lists or change the connectivity of the graph. They don't necessarily imply each other, so they're tracked separately. - int changes = this.processChunkBuildResults(results, viewport); + int changes = this.processChunkBuildResults(results, viewport, uniforms); if ((changes & SectionInfoChange.GRAPH) != 0) { this.markGraphDirty(); } @@ -554,7 +545,7 @@ private boolean isSectionImmediatePresentationCandidate(Viewport viewport, Rende || this.isSectionFrustumVisible(viewport, section.adjacentEast)); } - private int processChunkBuildResults(ArrayList results, Viewport viewport) { + private int processChunkBuildResults(ArrayList results, Viewport viewport, UniformBufferManager uniforms) { var sectionsWithOutputs = this.applyBuildOutputs(results); var outputs = new ArrayList(); @@ -615,7 +606,7 @@ private int processChunkBuildResults(ArrayList results, Viewp } var uploadStart = System.nanoTime(); - this.regions.uploadResults(RenderDevice.INSTANCE.createCommandList(), outputs); + this.regions.uploadResults(RenderDevice.INSTANCE.createCommandList(), outputs, uniforms); var uploadDuration = System.nanoTime() - uploadStart; // insert and update the upload duration estimator with the total upload size, @@ -720,9 +711,9 @@ private ArrayList collectChunkBuildResults() { return results; } - public void cleanupAndFlip() { + public void cleanupAndFlip(UniformBufferManager ubm) { this.sectionCache.cleanup(); - this.regions.update(); + this.regions.update(ubm); } public void updateChunks(Viewport viewport, boolean updateImmediately) { @@ -1185,6 +1176,15 @@ private String getCullTypeName() { return this.renderLists; } + public ChunkRenderer getChunkRenderer() { + return this.chunkRenderer; + } + + public int getFrame() { + return this.frame; + } + + public boolean isSectionBuilt(int x, int y, int z) { var section = this.getRenderSection(x, y, z); return section != null && section.isBuilt(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer.java index b1d27ea769..7ae4fed05e 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer.java @@ -1,5 +1,6 @@ package net.caffeinemc.mods.sodium.client.render.chunk; +import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlDevice; import com.mojang.blaze3d.opengl.GlStateManager; @@ -9,6 +10,7 @@ import com.mojang.blaze3d.textures.GpuSampler; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.caffeinemc.mods.sodium.client.gl.attribute.GlVertexFormat; +import net.caffeinemc.mods.sodium.client.gl.buffer.GlTexelBuffer; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice; import net.caffeinemc.mods.sodium.client.render.chunk.shader.*; @@ -86,7 +88,7 @@ private static ShaderConstants createShaderConstants(ChunkShaderOptions options) return builder.build(); } - protected void begin(TerrainRenderPass pass, FogParameters parameters, GpuSampler terrainSampler) { + protected void begin(TerrainRenderPass pass, FogParameters parameters, GpuSampler terrainSampler, GpuBufferSlice uniformData, GlTexelBuffer sectionTimeInfo) { RenderTarget target = pass.getTarget(); GlStateManager._viewport(0, 0, target.getColorTexture().getWidth(0), target.getColorTexture().getHeight(0)); @@ -99,7 +101,7 @@ protected void begin(TerrainRenderPass pass, FogParameters parameters, GpuSample this.activeProgram = this.compileProgram(options); this.activeProgram.bind(); this.activeProgram.getInterface() - .setupState(pass, parameters, terrainSampler); + .setupState(pass, parameters, terrainSampler, uniformData, sectionTimeInfo); } protected void end(TerrainRenderPass pass) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/UniformBufferManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/UniformBufferManager.java new file mode 100644 index 0000000000..f4a5aa0a8d --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/UniformBufferManager.java @@ -0,0 +1,204 @@ +package net.caffeinemc.mods.sodium.client.render.chunk; + +import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.buffers.Std140Builder; +import com.mojang.blaze3d.systems.RenderSystem; +import net.caffeinemc.mods.sodium.client.gl.arena.staging.MappedStagingBuffer; +import net.caffeinemc.mods.sodium.client.gl.buffer.GlTexelBuffer; +import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice; +import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegion; +import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.impl.CompactChunkVertex; +import net.caffeinemc.mods.sodium.client.util.FogParameters; +import net.caffeinemc.mods.sodium.mixin.core.GlBufferAccessor; +import net.caffeinemc.mods.sodium.mixin.core.render.texture.TextureAtlasAccessor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.TextureFilteringMethod; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.DynamicUniformStorage; +import net.minecraft.client.renderer.texture.TextureAtlas; +import org.joml.Matrix4f; +import org.jspecify.annotations.NonNull; +import org.lwjgl.opengl.GL46C; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.system.MemoryUtil; + +import java.nio.ByteBuffer; + +public class UniformBufferManager { + private static final int GLOBAL_UNIFORM_SIZE = 256; + private static final int INITIAL_GLOBAL_UNIFORM_CAPACITY = 8; + private static final int TIME_BUFFER_SIZE_PER_REGION = RenderRegion.REGION_SIZE * Integer.BYTES; + + private final DynamicUniformStorage uniformStorage; + private GpuBufferSlice uniformData; + + private final GpuBuffer sectionTimeInfo; + private final GlTexelBuffer sectionTimeInfoTexture; + private final GpuBuffer.MappedView sectionTimeInfoMap; + + private boolean hasUpdatedThisFrame = false; + + public UniformBufferManager(ClientLevel level, int renderDistance) { + int renderDistanceDiameter = (2 * renderDistance) + 1; + int totalVerticalDistance = level.getMaxSectionY() - level.getMinSectionY() + 1; + + int regionsX = (renderDistanceDiameter + (2 * RenderRegion.REGION_WIDTH) - 2) / RenderRegion.REGION_WIDTH; + int regionsY = (totalVerticalDistance + (2 * RenderRegion.REGION_HEIGHT) - 2) / RenderRegion.REGION_HEIGHT; + + int maxRegions = regionsX * regionsY * regionsX * 2; + + this.uniformStorage = new DynamicUniformStorage<>("Sodium terrain uniforms", GLOBAL_UNIFORM_SIZE, INITIAL_GLOBAL_UNIFORM_CAPACITY); + + this.sectionTimeInfo = RenderSystem.getDevice().createBuffer(() -> "Section time info", + GpuBuffer.USAGE_UNIFORM_TEXEL_BUFFER | GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_WRITE, + (long) maxRegions * TIME_BUFFER_SIZE_PER_REGION); + + this.sectionTimeInfoTexture = new GlTexelBuffer(((GlBufferAccessor) this.sectionTimeInfo).sodium$getHandle(), GL46C.GL_R32I); + + ByteBuffer copy = MemoryUtil.memAlloc(maxRegions * TIME_BUFFER_SIZE_PER_REGION); + MemoryUtil.memSet(copy, 0xFFFFFFFF); + RenderSystem.getDevice().createCommandEncoder().writeToBuffer(this.sectionTimeInfo.slice(), copy); + MemoryUtil.memFree(copy); + + if (MappedStagingBuffer.isSupported(RenderDevice.INSTANCE)) { + this.sectionTimeInfoMap = RenderSystem.getDevice().createCommandEncoder().mapBuffer(this.sectionTimeInfo, false, true); + } else { + this.sectionTimeInfoMap = null; + } + } + + public void prepareFrame() { + this.hasUpdatedThisFrame = false; + } + + public void endFrame() { + this.uniformStorage.endFrame(); + this.uniformData = null; + } + + public void update(ChunkRenderMatrices matrices, FogParameters fogParameters) { + if (this.hasUpdatedThisFrame) { + return; + } + this.hasUpdatedThisFrame = true; + + double subTexelPrecision = (1 << RenderDevice.INSTANCE.getSubTexelPrecisionBits()); + double subTexelOffset = 1.0f / CompactChunkVertex.TEXTURE_MAX_VALUE; + + var textureAtlas = (TextureAtlasAccessor) Minecraft.getInstance() + .getTextureManager() + .getTexture(TextureAtlas.LOCATION_BLOCKS); + + this.uniformData = this.uniformStorage.writeUniform(new GlobalUniforms( + new Matrix4f(matrices.projection()), + new Matrix4f(matrices.modelView()), + fogParameters.red(), fogParameters.green(), fogParameters.blue(), fogParameters.alpha(), + fogParameters.environmentalStart(), fogParameters.environmentalEnd(), + fogParameters.renderStart(), fogParameters.renderEnd(), + 1.0f / textureAtlas.sodium$getWidth(), 1.0f / textureAtlas.sodium$getHeight(), + (float) (subTexelOffset - (((1.0D / textureAtlas.sodium$getWidth()) / subTexelPrecision))), + (float) (subTexelOffset - (((1.0D / textureAtlas.sodium$getHeight()) / subTexelPrecision))), + (float) (1.0 / (Minecraft.getInstance().options.chunkSectionFadeInTime().get() * 1000.0)), + Minecraft.getInstance().options.textureFiltering().get() == TextureFilteringMethod.RGSS ? 1 : 0 + )); + } + + public GpuBufferSlice getUniformBuffer() { + if (this.uniformData == null) { + throw new IllegalStateException("Global terrain uniforms have not been updated"); + } + + return this.uniformData; + } + + public GpuBuffer getSectionTimeInfo() { + return this.sectionTimeInfo; + } + + public GlTexelBuffer getSectionTimeInfoTexture() { + return this.sectionTimeInfoTexture; + } + + private static final ByteBuffer INVALID = MemoryUtil.memAlloc(1024); + + static { + MemoryUtil.memSet(INVALID, 0xFFFFFFFF); + } + + public void clearRegionTimes(int id) { + long regionTimesOffset = (long) id * TIME_BUFFER_SIZE_PER_REGION; + + if (this.sectionTimeInfoMap != null) { + long pRegionTimes = MemoryUtil.memAddress(this.sectionTimeInfoMap.data()) + regionTimesOffset; + MemoryUtil.memSet(pRegionTimes, 0xFFFFFFFF, TIME_BUFFER_SIZE_PER_REGION); + } else { + GpuBufferSlice slice = this.sectionTimeInfo.slice(regionTimesOffset, TIME_BUFFER_SIZE_PER_REGION); + RenderSystem.getDevice().createCommandEncoder().writeToBuffer(slice, INVALID); + } + } + + public void writeMeshTimes(int id, int sectionIndex, int relativeBuiltTime) { + long sectionTimeOffset = ((long) id * RenderRegion.REGION_SIZE + sectionIndex) * Integer.BYTES; + + if (sectionTimeOffset >= this.sectionTimeInfo.size()) { + throw new IllegalStateException("Overflowed the mesh time buffer at " + id + "x" + sectionIndex); + } + + if (this.sectionTimeInfoMap != null) { + long pSectionTime = MemoryUtil.memAddress(this.sectionTimeInfoMap.data()) + sectionTimeOffset; + MemoryUtil.memPutInt(pSectionTime, relativeBuiltTime); + } else { + try (MemoryStack stack = MemoryStack.stackPush()) { + ByteBuffer data = stack.malloc(Integer.BYTES); + data.putInt(relativeBuiltTime); + data.flip(); + GpuBufferSlice slice = this.sectionTimeInfo.slice(sectionTimeOffset, Integer.BYTES); + RenderSystem.getDevice().createCommandEncoder().writeToBuffer(slice, data); + } + } + } + + public void delete() { + if (this.sectionTimeInfoMap != null) { + this.sectionTimeInfoMap.close(); + } + this.sectionTimeInfoTexture.destroy(); + this.sectionTimeInfo.close(); + this.uniformStorage.close(); + } + + private record GlobalUniforms( + Matrix4f projection, + Matrix4f modelView, + float fogRed, + float fogGreen, + float fogBlue, + float fogAlpha, + float environmentalFogStart, + float environmentalFogEnd, + float renderFogStart, + float renderFogEnd, + float textureAtlasWidthInverse, + float textureAtlasHeightInverse, + float subTexelOffsetX, + float subTexelOffsetY, + float fadeInFactor, + int useRgbaTextureFiltering + ) implements DynamicUniformStorage.DynamicUniform { + @Override + public void write(@NonNull ByteBuffer byteBuffer) { + Std140Builder.intoBuffer(byteBuffer) + .putMat4f(this.projection) + .putMat4f(this.modelView) + .putVec4(this.fogRed, this.fogGreen, this.fogBlue, this.fogAlpha) + .putVec2(this.environmentalFogStart, this.environmentalFogEnd) + .putVec2(this.renderFogStart, this.renderFogEnd) + .putVec2(this.textureAtlasWidthInverse, this.textureAtlasHeightInverse) + .putVec2(this.subTexelOffsetX, this.subTexelOffsetY) + .putFloat(this.fadeInFactor) + .putInt(this.useRgbaTextureFiltering) + .get(); + } + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java index 53e0ab7167..328a5587b6 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion.java @@ -9,6 +9,7 @@ import net.caffeinemc.mods.sodium.client.gl.device.MultiDrawBatch; import net.caffeinemc.mods.sodium.client.gl.tessellation.GlTessellation; import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFacing; +import net.caffeinemc.mods.sodium.client.render.chunk.IntPool; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionFlags; import net.caffeinemc.mods.sodium.client.render.chunk.data.BuiltSectionInfo; @@ -69,6 +70,7 @@ public class RenderRegion { private DeviceResources resources; private final Map cachedBatches = new Reference2ReferenceOpenHashMap<>(); + private int uniqueId = -1; public RenderRegion(int x, int y, int z, StagingBuffer stagingBuffer) { this.x = x; @@ -317,10 +319,20 @@ public ChunkRenderList getRenderList() { return this.renderList; } + public int getOrAcquireId(IntPool pool) { + if (this.uniqueId == -1) { + this.uniqueId = pool.acquire(); + } + return this.uniqueId; + } + + public int getId() { + return this.uniqueId; + } + public static class DeviceResources { private final GlBufferArena geometryArena; private final GlBufferArena indexArena; - private final GlBufferStreamer chunkFades; private GlTessellation tessellation; private GlTessellation indexedTessellation; @@ -336,14 +348,9 @@ public DeviceResources(CommandList commandList, StagingBuffer stagingBuffer) { int stride = ChunkMeshFormats.COMPACT.getVertexFormat().getStride(); this.geometryArena = new GlBufferArena(commandList, REGION_SIZE * SECTION_VERTEX_COUNT_ESTIMATE, stride, stagingBuffer); - this.chunkFades = new GlBufferStreamer(commandList, REGION_SIZE, Integer.BYTES); this.indexArena = new GlBufferArena(commandList, REGION_SIZE * SECTION_INDEX_COUNT_ESTIMATE, Integer.BYTES, stagingBuffer); } - public void writeMeshTimes(int sectionIndex, int millisecondToCompare) { - this.chunkFades.writeData(sectionIndex, millisecondToCompare); - } - public void updateTessellation(CommandList commandList, GlTessellation tessellation) { if (this.tessellation != null) { this.tessellation.delete(commandList); @@ -368,10 +375,6 @@ public GlTessellation getIndexedTessellation() { return this.indexedTessellation; } - public GlBuffer prepareChunkData(CommandList commandList) { - return this.chunkFades.prepare(commandList); - } - public void deleteTessellation(CommandList commandList) { if (this.tessellation != null) { this.tessellation.delete(commandList); @@ -399,7 +402,6 @@ public void delete(CommandList commandList) { this.deleteIndexedTessellation(commandList); this.geometryArena.delete(commandList); this.indexArena.delete(commandList); - this.chunkFades.delete(commandList); } public GlBufferArena getGeometryArena() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java index 43942eb833..484d89de4d 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager.java @@ -10,7 +10,9 @@ import net.caffeinemc.mods.sodium.client.gl.arena.staging.StagingBuffer; import net.caffeinemc.mods.sodium.client.gl.device.CommandList; import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice; +import net.caffeinemc.mods.sodium.client.render.chunk.IntPool; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.caffeinemc.mods.sodium.client.render.chunk.UniformBufferManager; import net.caffeinemc.mods.sodium.client.render.chunk.compile.BuilderTaskOutput; import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkSortOutput; @@ -32,12 +34,13 @@ public class RenderRegionManager { private final Long2ReferenceOpenHashMap regions = new Long2ReferenceOpenHashMap<>(); private final StagingBuffer stagingBuffer; + private final IntPool freeIds = new IntPool(); public RenderRegionManager(CommandList commandList) { this.stagingBuffer = createStagingBuffer(commandList); } - public void update() { + public void update(UniformBufferManager ubm) { this.stagingBuffer.flip(); try (CommandList commandList = RenderDevice.INSTANCE.createCommandList()) { @@ -50,6 +53,10 @@ public void update() { if (region.isEmpty()) { region.delete(commandList); + if (region.getId() != -1) { + this.freeIds.release(region.getId()); + ubm.clearRegionTimes(region.getId()); + } it.remove(); } @@ -57,13 +64,13 @@ public void update() { } } - public void uploadResults(CommandList commandList, Collection results) { + public void uploadResults(CommandList commandList, Collection results, UniformBufferManager uniforms) { for (var entry : this.createMeshUploadQueues(results)) { - this.uploadResults(commandList, entry.getKey(), entry.getValue()); + this.uploadResults(commandList, entry.getKey(), entry.getValue(), uniforms); } } - private void uploadResults(CommandList commandList, RenderRegion region, Collection results) { + private void uploadResults(CommandList commandList, RenderRegion region, Collection results, UniformBufferManager uniforms) { var uploads = new ArrayList(); var indexUploads = new ArrayList(); @@ -171,7 +178,9 @@ private void uploadResults(CommandList commandList, RenderRegion region, Collect double distanceToPlayer = dx * dx + dy * dy + dz * dz; int relativeBuiltTime = distanceToPlayer < 768.0 ? -1 : upload.relativeBuiltTime; - resources.writeMeshTimes(upload.section.getSectionIndex(), relativeBuiltTime); + + // TODO: improve the plumbing of this to be less cumbersome + uniforms.writeMeshTimes(region.getOrAcquireId(this.freeIds), upload.section.getSectionIndex(), relativeBuiltTime); } storage.setVertexData(upload.section.getSectionIndex(), upload.vertexUpload.getResult(), upload.meshData.getVertexSegments()); @@ -218,6 +227,7 @@ private Reference2ReferenceMap.FastEntrySet uniformTextures; - private final GlUniformMatrix4f uniformModelViewMatrix; - private final GlUniformMatrix4f uniformProjectionMatrix; - private final GlUniformFloat3v uniformRegionOffset; - private final GlUniformFloat2v uniformTexCoordShrink; - private final GlUniformFloat2v uniformTexelSize; - private final GlUniformBool uniformRGSS; - private final GlUniformInt uniformCurrentTime; - private final GlUniformFloat uniformFadePeriod; - - private final GlUniformBlock uniformChunkData; - - // The fog shader component used by this program in order to set up the appropriate GL state - private final ChunkShaderFogComponent fogShader; + private final GlUniformBlock uniformGlobals; + private final GlUniformFloat3v regionUniform; + private final GlUniformInt timeUniform; + private final GlUniformUnsignedInt idUniform; public DefaultShaderInterface(ShaderBindingContext context, ChunkShaderOptions options) { - this.uniformModelViewMatrix = context.bindUniform("u_ModelViewMatrix", GlUniformMatrix4f::new); - this.uniformProjectionMatrix = context.bindUniform("u_ProjectionMatrix", GlUniformMatrix4f::new); - this.uniformRegionOffset = context.bindUniform("u_RegionOffset", GlUniformFloat3v::new); - this.uniformTexCoordShrink = context.bindUniform("u_TexCoordShrink", GlUniformFloat2v::new); - this.uniformTexelSize = context.bindUniform("u_TexelSize", GlUniformFloat2v::new); - this.uniformRGSS = context.bindUniform("u_UseRGSS", GlUniformBool::new); - - this.uniformCurrentTime = context.bindUniform("u_CurrentTime", GlUniformInt::new); - this.uniformFadePeriod = context.bindUniform("u_FadePeriodInv", GlUniformFloat::new); - - this.uniformChunkData = context.bindUniformBlock("ChunkData", 0); - this.uniformTextures = new EnumMap<>(ChunkShaderTextureSlot.class); this.uniformTextures.put(ChunkShaderTextureSlot.BLOCK, context.bindUniform("u_BlockTex", GlUniformInt::new)); this.uniformTextures.put(ChunkShaderTextureSlot.LIGHT, context.bindUniform("u_LightTex", GlUniformInt::new)); + this.uniformTextures.put(ChunkShaderTextureSlot.SECTION, context.bindUniform("u_SectionTimeInfo", GlUniformInt::new)); + + this.regionUniform = context.bindUniform("u_RegionOffset", GlUniformFloat3v::new); + this.timeUniform = context.bindUniform("u_CurrentTime", GlUniformInt::new); + this.idUniform = context.bindUniform("u_RegionID", GlUniformUnsignedInt::new); - this.fogShader = options.fog().getFactory().apply(context); + this.uniformGlobals = context.bindUniformBlock("u_Globals", 0); } @Override // the shader interface should not modify pipeline state - public void setupState(TerrainRenderPass pass, FogParameters parameters, GpuSampler terrainSampler) { + public void setupState(TerrainRenderPass pass, FogParameters parameters, GpuSampler terrainSampler, GpuBufferSlice uniformData, GlTexelBuffer sectionTimeInfo) { this.bindTexture(ChunkShaderTextureSlot.BLOCK, pass.getAtlas(), terrainSampler); this.bindTexture(ChunkShaderTextureSlot.LIGHT, Minecraft.getInstance().gameRenderer.lightmap(), RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR)); - var textureAtlas = (TextureAtlasAccessor) Minecraft.getInstance() - .getTextureManager() - .getTexture(TextureAtlas.LOCATION_BLOCKS); - - // There is a limited amount of sub-texel precision when using hardware texture sampling. The mapped texture - // area must be "shrunk" by at least one sub-texel to avoid bleed between textures in the atlas. And since we - // offset texture coordinates in the vertex format by one texel, we also need to undo that here. - double subTexelPrecision = (1 << GLRenderDevice.INSTANCE.getSubTexelPrecisionBits()); - double subTexelOffset = 1.0f / CompactChunkVertex.TEXTURE_MAX_VALUE; + GlStateManager._activeTexture(GL32C.GL_TEXTURE0 + ChunkShaderTextureSlot.SECTION.ordinal()); + GL46C.glBindTexture(GL46C.GL_TEXTURE_BUFFER, sectionTimeInfo.handle()); + var uniform = this.uniformTextures.get(ChunkShaderTextureSlot.SECTION); + uniform.setInt(ChunkShaderTextureSlot.SECTION.ordinal()); - this.uniformTexCoordShrink.set( - (float) (subTexelOffset - (((1.0D / textureAtlas.sodium$getWidth()) / subTexelPrecision))), - (float) (subTexelOffset - (((1.0D / textureAtlas.sodium$getHeight()) / subTexelPrecision))) - ); - - this.uniformTexelSize.set( - 1.0f / textureAtlas.sodium$getWidth(), - 1.0f / textureAtlas.sodium$getHeight() - ); - - this.uniformFadePeriod.setFloat((float) (1.0 / (Minecraft.getInstance().options.chunkSectionFadeInTime().get() * 1000.0))); // this is in seconds! - - this.uniformRGSS.setBool(Minecraft.getInstance().options.textureFiltering().get() == TextureFilteringMethod.RGSS); - - this.fogShader.setup(parameters); + this.uniformGlobals.bindBufferRange(uniformData); } @Override // the shader interface should not modify pipeline state @@ -101,6 +71,21 @@ public void resetState() { // This is used by alternate implementations. } + private static float getCameraTranslation(int chunkBlockPos, int cameraBlockPos, float cameraPos) { + return (chunkBlockPos - cameraBlockPos) - cameraPos; + } + + @Override + public void setRegionData(CameraTransform camera, RenderRegion region) { + float x = getCameraTranslation(region.getOriginX(), camera.intX, camera.fracX); + float y = getCameraTranslation(region.getOriginY(), camera.intY, camera.fracY); + float z = getCameraTranslation(region.getOriginZ(), camera.intZ, camera.fracZ); + + this.regionUniform.set(x, y, z); + this.timeUniform.set(Math.toIntExact(System.currentTimeMillis() - region.getCreationTime())); + this.idUniform.set(region.getId()); + } + @Deprecated(forRemoval = true) // should be handled properly in GFX instead. private void bindTexture(ChunkShaderTextureSlot slot, GpuTextureView textureView, GpuSampler sampler) { GlTexture tex = (GlTexture) textureView.texture(); @@ -113,25 +98,4 @@ private void bindTexture(ChunkShaderTextureSlot slot, GpuTextureView textureView var uniform = this.uniformTextures.get(slot); uniform.setInt(slot.ordinal()); } - - @Override - public void setChunkData(GlBuffer data, int time) { - this.uniformChunkData.bindBuffer(data); - this.uniformCurrentTime.set(time); - } - - @Override - public void setProjectionMatrix(Matrix4fc matrix) { - this.uniformProjectionMatrix.set(matrix); - } - - @Override - public void setModelViewMatrix(Matrix4fc matrix) { - this.uniformModelViewMatrix.set(matrix); - } - - @Override - public void setRegionOffset(float x, float y, float z) { - this.uniformRegionOffset.set(x, y, z); - } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/GlBufferAccessor.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/GlBufferAccessor.java new file mode 100644 index 0000000000..151fdf8374 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/GlBufferAccessor.java @@ -0,0 +1,11 @@ +package net.caffeinemc.mods.sodium.mixin.core; + +import com.mojang.blaze3d.opengl.GlBuffer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GlBuffer.class) +public interface GlBufferAccessor { + @Accessor("handle") + int sodium$getHandle(); +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java index b275df814e..462811e652 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/world/LevelRendererMixin.java @@ -130,6 +130,11 @@ private void onWorldChanged(ClientLevel level, CallbackInfo ci) { } } + @Inject(method = "endFrame", at = @At("RETURN")) + private void sodium$endFrame(CallbackInfo ci) { + this.renderer.endFrame(); + } + /** * @reason Redirect to our renderer * @author JellySquid diff --git a/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh b/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh index 92ef981699..f18fb1f459 100644 --- a/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh +++ b/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.fsh @@ -1,6 +1,7 @@ #version 330 core #import +#import #import in vec4 v_Color; // The interpolated vertex color @@ -12,12 +13,6 @@ flat in uint v_Material; uniform sampler2D u_BlockTex; // The block texture -uniform vec4 u_FogColor; // The color of the shader fog -uniform vec2 u_EnvironmentFog; // The start and end position for environmental fog -uniform vec2 u_RenderFog; // The start and end position for border fog -uniform vec2 u_TexelSize; -uniform bool u_UseRGSS; - out vec4 fragColor; // The output fragment for the color framebuffer vec4 sampleNearest(sampler2D sampler, vec2 uv, vec2 pixelSize, vec2 du, vec2 dv, vec2 texelScreenSize) { diff --git a/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.vsh b/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.vsh index 26a225ac0c..b4c8c3732b 100644 --- a/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.vsh +++ b/common/src/main/resources/assets/sodium/shaders/blocks/block_layer_opaque.vsh @@ -1,8 +1,8 @@ #version 330 core #import +#import #import -#import out vec4 v_Color; out vec2 v_TexCoord; @@ -13,18 +13,13 @@ flat out uint v_Material; out vec2 v_FragDistance; out float fadeFactor; #endif - -uniform vec3 u_RegionOffset; -uniform vec2 u_TexCoordShrink; - uniform sampler2D u_LightTex; // The light map texture sampler -uniform int u_CurrentTime; -uniform float u_FadePeriodInv; +uniform isamplerBuffer u_SectionTimeInfo; -layout(std140) uniform ChunkData { - ivec4 u_chunkFades[64]; // Packing into ivec4 is needed to avoid wasting 3KB... -}; +uniform vec3 u_RegionOffset; +uniform int u_CurrentTime; +uniform uint u_RegionID; uvec3 _get_relative_chunk_coord(uint pos) { // Packing scheme is defined by LocalSectionIndex @@ -46,7 +41,7 @@ void main() { v_FragDistance = getFragDistance(position); int chunkId = int(_draw_id); - int chunkFade = u_chunkFades[chunkId >> 2][chunkId & 3]; + int chunkFade = texelFetch(u_SectionTimeInfo, int((u_RegionID * 256u) + uint(chunkId))).r; int fadeTime = u_CurrentTime - chunkFade; float elapsed = float(fadeTime); float fade = clamp(float(u_CurrentTime - chunkFade) * u_FadePeriodInv, 0.0, 1.0); diff --git a/common/src/main/resources/assets/sodium/shaders/include/chunk_matrices.glsl b/common/src/main/resources/assets/sodium/shaders/include/chunk_matrices.glsl deleted file mode 100644 index 42b6a939d2..0000000000 --- a/common/src/main/resources/assets/sodium/shaders/include/chunk_matrices.glsl +++ /dev/null @@ -1,8 +0,0 @@ -// The projection matrix -uniform mat4 u_ProjectionMatrix; - -// The model-view matrix -uniform mat4 u_ModelViewMatrix; - -// The model-view-projection matrix -#define u_ModelViewProjectionMatrix (uProjectionMatrix * u_ModelViewMatrix) \ No newline at end of file diff --git a/common/src/main/resources/assets/sodium/shaders/include/globals.glsl b/common/src/main/resources/assets/sodium/shaders/include/globals.glsl new file mode 100644 index 0000000000..62ba8eff54 --- /dev/null +++ b/common/src/main/resources/assets/sodium/shaders/include/globals.glsl @@ -0,0 +1,14 @@ +layout(std140) uniform u_Globals { + mat4 u_ProjectionMatrix; + mat4 u_ModelViewMatrix; + + vec4 u_FogColor; + vec2 u_EnvironmentFog; + vec2 u_RenderFog; + + vec2 u_TexelSize; + vec2 u_TexCoordShrink; + + float u_FadePeriodInv; + bool u_UseRGSS; +}; \ No newline at end of file diff --git a/common/src/main/resources/sodium-common.mixins.json b/common/src/main/resources/sodium-common.mixins.json index 71facd226b..e5347179cd 100644 --- a/common/src/main/resources/sodium-common.mixins.json +++ b/common/src/main/resources/sodium-common.mixins.json @@ -12,6 +12,7 @@ }, "client": [ "core.CommandEncoderAccessor", + "core.GlBufferAccessor", "core.GlCommandEncoderAccessor", "core.GpuDeviceAccessor", "core.MinecraftMixin", From 837743f9361103ed3587d6fe479ec49fe009c54c Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 1 Jul 2026 03:24:32 +0200 Subject: [PATCH 20/27] Fix crash when reusing dynamic index data by supplying sorter even when it was not used (#3787) --- .../client/render/chunk/compile/ChunkSortOutput.java | 10 +++++----- .../chunk/compile/tasks/ChunkBuilderMeshingTask.java | 9 ++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkSortOutput.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkSortOutput.java index b38b127b68..38ec2a58b3 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkSortOutput.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkSortOutput.java @@ -14,19 +14,19 @@ public ChunkSortOutput(RenderSection render, int buildTime) { public ChunkSortOutput(RenderSection render, int buildTime, Sorter data) { this(render, buildTime); this.setSorter(data); + this.setContainsNewIndexData(true); } public void setSorter(Sorter sorter) { this.sorter = sorter; - this.containsNewIndexData = true; } - public Sorter getSorter() { - return this.sorter; + public void setContainsNewIndexData(boolean containsNewIndexData) { + this.containsNewIndexData = containsNewIndexData; } - public void markAsNotContainingNewIndexData() { - this.containsNewIndexData = false; + public Sorter getSorter() { + return this.sorter; } public boolean containsNewIndexData() { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java index 6ce2b221d8..733c5d5965 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java @@ -234,12 +234,19 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke if (sortEnabled) { if (reuseUploadedData) { - output.markAsNotContainingNewIndexData(); + // TODO: problem: when reusing index data, we may be doing so based on uploaded indexes that are not corresponding to the translucent data that ends up getting set on the section. + output.setContainsNewIndexData(false); + + // set a sorter so that it retains a copy of the geometry planes for potential re-integration into the triggering system + if (translucentData instanceof DynamicData dynamicData) { + output.setSorter(dynamicData.getSorter(false)); + } } else if (translucentData instanceof PresentTranslucentData present) { try { var sorter = present.getSorter(true); sorter.writeIndexBuffer(this); output.setSorter(sorter); + output.setContainsNewIndexData(true); } catch (Exception ex) { // Create a new crash report for exceptions thrown during sorting throw this.fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while writing index buffer for translucent geometry"), slice, null); From 5cabc76e7140053c3b45377a5aa6fecfef96b0e9 Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 1 Jul 2026 03:44:58 +0200 Subject: [PATCH 21/27] Update changelog and bump version to 0.9.1-beta.3 --- CHANGELOG.md | 5 +++++ buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 377a9c2bd8..dc41cf74c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,3 +19,8 @@ This generally improves performance and avoids the frame rate dropping when the - Fix crash "getResources is null" ([#3752](https://github.com/CaffeineMC/sodium/pull/3752)) - Fix crash "centroid is null," "allQuads is null," and "geometryPlanes is null" ([#3757](https://github.com/CaffeineMC/sodium/pull/3757)) - Fix crashes resulting from unsafe concurrency in async culling "ArrayIndexOutOfBoundsException" ([#3756](https://github.com/CaffeineMC/sodium/pull/3756)) +- Improved mod compatibility by using occlusion culling from camera render state ([#3764](https://github.com/CaffeineMC/sodium/pull/3764)) +- Optimize checks for immediate presentation in RSM ([#3768](https://github.com/CaffeineMC/sodium/pull/3768)) +- Cache max draw size in MultiDrawBatch instead of scanning every frame ([#3773](https://github.com/CaffeineMC/sodium/pull/3773)) +- Fix crash "sorter is null" ([#3787](https://github.com/CaffeineMC/sodium/pull/3787)) +- Internal code quality improvements and cleanup diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index 22fb7c312e..d55ecda2a7 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.9.1-beta.2" + val MOD_VERSION: String = "0.9.1-beta.3" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 93d1a782f1ee4e3d28237b4b19574916780817f0 Mon Sep 17 00:00:00 2001 From: meta-legend <110937181+meta-legend@users.noreply.github.com> Date: Thu, 2 Jul 2026 20:17:13 -0500 Subject: [PATCH 22/27] Remove extra ABGR conversion to fix incorrect falling block coloration (#3798) --- .../render/frapi/render/NonTerrainBlockRenderContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java index bcb5922157..ed8f9eb253 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java @@ -121,7 +121,7 @@ private int getTintColor(final BlockAndTintGetter level, final BlockState state, if (this.tintCacheIndex == tintIndex) { return this.tintCacheValue; } else { - int tintColor = ColorARGB.toABGR(this.computeTintColor(level, state, pos, tintIndex)); + int tintColor = this.computeTintColor(level, state, pos, tintIndex); this.tintCacheIndex = tintIndex; this.tintCacheValue = tintColor; return tintColor; From 052589a633e434e44b7f95297c66ea8813ebf146 Mon Sep 17 00:00:00 2001 From: meta-legend <110937181+meta-legend@users.noreply.github.com> Date: Thu, 2 Jul 2026 18:02:28 -0500 Subject: [PATCH 23/27] Fix non-terrain block lighting to comply with the FRAPI contract (#3800) See also: (#3795) --- .../frapi/render/NonTerrainBlockRenderContext.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java index ed8f9eb253..d09975780d 100644 --- a/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java +++ b/frapi/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/NonTerrainBlockRenderContext.java @@ -41,7 +41,6 @@ import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.core.BlockPos; -import net.minecraft.util.TriState; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.SingleThreadedRandomSource; import net.minecraft.world.phys.Vec3; @@ -166,14 +165,10 @@ public void tesselateBlock(QuadEmitter output, float x, float y, float z, BlockA @Override protected void processQuad(MutableQuadViewImpl quad) { - final TriState aoMode = quad.ambientOcclusion(); + // The quad's ambientOcclusion TriState overrides the model default and TRUE only has an effect if AO is enabled globally, per the FRAPI MutableQuadView#ambientOcclusion contract. + final boolean useAo = this.allowAO && quad.ambientOcclusion().toBoolean(this.defaultAo); + final LightMode lightMode = useAo ? LightMode.SMOOTH : LightMode.FLAT; final SodiumShadeMode shadeMode = quad.getShadeMode(); - final LightMode lightMode; - if (aoMode == TriState.DEFAULT) { - lightMode = this.defaultLightMode; - } else { - lightMode = this.useAmbientOcclusion && aoMode != TriState.FALSE && this.defaultAo ? LightMode.SMOOTH : LightMode.FLAT; - } final boolean emissive = quad.emissive(); this.tintQuad(quad); From d787070da5baa26de3f01a1a9bffb8c47f99a2b7 Mon Sep 17 00:00:00 2001 From: Yao Chung Hu <30311066+FlashyReese@users.noreply.github.com> Date: Sun, 5 Jul 2026 17:31:21 -0600 Subject: [PATCH 24/27] Fix command line not being restored after NeoForge early window init (#3803) Newer NeoForge creates the early GL context through the early window bootstrap path, so Sodium's normal Window#createGlfwWindow restore path does not run for that context. Wait for the early window renderer to initialize, then restore the Nvidia/AMD command line workaround using the existing undo methods. --- .../sodium/service/SodiumWorkarounds.java | 93 ++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/neoforge/src/main/java/net/caffeinemc/mods/sodium/service/SodiumWorkarounds.java b/neoforge/src/main/java/net/caffeinemc/mods/sodium/service/SodiumWorkarounds.java index d66993ebc9..d68d6d1874 100644 --- a/neoforge/src/main/java/net/caffeinemc/mods/sodium/service/SodiumWorkarounds.java +++ b/neoforge/src/main/java/net/caffeinemc/mods/sodium/service/SodiumWorkarounds.java @@ -7,8 +7,18 @@ import net.caffeinemc.mods.sodium.client.compatibility.workarounds.nvidia.NvidiaWorkarounds; import net.neoforged.fml.loading.FMLConfig; import net.neoforged.neoforgespi.earlywindow.GraphicsBootstrapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; public class SodiumWorkarounds implements GraphicsBootstrapper { + private static final Logger LOGGER = LoggerFactory.getLogger("Sodium-Workarounds"); + private static final long EARLY_WINDOW_RESTORE_TIMEOUT_NANOS = TimeUnit.SECONDS.toNanos(30); + private static final long EARLY_WINDOW_RESTORE_POLL_INTERVAL_MILLIS = 10L; + @Override public String name() { return "sodium"; @@ -20,11 +30,92 @@ public void bootstrap(String[] arguments) { GraphicsAdapterProbe.findAdapters(); Workarounds.init(); - // When early window control is disabled, NeoForge creates no early GL context, so context creation happens later in Window#createGlfwWindow. We want to avoid doing the workarounds twice if the context is going to be created later and thus our mixin to Window#createGlfwWindow runs that also applies them. + // When early window control is disabled, NeoForge creates no early GL context, so context creation happens + // later in Window#createGlfwWindow. We want to avoid applying the workarounds twice if the context is going to + // be created later and our mixin to Window#createGlfwWindow runs. // See https://github.com/CaffeineMC/sodium/issues/3664 for more details. if (FMLConfig.getBoolConfigValue(FMLConfig.ConfigValue.EARLY_WINDOW_CONTROL)) { NvidiaWorkarounds.applyEnvironmentChanges(); AmdWorkarounds.applyEnvironmentChanges(); + restoreEnvironmentChangesAfterEarlyWindowInit(); + } + } + + private static void restoreEnvironmentChangesAfterEarlyWindowInit() { + Thread thread = new Thread(SodiumWorkarounds::waitForEarlyWindowAndRestoreEnvironmentChanges, + "sodium-workaround-cleanup"); + thread.setDaemon(true); + thread.start(); + } + + private static void waitForEarlyWindowAndRestoreEnvironmentChanges() { + try { + if (!waitForEarlyWindowRenderer()) { + LOGGER.warn("Timed out waiting for NeoForge's early renderer; restoring graphics " + + "driver workaround environment changes now"); + } + } catch (Throwable t) { + LOGGER.warn("Failed while waiting for NeoForge's early renderer; restoring graphics " + + "driver workaround environment changes now", t); + } finally { + NvidiaWorkarounds.undoEnvironmentChanges(); + AmdWorkarounds.undoEnvironmentChanges(); } } + + private static boolean waitForEarlyWindowRenderer() throws ReflectiveOperationException, InterruptedException { + Class windowHandlerClass = Class.forName("net.neoforged.fml.loading.ImmediateWindowHandler"); + Field providerField = windowHandlerClass.getDeclaredField("provider"); + providerField.setAccessible(true); + + long deadline = System.nanoTime() + EARLY_WINDOW_RESTORE_TIMEOUT_NANOS; + + while (System.nanoTime() < deadline) { + Object provider = providerField.get(null); + + if (provider != null && hasEarlyWindowRendererInitialized(provider)) { + return true; + } + + Thread.sleep(EARLY_WINDOW_RESTORE_POLL_INTERVAL_MILLIS); + } + + return false; + } + + private static boolean hasEarlyWindowRendererInitialized(Object provider) throws ReflectiveOperationException { + // NeoForge >=21.10.x initializes the early GL context from a renderer future after creating the provider window. + // Waiting for it avoids restoring the spoofed command line before the driver has initialized. + Field rendererFutureField = findField(provider.getClass(), "rendererFuture"); + + if (rendererFutureField != null) { + rendererFutureField.setAccessible(true); + Object rendererFuture = rendererFutureField.get(provider); + + return rendererFuture instanceof Future future && future.isDone(); + } + + Field windowField = findField(provider.getClass(), "window"); + + if (windowField != null) { + windowField.setAccessible(true); + return windowField.getLong(provider) != 0L; + } + + return false; + } + + private static Field findField(Class clazz, String name) { + Class current = clazz; + + while (current != null) { + try { + return current.getDeclaredField(name); + } catch (NoSuchFieldException ignored) { + current = current.getSuperclass(); + } + } + + return null; + } } From 6a5ccde1de5379f3a91bbcbb2d750e5d16751212 Mon Sep 17 00:00:00 2001 From: douira Date: Mon, 6 Jul 2026 01:32:23 +0200 Subject: [PATCH 25/27] Fix geometryPlanes is null issue that was caused by rare task concurrency (#3805) --- .../tasks/ChunkBuilderMeshingTask.java | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java index 733c5d5965..25b1b47cc6 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/compile/tasks/ChunkBuilderMeshingTask.java @@ -20,6 +20,7 @@ import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.SortType; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicData; +import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.DynamicSorter; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.PresentTranslucentData; import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.data.TranslucentData; import net.caffeinemc.mods.sodium.client.services.PlatformLevelRenderHooks; @@ -179,14 +180,24 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke profiler.popPush("translucency sorting"); boolean reuseUploadedData = false; + boolean reuseTSData = false; TranslucentData translucentData = null; + DynamicSorter reusedSorter = null; if (sortEnabled) { TranslucentData oldData = this.section.getTranslucentData(); - // Reusing non-dynamic data leads to attempting to sort with it again, - // which throws an exception since it can only generate a sorter once. - // To prevent this, reusing data is prevented when forceSort is enabled and the data is not dynamic. - if (this.forceSort && !(oldData instanceof DynamicData)) { + if (oldData instanceof DynamicData dynamicData) { + // if the geometry planes have already been cleared from the dynamic sorter, + // we cannot reuse this TS data as it cannot be re-integrated into the triggering system + reusedSorter = dynamicData.getSorter(false); + if (reusedSorter.getGeometryPlanes() == null) { + reusedSorter = null; + oldData = null; + } + } else if (this.forceSort) { + // Reusing non-dynamic data leads to attempting to sort with it again, + // which throws an exception since it can only generate a sorter once. + // To prevent this, reusing data is prevented when forceSort is enabled and the data is not dynamic. oldData = null; } @@ -196,7 +207,8 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke // Create a new crash report for exceptions thrown during sort preparation throw this.fillCrashInfo(CrashReport.forThrowable(ex, "Encountered exception while preparing for translucency sorting"), slice, null); } - reuseUploadedData = !this.forceSort && translucentData == oldData; + reuseTSData = translucentData == oldData; + reuseUploadedData = !this.forceSort && reuseTSData; } profiler.popPush("meshing"); @@ -233,14 +245,16 @@ public ChunkBuildOutput execute(ChunkBuildContext buildContext, CancellationToke var output = new ChunkBuildOutput(this.section, this.submitTime, translucentData, renderData.build(), meshes, this.blockingTask); if (sortEnabled) { + // we need to set the reused sorter on reused dynamic data regardless of whether the uploaded index data is being reused + if (reuseTSData) { + // set a sorter so that it retains a copy of the geometry planes for potential re-integration into the triggering system + // assumption: reusedSorter is only set when we're using dynamic data + output.setSorter(reusedSorter); + } + if (reuseUploadedData) { // TODO: problem: when reusing index data, we may be doing so based on uploaded indexes that are not corresponding to the translucent data that ends up getting set on the section. output.setContainsNewIndexData(false); - - // set a sorter so that it retains a copy of the geometry planes for potential re-integration into the triggering system - if (translucentData instanceof DynamicData dynamicData) { - output.setSorter(dynamicData.getSorter(false)); - } } else if (translucentData instanceof PresentTranslucentData present) { try { var sorter = present.getSorter(true); From c1f7e32ab5543b482f48ca1c079fa61bbc25d29e Mon Sep 17 00:00:00 2001 From: douira Date: Mon, 6 Jul 2026 01:46:55 +0200 Subject: [PATCH 26/27] Update changelog and bump version to 0.9.1-beta.4 --- CHANGELOG.md | 5 ++++- buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc41cf74c8..79fc0f28f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,10 +17,13 @@ This generally improves performance and avoids the frame rate dropping when the - Fix broken block tinting by not incorrectly converting to the wrong color format - Fix fluid color overrides not being applied ([#3729](https://github.com/CaffeineMC/sodium/pull/3729)) - Fix crash "getResources is null" ([#3752](https://github.com/CaffeineMC/sodium/pull/3752)) -- Fix crash "centroid is null," "allQuads is null," and "geometryPlanes is null" ([#3757](https://github.com/CaffeineMC/sodium/pull/3757)) +- Fix crash "centroid is null," "allQuads is null," and "geometryPlanes is null" ([#3757](https://github.com/CaffeineMC/sodium/pull/3757), [#3805](https://github.com/CaffeineMC/sodium/pull/3805)) - Fix crashes resulting from unsafe concurrency in async culling "ArrayIndexOutOfBoundsException" ([#3756](https://github.com/CaffeineMC/sodium/pull/3756)) - Improved mod compatibility by using occlusion culling from camera render state ([#3764](https://github.com/CaffeineMC/sodium/pull/3764)) - Optimize checks for immediate presentation in RSM ([#3768](https://github.com/CaffeineMC/sodium/pull/3768)) - Cache max draw size in MultiDrawBatch instead of scanning every frame ([#3773](https://github.com/CaffeineMC/sodium/pull/3773)) - Fix crash "sorter is null" ([#3787](https://github.com/CaffeineMC/sodium/pull/3787)) - Internal code quality improvements and cleanup +- Remove extra ABGR conversion to fix incorrect falling block coloration ([#3798](https://github.com/CaffeineMC/sodium/pull/3798)) +- Fix non-terrain block lighting ([#3800](https://github.com/CaffeineMC/sodium/pull/3800)) +- Fix command line not being restored after NeoForge early window init ([#3803](https://github.com/CaffeineMC/sodium/pull/3803)) diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index d55ecda2a7..59fc2a1a1e 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.9.1-beta.3" + val MOD_VERSION: String = "0.9.1-beta.4" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s") From 836dacd26604e1466e3c69dfaa1a4b9a2017c191 Mon Sep 17 00:00:00 2001 From: douira Date: Wed, 8 Jul 2026 22:56:30 +0200 Subject: [PATCH 27/27] Update changelog and bump version to 0.9.1 --- CHANGELOG.md | 2 ++ buildSrc/src/main/kotlin/BuildConfig.kt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79fc0f28f0..ceba8265ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,3 +27,5 @@ This generally improves performance and avoids the frame rate dropping when the - Remove extra ABGR conversion to fix incorrect falling block coloration ([#3798](https://github.com/CaffeineMC/sodium/pull/3798)) - Fix non-terrain block lighting ([#3800](https://github.com/CaffeineMC/sodium/pull/3800)) - Fix command line not being restored after NeoForge early window init ([#3803](https://github.com/CaffeineMC/sodium/pull/3803)) + +Iris versions 1.11.1 and older are not compatible, and you will need to download an appropriate version from Modrinth, or if no such version is available there, from the Iris Discord server. \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/BuildConfig.kt b/buildSrc/src/main/kotlin/BuildConfig.kt index 59fc2a1a1e..a5f367d63c 100644 --- a/buildSrc/src/main/kotlin/BuildConfig.kt +++ b/buildSrc/src/main/kotlin/BuildConfig.kt @@ -8,7 +8,7 @@ object BuildConfig { val SUPPORT_FRAPI : Boolean = true // https://semver.org/ - val MOD_VERSION: String = "0.9.1-beta.4" + val MOD_VERSION: String = "0.9.1" val MINECRAFT_VERSION_SHORT: String = MINECRAFT_VERSION .replace("-snapshot-", "s")