]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/BiomeBorderProvider.java
Bedrock ceiling
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / providers / BiomeBorderProvider.java
1 package com.irtimaled.bbor.client.providers;
2
3 import com.irtimaled.bbor.client.Player;
4 import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
5 import com.irtimaled.bbor.client.config.ConfigManager;
6 import com.irtimaled.bbor.client.interop.BiomeBorderHelper;
7 import com.irtimaled.bbor.client.models.BoundingBoxBiomeBorder;
8 import com.irtimaled.bbor.common.BoundingBoxType;
9 import com.irtimaled.bbor.common.MathHelper;
10 import com.irtimaled.bbor.common.models.Coords;
11 import com.irtimaled.bbor.common.models.DimensionId;
12 import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
13
14 import java.util.HashMap;
15 import java.util.Map;
16
17 public class BiomeBorderProvider implements IBoundingBoxProvider<BoundingBoxBiomeBorder>, ICachingProvider {
18     private static Coords lastPlayerCoords = null;
19     private static Boolean lastRenderAllTransitions = null;
20     private static Integer lastRenderDistance = null;
21     private static Integer lastMaxY = null;
22     private static Map<Coords, BoundingBoxBiomeBorder> lastBorders = new Object2ObjectLinkedOpenHashMap<>();
23
24     @Override
25     public boolean canProvide(DimensionId dimensionId) {
26         return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.BiomeBorder);
27     }
28
29     @Override
30     public Iterable<BoundingBoxBiomeBorder> get(DimensionId dimensionId) {
31         Coords playerCoords = Player.getCoords();
32         Integer renderDistance = ConfigManager.biomeBordersRenderDistance.get();
33         Boolean renderAllTransitions = !ConfigManager.renderOnlyCurrentBiome.get();
34         Integer maxY = (int) Player.getMaxY(ConfigManager.biomeBordersMaxY.get());
35         if (!playerCoords.equals(lastPlayerCoords) ||
36                 !renderDistance.equals(lastRenderDistance) ||
37                 renderAllTransitions != lastRenderAllTransitions ||
38                 !maxY.equals(lastMaxY)) {
39             lastPlayerCoords = playerCoords;
40             lastRenderDistance = renderDistance;
41             lastRenderAllTransitions = renderAllTransitions;
42             lastMaxY = maxY;
43             lastBorders = getBiomeBorders();
44         }
45         return lastBorders.values();
46     }
47
48     public void clearCache() {
49         lastBorders = new HashMap<>();
50         lastPlayerCoords = null;
51     }
52
53     private Map<Coords, BoundingBoxBiomeBorder> getBiomeBorders() {
54         int renderDistance = lastRenderDistance;
55         Coords playerCoords = lastPlayerCoords;
56         boolean renderAllTransitions = lastRenderAllTransitions;
57         int maxY = lastMaxY;
58
59         int width = MathHelper.floor(Math.pow(2, 3 + renderDistance));
60
61         int blockX = playerCoords.getX();
62         int minX = blockX - width;
63         int maxX = blockX + width;
64
65         int blockZ = playerCoords.getZ();
66         int minZ = blockZ - width;
67         int maxZ = blockZ + width;
68
69         int size = (width * 2) + 1;
70         int[][] biomeIds = new int[size][size];
71         for (int x = minX; x <= maxX; x++) {
72             int matchX = (x - minX);
73             for (int z = minZ; z <= maxZ; z++) {
74                 int matchZ = (z - minZ);
75                 biomeIds[matchX][matchZ] = BiomeBorderHelper.getBiomeId(x, maxY, z);
76             }
77         }
78
79         int playerBiomeId = BiomeBorderHelper.getBiomeId(playerCoords);
80
81         Map<Coords, BoundingBoxBiomeBorder> borders = new HashMap<>();
82         for (int matchX = 1; matchX < size - 2; matchX++) {
83             for (int matchZ = 1; matchZ < size - 2; matchZ++) {
84                 int x = matchX + minX;
85                 int z = matchZ + minZ;
86                 int biomeId = biomeIds[matchX][matchZ];
87                 if (renderAllTransitions || biomeId == playerBiomeId) {
88                     Coords coords = new Coords(x, maxY, z);
89                     if (lastBorders.containsKey(coords)) {
90                         borders.put(coords, lastBorders.get(coords));
91                     } else {
92                         boolean north = biomeIds[matchX][matchZ - 1] != biomeId;
93                         boolean east = biomeIds[matchX + 1][matchZ] != biomeId;
94                         boolean south = biomeIds[matchX][matchZ + 1] != biomeId;
95                         boolean west = biomeIds[matchX - 1][matchZ] != biomeId;
96                         if (north || east || south || west) {
97                             borders.put(coords, new BoundingBoxBiomeBorder(coords, north, east, south, west));
98                         }
99                     }
100                 }
101             }
102         }
103         return borders;
104     }
105 }