Skip to content

Commit 2f97782

Browse files
committed
Support the new Fabric model events
1 parent 9ed71dc commit 2f97782

File tree

3 files changed

+187
-12
lines changed

3 files changed

+187
-12
lines changed

common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public TextureAtlasSprite reportMissingReference(ModelDebugName modelDebugName,
134134
this.resourceManager = resourceManager;
135135
this.resolver = new DynamicResolver();
136136
this.itemModelGenerator = new ItemModelGenerator();
137-
this.missingModel = this.bakeModel(this.unbakedMissingModel, () -> "missing");
137+
this.missingModel = this.bakeMissingModel();
138138
this.missingItemModel = new MissingItemModel(this.missingModel);
139139
try {
140140
Class.forName("net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin");
@@ -372,27 +372,48 @@ private Optional<BlockStateModelLoader.LoadedModels> loadBlockStateDefinition(Re
372372
return Optional.of(new BlockStateModelLoader.LoadedModels(loadedModels));
373373
}
374374

375-
private BakedModel bakeModel(UnbakedModel model, ModelDebugName name) {
375+
private BakedModel bakeMissingModel() {
376+
this.resolver.clearResolver();
377+
this.unbakedMissingModel.resolveDependencies(this.resolver);
378+
var modelBaker = new DynamicBaker(() -> "missing");
379+
return UnbakedModel.bakeWithTopModelValues(this.unbakedMissingModel, modelBaker, BlockModelRotation.X0_Y0);
380+
}
381+
382+
private BakedModel bakeModel(UnbakedModel model, ResourceLocation location) {
376383
if (DEBUG_DYNAMIC_MODEL_LOADING) {
377-
ModernFix.LOGGER.info("Baking model '{}'", name.get());
384+
ModernFix.LOGGER.info("Baking model '{}'", location);
378385
}
379386
synchronized (this) {
380387
this.resolver.clearResolver();
381388
model.resolveDependencies(this.resolver);
382-
var modelBaker = new DynamicBaker(name);
383-
return UnbakedModel.bakeWithTopModelValues(model, modelBaker, BlockModelRotation.X0_Y0);
389+
var modelBaker = new DynamicBaker(location::toString);
390+
for (var plugin : pluginList) {
391+
model = plugin.modifyModelBeforeBake(model, location, BlockModelRotation.X0_Y0, modelBaker);
392+
}
393+
var bakedModel = UnbakedModel.bakeWithTopModelValues(model, modelBaker, BlockModelRotation.X0_Y0);
394+
for (var plugin : pluginList) {
395+
bakedModel = plugin.modifyModelAfterBake(bakedModel, model, location, BlockModelRotation.X0_Y0, modelBaker);
396+
}
397+
return bakedModel;
384398
}
385399
}
386400

387-
private BakedModel bakeModel(UnbakedBlockStateModel model, ModelDebugName name) {
401+
private BakedModel bakeModel(UnbakedBlockStateModel model, ModelResourceLocation mrl) {
388402
if (DEBUG_DYNAMIC_MODEL_LOADING) {
389-
ModernFix.LOGGER.info("Baking model '{}'", name.get());
403+
ModernFix.LOGGER.info("Baking model '{}'", mrl);
390404
}
391405
synchronized (this) {
392406
this.resolver.clearResolver();
393407
model.resolveDependencies(this.resolver);
394-
var modelBaker = new DynamicBaker(name);
395-
return model.bake(modelBaker);
408+
var modelBaker = new DynamicBaker(mrl::toString);
409+
for (var plugin : pluginList) {
410+
model = plugin.modifyBlockModelBeforeBake(model, mrl, modelBaker);
411+
}
412+
var bakedModel = model.bake(modelBaker);
413+
for (var plugin : pluginList) {
414+
bakedModel = plugin.modifyBlockModelAfterBake(bakedModel, model, mrl, modelBaker);
415+
}
416+
return bakedModel;
396417
}
397418
}
398419

@@ -417,7 +438,7 @@ private Optional<BakedModel> loadBakedModel(ModelResourceLocation location) {
417438
});
418439
}
419440
return unbakedModelOpt.map(unbakedModel -> {
420-
return this.bakeModel(unbakedModel, location::toString);
441+
return this.bakeModel(unbakedModel, location);
421442
});
422443
}
423444
}
@@ -428,7 +449,7 @@ private Optional<BakedModel> loadStandaloneModel(ResourceLocation location) {
428449
return Optional.of(override);
429450
}
430451
return this.loadedBlockModels.getUnchecked(location).map(unbakedModel -> {
431-
return this.bakeModel(unbakedModel, location::toString);
452+
return this.bakeModel(unbakedModel, location);
432453
});
433454
}
434455

@@ -588,5 +609,11 @@ public interface ModelManagerExtension {
588609
public interface DynamicModelPlugin {
589610
Optional<UnbakedModel> modifyModelOnLoad(Optional<UnbakedModel> model, ResourceLocation id);
590611
UnbakedBlockStateModel modifyBlockModelOnLoad(UnbakedBlockStateModel model, ModelResourceLocation id, BlockState state);
612+
613+
UnbakedModel modifyModelBeforeBake(UnbakedModel model, ResourceLocation id, ModelState state, ModelBaker baker);
614+
BakedModel modifyModelAfterBake(BakedModel bakedModel, UnbakedModel model, ResourceLocation id, ModelState state, ModelBaker baker);
615+
616+
UnbakedBlockStateModel modifyBlockModelBeforeBake(UnbakedBlockStateModel model, ModelResourceLocation id, ModelBaker baker);
617+
BakedModel modifyBlockModelAfterBake(BakedModel bakedModel, UnbakedBlockStateModel model, ModelResourceLocation id, ModelBaker baker);
591618
}
592619
}

common/src/main/java/org/embeddedt/modernfix/dynamicresources/FabricDynamicModelHandler.java

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
import net.fabricmc.fabric.api.event.EventFactory;
88
import net.minecraft.client.renderer.block.BlockModelShaper;
99
import net.minecraft.client.renderer.block.model.UnbakedBlockStateModel;
10+
import net.minecraft.client.resources.model.BakedModel;
11+
import net.minecraft.client.resources.model.ModelBaker;
1012
import net.minecraft.client.resources.model.ModelResourceLocation;
13+
import net.minecraft.client.resources.model.ModelState;
1114
import net.minecraft.client.resources.model.UnbakedModel;
1215
import net.minecraft.resources.ResourceLocation;
1316
import net.minecraft.world.level.block.Block;
@@ -51,6 +54,51 @@ public class FabricDynamicModelHandler implements DynamicModelProvider.DynamicMo
5154
return model;
5255
}, MODEL_MODIFIER_PHASES);
5356

57+
private final Event<ModelModifier.BeforeBakeBlock> beforeBakeBlockModifiers = EventFactory.createWithPhases(ModelModifier.BeforeBakeBlock.class, modifiers -> (model, context) -> {
58+
for (ModelModifier.BeforeBakeBlock modifier : modifiers) {
59+
try {
60+
model = modifier.modifyModelBeforeBake(model, context);
61+
} catch (Exception exception) {
62+
ModernFix.LOGGER.error("Failed to modify unbaked block model before bake", exception);
63+
}
64+
}
65+
66+
return model;
67+
}, MODEL_MODIFIER_PHASES);
68+
private final Event<ModelModifier.AfterBakeBlock> afterBakeBlockModifiers = EventFactory.createWithPhases(ModelModifier.AfterBakeBlock.class, modifiers -> (model, context) -> {
69+
for (ModelModifier.AfterBakeBlock modifier : modifiers) {
70+
try {
71+
model = modifier.modifyModelAfterBake(model, context);
72+
} catch (Exception exception) {
73+
ModernFix.LOGGER.error("Failed to modify baked block model after bake", exception);
74+
}
75+
}
76+
77+
return model;
78+
}, MODEL_MODIFIER_PHASES);
79+
private final Event<ModelModifier.BeforeBake> beforeBakeModifiers = EventFactory.createWithPhases(ModelModifier.BeforeBake.class, modifiers -> (model, context) -> {
80+
for (ModelModifier.BeforeBake modifier : modifiers) {
81+
try {
82+
model = modifier.modifyModelBeforeBake(model, context);
83+
} catch (Exception exception) {
84+
ModernFix.LOGGER.error("Failed to modify unbaked model before bake", exception);
85+
}
86+
}
87+
88+
return model;
89+
}, MODEL_MODIFIER_PHASES);
90+
private final Event<ModelModifier.AfterBake> afterBakeModifiers = EventFactory.createWithPhases(ModelModifier.AfterBake.class, modifiers -> (model, context) -> {
91+
for (ModelModifier.AfterBake modifier : modifiers) {
92+
try {
93+
model = modifier.modifyModelAfterBake(model, context);
94+
} catch (Exception exception) {
95+
ModernFix.LOGGER.error("Failed to modify baked model after bake", exception);
96+
}
97+
}
98+
99+
return model;
100+
}, MODEL_MODIFIER_PHASES);
101+
54102
public FabricDynamicModelHandler(DynamicModelProvider provider) {
55103
this.pluginList = ModelLoadingPlugin.getAll();
56104
var context = new PluginContext(provider);
@@ -80,6 +128,86 @@ public BlockState state() {
80128
});
81129
}
82130

131+
@Override
132+
public UnbakedModel modifyModelBeforeBake(UnbakedModel model, ResourceLocation id, ModelState state, ModelBaker baker) {
133+
return beforeBakeModifiers.invoker().modifyModelBeforeBake(model, new ModelModifier.BeforeBake.Context() {
134+
@Override
135+
public ResourceLocation id() {
136+
return id;
137+
}
138+
139+
@Override
140+
public ModelState settings() {
141+
return state;
142+
}
143+
144+
@Override
145+
public ModelBaker baker() {
146+
return baker;
147+
}
148+
});
149+
}
150+
151+
@Override
152+
public BakedModel modifyModelAfterBake(BakedModel bakedModel, UnbakedModel model, ResourceLocation id, ModelState state, ModelBaker baker) {
153+
return afterBakeModifiers.invoker().modifyModelAfterBake(bakedModel, new ModelModifier.AfterBake.Context() {
154+
@Override
155+
public ResourceLocation id() {
156+
return id;
157+
}
158+
159+
@Override
160+
public UnbakedModel sourceModel() {
161+
return model;
162+
}
163+
164+
@Override
165+
public ModelState settings() {
166+
return state;
167+
}
168+
169+
@Override
170+
public ModelBaker baker() {
171+
return baker;
172+
}
173+
});
174+
}
175+
176+
@Override
177+
public UnbakedBlockStateModel modifyBlockModelBeforeBake(UnbakedBlockStateModel model, ModelResourceLocation id, ModelBaker baker) {
178+
return beforeBakeBlockModifiers.invoker().modifyModelBeforeBake(model, new ModelModifier.BeforeBakeBlock.Context() {
179+
@Override
180+
public ModelResourceLocation id() {
181+
return id;
182+
}
183+
184+
@Override
185+
public ModelBaker baker() {
186+
return baker;
187+
}
188+
});
189+
}
190+
191+
@Override
192+
public BakedModel modifyBlockModelAfterBake(BakedModel bakedModel, UnbakedBlockStateModel model, ModelResourceLocation id, ModelBaker baker) {
193+
return afterBakeBlockModifiers.invoker().modifyModelAfterBake(bakedModel, new ModelModifier.AfterBakeBlock.Context() {
194+
@Override
195+
public ModelResourceLocation id() {
196+
return id;
197+
}
198+
199+
@Override
200+
public UnbakedBlockStateModel sourceModel() {
201+
return model;
202+
}
203+
204+
@Override
205+
public ModelBaker baker() {
206+
return baker;
207+
}
208+
});
209+
}
210+
83211
private class PluginContext implements ModelLoadingPlugin.Context {
84212
private final DynamicModelProvider provider;
85213
private final Map<Block, BlockStateResolver> resolvers = new HashMap<>();
@@ -128,5 +256,25 @@ public Event<ModelModifier.OnLoad> modifyModelOnLoad() {
128256
public Event<ModelModifier.OnLoadBlock> modifyBlockModelOnLoad() {
129257
return onLoadBlockModifiers;
130258
}
259+
260+
@Override
261+
public Event<ModelModifier.BeforeBake> modifyModelBeforeBake() {
262+
return beforeBakeModifiers;
263+
}
264+
265+
@Override
266+
public Event<ModelModifier.AfterBake> modifyModelAfterBake() {
267+
return afterBakeModifiers;
268+
}
269+
270+
@Override
271+
public Event<ModelModifier.BeforeBakeBlock> modifyBlockModelBeforeBake() {
272+
return beforeBakeBlockModifiers;
273+
}
274+
275+
@Override
276+
public Event<ModelModifier.AfterBakeBlock> modifyBlockModelAfterBake() {
277+
return afterBakeBlockModifiers;
278+
}
131279
}
132280
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ rhino_version=1902.2.2-build.268
1919
supported_minecraft_versions=1.21.4
2020

2121
fabric_loader_version=0.16.9
22-
fabric_api_version=0.111.0+1.21.4
22+
fabric_api_version=0.113.0+1.21.4
2323

2424
continuity_version=3.0.0-beta.4+1.20.2
2525

0 commit comments

Comments
 (0)