package net.minecraft.client.resources.model; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.ItemTransform; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.block.model.TextureSlots; import net.minecraft.world.item.ItemDisplayContext; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public interface UnbakedModel extends ResolvableModel { boolean DEFAULT_AMBIENT_OCCLUSION = true; UnbakedModel.GuiLight DEFAULT_GUI_LIGHT = UnbakedModel.GuiLight.SIDE; BakedModel bake( TextureSlots textureSlots, ModelBaker baker, ModelState modelState, boolean hasAmbientOcclusion, boolean useBlockLight, ItemTransforms transforms ); @Nullable default Boolean getAmbientOcclusion() { return null; } @Nullable default UnbakedModel.GuiLight getGuiLight() { return null; } @Nullable default ItemTransforms getTransforms() { return null; } default TextureSlots.Data getTextureSlots() { return TextureSlots.Data.EMPTY; } @Nullable default UnbakedModel getParent() { return null; } static BakedModel bakeWithTopModelValues(UnbakedModel model, ModelBaker baker, ModelState modelState) { TextureSlots textureSlots = getTopTextureSlots(model, baker.rootName()); boolean bl = getTopAmbientOcclusion(model); boolean bl2 = getTopGuiLight(model).lightLikeBlock(); ItemTransforms itemTransforms = getTopTransforms(model); return model.bake(textureSlots, baker, modelState, bl, bl2, itemTransforms); } static TextureSlots getTopTextureSlots(UnbakedModel model, ModelDebugName name) { TextureSlots.Resolver resolver = new TextureSlots.Resolver(); while (model != null) { resolver.addLast(model.getTextureSlots()); model = model.getParent(); } return resolver.resolve(name); } static boolean getTopAmbientOcclusion(UnbakedModel model) { while (model != null) { Boolean boolean_ = model.getAmbientOcclusion(); if (boolean_ != null) { return boolean_; } model = model.getParent(); } return true; } static UnbakedModel.GuiLight getTopGuiLight(UnbakedModel model) { while (model != null) { UnbakedModel.GuiLight guiLight = model.getGuiLight(); if (guiLight != null) { return guiLight; } model = model.getParent(); } return DEFAULT_GUI_LIGHT; } static ItemTransform getTopTransform(UnbakedModel model, ItemDisplayContext displayContext) { while (model != null) { ItemTransforms itemTransforms = model.getTransforms(); if (itemTransforms != null) { ItemTransform itemTransform = itemTransforms.getTransform(displayContext); if (itemTransform != ItemTransform.NO_TRANSFORM) { return itemTransform; } } model = model.getParent(); } return ItemTransform.NO_TRANSFORM; } static ItemTransforms getTopTransforms(UnbakedModel unbakedModel) { ItemTransform itemTransform = getTopTransform(unbakedModel, ItemDisplayContext.THIRD_PERSON_LEFT_HAND); ItemTransform itemTransform2 = getTopTransform(unbakedModel, ItemDisplayContext.THIRD_PERSON_RIGHT_HAND); ItemTransform itemTransform3 = getTopTransform(unbakedModel, ItemDisplayContext.FIRST_PERSON_LEFT_HAND); ItemTransform itemTransform4 = getTopTransform(unbakedModel, ItemDisplayContext.FIRST_PERSON_RIGHT_HAND); ItemTransform itemTransform5 = getTopTransform(unbakedModel, ItemDisplayContext.HEAD); ItemTransform itemTransform6 = getTopTransform(unbakedModel, ItemDisplayContext.GUI); ItemTransform itemTransform7 = getTopTransform(unbakedModel, ItemDisplayContext.GROUND); ItemTransform itemTransform8 = getTopTransform(unbakedModel, ItemDisplayContext.FIXED); return new ItemTransforms(itemTransform, itemTransform2, itemTransform3, itemTransform4, itemTransform5, itemTransform6, itemTransform7, itemTransform8); } @Environment(EnvType.CLIENT) public static enum GuiLight { FRONT("front"), SIDE("side"); private final String name; private GuiLight(final String name) { this.name = name; } public static UnbakedModel.GuiLight getByName(String name) { for (UnbakedModel.GuiLight guiLight : values()) { if (guiLight.name.equals(name)) { return guiLight; } } throw new IllegalArgumentException("Invalid gui light: " + name); } public boolean lightLikeBlock() { return this == SIDE; } } }