File size: 2,504 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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 javax.annotation.Nullable;
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 net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

@OnlyIn(Dist.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> p_367507_) {
        if (p_367507_.isEmpty()) {
            throw new IllegalArgumentException("Model must have at least one selector");
        } else {
            return p_367507_.getFirst().model();
        }
    }

    public MultiPartBakedModel(List<MultiPartBakedModel.Selector> p_119462_) {
        super(getFirstModel(p_119462_));
        this.selectors = p_119462_;
    }

    @Override
    public List<BakedQuad> getQuads(@Nullable BlockState p_235050_, @Nullable Direction p_235051_, RandomSource p_235052_) {
        if (p_235050_ == null) {
            return Collections.emptyList();
        } else {
            BitSet bitset = this.selectorCache.get(p_235050_);
            if (bitset == null) {
                bitset = new BitSet();

                for (int i = 0; i < this.selectors.size(); i++) {
                    if (this.selectors.get(i).condition.test(p_235050_)) {
                        bitset.set(i);
                    }
                }

                this.selectorCache.put(p_235050_, bitset);
            }

            List<BakedQuad> list = new ArrayList<>();
            long j = p_235052_.nextLong();

            for (int k = 0; k < bitset.length(); k++) {
                if (bitset.get(k)) {
                    p_235052_.setSeed(j);
                    list.addAll(this.selectors.get(k).model.getQuads(p_235050_, p_235051_, p_235052_));
                }
            }

            return list;
        }
    }

    @OnlyIn(Dist.CLIENT)
    public static record Selector(Predicate<BlockState> condition, BakedModel model) {
    }
}