Parallel model loading

This commit is contained in:
paulevsGitch 2021-07-30 21:11:55 +03:00
parent b5ebabd824
commit 185da209ce

View file

@ -1,5 +1,6 @@
package ru.bclib.mixin.client; package ru.bclib.mixin.client;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.block.BlockColors;
import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.renderer.block.BlockModelShaper;
@ -47,38 +48,44 @@ public abstract class ModelBakeryMixin {
) )
) )
private void bclib_initCustomModels(ResourceManager resourceManager, BlockColors blockColors, ProfilerFiller profiler, int mipmap, CallbackInfo info) { private void bclib_initCustomModels(ResourceManager resourceManager, BlockColors blockColors, ProfilerFiller profiler, int mipmap, CallbackInfo info) {
Map<ResourceLocation, UnbakedModel> cache = Maps.newHashMap(); Map<ResourceLocation, UnbakedModel> cache = Maps.newConcurrentMap();
Map<ResourceLocation, UnbakedModel> topLevel = Maps.newHashMap(); Map<ResourceLocation, UnbakedModel> topLevel = Maps.newConcurrentMap();
Registry.BLOCK.forEach(block -> { Registry.BLOCK.stream().filter(block -> block instanceof BlockModelProvider).parallel().forEach(block -> {
if (block instanceof BlockModelProvider) { ResourceLocation blockID = Registry.BLOCK.getKey(block);
ResourceLocation blockID = Registry.BLOCK.getKey(block); ResourceLocation storageID = new ResourceLocation(blockID.getNamespace(), "blockstates/" + blockID.getPath() + ".json");
ResourceLocation storageID = new ResourceLocation(blockID.getNamespace(), "blockstates/" + blockID.getPath() + ".json"); BlockModelProvider provider = (BlockModelProvider) block;
BlockModelProvider provider = (BlockModelProvider) block;
if (!resourceManager.hasResource(storageID)) {
BlockState defaultState = block.defaultBlockState();
ResourceLocation defaultStateID = BlockModelShaper.stateToModelLocation(blockID, defaultState);
if (!resourceManager.hasResource(storageID)) { UnbakedModel defaultModel = provider.getModelVariant(defaultStateID, defaultState, cache);
BlockState defaultState = block.defaultBlockState(); cache.put(blockID, defaultModel);
ResourceLocation defaultStateID = BlockModelShaper.stateToModelLocation(blockID, defaultState); topLevel.put(blockID, defaultModel);
UnbakedModel defaultModel = provider.getModelVariant(defaultStateID, defaultState, cache); ImmutableList<BlockState> states = block.getStateDefinition().getPossibleStates();
cache.put(blockID, defaultModel); if (states.size() == 1) {
topLevel.put(blockID, defaultModel); ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, block.defaultBlockState());
cache.put(stateID, defaultModel);
block.getStateDefinition().getPossibleStates().forEach(blockState -> { topLevel.put(stateID, defaultModel);
}
else {
states.forEach(blockState -> {
ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, blockState); ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, blockState);
BlockModel model = provider.getBlockModel(stateID, blockState); BlockModel model = provider.getBlockModel(stateID, blockState);
cache.put(stateID, model != null ? model : defaultModel); cache.put(stateID, model != null ? model : defaultModel);
}); });
} }
}
if (Registry.ITEM.get(blockID) != Items.AIR) {
storageID = new ResourceLocation(blockID.getNamespace(), "models/item/" + blockID.getPath() + ".json"); if (Registry.ITEM.get(blockID) != Items.AIR) {
if (!resourceManager.hasResource(storageID)) { storageID = new ResourceLocation(blockID.getNamespace(), "models/item/" + blockID.getPath() + ".json");
ResourceLocation itemID = new ModelResourceLocation(blockID.getNamespace(), blockID.getPath(), "inventory"); if (!resourceManager.hasResource(storageID)) {
BlockModel model = provider.getItemModel(itemID); ResourceLocation itemID = new ModelResourceLocation(blockID.getNamespace(), blockID.getPath(), "inventory");
cache.put(itemID, model); BlockModel model = provider.getItemModel(itemID);
topLevel.put(itemID, model); cache.put(itemID, model);
} topLevel.put(itemID, model);
} }
} }
}); });