minecraft-src/net/minecraft/client/renderer/block/model/MultiVariant.java
2025-07-04 01:41:11 +03:00

101 lines
3.2 KiB
Java

package net.minecraft.client.renderer.block.model;
import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.Material;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.client.resources.model.WeightedBakedModel;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class MultiVariant implements UnbakedModel {
private final List<Variant> variants;
public MultiVariant(List<Variant> variants) {
this.variants = variants;
}
public List<Variant> getVariants() {
return this.variants;
}
public boolean equals(Object object) {
if (this == object) {
return true;
} else {
return object instanceof MultiVariant multiVariant ? this.variants.equals(multiVariant.variants) : false;
}
}
public int hashCode() {
return this.variants.hashCode();
}
@Override
public Collection<ResourceLocation> getDependencies() {
return (Collection<ResourceLocation>)this.getVariants().stream().map(Variant::getModelLocation).collect(Collectors.toSet());
}
@Override
public void resolveParents(Function<ResourceLocation, UnbakedModel> resolver) {
this.getVariants()
.stream()
.map(Variant::getModelLocation)
.distinct()
.forEach(resourceLocation -> ((UnbakedModel)resolver.apply(resourceLocation)).resolveParents(resolver));
}
@Nullable
@Override
public BakedModel bake(ModelBaker baker, Function<Material, TextureAtlasSprite> spriteGetter, ModelState state) {
if (this.getVariants().isEmpty()) {
return null;
} else {
WeightedBakedModel.Builder builder = new WeightedBakedModel.Builder();
for (Variant variant : this.getVariants()) {
BakedModel bakedModel = baker.bake(variant.getModelLocation(), variant);
builder.add(bakedModel, variant.getWeight());
}
return builder.build();
}
}
@Environment(EnvType.CLIENT)
public static class Deserializer implements JsonDeserializer<MultiVariant> {
public MultiVariant deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
List<Variant> list = Lists.<Variant>newArrayList();
if (json.isJsonArray()) {
JsonArray jsonArray = json.getAsJsonArray();
if (jsonArray.size() == 0) {
throw new JsonParseException("Empty variant array");
}
for (JsonElement jsonElement : jsonArray) {
list.add((Variant)context.deserialize(jsonElement, Variant.class));
}
} else {
list.add((Variant)context.deserialize(json, Variant.class));
}
return new MultiVariant(list);
}
}
}