Skip to content

Commit e69d90a

Browse files
committed
Fix quad culling of 2D items that have been rotated
1 parent f8790d8 commit e69d90a

File tree

5 files changed

+97
-18
lines changed

5 files changed

+97
-18
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package mezz.jei.common.util;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import net.minecraft.client.renderer.block.model.BakedQuad;
5+
import net.minecraft.core.Direction;
6+
import org.joml.Matrix4f;
7+
import org.joml.Vector3f;
8+
9+
import java.util.List;
10+
11+
public final class QuadUtil {
12+
private QuadUtil() {}
13+
14+
public static List<BakedQuad> getQuadsFacingDirection(List<BakedQuad> quads, PoseStack poseStack, Direction facing) {
15+
Matrix4f pose = poseStack.last().pose();
16+
17+
Direction.Axis axis = facing.getAxis();
18+
float facingStep = facing.getAxisDirection().getStep();
19+
20+
return quads
21+
.stream()
22+
.filter(q -> {
23+
Direction quadDirection = q.getDirection();
24+
Vector3f transformedDirection = pose.transformDirection(quadDirection.step());
25+
double value = axis.choose(transformedDirection.x, transformedDirection.y, transformedDirection.z);
26+
if (facingStep > 0) {
27+
return value > 0;
28+
} else {
29+
return value < 0;
30+
}
31+
})
32+
.toList();
33+
}
34+
}

Fabric/src/main/java/mezz/jei/fabric/platform/FabricLimitedQuadItemModel.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package mezz.jei.fabric.platform;
22

3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import mezz.jei.common.util.QuadUtil;
35
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
46
import net.minecraft.client.renderer.block.model.BakedQuad;
7+
import net.minecraft.client.renderer.block.model.ItemTransform;
58
import net.minecraft.client.resources.model.BakedModel;
69
import net.minecraft.core.Direction;
710
import net.minecraft.util.RandomSource;
11+
import net.minecraft.world.item.ItemDisplayContext;
812
import net.minecraft.world.level.block.state.BlockState;
913
import org.jetbrains.annotations.Nullable;
1014

@@ -28,10 +32,17 @@ private FabricLimitedQuadItemModel(BakedModel model) {
2832
public List<BakedQuad> getQuads(BlockState blockState, @Nullable Direction face, RandomSource rand) {
2933
if (face == null) {
3034
if (quads == null) {
31-
quads = wrapped.getQuads(blockState, null, rand)
32-
.stream()
33-
.filter(q -> q.getDirection() == Direction.SOUTH)
34-
.toList();
35+
List<BakedQuad> originalQuads = wrapped.getQuads(blockState, null, rand);
36+
37+
PoseStack poseStack = new PoseStack();
38+
39+
ItemTransform guiTransform = wrapped.getTransforms().getTransform(ItemDisplayContext.GUI);
40+
guiTransform.apply(false, poseStack);
41+
42+
quads = QuadUtil.getQuadsFacingDirection(originalQuads, poseStack, Direction.SOUTH);
43+
if (quads.isEmpty()) {
44+
quads = originalQuads;
45+
}
3546
}
3647
return quads;
3748
}

Forge/src/main/java/mezz/jei/forge/platform/ForgeLimitedQuadItemModel.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mezz.jei.forge.platform;
22

33
import com.mojang.blaze3d.vertex.PoseStack;
4+
import mezz.jei.common.util.QuadUtil;
45
import net.minecraft.client.renderer.RenderType;
56
import net.minecraft.client.renderer.block.model.BakedQuad;
67
import net.minecraft.client.resources.model.BakedModel;
@@ -36,10 +37,21 @@ private ForgeLimitedQuadItemModel(BakedModel originalModel) {
3637
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource) {
3738
if (direction == null) {
3839
if (quads == null) {
39-
quads = originalModel.getQuads(blockState, null, randomSource)
40-
.stream()
41-
.filter(q -> q.getDirection() == Direction.SOUTH)
42-
.toList();
40+
List<BakedQuad> originalQuads = originalModel.getQuads(blockState, null, randomSource);
41+
42+
PoseStack poseStack = new PoseStack();
43+
44+
BakedModel bakedModel = originalModel.applyTransform(ItemDisplayContext.GUI, poseStack, false);
45+
if (bakedModel != originalModel) {
46+
// this shouldn't be possible because we don't wrap IDynamicBakedModels
47+
// we can't easily understand which way the quads will face in this case, so don't cull or cache any quads
48+
return originalQuads;
49+
}
50+
51+
quads = QuadUtil.getQuadsFacingDirection(originalQuads, poseStack, Direction.SOUTH);
52+
if (quads.isEmpty()) {
53+
quads = originalQuads;
54+
}
4355
}
4456
return quads;
4557
}

NeoForge/src/main/java/mezz/jei/neoforge/platform/NeoForgeLimitedQuadItemModel.java

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mezz.jei.neoforge.platform;
22

33
import com.mojang.blaze3d.vertex.PoseStack;
4+
import mezz.jei.common.util.QuadUtil;
45
import net.minecraft.client.renderer.RenderType;
56
import net.minecraft.client.renderer.block.model.BakedQuad;
67
import net.minecraft.client.resources.model.BakedModel;
@@ -36,24 +37,46 @@ private NeoForgeLimitedQuadItemModel(BakedModel originalModel) {
3637
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource) {
3738
if (direction == null) {
3839
if (quads == null) {
39-
quads = originalModel.getQuads(blockState, null, randomSource)
40-
.stream()
41-
.filter(q -> q.getDirection() == Direction.SOUTH)
42-
.toList();
40+
List<BakedQuad> originalQuads = originalModel.getQuads(blockState, null, randomSource);
41+
42+
PoseStack poseStack = new PoseStack();
43+
44+
BakedModel bakedModel = originalModel.applyTransform(ItemDisplayContext.GUI, poseStack, false);
45+
if (bakedModel != originalModel) {
46+
// this shouldn't be possible because we don't wrap IDynamicBakedModels
47+
// we can't easily understand which way the quads will face in this case, so don't cull or cache any quads
48+
return originalQuads;
49+
}
50+
51+
quads = QuadUtil.getQuadsFacingDirection(originalQuads, poseStack, Direction.SOUTH);
52+
if (quads.isEmpty()) {
53+
quads = originalQuads;
54+
}
4355
}
4456
return quads;
4557
}
46-
return List.of();
58+
return originalModel.getQuads(blockState, direction, randomSource);
4759
}
4860

4961
@Override
5062
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource, ModelData extraData, @Nullable RenderType renderType) {
5163
if (direction == null) {
5264
if (quads == null) {
53-
quads = originalModel.getQuads(blockState, null, randomSource, extraData, renderType)
54-
.stream()
55-
.filter(q -> q.getDirection() == Direction.SOUTH)
56-
.toList();
65+
List<BakedQuad> originalQuads = originalModel.getQuads(blockState, null, randomSource, extraData, renderType);
66+
67+
PoseStack poseStack = new PoseStack();
68+
69+
BakedModel bakedModel = originalModel.applyTransform(ItemDisplayContext.GUI, poseStack, false);
70+
if (bakedModel != originalModel) {
71+
// this shouldn't be possible because we don't wrap IDynamicBakedModels
72+
// we can't easily understand which way the quads will face in this case, so don't cull or cache any quads
73+
return originalQuads;
74+
}
75+
76+
quads = QuadUtil.getQuadsFacingDirection(originalQuads, poseStack, Direction.SOUTH);
77+
if (quads.isEmpty()) {
78+
quads = originalQuads;
79+
}
5780
}
5881
return quads;
5982
}

NeoForge/src/main/java/mezz/jei/neoforge/platform/RenderHelper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import net.minecraft.world.item.ItemStack;
1919
import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions;
2020
import net.neoforged.neoforge.client.extensions.common.IClientMobEffectExtensions;
21-
import net.neoforged.neoforge.client.model.IDynamicBakedModel;
2221
import net.neoforged.neoforge.client.model.data.ModelData;
2322
import net.neoforged.neoforge.common.Tags;
2423

0 commit comments

Comments
 (0)