summaryrefslogtreecommitdiff
path: root/src/m/m_mtx.cpp
blob: 521cbb7abd67f65a077c6f4f1452911aa39561e7 (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
#include "m/m_mtx.h"

#include "c/c_math.h"
#include "m/m_math.h"
#include "m/m_vec.h"

void mMtx_c::toRot(mAng3_c &out) const {
    f32 t1 = 0.0f;
    f32 t0 = m[0][2] + m[2][2];
    if (t0 > 0.0f) {
        t1 = t0 * nw4r::math::FrSqrt(t0);
    }
    s16 anglex = cM::atan2s(-m[1][2], t1);
}

void mMtx_c::fn_802F1C40(s32 i, s32 j) {
    f32 *pJ = &arr[j];
    f32 *pI = &arr[i];

    mVec3_c v0(pI[0], pI[4], pI[8]);
    mVec3_c v1(pJ[0], pJ[4], pJ[8]);

    mVec3_c v2;
    v0.normalize();

    f32 z, y, x;
    if (j - i == 1 || j - i == -2) {
        z = (v0.x * v1.y) - (v0.y * v1.x);
        y = (v0.z * v1.x) - (v0.x * v1.z);
        x = (v0.y * v1.z) - (v0.z * v1.y);
        v2 = mVec3_c(x, y, z);

        z = (v2.x * v0.y) - (v2.y * v0.x);
        y = (v2.z * v0.x) - (v2.x * v0.z);
        x = (v2.y * v0.z) - (v2.z * v0.y);
        v1 = mVec3_c(x, y, z);
    } else {
        z = (v1.x * v0.y) - (v1.y * v0.x);
        y = (v1.z * v0.x) - (v1.x * v0.z);
        x = (v1.y * v0.z) - (v1.z * v0.y);
        v2 = mVec3_c(x, y, z);

        z = (v0.x * v2.y) - (v0.y * v2.x);
        y = (v0.z * v2.x) - (v0.x * v2.z);
        x = (v0.y * v2.z) - (v0.z * v2.y);
        v1 = mVec3_c(x, y, z);
    }
    v2.normalize();
    v1.normalize();

    f32 *pK = &arr[((3 - i) - j)];

    // clang-format off
    pI[0] = v0.x; pI[4] = v0.y; pI[8] = v0.z;
    pJ[0] = v1.x; pJ[4] = v1.y; pJ[8] = v1.z;
    pK[0] = v2.x; pK[4] = v2.y; pK[8] = v2.z;
    // clang-format on
}