package net.glowstone.entity.physics; import org.bukkit.util.Vector; /** * A rectangular bounding box with minimum and maximum corners. */ public class BoundingBox implements Cloneable { public final Vector minCorner = new Vector(); public final Vector maxCorner = new Vector(); public Vector getSize() { return maxCorner.clone().subtract(minCorner); } public final boolean intersects(BoundingBox other) { return intersects(this, other); } public static boolean intersects(BoundingBox a, BoundingBox b) { Vector minA = a.minCorner, maxA = a.maxCorner; Vector minB = b.minCorner, maxB = b.maxCorner; return (maxA.getX() >= minB.getX() && minA.getX() <= maxB.getX() && maxA.getY() >= minB.getY() && minA.getY() <= maxB.getY() && maxA.getZ() >= minB.getZ() && minA.getZ() <= maxB.getZ()); } public static BoundingBox fromCorners(Vector a, Vector b) { BoundingBox box = new BoundingBox(); box.minCorner.setX(Math.min(a.getX(), b.getX())); box.minCorner.setY(Math.min(a.getY(), b.getY())); box.minCorner.setZ(Math.min(a.getZ(), b.getZ())); box.maxCorner.setX(Math.max(a.getX(), b.getX())); box.maxCorner.setY(Math.max(a.getY(), b.getY())); box.maxCorner.setZ(Math.max(a.getZ(), b.getZ())); return box; } public static BoundingBox fromPositionAndSize(Vector pos, Vector size) { BoundingBox box = new BoundingBox(); box.minCorner.copy(pos); box.maxCorner.copy(pos.clone().add(size)); return box; } public static BoundingBox copyOf(BoundingBox original) { BoundingBox box = new BoundingBox(); box.minCorner.copy(original.minCorner); box.maxCorner.copy(original.maxCorner); return box; } }