Skip to content

Commit 10279ca

Browse files
committed
Bake signage
1 parent 78adfaa commit 10279ca

6 files changed

Lines changed: 336 additions & 7 deletions

File tree

src/main/java/net/modfest/fireblanket/mixin/client/bakery/shelf/MixinShelfBlockEntity.java renamed to src/main/java/net/modfest/fireblanket/mixin/client/bakery/MixinGenericBlockEntity.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
package net.modfest.fireblanket.mixin.client.bakery.shelf;
1+
package net.modfest.fireblanket.mixin.client.bakery;
22

33
import net.minecraft.core.BlockPos;
44
import net.minecraft.world.level.block.Block;
55
import net.minecraft.world.level.block.entity.BlockEntity;
66
import net.minecraft.world.level.block.entity.BlockEntityType;
77
import net.minecraft.world.level.block.entity.ShelfBlockEntity;
8+
import net.minecraft.world.level.block.entity.SignBlockEntity;
89
import net.minecraft.world.level.block.state.BlockState;
910
import org.spongepowered.asm.mixin.Mixin;
1011
import org.spongepowered.asm.mixin.Unique;
@@ -15,10 +16,10 @@
1516
/**
1617
* @author Ampflower
1718
**/
18-
@Mixin(ShelfBlockEntity.class)
19-
public abstract class MixinShelfBlockEntity extends BlockEntity {
19+
@Mixin({ShelfBlockEntity.class, SignBlockEntity.class})
20+
public abstract class MixinGenericBlockEntity extends BlockEntity {
2021

21-
public MixinShelfBlockEntity(
22+
public MixinGenericBlockEntity(
2223
final BlockEntityType<?> type,
2324
final BlockPos worldPosition,
2425
final BlockState blockState
@@ -27,12 +28,12 @@ public MixinShelfBlockEntity(
2728
}
2829

2930
@Inject(method = "loadAdditional", at = @At("RETURN"))
30-
private void onLoadAdditional(CallbackInfo ci) {
31+
protected void onLoadAdditional(CallbackInfo ci) {
3132
this.rebake(false);
3233
}
3334

3435
@Unique
35-
private void rebake(boolean immediate) {
36+
protected void rebake(boolean immediate) {
3637
if (!this.hasLevel() || !this.getLevel().isClientSide()) {
3738
return;
3839
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package net.modfest.fireblanket.mixin.client.bakery.sign;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import net.minecraft.client.Minecraft;
5+
import net.minecraft.client.model.Model;
6+
import net.minecraft.client.renderer.SubmitNodeCollector;
7+
import net.minecraft.client.renderer.blockentity.AbstractSignRenderer;
8+
import net.minecraft.client.renderer.blockentity.state.SignRenderState;
9+
import net.minecraft.client.renderer.feature.ModelFeatureRenderer;
10+
import net.minecraft.client.renderer.state.level.CameraRenderState;
11+
import net.minecraft.client.resources.model.sprite.SpriteId;
12+
import net.minecraft.core.BlockPos;
13+
import net.minecraft.world.level.block.SignBlock;
14+
import net.minecraft.world.level.block.entity.SignBlockEntity;
15+
import net.minecraft.world.level.block.state.properties.WoodType;
16+
import net.minecraft.world.phys.Vec3;
17+
import net.modfest.fireblanket.mixinsupport.client.RetrofitBakery;
18+
import org.jetbrains.annotations.MustBeInvokedByOverriders;
19+
import org.jetbrains.annotations.Nullable;
20+
import org.spongepowered.asm.mixin.Mixin;
21+
import org.spongepowered.asm.mixin.Overwrite;
22+
import org.spongepowered.asm.mixin.Shadow;
23+
24+
/**
25+
* @author Ampflower
26+
* @since ${version}
27+
**/
28+
@Mixin(AbstractSignRenderer.class)
29+
public class MixinAbstractSignRenderer<E extends SignBlockEntity, S extends SignRenderState> implements RetrofitBakery<E, S> {
30+
31+
/**
32+
* @vanilla-copy {@link AbstractSignRenderer#extractRenderState(SignBlockEntity, SignRenderState, float, Vec3, ModelFeatureRenderer.CrumblingOverlay)}
33+
*/
34+
@Override
35+
public void extractBakingRenderState(final E blockEntity, final S state, final int light) {
36+
RetrofitBakery.super.extractBakingRenderState(blockEntity, state, light);
37+
state.maxTextLineWidth = blockEntity.getMaxTextLineWidth();
38+
state.textLineHeight = blockEntity.getTextLineHeight();
39+
state.frontText = blockEntity.getFrontText();
40+
state.backText = blockEntity.getBackText();
41+
state.isTextFilteringEnabled = Minecraft.getInstance().isTextFilteringEnabled();
42+
// PARITY CHANGE: Bake as if we're always in range or scoping.
43+
// We're baking it down, we cannot use any distance check.
44+
state.drawOutline = true;
45+
state.woodType = SignBlock.getWoodType(blockEntity.getBlockState().getBlock());
46+
}
47+
48+
/**
49+
* @author Ampflower
50+
* @reason intentionally break other mixins into here, minimize stuff copied to the render state
51+
*/
52+
@Override
53+
@Overwrite
54+
@MustBeInvokedByOverriders
55+
public void extractRenderState(
56+
final E blockEntity,
57+
final S state,
58+
final float partialTicks,
59+
final Vec3 cameraPosition,
60+
final ModelFeatureRenderer.CrumblingOverlay breakProgress
61+
) {
62+
RetrofitBakery.super.extractRenderState(blockEntity, state, partialTicks, cameraPosition, breakProgress);
63+
state.woodType = SignBlock.getWoodType(blockEntity.getBlockState().getBlock());
64+
}
65+
66+
/**
67+
* @author Ampflower
68+
* @reason Delegate to crumbling, intentionally break other mixins into here.
69+
*/
70+
@Override
71+
@Overwrite
72+
public void submit(
73+
final S state,
74+
final PoseStack poseStack,
75+
final SubmitNodeCollector submitNodeCollector,
76+
final CameraRenderState camera
77+
) {
78+
if (state.breakProgress == null) {
79+
return;
80+
}
81+
poseStack.pushPose();
82+
poseStack.mulPose(state.transformations.body());
83+
Model.Simple bodyModel = this.getSignModel(state);
84+
this.submitSign(
85+
poseStack,
86+
state.lightCoords,
87+
state.woodType,
88+
bodyModel,
89+
state.breakProgress,
90+
submitNodeCollector
91+
);
92+
poseStack.popPose();
93+
}
94+
95+
@Override
96+
public void submitForBaking(
97+
final S state,
98+
final PoseStack poseStack,
99+
final SubmitNodeCollector submitNodeCollector
100+
) {
101+
this.submitSignWithText(state, poseStack, /* Always send */ null, submitNodeCollector);
102+
}
103+
104+
@Shadow
105+
private void submitSignWithText(
106+
final S state,
107+
final PoseStack poseStack,
108+
@Nullable final ModelFeatureRenderer.CrumblingOverlay breakProgress,
109+
final SubmitNodeCollector submitNodeCollector
110+
) {
111+
throw new AssertionError();
112+
}
113+
114+
@Shadow
115+
protected void submitSign(
116+
final PoseStack poseStack,
117+
final int lightCoords,
118+
final WoodType type,
119+
final Model.Simple signModel,
120+
final ModelFeatureRenderer.CrumblingOverlay breakProgress,
121+
final SubmitNodeCollector submitNodeCollector
122+
) {
123+
throw new AssertionError();
124+
}
125+
126+
@Shadow
127+
protected Model.Simple getSignModel(S state) {
128+
throw new AssertionError();
129+
}
130+
131+
@Shadow
132+
protected SpriteId getSignSprite(WoodType type) {
133+
throw new AssertionError();
134+
}
135+
136+
@Shadow
137+
private static boolean isOutlineVisible(final BlockPos pos) {
138+
throw new AssertionError();
139+
}
140+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package net.modfest.fireblanket.mixin.client.bakery.sign;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import net.minecraft.client.renderer.blockentity.HangingSignRenderer;
5+
import net.minecraft.client.renderer.blockentity.WallAndGroundTransformations;
6+
import net.minecraft.client.renderer.blockentity.state.HangingSignRenderState;
7+
import net.minecraft.client.renderer.blockentity.state.SignRenderState;
8+
import net.minecraft.client.renderer.feature.ModelFeatureRenderer;
9+
import net.minecraft.world.level.block.CeilingHangingSignBlock;
10+
import net.minecraft.world.level.block.HangingSignBlock;
11+
import net.minecraft.world.level.block.WallHangingSignBlock;
12+
import net.minecraft.world.level.block.entity.SignBlockEntity;
13+
import net.minecraft.world.level.block.state.BlockState;
14+
import net.minecraft.world.phys.Vec3;
15+
import org.jetbrains.annotations.Nullable;
16+
import org.spongepowered.asm.mixin.Final;
17+
import org.spongepowered.asm.mixin.Mixin;
18+
import org.spongepowered.asm.mixin.Shadow;
19+
import org.spongepowered.asm.mixin.injection.At;
20+
import org.spongepowered.asm.mixin.injection.Inject;
21+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
22+
23+
/**
24+
* @author Ampflower
25+
**/
26+
@Mixin(HangingSignRenderer.class)
27+
public class MixinHangingSignRenderer extends MixinAbstractSignRenderer<SignBlockEntity, HangingSignRenderState> {
28+
@Shadow
29+
@Final
30+
public static WallAndGroundTransformations<SignRenderState.SignTransformations> TRANSFORMATIONS;
31+
32+
/**
33+
* @vanilla-copy {@link HangingSignRenderer#extractRenderState(SignBlockEntity, HangingSignRenderState, float, Vec3, ModelFeatureRenderer.CrumblingOverlay)} )}
34+
*/
35+
@Override
36+
public void extractBakingRenderState(
37+
final SignBlockEntity blockEntity,
38+
final HangingSignRenderState state,
39+
final int light
40+
) {
41+
super.extractBakingRenderState(blockEntity, state, light);
42+
BlockState blockState = blockEntity.getBlockState();
43+
state.attachmentType = HangingSignBlock.getAttachmentPoint(blockState);
44+
if (blockState.getBlock() instanceof WallHangingSignBlock) {
45+
state.transformations = TRANSFORMATIONS.wallTransformation(blockState.getValue(WallHangingSignBlock.FACING));
46+
} else {
47+
state.transformations = TRANSFORMATIONS.freeTransformations(blockState.getValue(CeilingHangingSignBlock.ROTATION));
48+
}
49+
}
50+
51+
@Inject(method = "extractRenderState", at = @At("HEAD"), cancellable = true)
52+
private void onExtractRenderState(
53+
final CallbackInfo ci,
54+
final @Local(argsOnly = true) @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress
55+
) {
56+
if (breakProgress == null) {
57+
ci.cancel();
58+
}
59+
}
60+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package net.modfest.fireblanket.mixin.client.bakery.sign;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import net.minecraft.client.renderer.blockentity.StandingSignRenderer;
5+
import net.minecraft.client.renderer.blockentity.WallAndGroundTransformations;
6+
import net.minecraft.client.renderer.blockentity.state.SignRenderState;
7+
import net.minecraft.client.renderer.blockentity.state.StandingSignRenderState;
8+
import net.minecraft.client.renderer.feature.ModelFeatureRenderer;
9+
import net.minecraft.world.level.block.PlainSignBlock;
10+
import net.minecraft.world.level.block.StandingSignBlock;
11+
import net.minecraft.world.level.block.WallSignBlock;
12+
import net.minecraft.world.level.block.entity.SignBlockEntity;
13+
import net.minecraft.world.level.block.state.BlockState;
14+
import net.minecraft.world.phys.Vec3;
15+
import org.jetbrains.annotations.Nullable;
16+
import org.spongepowered.asm.mixin.Final;
17+
import org.spongepowered.asm.mixin.Mixin;
18+
import org.spongepowered.asm.mixin.Shadow;
19+
import org.spongepowered.asm.mixin.injection.At;
20+
import org.spongepowered.asm.mixin.injection.Inject;
21+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
22+
23+
/**
24+
* @author Ampflower
25+
**/
26+
@Mixin(StandingSignRenderer.class)
27+
public class MixinStandingSignRenderer extends MixinAbstractSignRenderer<SignBlockEntity, StandingSignRenderState> {
28+
@Shadow
29+
@Final
30+
public static WallAndGroundTransformations<SignRenderState.SignTransformations> TRANSFORMATIONS;
31+
32+
/**
33+
* @vanilla-copy {@link StandingSignRenderer#extractRenderState(SignBlockEntity, StandingSignRenderState, float, Vec3, ModelFeatureRenderer.CrumblingOverlay)}
34+
*/
35+
@Override
36+
public void extractBakingRenderState(
37+
final SignBlockEntity blockEntity,
38+
final StandingSignRenderState state,
39+
final int light
40+
) {
41+
super.extractBakingRenderState(blockEntity, state, light);
42+
BlockState blockState = blockEntity.getBlockState();
43+
state.attachmentType = PlainSignBlock.getAttachmentPoint(blockState);
44+
if (blockState.getBlock() instanceof WallSignBlock) {
45+
state.transformations = TRANSFORMATIONS.wallTransformation(blockState.getValue(WallSignBlock.FACING));
46+
} else {
47+
state.transformations = TRANSFORMATIONS.freeTransformations(blockState.getValue(StandingSignBlock.ROTATION));
48+
}
49+
}
50+
51+
@Inject(method = "extractRenderState", at = @At("HEAD"), cancellable = true)
52+
private void onExtractRenderState(
53+
final CallbackInfo ci,
54+
final @Local(argsOnly = true) @Nullable ModelFeatureRenderer.CrumblingOverlay breakProgress
55+
) {
56+
if (breakProgress == null) {
57+
ci.cancel();
58+
}
59+
}
60+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package net.modfest.fireblanket.mixinsupport.client;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import dev.hephaestus.glowcase.client.render.block.entity.BakedBlockEntityRenderer;
5+
import net.minecraft.client.renderer.SubmitNodeCollector;
6+
import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState;
7+
import net.minecraft.client.renderer.state.level.CameraRenderState;
8+
import net.minecraft.world.level.block.entity.BlockEntity;
9+
import org.jetbrains.annotations.ApiStatus;
10+
import org.jspecify.annotations.NullMarked;
11+
12+
/**
13+
* @author Ampflower
14+
**/
15+
@NullMarked
16+
public interface RetrofitBakery<E extends BlockEntity, S extends BlockEntityRenderState> extends BakedBlockEntityRenderer<E, S, S> {
17+
@Override
18+
default boolean shouldBake(E e) {
19+
// Well, if you're retrofitting the bakery-
20+
// You *probably* want this.
21+
return true;
22+
}
23+
24+
@Override
25+
default S createBakedRenderState() {
26+
return createRenderState();
27+
}
28+
29+
@Override
30+
@SuppressWarnings({"deprecation", "UnstableApiUsage", "NonExtendableApiUsage"})
31+
default void submit(
32+
S state,
33+
PoseStack poseStack,
34+
SubmitNodeCollector submitNodeCollector,
35+
CameraRenderState camera
36+
) {
37+
throw new AssertionError("Always expected to be extended.");
38+
}
39+
40+
/**
41+
* @deprecated Extending this is an error.
42+
*/
43+
@Override
44+
@Deprecated(forRemoval = true)
45+
@ApiStatus.NonExtendable
46+
default void submitForRendering(
47+
S s,
48+
PoseStack poseStack,
49+
SubmitNodeCollector submitNodeCollector,
50+
CameraRenderState cameraRenderState
51+
) {
52+
throw new AssertionError("Never expected to be called.");
53+
}
54+
55+
/**
56+
* In the event it isn't: Use {@link org.spongepowered.asm.mixin.Intrinsic}.
57+
*/
58+
@Override
59+
default S createRenderState() {
60+
throw new AssertionError("Always expected to be extended.");
61+
}
62+
}

src/main/resources/fireblanket.mixins.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"block.MixinCommandBlockMinecartExecutor",
4545
"block.MixinServerPlayNetworkHandler",
4646
"block_format.MixinChunkSection",
47+
"client.bakery.sign.MixinHangingSignRenderer",
4748
"command.MixinCommandManager",
4849
"command.MixinServerCommandSource",
4950
"crash.MixinCraftingScreenHandler",
@@ -109,15 +110,20 @@
109110
"injectors": {
110111
"defaultRequire": 1
111112
},
113+
"overwrites": {
114+
"conformVisibility": true
115+
},
112116
"client": [
113117
"accessor.ClientLoginNetworkHandlerAccessor",
114118
"accessor.ParticleManagerAccessor",
115119
"client.MixinByteBufferBuilder",
116120
"client.MixinClientPlayNetworkHandler",
117121
"client.adventure_fix.MixinClientPlayerInteractionManager",
118122
"client.annoyances.adventure.MixinBlockPredicatesComponent",
119-
"client.bakery.shelf.MixinShelfBlockEntity",
123+
"client.bakery.MixinGenericBlockEntity",
120124
"client.bakery.shelf.MixinShelfRenderer",
125+
"client.bakery.sign.MixinAbstractSignRenderer",
126+
"client.bakery.sign.MixinStandingSignRenderer",
121127
"client.be_masking.MixinBlockEntityRenderDispatcher",
122128
"client.hooks.MixinDebugRenderer",
123129
"client.hooks.MixinKeyboardHandler",

0 commit comments

Comments
 (0)