From 1efb23f891e3cf73fdb373ce50bb7b5e840d3d3a Mon Sep 17 00:00:00 2001 From: Naz Date: Sat, 13 Jul 2024 09:10:24 +0800 Subject: [PATCH] Fixed AE2 terminal not rendering correctly --- .../rendering/FabricBakedModelMixin.java | 14 ++++++++++++++ .../rendering/VanillaModelEncoderMixin.java | 16 +++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/FabricBakedModelMixin.java b/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/FabricBakedModelMixin.java index 13b54d5..5455796 100644 --- a/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/FabricBakedModelMixin.java +++ b/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/FabricBakedModelMixin.java @@ -2,11 +2,13 @@ import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -16,8 +18,20 @@ @Mixin(FabricBakedModel.class) public interface FabricBakedModelMixin { + /** + * @author BluSpring + * @reason Otherwise, Forge models wouldn't get rendered correctly. + */ + @Overwrite(remap = false) + public default boolean isVanillaAdapter() { + return false; + } + @Inject(method = "emitBlockQuads", at = @At("HEAD")) private void kilt$storeVariables(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context, CallbackInfo ci) { + if (!(blockView instanceof ClientLevel)) + return; + FRAPIThreadedStorage.LEVEL.set(blockView); FRAPIThreadedStorage.POS.set(pos); } diff --git a/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/VanillaModelEncoderMixin.java b/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/VanillaModelEncoderMixin.java index 6a17b2d..659633e 100644 --- a/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/VanillaModelEncoderMixin.java +++ b/src/main/java/xyz/bluspring/kilt/mixin/compat/fabric_api/rendering/VanillaModelEncoderMixin.java @@ -16,6 +16,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.ChunkRenderTypeSet; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelDataManager; import org.spongepowered.asm.mixin.Final; @@ -24,6 +25,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; import xyz.bluspring.kilt.helpers.FRAPIThreadedStorage; +import xyz.bluspring.kilt.injections.client.renderer.ItemBlockRenderTypesInjection; import java.util.LinkedList; import java.util.List; @@ -47,11 +49,16 @@ public class VanillaModelEncoderMixin { if (modelDataManager == null) return original.call(model, state, direction, randomSource); - mappedRenderTypes.set(new LinkedList<>()); - var modelData = model.getModelData(level, pos, state, modelDataManager.getAt(new ChunkPos(pos)).getOrDefault(pos, ModelData.EMPTY)); var renderTypes = model.getRenderTypes(state, randomSource, modelData); + if (modelData == ModelData.EMPTY && (renderTypes.isEmpty() || + // TODO: this may cause performance issues, and might not actually be what we want, so. + ChunkRenderTypeSet.intersection(ItemBlockRenderTypesInjection.getRenderLayers(state), renderTypes).asList().size() == renderTypes.asList().size()) + ) + return original.call(model, state, direction, randomSource); + + mappedRenderTypes.set(new LinkedList<>()); var list = new LinkedList(); for (RenderType renderType : renderTypes) { @@ -70,9 +77,12 @@ public class VanillaModelEncoderMixin { @ModifyArg(method = "emitBlockQuads", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/api/renderer/v1/mesh/QuadEmitter;fromVanilla(Lnet/minecraft/client/renderer/block/model/BakedQuad;Lnet/fabricmc/fabric/api/renderer/v1/material/RenderMaterial;Lnet/minecraft/core/Direction;)Lnet/fabricmc/fabric/api/renderer/v1/mesh/QuadEmitter;")) private static RenderMaterial kilt$useMappedRenderType(RenderMaterial material, @Share("renderTypes") LocalRef> mappedRenderTypes, @Local(ordinal = 2) int j) { var mapped = mappedRenderTypes.get(); - if (mapped == null) + if (mapped == null || mapped.isEmpty()) return material; + if (j >= mapped.size()) + mappedRenderTypes.set(null); + var renderType = mapped.get(j); // TODO: figure out a way to check all other values