package codechicken.lib.vec; import codechicken.lib.util.Copyable; import net.minecraft.block.Block; import net.minecraft.util.AxisAlignedBB; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class Cuboid6 implements Copyable<Cuboid6> { public static Cuboid6 full = new Cuboid6(0, 0, 0, 1, 1, 1); public Vector3 min; public Vector3 max; public Cuboid6() { this(new Vector3(), new Vector3()); } public Cuboid6(Vector3 min, Vector3 max) { this.min = min; this.max = max; } public Cuboid6(AxisAlignedBB aabb) { min = new Vector3(aabb.minX, aabb.minY, aabb.minZ); max = new Vector3(aabb.maxX, aabb.maxY, aabb.maxZ); } public Cuboid6(Cuboid6 cuboid) { min = cuboid.min.copy(); max = cuboid.max.copy(); } public Cuboid6(double minx, double miny, double minz, double maxx, double maxy, double maxz) { min = new Vector3(minx, miny, minz); max = new Vector3(maxx, maxy, maxz); } public AxisAlignedBB aabb() { return AxisAlignedBB.fromBounds(min.x, min.y, min.z, max.x, max.y, max.z); } public Cuboid6 copy() { return new Cuboid6(this); } public Cuboid6 set(Cuboid6 c) { return set(c.min, c.max); } public Cuboid6 set(Vector3 min, Vector3 max) { this.min.set(min); this.max.set(max); return this; } public Cuboid6 set(double minx, double miny, double minz, double maxx, double maxy, double maxz) { min.set(minx, miny, minz); max.set(maxx, maxy, maxz); return this; } public Cuboid6 add(Vector3 vec) { min.add(vec); max.add(vec); return this; } public Cuboid6 sub(Vector3 vec) { min.subtract(vec); max.subtract(vec); return this; } public Cuboid6 expand(double d) { return expand(new Vector3(d, d, d)); } public Cuboid6 expand(Vector3 vec) { min.sub(vec); max.add(vec); return this; } public void setBlockBounds(Block block) { block.setBlockBounds((float) min.x, (float) min.y, (float) min.z, (float) max.x, (float) max.y, (float) max.z); } public boolean intersects(Cuboid6 b) { return max.x - 1E-5 > b.min.x && b.max.x - 1E-5 > min.x && max.y - 1E-5 > b.min.y && b.max.y - 1E-5 > min.y && max.z - 1E-5 > b.min.z && b.max.z - 1E-5 > min.z; } public Cuboid6 offset(Cuboid6 o) { min.add(o.min); max.add(o.max); return this; } public Vector3 center() { return min.copy().add(max).multiply(0.5); } public static boolean intersects(Cuboid6 a, Cuboid6 b) { return a != null && b != null && a.intersects(b); } public String toString() { MathContext cont = new MathContext(4, RoundingMode.HALF_UP); return "Cuboid: (" + new BigDecimal(min.x, cont) + ", " + new BigDecimal(min.y, cont) + ", " + new BigDecimal(min.z, cont) + ") -> (" + new BigDecimal(max.x, cont) + ", " + new BigDecimal(max.y, cont) + ", " + new BigDecimal(max.z, cont) + ")"; } public Cuboid6 enclose(Vector3 vec) { if (min.x > vec.x) { min.x = vec.x; } if (min.y > vec.y) { min.y = vec.y; } if (min.z > vec.z) { min.z = vec.z; } if (max.x < vec.x) { max.x = vec.x; } if (max.y < vec.y) { max.y = vec.y; } if (max.z < vec.z) { max.z = vec.z; } return this; } public Cuboid6 enclose(Cuboid6 c) { if (min.x > c.min.x) { min.x = c.min.x; } if (min.y > c.min.y) { min.y = c.min.y; } if (min.z > c.min.z) { min.z = c.min.z; } if (max.x < c.max.x) { max.x = c.max.x; } if (max.y < c.max.y) { max.y = c.max.y; } if (max.z < c.max.z) { max.z = c.max.z; } return this; } public Cuboid6 apply(Transformation t) { t.apply(min); t.apply(max); double temp; if (min.x > max.x) { temp = min.x; min.x = max.x; max.x = temp; } if (min.y > max.y) { temp = min.y; min.y = max.y; max.y = temp; } if (min.z > max.z) { temp = min.z; min.z = max.z; max.z = temp; } return this; } public double getSide(int s) { switch (s) { case 0: return min.y; case 1: return max.y; case 2: return min.z; case 3: return max.z; case 4: return min.x; case 5: return max.x; } throw new IndexOutOfBoundsException("Switch Falloff"); } public Cuboid6 setSide(int s, double d) { switch (s) { case 0: min.y = d; break; case 1: max.y = d; break; case 2: min.z = d; break; case 3: max.z = d; break; case 4: min.x = d; break; case 5: max.x = d; break; default: throw new IndexOutOfBoundsException("Switch Falloff"); } return this; } }