import { Vec3 } from './Vec3';
import { Quat } from './Quat';
import { OrthographicCameraBaseOptions } from '../core/cameras/OrthographicCamera';
import { PerspectiveCameraBaseOptions } from '../core/cameras/PerspectiveCamera';
/** Defines the base parameters to create a perspective projection {@link Mat4}. */
export interface PerspectiveProjectionParams extends PerspectiveCameraBaseOptions {
    /** Perspective aspect ratio (width / height). Default to `1`. */
    aspect?: number;
}
/**
 * Basic 4x4 matrix class used for matrix calculations.
 *
 * Note that like three.js, the constructor and {@link set} method take arguments in row-major order, while internally they are stored in the {@link elements} array in column-major order.
 *
 * @see https://github.com/mrdoob/three.js/blob/dev/src/math/Matrix4.js
 * @see http://glmatrix.net/docs/mat4.js.html
 */
export declare class Mat4 {
    /** The type of the {@link Mat4}. */
    type: string;
    /** Our matrix array. */
    elements: Float32Array;
    /**
     * Mat4 constructor
     * @param elements - Initial array to use, default to identity matrix.
     */
    constructor(elements?: Float32Array);
    /***
     * Sets the matrix from 16 numbers.
     *
     * @param n11 - number
     * @param n12 - number
     * @param n13 - number
     * @param n14 - number
     * @param n21 - number
     * @param n22 - number
     * @param n23 - number
     * @param n24 - number
     * @param n31 - number
     * @param n32 - number
     * @param n33 - number
     * @param n34 - number
     * @param n41 - number
     * @param n42 - number
     * @param n43 - number
     * @param n44 - number
     *
     * @returns - This {@link Mat4} after being set.
     */
    set(n11: number, n12: number, n13: number, n14: number, n21: number, n22: number, n23: number, n24: number, n31: number, n32: number, n33: number, n34: number, n41: number, n42: number, n43: number, n44: number): Mat4;
    /**
     * Sets the {@link Mat4} to an identity matrix.
     * @returns - This {@link Mat4} after being set.
     */
    identity(): Mat4;
    /**
     * Sets the {@link Mat4} values from an array.
     * @param array - Array to use.
     * @param offset - Optional offset in the array to use.
     * @returns - This {@link Mat4} after being set.
     */
    setFromArray(array?: Float32Array | number[], offset?: number): Mat4;
    /**
     * Copy another {@link Mat4}.
     * @param matrix - Matrix to copy.
     * @returns - This {@link Mat4} after being set.
     */
    copy(matrix?: Mat4): Mat4;
    /**
     * Clone a {@link Mat4}.
     * @returns - Cloned {@link Mat4}.
     */
    clone(): Mat4;
    /**
     * Multiply this {@link Mat4} with another {@link Mat4}.
     * @param matrix - {@link Mat4} to multiply with.
     * @returns - This {@link Mat4} after multiplication.
     */
    multiply(matrix?: Mat4): Mat4;
    /**
     * Multiply another {@link Mat4} with this {@link Mat4}.
     * @param matrix - {@link Mat4} to multiply with.
     * @returns - This {@link Mat4} after multiplication.
     */
    premultiply(matrix?: Mat4): Mat4;
    /**
     * Multiply two {@link Mat4}.
     * @param a - First {@link Mat4}.
     * @param b - Second {@link Mat4}.
     * @returns - {@link Mat4} resulting from the multiplication.
     */
    multiplyMatrices(a?: Mat4, b?: Mat4): Mat4;
    /**
     * {@link premultiply} this {@link Mat4} by a translate matrix (i.e. translateMatrix = new Mat4().translate(vector)).
     * @param vector - Translation {@link Vec3} to use.
     * @returns - This {@link Mat4} after the premultiply translate operation.
     */
    premultiplyTranslate(vector?: Vec3): Mat4;
    /**
     * {@link premultiply} this {@link Mat4} by a scale matrix (i.e. translateMatrix = new Mat4().scale(vector)).
     * @param vector - Scale {@link Vec3 | vector} to use.
     * @returns - This {@link Mat4} after the premultiply scale operation.
     */
    premultiplyScale(vector?: Vec3): Mat4;
    /**
     * Computes and returns the determinant of this {@link Mat4}.
     * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).
     * @return - The determinant.
     */
    determinant(): number;
    /**
     * Get the {@link Mat4} inverse.
     * @returns - the inverted {@link Mat4}.
     */
    invert(): Mat4;
    /**
     * Clone and invert the {@link Mat4}.
     * @returns - Inverted cloned {@link Mat4}.
     */
    getInverse(): Mat4;
    /**
     * Transpose this {@link Mat4}.
     * @returns - The transposed {@link Mat4}.
     */
    transpose(): Mat4;
    /**
     * Translate a {@link Mat4}.
     * @param vector - Translation {@link Vec3} to use.
     * @returns - Translated {@link Mat4}.
     */
    translate(vector?: Vec3): Mat4;
    /**
     * Get the translation {@link Vec3} component of a {@link Mat4}.
     * @param position - {@link Vec3} to set.
     * @returns - Translation {@link Vec3} component of this {@link Mat4}.
     */
    getTranslation(position?: Vec3): Vec3;
    /**
     * Scale a {@link Mat4}.
     * @param vector - Scale {@link Vec3 | vector} to use.
     * @returns - Scaled {@link Mat4}.
     */
    scale(vector?: Vec3): Mat4;
    /**
     * Rotate a {@link Mat4} from a {@link Quat | quaternion}.
     * @param quaternion - {@link Quat | quaternion} to use.
     * @returns - Rotated {@link Mat4}.
     */
    rotateFromQuaternion(quaternion?: Quat): Mat4;
    /**
     * Get the scale {@link Vec3} component of a {@link Mat4}.
     * @param scale - {@link Vec3} to set.
     * @returns - Scale {@link Vec3} component of this {@link Mat4}.
     */
    getScale(scale?: Vec3): Vec3;
    /**
     * Get the rotation {@link Quat} component of a {@link Mat4}.
     * @param quat - {@link Quat} to set.
     * @returns - Rotation {@link Quat} component of this {@link Mat4}.
     */
    getRotation(quat?: Quat): Quat;
    /**
     * Get the maximum scale of the {@link Mat4} on all axes.
     * @returns - Maximum scale of the {@link Mat4}.
     */
    getMaxScaleOnAxis(): number;
    /**
     * Creates a {@link Mat4} from a {@link Quat | quaternion} rotation, {@link Vec3 | vector} translation and {@link Vec3 | vector} scale.
     * Equivalent for applying translation, rotation and scale matrices but much faster.
     * Source code from: http://glmatrix.net/docs/mat4.js.html
     *
     * @param translation - Translation {@link Vec3 | vector} to use.
     * @param quaternion - {@link Quat | quaternion} to use.
     * @param scale - Translation {@link Vec3 | vector} to use.
     * @returns - Transformed {@link Mat4}.
     */
    compose(translation?: Vec3, quaternion?: Quat, scale?: Vec3): Mat4;
    /**
     * Creates a {@link Mat4} from a {@link Quat | quaternion} rotation, {@link Vec3 | vector} translation and {@link Vec3 | vector} scale, rotating and scaling around the given {@link Vec3 | origin vector}.
     * Equivalent for applying translation, rotation and scale matrices but much faster.
     * Source code from: http://glmatrix.net/docs/mat4.js.html
     *
     * @param translation - Translation {@link Vec3 | vector} to use.
     * @param quaternion - {@link Quat | quaternion} to use.
     * @param scale - Translation {@link Vec3 | vector} to use.
     * @param origin - Origin {@link Vec3 | vector} around which to scale and rotate.
     * @returns - Transformed {@link Mat4}.
     */
    composeFromOrigin(translation?: Vec3, quaternion?: Quat, scale?: Vec3, origin?: Vec3): Mat4;
    /**
     * Set this {@link Mat4} as a rotation matrix based on an eye, target and up {@link Vec3 | vectors}.
     * @param eye - {@link Vec3 | position vector} of the object that should be rotated.
     * @param target - {@link Vec3 | target vector} to look at.
     * @param up - Up {@link Vec3 | vector}.
     * @returns - Rotated {@link Mat4}.
     */
    lookAt(eye?: Vec3, target?: Vec3, up?: Vec3): Mat4;
    /**
     * Compute a view {@link Mat4} matrix.
     *
     * This is a view matrix which transforms all other objects
     * to be in the space of the view defined by the parameters.
     *
     * Equivalent to `matrix.lookAt(eye, target, up).invert()` but faster.
     *
     * @param eye - The position of the object.
     * @param target - The position meant to be aimed at.
     * @param up - A vector pointing up.
     * @returns - The view {@link Mat4} matrix.
     */
    makeView(eye?: Vec3, target?: Vec3, up?: Vec3): Mat4;
    /**
     * Create an orthographic {@link Mat4} matrix based on the parameters. Transforms from
     *  * the given the left, right, bottom, and top dimensions to -1 +1 in x, and y
     *  * and 0 to +1 in z.
     *
     * @param parameters - {@link OrthographicCameraBaseOptions | parameters} used to create the camera orthographic matrix.
     * @returns - The camera orthographic {@link Mat4} matrix.
     */
    makeOrthographic({ left, right, bottom, top, near, far, }: OrthographicCameraBaseOptions): Mat4;
    /**
     * Create a perspective {@link Mat4} matrix based on the parameters.
     *
     * Note, The matrix generated sends the viewing frustum to the unit box.
     * We assume a unit box extending from -1 to 1 in the x and y dimensions and
     * from -1 to 1 in the z dimension, as three.js and more generally WebGL handles it.
     *
     * @param parameters - {@link PerspectiveProjectionParams | parameters} used to create the camera perspective matrix.
     * @returns - The camera perspective {@link Mat4} matrix.
     */
    makePerspective({ fov, aspect, near, far }: PerspectiveProjectionParams): Mat4;
}
