From 503d27703387a6afa1e933a8bb039de6332ccedc Mon Sep 17 00:00:00 2001 From: David Quintana Date: Fri, 20 Dec 2019 02:42:01 +0100 Subject: [PATCH] Fix bucket model. Some mask textures were not added to the repository, and the bucket override generation was broken. Fix OBJ loading crash due to a float value being parsed as int. Fixes 6377 --- .../renderer/model/BakedQuad.java.patch | 17 +++++- .../client/model/ItemLayerModel.java | 32 +++++----- .../client/model/ModelDynBucket.java | 57 +++++++++--------- .../client/model/PerspectiveMapWrapper.java | 12 ++-- .../client/model/QuadTransformer.java | 2 +- .../client/model/obj/MaterialLibrary.java | 2 +- .../model/pipeline/UnpackedBakedQuad.java | 2 +- .../forge/textures/item/mask/bucket_fluid.png | Bin 0 -> 158 bytes .../textures/item/mask/bucket_fluid_cover.png | Bin 0 -> 168 bytes .../item/mask/bucket_fluid_cover_drip.png | Bin 0 -> 181 bytes .../textures/item/mask/bucket_fluid_drip.png | Bin 0 -> 172 bytes .../forge/textures/items/bucket_fluid.png | Bin 175 -> 0 bytes .../items/vanilla_bucket_cover_mask.png | Bin 179 -> 0 bytes .../resources/assets/forge/textures/white.png | Bin 0 -> 139 bytes .../models/item/test_fluid_bucket.json | 28 +-------- 15 files changed, 70 insertions(+), 82 deletions(-) create mode 100644 src/main/resources/assets/forge/textures/item/mask/bucket_fluid.png create mode 100644 src/main/resources/assets/forge/textures/item/mask/bucket_fluid_cover.png create mode 100644 src/main/resources/assets/forge/textures/item/mask/bucket_fluid_cover_drip.png create mode 100644 src/main/resources/assets/forge/textures/item/mask/bucket_fluid_drip.png delete mode 100644 src/main/resources/assets/forge/textures/items/bucket_fluid.png delete mode 100644 src/main/resources/assets/forge/textures/items/vanilla_bucket_cover_mask.png create mode 100644 src/main/resources/assets/forge/textures/white.png diff --git a/patches/minecraft/net/minecraft/client/renderer/model/BakedQuad.java.patch b/patches/minecraft/net/minecraft/client/renderer/model/BakedQuad.java.patch index 20970b8fa..6e19f061d 100644 --- a/patches/minecraft/net/minecraft/client/renderer/model/BakedQuad.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/model/BakedQuad.java.patch @@ -1,6 +1,13 @@ --- a/net/minecraft/client/renderer/model/BakedQuad.java +++ b/net/minecraft/client/renderer/model/BakedQuad.java -@@ -12,7 +12,17 @@ +@@ -6,13 +6,23 @@ + import net.minecraftforge.api.distmarker.OnlyIn; + + @OnlyIn(Dist.CLIENT) +-public class BakedQuad { ++public class BakedQuad implements net.minecraftforge.client.model.pipeline.IVertexProducer { + protected final int[] field_178215_a; + protected final int field_178213_b; protected final Direction field_178214_c; protected final TextureAtlasSprite field_187509_d; @@ -18,14 +25,20 @@ this.field_178215_a = p_i46574_1_; this.field_178213_b = p_i46574_2_; this.field_178214_c = p_i46574_3_; -@@ -34,4 +44,19 @@ +@@ -34,4 +44,25 @@ public Direction func_178210_d() { return this.field_178214_c; } + ++ // Forge start + protected final net.minecraft.client.renderer.vertex.VertexFormat format; + protected final boolean applyDiffuseLighting; + ++ @Override ++ public void pipe(net.minecraftforge.client.model.pipeline.IVertexConsumer consumer) { ++ net.minecraftforge.client.model.pipeline.LightUtil.putBakedQuad(consumer, this); ++ } ++ + public net.minecraft.client.renderer.vertex.VertexFormat getFormat() { + return format; + } diff --git a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java index f0b4a17ee..6de24adac 100644 --- a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java +++ b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java @@ -19,17 +19,18 @@ package net.minecraftforge.client.model; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.util.Pair; import net.minecraft.client.renderer.TransformationMatrix; import net.minecraft.client.renderer.model.*; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraftforge.client.model.geometry.IModelGeometry; - import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.geometry.IModelGeometry; import net.minecraftforge.client.model.pipeline.IVertexConsumer; import net.minecraftforge.client.model.pipeline.TRSRTransformer; import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad; @@ -38,12 +39,10 @@ import java.util.Arrays; import java.util.BitSet; import java.util.Collection; import java.util.EnumMap; +import java.util.List; import java.util.Set; import java.util.function.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - /** * Forge reimplementation of vanilla {@link ItemModelGenerator}, i.e. builtin/generated models, * with the following changes: @@ -86,19 +85,24 @@ public final class ItemLayerModel implements IModelGeometry public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform sprite, ItemOverrideList overrides, ResourceLocation modelLocation) { //TODO: Verify - ImmutableList.Builder builder = ImmutableList.builder(); TransformationMatrix transform = sprite.func_225615_b_(); - boolean identity = transform.isIdentity(); - for(int i = 0; i < textures.size(); i++) - { - TextureAtlasSprite tas = spriteGetter.apply(textures.get(i)); - builder.addAll(getQuadsForSprite(i, tas, DefaultVertexFormats.BLOCK, transform)); - } + ImmutableList quads = getQuadsForSprites(textures, DefaultVertexFormats.BLOCK, transform, spriteGetter); TextureAtlasSprite particle = spriteGetter.apply( owner.isTexturePresent("particle") ? owner.resolveTexture("particle") : textures.get(0) ); ImmutableMap map = PerspectiveMapWrapper.getTransforms(sprite); - return new BakedItemModel(builder.build(), particle, map, overrides, identity); + return new BakedItemModel(quads, particle, map, overrides, transform.isIdentity()); + } + + public static ImmutableList getQuadsForSprites(List textures, VertexFormat format, TransformationMatrix transform, Function spriteGetter) + { + ImmutableList.Builder builder = ImmutableList.builder(); + for(int i = 0; i < textures.size(); i++) + { + TextureAtlasSprite tas = spriteGetter.apply(textures.get(i)); + builder.addAll(getQuadsForSprite(i, tas, format, transform)); + } + return builder.build(); } public static ImmutableList getQuadsForSprite(int tint, TextureAtlasSprite sprite, VertexFormat format, TransformationMatrix transform) diff --git a/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java b/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java index d56b445c0..d2f671652 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java +++ b/src/main/java/net/minecraftforge/client/model/ModelDynBucket.java @@ -19,13 +19,10 @@ package net.minecraftforge.client.model; -import java.io.IOException; -import java.util.*; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import com.google.common.collect.*; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; @@ -34,7 +31,9 @@ import net.minecraft.client.renderer.Quaternion; import net.minecraft.client.renderer.TransformationMatrix; import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; -import net.minecraft.client.renderer.texture.*; +import net.minecraft.client.renderer.texture.MissingTextureSprite; +import net.minecraft.client.renderer.texture.PngSizeInfo; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.entity.LivingEntity; @@ -48,19 +47,23 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.geometry.IModelGeometry; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.resource.IResourceType; import net.minecraftforge.resource.VanillaResourceType; import net.minecraftforge.versions.forge.ForgeVersion; -import net.minecraftforge.common.model.TransformationHelper; -import net.minecraftforge.fluids.FluidUtil; - -import java.util.function.Function; -import java.util.function.Predicate; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Predicate; + public final class ModelDynBucket implements IModelGeometry { private static final Logger LOGGER = LogManager.getLogger(); @@ -123,7 +126,7 @@ public final class ModelDynBucket implements IModelGeometry } @Override - public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform sprite, ItemOverrideList overrides, ResourceLocation modelLocation) + public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, ItemOverrideList overrides, ResourceLocation modelLocation) { Material particleLocation = owner.resolveTexture("particle"); if (MissingTextureSprite.getLocation().toString().equals(particleLocation)) @@ -152,35 +155,30 @@ public final class ModelDynBucket implements IModelGeometry IModelTransform transformsFromModel = owner.getCombinedTransform(); - IModelTransform state = sprite; ImmutableMap transformMap = transformsFromModel != null ? - PerspectiveMapWrapper.getTransforms(new ModelTransformComposition(transformsFromModel, state)) : - PerspectiveMapWrapper.getTransforms(state); + PerspectiveMapWrapper.getTransforms(new ModelTransformComposition(transformsFromModel, modelTransform)) : + PerspectiveMapWrapper.getTransforms(modelTransform); TextureAtlasSprite particleSprite = particleLocation != null ? spriteGetter.apply(particleLocation) : null; // if the fluid is lighter than air, will manipulate the initial state to be rotated 180deg to turn it upside down if (flipGas && fluid != Fluids.EMPTY && fluid.getAttributes().isLighterThanAir()) { - sprite = new ModelTransformComposition(state, new SimpleModelTransform(new TransformationMatrix(null, new Quaternion(0, 0, 1, 0), null, null).blockCenterToCorner())); - state = sprite; + modelTransform = new ModelTransformComposition(modelTransform, new SimpleModelTransform(new TransformationMatrix(null, new Quaternion(0, 0, 1, 0), null, null))); } - TransformationMatrix transform = state.func_225615_b_(); + TransformationMatrix transform = modelTransform.func_225615_b_(); TextureAtlasSprite fluidSprite = fluid != Fluids.EMPTY ? spriteGetter.apply(ForgeHooksClient.getBlockMaterial(fluid.getAttributes().getStillTexture())) : null; if (particleSprite == null) particleSprite = fluidSprite; - Random random = new Random(); ImmutableList.Builder builder = ImmutableList.builder(); if (baseLocation != null) { // build base (insidest) - IBakedModel model = new ItemLayerModel(ImmutableList.of(baseLocation)).bake(owner, bakery, spriteGetter, sprite, ItemOverrideList.EMPTY, modelLocation); - random.setSeed(42); - builder.addAll(model.getQuads(null, null, random)); + builder.addAll(ItemLayerModel.getQuadsForSprites(ImmutableList.of(baseLocation), DefaultVertexFormats.BLOCK, transform, spriteGetter)); } if (fluidMaskLocation != null && fluidSprite != null) @@ -218,7 +216,7 @@ public final class ModelDynBucket implements IModelGeometry } } - return new BakedDynBucket(bakery, owner, this, builder.build(), particleSprite, DefaultVertexFormats.BLOCK, Maps.immutableEnumMap(transformMap), Maps.newHashMap(), transform.isIdentity()); + return new BakedDynBucket(bakery, owner, this, builder.build(), particleSprite, DefaultVertexFormats.BLOCK, Maps.immutableEnumMap(transformMap), Maps.newHashMap(), transform.isIdentity(), modelTransform); } @Override @@ -418,7 +416,7 @@ public final class ModelDynBucket implements IModelGeometry if (!model.cache.containsKey(name)) { ModelDynBucket parent = model.parent.withFluid(fluid); - IBakedModel bakedModel = parent.bake(model.owner, bakery, ModelLoader.defaultTextureGetter(), new SimpleModelTransform(model.transforms), model.getOverrides(), new ResourceLocation("forge:bucket_override")); + IBakedModel bakedModel = parent.bake(model.owner, bakery, ModelLoader.defaultTextureGetter(), model.originalTransform, model.getOverrides(), new ResourceLocation("forge:bucket_override")); model.cache.put(name, bakedModel); return bakedModel; } @@ -437,6 +435,7 @@ public final class ModelDynBucket implements IModelGeometry private final ModelDynBucket parent; private final Map cache; // contains all the baked models since they'll never change private final VertexFormat format; + private final IModelTransform originalTransform; BakedDynBucket(ModelBakery bakery, IModelConfiguration owner, ModelDynBucket parent, @@ -445,13 +444,15 @@ public final class ModelDynBucket implements IModelGeometry VertexFormat format, ImmutableMap transforms, Map cache, - boolean untransformed) + boolean untransformed, + IModelTransform originalTransform) { super(quads, particle, transforms, new BakedDynBucketOverrideHandler(bakery), untransformed); this.owner = owner; this.format = format; this.parent = parent; this.cache = cache; + this.originalTransform = originalTransform; } } diff --git a/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java b/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java index a198f805f..027ba388a 100644 --- a/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java +++ b/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java @@ -77,7 +77,7 @@ public class PerspectiveMapWrapper implements IBakedModel { if (transforms.hasCustomTransform(type)) { - map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type)).blockCenterToCorner()); + map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type))); } } return ImmutableMap.copyOf(map); @@ -96,7 +96,7 @@ public class PerspectiveMapWrapper implements IBakedModel } else if (transforms.hasCustomTransform(type)) { - map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type)).blockCenterToCorner()); + map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type))); } } return ImmutableMap.copyOf(map); @@ -107,9 +107,7 @@ public class PerspectiveMapWrapper implements IBakedModel TransformationMatrix tr = transforms.getOrDefault(cameraTransformType, TransformationMatrix.func_227983_a_()); if (!tr.isIdentity()) { - // Push to the matrix to make it not empty and indicate that we want to transform things - mat.func_227860_a_(); - mat.func_227866_c_().func_227870_a_().func_226595_a_(tr.blockCornerToCenter().func_227988_c_()); + tr.push(mat); } return model; } @@ -119,9 +117,7 @@ public class PerspectiveMapWrapper implements IBakedModel TransformationMatrix tr = state.getPartTransformation(cameraTransformType); if (!tr.isIdentity()) { - // Push to the matrix to make it not empty and indicate that we want to transform things - mat.func_227860_a_(); - mat.func_227866_c_().func_227870_a_().func_226595_a_(tr.blockCornerToCenter().func_227988_c_()); + tr.push(mat); } return model; } diff --git a/src/main/java/net/minecraftforge/client/model/QuadTransformer.java b/src/main/java/net/minecraftforge/client/model/QuadTransformer.java index e37ace36d..d64e57ad0 100644 --- a/src/main/java/net/minecraftforge/client/model/QuadTransformer.java +++ b/src/main/java/net/minecraftforge/client/model/QuadTransformer.java @@ -49,7 +49,7 @@ public class QuadTransformer private void processVertices(int[] inData, int[] outData) { // TODO: Extract rotation matrix and fix NORMALs if present. - int stride = format.getSize() / 4; + int stride = format.getIntegerSize(); for (int i=0;i<4;i++) { int offset = positionOffset + i * stride; diff --git a/src/main/java/net/minecraftforge/client/model/obj/MaterialLibrary.java b/src/main/java/net/minecraftforge/client/model/obj/MaterialLibrary.java index 01f8afb62..57ad9656c 100644 --- a/src/main/java/net/minecraftforge/client/model/obj/MaterialLibrary.java +++ b/src/main/java/net/minecraftforge/client/model/obj/MaterialLibrary.java @@ -75,7 +75,7 @@ public class MaterialLibrary break; case "Ns": - currentMaterial.specularHighlight = Integer.parseInt(line[1]); + currentMaterial.specularHighlight = Float.parseFloat(line[1]); break; case "map_Ks": diff --git a/src/main/java/net/minecraftforge/client/model/pipeline/UnpackedBakedQuad.java b/src/main/java/net/minecraftforge/client/model/pipeline/UnpackedBakedQuad.java index c3725fdbd..79364b452 100644 --- a/src/main/java/net/minecraftforge/client/model/pipeline/UnpackedBakedQuad.java +++ b/src/main/java/net/minecraftforge/client/model/pipeline/UnpackedBakedQuad.java @@ -58,7 +58,7 @@ public class UnpackedBakedQuad extends BakedQuad return vertexData; } - //@Override + @Override public void pipe(IVertexConsumer consumer) { int[] eMap = LightUtil.mapFormats(consumer.getVertexFormat(), format); diff --git a/src/main/resources/assets/forge/textures/item/mask/bucket_fluid.png b/src/main/resources/assets/forge/textures/item/mask/bucket_fluid.png new file mode 100644 index 0000000000000000000000000000000000000000..58f08bc71a08dc26af84e6ab771a4b1775740909 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL1RxB#}EtuWQku5f?kIY)+;m^ZDeu-k_Q=D xojr_s6r`ITG6@_=71;H5ae@es*ntBK4EqoAuxv|Ai3VzC@O1TaS?83{1OT9HD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/forge/textures/item/mask/bucket_fluid_cover.png b/src/main/resources/assets/forge/textures/item/mask/bucket_fluid_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..e97bcb54928106d5cff1ce0b9e3a5a519b384d39 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL0eB3#}EtumdK II;Vst0MZ650ssI2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/forge/textures/item/mask/bucket_fluid_cover_drip.png b/src/main/resources/assets/forge/textures/item/mask/bucket_fluid_cover_drip.png new file mode 100644 index 0000000000000000000000000000000000000000..153f731df1a18d2df5688e45d20846277ccf1ab2 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK`&1i#}Etujfu>>6ebNd_PEBv^MaFf%huKQ8@cT9rmN&@cv1 LS3j3^P6}1{o!Zf5n)hc<6=C@w&8(5zCzd>*7hbhCb7f3 zNk@b_dRR>Ut3PS|Z^84+-%BFl@_`OtnRp!op+t>1=6}J~vVWFeVK~NEeo*184+A3` ZL!*}PoSe1d20#lKJYD@<);T3K0RUfiHgy01 diff --git a/src/main/resources/assets/forge/textures/white.png b/src/main/resources/assets/forge/textures/white.png new file mode 100644 index 0000000000000000000000000000000000000000..1e79dc896b34ec8e487d41974779523b3540c857 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK?P42#}Etu