From e8ce61d4cd2de3250a27b1d4b8aa20d88e53c0d7 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Tue, 24 Dec 2019 13:12:38 +0100 Subject: [PATCH] New batch of Model/rendering fixes: - PerspectiveMapWrapper did not pass IModelData through to the wrapped model. - CompositeModel did not store the returned textures from getTextureDependencies. - VertexFormat used COLOR instead of UV to detect UV presence. - QuadTransformer would crash due to index out of bounds. - Small cleanup of TransformationHelper --- .../renderer/vertex/VertexFormat.java.patch | 2 +- .../client/model/PerspectiveMapWrapper.java | 6 ++++- .../client/model/QuadTransformer.java | 6 ++--- .../model/composite/CompositeModel.java | 5 ++-- .../common/model/TransformationHelper.java | 25 +++++++++++------- .../models/item/obj_item.json | 16 ++++++++--- .../models/item/sugar_glider.mtl | 10 +++---- .../textures/item/qr.png | Bin 0 -> 237 bytes 8 files changed, 43 insertions(+), 27 deletions(-) create mode 100644 src/test/resources/assets/new_model_loader_test/textures/item/qr.png diff --git a/patches/minecraft/net/minecraft/client/renderer/vertex/VertexFormat.java.patch b/patches/minecraft/net/minecraft/client/renderer/vertex/VertexFormat.java.patch index 74b6a9a62..d1b8d13a7 100644 --- a/patches/minecraft/net/minecraft/client/renderer/vertex/VertexFormat.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/vertex/VertexFormat.java.patch @@ -10,5 +10,5 @@ + public boolean hasPosition() { return field_177355_b.stream().anyMatch(e -> e.func_177374_g()); } + public boolean hasNormal() { return field_177355_b.stream().anyMatch(e -> e.func_177375_c() == VertexFormatElement.Usage.NORMAL); } + public boolean hasColor() { return field_177355_b.stream().anyMatch(e -> e.func_177375_c() == VertexFormatElement.Usage.COLOR); } -+ public boolean hasUV(int which) { return field_177355_b.stream().anyMatch(e -> e.func_177375_c() == VertexFormatElement.Usage.COLOR && e.func_177369_e() == which); } ++ public boolean hasUV(int which) { return field_177355_b.stream().anyMatch(e -> e.func_177375_c() == VertexFormatElement.Usage.UV && e.func_177369_e() == which); } } diff --git a/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java b/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java index 027ba388a..1037b6b25 100644 --- a/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java +++ b/src/main/java/net/minecraftforge/client/model/PerspectiveMapWrapper.java @@ -33,6 +33,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.world.World; +import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.common.model.TransformationHelper; import javax.annotation.Nullable; @@ -130,7 +131,10 @@ public class PerspectiveMapWrapper implements IBakedModel @SuppressWarnings("deprecation") @Override public ItemCameraTransforms getItemCameraTransforms() { return parent.getItemCameraTransforms(); } @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) { return parent.getQuads(state, side, rand); } - + @Override public List getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, IModelData extraData) + { + return parent.getQuads(state, side, rand, extraData); + } @Override public ItemOverrideList getOverrides() diff --git a/src/main/java/net/minecraftforge/client/model/QuadTransformer.java b/src/main/java/net/minecraftforge/client/model/QuadTransformer.java index d64e57ad0..42ee7f0f3 100644 --- a/src/main/java/net/minecraftforge/client/model/QuadTransformer.java +++ b/src/main/java/net/minecraftforge/client/model/QuadTransformer.java @@ -48,9 +48,9 @@ public class QuadTransformer private void processVertices(int[] inData, int[] outData) { - // TODO: Extract rotation matrix and fix NORMALs if present. int stride = format.getIntegerSize(); - for (int i=0;i<4;i++) + int count = inData.length / stride; + for (int i=0;i= 0) { - for (int i=0;i<4;i++) + for (int i=0;i textures = new HashSet<>(); for(Submodel part : parts.values()) { - part.getTextureDependencies(owner, modelGetter, missingTextureErrors); + textures.addAll(part.getTextureDependencies(owner, modelGetter, missingTextureErrors)); } return textures; } diff --git a/src/main/java/net/minecraftforge/common/model/TransformationHelper.java b/src/main/java/net/minecraftforge/common/model/TransformationHelper.java index 99c3afceb..9969e4a41 100644 --- a/src/main/java/net/minecraftforge/common/model/TransformationHelper.java +++ b/src/main/java/net/minecraftforge/common/model/TransformationHelper.java @@ -50,6 +50,16 @@ public final class TransformationHelper return new Quaternion(xyz.getX(), xyz.getY(), xyz.getZ(), degrees); } + public static Quaternion quatFromXYZ(float[] xyz, boolean degrees) + { + return new Quaternion(xyz[0], xyz[1], xyz[2], degrees); + } + + public static Quaternion makeQuaternion(float[] values) + { + return new Quaternion(values[0], values[1], values[2], values[3]); + } + public static Vector3f lerp(Vector3f from, Vector3f to, float progress) { Vector3f res = from.func_229195_e_(); @@ -120,11 +130,6 @@ public final class TransformationHelper MathHelper.abs(v1.getW()-v2.getW()) < epsilon; } - public static Quaternion makeQuaternion(float[] values) - { - return new Quaternion(values[0], values[1], values[2], values[3]); - } - public static class Deserializer implements JsonDeserializer { @Override @@ -261,15 +266,15 @@ public final class TransformationHelper { if (entry.getKey().equals("x")) { - ret = new Quaternion(new Vector3f(1, 0, 0), entry.getValue().getAsNumber().floatValue(), true); + ret = Vector3f.field_229179_b_.func_229187_a_(entry.getValue().getAsNumber().floatValue()); } else if (entry.getKey().equals("y")) { - ret = new Quaternion(new Vector3f(0, 1, 0), entry.getValue().getAsNumber().floatValue(), true); + ret = Vector3f.field_229181_d_.func_229187_a_(entry.getValue().getAsNumber().floatValue()); } else if (entry.getKey().equals("z")) { - ret = new Quaternion(new Vector3f(0, 0, 1), entry.getValue().getAsNumber().floatValue(), true); + ret = Vector3f.field_229183_f_.func_229187_a_(entry.getValue().getAsNumber().floatValue()); } else throw new JsonParseException("Axis rotation: expected single axis key, got: " + entry.getKey()); } @@ -286,7 +291,7 @@ public final class TransformationHelper { if (e.getAsJsonArray().get(0).isJsonObject()) { - Quaternion ret = new Quaternion(0, 0, 0, 1); + Quaternion ret = Quaternion.field_227060_a_.func_227068_g_(); for (JsonElement a : e.getAsJsonArray()) { ret.multiply(parseAxisRotation(a)); @@ -297,7 +302,7 @@ public final class TransformationHelper { JsonArray array = e.getAsJsonArray(); if (array.size() == 3) //Vanilla rotation - return quatFromXYZ(new Vector3f(parseFloatArray(e, 3, "Rotation")), true); + return quatFromXYZ(parseFloatArray(e, 3, "Rotation"), true); else // quaternion return makeQuaternion(parseFloatArray(e, 4, "Rotation")); } diff --git a/src/test/resources/assets/new_model_loader_test/models/item/obj_item.json b/src/test/resources/assets/new_model_loader_test/models/item/obj_item.json index a5a5c5f05..9f3bb67df 100644 --- a/src/test/resources/assets/new_model_loader_test/models/item/obj_item.json +++ b/src/test/resources/assets/new_model_loader_test/models/item/obj_item.json @@ -1,8 +1,16 @@ { "parent": "forge:item/default", - "loader": "forge:obj", - "model": "new_model_loader_test:models/item/sugar_glider.obj", - "ambientToFullbright": true, + "loader": "forge:composite", + "parts": { + "part1": { + "loader": "forge:obj", + "model": "new_model_loader_test:models/item/sugar_glider.obj", + "ambientToFullbright": true, + "textures": { + "qr": "new_model_loader_test:item/qr" + } + } + }, "textures": { "particle": "block/oak_planks" }, @@ -13,7 +21,7 @@ "scale": [ 1, 1, 1 ] }, "fixed": { - "rotation": [ 0, 180, 0 ], + "rotation": [ 22, 180, 0 ], "translation": [ 0, 4, 0], "scale":[ 1, 1, 1 ] }, diff --git a/src/test/resources/assets/new_model_loader_test/models/item/sugar_glider.mtl b/src/test/resources/assets/new_model_loader_test/models/item/sugar_glider.mtl index e2688c6b3..04ee34fde 100644 --- a/src/test/resources/assets/new_model_loader_test/models/item/sugar_glider.mtl +++ b/src/test/resources/assets/new_model_loader_test/models/item/sugar_glider.mtl @@ -6,7 +6,7 @@ Ks 1.0000 1.0000 1.0000 Tf 0.0000 0.0000 0.0000 d 1.0000 Ns 0 -map_Kd block/birch_planks +map_Kd #qr newmtl New material 001 Ka 0.0000 0.0000 0.0000 @@ -15,7 +15,7 @@ Ks 1.0000 1.0000 1.0000 Tf 0.0000 0.0000 0.0000 d 1.0000 Ns 0 -map_Kd block/birch_planks +map_Kd #qr newmtl Default Ka 0.0000 0.0000 0.0000 @@ -24,7 +24,7 @@ Ks 1.0000 1.0000 1.0000 Tf 0.0000 0.0000 0.0000 d 1.0000 Ns 0 -map_Kd block/birch_planks +map_Kd #qr newmtl New material 002 Ka 0.0000 0.0000 0.0000 @@ -33,7 +33,7 @@ Ks 1.0000 1.0000 1.0000 Tf 0.0000 0.0000 0.0000 d 1.0000 Ns 0 -map_Kd block/birch_planks +map_Kd #qr newmtl New material 003 Ka 0.0000 0.0000 0.0000 @@ -42,5 +42,5 @@ Ks 1.0000 1.0000 1.0000 Tf 0.0000 0.0000 0.0000 d 1.0000 Ns 0 -map_Kd block/birch_planks +map_Kd #qr diff --git a/src/test/resources/assets/new_model_loader_test/textures/item/qr.png b/src/test/resources/assets/new_model_loader_test/textures/item/qr.png new file mode 100644 index 0000000000000000000000000000000000000000..05b2f3b33ba36fcfdb829ec05ff4907cd630e07f GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!6r`^#}EtusgoS}8Vm%OR{#HBoSJGp>DG)B ziLwi-Gaeg0m)SpsJ58uDRlC#wM8g!B?Hk(S7DODe7A#A7%#<6y(A@f`QO%=0mZ^^mpR_DUw!y#t@U|Uc2mGkMCf(x%jtgpq={%plcXBUHx3vIVCg!0A$TshX4Qo literal 0 HcmV?d00001