From dccb1ab3a443cb669e39cef99ee87c6ba1a31d9b Mon Sep 17 00:00:00 2001 From: Dennis C Date: Sun, 11 Dec 2022 21:25:14 +0100 Subject: [PATCH] [1.19.3] Fix models nested in custom geometries not resolving parents (#9200) --- .../renderer/block/model/BlockModel.java.patch | 11 +++++++++++ .../minecraftforge/client/model/CompositeModel.java | 7 +++++++ .../client/model/SeparateTransformsModel.java | 8 ++++++++ .../client/model/geometry/IUnbakedGeometry.java | 12 ++++++++++++ .../debug/block/FullPotsAccessorDemo.java | 6 ++++++ 5 files changed, 44 insertions(+) diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch index b9ea8ddd50..fc0b0fdd0c 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModel.java.patch @@ -39,6 +39,17 @@ public Collection m_7970_() { Set set = Sets.newHashSet(); +@@ -127,6 +_,10 @@ + } + + public void m_5500_(Function p_249059_) { ++ if (customData.hasCustomGeometry()) { ++ customData.getCustomGeometry().resolveParents(p_249059_, customData); ++ } ++ + Set set = Sets.newLinkedHashSet(); + + for(BlockModel blockmodel = this; blockmodel.f_111419_ != null && blockmodel.f_111418_ == null; blockmodel = blockmodel.f_111418_) { @@ -161,11 +_,24 @@ }); } diff --git a/src/main/java/net/minecraftforge/client/model/CompositeModel.java b/src/main/java/net/minecraftforge/client/model/CompositeModel.java index d2e268f4ac..5063a38ecb 100644 --- a/src/main/java/net/minecraftforge/client/model/CompositeModel.java +++ b/src/main/java/net/minecraftforge/client/model/CompositeModel.java @@ -30,6 +30,7 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelState; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; @@ -112,6 +113,12 @@ public class CompositeModel implements IUnbakedGeometry return new Baked(context.isGui3d(), context.useBlockLight(), context.useAmbientOcclusion(), particle, context.getTransforms(), overrides, bakedParts, itemPassesBuilder.build()); } + @Override + public void resolveParents(Function modelGetter, IGeometryBakingContext context) + { + children.values().forEach(child -> child.resolveParents(modelGetter)); + } + @Override public Set getConfigurableComponentNames() { diff --git a/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java b/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java index d1b513c907..6c027dcc0b 100644 --- a/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java +++ b/src/main/java/net/minecraftforge/client/model/SeparateTransformsModel.java @@ -24,6 +24,7 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelState; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; @@ -78,6 +79,13 @@ public class SeparateTransformsModel implements IUnbakedGeometry modelGetter, IGeometryBakingContext context) + { + baseModel.resolveParents(modelGetter); + perspectives.values().forEach(model -> model.resolveParents(modelGetter)); + } + public static class Baked implements IDynamicBakedModel { private final boolean isAmbientOcclusion; 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 a6ea924fe8..a9b8073dfe 100644 --- a/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java +++ b/src/main/java/net/minecraftforge/client/model/geometry/IUnbakedGeometry.java @@ -7,6 +7,8 @@ package net.minecraftforge.client.model.geometry; import java.util.Set; import java.util.function.Function; + +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; @@ -28,6 +30,16 @@ public interface IUnbakedGeometry> { BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides, ResourceLocation modelLocation); + /** + * Resolve parents of nested {@link BlockModel}s which are later used in + * {@link IUnbakedGeometry#bake(IGeometryBakingContext, ModelBaker, Function, ModelState, ItemOverrides, ResourceLocation)} + * via {@link BlockModel#resolveParents(Function)} + */ + default void resolveParents(Function modelGetter, IGeometryBakingContext context) + { + + } + /** * {@return a set of all the components whose visibility may be configured via {@link IGeometryBakingContext}} */ diff --git a/src/test/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java b/src/test/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java index 7dceead706..f364001948 100644 --- a/src/test/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java +++ b/src/test/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java @@ -266,6 +266,12 @@ public class FullPotsAccessorDemo public BakedModel bake(IGeometryBakingContext context, ModelBaker baker, Function spriteGetter, ModelState modelState, ItemOverrides overrides, ResourceLocation modelLocation) { return new DioritePotModel(wrappedModel.bake(baker, spriteGetter, modelState, modelLocation)); } + + @Override + public void resolveParents(Function modelGetter, IGeometryBakingContext context) + { + wrappedModel.resolveParents(modelGetter); + } } private static class DioritePotModel extends BakedModelWrapper