#ifndef _MATRIX4_H_
#define _MATRIX4_H_
#include "brender/br_types.h"
void BrMatrix4Copy(br_matrix4* A, br_matrix4* B);
void BrMatrix4Mul(br_matrix4* A, br_matrix4* B, br_matrix4* C);
void BrMatrix4Identity(br_matrix4* mat);
void BrMatrix4Scale(br_matrix4* mat, br_scalar sx, br_scalar sy, br_scalar sz);
br_scalar BrMatrix4Inverse(br_matrix4* A, br_matrix4* B);
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);
br_scalar BrMatrix4Determinant(br_matrix4* mat);
void BrMatrix4Adjoint(br_matrix4* A, br_matrix4* B);
void BrMatrix4Perspective(br_matrix4* mat, br_angle field_of_view, br_scalar aspect, br_scalar hither, br_scalar yon);
void BrMatrix4Apply(br_vector4* A, br_vector4* B, br_matrix4* C);
void BrMatrix4ApplyP(br_vector4* A, br_vector3* B, br_matrix4* C);
void BrMatrix4ApplyV(br_vector4* A, br_vector3* B, br_matrix4* C);
void BrMatrix4TApply(br_vector4* A, br_vector4* B, br_matrix4* C);
void BrMatrix4TApplyP(br_vector4* A, br_vector3* B, br_matrix4* C);
void BrMatrix4TApplyV(br_vector4* A, br_vector3* B, br_matrix4* C);
void BrMatrix4Copy34(br_matrix4* A, br_matrix34* B);
void BrMatrix4Mul34(br_matrix4* A, br_matrix34* B, br_matrix4* C);
void BrMatrix4Pre34(br_matrix4* A, br_matrix34* B);
void BrMatrix4ShearZ(br_matrix4* mat, br_scalar sx, br_scalar sy);
#endif