mirror of
https://github.com/zeldaret/ss
synced 2026-06-20 16:01:13 -04:00
9c3c480b24
* 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
200 lines
6.5 KiB
C++
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
|