From 05bdcf6f3ecf60b8a9c5e734d1e679a28f979755 Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Tue, 19 Aug 2025 17:04:57 +0200 Subject: [PATCH 1/8] Update ValueBoxRenderer.java --- .../behaviour/ValueBoxRenderer.java | 67 +++++-------------- 1 file changed, 15 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index 33d65c4c5b..9742af24b8 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -30,66 +30,29 @@ public static void renderItemIntoValueBox(ItemStack filter, PoseStack ms, MultiB BakedModel modelWithOverrides = itemRenderer.getModel(filter, null, null, 0); boolean blockItem = modelWithOverrides.isGui3d(); float scale = (!blockItem ? .5f : 1f) + 1 / 64f; - float zOffset = (!blockItem ? -.15f : 0) + customZOffset(filter.getItem()); + float zOffset = !blockItem ? -.15f : customZOffset(filter.getItem()); ms.scale(scale, scale, scale); ms.translate(0, 0, zOffset); itemRenderer.render(filter, ItemDisplayContext.FIXED, false, ms, buffer, light, overlay, modelWithOverrides); } - public static void renderFlatItemIntoValueBox(ItemStack filter, PoseStack ms, MultiBufferSource buffer, int light, - int overlay) { - if (filter.isEmpty()) - return; - - int bl = light >> 4 & 0xf; - int sl = light >> 20 & 0xf; - int itemLight = Mth.floor(sl + .5) << 20 | (Mth.floor(bl + .5) & 0xf) << 4; - - ms.pushPose(); - TransformStack.of(ms) - .rotateXDegrees(230); - Matrix3f copy = new Matrix3f(ms.last() - .normal()); - ms.popPose(); - - ms.pushPose(); + public static void renderFlatItemIntoValueBox(ItemStack filter, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { + if (filter.isEmpty()) return; TransformStack.of(ms) - .translate(0, 0, -1 / 4f) - .translate(0, 0, 1 / 32f + .001) - .rotateYDegrees(180); - - PoseStack squashedMS = new PoseStack(); - squashedMS.last() - .pose() - .mul(ms.last() - .pose()); - squashedMS.scale(.5f, .5f, 1 / 1024f); - squashedMS.last() - .normal() - .set(copy); + .translate(0, 0, -1 / 4f + 1 / 32f + .001) + .rotateYDegrees(180) + .scale(.5f, .5f, 1 / 1024f); Minecraft mc = Minecraft.getInstance(); - mc.getItemRenderer() - .renderStatic(filter, ItemDisplayContext.GUI, itemLight, OverlayTexture.NO_OVERLAY, squashedMS, buffer, mc.level, 0); - - ms.popPose(); + ItemRenderer itemRenderer = mc.getItemRenderer(); + itemRenderer.renderStatic(filter, ItemDisplayContext.GUI, light, OverlayTexture.NO_OVERLAY, ms, buffer, mc.level, 0); } - @SuppressWarnings("deprecation") - private static float customZOffset(Item item) { - float nudge = -.1f; - if (item instanceof BlockItem) { - Block block = ((BlockItem) item).getBlock(); - if (block instanceof AbstractSimpleShaftBlock) - return nudge; - if (block instanceof FenceBlock) - return nudge; - if (block.builtInRegistryHolder() - .is(BlockTags.BUTTONS)) - return nudge; - if (block == Blocks.END_ROD) - return nudge; - } - return 0; - } + private static float customZOffset(Item item) { + if (!(item instanceof BlockItem blockItem)) return 0f; + VoxelShape shape = blockItem.getBlock().defaultBlockState().getShape(null, BlockPos.ZERO); + if (shape.isEmpty()) return 0f; + double thickness = shape.max(Direction.Axis.Z) - shape.min(Direction.Axis.Z); + return thickness <= .25 ? -.1f : 0f; + } } From 4f3638914fc8cb67fef5e5e038f45a835830344b Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Tue, 19 Aug 2025 17:17:08 +0200 Subject: [PATCH 2/8] Update ValueBoxRenderer.java --- .../blockEntity/behaviour/ValueBoxRenderer.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index 9742af24b8..57f2dab289 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -1,25 +1,19 @@ package com.simibubi.create.foundation.blockEntity.behaviour; -import org.joml.Matrix3f; - import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.kinetics.simpleRelays.AbstractSimpleShaftBlock; - import dev.engine_room.flywheel.lib.transform.TransformStack; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.tags.BlockTags; -import net.minecraft.util.Mth; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.FenceBlock; +import net.minecraft.world.phys.shapes.VoxelShape; public class ValueBoxRenderer { From 6fae8a0a0c7d0d87c3c503b9dd00f957da933c93 Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Thu, 21 Aug 2025 12:04:59 +0200 Subject: [PATCH 3/8] Fix gear rendering in ValueBoxRenderer.java --- .../behaviour/ValueBoxRenderer.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index 57f2dab289..513a090196 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -13,7 +13,9 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.shapes.VoxelShape; +import com.simibubi.create.content.kinetics.simpleRelays.AbstractSimpleShaftBlock; public class ValueBoxRenderer { @@ -41,12 +43,17 @@ public static void renderFlatItemIntoValueBox(ItemStack filter, PoseStack ms, Mu itemRenderer.renderStatic(filter, ItemDisplayContext.GUI, light, OverlayTexture.NO_OVERLAY, ms, buffer, mc.level, 0); } - private static float customZOffset(Item item) { - if (!(item instanceof BlockItem blockItem)) return 0f; - VoxelShape shape = blockItem.getBlock().defaultBlockState().getShape(null, BlockPos.ZERO); - if (shape.isEmpty()) return 0f; - double thickness = shape.max(Direction.Axis.Z) - shape.min(Direction.Axis.Z); - return thickness <= .25 ? -.1f : 0f; + private static float customZOffset(Item item) { + final float nudge = -.1f; + if (!(item instanceof BlockItem blockItem)) return 0f; + // Special case : gears are thick enough but need to be offset anyway + Block block = blockItem.getBlock(); + if (block instanceof AbstractSimpleShaftBlock) return nudge; + // General case : determine offset based on shape thickness + VoxelShape shape = block.defaultBlockState().getShape(null, BlockPos.ZERO); + if (shape.isEmpty()) return 0f; + double thickness = shape.max(Direction.Axis.Z) - shape.min(Direction.Axis.Z); + return thickness <= .25 ? nudge : 0f; } } From ff228ff772ca096ffd42e90dab5819a2eb8e1fb1 Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Thu, 21 Aug 2025 13:39:58 +0200 Subject: [PATCH 4/8] Defensive check --- src/main/java/com/simibubi/create/foundation/block/IBE.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/simibubi/create/foundation/block/IBE.java b/src/main/java/com/simibubi/create/foundation/block/IBE.java index c2a21d67d1..02530577ba 100644 --- a/src/main/java/com/simibubi/create/foundation/block/IBE.java +++ b/src/main/java/com/simibubi/create/foundation/block/IBE.java @@ -69,6 +69,8 @@ default BlockEntityTicker getTicker(Level p_153212_, @Nullable @SuppressWarnings("unchecked") default T getBlockEntity(BlockGetter worldIn, BlockPos pos) { + if (worldIn == null) + return null; BlockEntity blockEntity = worldIn.getBlockEntity(pos); Class expectedClass = getBlockEntityClass(); From f42c2f2d688deefd22aec69daa80ca8301923458 Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Thu, 21 Aug 2025 13:55:08 +0200 Subject: [PATCH 5/8] can't assume block getter is nullable... --- .../blockEntity/behaviour/ValueBoxRenderer.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index 513a090196..58c3cb9ce3 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -50,10 +50,20 @@ private static float customZOffset(Item item) { Block block = blockItem.getBlock(); if (block instanceof AbstractSimpleShaftBlock) return nudge; // General case : determine offset based on shape thickness - VoxelShape shape = block.defaultBlockState().getShape(null, BlockPos.ZERO); + BlockState state = block.defaultBlockState(); + VoxelShape shape = state.getShape(new DummyBlockGetter(state), BlockPos.ZERO); if (shape.isEmpty()) return 0f; double thickness = shape.max(Direction.Axis.Z) - shape.min(Direction.Axis.Z); return thickness <= .25 ? nudge : 0f; - } - + } + + private static class DummyBlockGetter implements BlockGetter { + private final BlockState state; + public DummyBlockGetter(BlockState state) { this.state = state; } + @Override public BlockState getBlockState(BlockPos pos) { return state; } + @Override public FluidState getFluidState(BlockPos pos) { return state.getFluidState(); } + @Override public int getHeight() { return 0; } + @Override public int getMinBuildHeight() { return 0; } + @Override public BlockEntity getBlockEntity(BlockPos pos) { return null; } + } } From 28096d4003723b22d6779e820cd49f80a1740b81 Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Thu, 21 Aug 2025 13:58:27 +0200 Subject: [PATCH 6/8] can't assume blockgetter is nullable --- .../blockEntity/behaviour/ValueBoxRenderer.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index 58c3cb9ce3..d1f44e1941 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -13,6 +13,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.EmptyBlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.shapes.VoxelShape; import com.simibubi.create.content.kinetics.simpleRelays.AbstractSimpleShaftBlock; @@ -50,20 +51,9 @@ private static float customZOffset(Item item) { Block block = blockItem.getBlock(); if (block instanceof AbstractSimpleShaftBlock) return nudge; // General case : determine offset based on shape thickness - BlockState state = block.defaultBlockState(); - VoxelShape shape = state.getShape(new DummyBlockGetter(state), BlockPos.ZERO); + VoxelShape shape = block.defaultBlockState().getShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO); if (shape.isEmpty()) return 0f; double thickness = shape.max(Direction.Axis.Z) - shape.min(Direction.Axis.Z); return thickness <= .25 ? nudge : 0f; } - - private static class DummyBlockGetter implements BlockGetter { - private final BlockState state; - public DummyBlockGetter(BlockState state) { this.state = state; } - @Override public BlockState getBlockState(BlockPos pos) { return state; } - @Override public FluidState getFluidState(BlockPos pos) { return state.getFluidState(); } - @Override public int getHeight() { return 0; } - @Override public int getMinBuildHeight() { return 0; } - @Override public BlockEntity getBlockEntity(BlockPos pos) { return null; } - } } From 5a979734ddf0e546b0c2111bc2226592b290007f Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Thu, 28 Aug 2025 20:55:01 +0200 Subject: [PATCH 7/8] Reverting to vertex-only transform Reverting to vertex-only transform (see issue) --- .../foundation/blockEntity/behaviour/ValueBoxRenderer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index d1f44e1941..ebad110f9c 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -38,9 +38,10 @@ public static void renderFlatItemIntoValueBox(ItemStack filter, PoseStack ms, Mu TransformStack.of(ms) .translate(0, 0, -1 / 4f + 1 / 32f + .001) .rotateYDegrees(180) - .scale(.5f, .5f, 1 / 1024f); - Minecraft mc = Minecraft.getInstance(); - ItemRenderer itemRenderer = mc.getItemRenderer(); + .scale(.5f, .5f, .5f); + // Then, squash it flat, but leave the normals unaffected by this last transform + ms.last().pose().scale(1f, 1f, 1 / 512f); + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); itemRenderer.renderStatic(filter, ItemDisplayContext.GUI, light, OverlayTexture.NO_OVERLAY, ms, buffer, mc.level, 0); } From ad39c936acd58a48b832d5b2cba6423e64be8d27 Mon Sep 17 00:00:00 2001 From: fabien-gigante Date: Thu, 28 Aug 2025 21:10:11 +0200 Subject: [PATCH 8/8] Revert to vertex-only transform --- .../foundation/blockEntity/behaviour/ValueBoxRenderer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java index ebad110f9c..ff97d5d1b5 100644 --- a/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/blockEntity/behaviour/ValueBoxRenderer.java @@ -41,7 +41,8 @@ public static void renderFlatItemIntoValueBox(ItemStack filter, PoseStack ms, Mu .scale(.5f, .5f, .5f); // Then, squash it flat, but leave the normals unaffected by this last transform ms.last().pose().scale(1f, 1f, 1 / 512f); - ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); + Minecraft mc = Minecraft.getInstance(); + ItemRenderer itemRenderer = mc.getItemRenderer(); itemRenderer.renderStatic(filter, ItemDisplayContext.GUI, light, OverlayTexture.NO_OVERLAY, ms, buffer, mc.level, 0); }