142 lines
4.3 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|