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