minecraft-src/net/minecraft/client/resources/model/MultiPartBakedModel.java
2025-07-04 02:49:36 +03:00

71 lines
2.2 KiB
Java

package net.minecraft.client.resources.model;
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.block.model.BakedQuad;
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 MultiPartBakedModel extends DelegateBakedModel {
private final List<MultiPartBakedModel.Selector> selectors;
private final Map<BlockState, BitSet> selectorCache = new Reference2ObjectOpenHashMap<>();
private static BakedModel getFirstModel(List<MultiPartBakedModel.Selector> selectors) {
if (selectors.isEmpty()) {
throw new IllegalArgumentException("Model must have at least one selector");
} else {
return ((MultiPartBakedModel.Selector)selectors.getFirst()).model();
}
}
public MultiPartBakedModel(List<MultiPartBakedModel.Selector> selectors) {
super(getFirstModel(selectors));
this.selectors = selectors;
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) {
if (state == null) {
return Collections.emptyList();
} else {
BitSet bitSet = (BitSet)this.selectorCache.get(state);
if (bitSet == null) {
bitSet = new BitSet();
for (int i = 0; i < this.selectors.size(); i++) {
if (((MultiPartBakedModel.Selector)this.selectors.get(i)).condition.test(state)) {
bitSet.set(i);
}
}
this.selectorCache.put(state, bitSet);
}
List<BakedQuad> list = new ArrayList();
long l = random.nextLong();
for (int j = 0; j < bitSet.length(); j++) {
if (bitSet.get(j)) {
random.setSeed(l);
list.addAll(((MultiPartBakedModel.Selector)this.selectors.get(j)).model.getQuads(state, direction, random));
}
}
return list;
}
}
@Environment(EnvType.CLIENT)
public record Selector(Predicate<BlockState> condition, BakedModel model) {
}
}