Skip to content

Commit 3506a3d

Browse files
authored
Fix sub-level shader block IDs and single-block model data on NeoForge
1 parent bf9713a commit 3506a3d

3 files changed

Lines changed: 67 additions & 1 deletion

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dev.ryanhcode.sable.neoforge.mixin.compatibility.iris;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import it.unimi.dsi.fastutil.objects.Object2IntMap;
6+
import net.irisshaders.iris.shaderpack.materialmap.WorldRenderingSettings;
7+
import net.irisshaders.iris.vertices.BlockSensitiveBufferBuilder;
8+
import net.minecraft.client.renderer.RenderType;
9+
import net.minecraft.client.renderer.block.ModelBlockRenderer;
10+
import net.minecraft.client.resources.model.BakedModel;
11+
import net.minecraft.core.BlockPos;
12+
import net.minecraft.util.RandomSource;
13+
import net.minecraft.world.level.BlockAndTintGetter;
14+
import net.minecraft.world.level.block.state.BlockState;
15+
import net.neoforged.neoforge.client.model.data.ModelData;
16+
import org.spongepowered.asm.mixin.Mixin;
17+
import org.spongepowered.asm.mixin.Unique;
18+
import org.spongepowered.asm.mixin.injection.At;
19+
import org.spongepowered.asm.mixin.injection.Inject;
20+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
21+
22+
@Mixin(ModelBlockRenderer.class)
23+
public class ModelBlockRendererMixin {
24+
25+
@Unique
26+
private void sable$beginBlock(final BlockState state, final BlockPos pos, final VertexConsumer consumer) {
27+
if (!(consumer instanceof BlockSensitiveBufferBuilder buffer)) {
28+
return;
29+
}
30+
31+
final Object2IntMap<BlockState> blockStateIds = WorldRenderingSettings.INSTANCE.getBlockStateIds();
32+
if (blockStateIds == null) {
33+
return;
34+
}
35+
36+
buffer.beginBlock(blockStateIds.getOrDefault(state, -1), (byte) 0, (byte) state.getLightEmission(), pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15);
37+
}
38+
39+
@Unique
40+
private void sable$endBlock(final VertexConsumer consumer) {
41+
if (consumer instanceof BlockSensitiveBufferBuilder buffer) {
42+
buffer.endBlock();
43+
}
44+
}
45+
46+
@Inject(method = "tesselateWithAO(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", at = @At("HEAD"))
47+
private void sable$beginBlockAO(final BlockAndTintGetter level, final BakedModel model, final BlockState state, final BlockPos pos, final PoseStack poseStack, final VertexConsumer consumer, final boolean checkSides, final RandomSource random, final long seed, final int packedOverlay, final ModelData modelData, final RenderType renderType, final CallbackInfo ci) {
48+
this.sable$beginBlock(state, pos, consumer);
49+
}
50+
51+
@Inject(method = "tesselateWithAO(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", at = @At("RETURN"))
52+
private void sable$endBlockAO(final BlockAndTintGetter level, final BakedModel model, final BlockState state, final BlockPos pos, final PoseStack poseStack, final VertexConsumer consumer, final boolean checkSides, final RandomSource random, final long seed, final int packedOverlay, final ModelData modelData, final RenderType renderType, final CallbackInfo ci) {
53+
this.sable$endBlock(consumer);
54+
}
55+
56+
@Inject(method = "tesselateWithoutAO(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", at = @At("HEAD"))
57+
private void sable$beginBlockFlat(final BlockAndTintGetter level, final BakedModel model, final BlockState state, final BlockPos pos, final PoseStack poseStack, final VertexConsumer consumer, final boolean checkSides, final RandomSource random, final long seed, final int packedOverlay, final ModelData modelData, final RenderType renderType, final CallbackInfo ci) {
58+
this.sable$beginBlock(state, pos, consumer);
59+
}
60+
61+
@Inject(method = "tesselateWithoutAO(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", at = @At("RETURN"))
62+
private void sable$endBlockFlat(final BlockAndTintGetter level, final BakedModel model, final BlockState state, final BlockPos pos, final PoseStack poseStack, final VertexConsumer consumer, final boolean checkSides, final RandomSource random, final long seed, final int packedOverlay, final ModelData modelData, final RenderType renderType, final CallbackInfo ci) {
63+
this.sable$endBlock(consumer);
64+
}
65+
}

neoforge/src/main/java/dev/ryanhcode/sable/neoforge/platform/SableSubLevelRenderPlatformImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void tesselateBlock(final SingleBlockSubLevelWrapper blockAndTintGetter,
2828

2929
@Override
3030
public List<RenderType> getRenderLayers(final SingleBlockSubLevelWrapper blockAndTintGetter, final BakedModel bakedModel, final BlockState blockState, final BlockPos pos, final RandomSource randomSource) {
31-
return bakedModel.getRenderTypes(blockState, randomSource, blockAndTintGetter.getModelData(pos)).asList();
31+
return bakedModel.getRenderTypes(blockState, randomSource, blockAndTintGetter.getLevel().getModelData(pos)).asList();
3232
}
3333

3434
@Override

neoforge/src/main/resources/sable-neoforge.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"compatibility.flywheel.RenderDispatcherImplMixin",
6161
"compatibility.flywheel.ShaderSourcesMixin",
6262
"compatibility.flywheel.VisualManagerImplMixin",
63+
"compatibility.iris.ModelBlockRendererMixin",
6364
"compatibility.pmweather.RadarRendererMixin",
6465
"compatibility.sodiumextras.EmbyToolsMixin",
6566
"dynamic_directional_shading.SectionCompilerMixin",

0 commit comments

Comments
 (0)