1#pragma once
2
3#include <math/seadMatrix.h>
4#include <math/seadQuat.h>
5#include <math/seadVector.h>
6
7namespace nn::util::neon {
8struct MatrixColumnMajor4x3fType;
9struct MatrixColumnMajor4x4fType;
10} // namespace nn::util::neon
11
12namespace al {
13
14template <typename T>
15struct Matrix43 {
16 T m[3][4];
17};
18
19using Matrix43f = Matrix43<f32>;
20
21void makeMtxRotateTrans(sead::Matrix34f* outMtx, const sead::Vector3f& rotate,
22 const sead::Vector3f& trans);
23void makeMtxFromTwoAxis(sead::Matrix34f* outMtx, const sead::Vector3f& vectorA,
24 const sead::Vector3f& vectorB, s32 axisA, s32 axisB);
25void makeMtxFrontUp(sead::Matrix34f* outMtx, const sead::Vector3f& front, const sead::Vector3f& up);
26void makeMtxFrontSide(sead::Matrix34f* outMtx, const sead::Vector3f& front,
27 const sead::Vector3f& side);
28void makeMtxUpFront(sead::Matrix34f* outMtx, const sead::Vector3f& up, const sead::Vector3f& front);
29void makeMtxUpSide(sead::Matrix34f* outMtx, const sead::Vector3f& up, const sead::Vector3f& side);
30void makeMtxSideUp(sead::Matrix34f* outMtx, const sead::Vector3f& side, const sead::Vector3f& up);
31void makeMtxSideFront(sead::Matrix34f* outMtx, const sead::Vector3f& side,
32 const sead::Vector3f& front);
33void makeMtxFrontNoSupport(sead::Matrix34f* outMtx, const sead::Vector3f& front);
34void makeMtxFrontNoSupportPos(sead::Matrix34f* outMtx, const sead::Vector3f& front,
35 const sead::Vector3f& pos);
36void makeMtxUpNoSupport(sead::Matrix34f* outMtx, const sead::Vector3f& up);
37void makeMtxUpNoSupportPos(sead::Matrix34f* outMtx, const sead::Vector3f& up,
38 const sead::Vector3f& pos);
39void makeMtxSideNoSupport(sead::Matrix34f* outMtx, const sead::Vector3f& side);
40void makeMtxSideNoSupportPos(sead::Matrix34f* outMtx, const sead::Vector3f& side,
41 const sead::Vector3f& pos);
42void makeMtxQuatPos(sead::Matrix34f* outMtx, const sead::Quatf& quat, const sead::Vector3f& pos);
43void makeMtxQuatScalePos(sead::Matrix34f* outMtx, const sead::Quatf& quat,
44 const sead::Vector3f& scale, const sead::Vector3f& pos);
45void makeMtxQuatScalePos(sead::Matrix44f* outMtx, const sead::Quatf& quat,
46 const sead::Vector3f& scale, const sead::Vector3f& pos);
47void makeMtxFrontUpPos(sead::Matrix34f* outMtx, const sead::Vector3f& front,
48 const sead::Vector3f& up, const sead::Vector3f& pos);
49void makeMtxFrontSidePos(sead::Matrix34f* outMtx, const sead::Vector3f& front,
50 const sead::Vector3f& side, const sead::Vector3f& pos);
51void makeMtxUpFrontPos(sead::Matrix34f* outMtx, const sead::Vector3f& up,
52 const sead::Vector3f& front, const sead::Vector3f& pos);
53void makeMtxUpSidePos(sead::Matrix34f* outMtx, const sead::Vector3f& up, const sead::Vector3f& side,
54 const sead::Vector3f& pos);
55void makeMtxSideUpPos(sead::Matrix34f* outMtx, const sead::Vector3f& side, const sead::Vector3f& up,
56 const sead::Vector3f& pos);
57void makeMtxSideFrontPos(sead::Matrix34f* outMtx, const sead::Vector3f& side,
58 const sead::Vector3f& front, const sead::Vector3f& pos);
59void makeMtxFollowTarget(sead::Matrix34f* outMtx, const sead::Matrix34f& baseMtx,
60 const sead::Vector3f& trans, const sead::Vector3f& rotate);
61void makeMtxProj(sead::Matrix44f*, const sead::Vector2f&, const sead::Vector3f&,
62 const sead::Vector3f&);
63void makeMtxProjFromQuatPoseUp(sead::Matrix44f*, const sead::Quatf&, const sead::Vector2f&,
64 const sead::Vector3f&);
65void makeMtxProjFromQuatPoseFront(sead::Matrix44f*, const sead::Quatf&, const sead::Vector2f&,
66 const sead::Vector3f&);
67void makeMtxProjFromQuatPoseSide(sead::Matrix44f*, const sead::Quatf&, const sead::Vector2f&,
68 const sead::Vector3f&);
69void makeMtxProjFromUp(sead::Matrix44f*, const sead::Vector2f&, const sead::Vector3f&);
70
71void rotateMtxXDirDegree(sead::Matrix34f* outMtx, const sead::Matrix34f& baseMtx, f32 angle);
72void rotateMtxYDirDegree(sead::Matrix34f* outMtx, const sead::Matrix34f& baseMtx, f32 angle);
73void rotateMtxZDirDegree(sead::Matrix34f* outMtx, const sead::Matrix34f& baseMtx, f32 angle);
74void rotateMtxCenterPosXDirDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&,
75 f32);
76void rotateMtxCenterPosAxisDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&,
77 const sead::Vector3f&, f32);
78void rotateMtxCenterPosYDirDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&,
79 f32);
80void rotateMtxCenterPosZDirDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&,
81 f32);
82void rotateMtxCenterPosQuat(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&,
83 const sead::Quatf&);
84
85bool turnMtxXDirDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&, f32);
86bool turnMtxYDirDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&, f32);
87bool turnMtxZDirDegree(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&, f32);
88
89void calcCameraPosFromViewMtx(sead::Vector3f*, const sead::Matrix34f&);
90void calcMtxMul(sead::Vector3f*, const sead::Matrix34f&, const sead::Vector3f&);
91void calcMtxMul(sead::Vector3f*, const Matrix43f&, const sead::Vector3f&);
92void calcMtxScale(sead::Vector3f* outMtx, const sead::Matrix34f& mtx);
93void calcMtxScale(sead::Vector3f* outMtx, const Matrix43f& mtx);
94void normalizeMtxScale(sead::Matrix34f* outMtx, const sead::Matrix34f& mtx);
95bool tryNormalizeMtxScaleOrIdentity(sead::Matrix34f* outMtx, const sead::Matrix34f& mtx);
96void calcMtxLocalTrans(sead::Vector3f*, const sead::Matrix34f&, const sead::Vector3f&);
97void calcTransLocalOffsetByMtx(sead::Vector3f*, const sead::Matrix34f&, const sead::Vector3f&);
98void preScaleMtx(sead::Matrix34f* outMtx, const sead::Vector3f& scale);
99void addTransMtxLocalOffset(sead::Matrix34f*, const sead::Matrix34f&, const sead::Vector3f&);
100
101void blendMtx(sead::Matrix34f*, const sead::Matrix34f&, const sead::Matrix34f&, f32);
102void blendMtxRotate(sead::Matrix34f*, const sead::Matrix34f&, const sead::Matrix34f&, f32);
103void blendMtxTrans(sead::Matrix34f*, const sead::Matrix34f&, const sead::Matrix34f&, f32);
104
105f32 calcMtxLocalDirAngleOnPlaneToTarget(const sead::Matrix34f*, const sead::Vector3f&, s32, s32);
106f32 calcMtxLocalDirAngleOnPlaneToDir(const sead::Matrix34f*, const sead::Vector3f&, s32, s32);
107bool calcRotAxisOrZero(sead::Vector3f*, const sead::Matrix34f&);
108void calcMxtInvertOrtho(sead::Matrix34f*, const sead::Matrix34f&);
109void calcNearFarByInvProjection(f32*, f32*, const sead::Matrix44f&);
110void calcMovedInertiaTensor(sead::Matrix33f*, const sead::Matrix33f&, const sead::Vector3f&, f32);
111void calcInertiaTensorByMovedTensorAndCenter(sead::Matrix33f*, const sead::Matrix33f&,
112 const sead::Vector3f&, f32);
113void calcInertiaTensorSphere(sead::Matrix33f*, f32, f32);
114void calcInertiaTensorBox(sead::Matrix33f*, const sead::Vector3f&, f32);
115
116void makeMtx34f(sead::Matrix34f*, const nn::util::neon::MatrixColumnMajor4x3fType&);
117void makeMtx44f(sead::Matrix44f*, const nn::util::neon::MatrixColumnMajor4x4fType&);
118
119} // namespace al
120