]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/common/StructureProcessor.java
29ba726df909f57699058e5c37df1515deb44b36
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / common / StructureProcessor.java
1 package com.irtimaled.bbor.common;
2
3 import com.irtimaled.bbor.common.models.AbstractBoundingBox;
4 import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
5 import com.irtimaled.bbor.common.models.Coords;
6 import net.minecraft.structure.StructurePiece;
7 import net.minecraft.structure.StructureStart;
8 import net.minecraft.util.math.BlockBox;
9
10 import java.util.HashSet;
11 import java.util.Map;
12 import java.util.Set;
13
14 class StructureProcessor {
15     private static final Set<BoundingBoxType> supportedStructures = new HashSet<>();
16
17     static void registerSupportedStructure(BoundingBoxType type) {
18         supportedStructures.add(type);
19     }
20
21     StructureProcessor(BoundingBoxCache boundingBoxCache) {
22         this.boundingBoxCache = boundingBoxCache;
23     }
24
25     private final BoundingBoxCache boundingBoxCache;
26
27     private void addStructures(BoundingBoxType type, StructureStart<?> structureStart) {
28         if (structureStart == null) return;
29
30         if (structureStart.hasNoChildren()) return;
31
32         BlockBox bb = structureStart.setBoundingBoxFromChildren();
33         if (bb == null) return;
34
35         AbstractBoundingBox boundingBox = buildStructure(bb, type);
36         if (boundingBoxCache.isCached(boundingBox)) return;
37
38         Set<AbstractBoundingBox> structureBoundingBoxes = new HashSet<>();
39         for (StructurePiece structureComponent : structureStart.getChildren()) {
40             structureBoundingBoxes.add(buildStructure(structureComponent.getBoundingBox(), type));
41         }
42         boundingBoxCache.addBoundingBoxes(boundingBox, structureBoundingBoxes);
43     }
44
45     private AbstractBoundingBox buildStructure(BlockBox bb, BoundingBoxType type) {
46         Coords min = new Coords(bb.getMinX(), bb.getMinY(), bb.getMinZ());
47         Coords max = new Coords(bb.getMaxX(), bb.getMaxY(), bb.getMaxZ());
48         return BoundingBoxCuboid.from(min, max, type);
49     }
50
51     void process(Map<String, StructureStart<?>> structures) {
52         if (structures.size() > 0) {
53             supportedStructures.forEach(type -> addStructures(type, structures.get(type.getName())));
54         }
55     }
56 }