ModelGroupCollector.java

net.minecraft.client.resources.model.ModelGroupCollector

信息

  • 全限定名:net.minecraft.client.resources.model.ModelGroupCollector
  • 类型:public class
  • 包:net.minecraft.client.resources.model
  • 源码路径:src/main/java/net/minecraft/client/resources/model/ModelGroupCollector.java
  • 起始行号:L21
  • 职责:

    TODO

字段/常量

  • SINGLETON_MODEL_GROUP

    • 类型: int
    • 修饰符: static final
    • 源码定位: L22
    • 说明:

      TODO

  • INVISIBLE_MODEL_GROUP

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L23
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.resources.model.ModelGroupCollector.GroupKey
    • 类型: record
    • 修饰符: private
    • 源码定位: L63
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public static Object2IntMap<BlockState> build(BlockColors blockColors, BlockStateModelLoader.LoadedModels input) @ L25

  • 方法名:build
  • 源码定位:L25
  • 返回类型:Object2IntMap
  • 修饰符:public static

参数:

  • blockColors: BlockColors
  • input: BlockStateModelLoader.LoadedModels

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ModelGroupCollector {
    static final int SINGLETON_MODEL_GROUP = -1;
    private static final int INVISIBLE_MODEL_GROUP = 0;
 
    public static Object2IntMap<BlockState> build(BlockColors blockColors, BlockStateModelLoader.LoadedModels input) {
        Map<Block, List<Property<?>>> coloringPropertiesCache = new HashMap<>();
        Map<ModelGroupCollector.GroupKey, Set<BlockState>> modelGroups = new HashMap<>();
        input.models()
            .forEach(
                (state, loadedModel) -> {
                    List<Property<?>> coloringProperties = coloringPropertiesCache.computeIfAbsent(
                        state.getBlock(), block -> List.copyOf(blockColors.getColoringProperties(block))
                    );
                    ModelGroupCollector.GroupKey key = ModelGroupCollector.GroupKey.create(state, loadedModel, coloringProperties);
                    modelGroups.computeIfAbsent(key, k -> Sets.newIdentityHashSet()).add(state);
                }
            );
        int nextModelGroup = 1;
        Object2IntMap<BlockState> result = new Object2IntOpenHashMap<>();
        result.defaultReturnValue(-1);
 
        for (Set<BlockState> states : modelGroups.values()) {
            Iterator<BlockState> it = states.iterator();
 
            while (it.hasNext()) {
                BlockState state = it.next();
                if (state.getRenderShape() != RenderShape.MODEL) {
                    it.remove();
                    result.put(state, 0);
                }
            }
 
            if (states.size() > 1) {
                int modelGroup = nextModelGroup++;
                states.forEach(blockState -> result.put(blockState, modelGroup));
            }
        }
 
        return result;
    }
 
    @OnlyIn(Dist.CLIENT)
    private record GroupKey(Object equalityGroup, List<Object> coloringValues) {
        public static ModelGroupCollector.GroupKey create(BlockState state, BlockStateModel.UnbakedRoot model, List<Property<?>> coloringProperties) {
            List<Object> coloringValues = getColoringValues(state, coloringProperties);
            Object equalityGroup = model.visualEqualityGroup(state);
            return new ModelGroupCollector.GroupKey(equalityGroup, coloringValues);
        }
 
        private static List<Object> getColoringValues(BlockState state, List<Property<?>> coloringProperties) {
            Object[] coloringValues = new Object[coloringProperties.size()];
 
            for (int i = 0; i < coloringProperties.size(); i++) {
                coloringValues[i] = state.getValue(coloringProperties.get(i));
            }
 
            return List.of(coloringValues);
        }
    }
}

引用的其他类