diff --git a/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/impl/client/indigo/renderer/render/ItemRenderContext.java b/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/impl/client/indigo/renderer/render/ItemRenderContext.java index 6badb4ce3..0fd0892e5 100644 --- a/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/impl/client/indigo/renderer/render/ItemRenderContext.java +++ b/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/impl/client/indigo/renderer/render/ItemRenderContext.java @@ -37,6 +37,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MatrixUtil; import net.minecraft.util.math.random.Random; import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; @@ -47,6 +48,7 @@ import net.fabricmc.fabric.impl.client.indigo.renderer.helper.ColorHelper; import net.fabricmc.fabric.impl.client.indigo.renderer.mesh.EncodingFormat; import net.fabricmc.fabric.impl.client.indigo.renderer.mesh.MutableQuadViewImpl; import net.fabricmc.fabric.impl.renderer.VanillaModelEncoder; +import net.fabricmc.fabric.mixin.client.indigo.renderer.ItemRendererAccessor; /** * The render context used for item rendering. @@ -85,7 +87,9 @@ public class ItemRenderContext extends AbstractRenderContext { private boolean isDefaultTranslucent; private boolean isTranslucentDirect; private boolean isDefaultGlint; + private boolean isGlintDynamicDisplay; + private MatrixStack.Entry dynamicDisplayGlintEntry; private VertexConsumer translucentVertexConsumer; private VertexConsumer cutoutVertexConsumer; private VertexConsumer translucentGlintVertexConsumer; @@ -134,6 +138,7 @@ public class ItemRenderContext extends AbstractRenderContext { this.matrixStack = null; this.vertexConsumerProvider = null; + dynamicDisplayGlintEntry = null; translucentVertexConsumer = null; cutoutVertexConsumer = null; translucentGlintVertexConsumer = null; @@ -160,6 +165,7 @@ public class ItemRenderContext extends AbstractRenderContext { } isDefaultGlint = itemStack.hasGlint(); + isGlintDynamicDisplay = ItemRendererAccessor.fabric_callUsesDynamicDisplay(itemStack); } private void renderQuad(MutableQuadViewImpl quad) { @@ -179,7 +185,7 @@ public class ItemRenderContext extends AbstractRenderContext { private void colorizeQuad(MutableQuadViewImpl quad, int colorIndex) { if (colorIndex != -1) { - final int itemColor = 0xFF000000 | colorMap.getColor(itemStack, colorIndex); + final int itemColor = colorMap.getColor(itemStack, colorIndex); for (int i = 0; i < 4; i++) { quad.color(i, ColorHelper.multiplyColor(itemColor, quad.color(i))); @@ -254,6 +260,10 @@ public class ItemRenderContext extends AbstractRenderContext { } private VertexConsumer createTranslucentVertexConsumer(boolean glint) { + if (glint && isGlintDynamicDisplay) { + return createDynamicDisplayGlintVertexConsumer(MinecraftClient.isFabulousGraphicsOrBetter() && !isTranslucentDirect ? TexturedRenderLayers.getItemEntityTranslucentCull() : TexturedRenderLayers.getEntityTranslucentCull()); + } + if (isTranslucentDirect) { return ItemRenderer.getDirectItemGlintConsumer(vertexConsumerProvider, TexturedRenderLayers.getEntityTranslucentCull(), true, glint); } else if (MinecraftClient.isFabulousGraphicsOrBetter()) { @@ -264,9 +274,27 @@ public class ItemRenderContext extends AbstractRenderContext { } private VertexConsumer createCutoutVertexConsumer(boolean glint) { + if (glint && isGlintDynamicDisplay) { + return createDynamicDisplayGlintVertexConsumer(TexturedRenderLayers.getEntityCutout()); + } + return ItemRenderer.getDirectItemGlintConsumer(vertexConsumerProvider, TexturedRenderLayers.getEntityCutout(), true, glint); } + private VertexConsumer createDynamicDisplayGlintVertexConsumer(RenderLayer layer) { + if (dynamicDisplayGlintEntry == null) { + dynamicDisplayGlintEntry = matrixStack.peek().copy(); + + if (transformMode == ModelTransformationMode.GUI) { + MatrixUtil.scale(dynamicDisplayGlintEntry.getPositionMatrix(), 0.5F); + } else if (transformMode.isFirstPerson()) { + MatrixUtil.scale(dynamicDisplayGlintEntry.getPositionMatrix(), 0.75F); + } + } + + return ItemRenderer.getDynamicDisplayGlintConsumer(vertexConsumerProvider, layer, dynamicDisplayGlintEntry); + } + private class BakedModelConsumerImpl implements BakedModelConsumer { @Override public void accept(BakedModel model) { diff --git a/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/mixin/client/indigo/renderer/ItemRendererAccessor.java b/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/mixin/client/indigo/renderer/ItemRendererAccessor.java new file mode 100644 index 000000000..dc023ec7e --- /dev/null +++ b/fabric-renderer-indigo/src/client/java/net/fabricmc/fabric/mixin/client/indigo/renderer/ItemRendererAccessor.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.indigo.renderer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.item.ItemStack; + +@Mixin(ItemRenderer.class) +public interface ItemRendererAccessor { + @Invoker("usesDynamicDisplay") + static boolean fabric_callUsesDynamicDisplay(ItemStack stack) { + throw new AssertionError(); + } +} diff --git a/fabric-renderer-indigo/src/client/resources/fabric-renderer-indigo.mixins.json b/fabric-renderer-indigo/src/client/resources/fabric-renderer-indigo.mixins.json index 92b91c4d8..f7adfac5a 100644 --- a/fabric-renderer-indigo/src/client/resources/fabric-renderer-indigo.mixins.json +++ b/fabric-renderer-indigo/src/client/resources/fabric-renderer-indigo.mixins.json @@ -8,9 +8,10 @@ "client": [ "BakedModelMixin", "BlockModelRendererMixin", - "SectionBuilderMixin", "ChunkRendererRegionMixin", - "ItemRendererMixin" + "ItemRendererAccessor", + "ItemRendererMixin", + "SectionBuilderMixin" ], "injectors": { "defaultRequire": 1