package net.minecraft.client.resources.model; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.List; import java.util.Map; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public class SimpleBakedModel implements BakedModel { protected final List unculledFaces; protected final Map> culledFaces; protected final boolean hasAmbientOcclusion; protected final boolean isGui3d; protected final boolean usesBlockLight; protected final TextureAtlasSprite particleIcon; protected final ItemTransforms transforms; protected final ItemOverrides overrides; public SimpleBakedModel( List unculledFaces, Map> culledFaces, boolean hasAmbientOcclusion, boolean usesBlockLight, boolean isGui3d, TextureAtlasSprite particleIcon, ItemTransforms transforms, ItemOverrides overrides ) { this.unculledFaces = unculledFaces; this.culledFaces = culledFaces; this.hasAmbientOcclusion = hasAmbientOcclusion; this.isGui3d = isGui3d; this.usesBlockLight = usesBlockLight; this.particleIcon = particleIcon; this.transforms = transforms; this.overrides = overrides; } @Override public List getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) { return direction == null ? this.unculledFaces : (List)this.culledFaces.get(direction); } @Override public boolean useAmbientOcclusion() { return this.hasAmbientOcclusion; } @Override public boolean isGui3d() { return this.isGui3d; } @Override public boolean usesBlockLight() { return this.usesBlockLight; } @Override public boolean isCustomRenderer() { return false; } @Override public TextureAtlasSprite getParticleIcon() { return this.particleIcon; } @Override public ItemTransforms getTransforms() { return this.transforms; } @Override public ItemOverrides getOverrides() { return this.overrides; } @Environment(EnvType.CLIENT) public static class Builder { private final List unculledFaces = Lists.newArrayList(); private final Map> culledFaces = Maps.newEnumMap(Direction.class); private final ItemOverrides overrides; private final boolean hasAmbientOcclusion; private TextureAtlasSprite particleIcon; private final boolean usesBlockLight; private final boolean isGui3d; private final ItemTransforms transforms; public Builder(BlockModel blockModel, ItemOverrides overrides, boolean isGui3d) { this(blockModel.hasAmbientOcclusion(), blockModel.getGuiLight().lightLikeBlock(), isGui3d, blockModel.getTransforms(), overrides); } private Builder(boolean hasAmbientOcclusion, boolean usesBlockLight, boolean isGui3d, ItemTransforms transforms, ItemOverrides overrides) { for (Direction direction : Direction.values()) { this.culledFaces.put(direction, Lists.newArrayList()); } this.overrides = overrides; this.hasAmbientOcclusion = hasAmbientOcclusion; this.usesBlockLight = usesBlockLight; this.isGui3d = isGui3d; this.transforms = transforms; } public SimpleBakedModel.Builder addCulledFace(Direction facing, BakedQuad quad) { ((List)this.culledFaces.get(facing)).add(quad); return this; } public SimpleBakedModel.Builder addUnculledFace(BakedQuad quad) { this.unculledFaces.add(quad); return this; } public SimpleBakedModel.Builder particle(TextureAtlasSprite particleIcon) { this.particleIcon = particleIcon; return this; } public SimpleBakedModel.Builder item() { return this; } public BakedModel build() { if (this.particleIcon == null) { throw new RuntimeException("Missing particle!"); } else { return new SimpleBakedModel( this.unculledFaces, this.culledFaces, this.hasAmbientOcclusion, this.usesBlockLight, this.isGui3d, this.particleIcon, this.transforms, this.overrides ); } } } }