Parallel model loading
This commit is contained in:
parent
b5ebabd824
commit
185da209ce
1 changed files with 32 additions and 25 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue