Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1.21.4] Add model loading plugins to replace ModelEvent.ModifyBakingResult #1884

Draft
wants to merge 4 commits into
base: 1.21.x
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
--- a/net/minecraft/client/resources/model/ModelBakery.java
+++ b/net/minecraft/client/resources/model/ModelBakery.java
@@ -46,19 +_,36 @@
@@ -46,19 +_,40 @@
private final Map<ResourceLocation, ClientItem> clientInfos;
final Map<ResourceLocation, UnbakedModel> unbakedPlainModels;
final UnbakedModel missingModel;
+ private final Map<ResourceLocation, UnbakedModel> standaloneModels;
+ @org.jetbrains.annotations.Nullable
+ private final net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager pluginManager;
+
+ /**
+ * @deprecated Neo: use {@link #ModelBakery(EntityModelSet, Map, Map, Map, UnbakedModel, Map)} ModelBakery instead}
+ * @deprecated Neo: use {@link #ModelBakery(EntityModelSet, Map, Map, Map, UnbakedModel, Map, net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager)} ModelBakery instead}
+ */
+ @Deprecated
+ public ModelBakery(
Expand All @@ -17,7 +19,7 @@
+ Map<ResourceLocation, UnbakedModel> p_388404_,
+ UnbakedModel p_360944_
+ ) {
+ this(p_388903_, p_251087_, p_250416_, p_388404_, p_360944_, Map.of());
+ this(p_388903_, p_251087_, p_250416_, p_388404_, p_360944_, Map.of(), null);
+ }

public ModelBakery(
Expand All @@ -27,17 +29,35 @@
Map<ResourceLocation, UnbakedModel> p_388404_,
- UnbakedModel p_360944_
+ UnbakedModel p_360944_,
+ Map<ResourceLocation, UnbakedModel> standaloneModels
+ Map<ResourceLocation, UnbakedModel> standaloneModels,
+ @org.jetbrains.annotations.Nullable net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager pluginManager
) {
this.entityModelSet = p_388903_;
this.unbakedBlockStateModels = p_251087_;
this.clientInfos = p_250416_;
this.unbakedPlainModels = p_388404_;
this.missingModel = p_360944_;
+ this.standaloneModels = standaloneModels;
+ this.pluginManager = pluginManager;
}

public ModelBakery.BakingResult bakeModels(ModelBakery.TextureGetter p_352431_) {
@@ -68,7 +_,14 @@
Map<ModelResourceLocation, BakedModel> map = new HashMap<>(this.unbakedBlockStateModels.size());
this.unbakedBlockStateModels.forEach((p_386257_, p_386258_) -> {
try {
- BakedModel bakedmodel1 = p_386258_.bake(new ModelBakery.ModelBakerImpl(p_352431_, p_386257_::toString));
+ ModelBakerImpl baker = new ModelBakerImpl(p_352431_, p_386257_::toString);
+ if (this.pluginManager != null) {
+ p_386258_ = this.pluginManager.modifyBlockModelBeforeBake(p_386257_, p_386258_, baker);
+ }
+ BakedModel bakedmodel1 = p_386258_.bake(baker);
+ if (this.pluginManager != null) {
+ bakedmodel1 = this.pluginManager.modifyBlockModelAfterBake(p_386257_, bakedmodel1, p_386258_, baker);
+ }
map.put(p_386257_, bakedmodel1);
} catch (Exception exception) {
LOGGER.warn("Unable to bake model: '{}': {}", p_386257_, exception);
@@ -92,7 +_,18 @@
LOGGER.warn("Unable to bake item model: '{}'", p_390101_, exception);
}
Expand Down Expand Up @@ -82,3 +102,17 @@
}

@OnlyIn(Dist.CLIENT)
@@ -142,7 +_,13 @@
return bakedmodel;
} else {
UnbakedModel unbakedmodel = this.getModel(p_252176_);
+ if (ModelBakery.this.pluginManager != null) {
+ unbakedmodel = ModelBakery.this.pluginManager.modifyModelBeforeBake(p_252176_, unbakedmodel, p_249765_, this);
+ }
BakedModel bakedmodel1 = UnbakedModel.bakeWithTopModelValues(unbakedmodel, this, p_249765_);
+ if (ModelBakery.this.pluginManager != null) {
+ bakedmodel1 = ModelBakery.this.pluginManager.modifyModelAfterBake(p_252176_, bakedmodel1, unbakedmodel, p_249765_, this);
+ }
ModelBakery.this.bakedCache.put(modelbakery$bakedcachekey, bakedmodel1);
return bakedmodel1;
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
--- a/net/minecraft/client/resources/model/ModelDiscovery.java
+++ b/net/minecraft/client/resources/model/ModelDiscovery.java
@@ -22,6 +_,7 @@
@@ -22,15 +_,33 @@
final UnbakedModel missingModel;
private final List<ResolvableModel> topModels = new ArrayList<>();
private final Map<ResourceLocation, UnbakedModel> referencedModels = new HashMap<>();
+ final Map<ResourceLocation, UnbakedModel> standaloneModels = new HashMap<>();
+ @org.jetbrains.annotations.Nullable
+ private final net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager pluginManager;

+ /**
+ * @deprecated Use {@link ModelDiscovery(Map, UnbakedModel, net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager) instead}
+ */
+ @Deprecated
public ModelDiscovery(Map<ResourceLocation, UnbakedModel> p_360750_, UnbakedModel p_365355_) {
+ this(p_360750_, p_365355_, null);
+ }
+
+ public ModelDiscovery(Map<ResourceLocation, UnbakedModel> p_360750_, UnbakedModel p_365355_, @org.jetbrains.annotations.Nullable net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager pluginManager) {
this.inputModels = p_360750_;
@@ -31,6 +_,12 @@
this.missingModel = p_365355_;
this.referencedModels.put(MissingBlockModel.LOCATION, p_365355_);
+ this.pluginManager = pluginManager;
}

public void registerSpecialModels() {
this.referencedModels.put(ItemModelGenerator.GENERATED_ITEM_MODEL_ID, new ItemModelGenerator());
Expand All @@ -21,3 +34,13 @@
}

public void addRoot(ResolvableModel p_388596_) {
@@ -55,6 +_,9 @@

private UnbakedModel loadBlockModel(ResourceLocation p_361274_) {
UnbakedModel unbakedmodel = this.inputModels.get(p_361274_);
+ if (this.pluginManager != null) {
+ unbakedmodel = this.pluginManager.modifyModelOnLoad(p_361274_, unbakedmodel);
+ }
if (unbakedmodel == null) {
LOGGER.warn("Missing block model: '{}'", p_361274_);
return this.missingModel;
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
--- a/net/minecraft/client/resources/model/ModelManager.java
+++ b/net/minecraft/client/resources/model/ModelManager.java
@@ -83,11 +_,15 @@
@@ -83,11 +_,16 @@
private BakedModel missingModel;
private ItemModel missingItemModel;
private Object2IntMap<BlockState> modelGroups = Object2IntMaps.emptyMap();
+ private final java.util.concurrent.atomic.AtomicReference<ModelBakery> modelBakery = new java.util.concurrent.atomic.AtomicReference<>(null);
+ private Map<ResourceLocation, BakedModel> bakedStandaloneModels = Map.of();
+ private Set<ResourceLocation> reportedMissingItemModels = new java.util.HashSet<>();
+ private volatile CompletableFuture<net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager> pluginFuture = CompletableFuture.completedFuture(null);

public ModelManager(TextureManager p_119406_, BlockColors p_119407_, int p_119408_) {
this.blockColors = p_119407_;
Expand All @@ -32,26 +33,49 @@
}

public ClientItem.Properties getItemProperties(ResourceLocation p_390438_) {
@@ -115,6 +_,7 @@
@@ -115,15 +_,18 @@
public final CompletableFuture<Void> reload(
PreparableReloadListener.PreparationBarrier p_249079_, ResourceManager p_251134_, Executor p_250550_, Executor p_249221_
) {
+ net.neoforged.neoforge.client.model.UnbakedModelParser.init();
UnbakedModel unbakedmodel = MissingBlockModel.missingModel();
CompletableFuture<EntityModelSet> completablefuture = CompletableFuture.supplyAsync(EntityModelSet::vanilla, p_250550_);
CompletableFuture<SpecialBlockModelRenderer> completablefuture1 = completablefuture.thenApplyAsync(SpecialBlockModelRenderer::vanilla, p_250550_);
@@ -154,8 +_,10 @@
CompletableFuture<Map<ResourceLocation, UnbakedModel>> completablefuture2 = loadBlockModels(p_251134_, p_250550_);
- CompletableFuture<BlockStateModelLoader.LoadedModels> completablefuture3 = BlockStateModelLoader.loadBlockStates(unbakedmodel, p_251134_, p_250550_);
+ this.pluginFuture = net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager.prepare(p_251134_, p_250550_);
+ CompletableFuture<BlockStateModelLoader.LoadedModels> completablefuture3 = BlockStateModelLoader.loadBlockStates(unbakedmodel, p_251134_, p_250550_)
+ .thenCombine(this.pluginFuture, (models, pluginManager) -> pluginManager.modifyBlockModelsOnLoad(models));
CompletableFuture<ClientItemInfoLoader.LoadedClientInfos> completablefuture4 = ClientItemInfoLoader.scheduleLoad(p_251134_, p_250550_);
CompletableFuture<ModelDiscovery> completablefuture5 = CompletableFuture.allOf(completablefuture2, completablefuture3, completablefuture4)
.thenApplyAsync(
- p_390107_ -> discoverModelDependencies(unbakedmodel, completablefuture2.join(), completablefuture3.join(), completablefuture4.join()),
+ p_390107_ -> discoverModelDependencies(unbakedmodel, completablefuture2.join(), completablefuture3.join(), completablefuture4.join(), this.pluginFuture.join()),
p_250550_
);
CompletableFuture<Object2IntMap<BlockState>> completablefuture6 = completablefuture3.thenApplyAsync(
@@ -154,13 +_,20 @@
completablefuture3.join().plainModels(),
completablefuture4.join().contents(),
modeldiscovery.getReferencedModels(),
- unbakedmodel
+ unbakedmodel,
+ modeldiscovery.standaloneModels
+ modeldiscovery.standaloneModels,
+ this.pluginFuture.join()
);
+ this.modelBakery.set(modelbakery);
return loadModels(Profiler.get(), map1, modelbakery, object2intmap, completablefuture.join(), completablefuture1.join());
},
p_250550_
)
.thenCompose(p_252255_ -> p_252255_.readyForUpload.thenApply(p_251581_ -> (ModelManager.ReloadState)p_252255_))
+ .thenApplyAsync(state -> {
+ this.pluginFuture = CompletableFuture.completedFuture(null);
+ return state;
+ })
.thenCompose(p_249079_::wait)
.thenAcceptAsync(p_372566_ -> this.apply(p_372566_, Profiler.get()), p_249221_);
}
@@ -169,7 +_,7 @@
return CompletableFuture.<Map<ResourceLocation, Resource>>supplyAsync(() -> MODEL_LISTER.listMatchingResources(p_251361_), p_252189_)
.thenCompose(
Expand All @@ -70,6 +94,35 @@
}

return pair;
@@ -197,13 +_,27 @@
);
}

+ /**
+ * @deprecated Use {@link #discoverModelDependencies(UnbakedModel, Map, BlockStateModelLoader.LoadedModels, ClientItemInfoLoader.LoadedClientInfos, net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager)} instead
+ */
+ @Deprecated
private static ModelDiscovery discoverModelDependencies(
UnbakedModel p_360651_,
Map<ResourceLocation, UnbakedModel> p_363228_,
BlockStateModelLoader.LoadedModels p_361624_,
ClientItemInfoLoader.LoadedClientInfos p_390496_
) {
- ModelDiscovery modeldiscovery = new ModelDiscovery(p_363228_, p_360651_);
+ return discoverModelDependencies(p_360651_, p_363228_, p_361624_, p_390496_, null);
+ }
+
+ private static ModelDiscovery discoverModelDependencies(
+ UnbakedModel p_360651_,
+ Map<ResourceLocation, UnbakedModel> p_363228_,
+ BlockStateModelLoader.LoadedModels p_361624_,
+ ClientItemInfoLoader.LoadedClientInfos p_390496_,
+ @org.jetbrains.annotations.Nullable net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager pluginManager
+ ) {
+ ModelDiscovery modeldiscovery = new ModelDiscovery(p_363228_, p_360651_, pluginManager);
p_361624_.forResolving().forEach(modeldiscovery::addRoot);
p_390496_.contents().values().forEach(p_390109_ -> modeldiscovery.addRoot(p_390109_.model()));
modeldiscovery.registerSpecialModels();
@@ -261,6 +_,8 @@
p_386267_.stream().sorted().map(p_386265_ -> " " + p_386265_).collect(Collectors.joining("\n"))
)
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/net/neoforged/neoforge/client/ClientHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@
import net.neoforged.neoforge.client.gui.GuiLayerManager;
import net.neoforged.neoforge.client.gui.map.MapDecorationRendererManager;
import net.neoforged.neoforge.client.model.data.ModelData;
import net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPluginManager;
import net.neoforged.neoforge.client.renderstate.RegisterRenderStateModifiersEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.common.NeoForgeConfig;
Expand Down Expand Up @@ -998,6 +999,7 @@ public static void initClientHooks(Minecraft mc, ReloadableResourceManager resou
DimensionTransitionScreenManager.init();
AnimationTypeManager.init();
CoreShaderManager.init();
ModelLoadingPluginManager.init();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
import net.neoforged.fml.LogicalSide;
import net.neoforged.fml.event.IModBusEvent;
import net.neoforged.neoforge.client.model.UnbakedModelLoader;
import net.neoforged.neoforge.client.model.loadingplugin.BlockStateResolver;
import net.neoforged.neoforge.client.model.loadingplugin.ModelLoadingPlugin;
import net.neoforged.neoforge.client.model.loadingplugin.ModelModifier;
import net.neoforged.neoforge.client.model.loadingplugin.PreparableModelLoadingPlugin;
import org.jetbrains.annotations.ApiStatus;

/**
Expand All @@ -43,7 +47,10 @@ protected ModelEvent() {}
* <p>This event is not {@linkplain ICancellableEvent cancellable}.</p>
*
* <p>This event is fired on the mod-specific event bus, only on the {@linkplain LogicalSide#CLIENT logical client}.</p>
*
* @deprecated Use {@link BlockStateResolver}s or {@link ModelModifier}s instead
*/
@Deprecated(forRemoval = true, since = "1.21.4")
public static class ModifyBakingResult extends ModelEvent implements IModBusEvent {
private final ModelBakery.BakingResult bakingResult;
private final Function<Material, TextureAtlasSprite> textureGetter;
Expand Down Expand Up @@ -86,7 +93,7 @@ public ModelBakery getModelBakery() {
* Fired when the {@link ModelManager} is notified of the resource manager reloading.
* Called after the model registry is set up and cached in the {@link net.minecraft.client.renderer.block.BlockModelShaper}.<br>
* The model registry given by this event is unmodifiable. To modify the model registry, use
* {@link ModelEvent.ModifyBakingResult} instead.
* {@link BlockStateResolver}s or {@link ModelModifier}s instead.
*
* <p>This event is not {@linkplain ICancellableEvent cancellable}.</p>
*
Expand Down Expand Up @@ -182,4 +189,27 @@ public void register(ResourceLocation key, UnbakedModelLoader<?> loader) {
loaders.put(key, loader);
}
}

public static class RegisterLoadingPlugins extends ModelEvent implements IModBusEvent {
private final Map<ResourceLocation, ModelLoadingPlugin> plugins;
private final Map<ResourceLocation, PreparableModelLoadingPlugin<?>> preparablePlugins;

@ApiStatus.Internal
embeddedt marked this conversation as resolved.
Show resolved Hide resolved
public RegisterLoadingPlugins(Map<ResourceLocation, ModelLoadingPlugin> plugins, Map<ResourceLocation, PreparableModelLoadingPlugin<?>> preparablePlugins) {
this.plugins = plugins;
this.preparablePlugins = preparablePlugins;
}

public void registerPlugin(ResourceLocation id, ModelLoadingPlugin plugin) {
if (plugins.putIfAbsent(id, plugin) != null) {
throw new IllegalStateException("Duplicate ModelLoadingPlugin registration with ID " + id);
}
}

public void registerPlugin(ResourceLocation id, PreparableModelLoadingPlugin<?> plugin) {
if (preparablePlugins.putIfAbsent(id, plugin) != null) {
throw new IllegalStateException("Duplicate PreparableModelLoadingPlugin registration with ID " + id);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright (c) NeoForged and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/

package net.neoforged.neoforge.client.model.loadingplugin;

import net.minecraft.client.renderer.block.model.UnbakedBlockStateModel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;

public interface BlockStateResolver {
void resolveBlockStates(Context context);

interface Context {
Block getBlock();

@Nullable
UnbakedBlockStateModel getModel(BlockState state);

void setModel(BlockState state, UnbakedBlockStateModel model);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright (c) NeoForged and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/

package net.neoforged.neoforge.client.model.loadingplugin;

import net.minecraft.world.level.block.Block;

public interface ModelLoadingPlugin {
void initialize(Context context);

interface Context {
void registerResolver(Block block, BlockStateResolver resolver);

default void registerModifier(ModelModifier modifier) {
registerModifier(ModelModifier.Phase.DEFAULT, modifier);
}

void registerModifier(ModelModifier.Phase phase, ModelModifier modifier);
}
}
Loading