Skip to content

Commit 9e7c9aa

Browse files
committed
Merge remote-tracking branch 'origin/master' into dev
# Conflicts: # common/src/main/java/ca/fxco/moreculling/mixin/models/MultiPartModel_cacheMixin.java # common/src/main/java/ca/fxco/moreculling/mixin/models/SingleVariant_cacheMixin.java # common/src/main/java/ca/fxco/moreculling/mixin/models/cullshape/BlockStateBase_cullShapeMixin.java # common/src/main/resources/moreculling.mixins.json # fabric/src/main/java/ca/fxco/moreculling/mixin/models/cullshape/BlockModel_fabricCullShapeMixin.java # gradle.properties # neoforge/src/main/java/ca/fxco/moreculling/mixin/models/cullshape/BlockModel_neoforgeCullShapeMixin.java
2 parents 1279d29 + 160c55b commit 9e7c9aa

18 files changed

+254
-33
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package ca.fxco.moreculling.api.block;
2+
3+
/**
4+
* implement this if your block should cull like leaves but doesn't extend leaves block
5+
*/
6+
public interface LeavesCulling {
7+
}

common/src/main/java/ca/fxco/moreculling/api/model/BakedOpacity.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,23 @@ public interface BakedOpacity {
7676
@ApiStatus.Internal
7777
default void moreculling$setCullingShape(@Nullable VoxelShape cullingShape) {}
7878

79+
/**
80+
* When set to false, the cull shape is completely ignored and instead the model
81+
* will be used as the cull shape even if block state can occlude
82+
*
83+
* @since 1.2.10
84+
*/
85+
default void moreculling$setHasAutoModelShape(boolean hasAutoModelShape) {}
86+
87+
/**
88+
* Returns if useModelShape was set automatically
89+
*
90+
* @since 1.2.10
91+
*/
92+
default boolean moreculling$getHasAutoModelShape() {
93+
return false;
94+
}
95+
7996
/**
8097
* Tells you if this model supports setting the culling shape
8198
*

common/src/main/java/ca/fxco/moreculling/api/model/ExtendedUnbakedModel.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,23 @@ public interface ExtendedUnbakedModel {
4747
return false;
4848
}
4949

50+
/**
51+
* When set to false, the cull shape is completely ignored and instead the model
52+
* will be used as the cull shape even if block state can occlude
53+
*
54+
* @since 1.2.10
55+
*/
56+
default void moreculling$setHasAutoModelShape(boolean hasAutoModelShape) {}
57+
58+
/**
59+
* Returns if useModelShape was set automatically
60+
*
61+
* @since 1.2.10
62+
*/
63+
default boolean moreculling$getHasAutoModelShape() {
64+
return false;
65+
}
66+
5067
/**
5168
* ModelElementFace is just final's, that should not change. However, you can create a new ModelElementFace or wrap
5269
* it. Do this to modify the element face data.

common/src/main/java/ca/fxco/moreculling/config/ModMenuConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public static Screen createConfigScreen(Screen parent) {
5252
if (modId.equals("minecraft")) {
5353
continue;
5454
}
55+
if (!Services.PLATFORM.isModLoaded(modId)) {
56+
continue;
57+
}
5558
DynamicBooleanListEntry aMod = new DynamicBooleanBuilder(Services.PLATFORM.getModName(modId))
5659
.setValue(entry.getBooleanValue())
5760
.setDefaultValue(MoreCulling.CONFIG.useOnModdedBlocksByDefault)

common/src/main/java/ca/fxco/moreculling/mixin/blocks/LeavesBlock_typesMixin.java

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

33
import ca.fxco.moreculling.MoreCulling;
4+
import ca.fxco.moreculling.api.block.LeavesCulling;
45
import ca.fxco.moreculling.api.block.MoreBlockCulling;
56
import ca.fxco.moreculling.config.option.LeavesCullingMode;
67
import ca.fxco.moreculling.utils.CullingUtils;
@@ -22,7 +23,7 @@
2223
import static ca.fxco.moreculling.config.option.LeavesCullingMode.VERTICAL;
2324

2425
@Mixin(value = LeavesBlock.class, priority = 1220)
25-
public class LeavesBlock_typesMixin extends Block implements MoreBlockCulling {
26+
public class LeavesBlock_typesMixin extends Block implements MoreBlockCulling, LeavesCulling {
2627

2728
@Shadow
2829
@Final
@@ -36,7 +37,7 @@ public LeavesBlock_typesMixin(Properties settings) {
3637
public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) {
3738
if (MoreCulling.CONFIG.leavesCullingMode == FAST || CullingUtils.areLeavesOpaque() ||
3839
(MoreCulling.CONFIG.leavesCullingMode == VERTICAL && direction.getAxis() == Direction.Axis.Y)) {
39-
return stateFrom.getBlock() instanceof LeavesBlock || super.skipRendering(state, stateFrom, direction);
40+
return stateFrom.getBlock() instanceof LeavesCulling || super.skipRendering(state, stateFrom, direction);
4041
}
4142
return super.skipRendering(state, stateFrom, direction);
4243
}

common/src/main/java/ca/fxco/moreculling/mixin/blocks/MangroveRootsBlock_typesMixin.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,44 @@
11
package ca.fxco.moreculling.mixin.blocks;
22

33
import ca.fxco.moreculling.MoreCulling;
4+
import ca.fxco.moreculling.api.block.LeavesCulling;
45
import ca.fxco.moreculling.api.block.MoreBlockCulling;
56
import ca.fxco.moreculling.config.option.LeavesCullingMode;
67
import ca.fxco.moreculling.utils.CullingUtils;
78
import net.minecraft.core.BlockPos;
89
import net.minecraft.core.Direction;
910
import net.minecraft.world.level.BlockGetter;
1011
import net.minecraft.world.level.block.Block;
11-
import net.minecraft.world.level.block.LeavesBlock;
1212
import net.minecraft.world.level.block.MangroveRootsBlock;
1313
import net.minecraft.world.level.block.state.BlockState;
1414
import org.spongepowered.asm.mixin.Mixin;
15+
import org.spongepowered.asm.mixin.injection.At;
16+
import org.spongepowered.asm.mixin.injection.Inject;
17+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1518

1619
import java.util.Optional;
1720

1821
@Mixin(value = MangroveRootsBlock.class, priority = 1220)
19-
public class MangroveRootsBlock_typesMixin extends Block implements MoreBlockCulling {
22+
public class MangroveRootsBlock_typesMixin extends Block implements MoreBlockCulling, LeavesCulling {
2023

2124
public MangroveRootsBlock_typesMixin(Properties settings) {
2225
super(settings);
2326
}
2427

25-
@Override
26-
public boolean skipRendering(BlockState state, BlockState stateFrom, Direction direction) {
28+
@Inject(
29+
method = "skipRendering",
30+
at = @At(value = "HEAD"),
31+
cancellable = true
32+
)
33+
private void moreculling$skipRendering(BlockState thisState, BlockState sideState,
34+
Direction face, CallbackInfoReturnable<Boolean> cir) {
2735
if (!MoreCulling.CONFIG.includeMangroveRoots) {
28-
return super.skipRendering(state, stateFrom, direction);
36+
return;
2937
}
3038
if (MoreCulling.CONFIG.leavesCullingMode == LeavesCullingMode.FAST || CullingUtils.areLeavesOpaque()) {
31-
return stateFrom.getBlock() instanceof LeavesBlock || super.skipRendering(state, stateFrom, direction);
39+
cir.setReturnValue(sideState.getBlock() instanceof LeavesCulling ||
40+
super.skipRendering(thisState, sideState, face));
3241
}
33-
return super.skipRendering(state, stateFrom, direction);
3442
}
3543

3644
@Override
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package ca.fxco.moreculling.mixin.compat;
2+
3+
import me.fallenbreath.conditionalmixin.api.annotation.Condition;
4+
import me.fallenbreath.conditionalmixin.api.annotation.Restriction;
5+
import net.minecraft.world.level.block.Block;
6+
import net.minecraft.world.level.block.SignBlock;
7+
import net.minecraft.world.level.block.state.BlockState;
8+
import net.minecraft.world.phys.shapes.VoxelShape;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.Unique;
11+
12+
@Restriction(require = @Condition("enhancedblockentities"))
13+
@Mixin(SignBlock.class)
14+
public class SignBlock_ebeMixin extends Block {
15+
@Unique
16+
private static final VoxelShape moreculling$cullingShape = Block.box(7.3F, 0.0F, 7.3F, 8.7F, 16.0, 8.7F);
17+
18+
public SignBlock_ebeMixin(Properties p_49795_) {
19+
super(p_49795_);
20+
}
21+
22+
@Override
23+
public VoxelShape getOcclusionShape(BlockState state) {
24+
return moreculling$cullingShape;
25+
}
26+
}

common/src/main/java/ca/fxco/moreculling/mixin/models/DelegateBakedModel_cullMixin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ public class DelegateBakedModel_cullMixin implements BakedOpacity {
3838
((BakedOpacity) parent).moreculling$setCullingShape(cullingShape);
3939
}
4040
41+
@Override
42+
public boolean moreculling$getHasAutoModelShape() {
43+
return ((BakedOpacity) parent).moreculling$getHasAutoModelShape();
44+
}
45+
46+
@Override
47+
public void moreculling$setHasAutoModelShape(boolean hasAutoModelShape) {
48+
((BakedOpacity) parent).moreculling$setHasAutoModelShape(hasAutoModelShape);
49+
}
50+
4151
@Override
4252
public boolean moreculling$canSetCullingShape() {
4353
return ((BakedOpacity) parent).moreculling$canSetCullingShape();

common/src/main/java/ca/fxco/moreculling/mixin/models/MultiPartModel_cacheMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public abstract class MultiPartModel_cacheMixin implements BakedOpacity {
5353
} else {
5454
solidFaces = BitUtils.set(solidFaces, face.ordinal());
5555
for (BakedQuad quad : quads) {
56-
if (((QuadOpacity) (Object) quad).moreculling$getTextureTranslucency()) {
56+
if (((QuadOpacity) (Object) quad).moreculling$getTextureTranslucency()) {
5757
solidFaces = BitUtils.unset(solidFaces, face.ordinal());
5858
break;
5959
}

common/src/main/java/ca/fxco/moreculling/mixin/models/SingleVariant_cacheMixin.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ public abstract class SingleVariant_cacheMixin implements BakedOpacity {
3737
@Override
3838
public void moreculling$resetTranslucencyCache(BlockState state) {
3939
moreculling$solidFaces.clear();
40+
41+
if (state.canOcclude()) {
42+
if (moreculling$allStatesCanOcclude) {
43+
moreculling$solidFaces.fill();
44+
}
45+
} else {
46+
moreculling$allStatesCanOcclude = false;
47+
}
48+
4049
for (Direction direction : DirectionUtils.DIRECTIONS) {
4150
List<BakedQuad> layeredQuads = new ArrayList<>(model.getQuads(direction));
4251
if (!layeredQuads.isEmpty()) {
@@ -72,6 +81,16 @@ public abstract class SingleVariant_cacheMixin implements BakedOpacity {
7281
((BakedOpacity) this.model).moreculling$setCullingShape(cullingShape);
7382
}
7483

84+
@Override
85+
public boolean moreculling$getHasAutoModelShape() {
86+
return moreculling$hasAutoModelShape;
87+
}
88+
89+
@Override
90+
public void moreculling$setHasAutoModelShape(boolean hasAutoModelShape) {
91+
moreculling$hasAutoModelShape = hasAutoModelShape;
92+
}
93+
7594
@Override
7695
public boolean moreculling$canSetCullingShape() {
7796
return true;

0 commit comments

Comments
 (0)