2024-09-07 04:26:47 +00:00
|
|
|
#ifndef SYS_MATRIX_H
|
|
|
|
#define SYS_MATRIX_H
|
|
|
|
|
|
|
|
#include "z64math.h"
|
|
|
|
|
|
|
|
struct GraphicsContext;
|
|
|
|
struct GameState;
|
|
|
|
|
|
|
|
typedef enum MatrixMode {
|
|
|
|
/* 0 */ MTXMODE_NEW, // generates a new matrix
|
|
|
|
/* 1 */ MTXMODE_APPLY // applies transformation to the current matrix
|
|
|
|
} MatrixMode;
|
|
|
|
|
|
|
|
extern Mtx gMtxClear;
|
|
|
|
extern MtxF gMtxFClear;
|
|
|
|
|
|
|
|
/* Stack operations */
|
|
|
|
|
|
|
|
void Matrix_Init(struct GameState* gameState);
|
|
|
|
void Matrix_Push(void);
|
|
|
|
void Matrix_Pop(void);
|
|
|
|
void Matrix_Get(MtxF* dest);
|
|
|
|
void Matrix_Put(MtxF* src);
|
|
|
|
|
|
|
|
/* Basic operations */
|
|
|
|
|
|
|
|
void Matrix_Mult(MtxF* mf, u8 mode);
|
|
|
|
void Matrix_Translate(f32 x, f32 y, f32 z, u8 mode);
|
|
|
|
void Matrix_Scale(f32 x, f32 y, f32 z, u8 mode);
|
|
|
|
void Matrix_RotateX(f32 x, u8 mode);
|
|
|
|
void Matrix_RotateY(f32 y, u8 mode);
|
|
|
|
void Matrix_RotateZ(f32 z, u8 mode);
|
|
|
|
|
|
|
|
/* Compound operations */
|
|
|
|
|
|
|
|
void Matrix_RotateZYX(s16 x, s16 y, s16 z, u8 mode);
|
|
|
|
void Matrix_TranslateRotateZYX(Vec3f* translation, Vec3s* rotation);
|
|
|
|
void Matrix_SetTranslateRotateYXZ(f32 translateX, f32 translateY, f32 translateZ, Vec3s* rot);
|
|
|
|
void Matrix_SetTranslateScaleMtx2(Mtx* mtx, f32 scaleX, f32 scaleY, f32 scaleZ, f32 translateX, f32 translateY,
|
|
|
|
f32 translateZ);
|
|
|
|
|
|
|
|
/* Conversion and allocation operations */
|
|
|
|
|
|
|
|
Mtx* Matrix_MtxFToMtx(MtxF* src, Mtx* dest);
|
|
|
|
|
|
|
|
#if OOT_DEBUG
|
|
|
|
|
|
|
|
Mtx* Matrix_ToMtx(Mtx* dest, const char* file, int line);
|
2024-09-11 07:59:23 +00:00
|
|
|
Mtx* Matrix_Finalize(struct GraphicsContext* gfxCtx, const char* file, int line);
|
2024-09-07 04:26:47 +00:00
|
|
|
MtxF* Matrix_CheckFloats(MtxF* mf, const char* file, int line);
|
|
|
|
|
|
|
|
#define MATRIX_TO_MTX(gfxCtx, file, line) Matrix_ToMtx(gfxCtx, file, line)
|
2024-09-11 07:59:23 +00:00
|
|
|
#define MATRIX_FINALIZE(gfxCtx, file, line) Matrix_Finalize(gfxCtx, file, line)
|
2024-09-07 04:26:47 +00:00
|
|
|
#define MATRIX_CHECK_FLOATS(mtx, file, line) Matrix_CheckFloats(mtx, file, line)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
Mtx* Matrix_ToMtx(Mtx* dest);
|
2024-09-11 07:59:23 +00:00
|
|
|
Mtx* Matrix_Finalize(struct GraphicsContext* gfxCtx);
|
2024-09-07 04:26:47 +00:00
|
|
|
|
|
|
|
#define MATRIX_TO_MTX(gfxCtx, file, line) Matrix_ToMtx(gfxCtx)
|
2024-09-11 07:59:23 +00:00
|
|
|
#define MATRIX_FINALIZE(gfxCtx, file, line) Matrix_Finalize(gfxCtx)
|
2024-09-07 04:26:47 +00:00
|
|
|
#define MATRIX_CHECK_FLOATS(mtx, file, line) (mtx)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Vector operations */
|
|
|
|
|
|
|
|
void Matrix_MultVec3f(Vec3f* src, Vec3f* dest);
|
|
|
|
void Matrix_MultVec3fExt(Vec3f* src, Vec3f* dest, MtxF* mf);
|
|
|
|
|
|
|
|
/* Copy and another conversion */
|
|
|
|
|
|
|
|
void Matrix_MtxFCopy(MtxF* dest, MtxF* src);
|
|
|
|
void Matrix_MtxToMtxF(Mtx* src, MtxF* dest);
|
|
|
|
|
|
|
|
/* Miscellaneous */
|
|
|
|
|
|
|
|
void Matrix_Transpose(MtxF* mf);
|
|
|
|
void Matrix_ReplaceRotation(MtxF* mf);
|
|
|
|
void Matrix_MtxFToYXZRotS(MtxF* mf, Vec3s* rotDest, s32 flag);
|
|
|
|
void Matrix_MtxFToZYXRotS(MtxF* mf, Vec3s* rotDest, s32 flag);
|
|
|
|
void Matrix_RotateAxis(f32 angle, Vec3f* axis, u8 mode);
|
|
|
|
|
|
|
|
#endif
|