Skip to content

Commit 401bb43

Browse files
committed
Improve compatibility of LimitedQuadItemModel with platform-specific rendering methods
1 parent f8c0de9 commit 401bb43

File tree

10 files changed

+229
-74
lines changed

10 files changed

+229
-74
lines changed

Common/src/main/java/mezz/jei/common/platform/IPlatformRenderHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ public interface IPlatformRenderHelper {
3232
void renderTooltip(GuiGraphics guiGraphics, List<Either<FormattedText, TooltipComponent>> elements, int x, int y, Font font, ItemStack stack);
3333

3434
Component getName(TagKey<?> tagKey);
35+
36+
BakedModel createLimitedQuadItemModel(BakedModel bakedModel);
3537
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package mezz.jei.fabric.platform;
2+
3+
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
4+
import net.minecraft.client.renderer.block.model.BakedQuad;
5+
import net.minecraft.client.resources.model.BakedModel;
6+
import net.minecraft.core.Direction;
7+
import net.minecraft.util.RandomSource;
8+
import net.minecraft.world.level.block.state.BlockState;
9+
import org.jetbrains.annotations.Nullable;
10+
11+
import java.util.List;
12+
13+
public class FabricLimitedQuadItemModel extends ForwardingBakedModel {
14+
public static BakedModel wrap(BakedModel model) {
15+
if (!model.isVanillaAdapter() || model instanceof FabricLimitedQuadItemModel) {
16+
return model;
17+
}
18+
return new FabricLimitedQuadItemModel(model);
19+
}
20+
21+
private @Nullable List<BakedQuad> quads;
22+
23+
private FabricLimitedQuadItemModel(BakedModel model) {
24+
this.wrapped = model;
25+
}
26+
27+
@Override
28+
public List<BakedQuad> getQuads(BlockState blockState, @Nullable Direction face, RandomSource rand) {
29+
if (face == null) {
30+
if (quads == null) {
31+
quads = wrapped.getQuads(blockState, null, rand)
32+
.stream()
33+
.filter(q -> q.getDirection() == Direction.SOUTH)
34+
.toList();
35+
}
36+
return quads;
37+
}
38+
return List.of();
39+
}
40+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,9 @@ private ClientTooltipComponent createClientTooltipComponent(TooltipComponent too
8181
}
8282
return ClientTooltipComponent.create(tooltipComponent);
8383
}
84+
85+
@Override
86+
public BakedModel createLimitedQuadItemModel(BakedModel bakedModel) {
87+
return FabricLimitedQuadItemModel.wrap(bakedModel);
88+
}
8489
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package mezz.jei.forge.platform;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import net.minecraft.client.renderer.RenderType;
5+
import net.minecraft.client.renderer.block.model.BakedQuad;
6+
import net.minecraft.client.resources.model.BakedModel;
7+
import net.minecraft.core.Direction;
8+
import net.minecraft.util.RandomSource;
9+
import net.minecraft.world.item.ItemDisplayContext;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.level.block.state.BlockState;
12+
import net.minecraftforge.client.model.BakedModelWrapper;
13+
import net.minecraftforge.client.model.IDynamicBakedModel;
14+
import net.minecraftforge.client.model.data.ModelData;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
public class ForgeLimitedQuadItemModel extends BakedModelWrapper<BakedModel> {
21+
public static BakedModel wrap(BakedModel model) {
22+
if (model instanceof IDynamicBakedModel || model instanceof ForgeLimitedQuadItemModel) {
23+
return model;
24+
}
25+
return new ForgeLimitedQuadItemModel(model);
26+
}
27+
28+
private @Nullable List<BakedQuad> quads;
29+
30+
private ForgeLimitedQuadItemModel(BakedModel originalModel) {
31+
super(originalModel);
32+
}
33+
34+
@Override
35+
@Deprecated
36+
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource) {
37+
if (direction == null) {
38+
if (quads == null) {
39+
quads = originalModel.getQuads(blockState, null, randomSource)
40+
.stream()
41+
.filter(q -> q.getDirection() == Direction.SOUTH)
42+
.toList();
43+
}
44+
return quads;
45+
}
46+
return List.of();
47+
}
48+
49+
@Override
50+
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource, ModelData extraData, @Nullable RenderType renderType) {
51+
if (direction == null) {
52+
if (quads == null) {
53+
quads = originalModel.getQuads(blockState, null, randomSource, extraData, renderType)
54+
.stream()
55+
.filter(q -> q.getDirection() == Direction.SOUTH)
56+
.toList();
57+
}
58+
return quads;
59+
}
60+
return List.of();
61+
}
62+
63+
@Override
64+
public BakedModel applyTransform(ItemDisplayContext cameraTransformType, PoseStack poseStack, boolean applyLeftHandTransform) {
65+
BakedModel model = super.applyTransform(cameraTransformType, poseStack, applyLeftHandTransform);
66+
if (model == this.originalModel) {
67+
return this;
68+
}
69+
return model;
70+
}
71+
72+
@Override
73+
public List<BakedModel> getRenderPasses(ItemStack itemStack, boolean fabulous) {
74+
List<BakedModel> renderPasses = super.getRenderPasses(itemStack, fabulous);
75+
List<BakedModel> result = new ArrayList<>(renderPasses.size());
76+
for (BakedModel bakedModel : renderPasses) {
77+
if (bakedModel == this.originalModel) {
78+
bakedModel = this;
79+
}
80+
result.add(bakedModel);
81+
}
82+
return result;
83+
}
84+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public Component getName(TagKey<?> tagKey) {
7575
return Component.translatableWithFallback(tagTranslationKey, "#" + tagKey.location());
7676
}
7777

78+
@Override
79+
public BakedModel createLimitedQuadItemModel(BakedModel bakedModel) {
80+
return ForgeLimitedQuadItemModel.wrap(bakedModel);
81+
}
7882

7983
private static String getTagTranslationKey(TagKey<?> tagKey) {
8084
StringBuilder stringBuilder = new StringBuilder();

Library/src/main/java/mezz/jei/library/render/batch/ItemStackBatchRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ public ItemStackBatchRenderer(Minecraft minecraft, List<BatchRenderElement<ItemS
4747
useBlockLight.add(elementWithModel);
4848
} else {
4949
if (!bakedmodel.isGui3d()) {
50-
bakedmodel = new LimitedQuadItemModel(bakedmodel);
50+
IPlatformRenderHelper renderHelper = Services.PLATFORM.getRenderHelper();
51+
bakedmodel = renderHelper.createLimitedQuadItemModel(bakedmodel);
5152
}
5253
ElementWithModel elementWithModel = new ElementWithModel(bakedmodel, itemStack, element.x(), element.y());
5354
noBlockLight.add(elementWithModel);

Library/src/main/java/mezz/jei/library/render/batch/LimitedQuadItemModel.java

Lines changed: 0 additions & 71 deletions
This file was deleted.
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package mezz.jei.neoforge.platform;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import net.minecraft.client.renderer.RenderType;
5+
import net.minecraft.client.renderer.block.model.BakedQuad;
6+
import net.minecraft.client.resources.model.BakedModel;
7+
import net.minecraft.core.Direction;
8+
import net.minecraft.util.RandomSource;
9+
import net.minecraft.world.item.ItemDisplayContext;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.level.block.state.BlockState;
12+
import net.neoforged.neoforge.client.model.BakedModelWrapper;
13+
import net.neoforged.neoforge.client.model.IDynamicBakedModel;
14+
import net.neoforged.neoforge.client.model.data.ModelData;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
20+
public class NeoForgeLimitedQuadItemModel extends BakedModelWrapper<BakedModel> {
21+
public static BakedModel wrap(BakedModel model) {
22+
if (model instanceof IDynamicBakedModel || model instanceof NeoForgeLimitedQuadItemModel) {
23+
return model;
24+
}
25+
return new NeoForgeLimitedQuadItemModel(model);
26+
}
27+
28+
private @Nullable List<BakedQuad> quads;
29+
30+
private NeoForgeLimitedQuadItemModel(BakedModel originalModel) {
31+
super(originalModel);
32+
}
33+
34+
@Override
35+
@Deprecated
36+
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource) {
37+
if (direction == null) {
38+
if (quads == null) {
39+
quads = originalModel.getQuads(blockState, null, randomSource)
40+
.stream()
41+
.filter(q -> q.getDirection() == Direction.SOUTH)
42+
.toList();
43+
}
44+
return quads;
45+
}
46+
return List.of();
47+
}
48+
49+
@Override
50+
public List<BakedQuad> getQuads(@Nullable BlockState blockState, @Nullable Direction direction, RandomSource randomSource, ModelData extraData, @Nullable RenderType renderType) {
51+
if (direction == null) {
52+
if (quads == null) {
53+
quads = originalModel.getQuads(blockState, null, randomSource, extraData, renderType)
54+
.stream()
55+
.filter(q -> q.getDirection() == Direction.SOUTH)
56+
.toList();
57+
}
58+
return quads;
59+
}
60+
return List.of();
61+
}
62+
63+
@Override
64+
public BakedModel applyTransform(ItemDisplayContext cameraTransformType, PoseStack poseStack, boolean applyLeftHandTransform) {
65+
BakedModel model = super.applyTransform(cameraTransformType, poseStack, applyLeftHandTransform);
66+
if (model == this.originalModel) {
67+
return this;
68+
}
69+
return model;
70+
}
71+
72+
@Override
73+
public List<BakedModel> getRenderPasses(ItemStack itemStack, boolean fabulous) {
74+
List<BakedModel> renderPasses = super.getRenderPasses(itemStack, fabulous);
75+
List<BakedModel> result = new ArrayList<>(renderPasses.size());
76+
for (BakedModel bakedModel : renderPasses) {
77+
if (bakedModel == this.originalModel) {
78+
bakedModel = this;
79+
}
80+
result.add(bakedModel);
81+
}
82+
return result;
83+
}
84+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
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;
2122
import net.neoforged.neoforge.client.model.data.ModelData;
2223
import net.neoforged.neoforge.common.Tags;
2324

@@ -72,4 +73,9 @@ public Component getName(TagKey<?> tagKey) {
7273
String tagTranslationKey = Tags.getTagTranslationKey(tagKey);
7374
return Component.translatableWithFallback(tagTranslationKey, "#" + tagKey.location());
7475
}
76+
77+
@Override
78+
public BakedModel createLimitedQuadItemModel(BakedModel bakedModel) {
79+
return NeoForgeLimitedQuadItemModel.wrap(bakedModel);
80+
}
7581
}

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ forgeVersionRange=[51.0.31,)
3939

4040
# Neoforge
4141
# https://projects.neoforged.net/neoforged/neoforge
42-
neoforgeVersion=21.1.65
42+
neoforgeVersion=21.1.116
4343
neoforgeLoaderVersionRange=[4,)
4444
# minimum version for
4545
# "Add a way to render tooltips from Formatted text and TooltipComponents elements (#1364)"
@@ -74,4 +74,4 @@ modrinthId=u6dRKJwZ
7474
jUnitVersion=5.8.2
7575

7676
# Version
77-
specificationVersion=19.21.0
77+
specificationVersion=19.21.1

0 commit comments

Comments
 (0)