From 4694d3b03ae4e5d7d52164d0e4c4823916298eaa Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Wed, 12 Feb 2025 22:51:27 -0500 Subject: [PATCH 01/11] Fix warning --- .../angelica/mixins/early/angelica/MixinMinecraft.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java index 81adac945..7a7966227 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java @@ -64,7 +64,7 @@ public abstract class MixinMinecraft { angelica$lastFrameTime = time; } - @WrapOperation(method = "runGameLoop", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/Display;sync(I)V")) + @WrapOperation(method = "runGameLoop", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/Display;sync(I)V", remap = false)) private void angelica$noopFPSLimiter(int fps, Operation original) { if (AngelicaConfig.sleepBeforeSwap) return; original.call(fps); From 9c0db0a2a3a40501ecfe72517972aa6cde5bebdc Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Wed, 12 Feb 2025 22:53:52 -0500 Subject: [PATCH 02/11] Improve animated sprite tracking --- .../mixins/interfaces/ITexturesCache.java | 1 + .../angelica/utils/AnimationsRenderUtils.java | 22 ++++++++++++ .../chunk/tasks/ChunkRenderRebuildTask.java | 19 ++++++++-- .../angelica/animation/MixinChunkCache.java | 6 ++++ .../angelica/animation/MixinRenderBlocks.java | 36 +++++++++++-------- .../animation/MixinTextureAtlasSprite.java | 15 ++++++++ .../animation/MixinWorldRenderer.java | 5 +++ 7 files changed, 87 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gtnewhorizons/angelica/mixins/interfaces/ITexturesCache.java b/src/main/java/com/gtnewhorizons/angelica/mixins/interfaces/ITexturesCache.java index 789d598a1..900cc35ae 100644 --- a/src/main/java/com/gtnewhorizons/angelica/mixins/interfaces/ITexturesCache.java +++ b/src/main/java/com/gtnewhorizons/angelica/mixins/interfaces/ITexturesCache.java @@ -8,4 +8,5 @@ public interface ITexturesCache { Set getRenderedTextures(); void enableTextureTracking(); + void track(IPatchedTextureAtlasSprite sprite); } diff --git a/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java b/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java index cb446f19a..448769a99 100644 --- a/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java +++ b/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java @@ -1,5 +1,7 @@ package com.gtnewhorizons.angelica.utils; +import java.util.Stack; + import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite; import com.gtnewhorizons.angelica.mixins.interfaces.ITexturesCache; import net.minecraft.client.Minecraft; @@ -28,4 +30,24 @@ public static void markBlockTextureForUpdate(IIcon icon, IBlockAccess blockAcces } } } + + private final static ThreadLocal> TEXTURE_CACHE_STACK = ThreadLocal.withInitial(Stack::new); + + public static void onSpriteUsed(IPatchedTextureAtlasSprite sprite) { + Stack stack = TEXTURE_CACHE_STACK.get(); + + if (stack == null || stack.isEmpty()) { + return; + } + + stack.peek().track(sprite); + } + + public static void pushCache(ITexturesCache cache) { + TEXTURE_CACHE_STACK.get().push(cache); + } + + public static void popCache() { + TEXTURE_CACHE_STACK.get().pop(); + } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java index 0cc07a25a..dccc252c2 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java @@ -8,6 +8,7 @@ import com.gtnewhorizons.angelica.mixins.interfaces.ITexturesCache; import com.gtnewhorizons.angelica.rendering.AngelicaBlockSafetyRegistry; import com.gtnewhorizons.angelica.rendering.AngelicaRenderQueue; +import com.gtnewhorizons.angelica.utils.AnimationsRenderUtils; import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue; import me.jellysquid.mods.sodium.client.SodiumClientMod; import me.jellysquid.mods.sodium.client.render.chunk.ChunkGraphicsState; @@ -132,7 +133,10 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB final WorldSlice slice = cache.getWorldSlice(); final RenderBlocks renderBlocks = new RenderBlocks(slice); - if(renderBlocks instanceof ITexturesCache) ((ITexturesCache)renderBlocks).enableTextureTracking(); + if(renderBlocks instanceof ITexturesCache textureCache) { + textureCache.enableTextureTracking(); + AnimationsRenderUtils.pushCache(textureCache); + } final int baseX = this.render.getOriginX(); final int baseY = this.render.getOriginY(); @@ -217,6 +221,10 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB } } + if(renderBlocks instanceof ITexturesCache) { + AnimationsRenderUtils.popCache(); + } + handleRenderBlocksTextures(renderBlocks, renderData); if(hasMainThreadBlocks) { @@ -263,7 +271,10 @@ private void performMainBuild(ChunkRenderCacheLocal cache, ChunkBuildBuffers buf final int baseZ = this.render.getOriginZ(); final BlockPos renderOffset = this.offset; final RenderBlocks rb = new RenderBlocks(slice.getWorld()); - if(rb instanceof ITexturesCache) ((ITexturesCache)rb).enableTextureTracking(); + if(rb instanceof ITexturesCache textureCache) { + textureCache.enableTextureTracking(); + AnimationsRenderUtils.pushCache(textureCache); + } while(!mainThreadBlocks.isEmpty()) { final long longPos = mainThreadBlocks.dequeueLong(); if (cancellationSource.isCancelled()) { @@ -303,6 +314,10 @@ private void performMainBuild(ChunkRenderCacheLocal cache, ChunkBuildBuffers buf if(AngelicaConfig.enableIris) buffers.iris$resetBlockContext(); } + if(rb instanceof ITexturesCache) { + AnimationsRenderUtils.popCache(); + } + handleRenderBlocksTextures(rb, renderData); } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinChunkCache.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinChunkCache.java index 9045df3a7..72ff142b2 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinChunkCache.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinChunkCache.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.animation; +import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite; import com.gtnewhorizons.angelica.mixins.interfaces.ITexturesCache; import net.minecraft.util.IIcon; import net.minecraft.world.ChunkCache; @@ -23,4 +24,9 @@ public HashSet getRenderedTextures() { public void enableTextureTracking() { } + + @Override + public void track(IPatchedTextureAtlasSprite sprite) { + + } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java index 4babfd4c6..c59b26010 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.animation; +import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite; import com.gtnewhorizons.angelica.mixins.interfaces.ITexturesCache; import com.gtnewhorizons.angelica.utils.AnimationsRenderUtils; import com.llamalad7.mixinextras.injector.ModifyReturnValue; @@ -38,7 +39,14 @@ public class MixinRenderBlocks implements ITexturesCache { * apply Occlusion Querry (Basically that means that we will only mark those textures for update that are * visible (on the viewport) at the moment) */ - @Inject(method = "*(Lnet/minecraft/block/Block;DDDLnet/minecraft/util/IIcon;)V", at = @At("HEAD")) + @Inject(method = { + "renderFaceYNeg", + "renderFaceYPos", + "renderFaceZNeg", + "renderFaceZPos", + "renderFaceXNeg", + "renderFaceXPos" + }, at = @At("HEAD")) public void angelica$beforeRenderFace(Block p_147761_1_, double p_147761_2_, double p_147761_4_, double p_147761_6_, IIcon icon, CallbackInfo ci) { if (overrideBlockTexture != null) { @@ -47,27 +55,18 @@ public class MixinRenderBlocks implements ITexturesCache { AnimationsRenderUtils.markBlockTextureForUpdate(icon, blockAccess); - if(this.enableSpriteTracking) - this.renderedSprites.add(icon); - } - - @Inject(method = "renderBlockFire", at = @At("HEAD")) - public void angelica$markFireBlockAnimationForUpdate(BlockFire instance, int x, int y, int z, - CallbackInfoReturnable cir) { if(this.enableSpriteTracking) { - this.renderedSprites.add(instance.getFireIcon(0)); - this.renderedSprites.add(instance.getFireIcon(1)); + this.renderedSprites.add(icon); } - AnimationsRenderUtils.markBlockTextureForUpdate(instance.getFireIcon(0), blockAccess); - AnimationsRenderUtils.markBlockTextureForUpdate(instance.getFireIcon(1), blockAccess); } - @ModifyReturnValue(method = "getBlockIconFromSideAndMetadata", at = @At("RETURN")) - public IIcon angelica$markBlockSideAnimationForUpdate(IIcon icon, Block p_147787_1_, int p_147787_2_, int p_147787_3_) { + @ModifyReturnValue(method = "getIconSafe", at = @At("RETURN")) + public IIcon angelica$markBlockSideAnimationForUpdate(IIcon icon) { AnimationsRenderUtils.markBlockTextureForUpdate(icon, blockAccess); - if(this.enableSpriteTracking) + if(this.enableSpriteTracking) { this.renderedSprites.add(icon); + } return icon; } @@ -81,4 +80,11 @@ public Set getRenderedTextures() { public void enableTextureTracking() { enableSpriteTracking = true; } + + @Override + public void track(IPatchedTextureAtlasSprite sprite) { + if(this.enableSpriteTracking) { + renderedSprites.add((IIcon) sprite); + } + } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureAtlasSprite.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureAtlasSprite.java index eed3a916c..f0b7a1387 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureAtlasSprite.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureAtlasSprite.java @@ -1,11 +1,17 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.animation; import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite; +import com.gtnewhorizons.angelica.mixins.interfaces.ISpriteExt; +import com.gtnewhorizons.angelica.utils.AnimationsRenderUtils; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; + +import net.minecraft.block.BlockPortal; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.data.AnimationMetadataSection; 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 java.util.List; @@ -54,4 +60,13 @@ public void updateAnimationsDryRun() { this.tickCounter = 0; } } + + @ModifyReturnValue(method = "getMinU", at = @At("RETURN")) + private float angelica$onUVAccessed(float value) { + if (((ISpriteExt)this).isAnimation()) { + AnimationsRenderUtils.onSpriteUsed(this); + needsAnimationUpdate = true; + } + return value; + } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinWorldRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinWorldRenderer.java index e5fe613a4..bbf65bb9a 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinWorldRenderer.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinWorldRenderer.java @@ -49,4 +49,9 @@ public Set getRenderedTextures() { public void enableTextureTracking() { } + + @Override + public void track(IPatchedTextureAtlasSprite sprite) { + + } } From 7dfef58dc375a0f8295b80288855996ff1625d31 Mon Sep 17 00:00:00 2001 From: Fabian Maurer Date: Mon, 3 Feb 2025 16:13:53 +0100 Subject: [PATCH 03/11] Add functionality to fake blockId for shaders --- dependencies.gradle | 2 +- .../buffers/ChunkModelVertexTransformer.java | 4 +- .../render/chunk/format/ModelVertexSink.java | 3 +- .../hfp/HFPModelVertexBufferWriterNio.java | 2 +- .../hfp/HFPModelVertexBufferWriterUnsafe.java | 2 +- .../sfp/SFPModelVertexBufferWriterNio.java | 2 +- .../sfp/SFPModelVertexBufferWriterUnsafe.java | 2 +- .../client/render/pipeline/BlockRenderer.java | 3 +- .../client/render/pipeline/FluidRenderer.java | 2 +- src/main/java/net/coderbot/iris/Iris.java | 39 +++++++++++++++++++ .../XHFPModelVertexBufferWriterNio.java | 4 +- .../XHFPModelVertexBufferWriterUnsafe.java | 4 +- 12 files changed, 55 insertions(+), 14 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 863287a0d..e10bd50ec 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -61,7 +61,7 @@ dependencies { // Iris Shaders compileOnly('org.jetbrains:annotations:26.0.2') - api("com.github.GTNewHorizons:GTNHLib:0.6.8:dev") + api("com.github.GTNewHorizons:GTNHLib:9.9.9:dev") shadowImplementation("org.anarres:jcpp:1.4.14") // Apache 2.0 shadowImplementation("org.taumc:glsl-transformation-lib:0.2.0-4.g6b42bca") { exclude module: "antlr4" // we only want to shadow the runtime module diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelVertexTransformer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelVertexTransformer.java index 73fa02ed4..8e7948774 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelVertexTransformer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/buffers/ChunkModelVertexTransformer.java @@ -17,7 +17,7 @@ public ChunkModelVertexTransformer(ModelVertexSink delegate, ChunkModelOffset of } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { - this.delegate.writeQuad(x + this.offset.x, y + this.offset.y, z + this.offset.z, color, u, v, light); + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { + this.delegate.writeQuad(x + this.offset.x, y + this.offset.y, z + this.offset.z, color, u, v, light, shaderBlockId); } } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java index 91d56ec8a..e75b87152 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/ModelVertexSink.java @@ -12,6 +12,7 @@ public interface ModelVertexSink extends VertexSink { * @param u The u-texture of the vertex * @param v The y-texture of the vertex * @param light The packed light-map coordinates of the vertex + * @param shaderBlockId The blockId to be passed to the shader */ - void writeQuad(float x, float y, float z, int color, float u, float v, int light); + void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterNio.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterNio.java index de9df0993..1f03b48f2 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterNio.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterNio.java @@ -14,7 +14,7 @@ public HFPModelVertexBufferWriterNio(VertexBufferView backingBuffer) { } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { this.writeQuadInternal( ModelVertexUtil.denormalizeVertexPositionFloatAsShort(x), ModelVertexUtil.denormalizeVertexPositionFloatAsShort(y), diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterUnsafe.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterUnsafe.java index 14565d9c9..58da787d7 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterUnsafe.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/hfp/HFPModelVertexBufferWriterUnsafe.java @@ -14,7 +14,7 @@ public HFPModelVertexBufferWriterUnsafe(VertexBufferView backingBuffer) { } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { this.writeQuadInternal( ModelVertexUtil.denormalizeVertexPositionFloatAsShort(x), ModelVertexUtil.denormalizeVertexPositionFloatAsShort(y), diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterNio.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterNio.java index 9e32a9188..235d0fdfb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterNio.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterNio.java @@ -13,7 +13,7 @@ public SFPModelVertexBufferWriterNio(VertexBufferView backingBuffer) { } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { int i = this.writeOffset; ByteBuffer buffer = this.byteBuffer; diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterUnsafe.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterUnsafe.java index ff4abb4de..0443eafe9 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterUnsafe.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/format/sfp/SFPModelVertexBufferWriterUnsafe.java @@ -13,7 +13,7 @@ public SFPModelVertexBufferWriterUnsafe(VertexBufferView backingBuffer) { } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { long i = this.writePointer; memPutFloat(i, x); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java index 818554364..faf50f79b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/BlockRenderer.java @@ -151,6 +151,7 @@ private void renderQuad(ModelVertexSink sink, QuadView quad, QuadLightData light final ModelQuadOrientation order = (useSodiumLight || this.useSeparateAo) ? ModelQuadOrientation.orient(light.br) : ModelQuadOrientation.NORMAL; + int shaderBlockId = quad.getShaderBlockId(); for (int dstIndex = 0; dstIndex < 4; dstIndex++) { final int srcIndex = order.getVertexIndex(dstIndex); @@ -174,7 +175,7 @@ private void renderQuad(ModelVertexSink sink, QuadView quad, QuadLightData light final int lm = (useSeparateAo) ? ModelQuadUtil.mergeBakedLight(quad.getLight(srcIndex), light.lm[srcIndex]) : (useSodiumLight) ? light.lm[srcIndex] : quad.getLight(srcIndex); - sink.writeQuad(x, y, z, color, u, v, lm); + sink.writeQuad(x, y, z, color, u, v, lm, shaderBlockId); } final TextureAtlasSprite sprite = quad.rubidium$getSprite(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java index 5b8a841cd..28bb7cc2a 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/pipeline/FluidRenderer.java @@ -405,7 +405,7 @@ private void flushQuad(ChunkModelBuffers buffers, ModelQuadView quad, ModelQuadF int light = this.quadLightData.lm[vertexIdx]; - sink.writeQuad(x, y, z, color, u, v, light); + sink.writeQuad(x, y, z, color, u, v, light, -1); vertexIdx += lightOrder; } diff --git a/src/main/java/net/coderbot/iris/Iris.java b/src/main/java/net/coderbot/iris/Iris.java index 248ba23eb..9868920c4 100644 --- a/src/main/java/net/coderbot/iris/Iris.java +++ b/src/main/java/net/coderbot/iris/Iris.java @@ -1,13 +1,18 @@ package net.coderbot.iris; import com.google.common.base.Throwables; +import com.gtnewhorizon.gtnhlib.client.renderer.CapturingTessellator; +import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; import com.gtnewhorizons.angelica.AngelicaMod; import com.gtnewhorizons.angelica.Tags; +import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.mojang.realmsclient.gui.ChatFormatting; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import lombok.Getter; +import net.coderbot.iris.block_rendering.BlockRenderingSettings; import net.coderbot.iris.config.IrisConfig; import net.coderbot.iris.gl.shader.StandardMacros; import net.coderbot.iris.gui.screen.ShaderPackScreen; @@ -24,7 +29,9 @@ import net.coderbot.iris.shaderpack.option.Profile; import net.coderbot.iris.shaderpack.option.values.MutableOptionValues; import net.coderbot.iris.shaderpack.option.values.OptionValues; +import net.coderbot.iris.sodium.block_context.BlockContextHolder; import net.coderbot.iris.texture.pbr.PBRTextureManager; +import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.multiplayer.WorldClient; @@ -638,4 +645,36 @@ public void fmlInitEvent() { ClientRegistry.registerKeyBinding(toggleShadersKeybind); ClientRegistry.registerKeyBinding(shaderpackScreenKeybind); } + + static BlockContextHolder contextHolder; + + private static int getShaderMaterialOverrideId(Block block, int meta) { + if (contextHolder == null) { + final Object2IntMap blockMatches = BlockRenderingSettings.INSTANCE.getBlockMatches(); + if (blockMatches == null) { + return -1; + } + contextHolder = new BlockContextHolder(blockMatches); + + } + contextHolder.set(block, (short) block.getRenderType()); + return contextHolder.blockId; + } + + public static void setShaderMaterialOverride(Block block, int meta) { + if (!AngelicaConfig.enableIris) + return; + + int blockId = getShaderMaterialOverrideId(block, meta); + + CapturingTessellator tess = (CapturingTessellator) TessellatorManager.get(); + tess.setShaderBlockId(blockId); + } + + public static void resetShaderMaterialOverride() { + if (!AngelicaConfig.enableIris) + return; + CapturingTessellator tess = (CapturingTessellator) TessellatorManager.get(); + tess.setShaderBlockId(-1); + } } diff --git a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java index 0585aaab8..17ecdef72 100644 --- a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java +++ b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java @@ -30,7 +30,7 @@ public XHFPModelVertexBufferWriterNio(VertexBufferView backingBuffer) { } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { uSum += u; vSum += v; @@ -42,7 +42,7 @@ public void writeQuad(float x, float y, float z, int color, float u, float v, in ModelVertexUtil.denormalizeVertexTextureFloatAsShort(u), ModelVertexUtil.denormalizeVertexTextureFloatAsShort(v), light, - contextHolder.blockId, + shaderBlockId != -1 ? (short)shaderBlockId : contextHolder.blockId, contextHolder.renderType, ExtendedDataHelper.computeMidBlock(x, y, z, contextHolder.localPosX, contextHolder.localPosY, contextHolder.localPosZ) ); diff --git a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java index 5f5d8a9a4..0c1f210e5 100644 --- a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java +++ b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java @@ -30,7 +30,7 @@ public XHFPModelVertexBufferWriterUnsafe(VertexBufferView backingBuffer) { } @Override - public void writeQuad(float x, float y, float z, int color, float u, float v, int light) { + public void writeQuad(float x, float y, float z, int color, float u, float v, int light, int shaderBlockId) { uSum += u; vSum += v; @@ -42,7 +42,7 @@ public void writeQuad(float x, float y, float z, int color, float u, float v, in ModelVertexUtil.denormalizeVertexTextureFloatAsShort(u), ModelVertexUtil.denormalizeVertexTextureFloatAsShort(v), light, - contextHolder.blockId, + shaderBlockId != -1 ? (short)shaderBlockId : contextHolder.blockId, contextHolder.renderType, ExtendedDataHelper.computeMidBlock(x, y, z, contextHolder.localPosX, contextHolder.localPosY, contextHolder.localPosZ) ); From aa411b8e4b8a6f3c0faa76e23cf5e41233be351d Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Thu, 13 Feb 2025 18:15:09 -0500 Subject: [PATCH 04/11] Fix NPE in animation code --- .../early/angelica/animation/MixinRenderBlocks.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java index c59b26010..e48905056 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinRenderBlocks.java @@ -53,10 +53,12 @@ public class MixinRenderBlocks implements ITexturesCache { icon = overrideBlockTexture; } - AnimationsRenderUtils.markBlockTextureForUpdate(icon, blockAccess); + if (icon != null) { + AnimationsRenderUtils.markBlockTextureForUpdate(icon, blockAccess); - if(this.enableSpriteTracking) { - this.renderedSprites.add(icon); + if(this.enableSpriteTracking) { + this.renderedSprites.add(icon); + } } } From 61764aa6cf3f8494f35a8c21b81b7b79a44fe3b0 Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Fri, 14 Feb 2025 16:39:47 -0500 Subject: [PATCH 05/11] Fix animations for abnormally rendered items --- .../com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java b/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java index 448769a99..75a636ac6 100644 --- a/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java +++ b/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java @@ -37,6 +37,8 @@ public static void onSpriteUsed(IPatchedTextureAtlasSprite sprite) { Stack stack = TEXTURE_CACHE_STACK.get(); if (stack == null || stack.isEmpty()) { + // icon was used outside of chunk building, it's probably an item in an inventory or something + sprite.markNeedsAnimationUpdate(); return; } From 2af5c51a64bf54f641fbd867f655e62f88506802 Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Thu, 13 Feb 2025 18:10:19 -0500 Subject: [PATCH 06/11] Hide shader warnings behind enableDebugLogging --- .../mods/sodium/client/gl/shader/GlProgram.java | 7 ++++--- .../mods/sodium/client/gl/shader/GlShader.java | 7 ++++--- src/main/java/net/coderbot/iris/gl/shader/GlShader.java | 9 +++++---- .../java/net/coderbot/iris/gl/shader/ProgramCreator.java | 3 ++- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java b/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java index bc262afe1..8142a5452 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlProgram.java @@ -1,5 +1,6 @@ package me.jellysquid.mods.sodium.client.gl.shader; +import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLDebug; import me.jellysquid.mods.sodium.client.gl.GlObject; import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; @@ -93,12 +94,12 @@ public

P build(ProgramFactory

factory) { final String log = GL20.glGetProgramInfoLog(this.program, GL20.GL_INFO_LOG_LENGTH); - if (!log.isEmpty()) { + final int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); + + if ((AngelicaConfig.enableDebugLogging || result != GL11.GL_TRUE) && !log.isEmpty()) { LOGGER.warn("Program link log for " + this.name + ": " + log); } - final int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); - if (result != GL11.GL_TRUE) { throw new RuntimeException("Shader program linking failed, see log for details"); } diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java b/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java index 97a2ecc52..4c2004f8f 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gl/shader/GlShader.java @@ -1,5 +1,6 @@ package me.jellysquid.mods.sodium.client.gl.shader; +import com.gtnewhorizons.angelica.config.AngelicaConfig; import me.jellysquid.mods.sodium.client.gl.GlObject; import me.jellysquid.mods.sodium.client.gl.device.RenderDevice; import net.minecraft.util.ResourceLocation; @@ -34,12 +35,12 @@ public GlShader(RenderDevice owner, ShaderType type, ResourceLocation name, Stri String log = GL20.glGetShaderInfoLog(handle, GL20.GL_INFO_LOG_LENGTH); - if (!log.isEmpty()) { + int result = GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS); + + if ((AngelicaConfig.enableDebugLogging || result != GL11.GL_TRUE) && !log.isEmpty()) { LOGGER.warn("Shader compilation log for " + this.name + ": " + log); } - int result = GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS); - if (result != GL11.GL_TRUE) { throw new RuntimeException("Shader compilation failed, see log for details"); } diff --git a/src/main/java/net/coderbot/iris/gl/shader/GlShader.java b/src/main/java/net/coderbot/iris/gl/shader/GlShader.java index 52f914dc1..63f856260 100644 --- a/src/main/java/net/coderbot/iris/gl/shader/GlShader.java +++ b/src/main/java/net/coderbot/iris/gl/shader/GlShader.java @@ -2,6 +2,7 @@ package net.coderbot.iris.gl.shader; +import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLDebug; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.GlResource; @@ -39,12 +40,12 @@ private static int createShader(ShaderType type, String name, String src) { String log = RenderSystem.getShaderInfoLog(handle); - if (!log.isEmpty()) { - LOGGER.warn("Shader compilation log for " + name + ": " + log); - } - int result = GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS); + if ((AngelicaConfig.enableDebugLogging || result != GL11.GL_TRUE) && !log.isEmpty()) { + LOGGER.warn("Shader compilation log for " + name + ": " + log); + } + if (result != GL11.GL_TRUE) { throw new RuntimeException("Shader compilation failed, see log for details"); } diff --git a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java index d05ce63b0..f9e70d9a0 100644 --- a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java +++ b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java @@ -2,6 +2,7 @@ package net.coderbot.iris.gl.shader; +import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLDebug; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.apache.logging.log4j.LogManager; @@ -37,7 +38,7 @@ public static int create(String name, GlShader... shaders) { String log = RenderSystem.getProgramInfoLog(program); - if (!log.isEmpty()) { + if (AngelicaConfig.enableDebugLogging && !log.isEmpty()) { LOGGER.warn("Program link log for " + name + ": " + log); } From d64eae06a71e6ca0f4ac6127d54cea77c6e69954 Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Thu, 13 Feb 2025 18:12:49 -0500 Subject: [PATCH 07/11] Add meta matching for shader mat ids --- .../block_rendering/BlockMaterialMapping.java | 12 --- .../BlockRenderingSettings.java | 17 ++-- .../block_rendering/MaterialIdLookup.java | 9 ++ .../iris/client/IrisDebugScreenHandler.java | 18 ++++ .../DeferredWorldRenderingPipeline.java | 2 +- .../net/coderbot/iris/shaderpack/IdMap.java | 99 +++++++++++++++---- .../coderbot/iris/shaderpack/LegacyIdMap.java | 3 +- .../shaderpack/materialmap/BlockEntry.java | 18 ++-- .../shaderpack/materialmap/NamespacedId.java | 41 ++++++-- .../block_context/BlockContextHolder.java | 24 ++--- .../XHFPModelVertexBufferWriterNio.java | 2 +- .../XHFPModelVertexBufferWriterUnsafe.java | 2 +- 12 files changed, 177 insertions(+), 70 deletions(-) create mode 100644 src/main/java/net/coderbot/iris/block_rendering/MaterialIdLookup.java diff --git a/src/main/java/net/coderbot/iris/block_rendering/BlockMaterialMapping.java b/src/main/java/net/coderbot/iris/block_rendering/BlockMaterialMapping.java index 544af3fa1..1aed8be3b 100644 --- a/src/main/java/net/coderbot/iris/block_rendering/BlockMaterialMapping.java +++ b/src/main/java/net/coderbot/iris/block_rendering/BlockMaterialMapping.java @@ -70,18 +70,6 @@ private static void addBlock(BlockEntry entry, Object2IntMap idMap, int i } idMap.put(block, intId); - -// Set metas = entry.getMetas(); -// // All metas match -// if (metas.isEmpty()) { -// idMap.putIfAbsent(new BlockMatch(block, null), intId); -// return; -// } -// -// // A subset of metas match -// for(int meta : metas) { -// idMap.putIfAbsent(new BlockMatch(block, meta), intId); -// } } // We ignore generics here, the actual types don't matter because we just convert diff --git a/src/main/java/net/coderbot/iris/block_rendering/BlockRenderingSettings.java b/src/main/java/net/coderbot/iris/block_rendering/BlockRenderingSettings.java index cbe345740..0e5e6f7b0 100644 --- a/src/main/java/net/coderbot/iris/block_rendering/BlockRenderingSettings.java +++ b/src/main/java/net/coderbot/iris/block_rendering/BlockRenderingSettings.java @@ -2,7 +2,6 @@ import com.gtnewhorizons.angelica.compat.toremove.RenderLayer; import it.unimi.dsi.fastutil.objects.Object2IntFunction; -import it.unimi.dsi.fastutil.objects.Object2IntMap; import lombok.Getter; import net.coderbot.iris.shaderpack.materialmap.NamespacedId; import net.minecraft.block.Block; @@ -15,7 +14,7 @@ public class BlockRenderingSettings { @Getter private boolean reloadRequired; - private Object2IntMap blockMatches; + private MaterialIdLookup lookup; private Map blockTypeIds; private Object2IntFunction entityIds; private float ambientOcclusionLevel; @@ -25,7 +24,7 @@ public class BlockRenderingSettings { public BlockRenderingSettings() { reloadRequired = false; - blockMatches = null; + lookup = null; blockTypeIds = null; ambientOcclusionLevel = 1.0F; disableDirectionalShading = false; @@ -38,8 +37,8 @@ public void clearReloadRequired() { } @Nullable - public Object2IntMap getBlockMatches() { - return blockMatches; + public MaterialIdLookup getLookup() { + return lookup; } @Nullable @@ -52,13 +51,9 @@ public Object2IntFunction getEntityIds() { return entityIds; } - public void setBlockMatches(Object2IntMap blockIds) { - if (this.blockMatches != null && this.blockMatches.equals(blockIds)) { - return; - } - + public void setLookup(MaterialIdLookup lookup) { this.reloadRequired = true; - this.blockMatches = blockIds; + this.lookup = lookup; } public void setBlockTypeIds(Map blockTypeIds) { diff --git a/src/main/java/net/coderbot/iris/block_rendering/MaterialIdLookup.java b/src/main/java/net/coderbot/iris/block_rendering/MaterialIdLookup.java new file mode 100644 index 000000000..44dd254e0 --- /dev/null +++ b/src/main/java/net/coderbot/iris/block_rendering/MaterialIdLookup.java @@ -0,0 +1,9 @@ +package net.coderbot.iris.block_rendering; + +import net.minecraft.block.Block; + +public interface MaterialIdLookup { + + /** Looks up a block's material id for the matching shaderpack. */ + short get(Block block, int meta); +} diff --git a/src/main/java/net/coderbot/iris/client/IrisDebugScreenHandler.java b/src/main/java/net/coderbot/iris/client/IrisDebugScreenHandler.java index 9c36d1bef..5fa46472a 100644 --- a/src/main/java/net/coderbot/iris/client/IrisDebugScreenHandler.java +++ b/src/main/java/net/coderbot/iris/client/IrisDebugScreenHandler.java @@ -1,11 +1,16 @@ package net.coderbot.iris.client; +import com.gtnewhorizon.gtnhlib.util.data.BlockMeta; import com.gtnewhorizons.angelica.AngelicaMod; import com.gtnewhorizons.angelica.config.AngelicaConfig; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.coderbot.iris.Iris; +import net.coderbot.iris.block_rendering.BlockRenderingSettings; + +import net.minecraft.block.Block; import net.minecraft.client.Minecraft; +import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.client.event.RenderGameOverlayEvent; import java.lang.management.BufferPoolMXBean; @@ -45,6 +50,19 @@ public void onRenderGameOverlayTextEvent(RenderGameOverlayEvent.Text event) { if (Iris.getIrisConfig().areShadersEnabled()) { event.right.add("[" + Iris.MODNAME + "] Shaderpack: " + Iris.getCurrentPackName() + (Iris.isFallback() ? " (fallback)" : "")); Iris.getCurrentPack().ifPresent(pack -> event.right.add("[" + Iris.MODNAME + "] " + pack.getProfileInfo())); + + if (mc.objectMouseOver != null && mc.objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { + Block block = mc.theWorld.getBlock(mc.objectMouseOver.blockX, mc.objectMouseOver.blockY, mc.objectMouseOver.blockZ); + int meta = mc.theWorld.getBlockMetadata(mc.objectMouseOver.blockX, mc.objectMouseOver.blockY, mc.objectMouseOver.blockZ); + + if (BlockRenderingSettings.INSTANCE.getLookup() != null) { + event.left.add("[" + Iris.MODNAME + "] Shader Block Id: " + BlockRenderingSettings.INSTANCE.getLookup().get(block, meta)); + } else { + event.left.add("[" + Iris.MODNAME + "] Shader Block Id: Missing Shader Block Id Lookup"); + } + } else { + event.left.add("[" + Iris.MODNAME + "] Shader Block Id: None"); + } } else { event.right.add("[" + Iris.MODNAME + "] Shaders are disabled"); } diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index 440ea7dea..d622ca7f0 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -196,7 +196,7 @@ public DeferredWorldRenderingPipeline(ProgramSet programs) { } // TODO: BlockStateIdMap - BlockRenderingSettings.INSTANCE.setBlockMatches(BlockMaterialMapping.createBlockStateIdMap(programs.getPack().getIdMap().getBlockProperties())); + BlockRenderingSettings.INSTANCE.setLookup(programs.getPack().getIdMap().getBlockIdLookup()); BlockRenderingSettings.INSTANCE.setBlockTypeIds(BlockMaterialMapping.createBlockTypeMap(programs.getPack().getIdMap().getBlockRenderTypeMap())); BlockRenderingSettings.INSTANCE.setEntityIds(programs.getPack().getIdMap().getEntityIdMap()); diff --git a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java index 2b5237f85..333776da5 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java @@ -1,18 +1,29 @@ package net.coderbot.iris.shaderpack; +import com.gtnewhorizons.angelica.config.AngelicaConfig; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.LoaderState; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.Object2IntFunction; +import it.unimi.dsi.fastutil.ints.Int2ShortFunction; +import it.unimi.dsi.fastutil.ints.Int2ShortMap; +import it.unimi.dsi.fastutil.ints.Int2ShortOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntMaps; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Getter; import net.coderbot.iris.Iris; +import net.coderbot.iris.block_rendering.MaterialIdLookup; import net.coderbot.iris.shaderpack.materialmap.BlockEntry; import net.coderbot.iris.shaderpack.materialmap.BlockRenderType; import net.coderbot.iris.shaderpack.materialmap.NamespacedId; import net.coderbot.iris.shaderpack.option.ShaderPackOptions; import net.coderbot.iris.shaderpack.preprocessor.PropertiesPreprocessor; + +import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @@ -39,22 +50,30 @@ public class IdMap { /** * Maps a given item ID to an integer ID */ - private final Object2IntMap itemIdMap; + @Getter + private final Object2IntMap itemIdMap; /** * Maps a given entity ID to an integer ID */ - private final Object2IntMap entityIdMap; + @lombok.Getter + private final Object2IntMap entityIdMap; /** * Maps block states to block ids defined in block.properties */ - private Int2ObjectMap> blockPropertiesMap; + @Getter + private Int2ObjectMap> blockPropertiesMap; + + private final Object2ObjectMap blockPropertiesLookup = new Object2ObjectOpenHashMap<>(); /** * A set of render type overrides for specific blocks. Allows shader packs to move blocks to different render types. */ - private Map blockRenderTypeMap; + @Getter + private Map blockRenderTypeMap; + + private boolean needsBlockLoad = true; IdMap(Path shaderPath, ShaderPackOptions shaderPackOptions, Iterable environmentDefines) { itemIdMap = loadProperties(shaderPath, "item.properties", shaderPackOptions, environmentDefines).map(IdMap::parseItemIdMap).orElse(Object2IntMaps.emptyMap()); @@ -74,11 +93,57 @@ public class IdMap { LegacyIdMap.addLegacyValues(blockPropertiesMap); } - if (blockRenderTypeMap == null) { + // if the game is already loaded, just load the blocks now + // otherwise we have to lazy load them + if (Loader.instance().hasReachedState(LoaderState.POSTINITIALIZATION)) { + loadBlockIdLookup(); + } + + if (blockRenderTypeMap == null) { blockRenderTypeMap = Collections.emptyMap(); } } + public synchronized void loadBlockIdLookup() { + if (!needsBlockLoad) return; + needsBlockLoad = false; + + blockPropertiesMap.forEach((materialId, blockEntries) -> { + for (BlockEntry entry : blockEntries) { + Block block = entry.getId().getBlock(); + + if (block == null) { + if (AngelicaConfig.enableDebugLogging) { + Iris.logger.warn("Not adding shader material id for missing block " + entry.getId().describe()); + } + continue; + } + + short matId = materialId.shortValue(); + + Int2ShortMap metaMap = ((Int2ShortMap) blockPropertiesLookup.computeIfAbsent(block, ignored -> { + Int2ShortMap map = new Int2ShortOpenHashMap(); + map.defaultReturnValue((short) -1); + return map; + })); + + if (entry.getMetas().isEmpty()) { + if (metaMap.defaultReturnValue() != matId) { + if (metaMap.defaultReturnValue() != -1) { + Iris.logger.error("Attempted to replace default shader material id {} with {} for block {}", metaMap.defaultReturnValue(), materialId, entry.getId().describe()); + } else { + metaMap.defaultReturnValue(matId); + } + } + } else { + for (int meta : entry.getMetas()) { + metaMap.put(meta, materialId.shortValue()); + } + } + } + }); + } + /** * Loads properties from a properties file in a shaderpack path */ @@ -264,23 +329,19 @@ private static Map parseRenderTypeMap(Properties return overrides; } - public Int2ObjectMap> getBlockProperties() { - return blockPropertiesMap; - } + public MaterialIdLookup getBlockIdLookup() { + return (block, meta) -> { + if (needsBlockLoad) loadBlockIdLookup(); - public Object2IntFunction getItemIdMap() { - return itemIdMap; - } + Int2ShortFunction fn = blockPropertiesLookup.get(block); - public Object2IntFunction getEntityIdMap() { - return entityIdMap; - } + if (fn == null) return (short) 0; - public Map getBlockRenderTypeMap() { - return blockRenderTypeMap; - } + return fn.get(meta); + }; + } - @Override + @Override public boolean equals(Object o) { if (this == o) { return true; diff --git a/src/main/java/net/coderbot/iris/shaderpack/LegacyIdMap.java b/src/main/java/net/coderbot/iris/shaderpack/LegacyIdMap.java index 615091caa..36ba6f1ab 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/LegacyIdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/LegacyIdMap.java @@ -3,6 +3,7 @@ import com.google.common.collect.ImmutableList; import it.unimi.dsi.fastutil.Function; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.coderbot.iris.shaderpack.materialmap.BlockEntry; import net.coderbot.iris.shaderpack.materialmap.NamespacedId; @@ -79,7 +80,7 @@ public static void addLegacyValues(Int2ObjectMap> blockIdMap) { } private static BlockEntry block(String name) { - return new BlockEntry(new NamespacedId("minecraft", name), Collections.emptySet()); + return new BlockEntry(new NamespacedId("minecraft", name)); } private static void addMany(Int2ObjectMap> blockIdMap, int id, List prefixes, Function toId) { diff --git a/src/main/java/net/coderbot/iris/shaderpack/materialmap/BlockEntry.java b/src/main/java/net/coderbot/iris/shaderpack/materialmap/BlockEntry.java index 77388cea4..6c0c42e61 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/materialmap/BlockEntry.java +++ b/src/main/java/net/coderbot/iris/shaderpack/materialmap/BlockEntry.java @@ -1,5 +1,7 @@ package net.coderbot.iris.shaderpack.materialmap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; import lombok.Getter; import net.coderbot.iris.Iris; import org.apache.commons.lang3.StringUtils; @@ -13,9 +15,13 @@ @Getter public class BlockEntry { private final NamespacedId id; - private final Set metas; + private final IntSet metas; - public BlockEntry(NamespacedId id, Set metas) { + public BlockEntry(NamespacedId id) { + this(id, new IntOpenHashSet()); + } + + public BlockEntry(NamespacedId id, IntSet metas) { this.id = id; this.metas = metas; } @@ -36,7 +42,7 @@ public static BlockEntry parse(@NotNull String entry) { // Trivial case: no states, no namespace if (splitStates.length == 1) { - return new BlockEntry(new NamespacedId("minecraft", entry), Collections.emptySet()); + return new BlockEntry(new NamespacedId("minecraft", entry)); } // Examples of what we'll accept @@ -59,7 +65,7 @@ public static BlockEntry parse(@NotNull String entry) { // The first term MUST be a valid ResourceLocation component // The second term, if it is not numeric, must be a valid ResourceLocation component. if (splitStates.length == 2 && !StringUtils.isNumeric(splitStates[1].substring(0, 1))) { - return new BlockEntry(new NamespacedId(splitStates[0], splitStates[1]), Collections.emptySet()); + return new BlockEntry(new NamespacedId(splitStates[0], splitStates[1])); } // Complex case: One or more states involved... @@ -76,11 +82,11 @@ public static BlockEntry parse(@NotNull String entry) { id = new NamespacedId(splitStates[0], splitStates[1]); } - final Set metas = new HashSet<>(); + final IntSet metas = new IntOpenHashSet(); for (int index = statesStart; index < splitStates.length; index++) { // Parse out one or more metadata ids - final String[] metaParts = splitStates[index].split(", "); + final String[] metaParts = splitStates[index].split(","); for (String metaPart : metaParts) { try { diff --git a/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java b/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java index 30540d2af..51abab8e8 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java +++ b/src/main/java/net/coderbot/iris/shaderpack/materialmap/NamespacedId.java @@ -2,10 +2,20 @@ import java.util.Objects; +import net.minecraft.block.Block; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.registry.GameRegistry; +import lombok.Getter; + public class NamespacedId { + @Getter private final String namespace; + @Getter private final String name; + private Block block; + public NamespacedId(String combined) { int colonIdx = combined.indexOf(':'); @@ -23,13 +33,28 @@ public NamespacedId(String namespace, String name) { this.name = Objects.requireNonNull(name); } - public String getNamespace() { - return namespace; - } + private static final String ETFUTURUM = "etfuturum"; - public String getName() { - return name; - } + private static Boolean EFT = null; + + public Block getBlock() { + if (block == null) { + block = GameRegistry.findBlock(namespace, name); + + // very cursed, but unless we want to manually edit every shaderpack this is probably the best option + if (block == null && namespace.equals("minecraft")) { + if (EFT == null) { + EFT = Loader.isModLoaded(ETFUTURUM); + } + + if (EFT) { + block = GameRegistry.findBlock(ETFUTURUM, name); + } + } + } + + return block; + } @Override public boolean equals(Object o) { @@ -58,4 +83,8 @@ public String toString() { ", name='" + name + '\'' + '}'; } + + public String describe() { + return String.format("%s:%s", namespace, name); + } } diff --git a/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java b/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java index 6f7e601ff..0f2a3fb7f 100644 --- a/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java +++ b/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java @@ -1,28 +1,28 @@ package net.coderbot.iris.sodium.block_context; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntMaps; +import net.coderbot.iris.block_rendering.MaterialIdLookup; + import net.minecraft.block.Block; public class BlockContextHolder { - private final Object2IntMap blockMatches; + private final MaterialIdLookup lookup; public int localPosX; public int localPosY; public int localPosZ; - public short blockId; + public short materialId; public short renderType; public BlockContextHolder() { - this.blockMatches = Object2IntMaps.emptyMap(); - this.blockId = -1; + this.lookup = (a, b) -> (short) -1; + this.materialId = -1; this.renderType = -1; } - public BlockContextHolder(Object2IntMap idMap) { - this.blockMatches = idMap; - this.blockId = -1; + public BlockContextHolder(MaterialIdLookup lookup) { + this.lookup = lookup; + this.materialId = -1; this.renderType = -1; } @@ -32,13 +32,13 @@ public void setLocalPos(int localPosX, int localPosY, int localPosZ) { this.localPosZ = localPosZ; } - public void set(Block block, short renderType) { - this.blockId = (short) this.blockMatches.getOrDefault(block, -1); + public void set(Block block, int meta, short renderType) { + this.materialId = this.lookup.get(block, meta); this.renderType = renderType; } public void reset() { - this.blockId = -1; + this.materialId = -1; this.renderType = -1; this.localPosX = 0; this.localPosY = 0; diff --git a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java index 0585aaab8..f86d57e23 100644 --- a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java +++ b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java @@ -42,7 +42,7 @@ public void writeQuad(float x, float y, float z, int color, float u, float v, in ModelVertexUtil.denormalizeVertexTextureFloatAsShort(u), ModelVertexUtil.denormalizeVertexTextureFloatAsShort(v), light, - contextHolder.blockId, + contextHolder.materialId, contextHolder.renderType, ExtendedDataHelper.computeMidBlock(x, y, z, contextHolder.localPosX, contextHolder.localPosY, contextHolder.localPosZ) ); diff --git a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java index 5f5d8a9a4..05ec99bf3 100644 --- a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java +++ b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java @@ -42,7 +42,7 @@ public void writeQuad(float x, float y, float z, int color, float u, float v, in ModelVertexUtil.denormalizeVertexTextureFloatAsShort(u), ModelVertexUtil.denormalizeVertexTextureFloatAsShort(v), light, - contextHolder.blockId, + contextHolder.materialId, contextHolder.renderType, ExtendedDataHelper.computeMidBlock(x, y, z, contextHolder.localPosX, contextHolder.localPosY, contextHolder.localPosZ) ); From 16d74f00115c1d67c5d93348d42a2b1541f2c37e Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Thu, 13 Feb 2025 18:13:27 -0500 Subject: [PATCH 08/11] Add subpass system for blocks to implement --- .../gtnewhorizons/angelica/mixins/Mixins.java | 1 + .../chunk/compile/ChunkBuildBuffers.java | 17 ++++--- .../chunk/tasks/ChunkRenderRebuildTask.java | 26 ++++++++--- .../net/coderbot/iris/api/IIrisAware.java | 10 +++++ .../coderbot/iris/api/IIrisRenderBlocks.java | 44 +++++++++++++++++++ .../block_context/ChunkBuildBuffersExt.java | 5 ++- .../early/shaders/MixinRenderBlocks.java | 42 ++++++++++++++++++ 7 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 src/main/java/net/coderbot/iris/api/IIrisAware.java create mode 100644 src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java create mode 100644 src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java diff --git a/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java b/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java index c5b61e996..dbc87d80f 100644 --- a/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java +++ b/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java @@ -158,6 +158,7 @@ public enum Mixins { ,"shaders.MixinRendererLivingEntity" ,"shaders.MixinRenderGlobal" ,"shaders.MixinTileEntityBeaconRenderer" + ,"shaders.MixinRenderBlocks" ) ), diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java index 732c03e24..21ca9c33e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java @@ -2,7 +2,6 @@ import com.gtnewhorizon.gtnhlib.client.renderer.quad.properties.ModelQuadFacing; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import it.unimi.dsi.fastutil.objects.Object2IntMap; import lombok.Getter; import me.jellysquid.mods.sodium.client.SodiumClientMod; import me.jellysquid.mods.sodium.client.gl.buffer.VertexData; @@ -17,6 +16,7 @@ import me.jellysquid.mods.sodium.client.render.chunk.format.ChunkModelOffset; import me.jellysquid.mods.sodium.client.render.chunk.format.ModelVertexSink; import me.jellysquid.mods.sodium.client.render.chunk.passes.BlockRenderPass; +import net.coderbot.iris.block_rendering.MaterialIdLookup; import net.coderbot.iris.block_rendering.BlockRenderingSettings; import net.coderbot.iris.sodium.block_context.BlockContextHolder; import net.coderbot.iris.sodium.block_context.ChunkBuildBuffersExt; @@ -61,10 +61,10 @@ public ChunkBuildBuffers(ChunkVertexType vertexType) { } if(AngelicaConfig.enableIris) { - final Object2IntMap blockMatches = BlockRenderingSettings.INSTANCE.getBlockMatches(); + final MaterialIdLookup lookup = BlockRenderingSettings.INSTANCE.getLookup(); - if (blockMatches != null) { - this.iris$contextHolder = new BlockContextHolder(blockMatches); + if (lookup != null) { + this.iris$contextHolder = new BlockContextHolder(lookup); } else { this.iris$contextHolder = new BlockContextHolder(); } @@ -161,9 +161,14 @@ public void setRenderOffset(int x, int y, int z) { this.iris$contextHolder.setLocalPos(localPosX, localPosY, localPosZ); } - public void iris$setMaterialId(Block block, short renderType) { + public void iris$setMaterialId(Block block, int meta) { if(!AngelicaConfig.enableIris) return; - this.iris$contextHolder.set(block, renderType); + this.iris$contextHolder.set(block, meta, this.iris$contextHolder.renderType); + } + + public void iris$setMaterialId(Block block, int meta, short renderType) { + if(!AngelicaConfig.enableIris) return; + this.iris$contextHolder.set(block, meta, renderType); } public void iris$resetBlockContext() { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java index 0cc07a25a..48b7b5686 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java @@ -24,6 +24,8 @@ import me.jellysquid.mods.sodium.client.util.task.CancellationSource; import me.jellysquid.mods.sodium.client.world.WorldSlice; import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; +import net.coderbot.iris.api.IIrisAware; +import net.coderbot.iris.api.IIrisRenderBlocks; import net.coderbot.iris.block_rendering.BlockRenderingSettings; import net.coderbot.iris.vertices.ExtendedDataHelper; import net.minecraft.block.Block; @@ -134,6 +136,8 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB final RenderBlocks renderBlocks = new RenderBlocks(slice); if(renderBlocks instanceof ITexturesCache) ((ITexturesCache)renderBlocks).enableTextureTracking(); + ((IIrisRenderBlocks)renderBlocks).setBuffers(buffers); + final int baseX = this.render.getOriginX(); final int baseY = this.render.getOriginY(); final int baseZ = this.render.getOriginZ(); @@ -167,15 +171,23 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB if(AngelicaConfig.enableIris) buffers.iris$setLocalPos(relX, relY, relZ); if (rendersOffThread(block)) { + int subpasses = block instanceof IIrisAware aw ? aw.getSubpassCount(meta) : 1; + // Do regular block rendering for (BlockRenderPass pass : BlockRenderPass.VALUES) { if (canRenderInPass(block, pass) && !shouldUseSodiumFluidRendering(block)) { ChunkRenderManager.setWorldRenderPass(pass); final long seed = MathUtil.hashPos(pos.x, pos.y, pos.z); - if(AngelicaConfig.enableIris) buffers.iris$setMaterialId(block, ExtendedDataHelper.BLOCK_RENDER_TYPE); - if (cache.getBlockRenderer().renderModel(cache.getWorldSlice(), renderBlocks, block, meta, pos, buffers.get(pass), true, seed)) { - bounds.addBlock(relX, relY, relZ); + for (int subpass = 0; subpass < subpasses; subpass++) { + if(AngelicaConfig.enableIris) { + ((IIrisRenderBlocks)renderBlocks).setCurrentSubpass(subpass); + buffers.iris$setMaterialId(block, meta, ExtendedDataHelper.BLOCK_RENDER_TYPE); + } + + if (cache.getBlockRenderer().renderModel(cache.getWorldSlice(), renderBlocks, block, meta, pos, buffers.get(pass), true, seed)) { + bounds.addBlock(relX, relY, relZ); + } } } } @@ -189,7 +201,9 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB for (BlockRenderPass pass : BlockRenderPass.VALUES) { if (canRenderInPass(block, pass)) { ChunkRenderManager.setWorldRenderPass(pass); - if(AngelicaConfig.enableIris) buffers.iris$setMaterialId(block, ExtendedDataHelper.FLUID_RENDER_TYPE); + if(AngelicaConfig.enableIris) { + buffers.iris$setMaterialId(block, meta, ExtendedDataHelper.FLUID_RENDER_TYPE); + } if (cache.getFluidRenderer().render(slice, cache.getWorldSlice(), block, pos, buffers.get(pass))) { bounds.addBlock(relX, relY, relZ); @@ -292,7 +306,9 @@ private void performMainBuild(ChunkRenderCacheLocal cache, ChunkBuildBuffers buf if (canRenderInPass(block, pass) && !shouldUseSodiumFluidRendering(block)) { ChunkRenderManager.setWorldRenderPass(pass); final long seed = MathUtil.hashPos(pos.x, pos.y, pos.z); - if(AngelicaConfig.enableIris) buffers.iris$setMaterialId(block, ExtendedDataHelper.BLOCK_RENDER_TYPE); + if(AngelicaConfig.enableIris) { + buffers.iris$setMaterialId(block, meta, ExtendedDataHelper.BLOCK_RENDER_TYPE); + } if (cache.getBlockRenderer().renderModel(slice.getWorld(), rb, block, meta, pos, buffers.get(pass), true, seed)) { bounds.addBlock(relX, relY, relZ); diff --git a/src/main/java/net/coderbot/iris/api/IIrisAware.java b/src/main/java/net/coderbot/iris/api/IIrisAware.java new file mode 100644 index 000000000..e3b76f3e9 --- /dev/null +++ b/src/main/java/net/coderbot/iris/api/IIrisAware.java @@ -0,0 +1,10 @@ +package net.coderbot.iris.api; + +public interface IIrisAware { + + /** + * Gets the number of subpasses required to render this block. + * Note: this has no relation to the vulkan concept, this is just a convenient name. + */ + int getSubpassCount(int meta); +} diff --git a/src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java b/src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java new file mode 100644 index 000000000..3e949dbf1 --- /dev/null +++ b/src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java @@ -0,0 +1,44 @@ +package net.coderbot.iris.api; + +import net.minecraft.block.Block; + +import org.jetbrains.annotations.ApiStatus; + +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; + +/** + * Usage: + *

+ *     public class YourISBRH implements ISimpleBlockRenderingHandler {
+ *         ...
+ *
+ *         @Override
+ *         public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
+ *             if (renderer instanceof IIrisRenderBlocks iris) {
+ *                 switch (iris.getCurrentSubpass()) {
+ *                     case 0 -> iris.setShaderBlockId(yourblock1, 5);
+ *                     case 1 -> iris.setShaderBlockId(yourblock2, 123);
+ *                 }
+ *             }
+ *
+ *             ...
+ *         }
+ *
+ *         ...
+ *     }
+ * 
+ */ +public interface IIrisRenderBlocks { + + @ApiStatus.Internal + void setCurrentSubpass(int subpass); + + @ApiStatus.Internal + void setBuffers(ChunkBuildBuffers buffers); + + /** Gets the current subpass. */ + int getCurrentSubpass(); + + /** Tells the shader to pretend the given block is the actual block (so that you can control the shader's behaviour). */ + void setShaderMaterialId(Block block, int meta); +} diff --git a/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java b/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java index 407b3cde7..a9d3d551f 100644 --- a/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java +++ b/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java @@ -5,7 +5,10 @@ public interface ChunkBuildBuffersExt { void iris$setLocalPos(int localPosX, int localPosY, int localPosZ); - void iris$setMaterialId(Block block, short renderType); + /** Sets the material id while keeping the renderType */ + void iris$setMaterialId(Block block, int meta); + + void iris$setMaterialId(Block block, int meta, short renderType); void iris$resetBlockContext(); } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java new file mode 100644 index 000000000..fa8cda2fc --- /dev/null +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java @@ -0,0 +1,42 @@ +package com.gtnewhorizons.angelica.mixins.early.shaders; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; +import net.coderbot.iris.api.IIrisRenderBlocks; + +@Mixin(RenderBlocks.class) +public class MixinRenderBlocks implements IIrisRenderBlocks { + + @Unique + private int subpass; + + @Unique + private ChunkBuildBuffers buffers; + + @Override + public void setCurrentSubpass(int subpass) { + this.subpass = subpass; + } + + @Override + public void setBuffers(ChunkBuildBuffers buffers) { + this.buffers = buffers; + } + + @Override + public int getCurrentSubpass() { + return subpass; + } + + @Override + public void setShaderMaterialId(Block block, int meta) { + if (buffers != null) { + buffers.iris$setMaterialId(block, meta); + } + } +} From 288d8a299dd48f26e6d69a56cc07bb3c087c9b20 Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Fri, 14 Feb 2025 16:48:48 -0500 Subject: [PATCH 09/11] Show iris gl program errors --- .../java/net/coderbot/iris/gl/shader/ProgramCreator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java index f9e70d9a0..486a4c5ba 100644 --- a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java +++ b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java @@ -38,12 +38,12 @@ public static int create(String name, GlShader... shaders) { String log = RenderSystem.getProgramInfoLog(program); - if (AngelicaConfig.enableDebugLogging && !log.isEmpty()) { + int result = GL20.glGetProgrami(program, GL20.GL_LINK_STATUS); + + if ((AngelicaConfig.enableDebugLogging || result != GL11.GL_TRUE) && !log.isEmpty()) { LOGGER.warn("Program link log for " + name + ": " + log); } - int result = GL20.glGetProgrami(program, GL20.GL_LINK_STATUS); - if (result != GL11.GL_TRUE) { throw new RuntimeException("Shader program linking failed, see log for details"); } From 2f3ad5e2c7e55baa9de6e2cff7f1d010f96efdba Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Sat, 15 Feb 2025 12:04:45 -0500 Subject: [PATCH 10/11] Remove subpass & shader api + misc fixes --- .../gtnewhorizons/angelica/mixins/Mixins.java | 1 - .../chunk/compile/ChunkBuildBuffers.java | 9 ++-- .../chunk/tasks/ChunkRenderRebuildTask.java | 19 +++----- .../net/coderbot/iris/api/IIrisAware.java | 10 ----- .../coderbot/iris/api/IIrisRenderBlocks.java | 44 ------------------- .../net/coderbot/iris/shaderpack/IdMap.java | 24 +++++----- .../block_context/BlockContextHolder.java | 10 ++--- .../block_context/ChunkBuildBuffersExt.java | 3 -- .../XHFPModelVertexBufferWriterNio.java | 2 +- .../XHFPModelVertexBufferWriterUnsafe.java | 2 +- .../early/shaders/MixinRenderBlocks.java | 42 ------------------ 11 files changed, 26 insertions(+), 140 deletions(-) delete mode 100644 src/main/java/net/coderbot/iris/api/IIrisAware.java delete mode 100644 src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java delete mode 100644 src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java diff --git a/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java b/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java index dbc87d80f..c5b61e996 100644 --- a/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java +++ b/src/main/java/com/gtnewhorizons/angelica/mixins/Mixins.java @@ -158,7 +158,6 @@ public enum Mixins { ,"shaders.MixinRendererLivingEntity" ,"shaders.MixinRenderGlobal" ,"shaders.MixinTileEntityBeaconRenderer" - ,"shaders.MixinRenderBlocks" ) ), diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java index 21ca9c33e..5b9205f6c 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/compile/ChunkBuildBuffers.java @@ -156,21 +156,20 @@ public void setRenderOffset(int x, int y, int z) { } // Iris Compat + + @Override public void iris$setLocalPos(int localPosX, int localPosY, int localPosZ) { if(!AngelicaConfig.enableIris) return; this.iris$contextHolder.setLocalPos(localPosX, localPosY, localPosZ); } - public void iris$setMaterialId(Block block, int meta) { - if(!AngelicaConfig.enableIris) return; - this.iris$contextHolder.set(block, meta, this.iris$contextHolder.renderType); - } - + @Override public void iris$setMaterialId(Block block, int meta, short renderType) { if(!AngelicaConfig.enableIris) return; this.iris$contextHolder.set(block, meta, renderType); } + @Override public void iris$resetBlockContext() { if(!AngelicaConfig.enableIris) return; this.iris$contextHolder.reset(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java index 48b7b5686..4dba4471b 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java @@ -24,8 +24,6 @@ import me.jellysquid.mods.sodium.client.util.task.CancellationSource; import me.jellysquid.mods.sodium.client.world.WorldSlice; import me.jellysquid.mods.sodium.client.world.cloned.ChunkRenderContext; -import net.coderbot.iris.api.IIrisAware; -import net.coderbot.iris.api.IIrisRenderBlocks; import net.coderbot.iris.block_rendering.BlockRenderingSettings; import net.coderbot.iris.vertices.ExtendedDataHelper; import net.minecraft.block.Block; @@ -136,8 +134,6 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB final RenderBlocks renderBlocks = new RenderBlocks(slice); if(renderBlocks instanceof ITexturesCache) ((ITexturesCache)renderBlocks).enableTextureTracking(); - ((IIrisRenderBlocks)renderBlocks).setBuffers(buffers); - final int baseX = this.render.getOriginX(); final int baseY = this.render.getOriginY(); final int baseZ = this.render.getOriginZ(); @@ -171,23 +167,18 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB if(AngelicaConfig.enableIris) buffers.iris$setLocalPos(relX, relY, relZ); if (rendersOffThread(block)) { - int subpasses = block instanceof IIrisAware aw ? aw.getSubpassCount(meta) : 1; - // Do regular block rendering for (BlockRenderPass pass : BlockRenderPass.VALUES) { if (canRenderInPass(block, pass) && !shouldUseSodiumFluidRendering(block)) { ChunkRenderManager.setWorldRenderPass(pass); final long seed = MathUtil.hashPos(pos.x, pos.y, pos.z); - for (int subpass = 0; subpass < subpasses; subpass++) { - if(AngelicaConfig.enableIris) { - ((IIrisRenderBlocks)renderBlocks).setCurrentSubpass(subpass); - buffers.iris$setMaterialId(block, meta, ExtendedDataHelper.BLOCK_RENDER_TYPE); - } + if(AngelicaConfig.enableIris) { + buffers.iris$setMaterialId(block, meta, ExtendedDataHelper.BLOCK_RENDER_TYPE); + } - if (cache.getBlockRenderer().renderModel(cache.getWorldSlice(), renderBlocks, block, meta, pos, buffers.get(pass), true, seed)) { - bounds.addBlock(relX, relY, relZ); - } + if (cache.getBlockRenderer().renderModel(cache.getWorldSlice(), renderBlocks, block, meta, pos, buffers.get(pass), true, seed)) { + bounds.addBlock(relX, relY, relZ); } } } diff --git a/src/main/java/net/coderbot/iris/api/IIrisAware.java b/src/main/java/net/coderbot/iris/api/IIrisAware.java deleted file mode 100644 index e3b76f3e9..000000000 --- a/src/main/java/net/coderbot/iris/api/IIrisAware.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.coderbot.iris.api; - -public interface IIrisAware { - - /** - * Gets the number of subpasses required to render this block. - * Note: this has no relation to the vulkan concept, this is just a convenient name. - */ - int getSubpassCount(int meta); -} diff --git a/src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java b/src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java deleted file mode 100644 index 3e949dbf1..000000000 --- a/src/main/java/net/coderbot/iris/api/IIrisRenderBlocks.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.coderbot.iris.api; - -import net.minecraft.block.Block; - -import org.jetbrains.annotations.ApiStatus; - -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; - -/** - * Usage: - *
- *     public class YourISBRH implements ISimpleBlockRenderingHandler {
- *         ...
- *
- *         @Override
- *         public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
- *             if (renderer instanceof IIrisRenderBlocks iris) {
- *                 switch (iris.getCurrentSubpass()) {
- *                     case 0 -> iris.setShaderBlockId(yourblock1, 5);
- *                     case 1 -> iris.setShaderBlockId(yourblock2, 123);
- *                 }
- *             }
- *
- *             ...
- *         }
- *
- *         ...
- *     }
- * 
- */ -public interface IIrisRenderBlocks { - - @ApiStatus.Internal - void setCurrentSubpass(int subpass); - - @ApiStatus.Internal - void setBuffers(ChunkBuildBuffers buffers); - - /** Gets the current subpass. */ - int getCurrentSubpass(); - - /** Tells the shader to pretend the given block is the actual block (so that you can control the shader's behaviour). */ - void setShaderMaterialId(Block block, int meta); -} diff --git a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java index 333776da5..c52e99745 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java @@ -42,6 +42,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Properties; +import java.util.regex.Pattern; /** * A utility class for parsing entries in item.properties, block.properties, and entities.properties files in shaderpacks @@ -73,8 +74,6 @@ public class IdMap { @Getter private Map blockRenderTypeMap; - private boolean needsBlockLoad = true; - IdMap(Path shaderPath, ShaderPackOptions shaderPackOptions, Iterable environmentDefines) { itemIdMap = loadProperties(shaderPath, "item.properties", shaderPackOptions, environmentDefines).map(IdMap::parseItemIdMap).orElse(Object2IntMaps.emptyMap()); @@ -93,10 +92,10 @@ public class IdMap { LegacyIdMap.addLegacyValues(blockPropertiesMap); } - // if the game is already loaded, just load the blocks now - // otherwise we have to lazy load them + // if blocks aren't loaded, don't load the material lookup + // resources will be reloaded after postinit, so this will be re-ran later if (Loader.instance().hasReachedState(LoaderState.POSTINITIALIZATION)) { - loadBlockIdLookup(); + loadMaterialIdLookup(); } if (blockRenderTypeMap == null) { @@ -104,10 +103,7 @@ public class IdMap { } } - public synchronized void loadBlockIdLookup() { - if (!needsBlockLoad) return; - needsBlockLoad = false; - + private void loadMaterialIdLookup() { blockPropertiesMap.forEach((materialId, blockEntries) -> { for (BlockEntry entry : blockEntries) { Block block = entry.getId().getBlock(); @@ -239,6 +235,8 @@ private static Object2IntMap parseIdMap(Properties properties, Str return Object2IntMaps.unmodifiable(idMap); } + private static final Pattern PAT = Pattern.compile("((?\\w+):)?(?\\w+)(:(?(((?\\w+)=(?\\w+)|(?\\d+)),?)+))?"); + private static Int2ObjectMap> parseBlockMap(Properties properties, String keyPrefix, String fileName) { Int2ObjectMap> entriesById = new Int2ObjectOpenHashMap<>(); @@ -251,10 +249,10 @@ private static Int2ObjectMap> parseBlockMap(Properties properti return; } - final int intId; + final int matId; try { - intId = Integer.parseInt(key.substring(keyPrefix.length())); + matId = Integer.parseInt(key.substring(keyPrefix.length())); } catch (NumberFormatException e) { // Not a valid property line Iris.logger.warn("Failed to parse line in " + fileName + ": invalid key " + key); @@ -286,7 +284,7 @@ private static Int2ObjectMap> parseBlockMap(Properties properti } } - entriesById.put(intId, Collections.unmodifiableList(entries)); + entriesById.put(matId, Collections.unmodifiableList(entries)); }); return Int2ObjectMaps.unmodifiable(entriesById); @@ -331,8 +329,6 @@ private static Map parseRenderTypeMap(Properties public MaterialIdLookup getBlockIdLookup() { return (block, meta) -> { - if (needsBlockLoad) loadBlockIdLookup(); - Int2ShortFunction fn = blockPropertiesLookup.get(block); if (fn == null) return (short) 0; diff --git a/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java b/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java index 0f2a3fb7f..dbb018301 100644 --- a/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java +++ b/src/main/java/net/coderbot/iris/sodium/block_context/BlockContextHolder.java @@ -11,18 +11,18 @@ public class BlockContextHolder { public int localPosY; public int localPosZ; - public short materialId; + public short blockId; public short renderType; public BlockContextHolder() { this.lookup = (a, b) -> (short) -1; - this.materialId = -1; + this.blockId = -1; this.renderType = -1; } public BlockContextHolder(MaterialIdLookup lookup) { this.lookup = lookup; - this.materialId = -1; + this.blockId = -1; this.renderType = -1; } @@ -33,12 +33,12 @@ public void setLocalPos(int localPosX, int localPosY, int localPosZ) { } public void set(Block block, int meta, short renderType) { - this.materialId = this.lookup.get(block, meta); + this.blockId = this.lookup.get(block, meta); this.renderType = renderType; } public void reset() { - this.materialId = -1; + this.blockId = -1; this.renderType = -1; this.localPosX = 0; this.localPosY = 0; diff --git a/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java b/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java index a9d3d551f..a7b5b2ba7 100644 --- a/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java +++ b/src/main/java/net/coderbot/iris/sodium/block_context/ChunkBuildBuffersExt.java @@ -5,9 +5,6 @@ public interface ChunkBuildBuffersExt { void iris$setLocalPos(int localPosX, int localPosY, int localPosZ); - /** Sets the material id while keeping the renderType */ - void iris$setMaterialId(Block block, int meta); - void iris$setMaterialId(Block block, int meta, short renderType); void iris$resetBlockContext(); diff --git a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java index f86d57e23..992440801 100644 --- a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java +++ b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterNio.java @@ -42,7 +42,7 @@ public void writeQuad(float x, float y, float z, int color, float u, float v, in ModelVertexUtil.denormalizeVertexTextureFloatAsShort(u), ModelVertexUtil.denormalizeVertexTextureFloatAsShort(v), light, - contextHolder.materialId, + contextHolder.blockId, contextHolder.renderType, ExtendedDataHelper.computeMidBlock(x, y, z, contextHolder.localPosX, contextHolder.localPosY, contextHolder.localPosZ) ); diff --git a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java index 05ec99bf3..06de0b333 100644 --- a/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java +++ b/src/main/java/net/coderbot/iris/sodium/vertex_format/terrain_xhfp/XHFPModelVertexBufferWriterUnsafe.java @@ -42,7 +42,7 @@ public void writeQuad(float x, float y, float z, int color, float u, float v, in ModelVertexUtil.denormalizeVertexTextureFloatAsShort(u), ModelVertexUtil.denormalizeVertexTextureFloatAsShort(v), light, - contextHolder.materialId, + contextHolder.blockId, contextHolder.renderType, ExtendedDataHelper.computeMidBlock(x, y, z, contextHolder.localPosX, contextHolder.localPosY, contextHolder.localPosZ) ); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java deleted file mode 100644 index fa8cda2fc..000000000 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderBlocks.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gtnewhorizons.angelica.mixins.early.shaders; - -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; - -import me.jellysquid.mods.sodium.client.render.chunk.compile.ChunkBuildBuffers; -import net.coderbot.iris.api.IIrisRenderBlocks; - -@Mixin(RenderBlocks.class) -public class MixinRenderBlocks implements IIrisRenderBlocks { - - @Unique - private int subpass; - - @Unique - private ChunkBuildBuffers buffers; - - @Override - public void setCurrentSubpass(int subpass) { - this.subpass = subpass; - } - - @Override - public void setBuffers(ChunkBuildBuffers buffers) { - this.buffers = buffers; - } - - @Override - public int getCurrentSubpass() { - return subpass; - } - - @Override - public void setShaderMaterialId(Block block, int meta) { - if (buffers != null) { - buffers.iris$setMaterialId(block, meta); - } - } -} From 7b5b110d3a10883fba73e6ece731e2a387db941d Mon Sep 17 00:00:00 2001 From: RecursivePineapple Date: Sat, 15 Feb 2025 13:03:34 -0500 Subject: [PATCH 11/11] Fix id map loading & mat override tweaks --- .../gtnewhorizons/angelica/proxy/ClientProxy.java | 8 ++++++++ src/main/java/net/coderbot/iris/Iris.java | 6 +++--- .../java/net/coderbot/iris/shaderpack/IdMap.java | 12 +++++------- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java b/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java index c58157d02..2e169a506 100644 --- a/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java +++ b/src/main/java/com/gtnewhorizons/angelica/proxy/ClientProxy.java @@ -159,6 +159,8 @@ public void onKeypress(TickEvent.ClientTickEvent event) { wasGLSMKeyPressed = isPressed; } + public static boolean hitPostInit = false; + @Override public void postInit(FMLPostInitializationEvent event) { super.postInit(event); @@ -173,6 +175,12 @@ public void postInit(FMLPostInitializationEvent event) { LOGGER.error("Could not replace LOTR handle render code with thread safe version"); } } + + hitPostInit = true; + + if (AngelicaConfig.enableIris) { + Iris.getCurrentPack().ifPresent(pack -> pack.getIdMap().loadMaterialIdLookup()); + } } float lastIntegratedTickTime; diff --git a/src/main/java/net/coderbot/iris/Iris.java b/src/main/java/net/coderbot/iris/Iris.java index 9868920c4..976888c14 100644 --- a/src/main/java/net/coderbot/iris/Iris.java +++ b/src/main/java/net/coderbot/iris/Iris.java @@ -650,14 +650,14 @@ public void fmlInitEvent() { private static int getShaderMaterialOverrideId(Block block, int meta) { if (contextHolder == null) { - final Object2IntMap blockMatches = BlockRenderingSettings.INSTANCE.getBlockMatches(); + final MaterialIdLookup blockMatches = BlockRenderingSettings.INSTANCE.getLookup(); if (blockMatches == null) { return -1; } contextHolder = new BlockContextHolder(blockMatches); - } - contextHolder.set(block, (short) block.getRenderType()); + + contextHolder.set(block, meta, (short) block.getRenderType()); return contextHolder.blockId; } diff --git a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java index c52e99745..748ac3839 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java @@ -1,8 +1,7 @@ package net.coderbot.iris.shaderpack; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.LoaderState; +import com.gtnewhorizons.angelica.proxy.ClientProxy; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -92,9 +91,8 @@ public class IdMap { LegacyIdMap.addLegacyValues(blockPropertiesMap); } - // if blocks aren't loaded, don't load the material lookup - // resources will be reloaded after postinit, so this will be re-ran later - if (Loader.instance().hasReachedState(LoaderState.POSTINITIALIZATION)) { + // if blocks aren't loaded, don't load the material lookup immediately + if (ClientProxy.hitPostInit) { loadMaterialIdLookup(); } @@ -103,7 +101,7 @@ public class IdMap { } } - private void loadMaterialIdLookup() { + public void loadMaterialIdLookup() { blockPropertiesMap.forEach((materialId, blockEntries) -> { for (BlockEntry entry : blockEntries) { Block block = entry.getId().getBlock(); @@ -331,7 +329,7 @@ public MaterialIdLookup getBlockIdLookup() { return (block, meta) -> { Int2ShortFunction fn = blockPropertiesLookup.get(block); - if (fn == null) return (short) 0; + if (fn == null) return (short) -1; return fn.get(meta); };