From 264dbc570fbdfd0ce7619676e0c77698ab6de32f Mon Sep 17 00:00:00 2001 From: David Queneau <748280+davidqueneau@users.noreply.github.com> Date: Sat, 6 Mar 2021 14:45:29 -0800 Subject: [PATCH] Fixed turtle tool upgrades not rendering in GUI. --- .../client/render/ModelTransformer.java | 48 ++++++++----------- .../client/render/TurtleSmartItemModel.java | 7 +-- 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/src/main/java/dan200/computercraft/client/render/ModelTransformer.java b/src/main/java/dan200/computercraft/client/render/ModelTransformer.java index 5ff96bdd5..b8a766e0a 100644 --- a/src/main/java/dan200/computercraft/client/render/ModelTransformer.java +++ b/src/main/java/dan200/computercraft/client/render/ModelTransformer.java @@ -14,8 +14,8 @@ import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormatElement; import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.model.BakedQuad; +import net.minecraft.client.util.math.Vector4f; import net.minecraft.util.math.Matrix4f; -import net.minecraft.util.math.Quaternion; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -50,41 +50,31 @@ public final class ModelTransformer { } private static BakedQuad doTransformQuad(VertexFormat format, BakedQuad quad, Matrix4f transform) { - int[] vertexData = quad.getVertexData() - .clone(); - int offset = 0; + int[] vertexData = quad.getVertexData().clone(); BakedQuad copy = new BakedQuad(vertexData, -1, quad.getFace(), ((BakedQuadAccess)quad).getSprite(), true); - for (int i = 0; i < format.getElements() - .size(); ++i) // For each vertex element - { - VertexFormatElement element = format.getElements() - .get(i); - if (element.getType() == VertexFormatElement.Type.POSITION && element.getFormat() == VertexFormatElement.Format.FLOAT && element.getSize() == 3) // When we find a position - // element + + int offsetBytes = 0; + for (int v = 0; v < 4; ++v) { + for (VertexFormatElement element : format.getElements()) // For each vertex element { - for (int j = 0; j < 4; ++j) // For each corner of the quad + int start = offsetBytes / Integer.BYTES; + if (element.getType() == VertexFormatElement.Type.POSITION && element.getFormat() == VertexFormatElement.Format.FLOAT) // When we find a position element { - int start = offset + j * format.getVertexSize(); - if ((start % 4) == 0) { - start = start / 4; + Vector4f pos = new Vector4f(Float.intBitsToFloat(vertexData[start]), + Float.intBitsToFloat(vertexData[start+1]), + Float.intBitsToFloat(vertexData[start+2]), + 1); - // Extract the position - Quaternion pos = new Quaternion(Float.intBitsToFloat(vertexData[start]), - Float.intBitsToFloat(vertexData[start + 1]), - Float.intBitsToFloat(vertexData[start + 2]), - 1); + // Transform the position + pos.transform(transform); - // Transform the position - transform.multiply(pos); - - // Insert the position - vertexData[start] = Float.floatToRawIntBits(pos.getX()); - vertexData[start + 1] = Float.floatToRawIntBits(pos.getY()); - vertexData[start + 2] = Float.floatToRawIntBits(pos.getZ()); - } + // Insert the position + vertexData[start] = Float.floatToRawIntBits(pos.getX()); + vertexData[start+1] = Float.floatToRawIntBits(pos.getY()); + vertexData[start+2] = Float.floatToRawIntBits(pos.getZ()); } + offsetBytes += element.getSize(); } - offset += element.getSize(); } return copy; } diff --git a/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java b/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java index 1f31e18dc..7465a5215 100644 --- a/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java +++ b/src/main/java/dan200/computercraft/client/render/TurtleSmartItemModel.java @@ -78,9 +78,10 @@ public class TurtleSmartItemModel implements BakedModel { Identifier overlay = turtle.getOverlay(stack); boolean christmas = HolidayUtil.getCurrentHoliday() == Holiday.CHRISTMAS; String label = turtle.getLabel(stack); - boolean flip = label != null && (label.equals("Dinnerbone") || label.equals("Grumm")); - // TODO Make TurtleTool render for turtle items again. - TurtleModelCombination combo = new TurtleModelCombination(colour != -1, !(leftUpgrade instanceof TurtleTool) ? leftUpgrade : null, !(rightUpgrade instanceof TurtleTool) ? rightUpgrade : null, overlay, christmas, flip); + // TODO make upside down turtle items render properly (currently inivisible) + //boolean flip = label != null && (label.equals("Dinnerbone") || label.equals("Grumm")); + boolean flip = false; + TurtleModelCombination combo = new TurtleModelCombination(colour != -1, leftUpgrade, rightUpgrade, overlay, christmas, flip); BakedModel model = TurtleSmartItemModel.this.m_cachedModels.get(combo); if (model == null) {