CuboidItemModelWrapper.java
net.minecraft.client.renderer.item.CuboidItemModelWrapper
信息
- 全限定名:net.minecraft.client.renderer.item.CuboidItemModelWrapper
- 类型:public class
- 包:net.minecraft.client.renderer.item
- 源码路径:src/main/java/net/minecraft/client/renderer/item/CuboidItemModelWrapper.java
- 起始行号:L38
- 实现:ItemModel
- 职责:
TODO
字段/常量
-
tints- 类型:
List<ItemTintSource> - 修饰符:
private final - 源码定位:
L39 - 说明:
TODO
- 类型:
-
quads- 类型:
QuadCollection - 修饰符:
private final - 源码定位:
L40 - 说明:
TODO
- 类型:
-
extents- 类型:
Supplier<Vector3fc[]> - 修饰符:
private final - 源码定位:
L41 - 说明:
TODO
- 类型:
-
properties- 类型:
ModelRenderProperties - 修饰符:
private final - 源码定位:
L42 - 说明:
TODO
- 类型:
-
transformation- 类型:
Matrix4fc - 修饰符:
private final - 源码定位:
L43 - 说明:
TODO
- 类型:
内部类/嵌套类型
net.minecraft.client.renderer.item.CuboidItemModelWrapper.Unbaked- 类型:
record - 修饰符:
public - 源码定位:
L129 - 说明:
TODO
- 类型:
构造器
private CuboidItemModelWrapper(List<ItemTintSource> tints, QuadCollection quads, ModelRenderProperties properties, Matrix4fc transformation) @ L45
- 构造器名:CuboidItemModelWrapper
- 源码定位:L45
- 修饰符:private
参数:
- tints: List
- quads: QuadCollection
- properties: ModelRenderProperties
- transformation: Matrix4fc
说明:
TODO
方法
下面的方法块按源码顺序生成。
public static Vector3fc[] computeExtents(List<BakedQuad> quads) @ L53
- 方法名:computeExtents
- 源码定位:L53
- 返回类型:Vector3fc[]
- 修饰符:public static
参数:
- quads: List
说明:
TODO
public void update(ItemStackRenderState output, ItemStack item, ItemModelResolver resolver, ItemDisplayContext displayContext, ClientLevel level, ItemOwner owner, int seed) @ L65
- 方法名:update
- 源码定位:L65
- 返回类型:void
- 修饰符:public
参数:
- output: ItemStackRenderState
- item: ItemStack
- resolver: ItemModelResolver
- displayContext: ItemDisplayContext
- level: ClientLevel
- owner: ItemOwner
- seed: int
说明:
TODO
private static void validateAtlasUsage(List<BakedQuad> quads) @ L105
- 方法名:validateAtlasUsage
- 源码定位:L105
- 返回类型:void
- 修饰符:private static
参数:
- quads: List
说明:
TODO
private static boolean hasSpecialAnimatedTexture(ItemStack itemStack) @ L124
- 方法名:hasSpecialAnimatedTexture
- 源码定位:L124
- 返回类型:boolean
- 修饰符:private static
参数:
- itemStack: ItemStack
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class CuboidItemModelWrapper implements ItemModel {
private final List<ItemTintSource> tints;
private final QuadCollection quads;
private final Supplier<Vector3fc[]> extents;
private final ModelRenderProperties properties;
private final Matrix4fc transformation;
private CuboidItemModelWrapper(List<ItemTintSource> tints, QuadCollection quads, ModelRenderProperties properties, Matrix4fc transformation) {
this.tints = tints;
this.quads = quads;
this.properties = properties;
this.transformation = transformation;
this.extents = Suppliers.memoize(() -> computeExtents(quads.getAll()));
}
public static Vector3fc[] computeExtents(List<BakedQuad> quads) {
Set<Vector3fc> result = new HashSet<>();
for (BakedQuad quad : quads) {
for (int vertex = 0; vertex < 4; vertex++) {
result.add(quad.position(vertex));
}
}
return result.toArray(Vector3fc[]::new);
}
@Override
public void update(
ItemStackRenderState output,
ItemStack item,
ItemModelResolver resolver,
ItemDisplayContext displayContext,
@Nullable ClientLevel level,
@Nullable ItemOwner owner,
int seed
) {
output.appendModelIdentityElement(this);
ItemStackRenderState.LayerRenderState layer = output.newLayer();
if (item.hasFoil()) {
ItemStackRenderState.FoilType foilType = hasSpecialAnimatedTexture(item)
? ItemStackRenderState.FoilType.SPECIAL
: ItemStackRenderState.FoilType.STANDARD;
layer.setFoilType(foilType);
output.setAnimated();
output.appendModelIdentityElement(foilType);
}
if (!this.tints.isEmpty()) {
IntList tintLayers = layer.tintLayers();
for (ItemTintSource tintSource : this.tints) {
int tint = tintSource.calculate(item, level, owner == null ? null : owner.asLivingEntity());
tintLayers.add(tint);
output.appendModelIdentityElement(tint);
}
}
layer.setExtents(this.extents);
layer.setLocalTransform(this.transformation);
this.properties.applyToLayer(layer, displayContext);
layer.prepareQuadList().addAll(this.quads.getAll());
if (this.quads.hasMaterialFlag(2)) {
output.setAnimated();
}
}
private static void validateAtlasUsage(List<BakedQuad> quads) {
Iterator<BakedQuad> quadIterator = quads.iterator();
if (quadIterator.hasNext()) {
Identifier expectedAtlas = quadIterator.next().materialInfo().sprite().atlasLocation();
while (quadIterator.hasNext()) {
BakedQuad quad = quadIterator.next();
Identifier quadAtlas = quad.materialInfo().sprite().atlasLocation();
if (!quadAtlas.equals(expectedAtlas)) {
throw new IllegalStateException("Multiple atlases used in model, expected " + expectedAtlas + ", but also got " + quadAtlas);
}
}
if (!expectedAtlas.equals(TextureAtlas.LOCATION_ITEMS) && !expectedAtlas.equals(TextureAtlas.LOCATION_BLOCKS)) {
throw new IllegalArgumentException("Atlas " + expectedAtlas + " can't be usef for item models");
}
}
}
private static boolean hasSpecialAnimatedTexture(ItemStack itemStack) {
return itemStack.is(ItemTags.COMPASSES) || itemStack.is(Items.CLOCK);
}
@OnlyIn(Dist.CLIENT)
public record Unbaked(Identifier model, Optional<Transformation> transformation, List<ItemTintSource> tints) implements ItemModel.Unbaked {
public static final MapCodec<CuboidItemModelWrapper.Unbaked> MAP_CODEC = RecordCodecBuilder.mapCodec(
i -> i.group(
Identifier.CODEC.fieldOf("model").forGetter(CuboidItemModelWrapper.Unbaked::model),
Transformation.EXTENDED_CODEC.optionalFieldOf("transformation").forGetter(CuboidItemModelWrapper.Unbaked::transformation),
ItemTintSources.CODEC.listOf().optionalFieldOf("tints", List.of()).forGetter(CuboidItemModelWrapper.Unbaked::tints)
)
.apply(i, CuboidItemModelWrapper.Unbaked::new)
);
@Override
public void resolveDependencies(ResolvableModel.Resolver resolver) {
resolver.markDependency(this.model);
}
@Override
public ItemModel bake(ItemModel.BakingContext context, Matrix4fc transformation) {
ModelBaker baker = context.blockModelBaker();
ResolvedModel resolvedModel = baker.getModel(this.model);
TextureSlots textureSlots = resolvedModel.getTopTextureSlots();
QuadCollection quads = resolvedModel.bakeTopGeometry(textureSlots, baker, BlockModelRotation.IDENTITY);
ModelRenderProperties properties = ModelRenderProperties.fromResolvedModel(baker, resolvedModel, textureSlots);
CuboidItemModelWrapper.validateAtlasUsage(quads.getAll());
Matrix4fc modelTransform = Transformation.compose(transformation, this.transformation);
return new CuboidItemModelWrapper(this.tints, quads, properties, modelTransform);
}
@Override
public MapCodec<CuboidItemModelWrapper.Unbaked> type() {
return MAP_CODEC;
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
Transformation.compose()
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
实现
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段/方法调用 - 关联成员:
ModelRenderProperties.fromResolvedModel()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: