API Docs for: 0.5.5
Show:

File: kick/math/Aabb.js

define(["kick/core/Constants", "./Vec3", "./Mat4"], function (constants, vec3, mat4) {
    "use strict";

    /**
     * @module kick.math
     */

    /**
     * Axis-Aligned Bounding Box. A rectangle or box with the restriction that it's sides or faces are parallel to the
     * axes of the system.
     * The aabb is represented using an array: [min\_x,min\_y,min\_z,max\_x,max\_y,max\_z]
     * @class Aabb
     * @namespace kick.math
     */
    return {
        /**
         * Default value is min=MAX, max=MIN (meaning that it has a negative size)
         * @method create
         * @param {Array_Number | kick.math.Aabb} vec3Min Optional, vec3Min containing values to initialize minimum values with Default. Or an aabb.
         * @param {Array_Number} vec3Max Optional, vec3Max containing values to initialize maximum values with
         * @return {kick.math.Aabb} New aabb
         * @static
         */
        create: function (vec3Min, vec3Max) {
            var dest = new Float32Array(6);

            if (vec3Min) {
                dest[0] = vec3Min[0];
                dest[1] = vec3Min[1];
                dest[2] = vec3Min[2];
                if (vec3Min.length === 6) {
                    dest[3] = vec3Min[3];
                    dest[4] = vec3Min[4];
                    dest[5] = vec3Min[5];
                } else if (vec3Max) {
                    dest[3] = vec3Max[0];
                    dest[4] = vec3Max[1];
                    dest[5] = vec3Max[2];
                } else {
                    dest[3] = dest[0];
                    dest[4] = dest[1];
                    dest[5] = dest[2];
                }
            } else {
                dest[0] = Number.MAX_VALUE;
                dest[1] = Number.MAX_VALUE;
                dest[2] = Number.MAX_VALUE;
                dest[3] = -Number.MAX_VALUE;
                dest[4] = -Number.MAX_VALUE;
                dest[5] = -Number.MAX_VALUE;
            }
            return dest;
        },

        /**
         * Copies the values of one aabb to another
         * @method copy
         * @param {kick.math.Aabb} out receiving copied values
         * @param {kick.math.Aabb} aabb containing values to copy
         * @return {kick.math.Aabb} dest
         * @static
         */
        copy: function (out, aabb) {
            out[0] = aabb[0];
            out[1] = aabb[1];
            out[2] = aabb[2];
            out[3] = aabb[3];
            out[4] = aabb[4];
            out[5] = aabb[5];
            return out;
        },

        /**
         * Transforms the eight points of the Axis-Aligned Bounding Box into a new AABB
         * @method transform
         * @param {kick.math.Aabb} out
         * @param {kick.math.Aabb} aabbIn
         * @param {kick.math.Mat4} mat
         * @return {kick.math.Aabb}
         * @static
         */
        transform: (function () {
            var point = vec3.create(),
                temp = new Float32Array(6);
            return function (out, aabbIn, mat) {
                var max = Number.MAX_VALUE,
                    min = -Number.MAX_VALUE,
                    i,
                    j,
                    k,
                    transformedPoint;

                this.copy(temp, [max, max, max, min, min, min]);

                for (i = 0; i < 2; i++) {
                    for (j = 0; j < 2; j++) {
                        for (k = 0; k < 2; k++) {
                            point[0] = aabbIn[i * 3];
                            point[1] = aabbIn[j * 3 + 1];
                            point[2] = aabbIn[k * 3 + 2];
                            transformedPoint = mat4.multiplyVec3(point, mat, point);
                            this.addPoint(temp, temp, transformedPoint);
                        }
                    }
                }
                this.copy(out, temp);
                return out;
            };
        }()),

        /**
         * @method merge
         * @param {kick.math.Aabb} out
         * @param {kick.math.Aabb} aabb
         * @param {kick.math.Aabb} aabb2
         * @return {kick.math.Aabb} out
         * @static
         */
        merge: function (out, aabb, aabb2) {
            out[0] = Math.min(aabb[0], aabb2[0]);
            out[1] = Math.min(aabb[1], aabb2[1]);
            out[2] = Math.min(aabb[2], aabb2[2]);
            out[3] = Math.max(aabb[3], aabb2[3]);
            out[4] = Math.max(aabb[4], aabb2[4]);
            out[5] = Math.max(aabb[5], aabb2[5]);
            return out;
        },

        /**
         * @method addPoint
         * @param {kick.math.Aabb} out
         * @param {kick.math.Aabb} aabb
         * @param {kick.math.Vec3} a point
         * @return {kick.math.Aabb} aabb (same object as input)
         * @static
         */
        addPoint: function (out, aabb, a) {
            var vpX = a[0],
                vpY = a[1],
                vpZ = a[2];
            out[0] = Math.min(aabb[0], vpX);
            out[1] = Math.min(aabb[1], vpY);
            out[2] = Math.min(aabb[2], vpZ);
            out[3] = Math.max(aabb[3], vpX);
            out[4] = Math.max(aabb[4], vpY);
            out[5] = Math.max(aabb[5], vpZ);
            return aabb;
        },
        /**
         * @method addPointIndexed
         * @param {kick.math.Aabb} out
         * @param {kick.math.Aabb} aabb
         * @param {Array} a array of Numbers
         * @param {Number} offset
         * @return {kick.math.Aabb} aabb (same object as input)
         * @static
         */
        addPointIndexed: function (out, aabb, a, offset) {
            var vpX = a[0+offset],
                vpY = a[1+offset],
                vpZ = a[2+offset];
            out[0] = Math.min(aabb[0], vpX);
            out[1] = Math.min(aabb[1], vpY);
            out[2] = Math.min(aabb[2], vpZ);
            out[3] = Math.max(aabb[3], vpX);
            out[4] = Math.max(aabb[4], vpY);
            out[5] = Math.max(aabb[5], vpZ);
            return aabb;
        },


        /**
         * @method center
         * @param {kick.math.Vec3} out
         * @param {kick.math.Aabb} aabb
         * @return {kick.math.Vec3} out
         * @static
         */
        center: function (out, aabb) {
            out[0] = (aabb[0] + aabb[3]) * 0.5;
            out[1] = (aabb[1] + aabb[4]) * 0.5;
            out[2] = (aabb[2] + aabb[5]) * 0.5;

            return out;
        },

        /**
         * @method halfVector
         * @param {kick.math.Vec3} out
         * @param {kick.math.Aabb} aabb
         * @return {kick.math.Vec3} out
         * @static
         */
        halfVec3: function (out, aabb) {
            out[0] = (aabb[3] - aabb[0]) * 0.5;
            out[1] = (aabb[4] - aabb[1]) * 0.5;
            out[2] = (aabb[5] - aabb[2]) * 0.5;

            return out;
        },

        /**
         * Diagonal from min to max
         * @method diagonal
         * @param {kick.math.Vec3} out
         * @param {kick.math.Aabb} aabb
         * @return {kick.math.Vec3} out
         * @static
         */
        diagonal: function (out, aabb) {
            out[0] = aabb[3] - aabb[0];
            out[1] = aabb[4] - aabb[1];
            out[2] = aabb[5] - aabb[2];
            return out;
        },

        /**
         * @method str
         * @param {kick.math.Aabb} aabb
         * @static
         */
        str: function (aabb) {
            return "{(" +
                aabb[0] + "," +
                aabb[1] + "," +
                aabb[2] + "),(" +
                aabb[3] + "," +
                aabb[4] + "," +
                aabb[5] + ")}";
        }
    };
});