diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index e1c47c26..ccabc7ec 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -88,11 +88,22 @@ repositories { maven { url = "https://maven.ryanhcode.dev/releases" } + + exclusiveContent { // Sodium + forRepository { + maven { + name "CaffeineMC" + url "https://maven.caffeinemc.net/releases" // or /snapshots + } + } + filter { + includeGroup("net.caffeinemc") + } + } } dependencies { - compileOnly "maven.modrinth:lithium:mc1.21.1-0.15.3-neoforge" - compileOnly "maven.modrinth:sodium:$sodium_version" + compileOnly "net.caffeinemc:sodium-neoforge-mod:$sodium_version" compileOnly "maven.modrinth:iris:$iris_version" compileOnly "maven.modrinth:distanthorizons:$distant_horizons_version" compileOnly("cc.tweaked:cc-tweaked-$minecraft_version-forge:$cc_tweaked_version") @@ -169,6 +180,7 @@ processResources { 'credits' : credits, 'java_version' : java_version, 'veil_version' : veil_version, + 'sodium_version' : sodium_version, 'sable_companion_version' : sable_companion_version ] diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java index 6fd8a45c..07f5587b 100644 --- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java +++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java @@ -1,30 +1,20 @@ package dev.ryanhcode.sable.mixin.sublevel_render.impl.sodium; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; import dev.ryanhcode.sable.Sable; import dev.ryanhcode.sable.api.sublevel.ClientSubLevelContainer; import dev.ryanhcode.sable.api.sublevel.SubLevelContainer; -import dev.ryanhcode.sable.companion.math.JOMLConversion; import dev.ryanhcode.sable.mixinterface.plot.SubLevelContainerHolder; -import dev.ryanhcode.sable.mixinterface.sublevel_render.sodium.SodiumWorldRendererExtension; import dev.ryanhcode.sable.sublevel.ClientSubLevel; -import dev.ryanhcode.sable.sublevel.SubLevel; -import dev.ryanhcode.sable.sublevel.render.dispatcher.SodiumSubLevelRenderDispatcher; import dev.ryanhcode.sable.sublevel.render.dispatcher.SubLevelRenderDispatcher; -import dev.ryanhcode.sable.sublevel.render.sodium.SodiumSubLevelRenderData; -import dev.ryanhcode.sable.sublevel.render.sodium.SubLevelRenderSectionManager; import foundry.veil.api.client.render.VeilRenderBridge; import foundry.veil.api.client.render.rendertype.VeilRenderType; -import it.unimi.dsi.fastutil.objects.Object2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectIterator; import net.caffeinemc.mods.sodium.client.SodiumClientMod; -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.SodiumWorldRenderer; 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.TaskQueueType; import net.caffeinemc.mods.sodium.client.render.viewport.Viewport; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -34,153 +24,61 @@ import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.renderer.chunk.RenderRegionCache; import net.minecraft.client.renderer.culling.Frustum; -import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.phys.Vec3; import org.joml.Matrix4f; -import org.joml.Vector3d; -import org.spongepowered.asm.mixin.*; +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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - import java.util.List; -import java.util.Map; import java.util.Objects; @Mixin(value = SodiumWorldRenderer.class, remap = false) -public abstract class SodiumWorldRendererMixin implements SodiumWorldRendererExtension { +public abstract class SodiumWorldRendererMixin { - @Unique - private final Object2ObjectMap sable$subLevelSectionManagers = new Object2ObjectOpenHashMap<>(); - @Shadow - private RenderSectionManager renderSectionManager; @Shadow private ClientLevel level; - @Shadow - @Final - private Minecraft client; - - - @Inject(method = "unloadLevel", at = @At("HEAD")) - private void sable$onUnloadLevel(final CallbackInfo ci) { - for (final RenderSectionManager manager : this.sable$subLevelSectionManagers.values()) { - manager.destroy(); - } - - this.sable$subLevelSectionManagers.clear(); - } - - @Inject(method = "scheduleTerrainUpdate", at = @At("HEAD")) - private void sable$onScheduleTerrainUpdate(final CallbackInfo ci) { - for (final RenderSectionManager manager : this.sable$subLevelSectionManagers.values()) { - manager.markGraphDirty(); - } - } /** * @author RyanH * @reason Account for sub-levels in the visible chunk count */ - @Overwrite - public int getVisibleChunkCount() { - int sum = this.renderSectionManager.getVisibleChunkCount(); + @ModifyReturnValue(method = "getVisibleChunkCount", at = @At("RETURN")) + public int getVisibleChunkCount(final int original) { + int sum = original; - for (final RenderSectionManager manager : this.sable$subLevelSectionManagers.values()) { - sum += manager.getVisibleChunkCount(); + final Iterable sublevels = SubLevelContainer.getContainer(this.level).getAllSubLevels(); + for (final ClientSubLevel sublevel : sublevels) { + sum += sublevel.getRenderData().getVisibleSectionCount(); } return sum; } - @Inject(method = "isTerrainRenderComplete", at = @At("HEAD"), cancellable = true) - public void sable$isTerrainRenderComplete(final CallbackInfoReturnable cir) { - if (cir.getReturnValueZ()) { - for (final RenderSectionManager sectionManager : this.sable$subLevelSectionManagers.values()) { - if (!sectionManager.getBuilder().isBuildQueueEmpty()) { - cir.setReturnValue(false); - break; - } - } - } - } - - @Inject(method = "setupTerrain", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager;markGraphDirty()V")) public void sable$markGraphDirty(final Camera camera, final Viewport viewport, final boolean spectator, final boolean updateChunksImmediately, final CallbackInfo ci) { -// for (ClientSubLevel source : this.sable$subLevelSectionManagers.values()) { -// source.doFrustumUpdate(camera, frustum); -// } - final Iterable sublevels = ((ClientSubLevelContainer) ((SubLevelContainerHolder) this.level).sable$getPlotContainer()).getAllSubLevels(); final Vec3 cameraPosition = camera.getPosition(); final Minecraft minecraft = Minecraft.getInstance(); final Frustum frustum = minecraft.levelRenderer.cullingFrustum; SubLevelRenderDispatcher.get().updateCulling(sublevels, cameraPosition.x, cameraPosition.y, cameraPosition.z, VeilRenderBridge.create(frustum), minecraft.player.isSpectator()); - - this.sable$subLevelSectionManagers.values().forEach(RenderSectionManager::markGraphDirty); } @Inject(method = "setupTerrain", at = @At("TAIL")) public void sable$setupTerrain(final Camera camera, final Viewport viewport, final boolean spectator, final boolean updateChunksImmediately, final CallbackInfo ci) { - final ProfilerFiller profiler = this.client.getProfiler(); - final SubLevelRenderDispatcher dispatcher = SubLevelRenderDispatcher.get(); - if (!(dispatcher instanceof SodiumSubLevelRenderDispatcher)) { - dispatcher.preRenderChunks(camera); - - final Iterable sublevels = SubLevelContainer.getContainer(this.level).getAllSubLevels(); - final RenderRegionCache renderRegionCache = new RenderRegionCache(); - - final PrioritizeChunkUpdates chunkUpdates = SodiumClientMod.options().performance.alwaysDeferChunkUpdates ? PrioritizeChunkUpdates.NONE : PrioritizeChunkUpdates.NEARBY; - for (final ClientSubLevel sublevel : sublevels) { - sublevel.getRenderData().compileSections(chunkUpdates, renderRegionCache, camera); - } - return; - } - - for (final ClientSubLevel clientSubLevel : SubLevelContainer.getContainer(this.level).getAllSubLevels()) { - this.sable$getOrCreateSubLevelRenderSectionManager(clientSubLevel); - } - - final ObjectIterator> iter = this.sable$subLevelSectionManagers.entrySet().iterator(); - while (iter.hasNext()) { - final Map.Entry entry = iter.next(); - final ClientSubLevel subLevel = entry.getKey(); - final RenderSectionManager renderSectionManager = entry.getValue(); + dispatcher.preRenderChunks(camera); - if (subLevel.isRemoved()) { - renderSectionManager.destroy(); - iter.remove(); - } else { - - final Vector3d cameraPos = JOMLConversion.toJOML(camera.getPosition()); - subLevel.renderPose().transformPositionInverse(cameraPos); - renderSectionManager.updateCameraState(cameraPos, camera); - - ((SodiumSubLevelRenderData) subLevel.getRenderData()).updateChunks(updateChunksImmediately); - } - } - - for (final RenderSectionManager renderSectionManager : this.sable$subLevelSectionManagers.values()) { - profiler.push("chunk_update"); - renderSectionManager.updateChunks(updateChunksImmediately); - profiler.popPush("chunk_upload"); - renderSectionManager.uploadChunks(); - - profiler.popPush("chunk_render_lists"); - renderSectionManager.update(camera, viewport, spectator); - - if (updateChunksImmediately) { - profiler.popPush("chunk_upload_immediately"); - renderSectionManager.uploadChunks(); - } + final Iterable sublevels = SubLevelContainer.getContainer(this.level).getAllSubLevels(); + final RenderRegionCache renderRegionCache = new RenderRegionCache(); - profiler.popPush("chunk_render_tick"); - renderSectionManager.tickVisibleRenders(); - profiler.pop(); + final TaskQueueType buildQueueType = SodiumClientMod.options().performance.chunkBuildDeferMode.getImportantRebuildQueueType(); + final PrioritizeChunkUpdates chunkUpdates = buildQueueType == TaskQueueType.ALWAYS_DEFER ? PrioritizeChunkUpdates.NONE : PrioritizeChunkUpdates.NEARBY; + for (final ClientSubLevel sublevel : sublevels) { + sublevel.getRenderData().compileSections(chunkUpdates, renderRegionCache, camera); } } @@ -191,109 +89,52 @@ public int getVisibleChunkCount() { if (container != null && container.inBounds(x, z)) { final ClientSubLevel subLevel = (ClientSubLevel) Sable.HELPER.getContaining(this.level, new ChunkPos(x, z)); - if (subLevel != null) + if (subLevel != null) { subLevel.getRenderData().setDirty(x, y, z, playerChanged); - } - - for (final RenderSectionManager manager : this.sable$subLevelSectionManagers.values()) { - manager.scheduleRebuild(x, y, z, playerChanged); + } } } - -// @Inject(method = "processChunkEvents", at = @At("TAIL")) -// private void sable$onProcessChunkEvents(CallbackInfo ci) { -// for (RenderSectionManager manager : this.sable$subLevelSectionManagers.values()) { -// ChunkTracker tracker = ChunkTrackerHolder.get(this.level); -// Objects.requireNonNull(manager); -// -// ChunkTracker.ChunkEventHandler handler = manager::onChunkAdded; -// tracker.forEachEvent(handler, manager::onChunkRemoved); -// } -// } - - @Inject(method = "drawChunkLayer", at = @At("TAIL")) public void sable$drawRenderSources(final RenderType renderType, final ChunkRenderMatrices matrices, final double camX, final double camY, final double camZ, final CallbackInfo ci) { final SubLevelRenderDispatcher renderDispatcher = SubLevelRenderDispatcher.get(); - if (!(renderDispatcher instanceof SodiumSubLevelRenderDispatcher)) { - final Minecraft minecraft = Minecraft.getInstance(); - final float partialTicks = minecraft.getTimer().getGameTimeDeltaPartialTick(false); - final List subLevels = SubLevelContainer.getContainer(this.level).getAllSubLevels(); - - final Matrix4f modelView = new Matrix4f(matrices.modelView()); - final Matrix4f projection = new Matrix4f(matrices.projection()); - - { - renderType.setupRenderState(); - final ShaderInstance shader = Objects.requireNonNull(RenderSystem.getShader(), "shader"); - shader.setDefaultUniforms(VertexFormat.Mode.QUADS, modelView, projection, minecraft.getWindow()); - shader.apply(); - - renderDispatcher.renderSectionLayer(subLevels, renderType, shader, camX, camY, camZ, modelView, projection, partialTicks); - - shader.clear(); - renderType.clearRenderState(); - } - - RenderType unwrappedRenderType = renderType; - while (unwrappedRenderType instanceof final VeilRenderType.RenderTypeWrapper wrapper) { - unwrappedRenderType = wrapper.get(); - } + final Minecraft minecraft = Minecraft.getInstance(); + final float partialTicks = minecraft.getTimer().getGameTimeDeltaPartialTick(false); + final List subLevels = SubLevelContainer.getContainer(this.level).getAllSubLevels(); - if (unwrappedRenderType instanceof final VeilRenderType.LayeredRenderType layered) { - for (final RenderType layer : layered.getLayers()) { - layer.setupRenderState(); - final ShaderInstance shader = Objects.requireNonNull(RenderSystem.getShader(), "shader"); - shader.setDefaultUniforms(VertexFormat.Mode.QUADS, modelView, projection, minecraft.getWindow()); - shader.apply(); + final Matrix4f modelView = new Matrix4f(matrices.modelView()); + final Matrix4f projection = new Matrix4f(matrices.projection()); - renderDispatcher.renderSectionLayer(subLevels, layer, shader, camX, camY, camZ, modelView, projection, partialTicks); + { + renderType.setupRenderState(); + final ShaderInstance shader = Objects.requireNonNull(RenderSystem.getShader(), "shader"); + shader.setDefaultUniforms(VertexFormat.Mode.QUADS, modelView, projection, minecraft.getWindow()); + shader.apply(); - shader.clear(); - layer.clearRenderState(); - } - } + renderDispatcher.renderSectionLayer(subLevels, renderType, shader, camX, camY, camZ, modelView, projection, partialTicks); - return; + shader.clear(); + renderType.clearRenderState(); } - if (renderType == RenderType.solid() || renderType == RenderType.translucent()) { - for (final Map.Entry entry : this.sable$subLevelSectionManagers.entrySet()) { - final ClientSubLevel subLevel = entry.getKey(); - final RenderSectionManager manager = entry.getValue(); - - ((SodiumSubLevelRenderData) subLevel.getRenderData()).renderAdditional(); - - final SubLevelRenderSectionManager subLevelManager = (SubLevelRenderSectionManager) manager; - - subLevelManager.apply(matrices, camX, camY, camZ); - subLevelManager.render(matrices, renderType, camX, camY, camZ); - } + RenderType unwrappedRenderType = renderType; + while (unwrappedRenderType instanceof final VeilRenderType.RenderTypeWrapper wrapper) { + unwrappedRenderType = wrapper.get(); } - } - - @Override - public SubLevelRenderSectionManager sable$getSubLevelRenderSectionManager(final ClientSubLevel subLevel) { - return (SubLevelRenderSectionManager) this.sable$subLevelSectionManagers.get(subLevel); - } + if (unwrappedRenderType instanceof final VeilRenderType.LayeredRenderType layered) { + for (final RenderType layer : layered.getLayers()) { + layer.setupRenderState(); + final ShaderInstance shader = Objects.requireNonNull(RenderSystem.getShader(), "shader"); + shader.setDefaultUniforms(VertexFormat.Mode.QUADS, modelView, projection, minecraft.getWindow()); + shader.apply(); - @Override - public void sable$freeRenderSectionManager(final ClientSubLevel subLevel) { - final SubLevelRenderSectionManager manager = (SubLevelRenderSectionManager) this.sable$subLevelSectionManagers.remove(subLevel); - if (manager != null) { - manager.destroy(); - } - } + renderDispatcher.renderSectionLayer(subLevels, layer, shader, camX, camY, camZ, modelView, projection, partialTicks); - @Unique - private SubLevelRenderSectionManager sable$getOrCreateSubLevelRenderSectionManager(final ClientSubLevel subLevel) { - return (SubLevelRenderSectionManager) this.sable$subLevelSectionManagers.computeIfAbsent(subLevel, s -> { - try (final CommandList commandList = RenderDevice.INSTANCE.createCommandList()) { - return new SubLevelRenderSectionManager(subLevel, subLevel.getLevel(), this.client.options.getEffectiveRenderDistance(), commandList); + shader.clear(); + layer.clearRenderState(); } - }); + } } } diff --git a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/DefaultChunkRendererExtension.java b/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/DefaultChunkRendererExtension.java deleted file mode 100644 index bd1c57ab..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/DefaultChunkRendererExtension.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.ryanhcode.sable.mixinterface.sublevel_render.sodium; - -import net.caffeinemc.mods.sodium.client.render.viewport.CameraTransform; -import org.jetbrains.annotations.Nullable; - -public interface DefaultChunkRendererExtension { - void sable$setCameraTransform(@Nullable CameraTransform transform); -} diff --git a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/OcclusionCullerExtension.java b/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/OcclusionCullerExtension.java deleted file mode 100644 index 6563f6e3..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/OcclusionCullerExtension.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.ryanhcode.sable.mixinterface.sublevel_render.sodium; - -import dev.ryanhcode.sable.sublevel.ClientSubLevel; -import org.jetbrains.annotations.Nullable; - -public interface OcclusionCullerExtension { - void sable$setSubLevel(@Nullable ClientSubLevel subLevel); -} diff --git a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/RenderSectionManagerExtension.java b/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/RenderSectionManagerExtension.java deleted file mode 100644 index 79c7f4ba..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/RenderSectionManagerExtension.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.ryanhcode.sable.mixinterface.sublevel_render.sodium; - -import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderer; -import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; -import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.OcclusionCuller; -import org.jetbrains.annotations.Nullable; - -public interface RenderSectionManagerExtension { - @Nullable RenderSection sable$getRenderSection(int sectionX, int sectionY, int sectionZ); - - void sable$setRenderSectionDirty(int sectionX, int sectionY, int sectionZ, boolean priority); - - OcclusionCuller sable$getOcclusionCuller(); - - ChunkRenderer sable$getChunkRenderer(); -} diff --git a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/SodiumWorldRendererExtension.java b/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/SodiumWorldRendererExtension.java deleted file mode 100644 index ad497644..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/mixinterface/sublevel_render/sodium/SodiumWorldRendererExtension.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.ryanhcode.sable.mixinterface.sublevel_render.sodium; - -import dev.ryanhcode.sable.sublevel.ClientSubLevel; -import dev.ryanhcode.sable.sublevel.render.sodium.SubLevelRenderSectionManager; -import org.jetbrains.annotations.Nullable; - -public interface SodiumWorldRendererExtension { - - @Nullable SubLevelRenderSectionManager sable$getSubLevelRenderSectionManager(ClientSubLevel subLevel); - - void sable$freeRenderSectionManager(ClientSubLevel subLevel); - -} diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/SubLevelRenderData.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/SubLevelRenderData.java index 76802ae7..82a83e83 100644 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/SubLevelRenderData.java +++ b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/SubLevelRenderData.java @@ -48,6 +48,8 @@ public interface SubLevelRenderData extends Closeable { */ void compileSections(PrioritizeChunkUpdates chunkUpdates, final RenderRegionCache renderRegionCache, Camera camera); + int getVisibleSectionCount(); + default Matrix4f getTransformation(final double camX, final double camY, final double camZ) { return this.getTransformation(camX, camY, camZ, new Matrix4f()); } diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/dispatcher/SodiumSubLevelRenderDispatcher.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/dispatcher/SodiumSubLevelRenderDispatcher.java deleted file mode 100644 index a3333415..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/dispatcher/SodiumSubLevelRenderDispatcher.java +++ /dev/null @@ -1,63 +0,0 @@ -package dev.ryanhcode.sable.sublevel.render.dispatcher; - -import dev.ryanhcode.sable.sublevel.ClientSubLevel; -import dev.ryanhcode.sable.sublevel.render.SubLevelRenderData; -import dev.ryanhcode.sable.sublevel.render.sodium.SodiumSubLevelRenderData; -import foundry.veil.api.client.render.CullFrustum; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.server.packs.resources.ResourceManager; -import org.joml.Matrix4f; - -import java.util.function.Consumer; - -public class SodiumSubLevelRenderDispatcher implements SubLevelRenderDispatcher { - - @Override - public SubLevelRenderData resize(final ClientSubLevel subLevel, final SubLevelRenderData renderData) { - ((SodiumSubLevelRenderData) renderData).resize(); - return renderData; - } - - - @Override - public SubLevelRenderData createRenderData(final ClientSubLevel subLevel) { - return new SodiumSubLevelRenderData(subLevel); - } - - - @Override - public void updateCulling(final Iterable sublevels, final double cameraX, final double cameraY, final double cameraZ, final CullFrustum cullFrustum, final boolean isSpectator) { - - } - - @Override - public void renderSectionLayer(final Iterable sublevels, final RenderType renderType, final ShaderInstance shader, final double cameraX, final double cameraY, final double cameraZ, final Matrix4f modelView, final Matrix4f projection, final float partialTicks) { - - } - - @Override - public void renderAfterSections(final Iterable sublevels, final double cameraX, final double cameraY, final double cameraZ, final Matrix4f modelView, final Matrix4f projection, final float partialTicks) { - - } - - @Override - public void renderBlockEntities(final Iterable sublevels, final BlockEntityRenderer blockEntityRenderer, final double cameraX, final double cameraY, final double cameraZ, final float partialTick) { - - } - - @Override - public void addDebugInfo(final Consumer consumer) { - - } - - @Override - public void onResourceManagerReload(final ResourceManager resourceManager) { - - } - - @Override - public void free() { - - } -} diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/fancy/FancySubLevelRenderData.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/fancy/FancySubLevelRenderData.java index 129948a7..72170362 100644 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/fancy/FancySubLevelRenderData.java +++ b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/fancy/FancySubLevelRenderData.java @@ -183,6 +183,11 @@ public void compileSections(final PrioritizeChunkUpdates chunkUpdates, final Ren this.dirtyRenderSections.clear(); } + @Override + public int getVisibleSectionCount() { + return this.allRenderSections.size(); + } + @Override public ClientSubLevel getSubLevel() { return this.subLevel; diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/sodium/SodiumSubLevelRenderData.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/sodium/SodiumSubLevelRenderData.java deleted file mode 100644 index 1cd677b9..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/sodium/SodiumSubLevelRenderData.java +++ /dev/null @@ -1,187 +0,0 @@ -package dev.ryanhcode.sable.sublevel.render.sodium; - -import dev.ryanhcode.sable.companion.math.BoundingBox3i; -import dev.ryanhcode.sable.companion.math.BoundingBox3ic; -import dev.ryanhcode.sable.mixinterface.sublevel_render.sodium.RenderSectionManagerExtension; -import dev.ryanhcode.sable.mixinterface.sublevel_render.sodium.SodiumWorldRendererExtension; -import dev.ryanhcode.sable.sublevel.ClientSubLevel; -import dev.ryanhcode.sable.sublevel.render.SubLevelRenderData; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import it.unimi.dsi.fastutil.objects.ObjectSet; -import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; -import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection; -import net.minecraft.client.Camera; -import net.minecraft.client.PrioritizeChunkUpdates; -import net.minecraft.client.renderer.chunk.RenderRegionCache; -import net.minecraft.core.SectionPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.lighting.LevelLightEngine; -import org.joml.Vector3d; -import org.joml.Vector3i; - -import java.util.Iterator; - -public class SodiumSubLevelRenderData implements SubLevelRenderData { - - - public final Vector3d origin = new Vector3d(); - /** - * The origin(minimum) of the render section grid - */ - public final Vector3i chunkOrigin = new Vector3i(); - /** - * The sub-level this renderer is for - */ - private final ClientSubLevel subLevel; - /** - * The size of the render section grid - */ - private final Vector3i size = new Vector3i(); - private boolean initialized = false; - - private final ObjectSet newSections = new ObjectOpenHashSet<>(); - private final ObjectSet visibleSections = new ObjectOpenHashSet<>(); - - /** - * Creates a new renderer for the given sub-level - * - * @param subLevel the sub-level to render - */ - public SodiumSubLevelRenderData(final ClientSubLevel subLevel) { - this.subLevel = subLevel; - - this.resize(); - } - - public void resize() { - final SodiumWorldRenderer worldRenderer = SodiumWorldRenderer.instance(); - final SubLevelRenderSectionManager renderSectionManager = ((SodiumWorldRendererExtension) worldRenderer).sable$getSubLevelRenderSectionManager(this.subLevel); - - if (renderSectionManager == null) { - return; - } - - this.initialized = true; - - final BoundingBox3ic bounds = this.subLevel.getPlot().getBoundingBox(); - - if (bounds != null && !bounds.equals(BoundingBox3i.EMPTY) && bounds.volume() > 0.0) { - final Vector3i minChunkPos = new Vector3i(bounds.minX() >> 4, bounds.minY() >> 4, bounds.minZ() >> 4); - final Vector3i maxChunkPos = new Vector3i(bounds.maxX() >> 4, bounds.maxY() >> 4, bounds.maxZ() >> 4); - - final Vector3i oldSize = new Vector3i(this.size); - final Vector3i oldOrigin = new Vector3i(this.chunkOrigin); - - this.size.set(maxChunkPos.x() - minChunkPos.x() + 1, maxChunkPos.y() - minChunkPos.y() + 1, maxChunkPos.z() - minChunkPos.z() + 1); - this.chunkOrigin.set(minChunkPos); - this.origin.set(minChunkPos.x() << 4, minChunkPos.y() << 4, minChunkPos.z() << 4); - - - final RenderSectionManagerExtension renderSectionManagerExtension = (RenderSectionManagerExtension) renderSectionManager; - - for (int x = minChunkPos.x(); x <= maxChunkPos.x(); x++) { - for (int y = minChunkPos.y(); y <= maxChunkPos.y(); y++) { - for (int z = minChunkPos.z(); z <= maxChunkPos.z(); z++) { - if (!this.visibleSections.contains(SectionPos.of(x, y, z))) { - this.newSections.add(SectionPos.of(x, y, z)); - } - } - } - } - -// ObjectIterator iter = this.visibleSections.iterator(); -// while (iter.hasNext()) { -// SectionPos pos = iter.next(); -// if (pos.x() < minChunkPos.x() || pos.x() > maxChunkPos.x() || pos.y() < minChunkPos.y() || pos.y() > maxChunkPos.y() || pos.z() < minChunkPos.z() || pos.z() > maxChunkPos.z()) { -// iter.remove(); -// } -// } - } - } - - @Override - public void rebuild() { - // TODO - } - - @Override - public boolean isSectionCompiled(final int x, final int y, final int z) { - // TODO - return false; - } - - @Override - public void setDirty(final int x, final int y, final int z, final boolean playerChanged) { - // TODO - } - - @Override - public void compileSections(final PrioritizeChunkUpdates chunkUpdates, final RenderRegionCache renderRegionCache, final Camera camera) { - // TODO - } - - @Override - public ClientSubLevel getSubLevel() { - return this.subLevel; - } - - public void renderAdditional() { - if (!this.initialized) { - this.resize(); - } - } - - public void updateChunks(final boolean updateChunksImmediately) { - if (this.newSections.isEmpty()) { - return; - } - - - final Level level = this.subLevel.getLevel(); - final LevelLightEngine lightEngine = level.getLightEngine(); - final Iterator iterator = this.newSections.iterator(); - int count = 0; - - final SubLevelRenderSectionManager renderSectionManager = ((SodiumWorldRendererExtension) SodiumWorldRenderer.instance()).sable$getSubLevelRenderSectionManager(this.subLevel); - - final RenderSectionManagerExtension renderSectionManagerExtension = (RenderSectionManagerExtension) renderSectionManager; - - - while (iterator.hasNext() && count < 1000) { - final SectionPos newSection = iterator.next(); - if (lightEngine.lightOnInSection(newSection) && this.add(renderSectionManagerExtension, newSection, updateChunksImmediately)) { -// iterator.remove(); - } - count++; - } - - } - - private boolean add(final RenderSectionManagerExtension manager, final SectionPos section, final boolean updateChunksImmediately) { - RenderSection renderChunk = manager.sable$getRenderSection(section.x(), section.y(), section.z()); - - if (renderChunk == null) { - manager.sable$setRenderSectionDirty(section.x(), section.y(), section.z(), false); - return false; - } - - - if (renderChunk.getOriginX() != section.origin().getX() || renderChunk.getOriginY() != section.origin().getY() || renderChunk.getOriginZ() != section.origin().getZ()) { - manager.sable$setRenderSectionDirty(section.x(), section.y(), section.z(), false); - renderChunk = manager.sable$getRenderSection(section.x(), section.y(), section.z()); - - if (renderChunk == null || (renderChunk.getOriginX() != section.origin().getX() || renderChunk.getOriginY() != section.origin().getY() || renderChunk.getOriginZ() != section.origin().getZ())) { - return false; - } - } - - manager.sable$setRenderSectionDirty(section.x(), section.y(), section.z(), true); - return true; - - } - - @Override - public void close() { - ((SodiumWorldRendererExtension) SodiumWorldRenderer.instance()).sable$freeRenderSectionManager(this.subLevel); - } -} diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/sodium/SubLevelRenderSectionManager.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/sodium/SubLevelRenderSectionManager.java deleted file mode 100644 index 75905340..00000000 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/sodium/SubLevelRenderSectionManager.java +++ /dev/null @@ -1,93 +0,0 @@ -package dev.ryanhcode.sable.sublevel.render.sodium; - - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import dev.ryanhcode.sable.companion.math.Pose3dc; -import dev.ryanhcode.sable.mixinterface.sublevel_render.sodium.DefaultChunkRendererExtension; -import dev.ryanhcode.sable.mixinterface.sublevel_render.sodium.OcclusionCullerExtension; -import dev.ryanhcode.sable.mixinterface.sublevel_render.sodium.RenderSectionManagerExtension; -import dev.ryanhcode.sable.sublevel.ClientSubLevel; -import dev.ryanhcode.sable.sublevel.render.SubLevelRenderData; -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.RenderSectionManager; -import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; -import net.caffeinemc.mods.sodium.client.render.viewport.CameraTransform; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.RenderType; -import org.joml.*; - -public class SubLevelRenderSectionManager extends RenderSectionManager { - - private final Vector3d chunkOffset = new Vector3d(); - private final Matrix4f projection = new Matrix4f(); - private final Matrix4f modelView = new Matrix4f(); - private final ClientSubLevel subLevel; - private CameraTransform cameraTransform; - - public SubLevelRenderSectionManager(final ClientSubLevel subLevel, final ClientLevel level, final int renderDistance, final CommandList commandList) { - super(level, renderDistance, commandList); - - this.subLevel = subLevel; - - final OcclusionCullerExtension culler = (OcclusionCullerExtension) ((RenderSectionManagerExtension) this).sable$getOcclusionCuller(); - culler.sable$setSubLevel(subLevel); - } - - public void apply(final ChunkRenderMatrices matrices, final double camX, final double camY, final double camZ) { - final SubLevelRenderData renderer = this.subLevel.getRenderData(); - - this.modelView.set(matrices.modelView()); - this.projection.set(RenderSystem.getProjectionMatrix()); - renderer.getChunkOffset(this.chunkOffset); - - final Vector3f pos = new Vector3f((float) camX, (float) camY, (float) camZ); - renderer.getTransformation(0, 0, 0).invert().transformPosition(pos); - this.cameraTransform = new CameraTransform(pos.x - this.chunkOffset.x, pos.y - this.chunkOffset.y, pos.z - this.chunkOffset.z); - - } - - - public void render(final ChunkRenderMatrices originalMatrices, final RenderType layer, final double camX, final double camY, final double camZ) { - final DefaultChunkRendererExtension chunkRenderer = (DefaultChunkRendererExtension) ((RenderSectionManagerExtension) this).sable$getChunkRenderer(); - chunkRenderer.sable$setCameraTransform(this.cameraTransform); - - final PoseStack matrixStack = new PoseStack(); - matrixStack.mulPose(new Matrix4f(originalMatrices.modelView())); - matrixStack.pushPose(); - - final Pose3dc pose = this.subLevel.renderPose(); - - final Vector3dc spos = pose.position(); - final Vector3dc scale = pose.scale(); - final Quaterniondc orientation = pose.orientation(); - - matrixStack.translate(spos.x() - camX, spos.y() - camY, spos.z() - camZ); - matrixStack.mulPose(new Quaternionf(orientation)); - matrixStack.scale((float) scale.x(), (float) scale.y(), (float) scale.z()); - - this.modelView.set(matrixStack.last().pose()); - matrixStack.popPose(); - final ChunkRenderMatrices matrices = new ChunkRenderMatrices(RenderSystem.getProjectionMatrix(), this.modelView); - - - if (layer == RenderType.solid()) { - this.renderLayer(matrices, DefaultTerrainRenderPasses.SOLID, -this.chunkOffset.x, -this.chunkOffset.y, -this.chunkOffset.z); - this.renderLayer(matrices, DefaultTerrainRenderPasses.CUTOUT, -this.chunkOffset.x, -this.chunkOffset.y, -this.chunkOffset.z); - } else if (layer == RenderType.translucent()) { - this.renderLayer(matrices, DefaultTerrainRenderPasses.TRANSLUCENT, -this.chunkOffset.x, -this.chunkOffset.y, -this.chunkOffset.z); - } - - chunkRenderer.sable$setCameraTransform(null); - } - - - /** - * @return if occlusion culling should be disabled for this section manager - */ - public boolean shouldDisableOcclusionCulling() { - return true; - } - -} diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaChunkedSubLevelRenderData.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaChunkedSubLevelRenderData.java index 544a3513..682fe168 100644 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaChunkedSubLevelRenderData.java +++ b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaChunkedSubLevelRenderData.java @@ -236,6 +236,11 @@ public void compileSections(final PrioritizeChunkUpdates chunkUpdates, final Ren this.dirtyRenderSections.clear(); } + @Override + public int getVisibleSectionCount() { + return this.allRenderSections.size(); + } + @Override public ClientSubLevel getSubLevel() { return this.subLevel; diff --git a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaSingleSubLevelRenderData.java b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaSingleSubLevelRenderData.java index 0695d6a1..18f17c19 100644 --- a/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaSingleSubLevelRenderData.java +++ b/common/src/main/java/dev/ryanhcode/sable/sublevel/render/vanilla/VanillaSingleSubLevelRenderData.java @@ -178,6 +178,11 @@ public void rebuild() { public void compileSections(final PrioritizeChunkUpdates chunkUpdates, final RenderRegionCache renderRegionCache, final Camera camera) { } + @Override + public int getVisibleSectionCount() { + return 1; + } + @Override public ClientSubLevel getSubLevel() { return this.subLevel; diff --git a/fabric/build.gradle b/fabric/build.gradle index e76e2804..9a743453 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -21,8 +21,8 @@ dependencies { include(modApi("dev.ryanhcode.sable-companion:sable-companion-fabric-$minecraft_version:$sable_companion_version")) - modCompileOnly "maven.modrinth:sodium:$rootProject.sodium_version" - modCompileOnly "maven.modrinth:distanthorizons:$rootProject.distant_horizons_version" + modCompileOnly "net.caffeinemc:sodium-fabric:${rootProject.sodium_version}" + modCompileOnly "maven.modrinth:distanthorizons:${rootProject.distant_horizons_version}" modCompileOnly "maven.modrinth:sodium-extras:fabric-${minecraft_version}-$sodiumextras_version" include(modApi("foundry.veil:veil-fabric-${project.minecraft_version}:${project.veil_version}")) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 2b988b4e..64bbf9cb 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -46,6 +46,7 @@ } }, "breaks": { + "sodium": "<${sodium_version}", "scalablelux": "*", "sablecompanion": "<${sable_companion_version}" } diff --git a/gradle.properties b/gradle.properties index b1f9037b..3a735280 100644 --- a/gradle.properties +++ b/gradle.properties @@ -32,7 +32,7 @@ neoforge_loader_version_range=[4,) # Dependencies sable_companion_version=1.6.0 forgeconfigapiport_version=21.1.3 -veil_version=4.0.1 +veil_version=4.1.1 imguimc_version=1.1.0 ## Create @@ -51,7 +51,7 @@ moonlight_version=1.21-2.29.19 vista_version=7705557 backpacks_for_dummies_version=6dBgyYdr pmweather_version=0.13.10-alpha -sodium_version=mc1.21.1-0.6.13-neoforge +sodium_version=0.8.12-alpha.2+mc1.21.1 iris_version=1.8.12+1.21.1-neoforge distant_horizons_version=2.2.1-a-1.21.1 nml_version=1.4.3 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index f87dfbbb..dedc829a 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -86,7 +86,7 @@ dependencies { compileOnly("maven.modrinth:jade:${project.jade_version}+neoforge") { transitive = false } compileOnly("maven.modrinth:jade-addons-forge:${project.jade_addons_version}+neoforge") { transitive = false } - compileOnly "maven.modrinth:sodium:$sodium_version" + compileOnly "net.caffeinemc:sodium-neoforge-mod:${sodium_version}" compileOnly("maven.modrinth:iris:$iris_version") { transitive = false } compileOnly("maven.modrinth:sodium-extras:neoforge-${minecraft_version}-$sodiumextras_version") { transitive = false } diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index c44ee1a6..44364fc6 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -58,6 +58,12 @@ type = "incompatible" versionRange = "(${sable_companion_version},)" reason = "Sable is out of date" +[[dependencies.sable]] +modId = "sodium" +type = "incompatible" +versionRange = "(,${sodium_version})" +reason = "${mod_name} supports Sodium ${sodium_version} and above" + [[dependencies.sable]] modId = "scalablelux" type = "incompatible"