From 30eb02f3b71d55215ee7546b884a4f279c316209 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 2 May 2026 10:02:08 -0500 Subject: [PATCH] lightmap move common level code to common --- .../minecraft/MinecraftRenderWrapper.java | 72 ++++++++++++++----- .../wrappers/world/ClientLevelWrapper.java | 4 ++ coreSubProjects | 2 +- 3 files changed, 61 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index 440b4935f..83ec3ea24 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -20,7 +20,6 @@ package com.seibel.distanthorizons.common.wrappers.minecraft; import java.awt.Color; -import java.lang.invoke.MethodHandles; import java.util.concurrent.ConcurrentHashMap; import com.mojang.blaze3d.pipeline.RenderTarget; @@ -28,12 +27,14 @@ import com.mojang.blaze3d.platform.NativeImage; import com.seibel.distanthorizons.api.enums.config.EDhApiLodShading; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; +import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.coreapi.util.ColorUtil; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; #if MC_VER < MC_1_17_1 @@ -51,7 +52,6 @@ import org.joml.Vector3f; #else #endif -import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -62,14 +62,13 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAc import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.phys.Vec3; import com.seibel.distanthorizons.core.logging.DhLogger; import org.jetbrains.annotations.NotNull; -import org.joml.Vector4f; +import org.jetbrains.annotations.Nullable; #if MC_VER < MC_1_17_1 import net.minecraft.tags.FluidTags; @@ -100,6 +99,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper public static final MinecraftRenderWrapper INSTANCE = new MinecraftRenderWrapper(); private static final IOptifineAccessor OPTIFINE_ACCESSOR = ModAccessorInjector.INSTANCE.get(IOptifineAccessor.class); + private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final DhLogger LOGGER = new DhLoggerBuilder().build(); private static final Minecraft MC = Minecraft.getInstance(); @@ -465,9 +465,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper #endif } - @Override - public ILightMapWrapper getLightmapWrapper(@NotNull ILevelWrapper level) { return this.lightmapByDimensionType.get(level.getDimensionType()); } - @Override public boolean isFogStateSpecial() { @@ -485,45 +482,88 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper #endif } + + + //==========// + // lightmap // + //==========// + //region + + @Override + public ILightMapWrapper getLightmapWrapper(@NotNull ILevelWrapper level) { return this.lightmapByDimensionType.get(level.getDimensionType()); } + /** - * It's better to use {@link MinecraftRenderWrapper#setLightmapId(int, IClientLevelWrapper)} if possible, + * It's better to use {@link MinecraftRenderWrapper#setLightmapId(int)} if possible, * however old MC versions don't support it. */ - public void updateLightmap(NativeImage lightPixels, IClientLevelWrapper level) + public void updateLightmap(NativeImage lightPixels) { + IClientLevelWrapper clientLevel = getLightmapClientLevelWrapper(); + if (clientLevel == null) + { + return; + } + // Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same // object for the same MC level and/or the same hash, // so this will have to do for now - IDimensionTypeWrapper dimensionType = level.getDimensionType(); + IDimensionTypeWrapper dimensionType = clientLevel.getDimensionType(); LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper()); wrapper.uploadLightmap(lightPixels); } - public void setLightmapId(int tetxureId, IClientLevelWrapper level) + public void setLightmapId(int textureId) { + IClientLevelWrapper clientLevel = getLightmapClientLevelWrapper(); + if (clientLevel == null) + { + return; + } + // Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same // object for the same MC level and/or the same hash, // so this will have to do for now - IDimensionTypeWrapper dimensionType = level.getDimensionType(); + IDimensionTypeWrapper dimensionType = clientLevel.getDimensionType(); LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper()); - wrapper.setLightmapId(tetxureId); + wrapper.setLightmapId(textureId); } #if MC_VER <= MC_1_21_10 #else - public void setLightmapGpuTexture(GpuTexture gpuTexture, IClientLevelWrapper level) + public void setLightmapGpuTexture(GpuTexture gpuTexture) { + IClientLevelWrapper clientLevel = GetLightmapClientWrapper(); + if (clientLevel == null) + { + return; + } + // Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same // object for the same MC level and/or the same hash, // so this will have to do for now - IDimensionTypeWrapper dimensionType = level.getDimensionType(); + IDimensionTypeWrapper dimensionType = clientLevel.getDimensionType(); LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper()); wrapper.setLightmapGpuTexture(gpuTexture); } #endif + private static @Nullable IClientLevelWrapper getLightmapClientLevelWrapper() + { + IClientLevelWrapper clientLevel = ClientApi.RENDER_STATE.clientLevelWrapper; + if (clientLevel == null) + { + clientLevel = MC_CLIENT.getWrappedClientLevel(); + } + + return clientLevel; + } + + //endregion + + + @Override public float getShade(EDhDirection lodDirection) { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index c2f8e36ff..fe7b5cb3f 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -64,6 +64,10 @@ public class ClientLevelWrapper implements IClientLevelWrapper private static final Minecraft MINECRAFT = Minecraft.getInstance(); + private static final Timer CLIENT_CLEANUP_TIMER = TimerUtil.CreateTimer("ClientLevelTickCleanup"); + private static final TimerTask CLIENT_CLEANUP_TASK = TimerUtil.createTimerTask(ClientLevelWrapper::tickCleanup); + + private final ClientLevel level; private final ConcurrentHashMap blockColorCacheByBlockState = new ConcurrentHashMap<>(); diff --git a/coreSubProjects b/coreSubProjects index 4e647395e..5cb30ed7c 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 4e647395e84716b309d7b33229995ee85e5cf4e3 +Subproject commit 5cb30ed7ceb649ab4d9b765de79b3e04930955e4