Skip to content

Commit 1f0667e

Browse files
committed
Fix custom block layers on NeoForge
1 parent eff41ef commit 1f0667e

File tree

7 files changed

+55
-32
lines changed

7 files changed

+55
-32
lines changed

fabric/src/main/java/foundry/veil/fabric/FabricRenderTypeStageHandler.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
public class FabricRenderTypeStageHandler {
3232

3333
private static final Map<VeilRenderLevelStageEvent.Stage, Set<RenderType>> STAGE_RENDER_TYPES = new EnumMap<>(VeilRenderLevelStageEvent.Stage.class);
34-
private static Set<RenderType> CUSTOM_BLOCK_LAYERS;
34+
private static Set<RenderType> CUSTOM_BLOCK_LAYERS = Set.of();
3535
private static List<RenderType> BLOCK_LAYERS;
3636

3737
public static void register(@Nullable VeilRenderLevelStageEvent.Stage stage, RenderType renderType) {
@@ -72,7 +72,11 @@ public static void renderStage(LevelRendererBlockLayerExtension extension, Profi
7272
}
7373

7474
// Some mods add custom block layers by changing the field, so account for that
75-
public static List<RenderType> getBlockLayers(ImmutableList<RenderType> base) {
75+
public static List<RenderType> getBlockLayers(List<RenderType> base) {
76+
if (CUSTOM_BLOCK_LAYERS.isEmpty()) {
77+
return base;
78+
}
79+
7680
if (BLOCK_LAYERS == null || base.size() != BLOCK_LAYERS.size()) {
7781
ImmutableList.Builder<RenderType> blockLayers = ImmutableList.builder();
7882
blockLayers.addAll(base);
@@ -85,7 +89,7 @@ public static List<RenderType> getBlockLayers(ImmutableList<RenderType> base) {
8589
}
8690

8791
public static void setBlockLayers(Set<RenderType> blockLayers) {
88-
CUSTOM_BLOCK_LAYERS = blockLayers;
92+
CUSTOM_BLOCK_LAYERS = Set.copyOf(blockLayers);
8993
BLOCK_LAYERS = null;
9094
}
9195
}

fabric/src/main/java/foundry/veil/fabric/mixin/client/MinecraftMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void init(CallbackInfo ci) {
2828
FabricVeilRegisterFixedBuffersEvent.EVENT.invoker().onRegisterFixedBuffers(FabricRenderTypeStageHandler::register);
2929
}
3030

31-
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setupDefaultState(IIII)V", remap = false))
31+
@Inject(method = "<init>", at = @At("TAIL"))
3232
public void registerBlockLayers(CallbackInfo ci) {
3333
Set<RenderType> blockLayers = new HashSet<>();
3434
FabricVeilRegisterBlockLayersEvent.EVENT.invoker().onRegisterBlockLayers(renderType -> {

fabric/src/main/java/foundry/veil/fabric/mixin/client/RenderTypeMixin.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
11
package foundry.veil.fabric.mixin.client;
22

3-
import com.google.common.collect.ImmutableList;
43
import foundry.veil.fabric.FabricRenderTypeStageHandler;
54
import net.minecraft.client.renderer.RenderType;
6-
import org.spongepowered.asm.mixin.Final;
75
import org.spongepowered.asm.mixin.Mixin;
8-
import org.spongepowered.asm.mixin.Shadow;
96
import org.spongepowered.asm.mixin.injection.At;
107
import org.spongepowered.asm.mixin.injection.Inject;
118
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
129

1310
import java.util.List;
1411

15-
@Mixin(RenderType.class)
12+
@Mixin(value = RenderType.class, priority = 500)
1613
public class RenderTypeMixin {
1714

18-
@Shadow
19-
@Final
20-
private static ImmutableList<RenderType> CHUNK_BUFFER_LAYERS;
21-
22-
@Inject(method = "chunkBufferLayers", at = @At("HEAD"), cancellable = true)
15+
@Inject(method = "chunkBufferLayers", at = @At("RETURN"), cancellable = true)
2316
private static void injectChunkBufferLayers(CallbackInfoReturnable<List<RenderType>> cir) {
24-
List<RenderType> renderTypes = FabricRenderTypeStageHandler.getBlockLayers(CHUNK_BUFFER_LAYERS);
17+
List<RenderType> renderTypes = FabricRenderTypeStageHandler.getBlockLayers(cir.getReturnValue());
2518
if (renderTypes != null) {
2619
cir.setReturnValue(renderTypes);
2720
}

neoforge/src/main/java/foundry/veil/forge/VeilForgeClient.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,6 @@ public VeilForgeClient(IEventBus modEventBus) {
4040
modEventBus.addListener(VeilForgeClient::registerListeners);
4141
modEventBus.addListener(VeilForgeClient::registerShaders);
4242
modEventBus.addListener(VeilForgeClient::addPackFinders);
43-
44-
ImmutableList.Builder<RenderType> blockLayers = ImmutableList.builder();
45-
ModLoader.postEvent(new ForgeVeilRegisterBlockLayersEvent(renderType -> {
46-
if (Veil.platform().isDevelopmentEnvironment() && renderType.bufferSize() > RenderType.SMALL_BUFFER_SIZE) {
47-
Veil.LOGGER.warn("Block render layer '{}' uses a large buffer size: {}. If this is intended you can ignore this message", VeilRenderType.getName(renderType), renderType.bufferSize());
48-
}
49-
blockLayers.add(renderType);
50-
}));
51-
ForgeRenderTypeStageHandler.setBlockLayers(blockLayers);
5243
}
5344

5445
private static void registerListeners(RegisterClientReloadListenersEvent event) {

neoforge/src/main/java/foundry/veil/forge/impl/ForgeRenderTypeStageHandler.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
public class ForgeRenderTypeStageHandler {
3232

3333
private static final Map<RenderLevelStageEvent.Stage, Set<RenderType>> STAGE_RENDER_TYPES = new HashMap<>();
34-
private static Set<RenderType> CUSTOM_BLOCK_LAYERS;
34+
private static Set<RenderType> CUSTOM_BLOCK_LAYERS = Set.of();
3535
private static List<RenderType> BLOCK_LAYERS;
3636

3737
public static synchronized void register(@Nullable RenderLevelStageEvent.Stage stage, RenderType renderType) {
@@ -75,13 +75,25 @@ public static void onRenderLevelStageEnd(RenderLevelStageEvent event) {
7575
}
7676
}
7777

78-
public static List<RenderType> getBlockLayers() {
78+
// Some mods add custom block layers by changing the field, so account for that
79+
public static List<RenderType> getBlockLayers(List<RenderType> base) {
80+
if (CUSTOM_BLOCK_LAYERS.isEmpty()) {
81+
return base;
82+
}
83+
84+
if (BLOCK_LAYERS == null || base.size() != BLOCK_LAYERS.size()) {
85+
ImmutableList.Builder<RenderType> blockLayers = ImmutableList.builder();
86+
blockLayers.addAll(base);
87+
if (CUSTOM_BLOCK_LAYERS != null) {
88+
blockLayers.addAll(CUSTOM_BLOCK_LAYERS);
89+
}
90+
BLOCK_LAYERS = blockLayers.build();
91+
}
7992
return BLOCK_LAYERS;
8093
}
8194

82-
public static void setBlockLayers(ImmutableList.Builder<RenderType> blockLayers) {
83-
CUSTOM_BLOCK_LAYERS = new HashSet<>(blockLayers.build());
84-
blockLayers.addAll(RenderType.chunkBufferLayers());
85-
BLOCK_LAYERS = blockLayers.build();
95+
public static void setBlockLayers(Set<RenderType> blockLayers) {
96+
CUSTOM_BLOCK_LAYERS = Set.copyOf(blockLayers);
97+
BLOCK_LAYERS = null;
8698
}
8799
}

neoforge/src/main/java/foundry/veil/forge/mixin/client/MinecraftMixin.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,39 @@
11
package foundry.veil.forge.mixin.client;
22

3+
import com.google.common.collect.ImmutableList;
4+
import foundry.veil.Veil;
5+
import foundry.veil.api.client.render.rendertype.VeilRenderType;
36
import foundry.veil.forge.event.ForgeFreeNativeResourcesEvent;
7+
import foundry.veil.forge.event.ForgeVeilRegisterBlockLayersEvent;
8+
import foundry.veil.forge.impl.ForgeRenderTypeStageHandler;
49
import net.minecraft.client.Minecraft;
10+
import net.minecraft.client.renderer.RenderType;
11+
import net.neoforged.fml.ModLoader;
512
import net.neoforged.neoforge.common.NeoForge;
613
import org.spongepowered.asm.mixin.Mixin;
714
import org.spongepowered.asm.mixin.injection.At;
815
import org.spongepowered.asm.mixin.injection.Inject;
916
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1017

18+
import java.util.HashSet;
19+
import java.util.Set;
20+
1121
@Mixin(Minecraft.class)
1222
public class MinecraftMixin {
1323

24+
@Inject(method = "<init>", at = @At("TAIL"))
25+
public void registerBlockLayers(CallbackInfo ci) {
26+
27+
Set<RenderType> blockLayers = new HashSet<>();
28+
ModLoader.postEvent(new ForgeVeilRegisterBlockLayersEvent(renderType -> {
29+
if (Veil.platform().isDevelopmentEnvironment() && renderType.bufferSize() > RenderType.SMALL_BUFFER_SIZE) {
30+
Veil.LOGGER.warn("Block render layer '{}' uses a large buffer size: {}. If this is intended you can ignore this message", VeilRenderType.getName(renderType), renderType.bufferSize());
31+
}
32+
blockLayers.add(renderType);
33+
}));
34+
ForgeRenderTypeStageHandler.setBlockLayers(blockLayers);
35+
}
36+
1437
@Inject(method = "close", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;shutdownExecutors()V", shift = At.Shift.BEFORE))
1538
public void close(CallbackInfo ci) {
1639
NeoForge.EVENT_BUS.post(new ForgeFreeNativeResourcesEvent());

neoforge/src/main/java/foundry/veil/forge/mixin/client/RenderTypeMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99

1010
import java.util.List;
1111

12-
@Mixin(RenderType.class)
12+
@Mixin(value = RenderType.class, priority = 500)
1313
public class RenderTypeMixin {
1414

15-
@Inject(method = "chunkBufferLayers", at = @At("HEAD"), cancellable = true)
15+
@Inject(method = "chunkBufferLayers", at = @At("RETURN"), cancellable = true)
1616
private static void injectChunkBufferLayers(CallbackInfoReturnable<List<RenderType>> cir) {
17-
List<RenderType> renderTypes = ForgeRenderTypeStageHandler.getBlockLayers();
17+
List<RenderType> renderTypes = ForgeRenderTypeStageHandler.getBlockLayers(cir.getReturnValue());
1818
if (renderTypes != null) {
1919
cir.setReturnValue(renderTypes);
2020
}

0 commit comments

Comments
 (0)