diff --git a/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch index 08b1521a3c..b87e442422 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/BlockRenderDispatcher.java.patch @@ -51,12 +51,13 @@ RenderShape rendershape = p_110913_.m_60799_(); if (rendershape != RenderShape.INVISIBLE) { switch (rendershape) { -@@ -97,10 +_,11 @@ +@@ -97,10 +_,12 @@ float f = (float)(i >> 16 & 255) / 255.0F; float f1 = (float)(i >> 8 & 255) / 255.0F; float f2 = (float)(i & 255) / 255.0F; - this.f_110900_.m_111067_(p_110914_.m_85850_(), p_110915_.m_6299_(ItemBlockRenderTypes.m_109284_(p_110913_, false)), p_110913_, bakedmodel, f, f1, f2, p_110916_, p_110917_); -+ this.f_110900_.renderModel(p_110914_.m_85850_(), p_110915_.m_6299_(ItemBlockRenderTypes.m_109284_(p_110913_, false)), p_110913_, bakedmodel, f, f1, f2, p_110916_, p_110917_, modelData, renderType); ++ for (net.minecraft.client.renderer.RenderType rt : bakedmodel.getRenderTypes(p_110913_, RandomSource.m_216335_(42), modelData)) ++ this.f_110900_.renderModel(p_110914_.m_85850_(), p_110915_.m_6299_(renderType != null ? renderType : net.minecraftforge.client.ForgeHooksClient.getEntityRenderType(rt, false)), p_110913_, bakedmodel, f, f1, f2, p_110916_, p_110917_, modelData, rt); break; case ENTITYBLOCK_ANIMATED: - this.f_173397_.m_108829_(new ItemStack(p_110913_.m_60734_()), ItemTransforms.TransformType.NONE, p_110914_, p_110915_, p_110916_, p_110917_); diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index b221ccdd3e..8453784a38 100755 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -953,6 +953,20 @@ public class ForgeHooksClient return MinecraftForge.EVENT_BUS.post(event) ? "" : event.getMessage(); } + /** + * Mimics the behavior of {@link net.minecraft.client.renderer.ItemBlockRenderTypes#getRenderType(BlockState, boolean)} + * for the input {@link RenderType}. + */ + @NotNull + public static RenderType getEntityRenderType(RenderType chunkRenderType, boolean fabulous) + { + if (chunkRenderType != RenderType.translucent()) + return Sheets.cutoutBlockSheet(); + if (!Minecraft.useShaderTransparency()) + return Sheets.translucentCullBlockSheet(); + return fabulous ? Sheets.translucentCullBlockSheet() : Sheets.translucentItemSheet(); + } + @Mod.EventBusSubscriber(value = Dist.CLIENT, modid="forge", bus= Mod.EventBusSubscriber.Bus.MOD) public static class ClientEvents { diff --git a/src/main/java/net/minecraftforge/client/model/CompositeModel.java b/src/main/java/net/minecraftforge/client/model/CompositeModel.java index c9b0548103..9bb9f96cd1 100644 --- a/src/main/java/net/minecraftforge/client/model/CompositeModel.java +++ b/src/main/java/net/minecraftforge/client/model/CompositeModel.java @@ -125,6 +125,12 @@ public class CompositeModel implements IUnbakedGeometry return textures; } + @Override + public Set getConfigurableComponentNames() + { + return children.keySet(); + } + public static class Baked implements IDynamicBakedModel { private final boolean isAmbientOcclusion; diff --git a/src/main/java/net/minecraftforge/client/model/geometry/BlockGeometryBakingContext.java b/src/main/java/net/minecraftforge/client/model/geometry/BlockGeometryBakingContext.java index 91e8810c57..37c003a537 100644 --- a/src/main/java/net/minecraftforge/client/model/geometry/BlockGeometryBakingContext.java +++ b/src/main/java/net/minecraftforge/client/model/geometry/BlockGeometryBakingContext.java @@ -147,6 +147,7 @@ public class BlockGeometryBakingContext implements IGeometryBakingContext this.customGeometry = other.customGeometry; this.rootTransform = other.rootTransform; this.visibilityData.copyFrom(other.visibilityData); + this.renderTypeHint = other.renderTypeHint; } public Collection getTextureDependencies(Function modelGetter, Set> missingTextureErrors) diff --git a/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java b/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java index 227d364752..78bdb56114 100644 --- a/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java +++ b/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java @@ -32,4 +32,12 @@ public interface IUnbakedGeometry> BakedModel bake(IGeometryBakingContext context, ModelBakery bakery, Function spriteGetter, ModelState modelState, ItemOverrides overrides, ResourceLocation modelLocation); Collection getMaterials(IGeometryBakingContext context, Function modelGetter, Set> missingTextureErrors); + + /** + * {@return a set of all the components whose visibility may be configured via {@link IGeometryBakingContext}} + */ + default Set getConfigurableComponentNames() + { + return Set.of(); + } } diff --git a/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java b/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java index a1c92a8bfb..034b9f12a0 100644 --- a/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java +++ b/src/main/java/net/minecraftforge/client/model/obj/ObjModel.java @@ -40,6 +40,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -67,6 +69,8 @@ public class ObjModel extends SimpleUnbakedGeometry }; private final Map parts = Maps.newHashMap(); + private final Set rootComponentNames = Collections.unmodifiableSet(parts.keySet()); + private Set allComponentNames; private final List positions = Lists.newArrayList(); private final List texCoords = Lists.newArrayList(); @@ -360,6 +364,22 @@ public class ObjModel extends SimpleUnbakedGeometry return combined; } + public Set getRootComponentNames() + { + return rootComponentNames; + } + + @Override + public Set getConfigurableComponentNames() + { + if (allComponentNames != null) + return allComponentNames; + var names = new HashSet(); + for (var group : parts.values()) + group.addNamesRecursively(names); + return allComponentNames = Collections.unmodifiableSet(names); + } + private Pair makeQuad(int[][] indices, int tintIndex, Vector4f colorTint, Vector4f ambientColor, TextureAtlasSprite texture, Transformation transform) { boolean needsNormalRecalculation = false; @@ -553,6 +573,11 @@ public class ObjModel extends SimpleUnbakedGeometry : Stream.of()) .collect(Collectors.toSet()); } + + protected void addNamesRecursively(Set names) + { + names.add(name()); + } } public class ModelGroup extends ModelObject @@ -595,6 +620,14 @@ public class ObjModel extends SimpleUnbakedGeometry combined.addAll(part.getTextures(owner, modelGetter, missingTextureErrors)); return combined; } + + @Override + protected void addNamesRecursively(Set names) + { + super.addNamesRecursively(names); + for (ModelObject object : parts.values()) + object.addNamesRecursively(names); + } } private class ModelMesh