diff --git a/build.gradle b/build.gradle index a6119c0b..f60d8c45 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.8-SNAPSHOT' id 'maven-publish' } @@ -64,15 +64,16 @@ dependencies { modImplementation(fabricApi.module("fabric-api-base", project.fabric_version)) modImplementation(fabricApi.module("fabric-block-view-api-v2", project.fabric_version)) modImplementation(fabricApi.module("fabric-rendering-fluids-v1", project.fabric_version)) + modImplementation(fabricApi.module("fabric-renderer-api-v1", project.fabric_version)) modImplementation("net.fabricmc.fabric-api:fabric-rendering-data-attachment-v1:0.3.40+73761d2e3b") modImplementation(fabricApi.module("fabric-resource-loader-v0", project.fabric_version)) - modImplementation "maven.modrinth:sodium:mc1.21-0.5.11" + modImplementation "maven.modrinth:sodium:mc1.21.4-0.6.9-fabric" //modImplementation "maven.modrinth:c2me-fabric:0.2.0+alpha.10.49+1.19.4" //modImplementation "maven.modrinth:chunks-fade-in:v1.0.3-1.19.4" //modImplementation "maven.modrinth:immersiveportals:v2.7.3-mc1.19.4" - modCompileOnly "maven.modrinth:iris:1.7.0+1.20.6" + modCompileOnly "maven.modrinth:iris:1.8.8+1.21.4-fabric" } diff --git a/gradle.properties b/gradle.properties index a0a7780a..a29200e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,15 +3,15 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.21 -yarn_mappings=1.21+build.2 -loader_version=0.15.11 +minecraft_version=1.21.4 +yarn_mappings=1.21.4+build.8 +loader_version=0.16.10 -#Fabric api -fabric_version=0.100.1+1.21 +# Fabric API +fabric_version=0.118.0+1.21.4 # Mod Properties -mod_version=0.3.0 +mod_version=0.3.3-beta maven_group=me.cortex archives_base_name=nvidium # Dependencies diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927a..e6441136 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d184210..9355b415 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c7873..b740cf13 100644 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd32..25da30db 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/src/main/java/me/cortex/nvidium/Nvidium.java b/src/main/java/me/cortex/nvidium/Nvidium.java index b2a1dbf3..dcf0b59f 100644 --- a/src/main/java/me/cortex/nvidium/Nvidium.java +++ b/src/main/java/me/cortex/nvidium/Nvidium.java @@ -5,6 +5,7 @@ import net.fabricmc.loader.api.ModContainer; import net.minecraft.util.Util; import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GLCapabilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/me/cortex/nvidium/NvidiumWorldRenderer.java b/src/main/java/me/cortex/nvidium/NvidiumWorldRenderer.java index 285b6584..4b09a37e 100644 --- a/src/main/java/me/cortex/nvidium/NvidiumWorldRenderer.java +++ b/src/main/java/me/cortex/nvidium/NvidiumWorldRenderer.java @@ -6,12 +6,12 @@ import me.cortex.nvidium.sodiumCompat.NvidiumCompactChunkVertex; import me.cortex.nvidium.util.DownloadTaskStream; import me.cortex.nvidium.util.UploadingBufferStream; -import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.impl.CompactChunkVertex; -import me.jellysquid.mods.sodium.client.render.viewport.Viewport; +import net.caffeinemc.mods.sodium.client.SodiumClientMod; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; +import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.impl.CompactChunkVertex; +import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.minecraft.client.render.Camera; import net.minecraft.client.texture.Sprite; import org.jetbrains.annotations.Nullable; @@ -129,7 +129,7 @@ private void update_allowed_memory() { } } - public void update(Camera camera, Viewport viewport, int frame, boolean spectator) { + public void update(Camera camera, Viewport viewport, boolean spectator) { if (asyncChunkTracker != null) { asyncChunkTracker.update(viewport, camera, spectator); } diff --git a/src/main/java/me/cortex/nvidium/RenderPipeline.java b/src/main/java/me/cortex/nvidium/RenderPipeline.java index 68bbc1a6..12ec61cc 100644 --- a/src/main/java/me/cortex/nvidium/RenderPipeline.java +++ b/src/main/java/me/cortex/nvidium/RenderPipeline.java @@ -15,9 +15,11 @@ import me.cortex.nvidium.util.DownloadTaskStream; import me.cortex.nvidium.util.TickableManager; import me.cortex.nvidium.util.UploadingBufferStream; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; -import me.jellysquid.mods.sodium.client.render.viewport.Viewport; +import net.caffeinemc.mods.sodium.client.SodiumClientMod; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.Fog; import net.minecraft.util.math.BlockPos; import org.joml.*; import org.lwjgl.opengl.GL11C; @@ -60,7 +62,7 @@ public class RenderPipeline { private SortRegionSectionPhase regionSectionSorter; private final IDeviceMappedBuffer sceneUniform; - private static final int SCENE_SIZE = (int) alignUp(4*4*4+4*4+4*4+4+4*4+4*4+8*8+3*4+3+4+8+8+(4*4*4), 2); + private static final int SCENE_SIZE = (int) alignUp(4*4*4+4*4+4*4+4+4*4+4*4+8*8+3*4+3+4+8+8+(4*4*4)+4, 2); private final IDeviceMappedBuffer regionVisibility; private final IDeviceMappedBuffer sectionVisibility; @@ -187,6 +189,8 @@ public void renderFrame(Viewport frustum, ChunkRenderMatrices crm, double px, do long queryAddr = 0; var rm = sectionManager.getRegionManager(); + Fog fog = RenderSystem.getShaderFog(); + short[] regionMap; //Enqueue all the visible regions { @@ -259,7 +263,7 @@ public void renderFrame(Viewport frustum, ChunkRenderMatrices crm, double px, do addr += 16; new Vector4f(delta,0).getToAddress(addr);//Subchunk offset (note, delta is already negated) addr += 16; - new Vector4f(RenderSystem.getShaderFogColor()).getToAddress(addr); + new Vector4f(fog.red(), fog.green(), fog.blue(), fog.alpha()).getToAddress(addr); addr += 16; MemoryUtil.memPutLong(addr, sceneUniform.getDeviceAddress() + SCENE_SIZE);//Put in the location of the region indexs addr += 8; @@ -290,11 +294,15 @@ public void renderFrame(Viewport frustum, ChunkRenderMatrices crm, double px, do addr += 4; MemoryUtil.memPutFloat(addr, ((float)screenHeight)/2); addr += 4; - MemoryUtil.memPutFloat(addr, RenderSystem.getShaderFogStart());//FogStart + MemoryUtil.memPutFloat(addr, fog.start());//FogStart + addr += 4; + MemoryUtil.memPutFloat(addr, fog.end());//FogEnd addr += 4; - MemoryUtil.memPutFloat(addr, RenderSystem.getShaderFogEnd());//FogEnd + MemoryUtil.memPutInt(addr, fog.shape().getId());//IsSphericalFog addr += 4; - MemoryUtil.memPutInt(addr, RenderSystem.getShaderFogShape().getId());//IsSphericalFog + int flags = 0; + flags |= SodiumClientMod.options().performance.useBlockFaceCulling?1:0; + MemoryUtil.memPutInt(addr, flags);//Flags addr += 4; MemoryUtil.memPutShort(addr, (short) visibleRegions); addr += 2; diff --git a/src/main/java/me/cortex/nvidium/api0/NvidiumAPI.java b/src/main/java/me/cortex/nvidium/api0/NvidiumAPI.java index cc0e82d4..a8c11095 100644 --- a/src/main/java/me/cortex/nvidium/api0/NvidiumAPI.java +++ b/src/main/java/me/cortex/nvidium/api0/NvidiumAPI.java @@ -1,8 +1,9 @@ package me.cortex.nvidium.api0; import me.cortex.nvidium.Nvidium; +import me.cortex.nvidium.NvidiumWorldRenderer; import me.cortex.nvidium.sodiumCompat.INvidiumWorldRendererGetter; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; import org.joml.Matrix4fc; import org.joml.Matrix4x3fc; diff --git a/src/main/java/me/cortex/nvidium/config/ConfigGuiBuilder.java b/src/main/java/me/cortex/nvidium/config/ConfigGuiBuilder.java index 424c8065..6f989f1e 100644 --- a/src/main/java/me/cortex/nvidium/config/ConfigGuiBuilder.java +++ b/src/main/java/me/cortex/nvidium/config/ConfigGuiBuilder.java @@ -3,11 +3,11 @@ import com.google.common.collect.ImmutableList; import me.cortex.nvidium.Nvidium; import me.cortex.nvidium.sodiumCompat.NvidiumOptionFlags; -import me.jellysquid.mods.sodium.client.gui.options.*; -import me.jellysquid.mods.sodium.client.gui.options.control.ControlValueFormatter; -import me.jellysquid.mods.sodium.client.gui.options.control.CyclingControl; -import me.jellysquid.mods.sodium.client.gui.options.control.SliderControl; -import me.jellysquid.mods.sodium.client.gui.options.control.TickBoxControl; +import net.caffeinemc.mods.sodium.client.gui.options.*; +import net.caffeinemc.mods.sodium.client.gui.options.control.ControlValueFormatter; +import net.caffeinemc.mods.sodium.client.gui.options.control.CyclingControl; +import net.caffeinemc.mods.sodium.client.gui.options.control.SliderControl; +import net.caffeinemc.mods.sodium.client.gui.options.control.TickBoxControl; import net.minecraft.text.Text; import java.util.ArrayList; @@ -47,7 +47,7 @@ public static void addNvidiumGui(List pages) { .setTooltip(Text.translatable("nvidium.options.region_keep_distance.tooltip")) .setControl(option -> new SliderControl(option, 32, 256, 1, x->Text.literal(x==32?"Vanilla":(x==256?"Keep All":x+" chunks")))) .setImpact(OptionImpact.VARIES) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setBinding((opts, value) -> opts.region_keep_distance = value, opts -> opts.region_keep_distance) .setFlags() .build() @@ -56,7 +56,7 @@ public static void addNvidiumGui(List pages) { .setTooltip(Text.translatable("nvidium.options.enable_temporal_coherence.tooltip")) .setControl(TickBoxControl::new) .setImpact(OptionImpact.MEDIUM) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setBinding((opts, value) -> opts.enable_temporal_coherence = value, opts -> opts.enable_temporal_coherence) .setFlags() .build() @@ -65,7 +65,7 @@ public static void addNvidiumGui(List pages) { .setTooltip(Text.translatable("nvidium.options.async_bfs.tooltip")) .setControl(TickBoxControl::new) .setImpact(OptionImpact.HIGH) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setBinding((opts, value) -> opts.async_bfs = value, opts -> opts.async_bfs) .setFlags(OptionFlag.REQUIRES_RENDERER_RELOAD) .build() @@ -74,7 +74,7 @@ public static void addNvidiumGui(List pages) { .setTooltip(Text.translatable("nvidium.options.automatic_memory_limit.tooltip")) .setControl(TickBoxControl::new) .setImpact(OptionImpact.VARIES) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setBinding((opts, value) -> opts.automatic_memory = value, opts -> opts.automatic_memory) .setFlags() .build()) @@ -83,7 +83,7 @@ public static void addNvidiumGui(List pages) { .setTooltip(Text.translatable("nvidium.options.max_gpu_memory.tooltip")) .setControl(option -> new SliderControl(option, 2048, 32768, 512, ControlValueFormatter.translateVariable("nvidium.options.mb"))) .setImpact(OptionImpact.VARIES) - .setEnabled(Nvidium.IS_ENABLED && !Nvidium.config.automatic_memory) + .setEnabled(() -> Nvidium.IS_ENABLED && !Nvidium.config.automatic_memory) .setBinding((opts, value) -> opts.max_geometry_memory = value, opts -> opts.max_geometry_memory) .setFlags(Nvidium.SUPPORTS_PERSISTENT_SPARSE_ADDRESSABLE_BUFFER?new OptionFlag[0]:new OptionFlag[]{OptionFlag.REQUIRES_RENDERER_RELOAD}) .build() @@ -92,7 +92,7 @@ public static void addNvidiumGui(List pages) { .setTooltip(Text.translatable("nvidium.options.render_fog.tooltip")) .setControl(TickBoxControl::new) .setBinding((opts, value) -> opts.render_fog = value, opts -> opts.render_fog) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setImpact(OptionImpact.MEDIUM) .setFlags(OptionFlag.REQUIRES_RENDERER_RELOAD) .build() @@ -111,7 +111,7 @@ public static void addNvidiumGui(List pages) { ) ) .setBinding((opts, value) -> opts.translucency_sorting_level = value, opts -> opts.translucency_sorting_level) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setImpact(OptionImpact.MEDIUM) //Technically, only need to reload when going from NONE->SECTIONS .setFlags(OptionFlag.REQUIRES_RENDERER_RELOAD) @@ -133,7 +133,7 @@ public static void addNvidiumGui(List pages) { ) ) .setBinding((opts, value) -> opts.statistics_level = value, opts -> opts.statistics_level) - .setEnabled(Nvidium.IS_ENABLED) + .setEnabled(() -> Nvidium.IS_ENABLED) .setImpact(OptionImpact.LOW) .setFlags(NvidiumOptionFlags.REQUIRES_SHADER_RELOAD) .build() diff --git a/src/main/java/me/cortex/nvidium/config/NvidiumConfig.java b/src/main/java/me/cortex/nvidium/config/NvidiumConfig.java index 634ff564..96ba19e6 100644 --- a/src/main/java/me/cortex/nvidium/config/NvidiumConfig.java +++ b/src/main/java/me/cortex/nvidium/config/NvidiumConfig.java @@ -14,7 +14,6 @@ public class NvidiumConfig { //The options - public int extra_rd = 100; public boolean enable_temporal_coherence = true; public int max_geometry_memory = 2048; public boolean automatic_memory = true; @@ -23,6 +22,7 @@ public class NvidiumConfig { public int region_keep_distance = 32; + public boolean render_fog = true; public TranslucencySortingLevel translucency_sorting_level = TranslucencySortingLevel.QUADS; diff --git a/src/main/java/me/cortex/nvidium/config/NvidiumConfigStore.java b/src/main/java/me/cortex/nvidium/config/NvidiumConfigStore.java index d48e46a9..a6f4ffa8 100644 --- a/src/main/java/me/cortex/nvidium/config/NvidiumConfigStore.java +++ b/src/main/java/me/cortex/nvidium/config/NvidiumConfigStore.java @@ -2,7 +2,7 @@ import me.cortex.nvidium.Nvidium; import me.cortex.nvidium.config.NvidiumConfig; -import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; +import net.caffeinemc.mods.sodium.client.gui.options.storage.OptionStorage; public class NvidiumConfigStore implements OptionStorage { private final NvidiumConfig config; diff --git a/src/main/java/me/cortex/nvidium/gl/TrackedObject.java b/src/main/java/me/cortex/nvidium/gl/TrackedObject.java index b1fdfdf3..9d164a71 100644 --- a/src/main/java/me/cortex/nvidium/gl/TrackedObject.java +++ b/src/main/java/me/cortex/nvidium/gl/TrackedObject.java @@ -3,6 +3,7 @@ import me.cortex.nvidium.Nvidium; import java.lang.ref.Cleaner; +import java.lang.ref.Cleaner.Cleanable; public abstract class TrackedObject { private final Ref ref; diff --git a/src/main/java/me/cortex/nvidium/managers/AsyncOcclusionTracker.java b/src/main/java/me/cortex/nvidium/managers/AsyncOcclusionTracker.java index f3df829b..0d758b0b 100644 --- a/src/main/java/me/cortex/nvidium/managers/AsyncOcclusionTracker.java +++ b/src/main/java/me/cortex/nvidium/managers/AsyncOcclusionTracker.java @@ -3,14 +3,15 @@ import com.mojang.blaze3d.systems.RenderSystem; import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; import me.cortex.nvidium.sodiumCompat.IRenderSectionExtension; -import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkUpdateType; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionFlags; -import me.jellysquid.mods.sodium.client.render.chunk.occlusion.OcclusionCuller; -import me.jellysquid.mods.sodium.client.render.viewport.Viewport; +import net.caffeinemc.mods.sodium.client.SodiumClientMod; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkUpdateType; +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.occlusion.OcclusionCuller; +import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; +import net.minecraft.client.render.Fog; import net.minecraft.client.texture.Sprite; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -71,17 +72,14 @@ private void run() { List blockEntitySections = new ArrayList<>(); Set animatedSpriteSet = animateVisibleSpritesOnly?new HashSet<>():null; int[] visibleGeometryCounter = new int[1]; - final OcclusionCuller.Visitor visitor = (section, visible) -> { - if (section.getPendingUpdate() != null && section.getBuildCancellationToken() == null) { + final OcclusionCuller.Visitor visitor = (section) -> { + if (section.getPendingUpdate() != null && section.getTaskCancellationToken() == null) { if ((!((IRenderSectionExtension)section).isSubmittedRebuild()) && !((IRenderSectionExtension)section).isSeen()) {//If it is in submission queue or seen dont enqueue //Set that the section has been seen ((IRenderSectionExtension)section).isSeen(true); chunkUpdates.add(section); } } - if (!visible) { - return; - } if ((section.getFlags()&(1< threads) { int budget = threads.size(); if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkBuilderMeshingTask.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkBuilderMeshingTask.java index 89edeff3..c48563df 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkBuilderMeshingTask.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkBuilderMeshingTask.java @@ -3,10 +3,10 @@ import me.cortex.nvidium.Nvidium; import me.cortex.nvidium.sodiumCompat.IRepackagedResult; import me.cortex.nvidium.sodiumCompat.SodiumResultCompatibility; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildContext; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; -import me.jellysquid.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderMeshingTask; -import me.jellysquid.mods.sodium.client.util.task.CancellationToken; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildContext; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderMeshingTask; +import net.caffeinemc.mods.sodium.client.util.task.CancellationToken; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -14,7 +14,7 @@ @Mixin(value = ChunkBuilderMeshingTask.class, remap = false) public class MixinChunkBuilderMeshingTask { - @Inject(method = "execute(Lme/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildContext;Lme/jellysquid/mods/sodium/client/util/task/CancellationToken;)Lme/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildOutput;", at = @At("TAIL")) + @Inject(method = "execute(Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkBuildContext;Lnet/caffeinemc/mods/sodium/client/util/task/CancellationToken;)Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/ChunkBuildOutput;", at = @At("TAIL")) private void repackageResults(ChunkBuildContext buildContext, CancellationToken cancellationToken, CallbackInfoReturnable cir) { if (Nvidium.IS_ENABLED) { var result = cir.getReturnValue(); diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkJobQueue.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkJobQueue.java index 18f2f86b..0b49c4b3 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkJobQueue.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinChunkJobQueue.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(targets = {"me.jellysquid.mods.sodium.client.render.chunk.compile.executor.ChunkJobQueue"},remap = false) +@Mixin(targets = {"net.caffeinemc.mods.sodium.client.render.chunk.compile.executor.ChunkJobQueue"},remap = false) public class MixinChunkJobQueue { @Redirect(method = "shutdown", at = @At(value = "INVOKE", target = "Ljava/lang/Runtime;availableProcessors()I")) private int returnAlot(Runtime instance) { diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinOptionFlag.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinOptionFlag.java index 9705d721..5269bc76 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinOptionFlag.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinOptionFlag.java @@ -1,7 +1,7 @@ package me.cortex.nvidium.mixin.sodium; import me.cortex.nvidium.sodiumCompat.NvidiumOptionFlags; -import me.jellysquid.mods.sodium.client.gui.options.OptionFlag; +import net.caffeinemc.mods.sodium.client.gui.options.OptionFlag; import org.apache.commons.lang3.ArrayUtils; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderRegionManager.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderRegionManager.java index 4f85565f..168183c6 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderRegionManager.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderRegionManager.java @@ -3,10 +3,12 @@ import me.cortex.nvidium.Nvidium; import me.cortex.nvidium.NvidiumWorldRenderer; import me.cortex.nvidium.sodiumCompat.INvidiumWorldRendererSetter; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; -import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegion; -import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegionManager; +import net.caffeinemc.mods.sodium.client.SodiumClientMod; +import net.caffeinemc.mods.sodium.client.gl.device.CommandList; +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.region.RenderRegion; +import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegionManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -15,21 +17,29 @@ import java.util.Collection; +import static me.cortex.nvidium.Nvidium.LOGGER; + @Mixin(value = RenderRegionManager.class, remap = false) public abstract class MixinRenderRegionManager implements INvidiumWorldRendererSetter { - - - @Shadow protected abstract void uploadMeshes(CommandList commandList, RenderRegion region, Collection results); - @Unique private NvidiumWorldRenderer renderer; + @Shadow + protected abstract void uploadResults(CommandList commandList, RenderRegion region, Collection results); - @Redirect(method = "uploadMeshes(Lme/jellysquid/mods/sodium/client/gl/device/CommandList;Ljava/util/Collection;)V", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/region/RenderRegionManager;uploadMeshes(Lme/jellysquid/mods/sodium/client/gl/device/CommandList;Lme/jellysquid/mods/sodium/client/render/chunk/region/RenderRegion;Ljava/util/Collection;)V")) - private void redirectUpload(RenderRegionManager instance, CommandList cmdList, RenderRegion pass, Collection uploadQueue) { + @Redirect(method = "uploadResults(Lnet/caffeinemc/mods/sodium/client/gl/device/CommandList;Ljava/util/Collection;)V", + at = @At(value = "INVOKE", + target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegionManager;uploadResults(Lnet/caffeinemc/mods/sodium/client/gl/device/CommandList;Lnet/caffeinemc/mods/sodium/client/render/chunk/region/RenderRegion;Ljava/util/Collection;)V")) + private void redirectUpload(RenderRegionManager instance, CommandList cmdList, RenderRegion pass, Collection results) { if (Nvidium.IS_ENABLED) { - uploadQueue.forEach(renderer::uploadBuildResult); + for (BuilderTaskOutput result : results) { + if (result instanceof ChunkBuildOutput) { + renderer.uploadBuildResult((ChunkBuildOutput)result); + } else { + LOGGER.error("Received ChunkSortOutput sodium translucency sorting should be disabled => %b", SodiumClientMod.options().performance.sortingEnabled); + } + } } else { - uploadMeshes(cmdList, pass, uploadQueue); + uploadResults(cmdList, pass, results); } } diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSection.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSection.java index f15fac17..20109674 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSection.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSection.java @@ -8,15 +8,15 @@ import me.cortex.nvidium.sodiumCompat.INvidiumWorldRendererSetter; import me.cortex.nvidium.sodiumCompat.IRenderSectionExtension; import me.cortex.nvidium.sodiumCompat.IrisCheck; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkUpdateType; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; -import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegionManager; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.viewport.Viewport; +import net.caffeinemc.mods.sodium.client.gl.device.CommandList; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkUpdateType; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; +import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegionManager; +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.viewport.Viewport; import net.minecraft.client.render.Camera; import net.minecraft.client.world.ClientWorld; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSectionManager.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSectionManager.java index b80552da..8403bd27 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSectionManager.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinRenderSectionManager.java @@ -5,19 +5,20 @@ import me.cortex.nvidium.NvidiumWorldRenderer; import me.cortex.nvidium.managers.AsyncOcclusionTracker; import me.cortex.nvidium.sodiumCompat.*; -import me.jellysquid.mods.sodium.client.SodiumClientMod; -import me.jellysquid.mods.sodium.client.gl.device.CommandList; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkRenderMatrices; -import me.jellysquid.mods.sodium.client.render.chunk.ChunkUpdateType; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSection; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; -import me.jellysquid.mods.sodium.client.render.chunk.region.RenderRegionManager; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexType; -import me.jellysquid.mods.sodium.client.render.texture.SpriteUtil; -import me.jellysquid.mods.sodium.client.render.viewport.Viewport; +import net.caffeinemc.mods.sodium.client.SodiumClientMod; +import net.caffeinemc.mods.sodium.client.gl.device.CommandList; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; +import net.caffeinemc.mods.sodium.client.render.chunk.ChunkUpdateType; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; +import net.caffeinemc.mods.sodium.client.render.chunk.region.RenderRegionManager; +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.vertex.format.ChunkVertexType; +import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil; +import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.minecraft.client.render.Camera; +import net.minecraft.client.render.Fog; import net.minecraft.client.world.ClientWorld; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; @@ -34,11 +35,13 @@ import java.util.Collection; import java.util.Map; +import static me.cortex.nvidium.Nvidium.LOGGER; + @Mixin(value = RenderSectionManager.class, remap = false) public class MixinRenderSectionManager implements INvidiumWorldRendererGetter { @Shadow @Final private RenderRegionManager regions; @Shadow @Final private Long2ReferenceMap sectionByPosition; - @Shadow private @NotNull Map> rebuildLists; + @Shadow private @NotNull Map> taskLists; @Shadow @Final private int renderDistance; @Unique private NvidiumWorldRenderer renderer; @Unique private Viewport viewport; @@ -46,6 +49,15 @@ public class MixinRenderSectionManager implements INvidiumWorldRendererGetter { @Unique private static void updateNvidiumIsEnabled() { Nvidium.IS_ENABLED = (!Nvidium.FORCE_DISABLE) && Nvidium.IS_COMPATIBLE && IrisCheck.checkIrisShouldDisable(); + + // Disable sodium translucency sorting since nvidium is doing it + if (Nvidium.IS_ENABLED) { + LOGGER.info("Force disabling sodium translucency sorting"); + SodiumClientMod.options().performance.sortingEnabled = false; + } else { + LOGGER.info("Enabling sodium translucency sorting"); + SodiumClientMod.options().performance.sortingEnabled = true; + } } @Inject(method = "", at = @At("TAIL")) @@ -54,12 +66,12 @@ private void init(ClientWorld world, int renderDistance, CommandList commandList if (Nvidium.IS_ENABLED) { if (renderer != null) throw new IllegalStateException("Cannot have multiple world renderers"); - renderer = new NvidiumWorldRenderer(Nvidium.config.async_bfs?new AsyncOcclusionTracker(renderDistance, sectionByPosition, world, rebuildLists):null); + renderer = new NvidiumWorldRenderer(Nvidium.config.async_bfs?new AsyncOcclusionTracker(renderDistance, sectionByPosition, world, taskLists):null); ((INvidiumWorldRendererSetter)regions).setWorldRenderer(renderer); } } - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder;(Lnet/minecraft/client/world/ClientWorld;Lme/jellysquid/mods/sodium/client/render/chunk/vertex/format/ChunkVertexType;)V", remap = true), index = 1) + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkBuilder;(Lnet/minecraft/client/world/ClientWorld;Lnet/caffeinemc/mods/sodium/client/render/chunk/vertex/format/ChunkVertexType;)V", remap = true), index = 1) private ChunkVertexType modifyVertexType(ChunkVertexType vertexType) { updateNvidiumIsEnabled(); if (Nvidium.IS_ENABLED) { @@ -80,7 +92,7 @@ private void destroy(CallbackInfo ci) { } } - @Redirect(method = "onSectionRemoved", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/RenderSection;delete()V")) + @Redirect(method = "onSectionRemoved", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/RenderSection;delete()V")) private void deleteSection(RenderSection section) { if (Nvidium.IS_ENABLED) { if (Nvidium.config.region_keep_distance == 32) { @@ -91,7 +103,7 @@ private void deleteSection(RenderSection section) { } @Inject(method = "update", at = @At("HEAD")) - private void trackViewport(Camera camera, Viewport viewport, int frame, boolean spectator, CallbackInfo ci) { + private void trackViewport(Camera camera, Viewport viewport, Fog fogParameters, boolean spectator, CallbackInfo ci) { this.viewport = viewport; } @@ -125,13 +137,13 @@ public NvidiumWorldRenderer getRenderer() { } @Inject(method = "createTerrainRenderList", at = @At("HEAD"), cancellable = true) - private void redirectTerrainRenderList(Camera camera, Viewport viewport, int frame, boolean spectator, CallbackInfo ci) { + private void redirectTerrainRenderList(Camera camera, Viewport viewport, Fog fogParameters, int frame, boolean spectator, CallbackInfo ci) { if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { ci.cancel(); } } - @Redirect(method = "submitRebuildTasks", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/RenderSection;setPendingUpdate(Lme/jellysquid/mods/sodium/client/render/chunk/ChunkUpdateType;)V")) + @Redirect(method = "submitSectionTasks(Lnet/caffeinemc/mods/sodium/client/render/chunk/compile/executor/ChunkJobCollector;Lnet/caffeinemc/mods/sodium/client/render/chunk/ChunkUpdateType;Z)V", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/RenderSection;setPendingUpdate(Lnet/caffeinemc/mods/sodium/client/render/chunk/ChunkUpdateType;)V")) private void injectEnqueueFalse(RenderSection instance, ChunkUpdateType type) { instance.setPendingUpdate(type); if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { @@ -148,7 +160,7 @@ private boolean isSectionVisibleBfs(RenderSection section) { return delta <= 1; } - @Inject(method = "isSectionVisible", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/RenderSection;getLastVisibleFrame()I", shift = At.Shift.BEFORE), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + @Inject(method = "isSectionVisible", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/RenderSection;getLastVisibleFrame()I", shift = At.Shift.BEFORE), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) private void redirectIsSectionVisible(int x, int y, int z, CallbackInfoReturnable cir, RenderSection render) { if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { cir.setReturnValue(isSectionVisibleBfs(render)); @@ -169,13 +181,13 @@ private void redirectAnimatedSpriteUpdates(CallbackInfo ci) { } } - @Inject(method = "scheduleRebuild", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/RenderSection;setPendingUpdate(Lme/jellysquid/mods/sodium/client/render/chunk/ChunkUpdateType;)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) + @Inject(method = "scheduleRebuild", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/RenderSection;setPendingUpdate(Lnet/caffeinemc/mods/sodium/client/render/chunk/ChunkUpdateType;)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) private void instantReschedule(int x, int y, int z, boolean important, CallbackInfo ci, RenderSection section, ChunkUpdateType pendingUpdate) { if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { - var queue = rebuildLists.get(pendingUpdate); + var queue = taskLists.get(pendingUpdate); if (isSectionVisibleBfs(section) && queue.size() < pendingUpdate.getMaximumQueueSize()) { ((IRenderSectionExtension)section).isSubmittedRebuild(true); - rebuildLists.get(pendingUpdate).add(section); + taskLists.get(pendingUpdate).add(section); } } } diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumOptionsGUI.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumOptionsGUI.java index 8190333d..f6e78d52 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumOptionsGUI.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumOptionsGUI.java @@ -4,10 +4,10 @@ import me.cortex.nvidium.config.ConfigGuiBuilder; import me.cortex.nvidium.sodiumCompat.INvidiumWorldRendererGetter; import me.cortex.nvidium.sodiumCompat.NvidiumOptionFlags; -import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; -import me.jellysquid.mods.sodium.client.gui.options.*; -import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import net.caffeinemc.mods.sodium.client.gui.SodiumOptionsGUI; +import net.caffeinemc.mods.sodium.client.gui.options.*; +import net.caffeinemc.mods.sodium.client.gui.options.storage.OptionStorage; +import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumWorldRenderer.java b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumWorldRenderer.java index d1210436..02dd04fa 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumWorldRenderer.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/MixinSodiumWorldRenderer.java @@ -1,15 +1,19 @@ package me.cortex.nvidium.mixin.sodium; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import me.cortex.nvidium.Nvidium; import me.cortex.nvidium.NvidiumWorldRenderer; import me.cortex.nvidium.sodiumCompat.INvidiumWorldRendererGetter; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; -import me.jellysquid.mods.sodium.client.render.viewport.Viewport; +import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; +import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.BufferBuilderStorage; import net.minecraft.client.render.Camera; +import net.minecraft.client.render.Fog; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.util.math.MatrixStack; @@ -19,7 +23,7 @@ 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.List; import java.util.SortedSet; @Mixin(value = SodiumWorldRenderer.class, remap = false) @@ -27,18 +31,18 @@ public abstract class MixinSodiumWorldRenderer implements INvidiumWorldRendererG @Shadow private RenderSectionManager renderSectionManager; @Shadow - protected static void renderBlockEntity(MatrixStack matrices, BufferBuilderStorage bufferBuilders, Long2ObjectMap> blockBreakingProgressions, float tickDelta, VertexConsumerProvider.Immediate immediate, double x, double y, double z, BlockEntityRenderDispatcher dispatcher, BlockEntity entity) { + protected static void renderBlockEntity(MatrixStack matrices, BufferBuilderStorage bufferBuilders, Long2ObjectMap> blockBreakingProgressions, float tickDelta, VertexConsumerProvider.Immediate immediate, double x, double y, double z, BlockEntityRenderDispatcher dispatcher, BlockEntity entity, ClientPlayerEntity player, LocalBooleanRef isGlowing) { } - @Inject(method = "setupTerrain", at = @At(value = "INVOKE", target = "Lme/jellysquid/mods/sodium/client/render/chunk/RenderSectionManager;needsUpdate()Z", shift = At.Shift.BEFORE)) - private void injectTerrainSetup(Camera camera, Viewport viewport, int frame, boolean spectator, boolean updateChunksImmediately, CallbackInfo ci) { + @Inject(method = "setupTerrain", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager;needsUpdate()Z", shift = At.Shift.BEFORE)) + private void injectTerrainSetup(Camera camera, Viewport viewport, Fog fogParameters, boolean spectator, boolean updateChunksImmediately, CallbackInfo ci) { if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { - ((INvidiumWorldRendererGetter)renderSectionManager).getRenderer().update(camera, viewport, frame, spectator); + ((INvidiumWorldRendererGetter)renderSectionManager).getRenderer().update(camera, viewport, spectator); } } - @Inject(method = "renderBlockEntities(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/BufferBuilderStorage;Lit/unimi/dsi/fastutil/longs/Long2ObjectMap;FLnet/minecraft/client/render/VertexConsumerProvider$Immediate;DDDLnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;)V", at = @At("HEAD"), cancellable = true, remap = true) - private void overrideEntityRenderer(MatrixStack matrices, BufferBuilderStorage bufferBuilders, Long2ObjectMap> blockBreakingProgressions, float tickDelta, VertexConsumerProvider.Immediate immediate, double x, double y, double z, BlockEntityRenderDispatcher blockEntityRenderer, CallbackInfo ci) { + @Inject(method = "renderBlockEntities(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/BufferBuilderStorage;Lit/unimi/dsi/fastutil/longs/Long2ObjectMap;FLnet/minecraft/client/render/VertexConsumerProvider$Immediate;DDDLnet/minecraft/client/render/block/entity/BlockEntityRenderDispatcher;Lnet/minecraft/client/network/ClientPlayerEntity;Lcom/llamalad7/mixinextras/sugar/ref/LocalBooleanRef;)V", at = @At("HEAD"), cancellable = true, remap = true) + private void overrideEntityRenderer(MatrixStack matrices, BufferBuilderStorage bufferBuilders, Long2ObjectMap> blockBreakingProgressions, float tickDelta, VertexConsumerProvider.Immediate immediate, double x, double y, double z, BlockEntityRenderDispatcher blockEntityRenderer, ClientPlayerEntity player, LocalBooleanRef isGlowing, CallbackInfo ci) { if (Nvidium.IS_ENABLED && Nvidium.config.async_bfs) { ci.cancel(); var sectionsWithEntities = ((INvidiumWorldRendererGetter)renderSectionManager).getRenderer().getSectionsWithEntities(); @@ -46,7 +50,7 @@ private void overrideEntityRenderer(MatrixStack matrices, BufferBuilderStorage b if (section.isDisposed() || section.getCulledBlockEntities() == null) continue; for (var entity : section.getCulledBlockEntities()) { - renderBlockEntity(matrices, bufferBuilders, blockBreakingProgressions, tickDelta, immediate, x, y, z, blockEntityRenderer, entity); + renderBlockEntity(matrices, bufferBuilders, blockBreakingProgressions, tickDelta, immediate, x, y, z, blockEntityRenderer, entity, player, isGlowing); } } } diff --git a/src/main/java/me/cortex/nvidium/mixin/sodium/SodiumWorldRendererAccessor.java b/src/main/java/me/cortex/nvidium/mixin/sodium/SodiumWorldRendererAccessor.java index 86e8ae3f..3ae1f944 100644 --- a/src/main/java/me/cortex/nvidium/mixin/sodium/SodiumWorldRendererAccessor.java +++ b/src/main/java/me/cortex/nvidium/mixin/sodium/SodiumWorldRendererAccessor.java @@ -1,7 +1,7 @@ package me.cortex.nvidium.mixin.sodium; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; -import me.jellysquid.mods.sodium.client.render.chunk.RenderSectionManager; +import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; +import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; diff --git a/src/main/java/me/cortex/nvidium/renderers/PrimaryTerrainRasterizer.java b/src/main/java/me/cortex/nvidium/renderers/PrimaryTerrainRasterizer.java index 3d948285..189bb3cd 100644 --- a/src/main/java/me/cortex/nvidium/renderers/PrimaryTerrainRasterizer.java +++ b/src/main/java/me/cortex/nvidium/renderers/PrimaryTerrainRasterizer.java @@ -45,7 +45,7 @@ public void raster(int regionCount, long commandAddr) { shader.bind(); int blockId = MinecraftClient.getInstance().getTextureManager().getTexture(Identifier.of("minecraft", "textures/atlas/blocks.png")).getGlId(); - int lightId = ((LightMapAccessor)MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager()).getTexture().getGlId(); + int lightId = ((LightMapAccessor)MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager()).getLightmapFramebuffer().getColorAttachment(); GL45C.glBindSampler(0, blockSampler); GL45C.glBindSampler(1, lightSampler); diff --git a/src/main/java/me/cortex/nvidium/renderers/RegionRasterizer.java b/src/main/java/me/cortex/nvidium/renderers/RegionRasterizer.java index eb617a5e..b35e464f 100644 --- a/src/main/java/me/cortex/nvidium/renderers/RegionRasterizer.java +++ b/src/main/java/me/cortex/nvidium/renderers/RegionRasterizer.java @@ -2,7 +2,7 @@ import me.cortex.nvidium.gl.shader.Shader; import me.cortex.nvidium.sodiumCompat.ShaderLoader; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderParser; +import net.caffeinemc.mods.sodium.client.gl.shader.ShaderParser; import net.minecraft.util.Identifier; import static me.cortex.nvidium.gl.shader.ShaderType.FRAGMENT; diff --git a/src/main/java/me/cortex/nvidium/renderers/SectionRasterizer.java b/src/main/java/me/cortex/nvidium/renderers/SectionRasterizer.java index dfac4d8c..399998ff 100644 --- a/src/main/java/me/cortex/nvidium/renderers/SectionRasterizer.java +++ b/src/main/java/me/cortex/nvidium/renderers/SectionRasterizer.java @@ -2,7 +2,7 @@ import me.cortex.nvidium.gl.shader.Shader; import me.cortex.nvidium.sodiumCompat.ShaderLoader; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderParser; +import net.caffeinemc.mods.sodium.client.gl.shader.ShaderParser; import net.minecraft.util.Identifier; import static me.cortex.nvidium.gl.shader.ShaderType.*; diff --git a/src/main/java/me/cortex/nvidium/renderers/TemporalTerrainRasterizer.java b/src/main/java/me/cortex/nvidium/renderers/TemporalTerrainRasterizer.java index e44630df..7cceb8c4 100644 --- a/src/main/java/me/cortex/nvidium/renderers/TemporalTerrainRasterizer.java +++ b/src/main/java/me/cortex/nvidium/renderers/TemporalTerrainRasterizer.java @@ -40,7 +40,7 @@ public void raster(int regionCount, long commandAddr) { shader.bind(); int blockId = MinecraftClient.getInstance().getTextureManager().getTexture(Identifier.of("minecraft", "textures/atlas/blocks.png")).getGlId(); - int lightId = ((LightMapAccessor)MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager()).getTexture().getGlId(); + int lightId = ((LightMapAccessor)MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager()).getLightmapFramebuffer().getColorAttachment(); GL45C.glBindTextureUnit(0, blockId); GL45C.glBindSampler(0, blockSampler); diff --git a/src/main/java/me/cortex/nvidium/renderers/TranslucentTerrainRasterizer.java b/src/main/java/me/cortex/nvidium/renderers/TranslucentTerrainRasterizer.java index 5c70e227..128e729d 100644 --- a/src/main/java/me/cortex/nvidium/renderers/TranslucentTerrainRasterizer.java +++ b/src/main/java/me/cortex/nvidium/renderers/TranslucentTerrainRasterizer.java @@ -52,7 +52,7 @@ public void raster(int regionCount, long commandAddr) { shader.bind(); int blockId = MinecraftClient.getInstance().getTextureManager().getTexture(Identifier.of("minecraft", "textures/atlas/blocks.png")).getGlId(); - int lightId = ((LightMapAccessor)MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager()).getTexture().getGlId(); + int lightId = ((LightMapAccessor)MinecraftClient.getInstance().gameRenderer.getLightmapTextureManager()).getLightmapFramebuffer().getColorAttachment(); GL45C.glBindSampler(0, blockSampler); GL45C.glBindSampler(1, lightSampler); diff --git a/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumCompactChunkVertex.java b/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumCompactChunkVertex.java index 473a16c8..e30f7664 100644 --- a/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumCompactChunkVertex.java +++ b/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumCompactChunkVertex.java @@ -1,19 +1,20 @@ package me.cortex.nvidium.sodiumCompat; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexAttributeFormat; -import me.jellysquid.mods.sodium.client.gl.attribute.GlVertexFormat; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.material.Material; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkMeshAttribute; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; -import me.jellysquid.mods.sodium.client.render.chunk.vertex.format.ChunkVertexType; +import net.caffeinemc.mods.sodium.client.gl.attribute.GlVertexAttributeFormat; +import net.caffeinemc.mods.sodium.client.gl.attribute.GlVertexFormat; +import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; +import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.impl.DefaultChunkMeshAttributes; +import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderBindingPoints; +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.util.ColorABGR; import net.caffeinemc.mods.sodium.api.util.ColorU8; import net.minecraft.util.math.MathHelper; import org.lwjgl.system.MemoryUtil; public class NvidiumCompactChunkVertex implements ChunkVertexType { - public static final GlVertexFormat VERTEX_FORMAT = new GlVertexFormat<>(ChunkMeshAttribute.class, null, 16); + public static final GlVertexFormat VERTEX_FORMAT = new GlVertexFormat(null, null, 16); public static final int STRIDE = 16; public static final NvidiumCompactChunkVertex INSTANCE = new NvidiumCompactChunkVertex(); @@ -28,37 +29,40 @@ public class NvidiumCompactChunkVertex implements ChunkVertexType { private static final float TEXTURE_SCALE = (1.0f / TEXTURE_MAX_VALUE); - @Override - public float getTextureScale() { - return TEXTURE_SCALE; - } - - @Override - public float getPositionScale() { - return MODEL_SCALE; - } +// @Override +// public float getTextureScale() { +// return TEXTURE_SCALE; +// } +// +// @Override +// public float getPositionScale() { +// return MODEL_SCALE; +// } +// +// @Override +// public float getPositionOffset() { +// return -MODEL_ORIGIN; +// } @Override - public float getPositionOffset() { - return -MODEL_ORIGIN; - } - - @Override - public GlVertexFormat getVertexFormat() { + public GlVertexFormat getVertexFormat() { return VERTEX_FORMAT; } @Override public ChunkVertexEncoder getEncoder() { - return (ptr, material, vertex, sectionIndex) -> { - int light = compactLight(vertex.light); - - MemoryUtil.memPutInt(ptr + 0, (encodePosition(vertex.x) << 0) | (encodePosition(vertex.y) << 16)); - MemoryUtil.memPutInt(ptr + 4, (encodePosition(vertex.z) << 0) | (encodeDrawParameters(material) << 16) | ((light&0xFF)<<24)); - MemoryUtil.memPutInt(ptr + 8, (encodeColor(vertex.color) << 0) | (((light>>8)&0xFF) << 24)); - MemoryUtil.memPutInt(ptr + 12, encodeTexture(vertex.u, vertex.v)); - - return ptr + STRIDE; + return (ptr, material, vertices, sectionIndex) -> { + for(var vertex : vertices) { + int light = compactLight(vertex.light); + + MemoryUtil.memPutInt(ptr + 0, (encodePosition(vertex.x) << 0) | (encodePosition(vertex.y) << 16)); + MemoryUtil.memPutInt(ptr + 4, (encodePosition(vertex.z) << 0) | (encodeDrawParameters(material) << 16) | ((light&0xFF)<<24)); + MemoryUtil.memPutInt(ptr + 8, (encodeColor(vertex.color, vertex.ao) << 0) | (((light>>8)&0xFF) << 24)); + MemoryUtil.memPutInt(ptr + 12, encodeTexture(vertex.u, vertex.v)); + + ptr += STRIDE; + } + return ptr; }; } @@ -74,14 +78,12 @@ private static int encodePosition(float v) { return (int) ((MODEL_ORIGIN + v) * MODEL_SCALE_INV); } - private static int encodeDrawParameters(Material material) { - return ((material.bits() & 0xFF) << 0); + private static int encodeDrawParameters(int material) { + return ((material & 0xFF) << 0); } - private static int encodeColor(int color) { - var brightness = ColorU8.byteToNormalizedFloat(ColorABGR.unpackAlpha(color)); - + private static int encodeColor(int color, float brightness) { int r = ColorU8.normalizedFloatToByte(ColorU8.byteToNormalizedFloat(ColorABGR.unpackRed(color)) * brightness); int g = ColorU8.normalizedFloatToByte(ColorU8.byteToNormalizedFloat(ColorABGR.unpackGreen(color)) * brightness); int b = ColorU8.normalizedFloatToByte(ColorU8.byteToNormalizedFloat(ColorABGR.unpackBlue(color)) * brightness); diff --git a/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumOptionFlags.java b/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumOptionFlags.java index a5a1c2a5..2736212d 100644 --- a/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumOptionFlags.java +++ b/src/main/java/me/cortex/nvidium/sodiumCompat/NvidiumOptionFlags.java @@ -1,6 +1,6 @@ package me.cortex.nvidium.sodiumCompat; -import me.jellysquid.mods.sodium.client.gui.options.OptionFlag; +import net.caffeinemc.mods.sodium.client.gui.options.OptionFlag; public class NvidiumOptionFlags { public static OptionFlag REQUIRES_SHADER_RELOAD; diff --git a/src/main/java/me/cortex/nvidium/sodiumCompat/RepackagedSectionOutput.java b/src/main/java/me/cortex/nvidium/sodiumCompat/RepackagedSectionOutput.java index 2f065853..d123925a 100644 --- a/src/main/java/me/cortex/nvidium/sodiumCompat/RepackagedSectionOutput.java +++ b/src/main/java/me/cortex/nvidium/sodiumCompat/RepackagedSectionOutput.java @@ -1,6 +1,6 @@ package me.cortex.nvidium.sodiumCompat; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; +import net.caffeinemc.mods.sodium.client.util.NativeBuffer; import org.joml.Vector3i; //Computed on the build thread instead of the render thread saving alot of 1% lows diff --git a/src/main/java/me/cortex/nvidium/sodiumCompat/ShaderLoader.java b/src/main/java/me/cortex/nvidium/sodiumCompat/ShaderLoader.java index a6d2cb6c..192648ac 100644 --- a/src/main/java/me/cortex/nvidium/sodiumCompat/ShaderLoader.java +++ b/src/main/java/me/cortex/nvidium/sodiumCompat/ShaderLoader.java @@ -3,8 +3,9 @@ import me.cortex.nvidium.Nvidium; import me.cortex.nvidium.config.StatisticsLoggingLevel; import me.cortex.nvidium.config.TranslucencySortingLevel; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderConstants; -import me.jellysquid.mods.sodium.client.gl.shader.ShaderParser; +import net.caffeinemc.mods.sodium.client.gl.shader.ShaderConstants; +import net.caffeinemc.mods.sodium.client.gl.shader.ShaderConstants.Builder; +import net.caffeinemc.mods.sodium.client.gl.shader.ShaderParser; import net.minecraft.util.Identifier; import java.util.function.Consumer; diff --git a/src/main/java/me/cortex/nvidium/sodiumCompat/SodiumResultCompatibility.java b/src/main/java/me/cortex/nvidium/sodiumCompat/SodiumResultCompatibility.java index f9bd3d9e..93109366 100644 --- a/src/main/java/me/cortex/nvidium/sodiumCompat/SodiumResultCompatibility.java +++ b/src/main/java/me/cortex/nvidium/sodiumCompat/SodiumResultCompatibility.java @@ -3,10 +3,11 @@ import it.unimi.dsi.fastutil.ints.IntArrays; import it.unimi.dsi.fastutil.longs.LongArrays; import me.cortex.nvidium.Nvidium; -import me.jellysquid.mods.sodium.client.model.quad.properties.ModelQuadFacing; -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; -import me.jellysquid.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import me.jellysquid.mods.sodium.client.util.NativeBuffer; +import net.caffeinemc.mods.sodium.client.model.quad.properties.ModelQuadFacing; +import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildOutput; +import net.caffeinemc.mods.sodium.client.render.chunk.data.BuiltSectionMeshParts; +import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; +import net.caffeinemc.mods.sodium.client.util.NativeBuffer; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.Vec3d; import org.joml.Vector3f; @@ -87,65 +88,66 @@ private static void packageSectionGeometry(int formatSize, NativeBuffer output, } //Do translucent first - var translucentData = result.meshes.get(DefaultTerrainRenderPasses.TRANSLUCENT); + var translucentData = result.meshes.get(DefaultTerrainRenderPasses.TRANSLUCENT); if (translucentData != null) { int quadCount = 0; for (int i = 0; i < 7; i++) { - var part = translucentData.getVertexRanges()[i]; - quadCount += part != null?part.vertexCount()/4:0; + var part = translucentData.getVertexCounts()[i]; + quadCount += part/4; } int quadId = 0; long[] sortingData = new long[quadCount]; long[] srcs = new long[7]; + var partOffset = 0; for (int i = 0; i < 7; i++) { - var part = translucentData.getVertexRanges()[i]; - if (part != null) { - long src = MemoryUtil.memAddress(translucentData.getVertexData().getDirectBuffer()) + (long) part.vertexStart() * formatSize; - srcs[i] = src; - - float cx = 0; - float cy = 0; - float cz = 0; - //Update the meta bits of the model format - for (int j = 0; j < part.vertexCount(); j++) { - long base = src + (long) j * formatSize; - byte flags = (byte) 0b100;//Mipping, No alpha cut - MemoryUtil.memPutByte(base + 6L, flags);//Note: the 6 here is the offset into the vertex format - - float x = decodePosition(MemoryUtil.memGetShort(base)); - float y = decodePosition(MemoryUtil.memGetShort(base + 2)); - float z = decodePosition(MemoryUtil.memGetShort(base + 4)); - updateSectionBounds(min, max, x, y, z); - - cx += x; - cy += y; - cz += z; - - if ((j&3) == 3) { - //Compute the center point of the vertex - cx *= 1 / 4f; - cy *= 1 / 4f; - cz *= 1 / 4f; - - //Distance to camera - float dx = cx-cpx; - float dy = cy-cpy; - float dz = cz-cpz; - - float dist = dx*dx + dy*dy + dz*dz; - - int sortDistance = (int) (dist*(1<<12)); - - //We pack the sorting data - long packedSortingData = (((long)sortDistance)<<32)|((((long) j>>2)<<3)|i); - sortingData[quadId++] = packedSortingData; - - cx = 0; - cy = 0; - cz = 0; - } + var part = translucentData.getVertexCounts()[i]; + + long src = MemoryUtil.memAddress(translucentData.getVertexData().getDirectBuffer()) + (long) partOffset * formatSize; + srcs[i] = src; + + float cx = 0; + float cy = 0; + float cz = 0; + //Update the meta bits of the model format + for (int j = 0; j < part; j++) { + long base = src + (long) j * formatSize; + byte flags = (byte) 0b100;//Mipping, No alpha cut + MemoryUtil.memPutByte(base + 6L, flags);//Note: the 6 here is the offset into the vertex format + + float x = decodePosition(MemoryUtil.memGetShort(base)); + float y = decodePosition(MemoryUtil.memGetShort(base + 2)); + float z = decodePosition(MemoryUtil.memGetShort(base + 4)); + updateSectionBounds(min, max, x, y, z); + + cx += x; + cy += y; + cz += z; + + if ((j&3) == 3) { + //Compute the center point of the vertex + cx *= 1 / 4f; + cy *= 1 / 4f; + cz *= 1 / 4f; + + //Distance to camera + float dx = cx-cpx; + float dy = cy-cpy; + float dz = cz-cpz; + + float dist = dx*dx + dy*dy + dz*dz; + + int sortDistance = (int) (dist*(1<<12)); + + //We pack the sorting data + long packedSortingData = (((long)sortDistance)<<32)|((((long) j>>2)<<3)|i); + sortingData[quadId++] = packedSortingData; + + cx = 0; + cy = 0; + cz = 0; } } + partOffset += part; } if (quadId != sortingData.length) { @@ -170,51 +172,50 @@ private static void packageSectionGeometry(int formatSize, NativeBuffer output, var cutout = result.meshes.get(DefaultTerrainRenderPasses.CUTOUT); //Do all but translucent + long solidPartOffset = 0; + long cutoutPartOffset = 0; for (int i = 0; i < 7; i++) { int poff = offset; if (solid != null) { - var part = solid.getVertexRanges()[i]; - if (part != null) { - long src = MemoryUtil.memAddress(solid.getVertexData().getDirectBuffer()) + (long) part.vertexStart() * formatSize; - long dst = outPtr + offset * 4L * formatSize; - MemoryUtil.memCopy(src, dst, (long) part.vertexCount() * formatSize); - - //Update the meta bits of the model format - for (int j = 0; j < part.vertexCount(); j++) { - long base = dst+ (long) j * formatSize; - byte flags = (byte) 0b100;//Mipping, No alpha cut - MemoryUtil.memPutByte(base + 6L, flags);//Note: the 6 here is the offset into the vertex format - - updateSectionBounds(min, max, base); - } - - offset += part.vertexCount()/4; + var part = solid.getVertexCounts()[i]; + long src = MemoryUtil.memAddress(solid.getVertexData().getDirectBuffer()) + solidPartOffset * formatSize; + long dst = outPtr + offset * 4L * formatSize; + MemoryUtil.memCopy(src, dst, (long) part * formatSize); + + //Update the meta bits of the model format + for (int j = 0; j < part; j++) { + long base = dst+ (long) j * formatSize; + byte flags = (byte) 0b100;//Mipping, No alpha cut + MemoryUtil.memPutByte(base + 6L, flags);//Note: the 6 here is the offset into the vertex format + + updateSectionBounds(min, max, base); } + + offset += part/4; + solidPartOffset += part; } if (cutout != null) { - var part = cutout.getVertexRanges()[i]; - if (part != null) { - long src = MemoryUtil.memAddress(cutout.getVertexData().getDirectBuffer()) + (long) part.vertexStart() * formatSize; - long dst = outPtr + offset * 4L * formatSize; - MemoryUtil.memCopy(src, dst, (long) part.vertexCount() * formatSize); - - //Update the meta bits of the model format - for (int j = 0; j < part.vertexCount(); j++) { - long base = dst + (long) j * formatSize; - short sflags = MemoryUtil.memGetByte(base + 6L); - short mipbits = (short) ((sflags&(3<<1))>>1); - //mipping, remap 0.5 cut to 0.1 when iris is loaded - if (mipbits == 0b10 && IrisCheck.IRIS_LOADED) { - mipbits = 0b01; - } - byte flags = (byte) (((sflags&1)<<2) | mipbits); - MemoryUtil.memPutByte(base + 6L, flags);//Note: the 6 here is the offset into the vertex format - - updateSectionBounds(min, max, base); + var part = cutout.getVertexCounts()[i]; + long src = MemoryUtil.memAddress(cutout.getVertexData().getDirectBuffer()) + cutoutPartOffset * formatSize; + long dst = outPtr + offset * 4L * formatSize; + MemoryUtil.memCopy(src, dst, (long) part * formatSize); + + //Update the meta bits of the model format + for (int j = 0; j < part; j++) { + long base = dst + (long) j * formatSize; + short sflags = MemoryUtil.memGetByte(base + 6L); + short mipbits = (short) ((sflags&(3<<1))>>1); + //mipping, remap 0.5 cut to 0.1 when iris is loaded + if (mipbits == 0b10 && IrisCheck.IRIS_LOADED) { + mipbits = 0b01; } + byte flags = (byte) (((sflags&1)<<2) | mipbits); + MemoryUtil.memPutByte(base + 6L, flags);//Note: the 6 here is the offset into the vertex format - offset += part.vertexCount()/4; + updateSectionBounds(min, max, base); } + offset += part/4; + cutoutPartOffset += part; } outOffsets[i] = (short) (offset - poff); } diff --git a/src/main/java/me/cortex/nvidium/util/SegmentedManager.java b/src/main/java/me/cortex/nvidium/util/SegmentedManager.java index c1122d5e..385581d2 100644 --- a/src/main/java/me/cortex/nvidium/util/SegmentedManager.java +++ b/src/main/java/me/cortex/nvidium/util/SegmentedManager.java @@ -1,6 +1,7 @@ package me.cortex.nvidium.util; import it.unimi.dsi.fastutil.longs.LongArrayList; +import it.unimi.dsi.fastutil.longs.LongBidirectionalIterator; import it.unimi.dsi.fastutil.longs.LongList; import it.unimi.dsi.fastutil.longs.LongRBTreeSet; diff --git a/src/main/java/me/cortex/nvidium/util/TickableManager.java b/src/main/java/me/cortex/nvidium/util/TickableManager.java index ad9db23b..dc542c1c 100644 --- a/src/main/java/me/cortex/nvidium/util/TickableManager.java +++ b/src/main/java/me/cortex/nvidium/util/TickableManager.java @@ -1,6 +1,7 @@ package me.cortex.nvidium.util; import java.lang.ref.WeakReference; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; diff --git a/src/main/resources/assets/nvidium/shaders/occlusion/scene.glsl b/src/main/resources/assets/nvidium/shaders/occlusion/scene.glsl index a9a56d31..049578a1 100644 --- a/src/main/resources/assets/nvidium/shaders/occlusion/scene.glsl +++ b/src/main/resources/assets/nvidium/shaders/occlusion/scene.glsl @@ -84,6 +84,7 @@ layout(std140, binding=0) uniform SceneData { float fogStart; float fogEnd; bool isCylindricalFog; + uint flags; //align(2) uint16_t regionCount;//Number of regions in regionIndicies @@ -101,4 +102,8 @@ ivec3 unpackOriginOffsetId(uint id) { int y = (int(uint((val>>50)&0x3fff))<<18)>>18; int z = (int(uint((val>>25)&0x1ffffff))<<7)>>7; return ivec3(x,y,z); +} + +bool useBlockFaceCulling() { + return (flags&1)!=0; } \ No newline at end of file diff --git a/src/main/resources/assets/nvidium/shaders/terrain/frag.frag b/src/main/resources/assets/nvidium/shaders/terrain/frag.frag index 9f3e7c0f..78013dec 100644 --- a/src/main/resources/assets/nvidium/shaders/terrain/frag.frag +++ b/src/main/resources/assets/nvidium/shaders/terrain/frag.frag @@ -72,8 +72,8 @@ void applyFog(inout vec3 colour) { layout(binding = 0) uniform sampler2D tex_diffuse; void main() { - uint quadId = uint(gl_PrimitiveID)>>4; - bool triangle0 = uint((gl_PrimitiveID>>3)&1)==0; + uint quadId = uint(gl_PrimitiveID)>>1; + bool triangle0 = uint((gl_PrimitiveID)&1)==0; uvec3 TRI_INDICIES = triangle0?uvec3(0,1,2):uvec3(2,3,0); V0 = terrainData[(quadId<<2)+TRI_INDICIES.x]; Vp = terrainData[(quadId<<2)+TRI_INDICIES.y]; @@ -84,9 +84,12 @@ void main() { colour = texture(tex_diffuse, uv, 0); colour.rgb *= v_colour; #else + float lodBias = hasMipping(V0)?0.0f:-8.0f; + uint alphaCutoff = rawVertexAlphaCutoff(V0); + vec2 uv = gl_BaryCoordNV.x*decodeVertexUV(V0) + gl_BaryCoordNV.y*decodeVertexUV(Vp) + gl_BaryCoordNV.z*decodeVertexUV(V2); - colour = texture(tex_diffuse, uv, ((gl_PrimitiveID>>2)&1)*-8.0f); - if (colour.a < getVertexAlphaCutoff(uint(gl_PrimitiveID&3))) discard; + colour = texture(tex_diffuse, uv, lodBias); + if (colour.a < getVertexAlphaCutoff(alphaCutoff)) discard; colour.a = 1; computeOutputColour(colour.rgb); #endif diff --git a/src/main/resources/assets/nvidium/shaders/terrain/mesh.glsl b/src/main/resources/assets/nvidium/shaders/terrain/mesh.glsl index 3ba9ed0b..3708dc31 100644 --- a/src/main/resources/assets/nvidium/shaders/terrain/mesh.glsl +++ b/src/main/resources/assets/nvidium/shaders/terrain/mesh.glsl @@ -169,10 +169,7 @@ void main() { putVertex(vertIndex, V0); gl_MeshVerticesNV[vertIndex++].gl_Position = pV0; putVertex(vertIndex, V2); gl_MeshVerticesNV[vertIndex++].gl_Position = pV2; - - uint lodBias = hasMipping(V0)?0:1; - uint alphaCutoff = rawVertexAlphaCutoff(V0); - int primData = int((lodBias<<2)|alphaCutoff|(id<<4)); + int primData = int(id<<1); if (t0draw) { putVertex(vertIndex, V1); gl_MeshVerticesNV[vertIndex].gl_Position = pV1; @@ -183,7 +180,7 @@ void main() { vertIndex++; //gl_MeshPrimitivesNV[triIndex++].gl_PrimitiveID = int(id<<1); - gl_MeshPrimitivesNV[triIndex++].gl_PrimitiveID = primData|(0<<3); + gl_MeshPrimitivesNV[triIndex++].gl_PrimitiveID = primData|0; } if (t1draw) { @@ -195,7 +192,7 @@ void main() { vertIndex++; //gl_MeshPrimitivesNV[triIndex++].gl_PrimitiveID = int((id<<1)+1); - gl_MeshPrimitivesNV[triIndex++].gl_PrimitiveID = primData|(1<<3); + gl_MeshPrimitivesNV[triIndex++].gl_PrimitiveID = primData|1; } diff --git a/src/main/resources/assets/nvidium/shaders/terrain/task_common.glsl b/src/main/resources/assets/nvidium/shaders/terrain/task_common.glsl index 726953ff..68245e2a 100644 --- a/src/main/resources/assets/nvidium/shaders/terrain/task_common.glsl +++ b/src/main/resources/assets/nvidium/shaders/terrain/task_common.glsl @@ -30,6 +30,12 @@ void putBinData(inout uint idx, inout uint lastIndex, uint offset, uint nextOffs void populateTasks(ivec3 relChunkPos, uvec4 ranges) { //TODO: make the ranges cumulate up, this means that we can fit much much more data per chunk // as the range will be spred across all the offsets since they are not the absolute offset + + //Hacky thing to render all block faces if the flag is not set + if (!useBlockFaceCulling()) { + relChunkPos = ivec3(0); + } + uint idx = 0; uint lastIndex = 0; diff --git a/src/main/resources/assets/nvidium/shaders/terrain/translucent/mesh.glsl b/src/main/resources/assets/nvidium/shaders/terrain/translucent/mesh.glsl index 9b84d190..6ed9e3ee 100644 --- a/src/main/resources/assets/nvidium/shaders/terrain/translucent/mesh.glsl +++ b/src/main/resources/assets/nvidium/shaders/terrain/translucent/mesh.glsl @@ -184,8 +184,8 @@ void main() { emitVertex(id, 3); #endif - gl_MeshPrimitivesNV[(gl_LocalInvocationID.x<<1)].gl_PrimitiveID = int((id>>2)<<4)|(0<<3); - gl_MeshPrimitivesNV[(gl_LocalInvocationID.x<<1)|1].gl_PrimitiveID = int((id>>2)<<4)|(1<<3); + gl_MeshPrimitivesNV[(gl_LocalInvocationID.x<<1)].gl_PrimitiveID = int((id>>2)<<1)|0; + gl_MeshPrimitivesNV[(gl_LocalInvocationID.x<<1)|1].gl_PrimitiveID = int((id>>2)<<1)|1; if (gl_LocalInvocationID.x == 0) { //Remaining quads in workgroup diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index c0a9795f..c08deaad 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -21,7 +21,7 @@ ], "depends": { "fabricloader": ">=0.15", - "minecraft": ">=1.21", - "sodium": ["=0.5.9", "=0.5.11"] + "minecraft": ">=1.21.4", + "sodium": ">=0.6.9" } }