Skip to content

Commit 1279d29

Browse files
committed
Fix model shape
1 parent b0cc8fc commit 1279d29

File tree

12 files changed

+164
-303
lines changed

12 files changed

+164
-303
lines changed

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,4 @@ public interface BakedOpacity {
8585
default boolean moreculling$canSetCullingShape() {
8686
return false;
8787
}
88-
89-
default boolean moreculling$isItem() {
90-
return false;
91-
}
92-
93-
default void moreculling$setIsItem() {}
9488
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ca.fxco.moreculling.api.model;
22

33
import net.minecraft.client.renderer.block.model.BlockElementFace;
4+
import net.minecraft.client.resources.model.ResolvedModel;
45
import net.minecraft.resources.ResourceLocation;
56

67

@@ -26,7 +27,7 @@ public interface ExtendedUnbakedModel {
2627
*
2728
* @since 0.25.0
2829
*/
29-
default List<CullShapeElement> moreculling$getCullShapeElements(ResourceLocation id) {
30+
default List<CullShapeElement> moreculling$getCullShapeElements(ResolvedModel parent) {
3031
return List.of();
3132
}
3233

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

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ public abstract class SingleVariant_cacheMixin implements BakedOpacity {
2828
@Shadow @Final private BlockModelPart model;
2929
@Unique
3030
private final DirectionBits moreculling$solidFaces = new DirectionBits();
31-
@Unique
32-
private @Nullable VoxelShape moreculling$cullVoxelShape;
33-
@Unique
34-
private @Nullable boolean moreculling$isItem = false;
35-
@Unique
36-
private boolean moreculling$wasShapeOptimized = false;
3731

3832
@Override
3933
public boolean moreculling$hasTextureTranslucency(@Nullable BlockState state, @Nullable Direction direction) {
@@ -70,33 +64,16 @@ public abstract class SingleVariant_cacheMixin implements BakedOpacity {
7064

7165
@Override
7266
public @Nullable VoxelShape moreculling$getCullingShape(BlockState state) {
73-
if (!this.moreculling$wasShapeOptimized) {
74-
if (this.moreculling$cullVoxelShape != null) {
75-
this.moreculling$cullVoxelShape = moreculling$cullVoxelShape.optimize();
76-
}
77-
this.moreculling$wasShapeOptimized = true;
78-
}
79-
80-
return this.moreculling$cullVoxelShape;
67+
return ((BakedOpacity) this.model).moreculling$getCullingShape(state);
8168
}
8269

8370
@Override
8471
public void moreculling$setCullingShape(VoxelShape cullingShape) {
85-
this.moreculling$cullVoxelShape = cullingShape;
72+
((BakedOpacity) this.model).moreculling$setCullingShape(cullingShape);
8673
}
8774

8875
@Override
8976
public boolean moreculling$canSetCullingShape() {
9077
return true;
9178
}
92-
93-
@Override
94-
public boolean moreculling$isItem() {
95-
return moreculling$isItem;
96-
}
97-
98-
@Override
99-
public void moreculling$setIsItem() {
100-
moreculling$isItem = true;
101-
}
10279
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ca.fxco.moreculling.mixin.models.cullshape;
2+
3+
import ca.fxco.moreculling.api.model.BakedOpacity;
4+
import ca.fxco.moreculling.api.model.ExtendedUnbakedModel;
5+
import net.minecraft.client.renderer.block.model.BlockModelPart;
6+
import net.minecraft.client.resources.model.UnbakedModel;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
9+
@Mixin(BlockModelPart.class)
10+
public interface BlockModelPart_extendsMixin extends BakedOpacity {
11+
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.google.gson.GsonBuilder;
77
import net.minecraft.client.renderer.block.model.BlockElementFace;
88
import net.minecraft.client.renderer.block.model.BlockModel;
9+
import net.minecraft.client.resources.model.ResolvedModel;
910
import net.minecraft.client.resources.model.UnbakedModel;
1011
import net.minecraft.resources.ResourceLocation;
1112
import org.jetbrains.annotations.Nullable;
@@ -34,10 +35,10 @@ public abstract class BlockModel_cullShapeMixin implements ExtendedUnbakedModel
3435
}
3536

3637
@Override
37-
public @Nullable List<CullShapeElement> moreculling$getCullShapeElements(ResourceLocation id) {
38+
public @Nullable List<CullShapeElement> moreculling$getCullShapeElements(ResolvedModel parent) {
3839
if (this.moreculling$cullShapeElements == null) {
39-
return null;//this.parent instanceof BlockModel ?
40-
//((ExtendedUnbakedModel) this.parent).moreculling$getCullShapeElements(id) : null;
40+
return parent != null && parent.wrapped() instanceof BlockModel ?
41+
((ExtendedUnbakedModel) parent.wrapped()).moreculling$getCullShapeElements(parent.parent()) : null;
4142
}
4243
return moreculling$cullShapeElements;
4344
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import ca.fxco.moreculling.api.blockstate.StateCullingShapeCache;
44
import ca.fxco.moreculling.api.model.BakedOpacity;
5+
import com.mojang.logging.LogUtils;
56
import net.minecraft.client.renderer.block.model.BlockStateModel;
67
import net.minecraft.core.Direction;
78
import net.minecraft.world.level.block.Block;
9+
import net.minecraft.world.level.block.Blocks;
810
import net.minecraft.world.level.block.state.BlockBehaviour;
911
import net.minecraft.world.level.block.state.BlockState;
1012
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
@@ -35,6 +37,8 @@ public abstract class BlockStateBase_cullShapeMixin implements StateCullingShape
3537

3638
@Shadow public abstract Block getBlock();
3739

40+
@Shadow public abstract boolean is(Block block);
41+
3842
@Unique
3943
private VoxelShape[] moreculling$cullingShapesByFace;
4044

@@ -55,6 +59,10 @@ public abstract class BlockStateBase_cullShapeMixin implements StateCullingShape
5559
BlockStateModel model = blockRenderManager.getBlockModel(this.asState());
5660
if (model != null && !this.asState().hasProperty(BlockStateProperties.FACING)) {
5761
voxelShape = ((BakedOpacity) model).moreculling$getCullingShape(this.asState());
62+
if (this.is(Blocks.COPPER_GRATE)) {
63+
LogUtils.getLogger().warn(model.getClass().getName());
64+
LogUtils.getLogger().warn(String.valueOf(voxelShape));
65+
}
5866
}
5967
}
6068

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package ca.fxco.moreculling.mixin.models.cullshape;
2+
3+
import ca.fxco.moreculling.api.model.BakedOpacity;
4+
import ca.fxco.moreculling.api.model.CullShapeElement;
5+
import ca.fxco.moreculling.api.model.ExtendedUnbakedModel;
6+
import ca.fxco.moreculling.utils.ShapeUtils;
7+
import com.llamalad7.mixinextras.sugar.Local;
8+
import com.mojang.logging.LogUtils;
9+
import com.mojang.math.Transformation;
10+
import net.minecraft.client.renderer.block.model.*;
11+
import net.minecraft.client.resources.model.ModelBaker;
12+
import net.minecraft.client.resources.model.ModelState;
13+
import net.minecraft.client.resources.model.ResolvedModel;
14+
import net.minecraft.client.resources.model.UnbakedModel;
15+
import net.minecraft.core.Direction;
16+
import net.minecraft.resources.ResourceLocation;
17+
import net.minecraft.world.level.block.Block;
18+
import net.minecraft.world.level.block.state.BlockState;
19+
import net.minecraft.world.phys.shapes.Shapes;
20+
import net.minecraft.world.phys.shapes.VoxelShape;
21+
import org.jetbrains.annotations.Nullable;
22+
import org.spongepowered.asm.mixin.Mixin;
23+
import org.spongepowered.asm.mixin.Unique;
24+
import org.spongepowered.asm.mixin.injection.At;
25+
import org.spongepowered.asm.mixin.injection.Inject;
26+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
27+
28+
import java.util.List;
29+
30+
@Mixin(SimpleModelWrapper.class)
31+
public abstract class SimpleModelWrapper_cullShapeMixin implements BakedOpacity {
32+
@Unique
33+
private @Nullable VoxelShape moreculling$cullVoxelShape;
34+
@Unique
35+
private boolean moreculling$wasShapeOptimized = false;
36+
37+
@Inject(
38+
method = "bake",
39+
at = @At(
40+
value = "RETURN"
41+
)
42+
)
43+
private static void moreculling$onBake(ModelBaker modelBaker, ResourceLocation resourceLocation,
44+
ModelState settings, CallbackInfoReturnable<SimpleModelWrapper> cir,
45+
@Local ResolvedModel model) {
46+
UnbakedModel unbakedModel = model.wrapped();
47+
BlockModelPart bakedModel = cir.getReturnValue();
48+
if (bakedModel == null) {
49+
return;
50+
}
51+
BakedOpacity bakedOpacity = (BakedOpacity) bakedModel;
52+
if (!bakedOpacity.moreculling$canSetCullingShape()) {
53+
return;
54+
}
55+
ResourceLocation id = unbakedModel.parent();
56+
if (((ExtendedUnbakedModel) unbakedModel).moreculling$getUseModelShape(id)) {
57+
if (model.getTopGeometry() instanceof SimpleUnbakedGeometry(List<BlockElement> elements)) {
58+
if (elements != null && !elements.isEmpty()) {
59+
VoxelShape voxelShape = Shapes.empty();
60+
for (BlockElement e : elements) {
61+
if ((e.rotation() == null || e.rotation().angle() == 0) &&
62+
e.from().x() <= e.to().x()
63+
&& e.from().y() <= e.to().y()
64+
&& e.from().z() <= e.to().z()) {
65+
VoxelShape shape = Block.box(
66+
e.from().x(), e.from().y(), e.from().z(), e.to().x(), e.to().y(), e.to().z()
67+
);
68+
voxelShape = ShapeUtils.orUnoptimized(voxelShape, shape);
69+
}
70+
}
71+
72+
if (settings.transformation() != Transformation.identity()) {
73+
;
74+
Direction direction = Direction.rotate(settings.transformation().getMatrix(), Direction.NORTH);
75+
if (direction.getAxis() != Direction.Axis.Y) {
76+
voxelShape = ShapeUtils.rotateShapeUnoptimizedAroundY(Direction.NORTH, direction, voxelShape);
77+
} else {
78+
voxelShape = null;
79+
/*direction = Direction.rotate(settings.getRotation().getMatrix(), Direction.UP); TODO rotation for non horizontal directions
80+
if (direction.getAxis() != Direction.Axis.X) {
81+
voxelShape = ShapeUtils.rotateShapeUnoptimizedAroundX(Direction.UP, direction, voxelShape);
82+
} else {
83+
voxelShape = ShapeUtils.rotateShapeUnoptimizedAroundZ(Direction.UP, direction, voxelShape);
84+
}*/
85+
}
86+
}
87+
bakedOpacity.moreculling$setCullingShape(voxelShape);
88+
}
89+
}
90+
} else {
91+
List<CullShapeElement> cullShapeElementList = ((ExtendedUnbakedModel) unbakedModel)
92+
.moreculling$getCullShapeElements(model.parent());
93+
if (cullShapeElementList != null && !cullShapeElementList.isEmpty()) {
94+
VoxelShape voxelShape = Shapes.empty();
95+
for (CullShapeElement e : cullShapeElementList) {
96+
VoxelShape shape = Block.box(e.from.x, e.from.y, e.from.z, e.to.x, e.to.y, e.to.z);
97+
voxelShape = ShapeUtils.orUnoptimized(voxelShape, shape);
98+
}
99+
bakedOpacity.moreculling$setCullingShape(voxelShape);
100+
}
101+
}
102+
}
103+
104+
@Override
105+
public @Nullable VoxelShape moreculling$getCullingShape(BlockState state) {
106+
if (!this.moreculling$wasShapeOptimized) {
107+
if (this.moreculling$cullVoxelShape != null) {
108+
this.moreculling$cullVoxelShape = moreculling$cullVoxelShape.optimize();
109+
}
110+
this.moreculling$wasShapeOptimized = true;
111+
}
112+
113+
return this.moreculling$cullVoxelShape;
114+
}
115+
116+
@Override
117+
public void moreculling$setCullingShape(VoxelShape cullingShape) {
118+
this.moreculling$cullVoxelShape = cullingShape;
119+
}
120+
121+
@Override
122+
public boolean moreculling$canSetCullingShape() {
123+
return true;
124+
}
125+
}

common/src/main/resources/moreculling.mixins.json

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,18 @@
77
"plugin": "ca.fxco.moreculling.config.MixinConfigPlugin",
88
"client": [
99
"BakedQuad_cacheMixin",
10+
"CloudRenderer_cloudsMixin",
1011
"MapItemSavedData_cacheMixin",
1112
"Minecraft_managersMixin",
1213
"TextureAtlasSprite_opacityMixin",
13-
"CloudRenderer_cloudsMixin",
1414
"WeatherEffectRenderer_rainMixin",
1515
"accessors.BlockModelShaperAccessor",
16-
"accessors.SpriteContentsAccessor",
1716
"accessors.LevelRendererAccessor",
17+
"accessors.SpriteContentsAccessor",
1818
"blockentity.BeaconRenderer_frustumMixin",
19-
"blockentity.TheEndGatewayRenderer_beamMixin",
2019
"blockentity.SignRenderer_textMixin",
20+
"blockentity.TheEndGatewayRenderer_beamMixin",
2121
"blocks.BaseRailBlock_cullAgainstMixin",
22-
"blocks.cullshape.BaseTorchBlock_voxelMixin",
23-
"blocks.cullshape.BrewingStandBlock_voxelMixin",
24-
"blocks.cullshape.CampfireBlock_voxelMixin",
25-
"blocks.cullshape.ChorusFlowerBlock_voxelMixin",
26-
"blocks.cullshape.EndRodBlock_voxelMixin",
27-
"blocks.cullshape.LightningRodBlock_voxelMixin",
2822
"blocks.DoorBlock_cullAgainstMixin",
2923
"blocks.EndGatewayBlock_cullMixin",
3024
"blocks.FletchingTableBlock_devMixin",
@@ -33,8 +27,14 @@
3327
"blocks.MangroveRootsBlock_typesMixin",
3428
"blocks.PowderSnowBlock_cullMixin",
3529
"blocks.ShulkerBoxBlock_cullMixin",
36-
"blockstates.BlockStateBase_moreMixin",
30+
"blocks.cullshape.BaseTorchBlock_voxelMixin",
31+
"blocks.cullshape.BrewingStandBlock_voxelMixin",
32+
"blocks.cullshape.CampfireBlock_voxelMixin",
33+
"blocks.cullshape.ChorusFlowerBlock_voxelMixin",
34+
"blocks.cullshape.EndRodBlock_voxelMixin",
35+
"blocks.cullshape.LightningRodBlock_voxelMixin",
3736
"blockstates.Block_drawSideMixin",
37+
"blockstates.BlockStateBase_moreMixin",
3838
"blockstates.Minecraft_loadBlocksMixin",
3939
"compat.BambooStalkBlock_clientTweaksMixin",
4040
"compat.BlockOcclusionCache_sodiumMixin",
@@ -46,9 +46,11 @@
4646
"models.SingleVariant_cacheMixin",
4747
"models.WeightedVariants_cacheMixin",
4848
"models.cullshape.BlockModel_cullShapeMixin",
49+
"models.cullshape.BlockModelPart_extendsMixin",
4950
"models.cullshape.BlockStateBase_cullShapeMixin",
5051
"models.cullshape.Deserializer_cullShapeMixin",
5152
"models.cullshape.ModelManager_cullShapeMixin",
53+
"models.cullshape.SimpleModelWrapper_cullShapeMixin",
5254
"models.cullshape.UnbakedModel_extendsMixin",
5355
"renderers.ItemRenderer_faceCullingMixin",
5456
"renderers.ItemStackRenderState_apiMixin",

fabric/src/main/java/ca/fxco/moreculling/mixin/models/ItemModelGenerator_cullMixin.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)