BlockStateModel.java

net.minecraft.client.renderer.block.dispatch.BlockStateModel

信息

  • 全限定名:net.minecraft.client.renderer.block.dispatch.BlockStateModel
  • 类型:public interface
  • 包:net.minecraft.client.renderer.block.dispatch
  • 源码路径:src/main/java/net/minecraft/client/renderer/block/dispatch/BlockStateModel.java
  • 起始行号:L24
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.client.renderer.block.dispatch.BlockStateModel.SimpleCachedUnbakedRoot

    • 类型: class
    • 修饰符: public static
    • 源码定位: L37
    • 说明:

      TODO

  • net.minecraft.client.renderer.block.dispatch.BlockStateModel.Unbaked

    • 类型: interface
    • 修饰符: public
    • 源码定位: L70
    • 说明:

      TODO

  • net.minecraft.client.renderer.block.dispatch.BlockStateModel.UnbakedRoot

    • 类型: interface
    • 修饰符: public
    • 源码定位: L110
    • 说明:

      TODO

构造器

方法

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

void collectParts(RandomSource random, List<BlockStateModelPart> output) @ L25

  • 方法名:collectParts
  • 源码定位:L25
  • 返回类型:void
  • 修饰符:package-private

参数:

  • random: RandomSource
  • output: List

说明:

TODO

Material.Baked particleMaterial() @ L27

  • 方法名:particleMaterial
  • 源码定位:L27
  • 返回类型:Material.Baked
  • 修饰符:package-private

参数:

说明:

TODO

int materialFlags() @ L29

  • 方法名:materialFlags
  • 源码定位:L29
  • 返回类型:int
  • 修饰符:package-private

参数:

说明:

TODO

default boolean hasMaterialFlag(int flag) @ L32

  • 方法名:hasMaterialFlag
  • 源码定位:L32
  • 返回类型:boolean
  • 修饰符:default

参数:

  • flag: int

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public interface BlockStateModel {
    void collectParts(RandomSource random, List<BlockStateModelPart> output);
 
    Material.Baked particleMaterial();
 
    @BakedQuad.MaterialFlags
    int materialFlags();
 
    default boolean hasMaterialFlag(@BakedQuad.MaterialFlags int flag) {
        return (this.materialFlags() & flag) != 0;
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class SimpleCachedUnbakedRoot implements BlockStateModel.UnbakedRoot {
        private final BlockStateModel.Unbaked contents;
        private final ModelBaker.SharedOperationKey<BlockStateModel> bakingKey = new ModelBaker.SharedOperationKey<BlockStateModel>() {
            {
                Objects.requireNonNull(SimpleCachedUnbakedRoot.this);
            }
 
            public BlockStateModel compute(ModelBaker modelBakery) {
                return SimpleCachedUnbakedRoot.this.contents.bake(modelBakery);
            }
        };
 
        public SimpleCachedUnbakedRoot(BlockStateModel.Unbaked contents) {
            this.contents = contents;
        }
 
        @Override
        public void resolveDependencies(ResolvableModel.Resolver resolver) {
            this.contents.resolveDependencies(resolver);
        }
 
        @Override
        public BlockStateModel bake(BlockState blockState, ModelBaker modelBakery) {
            return modelBakery.compute(this.bakingKey);
        }
 
        @Override
        public Object visualEqualityGroup(BlockState blockState) {
            return this;
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public interface Unbaked extends ResolvableModel {
        Codec<Weighted<Variant>> ELEMENT_CODEC = RecordCodecBuilder.create(
            i -> i.group(Variant.MAP_CODEC.forGetter(Weighted::value), ExtraCodecs.POSITIVE_INT.optionalFieldOf("weight", 1).forGetter(Weighted::weight))
                .apply(i, Weighted::new)
        );
        Codec<WeightedVariants.Unbaked> HARDCODED_WEIGHTED_CODEC = ExtraCodecs.nonEmptyList(ELEMENT_CODEC.listOf())
            .flatComapMap(
                w -> new WeightedVariants.Unbaked(WeightedList.of(Lists.transform((List<Weighted<Variant>>)w, e -> e.map(SingleVariant.Unbaked::new)))),
                unbaked -> {
                    List<Weighted<BlockStateModel.Unbaked>> entries = unbaked.entries().unwrap();
                    List<Weighted<Variant>> result = new ArrayList<>(entries.size());
 
                    for (Weighted<BlockStateModel.Unbaked> entry : entries) {
                        if (!(entry.value() instanceof SingleVariant.Unbaked singleVariant)) {
                            return DataResult.error(() -> "Only single variants are supported");
                        }
 
                        result.add(new Weighted<>(singleVariant.variant(), entry.weight()));
                    }
 
                    return DataResult.success(result);
                }
            );
        Codec<BlockStateModel.Unbaked> CODEC = Codec.either(HARDCODED_WEIGHTED_CODEC, SingleVariant.Unbaked.CODEC)
            .flatComapMap(v -> v.map(l -> l, r -> r), o -> {
                return switch (o) {
                    case SingleVariant.Unbaked single -> DataResult.success(Either.right(single));
                    case WeightedVariants.Unbaked multiple -> DataResult.success(Either.left(multiple));
                    default -> DataResult.error(() -> "Only a single variant or a list of variants are supported");
                };
            });
 
        BlockStateModel bake(ModelBaker modelBakery);
 
        default BlockStateModel.UnbakedRoot asRoot() {
            return new BlockStateModel.SimpleCachedUnbakedRoot(this);
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public interface UnbakedRoot extends ResolvableModel {
        BlockStateModel bake(BlockState blockState, ModelBaker modelBakery);
 
        Object visualEqualityGroup(BlockState blockState);
    }
}

引用的其他类