Skip to content

Commit 2107741

Browse files
committed
Port to 1.21.4
1 parent 05ea0a7 commit 2107741

22 files changed

+234
-320
lines changed

gradle.properties

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ org.gradle.jvmargs = -Xmx1G
33
org.gradle.parallel = true
44

55
# Fabric Properties
6-
loom_version = 1.8.12
7-
minecraft_version = 1.21.3
8-
yarn_mappings = 1.21.3+build.2
6+
loom_version = 1.9.2
7+
minecraft_version = 1.21.4
8+
yarn_mappings = 1.21.4+build.1
99
loader_version = 0.16.9
1010

1111
# Mod Properties
1212
mod_version = 3.0.0
13-
mod_minecraft_version = 1.21.3
13+
mod_minecraft_version = 1.21.4
1414
maven_group = me.pepperbell
1515
archives_base_name = continuity
1616

1717
# Dependencies
18-
fabric_version = 0.107.3+1.21.3
19-
modmenu_version = 12.0.0-beta.1
18+
fabric_version = 0.113.0+1.21.4
19+
modmenu_version = 13.0.0-beta.1

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

src/main/java/me/pepperbell/continuity/api/client/QuadProcessor.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package me.pepperbell.continuity.api.client;
22

3-
import java.util.function.Consumer;
43
import java.util.function.Function;
54
import java.util.function.Supplier;
65

7-
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
86
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
97
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
108
import net.minecraft.block.BlockState;
@@ -18,13 +16,7 @@ public interface QuadProcessor {
1816
ProcessingResult processQuad(MutableQuadView quad, Sprite sprite, BlockRenderView blockView, BlockState appearanceState, BlockState state, BlockPos pos, Supplier<Random> randomSupplier, int pass, ProcessingContext context);
1917

2018
interface ProcessingContext extends ProcessingDataProvider {
21-
void addEmitterConsumer(Consumer<QuadEmitter> consumer);
22-
23-
void addMesh(Mesh mesh);
24-
2519
QuadEmitter getExtraQuadEmitter();
26-
27-
void markHasExtraQuads();
2820
}
2921

3022
enum ProcessingResult {

src/main/java/me/pepperbell/continuity/client/config/ContinuityConfig.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public class ContinuityConfig {
3838
public final Option.BooleanOption connectedTextures = addOption(new Option.BooleanOption("connected_textures", true));
3939
public final Option.BooleanOption emissiveTextures = addOption(new Option.BooleanOption("emissive_textures", true));
4040
public final Option.BooleanOption customBlockLayers = addOption(new Option.BooleanOption("custom_block_layers", true));
41-
public final Option.BooleanOption useManualCulling = addOption(new Option.BooleanOption("use_manual_culling", true));
4241

4342
public ContinuityConfig(File file) {
4443
this.file = file;

src/main/java/me/pepperbell/continuity/client/mixin/BakedModelManagerMixin.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,26 @@
33
import java.util.Map;
44
import java.util.concurrent.CompletableFuture;
55
import java.util.concurrent.Executor;
6+
import java.util.function.Function;
67

78
import org.jetbrains.annotations.Nullable;
89
import org.spongepowered.asm.mixin.Mixin;
910
import org.spongepowered.asm.mixin.Unique;
1011
import org.spongepowered.asm.mixin.injection.At;
1112
import org.spongepowered.asm.mixin.injection.Inject;
13+
import org.spongepowered.asm.mixin.injection.ModifyArg;
14+
import org.spongepowered.asm.mixin.injection.Slice;
1215
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1316
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1417

1518
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
1619

1720
import it.unimi.dsi.fastutil.objects.Object2IntMap;
21+
import me.pepperbell.continuity.client.resource.BakedModelManagerBakeContext;
1822
import me.pepperbell.continuity.client.resource.BakedModelManagerReloadExtension;
1923
import net.minecraft.block.BlockState;
24+
import net.minecraft.client.render.block.entity.LoadedBlockEntityModels;
25+
import net.minecraft.client.render.entity.model.LoadedEntityModels;
2026
import net.minecraft.client.render.model.BakedModelManager;
2127
import net.minecraft.client.render.model.ModelBaker;
2228
import net.minecraft.client.render.model.SpriteAtlasManager;
@@ -54,11 +60,25 @@ abstract class BakedModelManagerMixin {
5460
return original.thenRun(() -> continuity$reloadExtension = null);
5561
}
5662

57-
@Inject(method = "bake(Lnet/minecraft/util/profiler/Profiler;Ljava/util/Map;Lnet/minecraft/client/render/model/ModelBaker;Lit/unimi/dsi/fastutil/objects/Object2IntMap;)Lnet/minecraft/client/render/model/BakedModelManager$BakingResult;", at = @At("HEAD"))
58-
private void continuity$onHeadBake(Profiler profiler, Map<Identifier, SpriteAtlasManager.AtlasPreparation> preparations, ModelBaker bakery, Object2IntMap<BlockState> modelGroups, CallbackInfoReturnable<?> cir) {
63+
@ModifyArg(method = "reload(Lnet/minecraft/resource/ResourceReloader$Synchronizer;Lnet/minecraft/resource/ResourceManager;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/model/SpriteAtlasManager;reload(Lnet/minecraft/resource/ResourceManager;ILjava/util/concurrent/Executor;)Ljava/util/Map;")), at = @At(value = "INVOKE", target = "Ljava/util/concurrent/CompletableFuture;thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", ordinal = 0), index = 0)
64+
private Function<Void, Object> continuity$modifyFunction(Function<Void, Object> function) {
5965
BakedModelManagerReloadExtension reloadExtension = continuity$reloadExtension;
6066
if (reloadExtension != null) {
61-
reloadExtension.beforeBaking(preparations);
67+
return v -> {
68+
BakedModelManagerBakeContext.THREAD_LOCAL.set(reloadExtension);
69+
Object result = function.apply(v);
70+
BakedModelManagerBakeContext.THREAD_LOCAL.remove();
71+
return result;
72+
};
73+
}
74+
return function;
75+
}
76+
77+
@Inject(method = "bake(Lnet/minecraft/util/profiler/Profiler;Ljava/util/Map;Lnet/minecraft/client/render/model/ModelBaker;Lit/unimi/dsi/fastutil/objects/Object2IntMap;Lnet/minecraft/client/render/entity/model/LoadedEntityModels;Lnet/minecraft/client/render/block/entity/LoadedBlockEntityModels;)Lnet/minecraft/client/render/model/BakedModelManager$BakingResult;", at = @At("HEAD"))
78+
private static void continuity$onHeadBake(Profiler profiler, final Map<Identifier, SpriteAtlasManager.AtlasPreparation> atlases, ModelBaker baker, Object2IntMap<BlockState> groups, LoadedEntityModels entityModels, LoadedBlockEntityModels blockEntityModels, CallbackInfoReturnable<Object> cir) {
79+
BakedModelManagerBakeContext context = BakedModelManagerBakeContext.THREAD_LOCAL.get();
80+
if (context != null) {
81+
context.beforeBake(atlases);
6282
}
6383
}
6484

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package me.pepperbell.continuity.client.mixin;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.injection.At;
5+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
6+
7+
import me.pepperbell.continuity.client.resource.ModelWrappingHandler;
8+
import net.minecraft.client.render.item.ItemRenderState;
9+
import net.minecraft.client.render.model.BakedModel;
10+
11+
@Mixin(value = ItemRenderState.LayerRenderState.class, priority = -1000)
12+
abstract class LayerRenderStateMixin {
13+
@ModifyVariable(method = "setModel(Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/client/render/RenderLayer;)V", at = @At("HEAD"), argsOnly = true, ordinal = 0)
14+
private BakedModel continuity$modifyBakedModel(BakedModel model) {
15+
ModelWrappingHandler wrappingHandler = ModelWrappingHandler.getInstance();
16+
if (wrappingHandler != null) {
17+
return wrappingHandler.ensureWrapped(model);
18+
}
19+
return model;
20+
}
21+
}

src/main/java/me/pepperbell/continuity/client/model/CtmBakedModel.java

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,54 @@
11
package me.pepperbell.continuity.client.model;
22

33
import java.util.function.Function;
4+
import java.util.function.Predicate;
45
import java.util.function.Supplier;
56

7+
import org.jetbrains.annotations.Nullable;
8+
69
import me.pepperbell.continuity.api.client.QuadProcessor;
710
import me.pepperbell.continuity.client.config.ContinuityConfig;
811
import me.pepperbell.continuity.client.util.RenderUtil;
912
import me.pepperbell.continuity.impl.client.ProcessingContextImpl;
1013
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
11-
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel;
12-
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
14+
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
15+
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform;
1316
import net.minecraft.block.BlockState;
1417
import net.minecraft.client.render.model.BakedModel;
18+
import net.minecraft.client.render.model.WrapperBakedModel;
1519
import net.minecraft.client.texture.Sprite;
1620
import net.minecraft.util.math.BlockPos;
1721
import net.minecraft.util.math.Direction;
1822
import net.minecraft.util.math.random.Random;
1923
import net.minecraft.world.BlockRenderView;
2024

21-
public class CtmBakedModel extends ForwardingBakedModel {
25+
public class CtmBakedModel extends WrapperBakedModel {
2226
public static final int PASSES = 4;
2327

2428
protected final BlockState defaultState;
2529
protected volatile Function<Sprite, QuadProcessors.Slice> defaultSliceFunc;
2630

2731
public CtmBakedModel(BakedModel wrapped, BlockState defaultState) {
28-
this.wrapped = wrapped;
32+
super(wrapped);
2933
this.defaultState = defaultState;
3034
}
3135

3236
@Override
33-
public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos, Supplier<Random> randomSupplier, RenderContext context) {
37+
public void emitBlockQuads(QuadEmitter emitter, BlockRenderView blockView, BlockState state, BlockPos pos, Supplier<Random> randomSupplier, Predicate<@Nullable Direction> cullTest) {
3438
if (!ContinuityConfig.INSTANCE.connectedTextures.get()) {
35-
super.emitBlockQuads(blockView, state, pos, randomSupplier, context);
39+
super.emitBlockQuads(emitter, blockView, state, pos, randomSupplier, cullTest);
3640
return;
3741
}
3842

3943
ModelObjectsContainer container = ModelObjectsContainer.get();
4044
if (!container.featureStates.getConnectedTexturesState().isEnabled()) {
41-
super.emitBlockQuads(blockView, state, pos, randomSupplier, context);
45+
super.emitBlockQuads(emitter, blockView, state, pos, randomSupplier, cullTest);
4246
return;
4347
}
4448

4549
CtmQuadTransform quadTransform = container.ctmQuadTransform;
4650
if (quadTransform.isActive()) {
47-
super.emitBlockQuads(blockView, state, pos, randomSupplier, context);
51+
super.emitBlockQuads(emitter, blockView, state, pos, randomSupplier, cullTest);
4852
return;
4953
}
5054

@@ -65,13 +69,13 @@ public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos
6569
// especially if there is an actual use case for it.
6670
BlockState appearanceState = state.getAppearance(blockView, pos, Direction.DOWN, state, pos);
6771

68-
quadTransform.prepare(blockView, appearanceState, state, pos, randomSupplier, context, ContinuityConfig.INSTANCE.useManualCulling.get(), getSliceFunc(appearanceState));
72+
quadTransform.prepare(blockView, appearanceState, state, pos, randomSupplier, cullTest, getSliceFunc(appearanceState));
6973

70-
context.pushTransform(quadTransform);
71-
super.emitBlockQuads(blockView, state, pos, randomSupplier, context);
72-
context.popTransform();
74+
emitter.pushTransform(quadTransform);
75+
super.emitBlockQuads(emitter, blockView, state, pos, randomSupplier, cullTest);
76+
emitter.popTransform();
7377

74-
quadTransform.processingContext.outputTo(context.getEmitter());
78+
quadTransform.processingContext.outputTo(emitter);
7579
quadTransform.reset();
7680
}
7781

@@ -100,23 +104,22 @@ protected Function<Sprite, QuadProcessors.Slice> getSliceFunc(BlockState state)
100104
return QuadProcessors.getCache(state);
101105
}
102106

103-
protected static class CtmQuadTransform implements RenderContext.QuadTransform {
107+
protected static class CtmQuadTransform implements QuadTransform {
104108
protected final ProcessingContextImpl processingContext = new ProcessingContextImpl();
105109

106110
protected BlockRenderView blockView;
107111
protected BlockState appearanceState;
108112
protected BlockState state;
109113
protected BlockPos pos;
110114
protected Supplier<Random> randomSupplier;
111-
protected RenderContext renderContext;
112-
protected boolean useManualCulling;
115+
protected Predicate<@Nullable Direction> cullTest;
113116
protected Function<Sprite, QuadProcessors.Slice> sliceFunc;
114117

115118
protected boolean active;
116119

117120
@Override
118121
public boolean transform(MutableQuadView quad) {
119-
if (useManualCulling && renderContext.isFaceCulled(quad.cullFace())) {
122+
if (cullTest.test(quad.cullFace())) {
120123
return false;
121124
}
122125

@@ -156,19 +159,16 @@ public boolean isActive() {
156159
return active;
157160
}
158161

159-
public void prepare(BlockRenderView blockView, BlockState appearanceState, BlockState state, BlockPos pos, Supplier<Random> randomSupplier, RenderContext renderContext, boolean useManualCulling, Function<Sprite, QuadProcessors.Slice> sliceFunc) {
162+
public void prepare(BlockRenderView blockView, BlockState appearanceState, BlockState state, BlockPos pos, Supplier<Random> randomSupplier, Predicate<@Nullable Direction> cullTest, Function<Sprite, QuadProcessors.Slice> sliceFunc) {
160163
this.blockView = blockView;
161164
this.appearanceState = appearanceState;
162165
this.state = state;
163166
this.pos = pos;
164167
this.randomSupplier = randomSupplier;
165-
this.renderContext = renderContext;
166-
this.useManualCulling = useManualCulling;
168+
this.cullTest = cullTest;
167169
this.sliceFunc = sliceFunc;
168170

169171
active = true;
170-
171-
processingContext.prepare();
172172
}
173173

174174
public void reset() {
@@ -177,8 +177,7 @@ public void reset() {
177177
state = null;
178178
pos = null;
179179
randomSupplier = null;
180-
renderContext = null;
181-
useManualCulling = false;
180+
cullTest = null;
182181
sliceFunc = null;
183182

184183
active = false;

0 commit comments

Comments
 (0)