diff --git a/common/src/main/java/net/irisshaders/batchedentityrendering/impl/FullyBufferedMultiBufferSource.java b/common/src/main/java/net/irisshaders/batchedentityrendering/impl/FullyBufferedMultiBufferSource.java index b43a8e1d45..b7acd25d04 100644 --- a/common/src/main/java/net/irisshaders/batchedentityrendering/impl/FullyBufferedMultiBufferSource.java +++ b/common/src/main/java/net/irisshaders/batchedentityrendering/impl/FullyBufferedMultiBufferSource.java @@ -144,17 +144,22 @@ public void endBatch() { type.setupRenderState(); + boolean previousMergeRendering = ImmediateState.mergeRendering; + RenderType previousMergedRenderType = ImmediateState.mergedRenderType; ImmediateState.mergeRendering = true; - - - for (BufferSegment segment : segments) { - segment.type().draw(segment.meshData()); - drawCalls += 1; + ImmediateState.mergedRenderType = type; + + try { + for (BufferSegment segment : segments) { + segment.type().draw(segment.meshData()); + drawCalls += 1; + } + } finally { + ImmediateState.mergeRendering = previousMergeRendering; + ImmediateState.mergedRenderType = previousMergedRenderType; + type.clearRenderState(); } - - type.clearRenderState(); } - ImmediateState.mergeRendering = false; int targetClearTime = getTargetClearTime(); @@ -192,19 +197,24 @@ public void endBatchWithType(TransparencyType transparencyType) { type.setupRenderState(); + boolean previousMergeRendering = ImmediateState.mergeRendering; + RenderType previousMergedRenderType = ImmediateState.mergedRenderType; ImmediateState.mergeRendering = true; - - - for (BufferSegment segment : segments) { - segment.type().draw(segment.meshData()); - drawCalls += 1; + ImmediateState.mergedRenderType = type; + + try { + for (BufferSegment segment : segments) { + segment.type().draw(segment.meshData()); + drawCalls += 1; + } + } finally { + ImmediateState.mergeRendering = previousMergeRendering; + ImmediateState.mergedRenderType = previousMergedRenderType; + type.clearRenderState(); } typeToSegment.remove(type); - - type.clearRenderState(); } - ImmediateState.mergeRendering = false; profiler.popPush("reset type " + transparencyType); diff --git a/common/src/main/java/net/irisshaders/iris/layer/InnerWrappedRenderType.java b/common/src/main/java/net/irisshaders/iris/layer/InnerWrappedRenderType.java index b4f37b26d9..3f4e0dbf14 100644 --- a/common/src/main/java/net/irisshaders/iris/layer/InnerWrappedRenderType.java +++ b/common/src/main/java/net/irisshaders/iris/layer/InnerWrappedRenderType.java @@ -1,6 +1,5 @@ package net.irisshaders.iris.layer; -import com.mojang.blaze3d.vertex.MeshData; import net.irisshaders.batchedentityrendering.impl.BlendingStateHolder; import net.irisshaders.batchedentityrendering.impl.TransparencyType; import net.irisshaders.batchedentityrendering.impl.WrappableRenderType; @@ -92,11 +91,6 @@ public String toString() { return "iris_wrapped:" + this.wrapped.toString(); } - @Override - public void draw(MeshData meshData) { - wrapped.draw(meshData); - } - @Override public TransparencyType getTransparencyType() { return ((BlendingStateHolder) wrapped).getTransparencyType(); diff --git a/common/src/main/java/net/irisshaders/iris/layer/OuterWrappedRenderType.java b/common/src/main/java/net/irisshaders/iris/layer/OuterWrappedRenderType.java index 18954f6734..f695c6be94 100644 --- a/common/src/main/java/net/irisshaders/iris/layer/OuterWrappedRenderType.java +++ b/common/src/main/java/net/irisshaders/iris/layer/OuterWrappedRenderType.java @@ -1,6 +1,5 @@ package net.irisshaders.iris.layer; -import com.mojang.blaze3d.vertex.MeshData; import net.irisshaders.batchedentityrendering.impl.BlendingStateHolder; import net.irisshaders.batchedentityrendering.impl.TransparencyType; import net.irisshaders.batchedentityrendering.impl.WrappableRenderType; @@ -87,11 +86,6 @@ public int hashCode() { return this.wrapped.hashCode() + 1; } - @Override - public void draw(MeshData meshData) { - wrapped.draw(meshData); - } - @Override public String toString() { return "iris_wrapped:" + this.wrapped.toString(); diff --git a/common/src/main/java/net/irisshaders/iris/mixin/MixinRenderType.java b/common/src/main/java/net/irisshaders/iris/mixin/MixinRenderType.java index ab03b012fc..b2db406abf 100644 --- a/common/src/main/java/net/irisshaders/iris/mixin/MixinRenderType.java +++ b/common/src/main/java/net/irisshaders/iris/mixin/MixinRenderType.java @@ -4,21 +4,24 @@ import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(RenderType.class) public class MixinRenderType { @Redirect(method = "draw", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderType;setupRenderState()V")) private void redirectSetupRenderState(RenderType renderType) { - if (!ImmediateState.mergeRendering) { + if (!shouldSkipRenderState(renderType)) { renderType.setupRenderState(); } } @Redirect(method = "draw", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderType;clearRenderState()V")) private void redirectClearRenderState(RenderType renderType) { - if (!ImmediateState.mergeRendering) { + if (!shouldSkipRenderState(renderType)) { renderType.clearRenderState(); } } + + private static boolean shouldSkipRenderState(RenderType renderType) { + return ImmediateState.mergeRendering && ImmediateState.mergedRenderType == renderType; + } } diff --git a/common/src/main/java/net/irisshaders/iris/vertices/ImmediateState.java b/common/src/main/java/net/irisshaders/iris/vertices/ImmediateState.java index 19db426112..f26fd6c8df 100644 --- a/common/src/main/java/net/irisshaders/iris/vertices/ImmediateState.java +++ b/common/src/main/java/net/irisshaders/iris/vertices/ImmediateState.java @@ -1,5 +1,7 @@ package net.irisshaders.iris.vertices; +import net.minecraft.client.renderer.RenderType; + /** * Some annoying global state needed for rendering. */ @@ -10,4 +12,5 @@ public class ImmediateState { public static boolean renderWithExtendedVertexFormat = true; public static boolean bypass; public static boolean mergeRendering; + public static RenderType mergedRenderType; }