diff --git a/common/src/main/java/com/seibel/distanthorizons/common/util/LightTextureMarker.java b/common/src/main/java/com/seibel/distanthorizons/common/util/LightTextureMarker.java new file mode 100644 index 000000000..fd1e3474c --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/util/LightTextureMarker.java @@ -0,0 +1,6 @@ +package com.seibel.distanthorizons.common.util; + +public interface LightTextureMarker +{ + void markLightTexture(); +} diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java index 92b91265c..542c27750 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java @@ -6,29 +6,33 @@ import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapp import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; -import net.minecraft.client.renderer.LightTexture; +import com.seibel.distanthorizons.common.util.LightTextureMarker; import net.minecraft.client.renderer.texture.DynamicTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(DynamicTexture.class) -public class MixinLightmap +public class MixinLightmap implements LightTextureMarker { + @Unique + private boolean isLightTexture = false; + @Shadow @Final private NativeImage pixels; - @Inject(method = "Lnet/minecraft/client/renderer/texture/DynamicTexture;upload()V", at = @At("HEAD"), cancellable = true) + @Inject(method = "upload()V", at = @At("HEAD")) public void updateLightTexture(CallbackInfo ci) { // since the light map is always updated on the client render thread we should be able to access the client level at the same time IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); if ( + !isLightTexture || mc == null || mc.getWrappedClientLevel() == null ) @@ -39,4 +43,9 @@ public class MixinLightmap MinecraftRenderWrapper.INSTANCE.updateLightmap(this.pixels, clientLevel); } + public void markLightTexture() + { + isLightTexture = true; + } + } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap2.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap2.java new file mode 100644 index 000000000..2036aeeeb --- /dev/null +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap2.java @@ -0,0 +1,27 @@ +package com.seibel.distanthorizons.fabric.mixins.client; + + +import com.seibel.distanthorizons.common.util.LightTextureMarker; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.DynamicTexture; +import org.spongepowered.asm.mixin.Final; +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; + +@Mixin(LightTexture.class) +public class MixinLightmap2 +{ + @Shadow + @Final + private DynamicTexture lightTexture; + + @Inject(method = "", at = @At("RETURN")) + public void markLightTexture(CallbackInfo ci) + { + ((LightTextureMarker) lightTexture).markLightTexture(); + } + +} diff --git a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json index c95eb9786..121fecb15 100644 --- a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json +++ b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json @@ -16,6 +16,7 @@ "client.MixinGameRenderer", "client.MixinLevelRenderer", "client.MixinLightmap", + "client.MixinLightmap2", "client.MixinOptionsScreen", "client.MixinMinecraft", "client.MixinTextureUtil" diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java index 108390f79..7ae524a4a 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java @@ -6,30 +6,34 @@ import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapp import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; -import net.minecraft.client.renderer.LightTexture; +import com.seibel.distanthorizons.common.util.LightTextureMarker; import net.minecraft.client.renderer.texture.DynamicTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(DynamicTexture.class) -public class MixinLightmap +public class MixinLightmap implements LightTextureMarker { + @Unique + private boolean isLightTexture = false; + @Shadow @Final private NativeImage pixels; - @Inject(method = "Lnet/minecraft/client/renderer/texture/DynamicTexture;upload()V", at = @At("HEAD"), cancellable = true) + @Inject(method = "upload()V", at = @At("HEAD")) public void updateLightTexture(CallbackInfo ci) { // since the light map is always updated on the client render thread we should be able to access the client level at the same time IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); if ( - mc == null || + !isLightTexture || + mc == null || mc.getWrappedClientLevel() == null ) return; @@ -39,4 +43,9 @@ public class MixinLightmap MinecraftRenderWrapper.INSTANCE.updateLightmap(this.pixels, clientLevel); } + public void markLightTexture() + { + isLightTexture = true; + } + } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap2.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap2.java new file mode 100644 index 000000000..1a4945860 --- /dev/null +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap2.java @@ -0,0 +1,27 @@ +package com.seibel.distanthorizons.forge.mixins.client; + + +import com.seibel.distanthorizons.common.util.LightTextureMarker; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.texture.DynamicTexture; +import org.spongepowered.asm.mixin.Final; +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; + +@Mixin(LightTexture.class) +public class MixinLightmap2 +{ + @Shadow + @Final + private DynamicTexture lightTexture; + + @Inject(method = "", at = @At("RETURN")) + public void markLightTexture(CallbackInfo ci) + { + ((LightTextureMarker) lightTexture).markLightTexture(); + } + +} diff --git a/forge/src/main/resources/DistantHorizons.mixins.json b/forge/src/main/resources/DistantHorizons.mixins.json index 4d03828c3..458a871af 100644 --- a/forge/src/main/resources/DistantHorizons.mixins.json +++ b/forge/src/main/resources/DistantHorizons.mixins.json @@ -15,6 +15,7 @@ "client.MixinGameRenderer", "client.MixinLevelRenderer", "client.MixinLightmap", + "client.MixinLightmap2", "client.MixinOptionsScreen", "client.MixinTextureUtil" ],