summaryrefslogtreecommitdiff
path: root/frontend/_shared/math/mat4.js
blob: d31a20e66d06596d61fcb50b1dd6a0be65b936c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
function mat4() {
    return [
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    ]
}

function orthographic(pLeft, pRight, pBottom, pTop) {
    const lResult = mat4();
    lResult[0] = 2.0 / (pRight - pLeft);
    lResult[5] = 2.0 / (pTop - pBottom);
    lResult[10] = 1.0;
    lResult[12] = -(pRight + pLeft) / (pRight - pLeft);
    lResult[13] = -(pTop + pBottom) / (pTop - pBottom);
    return lResult;
}

function translateMatrix(m, x, y, z) {
    m = [...m];
    m[12] += x;
    m[13] += y;
    m[14] += z;
    return m;
}

function rotateMatrix2d(m, angle) {
    m = [...m];
    m[0] = Math.cos(angle);
    m[1] = -Math.sin(angle);
    m[4] = Math.sin(angle);
    m[5] = Math.cos(angle);
    return m;
}

function scaleMatrix(m, x, y, z) {
    m = [...m];
    m[0] = m[0] * x;
    m[5] = m[5] * y;
    m[10] = m[10] * z;
    return m;
}

function multMat4ByVec2(matrix, vec) {
    var lInnerVec = {...vec};
    lInnerVec.z = 0.0;
    lInnerVec.w = 1.0;

    return {
        x: lInnerVec.x * matrix[0] + lInnerVec.y * matrix[4] + lInnerVec.z * matrix[8] + lInnerVec.w * matrix[12],
        y: lInnerVec.x * matrix[1] + lInnerVec.y * matrix[5] + lInnerVec.z * matrix[9] + lInnerVec.w * matrix[13]
    };
}

function multMat4ByVec4(matrix, vec) {
    return {
        x: vec.x * matrix[0] + vec.y * matrix[4] + vec.z * matrix[8] + vec.w * matrix[12],
        y: vec.x * matrix[1] + vec.y * matrix[5] + vec.z * matrix[9] + vec.w * matrix[13],
        z: vec.x * matrix[2] + vec.y * matrix[6] + vec.z * matrix[10] + vec.w * matrix[14],
        w: vec.x * matrix[3] + vec.y * matrix[7] + vec.z * matrix[11] + vec.w * matrix[15]
    };
}