Skip to content

Commit e41b5f1

Browse files
committed
Fix incompat with modernfix
Fixes: #414
1 parent 9f29c0e commit e41b5f1

File tree

10 files changed

+50
-43
lines changed

10 files changed

+50
-43
lines changed

common/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ dependencies {
2727
//implementation "maven.modrinth:client-tweaks:${project.clienttweaks_version}+neoforge-${project.minecraft_version}"
2828

2929
api "me.shedaniel.cloth:cloth-config-neoforge:${project.cloth_config_version}"
30+
compileOnly "maven.modrinth:modernfix-mvus:${modernfix_version}-neoforge"
3031

3132
implementation "me.fallenbreath:conditional-mixin-neoforge:${project.conditional_mixins_version}"
3233
implementation(annotationProcessor("com.github.bawnorton.mixinsquared:mixinsquared-common:${project.mixinsquared_version}"))

common/src/main/java/ca/fxco/moreculling/api/blockstate/StateCullingShapeCache.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ca.fxco.moreculling.api.blockstate;
22

3+
import net.minecraft.client.renderer.block.model.BlockStateModel;
34
import net.minecraft.core.Direction;
45
import net.minecraft.world.phys.shapes.VoxelShape;
56

@@ -22,8 +23,8 @@ public interface StateCullingShapeCache {
2223
/**
2324
* Initialize custom culling shape on resource reload
2425
*
25-
* @since 1.3.1
26+
* @since 1.6.0
2627
*/
27-
void moreculling$initCustomCullingShape();
28+
void moreculling$initCustomCullingShape(BlockStateModel model);
2829

2930
}

common/src/main/java/ca/fxco/moreculling/mixin/blockstates/BlockStateBase_moreMixin.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,30 @@
22

33
import ca.fxco.moreculling.api.block.MoreBlockCulling;
44
import ca.fxco.moreculling.api.blockstate.MoreStateCulling;
5+
import ca.fxco.moreculling.api.model.BakedOpacity;
56
import ca.fxco.moreculling.utils.BitUtils;
7+
import net.minecraft.client.Minecraft;
68
import net.minecraft.core.BlockPos;
79
import net.minecraft.core.Direction;
810
import net.minecraft.world.level.BlockGetter;
911
import net.minecraft.world.level.block.Block;
1012
import net.minecraft.world.level.block.state.BlockBehaviour;
1113
import net.minecraft.world.level.block.state.BlockState;
1214
import org.jetbrains.annotations.Nullable;
15+
import org.spongepowered.asm.mixin.Final;
1316
import org.spongepowered.asm.mixin.Mixin;
1417
import org.spongepowered.asm.mixin.Shadow;
1518
import org.spongepowered.asm.mixin.Unique;
1619

1720
import java.util.Optional;
1821

22+
import static ca.fxco.moreculling.MoreCulling.blockRenderManager;
23+
1924
@Mixin(BlockBehaviour.BlockStateBase.class)
2025
public abstract class BlockStateBase_moreMixin implements MoreStateCulling {
2126

2227
@Unique
23-
private byte moreculling$emptyFaces = 0;
28+
private byte moreculling$emptyFaces = -1;
2429
@Unique
2530
private boolean moreculling$hasTextureTranslucency = true;
2631

@@ -30,8 +35,18 @@ public abstract class BlockStateBase_moreMixin implements MoreStateCulling {
3035
@Shadow
3136
protected abstract BlockState asState();
3237

38+
@Shadow
39+
@Final
40+
private boolean canOcclude;
41+
3342
@Override
3443
public boolean moreculling$hasQuadsOnSide(@Nullable Direction direction) {
44+
if (moreculling$emptyFaces == -1) {
45+
moreculling$emptyFaces = 0;
46+
if (!canOcclude && blockRenderManager != null) {
47+
((BakedOpacity) blockRenderManager.getBlockModel(asState())).moreculling$resetTranslucencyCache(asState());
48+
}
49+
}
3550
if (direction == null) {
3651
return moreculling$emptyFaces != BitUtils.ALL_DIRECTIONS;
3752
}

common/src/main/java/ca/fxco/moreculling/mixin/models/cullshape/BlockStateBase_cullShapeMixin.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,14 @@ public abstract class BlockStateBase_cullShapeMixin implements StateCullingShape
3636

3737

3838
@Override
39-
public void moreculling$initCustomCullingShape() {
39+
public void moreculling$initCustomCullingShape(BlockStateModel model) {
4040
VoxelShape voxelShape = null;
41-
if (blockRenderManager != null) {
42-
BlockStateModel model = blockRenderManager.getBlockModel(this.asState());
43-
if (model != null) {
44-
if (((BakedOpacity) model).moreculling$getHasAutoModelShape() && this.canOcclude) {
45-
this.moreculling$cullingShapesByFace = occlusionShapesByFace;
46-
return;
47-
}
48-
voxelShape = ((BakedOpacity) model).moreculling$getCullingShape(this.asState());
41+
if (model != null) {
42+
if (((BakedOpacity) model).moreculling$getHasAutoModelShape() && this.canOcclude) {
43+
this.moreculling$cullingShapesByFace = occlusionShapesByFace;
44+
return;
4945
}
46+
voxelShape = ((BakedOpacity) model).moreculling$getCullingShape(this.asState());
5047
}
5148

5249
if (voxelShape == null) {
@@ -72,6 +69,17 @@ public abstract class BlockStateBase_cullShapeMixin implements StateCullingShape
7269

7370
@Override
7471
public VoxelShape moreculling$getFaceCullingShape(Direction face) {
72+
if (this.moreculling$cullingShapesByFace == null) {
73+
this.moreculling$cullingShapesByFace = EMPTY_OCCLUSION_SHAPES;
74+
75+
BlockStateModel model = null;
76+
if (blockRenderManager != null) {
77+
model = blockRenderManager.getBlockModel(asState());
78+
}
79+
80+
moreculling$initCustomCullingShape(model);
81+
82+
}
7583
return this.moreculling$cullingShapesByFace[face.ordinal()];
7684
}
7785
}

common/src/main/java/ca/fxco/moreculling/utils/CacheUtils.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package ca.fxco.moreculling.utils;
22

33
import ca.fxco.moreculling.MoreCulling;
4+
import ca.fxco.moreculling.api.blockstate.StateCullingShapeCache;
45
import ca.fxco.moreculling.api.model.BakedOpacity;
56
import ca.fxco.moreculling.mixin.accessors.BlockModelShaperAccessor;
67
import net.minecraft.client.renderer.block.model.BlockStateModel;
8+
import net.minecraft.world.level.block.Block;
79
import net.minecraft.world.level.block.state.BlockState;
10+
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
811

912
import java.util.Map;
1013

@@ -18,12 +21,13 @@ public class CacheUtils {
1821
*/
1922
public static void resetAllCache() {
2023
// Not really needed as ModernFix automatically caches and releases models, which is good enough.
21-
if (IS_MODERNFIX_LOADED) {
24+
if (IS_MODERNFIX_LOADED && ModernFixMixinPlugin.instance.isOptionEnabled("perf.dynamic_resources")) {
2225
return;
2326
}
2427
// Reset all model translucency cache
2528
Map<BlockState, BlockStateModel> allModels = ((BlockModelShaperAccessor) blockRenderManager.getBlockModelShaper()).getModels();
2629
allModels.forEach((state, model) -> {
30+
((StateCullingShapeCache) state).moreculling$initCustomCullingShape(model);
2731
if (!state.canOcclude()) {
2832
((BakedOpacity) model).moreculling$resetTranslucencyCache(state);
2933
}

fabric/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ dependencies {
2626
}
2727

2828
modCompileOnly "maven.modrinth:vulkanmod:${vulkan_version}"
29+
modCompileOnly "maven.modrinth:modernfix-mvus:${modernfix_version}-fabric"
2930

3031
modImplementation("me.fallenbreath:conditional-mixin-fabric:${project.conditional_mixins_version}")
3132
include("me.fallenbreath:conditional-mixin-fabric:${project.conditional_mixins_version}")
Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
package ca.fxco.moreculling.mixin;
22

3-
import ca.fxco.moreculling.api.blockstate.StateCullingShapeCache;
4-
import ca.fxco.moreculling.api.model.BakedOpacity;
5-
import ca.fxco.moreculling.mixin.accessors.BlockModelShaperAccessor;
3+
import ca.fxco.moreculling.utils.CacheUtils;
64
import net.minecraft.client.Minecraft;
75
import net.minecraft.client.main.GameConfig;
86
import net.minecraft.server.packs.resources.ReloadableResourceManager;
97
import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
10-
import net.minecraft.world.level.block.Block;
118
import org.spongepowered.asm.mixin.Final;
129
import org.spongepowered.asm.mixin.Mixin;
1310
import org.spongepowered.asm.mixin.Shadow;
1411
import org.spongepowered.asm.mixin.injection.At;
1512
import org.spongepowered.asm.mixin.injection.Inject;
1613
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1714

18-
import static ca.fxco.moreculling.MoreCulling.blockRenderManager;
19-
2015
@Mixin(Minecraft.class)
2116
public abstract class Minecraft_registerReloadListenersMixin {
2217

@@ -33,15 +28,6 @@ public abstract class Minecraft_registerReloadListenersMixin {
3328
)
3429
)
3530
private void moreculling$onBlockRenderManagerInitialized(GameConfig args, CallbackInfo ci) {
36-
this.resourceManager.registerReloadListener((ResourceManagerReloadListener) manager ->
37-
Block.BLOCK_STATE_REGISTRY.forEach(state -> ((StateCullingShapeCache) state).moreculling$initCustomCullingShape()));
38-
39-
this.resourceManager.registerReloadListener((ResourceManagerReloadListener) manager ->
40-
((BlockModelShaperAccessor) blockRenderManager.getBlockModelShaper()).getModels()
41-
.forEach((state, model) -> {
42-
if (!state.canOcclude())
43-
((BakedOpacity) model).moreculling$resetTranslucencyCache(state);
44-
}
45-
));
31+
this.resourceManager.registerReloadListener((ResourceManagerReloadListener) manager -> CacheUtils.resetAllCache());
4632
}
4733
}

gradle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ sodium_version=0.8.0-beta.1+mc1.21.11-pre5
5050
# https://modrinth.com/mod/vulkanmod/versions
5151
vulkan_version=0.5.2-1.21.4
5252

53+
modernfix_version=5.20.7
54+
5355
# Client tweaks Compatibility
5456
# https://modrinth.com/mod/client-tweaks/versions
5557
clienttweaks_version=21.3.1

neoforge/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ dependencies {
4444

4545
implementation(jarJar("me.fallenbreath:conditional-mixin-neoforge:${project.conditional_mixins_version}"))
4646

47+
compileOnly "maven.modrinth:modernfix-mvus:${modernfix_version}-neoforge"
4748

4849
compileOnly(annotationProcessor("com.github.bawnorton.mixinsquared:mixinsquared-common:${project.mixinsquared_version}"))
4950
implementation(jarJar("com.github.bawnorton.mixinsquared:mixinsquared-neoforge:${project.mixinsquared_version}"))

neoforge/src/main/java/ca/fxco/moreculling/MoreCullingNeoforge.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
package ca.fxco.moreculling;
22

3-
import ca.fxco.moreculling.api.blockstate.StateCullingShapeCache;
4-
import ca.fxco.moreculling.api.model.BakedOpacity;
53
import ca.fxco.moreculling.config.ModMenuConfig;
6-
import ca.fxco.moreculling.mixin.accessors.BlockModelShaperAccessor;
4+
import ca.fxco.moreculling.utils.CacheUtils;
75
import net.minecraft.util.Unit;
86
import net.minecraft.util.profiling.Profiler;
97
import net.minecraft.util.profiling.ProfilerFiller;
10-
import net.minecraft.world.level.block.Block;
118
import net.neoforged.api.distmarker.Dist;
129
import net.neoforged.bus.api.IEventBus;
1310
import net.neoforged.fml.ModContainer;
1411
import net.neoforged.fml.common.Mod;
1512
import net.neoforged.neoforge.client.event.AddClientReloadListenersEvent;
1613
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
1714

18-
import static ca.fxco.moreculling.MoreCulling.blockRenderManager;
19-
2015
@Mod(value = MoreCulling.MOD_ID, dist = Dist.CLIENT)
2116
public class MoreCullingNeoforge {
2217
public MoreCullingNeoforge(ModContainer container, IEventBus bus) {
@@ -36,14 +31,7 @@ public void registerReloadListener(AddClientReloadListenersEvent event) {
3631
ProfilerFiller profilerfiller = Profiler.get();
3732
profilerfiller.push("listener");
3833

39-
Block.BLOCK_STATE_REGISTRY.forEach(state -> ((StateCullingShapeCache) state).moreculling$initCustomCullingShape());
40-
41-
((BlockModelShaperAccessor) blockRenderManager.getBlockModelShaper()).getModels()
42-
.forEach((state, model) -> {
43-
if (!state.canOcclude()) {
44-
((BakedOpacity) model).moreculling$resetTranslucencyCache(state);
45-
}
46-
});
34+
CacheUtils.resetAllCache();
4735

4836
profilerfiller.pop();
4937
}, gameExecutor));

0 commit comments

Comments
 (0)