pokediamond/include/nitro/NNS_g3d.h
2023-07-09 09:34:49 +01:00

87 lines
2.7 KiB
C

#ifndef GUARD_NNS_G3D_H
#define GUARD_NNS_G3D_H
#include "fx.h"
typedef enum
{
NNS_G3D_GLB_FLAG_FLUSH_WVP = 0x00000001,
NNS_G3D_GLB_FLAG_FLUSH_VP = 0x00000002,
NNS_G3D_GLB_FLAG_INVBASE_UPTODATE = 0x00000004,
NNS_G3D_GLB_FLAG_INVCAMERA_UPTODATE = 0x00000008,
NNS_G3D_GLB_FLAG_INVPROJ_UPTODATE = 0x00000010,
NNS_G3D_GLB_FLAG_INVBASECAMERA_UPTODATE = 0x00000020,
NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE = 0x00000040,
NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE = 0x00000080,
NNS_G3D_GLB_FLAG_SRTCAMERA_UPTODATE = NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE,
NNS_G3D_GLB_FLAG_FLUSH_ALT = NNS_G3D_GLB_FLAG_FLUSH_WVP
}
NNSG3dGlbFlag;
typedef struct
{
/*0x000*/ u32 cmd0;
/*0x004*/ u32 mtxmode_proj;
/*0x008*/ MtxFx44 projMtx;
/*0x048*/ u32 mtxmode_posvec;
/*0x04C*/ MtxFx43 cameraMtx;
/*0x07C*/ u32 cmd1;
/*0x080*/ u32 lightVec[4];
/*0x090*/ u32 cmd2;
/*0x094*/ u32 prmMatColor0;
/*0x098*/ u32 prmMatColor1;
/*0x09C*/ u32 prmPolygonAttr;
/*0x0A0*/ u32 prmViewPort;
/*0x0A4*/ u32 cmd3;
/*0x0A8*/ u32 lightColor[4];
/*0x0B8*/ u32 cmd4;
/*0x0BC*/ MtxFx33 prmBaseRot;
/*0x0E0*/ VecFx32 prmBaseTrans;
/*0x0EC*/ VecFx32 prmBaseScale;
/*0x0F8*/ u32 prmTexImageParam;
/*0x0FC*/ u32 flag;
/*0x100*/ MtxFx43 invCameraMtx;
/*0x130*/ MtxFx43 srtCameraMtx;
/*0x160*/ MtxFx43 invSrtCameraMtx;
/*0x190*/ MtxFx43 invBaseMtx;
/*0x1C0*/ MtxFx44 invProjMtx;
/*0x200*/ MtxFx44 invCameraProjMtx;
/*0x240*/ VecFx32 camPos;
/*0x24C*/ VecFx32 camUp;
/*0x258*/ VecFx32 camTarget;
}
NNSG3dGlb;
extern NNSG3dGlb NNS_G3dGlb;
static inline void NNS_G3dGlbLookAt(const VecFx32 *camPos, const VecFx32 *camUp, const VecFx32 *camTarget) {
NNS_G3dGlb.camPos = *camPos;
NNS_G3dGlb.camUp = *camUp;
NNS_G3dGlb.camTarget = *camTarget;
MTX_LookAt(camPos, camUp, camTarget, &NNS_G3dGlb.cameraMtx);
NNS_G3dGlb.flag &= ~(NNS_G3D_GLB_FLAG_INVCAMERA_UPTODATE | NNS_G3D_GLB_FLAG_INVBASECAMERA_UPTODATE | NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE | NNS_G3D_GLB_FLAG_BASECAMERA_UPTODATE);
}
static inline void NNS_G3dGlbPerspective(fx32 fovySin, fx32 fovyCos, fx32 aspect, fx32 n, fx32 f) {
MTX_Perspective(fovySin, fovyCos, aspect, n, f, &NNS_G3dGlb.projMtx);
NNS_G3dGlb.flag &= ~(NNS_G3D_GLB_FLAG_INVPROJ_UPTODATE | NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE);
}
static inline void NNS_G3dGlbOrtho(fx32 t, fx32 b, fx32 l, fx32 r, fx32 n, fx32 f) {
MTX_Ortho(t, b, l, r, n, f, &NNS_G3dGlb.projMtx);
NNS_G3dGlb.flag &= ~(NNS_G3D_GLB_FLAG_INVPROJ_UPTODATE | NNS_G3D_GLB_FLAG_INVCAMERAPROJ_UPTODATE);
}
#endif //GUARD_NNS_G3D_H