Files
ss/include/nw4r/lyt/lyt_material.h
T
Elijah Thomas 26af4db82d update from dtk-template - clangd :) (#66)
* update from dtk-template and start work towards using clangd

* include <a> -> "a"

* Update build.yml

* remove/add non-trivial class in union warning
2024-10-16 15:36:02 -04:00

220 lines
6.8 KiB
C++

#ifndef NW4R_LYT_MATERIAL_H
#define NW4R_LYT_MATERIAL_H
#include "nw4r/lyt/lyt_animation.h"
#include "nw4r/lyt/lyt_resources.h"
#include "nw4r/lyt/lyt_texMap.h"
#include "nw4r/ut/ut_Color.h"
#include "nw4r/ut/ut_LinkList.h"
#include "rvl/GX.h" // IWYU pragma: export
namespace nw4r {
namespace lyt {
class Material {
public:
Material();
Material(const res::Material *pRes, const ResBlockSet &resBlockSet);
void Init();
static void InitBitGXNums(detail::BitGXNums *ptr);
void ReserveGXMem(
u8 texMapNum, u8 texSRTNum, u8 texCoordGenNum, u8 tevStageNum, bool allocTevSwap, u8 indStageNum, u8 indSRTNum,
bool allocChanCtrl, bool allocMatCol, bool allocAlpComp, bool allocBlendMode
);
const TexMap *GetTexMapAry() const;
TexMap *GetTexMapAry();
const TexSRT *GetTexSRTAry() const;
TexSRT *GetTexSRTAry();
const TexCoordGen *GetTexCoordGenAry() const;
TexCoordGen *GetTexCoordGenAry();
const ChanCtrl *GetChanCtrlAry() const;
ChanCtrl *GetChanCtrlAry();
const ut::Color *GetMatColAry() const;
ut::Color *GetMatColAry();
const TevSwapMode *GetTevSwapAry() const;
TevSwapMode *GetTevSwapAry();
const AlphaCompare *GetAlphaComparePtr() const;
AlphaCompare *GetAlphaComparePtr();
const BlendMode *GetBlendModePtr() const;
BlendMode *GetBlendModePtr();
const IndirectStage *GetIndirectStageAry() const;
IndirectStage *GetIndirectStageAry();
const TexSRT *GetIndTexSRTAry() const;
TexSRT *GetIndTexSRTAry();
const TevStage *GetTevStageAry() const;
TevStage *GetTevStageAry();
void SetName(const char *name);
void SetTextureNum(u8 val);
void SetTexCoordGenNum(u8 val);
void SetTevStageNum(u8 val);
void SetIndStageNum(u8 val);
s16 GetColorElement(u32 colorType);
void SetColorElement(u32 colorType, s16 value);
void AddAnimationLink(AnimationLink *pAnimationLink);
// IsBlendModeCap__Q34nw4r3lyt8MaterialCFv
bool IsBlendModeCap() const {
return mGXMemCap.blendMode;
}
// IsAlphaCompareCap__Q34nw4r3lyt8MaterialCFv
bool IsAlphaCompareCap() const {
return mGXMemCap.alpComp;
}
// IsTevSwapCap__Q34nw4r3lyt8MaterialCFv
bool IsTevSwapCap() const {
return mGXMemCap.tevSwap;
}
// IsMatColorCap__Q34nw4r3lyt8MaterialCFv
bool IsMatColorCap() const {
return mGXMemCap.matCol;
}
// IsChanCtrlCap__Q34nw4r3lyt8MaterialCFv
bool IsChanCtrlCap() const {
return mGXMemCap.chanCtrl;
}
// SetTexSRTElement__Q34nw4r3lyt8MaterialFUlUlf
void SetTexSRTElement(u32 texSRTIdx, u32 eleIdx, f32 value) {
f32 *srtAry = (f32 *)&(GetTexSRTAry()[texSRTIdx]);
srtAry[eleIdx] = value;
}
// GetTexturePtr__Q34nw4r3lyt8MaterialFUc
TexMap *GetTexturePtr(u8 idx) {
return &GetTexMapAry()[idx];
}
// GetTexSRTCap__Q34nw4r3lyt8MaterialCFv
u8 GetTexSRTCap() const {
return mGXMemCap.texSRT;
}
// GetIndTexSRTCap__Q34nw4r3lyt8MaterialCFv
u8 GetIndTexSRTCap() const {
return mGXMemCap.indSRT;
}
// SetIndTexSRTElement__Q34nw4r3lyt8MaterialFUlUlf
void SetIndTexSRTElement(u32 texSRTIdx, u32 eleIdx, f32 value) {
f32 *srtAry = (f32 *)&(GetIndTexSRTAry()[texSRTIdx]);
srtAry[eleIdx] = value;
}
ut::LinkList<AnimationLink, 0> *GetAnimationList() {
return &mAnimList;
}
bool IsUserAllocated() const {
return mbUserAllocated;
}
const char *GetName() const {
return mName;
}
u8 GetTexCoordGenCap() const {
return mGXMemCap.texCoordGen;
}
u8 GetTexCoordGenNum() const {
return mGXMemNum.texCoordGen;
}
u8 GetTextureCap() const {
return mGXMemCap.texMap;
}
u8 GetTextureNum() const {
return mGXMemNum.texMap;
}
GXColorS10 GetTevColor(u32 idx) const {
return mTevCols[idx];
}
ut::Color GetTevKColor(u32 idx) const {
return mTevKCols[idx];
}
void SetTexture(u32 texMapIdx, const TexMap &texMap) {
GetTexMapAry()[texMapIdx] = texMap;
}
void SetTexCoordGen(u32 idx, TexCoordGen value) {
GetTexCoordGenAry()[idx] = value;
}
// Begin Functions not found in DWARF, but assumed from BBA map and required for weak func ordering
void SetTevColor(u32 idx, const GXColorS10 &color) {
mTevCols[idx] = color;
}
void SetAlphaCompare(const AlphaCompare &alphaComp) {
*GetAlphaComparePtr() = alphaComp;
}
void SetChanControl(u32 idx, const ChanCtrl &chanCtrl) {
GetChanCtrlAry()[idx] = chanCtrl;
}
void SetTevKColor(u32 idx, const ut::Color &color) {
mTevKCols[idx] = color;
}
void SetTevSwapMode(u32 idx, const TevSwapMode &tevSwapMode) {
GetTevSwapAry()[idx] = tevSwapMode;
}
void SetTexSRT(u32 idx, const TexSRT &texSRT) {
GetTexSRTAry()[idx] = texSRT;
}
void SetIndirectStage(u32 idx, const IndirectStage &indStage) {
GetIndirectStageAry()[idx] = indStage;
}
void SetBlendMode(const BlendMode &blendMode) {
*GetBlendModePtr() = blendMode;
}
void SetTevStage(u32 idx, const TevStage &tevStage) {
GetTevStageAry()[idx] = tevStage;
}
// End Functions not found in DWARF, but assumed from BBA map and required for weak func ordering
virtual ~Material(); // at 0x08
virtual bool SetupGX(bool bModVtxCol, u8 alpha); // at 0x0C
virtual void BindAnimation(AnimTransform *pAnimTrans); // at 0x10
virtual void UnbindAnimation(AnimTransform *pAnimTrans); // at 0x14
virtual void UnbindAllAnimation(); // at 0x18
virtual void Animate(); // at 0x1C
virtual AnimationLink *FindAnimationLink(AnimTransform *pAnimTrans); // at 0x20
virtual AnimationLink *FindAnimationLink(const AnimResource &animRes); // at 0x24
virtual void SetAnimationEnable(AnimTransform *pAnimTrans, bool bEnable); // at 0x28
virtual void SetAnimationEnable(const AnimResource &animRes, bool bEnable); // at 0x2C
private:
ut::LinkList<AnimationLink, 0> mAnimList; // at 0x4
GXColorS10 mTevCols[3]; // at 0x10
ut::Color mTevKCols[4]; // at 0x28
detail::BitGXNums mGXMemCap; // at 0x38
detail::BitGXNums mGXMemNum; // at 0x3C
void *mpGXMem; // at 0x40
char mName[MATERIAL_NAME_SIZE + 1]; // at 0x44
bool mbUserAllocated; // at 0x59
u8 mPadding[2]; // at 0x5A
};
namespace detail {
Size GetTextureSize(Material *pMaterial, u8 texMapIdx);
} // namespace detail
} // namespace lyt
} // namespace nw4r
#endif