|
| 1 | +package org.embeddedt.modernfix.common.mixin.perf.faster_item_rendering; |
| 2 | + |
| 3 | +import net.minecraft.client.renderer.block.model.ItemTransform; |
| 4 | +import net.minecraft.client.renderer.item.ItemStackRenderState; |
| 5 | +import net.minecraft.client.resources.model.BakedModel; |
| 6 | +import net.minecraft.client.resources.model.SimpleBakedModel; |
| 7 | +import net.minecraft.world.item.ItemDisplayContext; |
| 8 | +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; |
| 9 | +import org.embeddedt.modernfix.render.FastItemRenderType; |
| 10 | +import org.embeddedt.modernfix.render.RenderState; |
| 11 | +import org.embeddedt.modernfix.render.SimpleItemModelView; |
| 12 | +import org.spongepowered.asm.mixin.Final; |
| 13 | +import org.spongepowered.asm.mixin.Mixin; |
| 14 | +import org.spongepowered.asm.mixin.Shadow; |
| 15 | +import org.spongepowered.asm.mixin.Unique; |
| 16 | +import org.spongepowered.asm.mixin.injection.At; |
| 17 | +import org.spongepowered.asm.mixin.injection.ModifyArg; |
| 18 | + |
| 19 | +@Mixin(value = ItemStackRenderState.LayerRenderState.class, priority = 600) |
| 20 | +@ClientOnlyMixin |
| 21 | +public abstract class LayerRenderStateMixin { |
| 22 | + @Shadow @Final private ItemStackRenderState field_55345; |
| 23 | + |
| 24 | + @Shadow abstract ItemTransform transform(); |
| 25 | + |
| 26 | + @Unique |
| 27 | + private final SimpleItemModelView modelView = new SimpleItemModelView(); |
| 28 | + |
| 29 | + /** |
| 30 | + * If a model |
| 31 | + * - is a vanilla item model (SimpleBakedModel), |
| 32 | + * - has no custom GUI transforms, and |
| 33 | + * - is being rendered in 2D on a GUI |
| 34 | + * we do not need to go through the process of rendering every quad. Just render the south ones (the ones facing the |
| 35 | + * camera). |
| 36 | + */ |
| 37 | + @ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/ItemRenderer;renderItem(Lnet/minecraft/world/item/ItemDisplayContext;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;II[ILnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/client/renderer/RenderType;Lnet/minecraft/client/renderer/item/ItemStackRenderState$FoilType;)V"), index = 6) |
| 38 | + private BakedModel useSimpleWrappedItemModel(BakedModel model) { |
| 39 | + var transformType = ((ItemStackRenderStateAccessor)this.field_55345).getDisplayContext(); |
| 40 | + // Forge composite models split themselves into a smaller simple model, we need to detect that the parent |
| 41 | + // was not simple |
| 42 | + // TODO 1.21.4 - I don't think that is needed anymore with the changes to item rendering |
| 43 | + /* |
| 44 | + if(originalModel != null && originalModel.getClass() != SimpleBakedModel.class) { |
| 45 | + return model; |
| 46 | + } |
| 47 | + */ |
| 48 | + |
| 49 | + if(!RenderState.IS_RENDERING_LEVEL && model.getClass() == SimpleBakedModel.class && transformType == ItemDisplayContext.GUI) { |
| 50 | + FastItemRenderType type; |
| 51 | + ItemTransform transform = this.transform(); |
| 52 | + if(transform == ItemTransform.NO_TRANSFORM) |
| 53 | + type = FastItemRenderType.SIMPLE_ITEM; |
| 54 | + else if(model.isGui3d() && isBlockTransforms(transform)) |
| 55 | + type = FastItemRenderType.SIMPLE_BLOCK; |
| 56 | + else |
| 57 | + return model; |
| 58 | + modelView.setItem(model); |
| 59 | + modelView.setType(type); |
| 60 | + return modelView; |
| 61 | + } else |
| 62 | + return model; |
| 63 | + } |
| 64 | + |
| 65 | + private boolean isBlockTransforms(ItemTransform transform) { |
| 66 | + return transform.rotation.x() == 30f |
| 67 | + && transform.rotation.y() == 225f |
| 68 | + && transform.rotation.z() == 0f; |
| 69 | + } |
| 70 | +} |
0 commit comments