minecraft-src/net/minecraft/client/resources/model/UnbakedModel.java
2025-07-04 03:15:13 +03:00

142 lines
4.3 KiB
Java

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;
}
}
}