From 7b5fae17f39758025dcd9e53347e8daf78d596ce Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 5 Oct 2026 13:11:34 +0100 Subject: [PATCH] Support dyed shulker box upgrades MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Allow TransformedModel to also hold a list of tints for the model. - Update our turtle item colour provider to fetch tints from the upgrade's TransformedModel. This requires rewriting the quads in the upgrade model, mapping the existing tint indices to (2 * tintIndex) + (left ? 1 : 2). We already have to rewrite quads to apply transformations, so fortunately this isn't too bad. I have no clue how this is going to work on 26.3 though 😬. - Add a custom turtle upgrade modeller for the storage upgrade that applies the shulker tint colour. --- gradle/libs.versions.toml | 2 +- .../api/client/TransformedModel.java | 21 ++++- .../computercraft/client/ClientRegistry.java | 18 ++-- .../client/model/turtle/ModelTransformer.java | 14 ++- .../client/model/turtle/TurtleModelParts.java | 29 +++--- .../client/platform/ClientPlatformHelper.java | 4 +- .../client/render/ModelRenderer.java | 11 +-- .../render/TurtleBlockEntityRenderer.java | 12 +-- .../client/turtle/TurtleStorageModeller.java | 83 ++++++++++++++++++ .../data/BlockModelProvider.java | 2 +- .../computercraft/data/DataProviders.java | 10 ++- .../models/block/turtle_shulker_left.json | 5 +- .../models/block/turtle_shulker_right.json | 5 +- .../{shulker_box.json => shulker.json} | 0 .../black.json} | 0 .../blue.json} | 0 .../brown.json} | 0 .../cyan.json} | 0 .../gray.json} | 0 .../green.json} | 0 .../light_blue.json} | 0 .../light_gray.json} | 0 .../lime.json} | 0 .../magenta.json} | 0 .../orange.json} | 0 .../pink.json} | 0 .../purple.json} | 0 .../red.json} | 0 .../white.json} | 0 .../yellow.json} | 0 .../block/turtle_shulker_colour_left.json | 20 +++++ .../block/turtle_shulker_colour_right.json | 20 +++++ .../textures/block/turtle_shulker.png | Bin 0 -> 382 bytes .../textures/block/turtle_shulker_colour.png | Bin 0 -> 309 bytes .../client/model/FabricModelTransformer.java | 8 +- .../client/model/TransformedBakedModel.java | 8 +- .../platform/ClientPlatformHelperImpl.java | 4 +- .../client/model/TransformedBakedModel.java | 8 +- .../platform/ClientPlatformHelperImpl.java | 3 +- 39 files changed, 232 insertions(+), 55 deletions(-) create mode 100644 projects/common/src/client/java/dan200/computercraft/client/turtle/TurtleStorageModeller.java rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{shulker_box.json => shulker.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{black_shulker_box.json => shulker/black.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{blue_shulker_box.json => shulker/blue.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{brown_shulker_box.json => shulker/brown.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{cyan_shulker_box.json => shulker/cyan.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{gray_shulker_box.json => shulker/gray.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{green_shulker_box.json => shulker/green.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{light_blue_shulker_box.json => shulker/light_blue.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{light_gray_shulker_box.json => shulker/light_gray.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{lime_shulker_box.json => shulker/lime.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{magenta_shulker_box.json => shulker/magenta.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{orange_shulker_box.json => shulker/orange.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{pink_shulker_box.json => shulker/pink.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{purple_shulker_box.json => shulker/purple.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{red_shulker_box.json => shulker/red.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{white_shulker_box.json => shulker/white.json} (100%) rename projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/{yellow_shulker_box.json => shulker/yellow.json} (100%) create mode 100644 projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_left.json create mode 100644 projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_right.json create mode 100644 projects/common/src/main/resources/assets/computercraft/textures/block/turtle_shulker.png create mode 100644 projects/common/src/main/resources/assets/computercraft/textures/block/turtle_shulker_colour.png diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5e48a35be..5ff495de6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ modDevGradle = "2.0.147" nullAway = "0.14.0" shadow = "9.6.1" spotless = "8.10.0" -teavm = "0.15.0" +teavm = "0.16.0" vanillaExtract = "0.3.2" versionCatalogUpdate = "1.1.1" diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java index d3b58e9a0..fa066ba81 100644 --- a/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java +++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/TransformedModel.java @@ -12,8 +12,10 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.Nullable; import java.util.Objects; +import java.util.function.IntUnaryOperator; /** * A model to render, combined with a transformation matrix to apply. @@ -21,15 +23,20 @@ import java.util.Objects; public final class TransformedModel { private final BakedModel model; private final Transformation matrix; + private final @Nullable IntUnaryOperator tints; - public TransformedModel(BakedModel model, Transformation matrix) { + public TransformedModel(BakedModel model, Transformation matrix, @Nullable IntUnaryOperator tints) { this.model = Objects.requireNonNull(model); this.matrix = Objects.requireNonNull(matrix); + this.tints = tints; + } + + public TransformedModel(BakedModel model, Transformation matrix) { + this(model, matrix, null); } public TransformedModel(BakedModel model) { - this.model = Objects.requireNonNull(model); - matrix = Transformation.identity(); + this(model, Transformation.identity(), null); } public static TransformedModel of(ModelResourceLocation location) { @@ -54,4 +61,12 @@ public final class TransformedModel { public Transformation getMatrix() { return matrix; } + + public @Nullable IntUnaryOperator getTints() { + return tints; + } + + public int getTint(int index) { + return tints == null ? -1 : tints.applyAsInt(index); + } } diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java index 0c58aef5c..55016d398 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java +++ b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java @@ -11,6 +11,7 @@ import com.mojang.brigadier.builder.RequiredArgumentBuilder; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.client.turtle.RegisterTurtleUpgradeModeller; import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; +import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.client.gui.*; import dan200.computercraft.client.pocket.ClientPocketComputers; import dan200.computercraft.client.render.CustomLecternRenderer; @@ -18,6 +19,7 @@ import dan200.computercraft.client.render.RenderTypes; import dan200.computercraft.client.render.TurtleBlockEntityRenderer; import dan200.computercraft.client.render.monitor.MonitorBlockEntityRenderer; import dan200.computercraft.client.turtle.TurtleModemModeller; +import dan200.computercraft.client.turtle.TurtleStorageModeller; import dan200.computercraft.client.turtle.TurtleUpgradeModellers; import dan200.computercraft.core.util.Colour; import dan200.computercraft.shared.ModRegistry; @@ -28,6 +30,7 @@ import dan200.computercraft.shared.computer.core.ServerContext; import dan200.computercraft.shared.computer.inventory.AbstractComputerMenu; import dan200.computercraft.shared.media.items.DiskItem; import dan200.computercraft.shared.media.items.TreasureDiskItem; +import dan200.computercraft.shared.turtle.items.TurtleItem; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.color.item.ItemColor; @@ -121,10 +124,7 @@ public final class ClientRegistry { register.register(ModRegistry.TurtleSerialisers.WIRELESS_MODEM_NORMAL.get(), new TurtleModemModeller(false)); register.register(ModRegistry.TurtleSerialisers.WIRELESS_MODEM_ADVANCED.get(), new TurtleModemModeller(true)); register.register(ModRegistry.TurtleSerialisers.TOOL.get(), TurtleUpgradeModeller.flatItem()); - register.register(ModRegistry.TurtleSerialisers.STORAGE.get(), TurtleUpgradeModeller.sided( - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker_left"), - new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker_right") - )); + register.register(ModRegistry.TurtleSerialisers.STORAGE.get(), new TurtleStorageModeller()); } @SafeVarargs @@ -187,7 +187,15 @@ public final class ClientRegistry { } private static int getTurtleColour(ItemStack stack, int layer) { - return layer == 0 ? ((IColouredItem) stack.getItem()).getColour(stack) : 0xFFFFFF; + var item = (TurtleItem) stack.getItem(); + if (layer == 0) return item.getColour(stack); + + var side = (layer % 2) == 1 ? TurtleSide.LEFT : TurtleSide.RIGHT; + var upgrade = item.getUpgradeWithData(stack, side); + if (upgrade == null) return -1; + + var model = TurtleUpgradeModellers.getModel(upgrade.upgrade(), upgrade.data(), side); + return model.getTint((layer - 1) / 2); } public static void registerShaders(ResourceProvider resources, BiConsumer> load) throws IOException { diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java index 6132d0242..5ebbd3ca5 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/ModelTransformer.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; import com.mojang.math.Transformation; +import dan200.computercraft.api.turtle.TurtleSide; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; @@ -35,10 +36,12 @@ public class ModelTransformer { protected final Matrix4f transformation; protected final boolean invert; private @Nullable TransformedQuads cache; + private final @Nullable TurtleSide side; - public ModelTransformer(Transformation transformation) { + public ModelTransformer(Transformation transformation, @Nullable TurtleSide side) { this.transformation = transformation.getMatrix(); invert = transformation.getMatrix().determinant() < 0; + this.side = side; } public List transform(List quads) { @@ -82,7 +85,14 @@ public class ModelTransformer { } var direction = Direction.rotate(transformation, quad.getDirection()); - return new BakedQuad(outputData, quad.getTintIndex(), direction, quad.getSprite(), quad.isShade()); + var tintIndex = getTintIndex(quad.getTintIndex()); + return new BakedQuad(outputData, tintIndex, direction, quad.getSprite(), quad.isShade()); + } + + protected final int getTintIndex(int index) { + if (index == -1 || side == null) return index; + var offset = side == TurtleSide.LEFT ? 1 : 2; + return index * 2 + offset; } public static int getVertexOffset(int vertex, boolean invert) { diff --git a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java index d898020e2..0e6aae393 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java +++ b/projects/common/src/client/java/dan200/computercraft/client/model/turtle/TurtleModelParts.java @@ -63,19 +63,22 @@ public final class TurtleModelParts { } } + public record TurtleModelPart(BakedModel model, Transformation matrix, @Nullable TurtleSide side) { + } + private final BakedModel familyModel; private final BakedModel colourModel; - private final Function transformer; + private final Function transformer; private final Function buildModel; /** * A cache of {@link TransformedModel} to the transformed {@link BakedModel}. This helps us pool the transformed * instances, reducing memory usage and hopefully ensuring their caches are hit more often! */ - private final Map transformCache = CacheBuilder.newBuilder() + private final Map transformCache = CacheBuilder.newBuilder() .concurrencyLevel(1) .expireAfterAccess(30, TimeUnit.SECONDS) - .build() + .build() .asMap(); /** @@ -87,10 +90,10 @@ public final class TurtleModelParts { .build() .asMap(); - public TurtleModelParts(BakedModel familyModel, BakedModel colourModel, ModelTransformer transformer, Function, T> combineModel) { + public TurtleModelParts(BakedModel familyModel, BakedModel colourModel, Function transformer, Function, T> combineModel) { this.familyModel = familyModel; this.colourModel = colourModel; - this.transformer = x -> transformer.transform(x.getModel(), x.getMatrix()); + this.transformer = transformer; buildModel = x -> combineModel.apply(buildModel(x)); } @@ -129,11 +132,11 @@ public final class TurtleModelParts { var transformation = combo.flip ? flip : identity; var parts = new ArrayList(4); - parts.add(transform(combo.colour() ? colourModel : familyModel, transformation)); + parts.add(transform(combo.colour() ? colourModel : familyModel, transformation, null)); var overlayModelLocation = TurtleBlockEntityRenderer.getTurtleOverlayModel(combo.overlay(), combo.christmas()); if (overlayModelLocation != null) { - parts.add(transform(ClientPlatformHelper.get().getModel(modelManager, overlayModelLocation), transformation)); + parts.add(transform(ClientPlatformHelper.get().getModel(modelManager, overlayModelLocation), transformation, null)); } addUpgrade(parts, transformation, TurtleSide.LEFT, combo.leftUpgrade()); @@ -145,15 +148,11 @@ public final class TurtleModelParts { private void addUpgrade(List parts, Transformation transformation, TurtleSide side, @Nullable UpgradeData upgrade) { if (upgrade == null) return; var model = TurtleUpgradeModellers.getModel(upgrade.upgrade(), upgrade.data(), side); - parts.add(transform(model.getModel(), transformation.compose(model.getMatrix()))); + parts.add(transform(model.getModel(), transformation.compose(model.getMatrix()), side)); } - private BakedModel transform(BakedModel model, Transformation transformation) { - if (transformation.equals(Transformation.identity())) return model; - return transformCache.computeIfAbsent(new TransformedModel(model, transformation), transformer); - } - - public interface ModelTransformer { - BakedModel transform(BakedModel model, Transformation transformation); + private BakedModel transform(BakedModel model, Transformation transformation, @Nullable TurtleSide side) { + if (transformation.equals(Transformation.identity()) && side == null) return model; + return transformCache.computeIfAbsent(new TurtleModelPart(model, transformation, side), transformer); } } diff --git a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java index 43d1681d0..8f6e7c8ed 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java +++ b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelper.java @@ -15,6 +15,8 @@ import net.minecraft.network.protocol.game.ServerGamePacketListener; import net.minecraft.sounds.SoundEvent; import org.jspecify.annotations.Nullable; +import java.util.function.IntUnaryOperator; + public interface ClientPlatformHelper extends dan200.computercraft.impl.client.ClientPlatformHelper { static ClientPlatformHelper get() { return (ClientPlatformHelper) dan200.computercraft.impl.client.ClientPlatformHelper.get(); @@ -38,7 +40,7 @@ public interface ClientPlatformHelper extends dan200.computercraft.impl.client.C * @param overlayLight The current overlay light. * @param tints Block colour tints to apply to the model. */ - void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, int @Nullable [] tints); + void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable IntUnaryOperator tints); /** * Play a record at a particular position. diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java index 9db294f0c..3f473fb3c 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/ModelRenderer.java @@ -17,6 +17,7 @@ import org.joml.Vector4f; import org.jspecify.annotations.Nullable; import java.util.List; +import java.util.function.IntUnaryOperator; /** * Utilities for rendering {@link BakedModel}s and {@link BakedQuad}s. @@ -28,7 +29,7 @@ public final class ModelRenderer { /** * Render a list of {@linkplain BakedQuad quads} to a buffer. *

- * This is not intended to be used directly, but instead by {@link ClientPlatformHelper#renderBakedModel(PoseStack, MultiBufferSource, BakedModel, int, int, int[])}. The + * This is not intended to be used directly, but instead by {@link ClientPlatformHelper#renderBakedModel(PoseStack, MultiBufferSource, BakedModel, int, int, IntUnaryOperator)}. The * implementation here is pretty similar to {@link ItemRenderer#renderQuadList(PoseStack, VertexConsumer, List, ItemStack, int, int)}, * but supports inverted quads (i.e. those with a negative scale). * @@ -39,16 +40,12 @@ public final class ModelRenderer { * @param overlayLight The current overlay light. * @param tints Block colour tints to apply to the model. */ - public static void renderQuads(PoseStack transform, VertexConsumer buffer, List quads, int lightmapCoord, int overlayLight, int @Nullable [] tints) { + public static void renderQuads(PoseStack transform, VertexConsumer buffer, List quads, int lightmapCoord, int overlayLight, @Nullable IntUnaryOperator tints) { var matrix = transform.last(); var inverted = matrix.pose().determinant() < 0; for (var bakedquad : quads) { - var tint = -1; - if (tints != null && bakedquad.isTinted()) { - var idx = bakedquad.getTintIndex(); - if (idx >= 0 && idx < tints.length) tint = tints[bakedquad.getTintIndex()]; - } + var tint = tints != null && bakedquad.isTinted() ? tints.applyAsInt(bakedquad.getTintIndex()) : -1; var r = (float) (tint >> 16 & 255) / 255.0F; var g = (float) (tint >> 8 & 255) / 255.0F; diff --git a/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java b/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java index fea18d967..aebf702a2 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java +++ b/projects/common/src/client/java/dan200/computercraft/client/render/TurtleBlockEntityRenderer.java @@ -25,6 +25,8 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import org.jspecify.annotations.Nullable; +import java.util.function.IntUnaryOperator; + public class TurtleBlockEntityRenderer implements BlockEntityRenderer { private static final ResourceLocation COLOUR_TURTLE_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_colour"); private static final ResourceLocation ELF_OVERLAY_MODEL = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_elf_overlay"); @@ -93,7 +95,7 @@ public class TurtleBlockEntityRenderer implements BlockEntityRenderer x == 0 ? colour : -1); } // Render the overlay @@ -121,12 +123,12 @@ public class TurtleBlockEntityRenderer implements BlockEntityRenderer { + private static final ResourceLocation LEFT = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker_left"); + private static final ResourceLocation RIGHT = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker_right"); + + private static final ResourceLocation LEFT_COLOUR = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker_colour_left"); + private static final ResourceLocation RIGHT_COLOUR = new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker_colour_right"); + + private static final EnumMap SHULKER_COLOURS = Util.make(new EnumMap<>(DyeColor.class), m -> { + m.put(DyeColor.WHITE, colorGetter(0xFFE6EAEA)); + m.put(DyeColor.ORANGE, colorGetter(0xFFF57410)); + m.put(DyeColor.MAGENTA, colorGetter(0xFFBA3FAF)); + m.put(DyeColor.LIGHT_BLUE, colorGetter(0xFF3BB4DB)); + m.put(DyeColor.YELLOW, colorGetter(0xFFFCC724)); + m.put(DyeColor.LIME, colorGetter(0xFF71BC18)); + m.put(DyeColor.PINK, colorGetter(0xFFF38BAA)); + m.put(DyeColor.GRAY, colorGetter(0xFF3E4246)); + m.put(DyeColor.LIGHT_GRAY, colorGetter(0xFF8C8C83)); + m.put(DyeColor.CYAN, colorGetter(0xFF168792)); + m.put(DyeColor.PURPLE, colorGetter(0xFF7426A9)); + m.put(DyeColor.BLUE, colorGetter(0xFF33359B)); + m.put(DyeColor.BROWN, colorGetter(0xFF734828)); + m.put(DyeColor.GREEN, colorGetter(0xFF546D1C)); + m.put(DyeColor.RED, colorGetter(0xFF9C2522)); + m.put(DyeColor.BLACK, colorGetter(0xFF1F1F23)); + }); + + private static IntUnaryOperator colorGetter(int color) { + return layer -> layer == 0 ? color : -1; + } + + @Override + public TransformedModel getModel(TurtleStorage upgrade, @Nullable ITurtleAccess turtle, TurtleSide side) { + var item = upgrade.getCraftingItem().getItem(); + if (item instanceof BlockItem blockItem && blockItem.getBlock() instanceof ShulkerBoxBlock shulkerBoxBlock) { + var color = shulkerBoxBlock.getColor(); + if (color == null) { + return TransformedModel.of(side == TurtleSide.LEFT ? LEFT : RIGHT); + } else { + var modelManager = Minecraft.getInstance().getModelManager(); + var model = ClientPlatformHelper.get().getModel(modelManager, side == TurtleSide.LEFT ? LEFT_COLOUR : RIGHT_COLOUR); + return new TransformedModel(model, Transformation.identity(), SHULKER_COLOURS.get(color)); + } + } else { + return TurtleUpgradeModeller.flatItem().getModel(upgrade, turtle, side); + } + } + + @Override + public Collection getDependencies() { + return List.of(LEFT, RIGHT, LEFT_COLOUR, RIGHT_COLOUR); + } +} diff --git a/projects/common/src/datagen/java/dan200/computercraft/data/BlockModelProvider.java b/projects/common/src/datagen/java/dan200/computercraft/data/BlockModelProvider.java index 234691869..83b0c4db2 100644 --- a/projects/common/src/datagen/java/dan200/computercraft/data/BlockModelProvider.java +++ b/projects/common/src/datagen/java/dan200/computercraft/data/BlockModelProvider.java @@ -100,7 +100,7 @@ class BlockModelProvider { registerRedstoneControl(generators); registerTurtleUpgrade(generators, "block/turtle_crafting_table", new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafty_face")); - registerTurtleUpgrade(generators, "block/turtle_shulker", new ResourceLocation(ResourceLocation.DEFAULT_NAMESPACE, "block/shulker_box")); + registerTurtleUpgrade(generators, "block/turtle_shulker", new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_shulker")); registerTurtleUpgrade(generators, "block/turtle_speaker", new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_face")); registerTurtleModem(generators, "block/turtle_modem_normal", "block/wireless_modem_normal_face"); registerTurtleModem(generators, "block/turtle_modem_advanced", "block/wireless_modem_advanced_face"); diff --git a/projects/common/src/datagen/java/dan200/computercraft/data/DataProviders.java b/projects/common/src/datagen/java/dan200/computercraft/data/DataProviders.java index c0b4740a1..f30eef784 100644 --- a/projects/common/src/datagen/java/dan200/computercraft/data/DataProviders.java +++ b/projects/common/src/datagen/java/dan200/computercraft/data/DataProviders.java @@ -101,8 +101,16 @@ public final class DataProviders { protected void addUpgrades(Consumer>> addUpgrade) { for (var item : BuiltInRegistries.ITEM) { if (item instanceof BlockItem blockItem && blockItem.getBlock() instanceof ShulkerBoxBlock) { + // Shuffle the name about, so blue_shulker_box becomes shulker/blue. This is a bit of a hack to + // ensure they're all grouped together in the creative tab. var name = PlatformHelper.get().getRegistryKey(Registries.ITEM, item).getPath(); - simpleWithCustomItem(new ResourceLocation(ComputerCraftAPI.MOD_ID, name), ModRegistry.TurtleSerialisers.STORAGE.get(), item).add(addUpgrade); + if (name.endsWith("shulker_box")) { + name = name.substring(0, name.length() - "shulker_box".length()); + } + if (name.endsWith("_")) name = name.substring(0, name.length() - 1); + + var id = new ResourceLocation(ComputerCraftAPI.MOD_ID, name.isEmpty() ? "shulker" : "shulker/" + name); + simpleWithCustomItem(id, ModRegistry.TurtleSerialisers.STORAGE.get(), item).add(addUpgrade); } } } diff --git a/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_left.json b/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_left.json index ccd64349d..32e085367 100644 --- a/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_left.json +++ b/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_left.json @@ -1 +1,4 @@ -{"parent": "computercraft:block/turtle_upgrade_base_left", "textures": {"texture": "minecraft:block/shulker_box"}} +{ + "parent": "computercraft:block/turtle_upgrade_base_left", + "textures": {"texture": "computercraft:block/turtle_shulker"} +} diff --git a/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_right.json b/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_right.json index da8407e26..b48e9ba05 100644 --- a/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_right.json +++ b/projects/common/src/generated/resources/assets/computercraft/models/block/turtle_shulker_right.json @@ -1 +1,4 @@ -{"parent": "computercraft:block/turtle_upgrade_base_right", "textures": {"texture": "minecraft:block/shulker_box"}} +{ + "parent": "computercraft:block/turtle_upgrade_base_right", + "textures": {"texture": "computercraft:block/turtle_shulker"} +} diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/black_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/black.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/black_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/black.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/blue_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/blue.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/blue_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/blue.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/brown_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/brown.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/brown_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/brown.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/cyan_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/cyan.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/cyan_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/cyan.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/gray_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/gray.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/gray_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/gray.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/green_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/green.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/green_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/green.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/light_blue_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/light_blue.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/light_blue_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/light_blue.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/light_gray_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/light_gray.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/light_gray_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/light_gray.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/lime_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/lime.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/lime_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/lime.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/magenta_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/magenta.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/magenta_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/magenta.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/orange_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/orange.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/orange_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/orange.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/pink_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/pink.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/pink_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/pink.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/purple_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/purple.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/purple_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/purple.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/red_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/red.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/red_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/red.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/white_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/white.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/white_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/white.json diff --git a/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/yellow_shulker_box.json b/projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/yellow.json similarity index 100% rename from projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/yellow_shulker_box.json rename to projects/common/src/generated/resources/resourcepacks/turtle_storage/data/computercraft/computercraft/turtle_upgrades/shulker/yellow.json diff --git a/projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_left.json b/projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_left.json new file mode 100644 index 000000000..7c63b21c1 --- /dev/null +++ b/projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_left.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "texture": "computercraft:block/turtle_shulker_colour", + "particle": "#texture" + }, + "elements": [ + { + "from": [ 0.5, 4.5, 3.5 ], + "to": [ 2, 12.5, 11.5 ], + "faces": { + "down": { "uv": [ 2, 14, 14, 16 ], "texture": "#texture", "rotation": 270, "tintindex": 0 }, + "up": { "uv": [ 2, 0, 14, 3 ], "texture": "#texture", "rotation": 90, "tintindex": 0 }, + "north": { "uv": [ 0, 2, 3, 14 ], "texture": "#texture", "tintindex": 0 }, + "south": { "uv": [ 13, 2, 16, 14 ], "texture": "#texture", "tintindex": 0 }, + "west": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture", "tintindex": 0 } + } + } + ] +} diff --git a/projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_right.json b/projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_right.json new file mode 100644 index 000000000..4ff8b6c9d --- /dev/null +++ b/projects/common/src/main/resources/assets/computercraft/models/block/turtle_shulker_colour_right.json @@ -0,0 +1,20 @@ +{ + "parent": "block/block", + "textures": { + "texture": "computercraft:block/turtle_shulker_colour", + "particle": "#texture" + }, + "elements": [ + { + "from": [ 14, 4.5, 3.5 ], + "to": [ 15.5, 12.5, 11.5 ], + "faces": { + "down": { "uv": [ 2, 14, 14, 16 ], "texture": "#texture", "rotation": 90, "tintindex": 0 }, + "up": { "uv": [ 2, 0, 14, 3 ], "texture": "#texture", "rotation": 270, "tintindex": 0 }, + "north": { "uv": [ 13, 2, 16, 14 ], "texture": "#texture", "tintindex": 0 }, + "south": { "uv": [ 0, 2, 3, 14 ], "texture": "#texture", "tintindex": 0 }, + "east": { "uv": [ 2, 2, 14, 14 ], "texture": "#texture", "tintindex": 0 } + } + } + ] +} diff --git a/projects/common/src/main/resources/assets/computercraft/textures/block/turtle_shulker.png b/projects/common/src/main/resources/assets/computercraft/textures/block/turtle_shulker.png new file mode 100644 index 0000000000000000000000000000000000000000..b5393695f5bcc3bf7ad59cc00f00ae64934e322d GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUO;2@9g{>8@p2_yo{(tA)_alAl{l6u?(NC8aJ#c*c h`V=oSy&y literal 0 HcmV?d00001 diff --git a/projects/common/src/main/resources/assets/computercraft/textures/block/turtle_shulker_colour.png b/projects/common/src/main/resources/assets/computercraft/textures/block/turtle_shulker_colour.png new file mode 100644 index 0000000000000000000000000000000000000000..1405f7c11593cbb55bbed8d38d70bf3bc18866ba GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU|N73o$|KRL22A#kw&q~<#nPggK8Wu8jTsAtZ-EK}RX1Bt`^>KknHnb4v*1_Y+bx17`*(j|>}6BLeECZ3-PpCMd^2CJ-}P&u zD2s9BSKYg7?;cy&nLB;5P^P2K#lEe4)oZ_3&t-hj!`bb5T5w;J-*SyC#{V&q-1}#2 T|Ix$1z`)??>gTe~DWM4fLJgPD literal 0 HcmV?d00001 diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/FabricModelTransformer.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/FabricModelTransformer.java index 7e5342477..55bbea511 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/model/FabricModelTransformer.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/FabricModelTransformer.java @@ -5,18 +5,20 @@ package dan200.computercraft.client.model; import com.mojang.math.Transformation; +import dan200.computercraft.api.turtle.TurtleSide; import dan200.computercraft.client.model.turtle.ModelTransformer; import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.minecraft.core.Direction; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; /** * Extends {@link ModelTransformer} to also work as a {@link RenderContext.QuadTransform}. */ public class FabricModelTransformer extends ModelTransformer implements RenderContext.QuadTransform { - public FabricModelTransformer(Transformation transformation) { - super(transformation); + public FabricModelTransformer(Transformation transformation, @Nullable TurtleSide side) { + super(transformation, side); } @Override @@ -36,6 +38,8 @@ public class FabricModelTransformer extends ModelTransformer implements RenderCo var face = quad.nominalFace(); if (face != null) quad.nominalFace(Direction.rotate(transformation, face)); + quad.colorIndex(getTintIndex(quad.colorIndex())); + return true; } diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java b/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java index ac614c01c..83b606741 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java @@ -4,8 +4,8 @@ package dan200.computercraft.client.model; -import com.mojang.math.Transformation; import dan200.computercraft.client.model.turtle.ModelTransformer; +import dan200.computercraft.client.model.turtle.TurtleModelParts; import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -29,9 +29,9 @@ import java.util.function.Supplier; public class TransformedBakedModel extends ForwardingBakedModel { private final FabricModelTransformer transformation; - public TransformedBakedModel(BakedModel model, Transformation transformation) { - wrapped = model; - this.transformation = new FabricModelTransformer(transformation); + public TransformedBakedModel(TurtleModelParts.TurtleModelPart part) { + wrapped = part.model(); + this.transformation = new FabricModelTransformer(part.matrix(), part.side()); } @Override diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java b/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java index b8aebca17..8f84edb5e 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java @@ -28,6 +28,8 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.util.RandomSource; import org.jspecify.annotations.Nullable; +import java.util.function.IntUnaryOperator; + @AutoService(dan200.computercraft.impl.client.ClientPlatformHelper.class) public class ClientPlatformHelperImpl implements ClientPlatformHelper { private static final RandomSource random = RandomSource.create(0); @@ -51,7 +53,7 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper { } @Override - public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, int @Nullable [] tints) { + public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable IntUnaryOperator tints) { // Unfortunately we can't call Fabric's emitItemQuads here, as there's no way to obtain a RenderContext via the // API. Instead, we special case our FoiledModel, and just render everything else normally. var buffer = ItemRenderer.getFoilBuffer(buffers, Sheets.translucentCullBlockSheet(), true, model instanceof FoiledModel); diff --git a/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java b/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java index c36f4de2a..d2b18be8c 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/model/TransformedBakedModel.java @@ -4,8 +4,8 @@ package dan200.computercraft.client.model; -import com.mojang.math.Transformation; import dan200.computercraft.client.model.turtle.ModelTransformer; +import dan200.computercraft.client.model.turtle.TurtleModelParts; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.resources.model.BakedModel; @@ -26,9 +26,9 @@ import java.util.List; public class TransformedBakedModel extends BakedModelWrapper { private final ModelTransformer transformation; - public TransformedBakedModel(BakedModel model, Transformation transformation) { - super(model); - this.transformation = new ModelTransformer(transformation); + public TransformedBakedModel(TurtleModelParts.TurtleModelPart part) { + super(part.model()); + this.transformation = new ModelTransformer(part.matrix(), part.side()); } @Override diff --git a/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java b/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java index 86fb1fe4c..d8f35a684 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/platform/ClientPlatformHelperImpl.java @@ -27,6 +27,7 @@ import net.minecraftforge.client.model.data.ModelData; import org.jspecify.annotations.Nullable; import java.util.Arrays; +import java.util.function.IntUnaryOperator; @AutoService(dan200.computercraft.impl.client.ClientPlatformHelper.class) public class ClientPlatformHelperImpl implements ClientPlatformHelper { @@ -49,7 +50,7 @@ public class ClientPlatformHelperImpl implements ClientPlatformHelper { } @Override - public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, int @Nullable [] tints) { + public void renderBakedModel(PoseStack transform, MultiBufferSource buffers, BakedModel model, int lightmapCoord, int overlayLight, @Nullable IntUnaryOperator tints) { for (var renderType : model.getRenderTypes(ItemStack.EMPTY, true)) { var buffer = buffers.getBuffer(renderType); for (var face : directions) {