diff --git a/src/main/java/com/gtnewhorizons/angelica/dynamiclights/DynamicLights.java b/src/main/java/com/gtnewhorizons/angelica/dynamiclights/DynamicLights.java index 2d72f319a..8199cf24c 100644 --- a/src/main/java/com/gtnewhorizons/angelica/dynamiclights/DynamicLights.java +++ b/src/main/java/com/gtnewhorizons/angelica/dynamiclights/DynamicLights.java @@ -30,6 +30,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; import org.embeddedt.embeddium.impl.render.viewport.Viewport; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -368,6 +369,15 @@ public class DynamicLights { return this.getLightmapWithDynamicLight(this.getDynamicLightLevel(x, y, z), lightmap); } + public static int addDynamicLight(IBlockAccess world, int x, int y, int z, int lightmap) { + if (!isEnabled()) return lightmap; + final DynamicLights dl = get(); + if (!dl.hasLightSources()) return lightmap; + final double dynamicLightLevel = dl.getDynamicLightLevel(x, y, z); + if (dynamicLightLevel > 0 && !world.getBlock(x, y, z).isOpaqueCube()) return dl.getLightmapWithDynamicLight(dynamicLightLevel, lightmap); + return lightmap; + } + public List getSourcesForChunk(int chunkMinX, int chunkMinY, int chunkMinZ) { // Chunk center final double centerX = chunkMinX + 8.0; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TileEntityLight.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TileEntityLight.java new file mode 100644 index 000000000..46f76ee10 --- /dev/null +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TileEntityLight.java @@ -0,0 +1,20 @@ +package com.gtnewhorizons.angelica.rendering.tesr; + +import com.gtnewhorizons.angelica.dynamiclights.DynamicLights; +import net.minecraft.block.Block; +import net.minecraft.world.EnumSkyBlock; +import net.minecraft.world.World; + +/** Try to replicate modern behavior for when shaderpacks are in use.*/ +public final class TileEntityLight { + + private TileEntityLight() {} + + public static int packedLight(World world, int x, int y, int z, int vanillaLight) { + final Block block = world.getBlock(x, y, z); + if (!block.getUseNeighborBrightness() || block.getLightOpacity() != 0) return vanillaLight; + final int sky = world.provider.hasNoSky ? 0 : world.getSavedLightValue(EnumSkyBlock.Sky, x, y, z); + final int blockLight = Math.max(world.getSavedLightValue(EnumSkyBlock.Block, x, y, z), block.getLightValue(world, x, y, z)); + return DynamicLights.addDynamicLight(world, x, y, z, sky << 20 | blockLight << 4); + } +} diff --git a/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java b/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java index f1db7913e..abd7d0433 100644 --- a/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java @@ -11,6 +11,7 @@ import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.profiling.RenderClassTimings; import com.gtnewhorizons.angelica.rendering.tesr.ModelPartBatcher; import com.gtnewhorizons.angelica.rendering.tesr.TesrBatchRenderer; +import com.gtnewhorizons.angelica.rendering.tesr.TileEntityLight; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.rendering.PlayerReflectionCapture; import com.gtnewhorizons.angelica.rendering.RenderingState; @@ -53,6 +54,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.profiler.Profiler; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; import org.embeddedt.embeddium.impl.render.viewport.Viewport; import org.embeddedt.embeddium.impl.render.viewport.ViewportProvider; import org.joml.Matrix4f; @@ -769,7 +771,8 @@ public class ShadowRenderer { } } } - int brightness = tile.getWorldObj().getLightBrightnessForSkyBlocks(tile.xCoord, tile.yCoord, tile.zCoord, 0); + final World world = tile.getWorldObj(); + int brightness = TileEntityLight.packedLight(world, tile.xCoord, tile.yCoord, tile.zCoord, world.getLightBrightnessForSkyBlocks(tile.xCoord, tile.yCoord, tile.zCoord, 0)); GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, (float) brightness % 65536, (float) brightness / 65536); GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); TileEntityRendererDispatcher.instance.renderTileEntityAt(tile, diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/dynamiclights/MixinWorld.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/dynamiclights/MixinWorld.java index 637c4024c..d90bbdc4d 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/dynamiclights/MixinWorld.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/dynamiclights/MixinWorld.java @@ -3,11 +3,9 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.dynamiclights; import com.gtnewhorizons.angelica.dynamiclights.DynamicLights; import com.gtnewhorizons.angelica.dynamiclights.IDynamicLightSource; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.world.World; 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; @@ -15,9 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(World.class) public abstract class MixinWorld { - @Shadow - public abstract Block getBlock(int p_147439_1_, int p_147439_2_, int p_147439_3_); - @Inject(method = "onEntityRemoved", at = @At("HEAD")) private void angelica$removeEntity(Entity entity, CallbackInfo ci) { if (entity.worldObj.isRemote && entity instanceof IDynamicLightSource lightSource) { @@ -27,12 +22,7 @@ public abstract class MixinWorld { @ModifyReturnValue(method = "getLightBrightnessForSkyBlocks", at = @At(value = "RETURN")) private int angelica$dynamiclights_getLightBrightnessForSkyBlocks(int lightmap, int x, int y, int z, int p_72802_4_){ - if (!DynamicLights.isEnabled()) return lightmap; - final DynamicLights dl = DynamicLights.get(); - if (!dl.hasLightSources()) return lightmap; - final double dynamicLightLevel = dl.getDynamicLightLevel(x, y, z); - if (dynamicLightLevel > 0 && !getBlock(x, y, z).isOpaqueCube()) return dl.getLightmapWithDynamicLight(dynamicLightLevel, lightmap); - return lightmap; + return DynamicLights.addDynamicLight((World) (Object) this, x, y, z, lightmap); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java index 2a96e9082..bbc2d4afe 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java @@ -7,15 +7,25 @@ import com.gtnewhorizons.angelica.rendering.tesr.PassRebindGate; import com.gtnewhorizons.angelica.rendering.tesr.TesrAttribution; import com.gtnewhorizons.angelica.rendering.RenderRecovery; import com.gtnewhorizons.angelica.rendering.tesr.TesrProviderDispatch; +import com.gtnewhorizons.angelica.rendering.tesr.TileEntityLight; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; import com.prupe.mcpatcher.ctm.CTMUtils; import net.coderbot.iris.uniforms.CapturedRenderingState; +import net.irisshaders.iris.api.v0.IrisApi; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; @Mixin(TileEntityRendererDispatcher.class) public class MixinTileEntityRendererDispatcher { + @Shadow + public World field_147550_f; + @Surround(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDF)V") private void iris$beginBlockEntity(TileEntity te, double x, double y, double z, float partialTicks) { RenderRecovery.throwIfCrashTestArmed(); @@ -35,4 +45,10 @@ public class MixinTileEntityRendererDispatcher { TesrAttribution.currentRenderable = prevRenderable; GLStateManager.popStateTo(blendDepth); } + + @ModifyExpressionValue(method = "renderTileEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getLightBrightnessForSkyBlocks(IIII)I")) + private int iris$tileEntityLight(int vanillaLight, @Local(argsOnly = true) TileEntity te) { + if (!IrisApi.getInstance().isShaderPackInUse()) return vanillaLight; + return TileEntityLight.packedLight(field_147550_f, te.xCoord, te.yCoord, te.zCoord, vanillaLight); + } }