SelectItemModel.java
net.minecraft.client.renderer.item.SelectItemModel
信息
- 全限定名:net.minecraft.client.renderer.item.SelectItemModel
- 类型:public class
- 包:net.minecraft.client.renderer.item
- 源码路径:src/main/java/net/minecraft/client/renderer/item/SelectItemModel.java
- 起始行号:L27
- 实现:ItemModel
- 职责:
TODO
字段/常量
-
property- 类型:
SelectItemModelProperty<T> - 修饰符:
private final - 源码定位:
L28 - 说明:
TODO
- 类型:
-
models- 类型:
SelectItemModel.ModelSelector<T> - 修饰符:
private final - 源码定位:
L29 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.client.renderer.item.SelectItemModel.ModelSelector- 类型:
interface - 修饰符:
public - 源码定位:
L53 - 说明:
TODO
- 类型:
-
net.minecraft.client.renderer.item.SelectItemModel.SwitchCase- 类型:
record - 修饰符:
public - 源码定位:
L58 - 说明:
TODO
- 类型:
-
net.minecraft.client.renderer.item.SelectItemModel.Unbaked- 类型:
record - 修饰符:
public - 源码定位:
L71 - 说明:
TODO
- 类型:
-
net.minecraft.client.renderer.item.SelectItemModel.UnbakedSwitch- 类型:
record - 修饰符:
public - 源码定位:
L104 - 说明:
TODO
- 类型:
构造器
public SelectItemModel(SelectItemModelProperty<T> property, SelectItemModel.ModelSelector<T> models) @ L31
- 构造器名:SelectItemModel
- 源码定位:L31
- 修饰符:public
参数:
- property: SelectItemModelProperty
- models: SelectItemModel.ModelSelector
说明:
TODO
方法
下面的方法块按源码顺序生成。
public void update(ItemStackRenderState output, ItemStack item, ItemModelResolver resolver, ItemDisplayContext displayContext, ClientLevel level, ItemOwner owner, int seed) @ L36
- 方法名:update
- 源码定位:L36
- 返回类型:void
- 修饰符:public
参数:
- output: ItemStackRenderState
- item: ItemStack
- resolver: ItemModelResolver
- displayContext: ItemDisplayContext
- level: ClientLevel
- owner: ItemOwner
- seed: int
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class SelectItemModel<T> implements ItemModel {
private final SelectItemModelProperty<T> property;
private final SelectItemModel.ModelSelector<T> models;
public SelectItemModel(SelectItemModelProperty<T> property, SelectItemModel.ModelSelector<T> models) {
this.property = property;
this.models = models;
}
@Override
public void update(
ItemStackRenderState output,
ItemStack item,
ItemModelResolver resolver,
ItemDisplayContext displayContext,
@Nullable ClientLevel level,
@Nullable ItemOwner owner,
int seed
) {
output.appendModelIdentityElement(this);
T value = this.property.get(item, level, owner == null ? null : owner.asLivingEntity(), seed, displayContext);
this.models.get(value, level).update(output, item, resolver, displayContext, level, owner, seed);
}
@FunctionalInterface
@OnlyIn(Dist.CLIENT)
public interface ModelSelector<T> {
ItemModel get(@Nullable T value, @Nullable ClientLevel context);
}
@OnlyIn(Dist.CLIENT)
public record SwitchCase<T>(List<T> values, ItemModel.Unbaked model) {
public static <T> Codec<SelectItemModel.SwitchCase<T>> codec(Codec<T> valueCodec) {
return RecordCodecBuilder.create(
i -> i.group(
ExtraCodecs.nonEmptyList(ExtraCodecs.compactListCodec(valueCodec)).fieldOf("when").forGetter(SelectItemModel.SwitchCase::values),
ItemModels.CODEC.fieldOf("model").forGetter(SelectItemModel.SwitchCase::model)
)
.apply(i, SelectItemModel.SwitchCase::new)
);
}
}
@OnlyIn(Dist.CLIENT)
public record Unbaked(Optional<Transformation> transformation, SelectItemModel.UnbakedSwitch<?, ?> unbakedSwitch, Optional<ItemModel.Unbaked> fallback)
implements ItemModel.Unbaked {
public static final MapCodec<SelectItemModel.Unbaked> MAP_CODEC = RecordCodecBuilder.mapCodec(
i -> i.group(
Transformation.EXTENDED_CODEC.optionalFieldOf("transformation").forGetter(SelectItemModel.Unbaked::transformation),
SelectItemModel.UnbakedSwitch.MAP_CODEC.forGetter(SelectItemModel.Unbaked::unbakedSwitch),
ItemModels.CODEC.optionalFieldOf("fallback").forGetter(SelectItemModel.Unbaked::fallback)
)
.apply(i, SelectItemModel.Unbaked::new)
);
@Override
public MapCodec<SelectItemModel.Unbaked> type() {
return MAP_CODEC;
}
@Override
public ItemModel bake(ItemModel.BakingContext context, Matrix4fc transformation) {
Matrix4fc childTransform = Transformation.compose(transformation, this.transformation);
ItemModel bakedFallback = this.fallback
.<ItemModel>map(m -> m.bake(context, childTransform))
.orElseGet(() -> context.missingItemModel(childTransform));
return this.unbakedSwitch.bake(context, childTransform, bakedFallback);
}
@Override
public void resolveDependencies(ResolvableModel.Resolver resolver) {
this.unbakedSwitch.resolveDependencies(resolver);
this.fallback.ifPresent(m -> m.resolveDependencies(resolver));
}
}
@OnlyIn(Dist.CLIENT)
public record UnbakedSwitch<P extends SelectItemModelProperty<T>, T>(P property, List<SelectItemModel.SwitchCase<T>> cases) {
public static final MapCodec<SelectItemModel.UnbakedSwitch<?, ?>> MAP_CODEC = SelectItemModelProperties.CODEC
.dispatchMap("property", unbaked -> unbaked.property().type(), SelectItemModelProperty.Type::switchCodec);
public ItemModel bake(ItemModel.BakingContext context, Matrix4fc transformation, ItemModel fallback) {
Object2ObjectMap<T, ItemModel> bakedModels = new Object2ObjectOpenHashMap<>();
for (SelectItemModel.SwitchCase<T> c : this.cases) {
ItemModel.Unbaked caseModel = c.model;
ItemModel bakedCaseModel = caseModel.bake(context, transformation);
for (T value : c.values) {
bakedModels.put(value, bakedCaseModel);
}
}
bakedModels.defaultReturnValue(fallback);
return new SelectItemModel<>(this.property, this.createModelGetter(bakedModels, context.contextSwapper()));
}
private SelectItemModel.ModelSelector<T> createModelGetter(
Object2ObjectMap<T, ItemModel> originalModels, @Nullable RegistryContextSwapper registrySwapper
) {
if (registrySwapper == null) {
return (value, var2) -> originalModels.get(value);
} else {
ItemModel defaultModel = originalModels.defaultReturnValue();
CacheSlot<ClientLevel, Object2ObjectMap<T, ItemModel>> remappedModelCache = new CacheSlot<>(
clientLevel -> {
Object2ObjectMap<T, ItemModel> remappedModels = new Object2ObjectOpenHashMap<>(originalModels.size());
remappedModels.defaultReturnValue(defaultModel);
originalModels.forEach(
(value, model) -> registrySwapper.swapTo(this.property.valueCodec(), (T)value, clientLevel.registryAccess())
.ifSuccess(remappedValue -> remappedModels.put((T)remappedValue, model))
);
return remappedModels;
}
);
return (value, context) -> {
if (context == null) {
return originalModels.get(value);
} else {
return value == null ? defaultModel : remappedModelCache.compute(context).get(value);
}
};
}
}
public void resolveDependencies(ResolvableModel.Resolver resolver) {
for (SelectItemModel.SwitchCase<?> c : this.cases) {
c.model.resolveDependencies(resolver);
}
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
Transformation.compose()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
实现
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ExtraCodecs.compactListCodec(), ExtraCodecs.nonEmptyList()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: