Files
ss/include/nw4r/g3d/g3d_state.h
T
Elijah Thomas 9c3c480b24 g3d source (#123)
* g3d_calcvtx

GetData seems to have changed -> dwarf says r is a local and using ofs_to_ptr didnt work

* g3d_light and g3d_fog

sdata2 splits and func ordering

* g3d_scnproc

* g3d_init

* g3d_scnmdl

* g3d_scnmdlsmpl

* g3d_scnroot

* g3d_scnobj

* g3d_res* progress

* g3d_resmdl OK

* g3d_restev OK

* g3d_resmat OK

* g3d_resvtx and g3d_restex OK

* g3d_resnode OK

* g3d_resanm OK

* g3d_resanmchr Progress

* the rest of g3d_res* OK

* g3d_anmvis OK

* g3d_anmclr OK

* Some Splitting

* more OK, Inline Issue in g3d_anmtexsrt

* g3d_obj, g3d_anmobj, g3d_gpu, g3d_tmem, g3d_cpu OK

* g3d_state OK

* g3d/dcc OK

* Include fixup

* More Fixups

* g3d_camera OK

* g3d_draw OK

* g3d_calcworld OK

* g3d_calcworld actually OK

* g3d_workmem, g3d_dcc OK

* g3d_calcview OK

* g3d_anmtexsrt OK with DONT_INLINE

* g3d_transform OK (Feels Cheaty)

* g3d_resanmchr OK

* g3d_draw1mat1shp Close

* g3d_draw1mat1shp OK (Thanks Lago!). Ran symbol applying script
2025-03-16 11:26:15 -04:00

200 lines
6.5 KiB
C++

#ifndef NW4R_G3D_STATE_H
#define NW4R_G3D_STATE_H
#include <nw4r/types_nw4r.h>
#include "nw4r/g3d/g3d_camera.h"
#include "nw4r/g3d/g3d_fog.h"
#include "nw4r/g3d/res/g3d_resmat.h"
#include "nw4r/math.h" // IWYU pragma: export
#include "rvl/GX.h" // IWYU pragma: export
namespace nw4r {
namespace g3d {
namespace detail {
/******************************************************************************
*
* ScnDependentMtxFunc
*
******************************************************************************/
namespace ScnDependentMtxFunc {
void EnvironmentMapping(math::MTX34 *pMtx, s8 camRef, s8 lightRef);
void ProjectionMapping(math::MTX34 *pMtx, s8 camRef, s8 lightRef);
void EnvironmentSpecularMapping(math::MTX34 *pMtx, s8 camRef, s8 lightRef);
void DefaultMapping(math::MTX34 *pMtx, s8 camRef, s8 lightRef);
} // namespace ScnDependentMtxFunc
} // namespace detail
/******************************************************************************
*
* G3DState
*
******************************************************************************/
namespace G3DState {
static const int NUM_LIGHT = 128;
static const int NUM_LIGHT_SET = 128;
static const int NUM_LIGHT_IN_LIGHT_SET = 8;
static const int NUM_CAMERA = 32;
static const int NUM_FOG = 32;
static const int NUM_SCNDEPENDENT_TEXMTX_FUNCTYPE = 256;
enum InvalidateFlag {
INVALIDATE_TEX = (1 << 0),
INVALIDATE_TLUT = (1 << 1),
INVALIDATE_TEV = (1 << 2),
INVALIDATE_GENMODE = (1 << 3),
INVALIDATE_SHP = (1 << 4),
INVALIDATE_CURRMTX = (1 << 5),
INVALIDATE_TEXMTX = (1 << 6),
INVALIDATE_MISC = (1 << 7),
INVALIDATE_FOG = (1 << 8),
INVALIDATE_LIGHT = (1 << 9),
INVALIDATE_POSMTX = (1 << 10),
INVALIDATE_ALL = INVALIDATE_TEX | INVALIDATE_TLUT | INVALIDATE_TEV | INVALIDATE_GENMODE | INVALIDATE_SHP |
INVALIDATE_CURRMTX | INVALIDATE_TEXMTX | INVALIDATE_MISC | INVALIDATE_FOG | INVALIDATE_LIGHT |
INVALIDATE_POSMTX
};
enum ScnDependentTexMtxFuncType {
SCNDEPENDENT_TEXMTX_FUNCTYPE_SRC_TEXCOORD,
SCNDEPENDENT_TEXMTX_FUNCTYPE_SRC_NRM,
SCNDEPENDENT_TEXMTX_FUNCTYPE_SRC_POS,
SCNDEPENDENT_TEXMTX_FUNCTYPE_SRC_COLOR,
MAX_SCNDEPENDENT_TEXMTX_FUNCTYPE,
SCNDEPENDENT_TEXMTX_FUNCTYPE_TEXMTX_NOT_EXIST = SCNDEPENDENT_TEXMTX_FUNCTYPE_SRC_TEXCOORD,
};
typedef void (*ScnDependentTexMtxFuncPtr)(math::MTX34 *pMtx, s8 camRef, s8 lightRef);
/******************************************************************************
*
* IndTexMtxInfo
*
******************************************************************************/
struct IndTexMtxInfo {
u32 flag; // at 0x0
math::MTX34 offset_mtx[GX_ITM_2 - GX_ITM_0 + 1]; // at 0x4
IndTexMtxInfo() : flag(0) {}
explicit IndTexMtxInfo(const ResMatIndMtxAndScale ind);
void FifoSend() const;
void SetMtx(GXIndTexMtxID id, const math::MTX34 &rMtx);
};
/******************************************************************************
*
* IndMtxOp
*
******************************************************************************/
class IndMtxOp {
public:
virtual void operator()(IndTexMtxInfo *pInfo) = 0; // at 0x8
virtual ~IndMtxOp() {} // at 0xC
virtual void Reset() = 0; // at 0x10
virtual void SetNrmMapMtx(
GXIndTexMtxID id, const math::VEC3 *pLightVec, const math::MTX34 *pNrmMtx,
ResMatMiscData::IndirectMethod method
) = 0; // at 0x14
};
/******************************************************************************
*
* IndMtxOpStd
*
******************************************************************************/
class IndMtxOpStd : public IndMtxOp {
public:
IndMtxOpStd();
virtual void operator()(IndTexMtxInfo *pInfo); // at 0x8
virtual ~IndMtxOpStd() {} // at 0xC
virtual void Reset(); // at 0x10
virtual void SetNrmMapMtx(
GXIndTexMtxID id, const math::VEC3 *pLightVec, const math::MTX34 *pNrmMtx,
ResMatMiscData::IndirectMethod method
); // at 0x14
private:
bool mIsValidMtx[GX_ITM_2 - GX_ITM_0 + 1]; // at 0x4
u8 PADDING_0x7; // at 0x7
math::MTX34 mIndMtx[GX_ITM_2 - GX_ITM_0 + 1]; // at 0x8
};
/******************************************************************************
*
* Functions
*
******************************************************************************/
void LoadResMatMisc(const ResMatMisc misc);
void LoadResTexObj(const ResTexObj texObj);
void LoadResTlutObj(const ResTlutObj tlutObj);
void LoadResGenMode(const ResGenMode mode);
void LoadResTev(const ResTev tev);
void LoadResMatPix(const ResMatPix pix);
void LoadResMatTevColor(const ResMatTevColor color);
void LoadResMatIndMtxAndScale(const ResMatIndMtxAndScale ind);
void LoadResMatIndMtxAndScale(const ResMatIndMtxAndScale ind, IndMtxOp &rOp);
void LoadResMatChan(
const ResMatChan chan, u32 maskDiffColor, u32 maskDiffAlpha, u32 maskSpecColor, u32 maskSpecAlpha, GXColor amb,
bool lightOff
);
void LoadResMatTexCoordGen(const ResMatTexCoordGen gen);
void LoadResTexSrt(const ResTexSrt srt);
void LoadResShpPrePrimitive(const ResShp shp);
void LoadResShpPrimitive(const ResShp shp, const math::MTX34 *pViewPos, const math::MTX34 *pViewNrm);
void SetViewPosNrmMtxArray(
const math::MTX34 *pViewPosMtxArray, const math::MTX33 *pViewNrmMtxArray, const math::MTX34 *pViewEnvTexMtxArray
);
const math::MTX33 *GetViewNrmMtxPtr(u32 id);
void SetScnDependentTexMtxFunc(u32 id, ScnDependentTexMtxFuncPtr func, ScnDependentTexMtxFuncType type);
bool GetScnDependentTexMtxFunc(u32 id, ScnDependentTexMtxFuncPtr *pFunc, ScnDependentTexMtxFuncType *pType);
IndMtxOp *GetIndMtxOp();
void SetFog(const Fog fog, int id);
void LoadFog(int id);
void SetLightSetting(const LightSetting &rSetting);
const LightObj *GetLightObj(int id);
void LoadLightSet(
int id, u32 *pDiffColorMask, u32 *pDiffAlphaMask, u32 *pSpecColorMask, u32 *pSpecAlphaMask, AmbLightObj *pAmb
);
void LoadLightSet(int id, u32 *pDiffMask, u32 *pSpecMask, AmbLightObj *pAmb);
void SetCameraProjMtx(const Camera &rCam, int id, bool view);
const math::MTX34 *GetCameraMtxPtr();
const math::MTX34 *GetInvCameraMtxPtr();
const math::MTX34 *GetCameraMtxPtr(int id);
const math::MTX34 *GetProjectionTexMtxPtr();
const math::MTX34 *GetProjectionTexMtxPtr(int id);
const math::MTX34 *GetEnvironmentTexMtxPtr();
void SetRenderModeObj(const GXRenderModeObj &rObj);
const GXRenderModeObj *GetRenderModeObj();
void Invalidate(u32 flag = INVALIDATE_ALL);
} // namespace G3DState
} // namespace g3d
} // namespace nw4r
#endif