180 lines
4.2 KiB
JavaScript
180 lines
4.2 KiB
JavaScript
/**
|
|
* @module ol/vec/mat4
|
|
*/
|
|
|
|
/** @typedef {Array<number>} Mat4 */
|
|
|
|
/**
|
|
* @return {Mat4} "4x4 matrix representing a 3D identity transform."
|
|
*/
|
|
export function create() {
|
|
return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
}
|
|
|
|
/**
|
|
* @param {Mat4} mat4 Flattened 4x4 matrix receiving the result.
|
|
* @param {import("../transform.js").Transform} transform Transformation matrix.
|
|
* @return {Mat4} "2D transformation matrix as flattened 4x4 matrix."
|
|
*/
|
|
export function fromTransform(mat4, transform) {
|
|
mat4[0] = transform[0];
|
|
mat4[1] = transform[1];
|
|
mat4[4] = transform[2];
|
|
mat4[5] = transform[3];
|
|
mat4[12] = transform[4];
|
|
mat4[13] = transform[5];
|
|
return mat4;
|
|
}
|
|
|
|
/**
|
|
* Generates a orthogonal projection matrix with the given bounds
|
|
*
|
|
* @param {number} left Left bound of the frustum
|
|
* @param {number} right Right bound of the frustum
|
|
* @param {number} bottom Bottom bound of the frustum
|
|
* @param {number} top Top bound of the frustum
|
|
* @param {number} near Near bound of the frustum
|
|
* @param {number} far Far bound of the frustum
|
|
* @param {Mat4} [out] mat4 frustum matrix will be written into
|
|
* @return {Mat4} out
|
|
*/
|
|
export function orthographic(left, right, bottom, top, near, far, out) {
|
|
out = out ?? create();
|
|
const lr = 1 / (left - right),
|
|
bt = 1 / (bottom - top),
|
|
nf = 1 / (near - far);
|
|
out[0] = -2 * lr;
|
|
out[1] = 0;
|
|
out[2] = 0;
|
|
out[3] = 0;
|
|
out[4] = 0;
|
|
out[5] = -2 * bt;
|
|
out[6] = 0;
|
|
out[7] = 0;
|
|
out[8] = 0;
|
|
out[9] = 0;
|
|
out[10] = 2 * nf;
|
|
out[11] = 0;
|
|
out[12] = (left + right) * lr;
|
|
out[13] = (top + bottom) * bt;
|
|
out[14] = (far + near) * nf;
|
|
out[15] = 1;
|
|
return out;
|
|
}
|
|
|
|
/**
|
|
* Scales the mat4 by the dimensions in the given vec3
|
|
*
|
|
* @param {Mat4} m The matrix to scale.
|
|
* @param {number} x How much to scale in the x direction.
|
|
* @param {number} y How much to scale in the y direction.
|
|
* @param {number} z How much to scale in the z direction.
|
|
* @param {Mat4} [out] The matrix to write to.
|
|
* @return {Mat4} out
|
|
*/
|
|
export function scale(m, x, y, z, out) {
|
|
out = out ?? create();
|
|
out[0] = m[0] * x;
|
|
out[1] = m[1] * x;
|
|
out[2] = m[2] * x;
|
|
out[3] = m[3] * x;
|
|
out[4] = m[4] * y;
|
|
out[5] = m[5] * y;
|
|
out[6] = m[6] * y;
|
|
out[7] = m[7] * y;
|
|
out[8] = m[8] * z;
|
|
out[9] = m[9] * z;
|
|
out[10] = m[10] * z;
|
|
out[11] = m[11] * z;
|
|
out[12] = m[12];
|
|
out[13] = m[13];
|
|
out[14] = m[14];
|
|
out[15] = m[15];
|
|
return out;
|
|
}
|
|
|
|
/**
|
|
* Translate a matrix.
|
|
*
|
|
* @param {Mat4} m the matrix to translate
|
|
* @param {number} x How much to translate in the x direction.
|
|
* @param {number} y How much to translate in the y direction.
|
|
* @param {number} z How much to translate in the z direction.
|
|
* @param {Mat4} [out] the receiving matrix
|
|
* @return {Mat4} out
|
|
*/
|
|
export function translate(m, x, y, z, out) {
|
|
out = out ?? create();
|
|
let a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23;
|
|
|
|
if (m === out) {
|
|
out[12] = m[0] * x + m[4] * y + m[8] * z + m[12];
|
|
out[13] = m[1] * x + m[5] * y + m[9] * z + m[13];
|
|
out[14] = m[2] * x + m[6] * y + m[10] * z + m[14];
|
|
out[15] = m[3] * x + m[7] * y + m[11] * z + m[15];
|
|
} else {
|
|
a00 = m[0];
|
|
a01 = m[1];
|
|
a02 = m[2];
|
|
a03 = m[3];
|
|
a10 = m[4];
|
|
a11 = m[5];
|
|
a12 = m[6];
|
|
a13 = m[7];
|
|
a20 = m[8];
|
|
a21 = m[9];
|
|
a22 = m[10];
|
|
a23 = m[11];
|
|
|
|
out[0] = a00;
|
|
out[1] = a01;
|
|
out[2] = a02;
|
|
out[3] = a03;
|
|
out[4] = a10;
|
|
out[5] = a11;
|
|
out[6] = a12;
|
|
out[7] = a13;
|
|
out[8] = a20;
|
|
out[9] = a21;
|
|
out[10] = a22;
|
|
out[11] = a23;
|
|
|
|
out[12] = a00 * x + a10 * y + a20 * z + m[12];
|
|
out[13] = a01 * x + a11 * y + a21 * z + m[13];
|
|
out[14] = a02 * x + a12 * y + a22 * z + m[14];
|
|
out[15] = a03 * x + a13 * y + a23 * z + m[15];
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
/**
|
|
* @param {number} x x translation.
|
|
* @param {number} y y translation.
|
|
* @param {number} z z translation.
|
|
* @param {Mat4} [out] optional matrix to store result
|
|
* @return {Mat4} out
|
|
*/
|
|
export function translation(x, y, z, out) {
|
|
out = out ?? create();
|
|
|
|
out[0] = 1;
|
|
out[1] = 0;
|
|
out[2] = 0;
|
|
out[3] = 0;
|
|
out[4] = 0;
|
|
out[5] = 1;
|
|
out[6] = 0;
|
|
out[7] = 0;
|
|
out[8] = 0;
|
|
out[9] = 0;
|
|
out[10] = 1;
|
|
out[11] = 0;
|
|
out[12] = x;
|
|
out[13] = y;
|
|
out[14] = z;
|
|
out[15] = 1;
|
|
|
|
return out;
|
|
}
|