From 896db6398fff87afb250e8d943d27fde32c5142d Mon Sep 17 00:00:00 2001 From: Ben Staddon Date: Fri, 23 Nov 2018 23:28:30 +0000 Subject: [PATCH] Fix Baked Item models with transformations (#5241) --- .../client/model/BakedItemModel.java | 9 ++++++++- .../client/model/ItemLayerModel.java | 7 +++++-- .../client/model/ModelDynBucket.java | 17 +++++++++-------- .../client/model/ModelLoader.java | 2 +- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/minecraftforge/client/model/BakedItemModel.java b/src/main/java/net/minecraftforge/client/model/BakedItemModel.java index bd47416e0e..149db9cd4f 100644 --- a/src/main/java/net/minecraftforge/client/model/BakedItemModel.java +++ b/src/main/java/net/minecraftforge/client/model/BakedItemModel.java @@ -44,13 +44,20 @@ public class BakedItemModel implements IBakedModel protected final ItemOverrideList overrides; protected final IBakedModel guiModel; + /** @deprecated use {@link #BakedItemModel(ImmutableList, TextureAtlasSprite, ImmutableMap, ItemOverrideList, boolean)} */ + @Deprecated // TODO: remove public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides) + { + this(quads, particle, transforms, overrides, true); + } + + public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides, boolean untransformed) { this.quads = quads; this.particle = particle; this.transforms = transforms; this.overrides = overrides; - this.guiModel = hasGuiIdentity(transforms) ? new BakedGuiItemModel<>(this) : null; + this.guiModel = untransformed && hasGuiIdentity(transforms) ? new BakedGuiItemModel<>(this) : null; } private static boolean hasGuiIdentity(ImmutableMap transforms) diff --git a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java index c117056aaa..8c151a86b0 100644 --- a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java +++ b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java @@ -110,6 +110,7 @@ public final class ItemLayerModel implements IModel { ImmutableList.Builder builder = ImmutableList.builder(); Optional transform = state.apply(Optional.empty()); + boolean identity = !transform.isPresent() || transform.get().isIdentity(); for(int i = 0; i < textures.size(); i++) { TextureAtlasSprite sprite = bakedTextureGetter.apply(textures.get(i)); @@ -117,7 +118,7 @@ public final class ItemLayerModel implements IModel } TextureAtlasSprite particle = bakedTextureGetter.apply(textures.isEmpty() ? new ResourceLocation("missingno") : textures.get(0)); ImmutableMap map = PerspectiveMapWrapper.getTransforms(state); - return new BakedItemModel(builder.build(), particle, map, overrides); + return new BakedItemModel(builder.build(), particle, map, overrides, identity); } public static ImmutableList getQuadsForSprite(int tint, TextureAtlasSprite sprite, VertexFormat format, Optional transform) @@ -407,12 +408,14 @@ public final class ItemLayerModel implements IModel private static void putVertex(UnpackedBakedQuad.Builder builder, VertexFormat format, Optional transform, EnumFacing side, float x, float y, float z, float u, float v) { Vector4f vec = new Vector4f(); + boolean hasTransform = transform.isPresent() && !transform.get().isIdentity(); + for(int e = 0; e < format.getElementCount(); e++) { switch(format.getElement(e).getUsage()) { case POSITION: - if(transform.isPresent()) + if(hasTransform) { vec.x = x; vec.y = y; diff --git a/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java b/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java index 0d248c2d8a..1d48365acb 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java +++ b/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java @@ -176,7 +176,7 @@ public final class ModelDynBucket implements IModel } } - return new BakedDynBucket(this, builder.build(), particleSprite, format, Maps.immutableEnumMap(transformMap), Maps.newHashMap()); + return new BakedDynBucket(this, builder.build(), particleSprite, format, Maps.immutableEnumMap(transformMap), Maps.newHashMap(), transform.isIdentity()); } /** @@ -453,14 +453,15 @@ public final class ModelDynBucket implements IModel private final Map cache; // contains all the baked models since they'll never change private final VertexFormat format; - public BakedDynBucket(ModelDynBucket parent, - ImmutableList quads, - TextureAtlasSprite particle, - VertexFormat format, - ImmutableMap transforms, - Map cache) + BakedDynBucket(ModelDynBucket parent, + ImmutableList quads, + TextureAtlasSprite particle, + VertexFormat format, + ImmutableMap transforms, + Map cache, + boolean untransformed) { - super(quads, particle, transforms, BakedDynBucketOverrideHandler.INSTANCE); + super(quads, particle, transforms, BakedDynBucketOverrideHandler.INSTANCE, untransformed); this.format = format; this.parent = parent; this.cache = cache; diff --git a/src/main/java/net/minecraftforge/client/model/ModelLoader.java b/src/main/java/net/minecraftforge/client/model/ModelLoader.java index 97dc3d26c1..f1678fa962 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelLoader.java +++ b/src/main/java/net/minecraftforge/client/model/ModelLoader.java @@ -439,7 +439,7 @@ public final class ModelLoader extends ModelBakery Map tMap = Maps.newEnumMap(TransformType.class); tMap.putAll(PerspectiveMapWrapper.getTransforms(transforms)); tMap.putAll(PerspectiveMapWrapper.getTransforms(state)); - IModelState perState = new SimpleModelState(ImmutableMap.copyOf(tMap)); + IModelState perState = new SimpleModelState(ImmutableMap.copyOf(tMap), state.apply(Optional.empty())); if(hasItemModel(model)) {