001/*
002 * Trident - A Multithreaded Server Alternative
003 * Copyright 2014 The TridentSDK Team
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *    http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package net.tridentsdk.base;
018
019/**
020 * An axis-aligned, rectangular polygon in which entities reside
021 *
022 * @author The TridentSDK Team
023 * @since 0.4-alpha
024 */
025public class BoundingBox implements Cloneable {
026    private double minX;
027    private double minY;
028    private double minZ;
029    private double maxX;
030    private double maxY;
031    private double maxZ;
032
033    public BoundingBox(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
034        set(minX, minY, minZ, maxX, maxY, maxZ);
035    }
036
037    public BoundingBox set(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
038        this.minX = minX;
039        this.minY = minY;
040        this.minZ = minZ;
041        this.maxX = maxX;
042        this.maxY = maxY;
043        this.maxZ = maxZ;
044        return this;
045    }
046
047    public BoundingBox add(double x, double y, double z) {
048        this.minX = this.minX() + x;
049        this.minY = this.minY() + y;
050        this.minZ = this.minZ() + z;
051        this.maxX = this.maxX() + x;
052        this.maxY = this.maxY() + y;
053        this.maxZ = this.maxZ() + z;
054        return this;
055    }
056
057    public BoundingBox grow(double x, double y, double z) {
058        return new BoundingBox(this.minX() - x, this.minY() - y, this.minZ() - z, this.maxX() + x, this.maxY() + y, this.maxZ() + z);
059    }
060
061    public BoundingBox shrink(double x, double y, double z) {
062        return new BoundingBox(this.minX() + x, this.minY() + y, this.minZ() + z, this.maxX() - x, this.maxY() - y, this.maxZ() - z);
063    }
064
065    public boolean collidesWith(BoundingBox box){
066        return !(this.maxX() < box.minX() || this.minX() > box.maxX()) && !(this.maxY() < box.minY() || this.minY() > box.maxY()) && !(this.maxZ() < box.minZ() || this.minZ() > box.maxZ());
067    }
068
069    public BoundingBox clone() {
070        return new BoundingBox(this.minX(), this.minY(), this.minZ(), this.maxX(), this.maxY(), this.maxZ());
071    }
072
073    public String toString() {
074        return "BoundingBox{" + this.minX() + ", " + this.minY() + ", " + this.minZ() + " -> " + this.maxX() + ", " + this.maxY() + ", " + this.maxZ() + "}";
075    }
076
077    public double minX() {
078        return minX;
079    }
080
081    public double minY() {
082        return minY;
083    }
084
085    public double minZ() {
086        return minZ;
087    }
088
089    public double maxX() {
090        return maxX;
091    }
092
093    public double maxY() {
094        return maxY;
095    }
096
097    public double maxZ() {
098        return maxZ;
099    }
100}