]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/common/models/BoundingBoxCuboid.java
Performance improvements
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / common / models / BoundingBoxCuboid.java
1 package com.irtimaled.bbor.common.models;
2
3 import com.irtimaled.bbor.client.RenderCulling;
4 import com.irtimaled.bbor.client.renderers.AbstractRenderer;
5 import com.irtimaled.bbor.client.renderers.CuboidRenderer;
6 import com.irtimaled.bbor.common.BoundingBoxType;
7 import com.irtimaled.bbor.common.MathHelper;
8 import com.irtimaled.bbor.common.TypeHelper;
9 import com.irtimaled.bbor.common.interop.CommonInterop;
10
11 public class BoundingBoxCuboid extends AbstractBoundingBox {
12     private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = CommonInterop.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer());
13
14     private final Coords minCoords;
15     private final Coords maxCoords;
16
17     protected BoundingBoxCuboid(Coords minCoords, Coords maxCoords, BoundingBoxType type) {
18         super(type);
19         this.minCoords = minCoords;
20         this.maxCoords = maxCoords;
21     }
22
23     public static BoundingBoxCuboid from(Coords minCoords, Coords maxCoords, BoundingBoxType type) {
24         return new BoundingBoxCuboid(minCoords, maxCoords, type);
25     }
26
27     @Override
28     public int hashCode() {
29         return TypeHelper.combineHashCodes(minCoords.hashCode(), maxCoords.hashCode());
30     }
31
32     @Override
33     public boolean equals(Object obj) {
34         if (this == obj) return true;
35         if (obj == null || getClass() != obj.getClass()) return false;
36         BoundingBoxCuboid other = (BoundingBoxCuboid) obj;
37         return minCoords.equals(other.minCoords) && maxCoords.equals(other.maxCoords);
38     }
39
40     public Coords getMinCoords() {
41         return minCoords;
42     }
43
44     public Coords getMaxCoords() {
45         return maxCoords;
46     }
47
48     @Override
49     public Boolean intersectsBounds(int minX, int minZ, int maxX, int maxZ) {
50         boolean minXWithinBounds = isBetween(minCoords.getX(), minX, maxX);
51         boolean maxXWithinBounds = isBetween(maxCoords.getX(), minX, maxX);
52         boolean minZWithinBounds = isBetween(minCoords.getZ(), minZ, maxZ);
53         boolean maxZWithinBounds = isBetween(maxCoords.getZ(), minZ, maxZ);
54
55         return (minXWithinBounds && minZWithinBounds) ||
56                 (maxXWithinBounds && maxZWithinBounds) ||
57                 (minXWithinBounds && maxZWithinBounds) ||
58                 (maxXWithinBounds && minZWithinBounds);
59     }
60
61     private boolean isBetween(int val, int min, int max) {
62         return val >= min && val <= max;
63     }
64
65     @Override
66     public double getDistanceX(double x) {
67         return x - MathHelper.clamp(x, minCoords.getX(), maxCoords.getX());
68     }
69
70     @Override
71     public double getDistanceY(double y) {
72         return y - MathHelper.clamp(y, minCoords.getY(), maxCoords.getY());
73     }
74
75     @Override
76     public double getDistanceZ(double z) {
77         return z - MathHelper.clamp(z, minCoords.getZ(), maxCoords.getZ());
78     }
79
80     @Override
81     public AbstractRenderer<?> getRenderer() {
82         return RENDERER;
83     }
84
85     @Override
86     public boolean isVisibleCulling() {
87         return RenderCulling.isVisibleCulling(minCoords.getX(), minCoords.getY(), minCoords.getZ(), maxCoords.getX(), maxCoords.getY(), maxCoords.getZ());
88     }
89 }