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/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/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/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java b/src/main/java/com/gtnewhorizons/angelica/utils/AnimationsRenderUtils.java index cb446f19a..75a636ac6 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,26 @@ 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()) { + // icon was used outside of chunk building, it's probably an item in an inventory or something + sprite.markNeedsAnimationUpdate(); + 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/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/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..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 @@ -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(); } @@ -156,16 +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, short renderType) { + @Override + public void iris$setMaterialId(Block block, int meta, short renderType) { if(!AngelicaConfig.enableIris) return; - this.iris$contextHolder.set(block, renderType); + 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/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/chunk/tasks/ChunkRenderRebuildTask.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/tasks/ChunkRenderRebuildTask.java index 0cc07a25a..bff11566a 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(); @@ -172,7 +176,10 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB 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(cache.getWorldSlice(), renderBlocks, block, meta, pos, buffers.get(pass), true, seed)) { bounds.addBlock(relX, relY, relZ); @@ -189,7 +196,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); @@ -217,6 +226,10 @@ public ChunkBuildResult performBuild(ChunkRenderCacheLocal cache, ChunkBuildB } } + if(renderBlocks instanceof ITexturesCache) { + AnimationsRenderUtils.popCache(); + } + handleRenderBlocksTextures(renderBlocks, renderData); if(hasMainThreadBlocks) { @@ -263,7 +276,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()) { @@ -292,7 +308,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); @@ -303,6 +321,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/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..976888c14 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 MaterialIdLookup blockMatches = BlockRenderingSettings.INSTANCE.getLookup(); + if (blockMatches == null) { + return -1; + } + contextHolder = new BlockContextHolder(blockMatches); + } + + contextHolder.set(block, meta, (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/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/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..486a4c5ba 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,12 +38,12 @@ public static int create(String name, GlShader... shaders) { String log = RenderSystem.getProgramInfoLog(program); - if (!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"); } 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..748ac3839 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/IdMap.java +++ b/src/main/java/net/coderbot/iris/shaderpack/IdMap.java @@ -1,18 +1,28 @@ package net.coderbot.iris.shaderpack; +import com.gtnewhorizons.angelica.config.AngelicaConfig; +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; -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; @@ -31,6 +41,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 @@ -39,22 +50,28 @@ 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; IdMap(Path shaderPath, ShaderPackOptions shaderPackOptions, Iterable environmentDefines) { itemIdMap = loadProperties(shaderPath, "item.properties", shaderPackOptions, environmentDefines).map(IdMap::parseItemIdMap).orElse(Object2IntMaps.emptyMap()); @@ -74,11 +91,53 @@ public class IdMap { LegacyIdMap.addLegacyValues(blockPropertiesMap); } - if (blockRenderTypeMap == null) { + // if blocks aren't loaded, don't load the material lookup immediately + if (ClientProxy.hitPostInit) { + loadMaterialIdLookup(); + } + + if (blockRenderTypeMap == null) { blockRenderTypeMap = Collections.emptyMap(); } } + public void loadMaterialIdLookup() { + 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 */ @@ -174,6 +233,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<>(); @@ -186,10 +247,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); @@ -221,7 +282,7 @@ private static Int2ObjectMap> parseBlockMap(Properties properti } } - entriesById.put(intId, Collections.unmodifiableList(entries)); + entriesById.put(matId, Collections.unmodifiableList(entries)); }); return Int2ObjectMaps.unmodifiable(entriesById); @@ -264,23 +325,17 @@ private static Map parseRenderTypeMap(Properties return overrides; } - public Int2ObjectMap> getBlockProperties() { - return blockPropertiesMap; - } - - public Object2IntFunction getItemIdMap() { - return itemIdMap; - } + public MaterialIdLookup getBlockIdLookup() { + return (block, meta) -> { + Int2ShortFunction fn = blockPropertiesLookup.get(block); - public Object2IntFunction getEntityIdMap() { - return entityIdMap; - } + if (fn == null) return (short) -1; - 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..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 @@ -1,11 +1,11 @@ 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; @@ -15,13 +15,13 @@ public class BlockContextHolder { public short renderType; public BlockContextHolder() { - this.blockMatches = Object2IntMaps.emptyMap(); + this.lookup = (a, b) -> (short) -1; this.blockId = -1; this.renderType = -1; } - public BlockContextHolder(Object2IntMap idMap) { - this.blockMatches = idMap; + public BlockContextHolder(MaterialIdLookup lookup) { + this.lookup = lookup; this.blockId = -1; this.renderType = -1; } @@ -32,8 +32,8 @@ 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.blockId = this.lookup.get(block, meta); this.renderType = renderType; } 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..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,7 +5,7 @@ public interface ChunkBuildBuffersExt { void iris$setLocalPos(int localPosX, int localPosY, int localPosZ); - void iris$setMaterialId(Block block, short renderType); + 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 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) ); 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); 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..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 @@ -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,36 +39,36 @@ 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) { icon = overrideBlockTexture; } - AnimationsRenderUtils.markBlockTextureForUpdate(icon, blockAccess); - - if(this.enableSpriteTracking) - this.renderedSprites.add(icon); - } + if (icon != null) { + AnimationsRenderUtils.markBlockTextureForUpdate(icon, blockAccess); - @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)); + if(this.enableSpriteTracking) { + 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 +82,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) { + + } }