#include "matrix4.h"
 
#include "harness/trace.h"
 
#include <math.h>
 
#include <string.h>
 
 
 
#define A(x, y) A->m[x][y]
 
#define B(x, y) B->m[x][y]
 
#define C(x, y) C->m[x][y]
 
#define M(x, y) mat->m[x][y]
 
 
 
#define BR_MAC2(a, b, c, d) ((a) * (b) + (c) * (d))
 
#define BR_MAC3(a, b, c, d, e, f) ((a) * (b) + (c) * (d) + (e) * (f))
 
#define BR_MAC4(a, b, c, d, e, f, g, h) ((a) * (b) + (c) * (d) + (e) * (f) + (g) * (h))
 
 
 
// IDA: void __cdecl BrMatrix4Copy(br_matrix4 *A, br_matrix4 *B)
 
void BrMatrix4Copy(br_matrix4* A, br_matrix4* B) {
 
    LOG_TRACE("(%p, %p)", A, B);
 
 
 
    A(0, 0) = B(0, 0);
 
    A(0, 1) = B(0, 1);
 
    A(0, 2) = B(0, 2);
 
    A(0, 3) = B(0, 3);
 
    A(1, 0) = B(1, 0);
 
    A(1, 1) = B(1, 1);
 
    A(1, 2) = B(1, 2);
 
    A(1, 3) = B(1, 3);
 
    A(2, 0) = B(2, 0);
 
    A(2, 1) = B(2, 1);
 
    A(2, 2) = B(2, 2);
 
    A(2, 3) = B(2, 3);
 
    A(3, 0) = B(3, 0);
 
    A(3, 1) = B(3, 1);
 
    A(3, 2) = B(3, 2);
 
    A(3, 3) = B(3, 3);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Mul(br_matrix4 *A, br_matrix4 *B, br_matrix4 *C)
 
void BrMatrix4Mul(br_matrix4* A, br_matrix4* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A(0, 0) = BR_MAC4(B(0, 0), C(0, 0), B(0, 1), C(1, 0), B(0, 2), C(2, 0), B(0, 3), C(3, 0));
 
    A(0, 1) = BR_MAC4(B(0, 0), C(0, 1), B(0, 1), C(1, 1), B(0, 2), C(2, 1), B(0, 3), C(3, 1));
 
    A(0, 2) = BR_MAC4(B(0, 0), C(0, 2), B(0, 1), C(1, 2), B(0, 2), C(2, 2), B(0, 3), C(3, 2));
 
    A(0, 3) = BR_MAC4(B(0, 0), C(0, 3), B(0, 1), C(1, 3), B(0, 2), C(2, 3), B(0, 3), C(3, 3));
 
    A(1, 0) = BR_MAC4(B(1, 0), C(0, 0), B(1, 1), C(1, 0), B(1, 2), C(2, 0), B(1, 3), C(3, 0));
 
    A(1, 1) = BR_MAC4(B(1, 0), C(0, 1), B(1, 1), C(1, 1), B(1, 2), C(2, 1), B(1, 3), C(3, 1));
 
    A(1, 2) = BR_MAC4(B(1, 0), C(0, 2), B(1, 1), C(1, 2), B(1, 2), C(2, 2), B(1, 3), C(3, 2));
 
    A(1, 3) = BR_MAC4(B(1, 0), C(0, 3), B(1, 1), C(1, 3), B(1, 2), C(2, 3), B(1, 3), C(3, 3));
 
    A(2, 0) = BR_MAC4(B(2, 0), C(0, 0), B(2, 1), C(1, 0), B(2, 2), C(2, 0), B(2, 3), C(3, 0));
 
    A(2, 1) = BR_MAC4(B(2, 0), C(0, 1), B(2, 1), C(1, 1), B(2, 2), C(2, 1), B(2, 3), C(3, 1));
 
    A(2, 2) = BR_MAC4(B(2, 0), C(0, 2), B(2, 1), C(1, 2), B(2, 2), C(2, 2), B(2, 3), C(3, 2));
 
    A(2, 3) = BR_MAC4(B(2, 0), C(0, 3), B(2, 1), C(1, 3), B(2, 2), C(2, 3), B(2, 3), C(3, 3));
 
    A(3, 0) = BR_MAC4(B(3, 0), C(0, 0), B(3, 1), C(1, 0), B(3, 2), C(2, 0), B(3, 3), C(3, 0));
 
    A(3, 1) = BR_MAC4(B(3, 0), C(0, 1), B(3, 1), C(1, 1), B(3, 2), C(2, 1), B(3, 3), C(3, 1));
 
    A(3, 2) = BR_MAC4(B(3, 0), C(0, 2), B(3, 1), C(1, 2), B(3, 2), C(2, 2), B(3, 3), C(3, 2));
 
    A(3, 3) = BR_MAC4(B(3, 0), C(0, 3), B(3, 1), C(1, 3), B(3, 2), C(2, 3), B(3, 3), C(3, 3));
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Identity(br_matrix4 *mat)
 
void BrMatrix4Identity(br_matrix4* mat) {
 
    LOG_TRACE("(%p)", mat);
 
 
 
    M(0, 0) = BR_SCALAR(1.f);
 
    M(0, 1) = BR_SCALAR(0.f);
 
    M(0, 2) = BR_SCALAR(0.f);
 
    M(0, 3) = BR_SCALAR(0.f);
 
    M(1, 0) = BR_SCALAR(0.f);
 
    M(1, 1) = BR_SCALAR(1.f);
 
    M(1, 2) = BR_SCALAR(0.f);
 
    M(1, 3) = BR_SCALAR(0.f);
 
    M(2, 0) = BR_SCALAR(0.f);
 
    M(2, 1) = BR_SCALAR(0.f);
 
    M(2, 2) = BR_SCALAR(1.f);
 
    M(2, 3) = BR_SCALAR(0.f);
 
    M(3, 0) = BR_SCALAR(0.f);
 
    M(3, 1) = BR_SCALAR(0.f);
 
    M(3, 2) = BR_SCALAR(0.f);
 
    M(3, 3) = BR_SCALAR(1.f);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Scale(br_matrix4 *mat, br_scalar sx, br_scalar sy, br_scalar sz)
 
void BrMatrix4Scale(br_matrix4* mat, br_scalar sx, br_scalar sy, br_scalar sz) {
 
    LOG_TRACE("(%p, %f, %f, %f)", mat, sx, sy, sz);
 
 
 
    M(0, 0) = sx;
 
    M(1, 1) = sy;
 
    M(2, 2) = sz;
 
    M(0, 1) = BR_SCALAR(0.f);
 
    M(0, 2) = BR_SCALAR(0.f);
 
    M(0, 3) = BR_SCALAR(0.f);
 
    M(1, 0) = BR_SCALAR(0.f);
 
    M(1, 2) = BR_SCALAR(0.f);
 
    M(1, 3) = BR_SCALAR(0.f);
 
    M(2, 0) = BR_SCALAR(0.f);
 
    M(2, 1) = BR_SCALAR(0.f);
 
    M(2, 3) = BR_SCALAR(0.f);
 
    M(3, 0) = BR_SCALAR(0.f);
 
    M(3, 1) = BR_SCALAR(0.f);
 
    M(3, 2) = BR_SCALAR(0.f);
 
    M(3, 3) = BR_SCALAR(1.f);
 
}
 
 
 
// IDA: br_scalar __cdecl BrMatrix4Inverse(br_matrix4 *A, br_matrix4 *B)
 
br_scalar BrMatrix4Inverse(br_matrix4* A, br_matrix4* B) {
 
    int i;
 
    int j;
 
    br_scalar det;
 
    br_scalar idet;
 
    LOG_TRACE("(%p, %p)", A, B);
 
 
 
    BrMatrix4Adjoint(A, B);
 
    det = BrMatrix4Determinant(B);
 
 
 
    if (fabs(det
) < BR_SCALAR_EPSILON 
* 2)  
        return 0;
 
 
 
    idet = (br_scalar) 1.0 / det; // Pierre-Marie Baty -- added type cast
 
    for (i = 0; i < 4; i++) {
 
        for (j = 0; j < 4; j++) {
 
            A(i, j) = A(i, j) * idet;
 
        }
 
    }
 
 
 
    return det;
 
}
 
 
 
// IDA: br_scalar __cdecl Determinant3(br_scalar a1, br_scalar a2, br_scalar a3, br_scalar b1, br_scalar b2, br_scalar b3, br_scalar c1, br_scalar c2, br_scalar c3)
 
br_scalar Determinant3(br_scalar a1, br_scalar a2, br_scalar a3, br_scalar b1, br_scalar b2, br_scalar b3, br_scalar c1, br_scalar c2, br_scalar c3) {
 
    LOG_TRACE("(%f, %f, %f, %f, %f, %f, %f, %f, %f)", a1, a2, a3, b1, b2, b3, c1, c2, c3);
 
 
 
    return BR_MAC3(a1, BR_MAC2(b2, c3, -b3, c2),
 
        -b1, BR_MAC2(a2, c3, -a3, c2),
 
        c1, BR_MAC2(a2, b3, -a3, b2));
 
}
 
 
 
// IDA: br_scalar __cdecl BrMatrix4Determinant(br_matrix4 *mat)
 
br_scalar BrMatrix4Determinant(br_matrix4* mat) {
 
    br_scalar a1;
 
    br_scalar a2;
 
    br_scalar a3;
 
    br_scalar a4;
 
    br_scalar b1;
 
    br_scalar b2;
 
    br_scalar b3;
 
    br_scalar b4;
 
    br_scalar c1;
 
    br_scalar c2;
 
    br_scalar c3;
 
    br_scalar c4;
 
    br_scalar d1;
 
    br_scalar d2;
 
    br_scalar d3;
 
    br_scalar d4;
 
    LOG_TRACE("(%p)", mat);
 
 
 
    a1 = M(0, 0);
 
    b1 = M(0, 1);
 
    c1 = M(0, 2);
 
    d1 = M(0, 3);
 
 
 
    a2 = M(1, 0);
 
    b2 = M(1, 1);
 
    c2 = M(1, 2);
 
    d2 = M(1, 3);
 
 
 
    a3 = M(2, 0);
 
    b3 = M(2, 1);
 
    c3 = M(2, 2);
 
    d3 = M(2, 3);
 
 
 
    a4 = M(3, 0);
 
    b4 = M(3, 1);
 
    c4 = M(3, 2);
 
    d4 = M(3, 3);
 
 
 
    return BR_MAC4(a1, Determinant3(b2, b3, b4, c2, c3, c4, d2, d3, d4),
 
        -b1, Determinant3(a2, a3, a4, c2, c3, c4, d2, d3, d4),
 
        c1, Determinant3(a2, a3, a4, b2, b3, b4, d2, d3, d4),
 
        -d1, Determinant3(a2, a3, a4, b2, b3, b4, c2, c3, c4));
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Adjoint(br_matrix4 *A, br_matrix4 *B)
 
void BrMatrix4Adjoint(br_matrix4* A, br_matrix4* B) {
 
    br_scalar a1;
 
    br_scalar a2;
 
    br_scalar a3;
 
    br_scalar a4;
 
    br_scalar b1;
 
    br_scalar b2;
 
    br_scalar b3;
 
    br_scalar b4;
 
    br_scalar c1;
 
    br_scalar c2;
 
    br_scalar c3;
 
    br_scalar c4;
 
    br_scalar d1;
 
    br_scalar d2;
 
    br_scalar d3;
 
    br_scalar d4;
 
    LOG_TRACE("(%p, %p)", A, B);
 
 
 
    a1 = B(0, 0);
 
    b1 = B(0, 1);
 
    c1 = B(0, 2);
 
    d1 = B(0, 3);
 
 
 
    a2 = B(1, 0);
 
    b2 = B(1, 1);
 
    c2 = B(1, 2);
 
    d2 = B(1, 3);
 
 
 
    a3 = B(2, 0);
 
    b3 = B(2, 1);
 
    c3 = B(2, 2);
 
    d3 = B(2, 3);
 
 
 
    a4 = B(3, 0);
 
    b4 = B(3, 1);
 
    c4 = B(3, 2);
 
    d4 = B(3, 3);
 
 
 
    /* row column labeling reversed since we transpose rows & columns */
 
 
 
    A(0, 0) = Determinant3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
 
    A(1, 0) = -Determinant3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
 
    A(2, 0) = Determinant3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
 
    A(3, 0) = -Determinant3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
 
 
 
    A(0, 1) = -Determinant3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
 
    A(1, 1) = Determinant3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
 
    A(2, 1) = -Determinant3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
 
    A(3, 1) = Determinant3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
 
 
 
    A(0, 2) = Determinant3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
 
    A(1, 2) = -Determinant3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
 
    A(2, 2) = Determinant3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
 
    A(3, 2) = -Determinant3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
 
 
 
    A(0, 3) = -Determinant3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
 
    A(1, 3) = Determinant3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
 
    A(2, 3) = -Determinant3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
 
    A(3, 3) = Determinant3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Perspective(br_matrix4 *mat, br_angle field_of_view, br_scalar aspect, br_scalar hither, br_scalar yon)
 
void BrMatrix4Perspective(br_matrix4* mat, br_angle field_of_view, br_scalar aspect, br_scalar hither, br_scalar yon) {
 
    br_scalar scale;
 
    LOG_TRACE("(%p, %d, %f, %f, %f)", mat, field_of_view, aspect, hither, yon);
 
 
 
    scale = BR_COS(field_of_view / 2) / BR_SIN(field_of_view / 2);
 
 
 
    M(0, 0) = scale / aspect;
 
    M(1, 1) = scale;
 
    M(2, 2) = (yon + hither) / (yon - hither);
 
    M(3, 2) = BR_SCALAR(-2.f) * ((yon * hither) / (yon - hither));
 
 
 
    M(0, 1) = BR_SCALAR(0.f);
 
    M(0, 2) = BR_SCALAR(0.f);
 
    M(0, 3) = BR_SCALAR(0.f);
 
    M(1, 0) = BR_SCALAR(0.f);
 
    M(1, 2) = BR_SCALAR(0.f);
 
    M(1, 3) = BR_SCALAR(0.f);
 
    M(2, 0) = BR_SCALAR(0.f);
 
    M(2, 1) = BR_SCALAR(0.f);
 
    M(2, 3) = BR_SCALAR(-1.f);
 
    M(3, 0) = BR_SCALAR(0.f);
 
    M(3, 1) = BR_SCALAR(0.f);
 
    M(3, 3) = BR_SCALAR(0.f);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Apply(br_vector4 *A, br_vector4 *B, br_matrix4 *C)
 
void BrMatrix4Apply(br_vector4* A, br_vector4* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A->v[0] = BR_MAC4(B->v[0], C(0, 0), B->v[1], C(1, 0), B->v[2], C(2, 0), B->v[3], C(3, 0));
 
    A->v[1] = BR_MAC4(B->v[0], C(0, 1), B->v[1], C(1, 1), B->v[2], C(2, 1), B->v[3], C(3, 1));
 
    A->v[2] = BR_MAC4(B->v[0], C(0, 2), B->v[1], C(1, 2), B->v[2], C(2, 2), B->v[3], C(3, 2));
 
    A->v[3] = BR_MAC4(B->v[0], C(0, 3), B->v[1], C(1, 3), B->v[2], C(2, 3), B->v[3], C(3, 3));
 
}
 
 
 
// IDA: void __cdecl BrMatrix4ApplyP(br_vector4 *A, br_vector3 *B, br_matrix4 *C)
 
void BrMatrix4ApplyP(br_vector4* A, br_vector3* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A->v[0] = BR_MAC3(B->v[0], C(0, 0), B->v[1], C(1, 0), B->v[2], C(2, 0)) + C(3, 0);
 
    A->v[1] = BR_MAC3(B->v[0], C(0, 1), B->v[1], C(1, 1), B->v[2], C(2, 1)) + C(3, 1);
 
    A->v[2] = BR_MAC3(B->v[0], C(0, 2), B->v[1], C(1, 2), B->v[2], C(2, 2)) + C(3, 2);
 
    A->v[3] = BR_MAC3(B->v[0], C(0, 3), B->v[1], C(1, 3), B->v[2], C(2, 3)) + C(3, 3);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4ApplyV(br_vector4 *A, br_vector3 *B, br_matrix4 *C)
 
void BrMatrix4ApplyV(br_vector4* A, br_vector3* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A->v[0] = BR_MAC3(B->v[0], C(0, 0), B->v[1], C(1, 0), B->v[2], C(2, 0));
 
    A->v[1] = BR_MAC3(B->v[0], C(0, 1), B->v[1], C(1, 1), B->v[2], C(2, 1));
 
    A->v[2] = BR_MAC3(B->v[0], C(0, 2), B->v[1], C(1, 2), B->v[2], C(2, 2));
 
    A->v[3] = BR_MAC3(B->v[0], C(0, 3), B->v[1], C(1, 3), B->v[2], C(2, 3));
 
}
 
 
 
// IDA: void __cdecl BrMatrix4TApply(br_vector4 *A, br_vector4 *B, br_matrix4 *C)
 
void BrMatrix4TApply(br_vector4* A, br_vector4* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A->v[0] = BR_MAC4(B->v[0], C(0, 0), B->v[1], C(0, 1), B->v[2], C(0, 2), B->v[3], C(0, 3));
 
    A->v[1] = BR_MAC4(B->v[0], C(1, 0), B->v[1], C(1, 1), B->v[2], C(1, 2), B->v[3], C(1, 3));
 
    A->v[2] = BR_MAC4(B->v[0], C(2, 0), B->v[1], C(2, 1), B->v[2], C(2, 2), B->v[3], C(2, 3));
 
    A->v[3] = BR_MAC4(B->v[0], C(3, 0), B->v[1], C(3, 1), B->v[2], C(3, 2), B->v[3], C(3, 3));
 
}
 
 
 
// IDA: void __cdecl BrMatrix4TApplyP(br_vector4 *A, br_vector3 *B, br_matrix4 *C)
 
void BrMatrix4TApplyP(br_vector4* A, br_vector3* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A->v[0] = BR_MAC3(B->v[0], C(0, 0), B->v[1], C(0, 1), B->v[2], C(0, 2)) + C(0, 3);
 
    A->v[1] = BR_MAC3(B->v[0], C(1, 0), B->v[1], C(1, 1), B->v[2], C(1, 2)) + C(1, 3);
 
    A->v[2] = BR_MAC3(B->v[0], C(2, 0), B->v[1], C(2, 1), B->v[2], C(2, 2)) + C(2, 3);
 
    A->v[3] = BR_MAC3(B->v[0], C(3, 0), B->v[1], C(3, 1), B->v[2], C(3, 2)) + C(3, 3);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4TApplyV(br_vector4 *A, br_vector3 *B, br_matrix4 *C)
 
void BrMatrix4TApplyV(br_vector4* A, br_vector3* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A->v[0] = BR_MAC3(B->v[0], C(0, 0), B->v[1], C(0, 1), B->v[2], C(0, 2));
 
    A->v[1] = BR_MAC3(B->v[0], C(1, 0), B->v[1], C(1, 1), B->v[2], C(1, 2));
 
    A->v[2] = BR_MAC3(B->v[0], C(2, 0), B->v[1], C(2, 1), B->v[2], C(2, 2));
 
    A->v[3] = BR_MAC3(B->v[0], C(3, 0), B->v[1], C(3, 1), B->v[2], C(3, 2));
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Copy34(br_matrix4 *A, br_matrix34 *B)
 
void BrMatrix4Copy34(br_matrix4* A, br_matrix34* B) {
 
    LOG_TRACE("(%p, %p)", A, B);
 
 
 
    A(0, 0) = B(0, 0);
 
    A(0, 1) = B(0, 1);
 
    A(0, 2) = B(0, 2);
 
    A(0, 3) = BR_SCALAR(0.f);
 
    A(1, 0) = B(1, 0);
 
    A(1, 1) = B(1, 1);
 
    A(1, 2) = B(1, 2);
 
    A(1, 3) = BR_SCALAR(0.f);
 
    A(2, 0) = B(2, 0);
 
    A(2, 1) = B(2, 1);
 
    A(2, 2) = B(2, 2);
 
    A(2, 3) = BR_SCALAR(0.f);
 
    A(3, 0) = B(3, 0);
 
    A(3, 1) = B(3, 1);
 
    A(3, 2) = B(3, 2);
 
    A(3, 3) = BR_SCALAR(1.f);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Mul34(br_matrix4 *A, br_matrix34 *B, br_matrix4 *C)
 
void BrMatrix4Mul34(br_matrix4* A, br_matrix34* B, br_matrix4* C) {
 
    LOG_TRACE("(%p, %p, %p)", A, B, C);
 
 
 
    A(0, 0) = BR_MAC3(B(0, 0), C(0, 0), B(0, 1), C(1, 0), B(0, 2), C(2, 0));
 
    A(0, 1) = BR_MAC3(B(0, 0), C(0, 1), B(0, 1), C(1, 1), B(0, 2), C(2, 1));
 
    A(0, 2) = BR_MAC3(B(0, 0), C(0, 2), B(0, 1), C(1, 2), B(0, 2), C(2, 2));
 
    A(0, 3) = BR_MAC3(B(0, 0), C(0, 3), B(0, 1), C(1, 3), B(0, 2), C(2, 3));
 
    A(1, 0) = BR_MAC3(B(1, 0), C(0, 0), B(1, 1), C(1, 0), B(1, 2), C(2, 0));
 
    A(1, 1) = BR_MAC3(B(1, 0), C(0, 1), B(1, 1), C(1, 1), B(1, 2), C(2, 1));
 
    A(1, 2) = BR_MAC3(B(1, 0), C(0, 2), B(1, 1), C(1, 2), B(1, 2), C(2, 2));
 
    A(1, 3) = BR_MAC3(B(1, 0), C(0, 3), B(1, 1), C(1, 3), B(1, 2), C(2, 3));
 
    A(2, 0) = BR_MAC3(B(2, 0), C(0, 0), B(2, 1), C(1, 0), B(2, 2), C(2, 0));
 
    A(2, 1) = BR_MAC3(B(2, 0), C(0, 1), B(2, 1), C(1, 1), B(2, 2), C(2, 1));
 
    A(2, 2) = BR_MAC3(B(2, 0), C(0, 2), B(2, 1), C(1, 2), B(2, 2), C(2, 2));
 
    A(2, 3) = BR_MAC3(B(2, 0), C(0, 3), B(2, 1), C(1, 3), B(2, 2), C(2, 3));
 
    A(3, 0) = BR_MAC3(B(3, 0), C(0, 0), B(3, 1), C(1, 0), B(3, 2), C(2, 0)) + C(3, 0);
 
    A(3, 1) = BR_MAC3(B(3, 0), C(0, 1), B(3, 1), C(1, 1), B(3, 2), C(2, 1)) + C(3, 1);
 
    A(3, 2) = BR_MAC3(B(3, 0), C(0, 2), B(3, 1), C(1, 2), B(3, 2), C(2, 2)) + C(3, 2);
 
    A(3, 3) = BR_MAC3(B(3, 0), C(0, 3), B(3, 1), C(1, 3), B(3, 2), C(2, 3)) + C(3, 3);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4Pre34(br_matrix4 *A, br_matrix34 *B)
 
void BrMatrix4Pre34(br_matrix4* A, br_matrix34* B) {
 
    br_matrix4 C;
 
    LOG_TRACE("(%p, %p)", A, B);
 
 
 
    BrMatrix4Mul34(A, B, &C);
 
}
 
 
 
// IDA: void __cdecl BrMatrix4ShearZ(br_matrix4 *mat, br_scalar sx, br_scalar sy)
 
void BrMatrix4ShearZ(br_matrix4* mat, br_scalar sx, br_scalar sy) {
 
    LOG_TRACE("(%p, %f, %f)", mat, sx, sy);
 
 
 
    M(0, 0) = BR_SCALAR(1.f);
 
    M(0, 1) = BR_SCALAR(0.f);
 
    M(0, 2) = BR_SCALAR(0.f);
 
    M(0, 3) = BR_SCALAR(0.f);
 
    M(1, 0) = BR_SCALAR(0.f);
 
    M(1, 1) = BR_SCALAR(1.f);
 
    M(1, 2) = BR_SCALAR(0.f);
 
    M(1, 3) = BR_SCALAR(0.f);
 
    M(2, 0) = sx;
 
    M(2, 1) = sy;
 
    M(2, 2) = BR_SCALAR(1.f);
 
    M(2, 3) = BR_SCALAR(0.f);
 
    M(3, 0) = BR_SCALAR(0.f);
 
    M(3, 1) = BR_SCALAR(0.f);
 
    M(3, 2) = BR_SCALAR(0.f);
 
    M(3, 3) = BR_SCALAR(1.f);
 
}