Files
tp/src/JSystem/J3DGraphBase/J3DMaterial.cpp
T
TakaRikka a6e76c0841 project cleanup (#2895)
* some wii OS fixes

* remove old dol2asm comments

* remove dol2asm.h

* remove function address comments

* normalize ATTRIBUTE_ALIGN usage

* DECL_WEAK macro

* fix gcc attribute weak macro

* wrap more mwcc specific things in ifdefs

* fixes

* fix revo sdk version flags

* fixes
2025-11-30 15:23:42 -07:00

422 lines
11 KiB
C++

#include "JSystem/JSystem.h" // IWYU pragma: keep
#include "JSystem/J3DGraphBase/J3DMaterial.h"
#include "JSystem/J3DGraphBase/J3DGD.h"
J3DColorBlock* J3DMaterial::createColorBlock(u32 flags) {
J3DColorBlock* rv = NULL;
switch (flags) {
case 0:
rv = new J3DColorBlockLightOff();
break;
case 0x40000000:
rv = new J3DColorBlockLightOn();
break;
case 0x80000000:
rv = new J3DColorBlockAmbientOn();
break;
}
J3D_ASSERT_ALLOCMEM(55, rv != NULL);
return rv;
}
J3DTexGenBlock* J3DMaterial::createTexGenBlock(u32 flags) {
J3DTexGenBlock* rv = NULL;
switch (flags) {
case 0x8000000:
rv = new J3DTexGenBlock4();
break;
case 0:
default:
rv = new J3DTexGenBlockBasic();
}
J3D_ASSERT_ALLOCMEM(83, rv != NULL);
return rv;
}
J3DTevBlock* J3DMaterial::createTevBlock(int tevStageNum) {
J3DTevBlock* rv = NULL;
if (tevStageNum <= 1) {
rv = new J3DTevBlock1();
} else if (tevStageNum == 2) {
rv = new J3DTevBlock2();
} else if (tevStageNum <= 4) {
rv = new J3DTevBlock4();
} else if (tevStageNum <= 16) {
rv = new J3DTevBlock16();
}
J3D_ASSERT_ALLOCMEM(116, rv != NULL);
return rv;
}
J3DIndBlock* J3DMaterial::createIndBlock(int flags) {
J3DIndBlock* rv = NULL;
if (flags != 0) {
rv = new J3DIndBlockFull();
} else {
rv = new J3DIndBlockNull();
}
J3D_ASSERT_ALLOCMEM(139, rv != NULL);
return rv;
}
J3DPEBlock* J3DMaterial::createPEBlock(u32 flags, u32 materialMode) {
J3DPEBlock* rv = NULL;
if (flags == 0) {
if (materialMode & 1) {
rv = new J3DPEBlockOpa();
J3D_ASSERT_ALLOCMEM(166, rv != NULL);
return rv;
} else if (materialMode & 2) {
rv = new J3DPEBlockTexEdge();
J3D_ASSERT_ALLOCMEM(172, rv != NULL);
return rv;
} else if (materialMode & 4) {
rv = new J3DPEBlockXlu();
J3D_ASSERT_ALLOCMEM(178, rv != NULL);
return rv;
}
}
if (flags == 0x10000000) {
rv = new J3DPEBlockFull();
} else if (flags == 0x20000000) {
rv = new J3DPEBlockFogOff();
}
J3D_ASSERT_ALLOCMEM(188, rv != NULL);
return rv;
}
u32 J3DMaterial::calcSizeColorBlock(u32 flags) {
u32 rv = 0;
switch (flags) {
case 0:
rv += sizeof(J3DColorBlockLightOff);
break;
case 0x40000000:
rv += sizeof(J3DColorBlockLightOn);
break;
case 0x80000000:
rv += sizeof(J3DColorBlockAmbientOn);
break;
}
return rv;
}
u32 J3DMaterial::calcSizeTexGenBlock(u32 flags) {
u32 rv = 0;
switch (flags) {
case 0x8000000:
rv += sizeof(J3DTexGenBlock4);
break;
case 0:
default:
rv += sizeof(J3DTexGenBlockBasic);
}
return rv;
}
u32 J3DMaterial::calcSizeTevBlock(int tevStageNum) {
u32 rv = 0;
if (tevStageNum <= 1) {
rv += sizeof(J3DTevBlock1);
} else if (tevStageNum == 2) {
rv += sizeof(J3DTevBlock2);
} else if (tevStageNum <= 4) {
rv += sizeof(J3DTevBlock4);
} else if (tevStageNum <= 16) {
rv += sizeof(J3DTevBlock16);
}
return rv;
}
u32 J3DMaterial::calcSizeIndBlock(int flags) {
u32 rv = 0;
if (flags != 0) {
rv += sizeof(J3DIndBlockFull);
} else {
rv += sizeof(J3DIndBlockNull);
}
return rv;
}
u32 J3DMaterial::calcSizePEBlock(u32 flags, u32 materialMode) {
u32 rv = 0;
if (flags == 0) {
if (materialMode & 1) {
rv += sizeof(J3DPEBlockOpa);
} else if (materialMode & 2) {
rv += sizeof(J3DPEBlockTexEdge);
} else if (materialMode & 4) {
rv += sizeof(J3DPEBlockXlu);
}
} else if (flags == 0x10000000) {
rv += sizeof(J3DPEBlockFull);
} else if (flags == 0x20000000) {
rv += sizeof(J3DPEBlockFogOff);
}
return rv;
}
void J3DMaterial::initialize() {
mShape = NULL;
mNext = NULL;
mJoint = NULL;
mMaterialMode = 1;
mIndex = -1;
mInvalid = 0;
mDiffFlag = 0;
mColorBlock = NULL;
mTexGenBlock = NULL;
mTevBlock = NULL;
mIndBlock = NULL;
mPEBlock = NULL;
mpOrigMaterial = NULL;
mMaterialAnm = NULL;
mSharedDLObj = NULL;
}
u32 J3DMaterial::countDLSize() {
return (mColorBlock->countDLSize() + mTexGenBlock->countDLSize() + mTevBlock->countDLSize() +
mIndBlock->countDLSize() + mPEBlock->countDLSize() + 31) & ~0x1f;
}
void J3DMaterial::makeDisplayList_private(J3DDisplayListObj* pDLObj) {
pDLObj->beginDL();
mTevBlock->load();
mIndBlock->load();
mPEBlock->load();
J3DGDSetGenMode(mTexGenBlock->getTexGenNum(), mColorBlock->getColorChanNum(), mTevBlock->getTevStageNum(), mIndBlock->getIndTexStageNum(), (GXCullMode)(u8)mColorBlock->getCullMode());
mTexGenBlock->load();
mColorBlock->load();
J3DGDSetNumChans(mColorBlock->getColorChanNum());
J3DGDSetNumTexGens(mTexGenBlock->getTexGenNum());
pDLObj->endDL();
}
void J3DMaterial::makeDisplayList() {
if (!j3dSys.getMatPacket()->isLocked()) {
j3dSys.getMatPacket()->mDiffFlag = mDiffFlag;
makeDisplayList_private(j3dSys.getMatPacket()->getDisplayListObj());
}
}
void J3DMaterial::makeSharedDisplayList() {
makeDisplayList_private(mSharedDLObj);
}
void J3DMaterial::load() {
j3dSys.setMaterialMode(mMaterialMode);
if (!j3dSys.checkFlag(2)) {
loadNBTScale(*mTexGenBlock->getNBTScale());
}
}
void J3DMaterial::loadSharedDL() {
j3dSys.setMaterialMode(mMaterialMode);
if (!j3dSys.checkFlag(2)) {
mSharedDLObj->callDL();
loadNBTScale(*mTexGenBlock->getNBTScale());
}
}
void J3DMaterial::patch() {
j3dSys.getMatPacket()->mDiffFlag = mDiffFlag;
j3dSys.getMatPacket()->beginPatch();
mTevBlock->patch();
mColorBlock->patch();
mTexGenBlock->patch();
j3dSys.getMatPacket()->endPatch();
}
void J3DMaterial::diff(u32 diffFlags) {
if (j3dSys.getMatPacket()->isEnabled_Diff()) {
j3dSys.getMatPacket()->beginDiff();
mTevBlock->diff(diffFlags);
mIndBlock->diff(diffFlags);
mPEBlock->diff(diffFlags);
if (diffFlags & J3DDiffFlag_KonstColor) {
J3DGDSetGenMode_3Param(mTexGenBlock->getTexGenNum(), mTevBlock->getTevStageNum(), mIndBlock->getIndTexStageNum());
J3DGDSetNumTexGens(mTexGenBlock->getTexGenNum());
}
mTexGenBlock->diff(diffFlags);
mColorBlock->diff(diffFlags);
j3dSys.getMatPacket()->endDiff();
}
}
void J3DMaterial::calc(f32 const (*param_0)[4]) {
if (j3dSys.checkFlag(0x40000000)) {
mTexGenBlock->calcPostTexMtx(param_0);
} else {
mTexGenBlock->calc(param_0);
}
calcCurrentMtx();
setCurrentMtx();
}
void J3DMaterial::calcDiffTexMtx(f32 const (*param_0)[4]) {
if (j3dSys.checkFlag(0x40000000)) {
mTexGenBlock->calcPostTexMtxWithoutViewMtx(param_0);
} else {
mTexGenBlock->calcWithoutViewMtx(param_0);
}
}
void J3DMaterial::setCurrentMtx() {
mShape->setCurrentMtx(mCurrentMtx);
}
void J3DMaterial::calcCurrentMtx() {
if (!j3dSys.checkFlag(0x40000000)) {
mCurrentMtx.setCurrentTexMtx(
getTexCoord(0)->getTexGenMtx(),
getTexCoord(1)->getTexGenMtx(),
getTexCoord(2)->getTexGenMtx(),
getTexCoord(3)->getTexGenMtx(),
getTexCoord(4)->getTexGenMtx(),
getTexCoord(5)->getTexGenMtx(),
getTexCoord(6)->getTexGenMtx(),
getTexCoord(7)->getTexGenMtx()
);
} else {
mCurrentMtx.setCurrentTexMtx(
getTexCoord(0)->getTexMtxReg(),
getTexCoord(1)->getTexMtxReg(),
getTexCoord(2)->getTexMtxReg(),
getTexCoord(3)->getTexMtxReg(),
getTexCoord(4)->getTexMtxReg(),
getTexCoord(5)->getTexMtxReg(),
getTexCoord(6)->getTexMtxReg(),
getTexCoord(7)->getTexMtxReg()
);
}
}
void J3DMaterial::copy(J3DMaterial* pOther) {
J3D_ASSERT_NULLPTR(620, pOther != NULL);
mColorBlock->reset(pOther->mColorBlock);
mTexGenBlock->reset(pOther->mTexGenBlock);
mTevBlock->reset(pOther->mTevBlock);
mIndBlock->reset(pOther->mIndBlock);
mPEBlock->reset(pOther->mPEBlock);
}
void J3DMaterial::reset() {
if ((~mDiffFlag & J3DDiffFlag_Changed) == 0) {
mDiffFlag &= ~J3DDiffFlag_Changed;
mMaterialMode = mpOrigMaterial->mMaterialMode;
mInvalid = mpOrigMaterial->mInvalid;
mMaterialAnm = NULL;
copy(mpOrigMaterial);
}
}
void J3DMaterial::change() {
if ((mDiffFlag & (J3DDiffFlag_Changed | J3DDiffFlag_Unk40000000)) == 0) {
mDiffFlag |= J3DDiffFlag_Changed;
mMaterialAnm = NULL;
}
}
s32 J3DMaterial::newSharedDisplayList(u32 dlSize) {
if (mSharedDLObj == NULL) {
mSharedDLObj = new J3DDisplayListObj();
if (mSharedDLObj == NULL) {
return kJ3DError_Alloc;
}
s32 ret = mSharedDLObj->newDisplayList(dlSize);
if (ret != kJ3DError_Success) {
return ret;
}
}
return kJ3DError_Success;
}
s32 J3DMaterial::newSingleSharedDisplayList(u32 dlSize) {
if (mSharedDLObj == NULL) {
mSharedDLObj = new J3DDisplayListObj();
if (mSharedDLObj == NULL) {
return kJ3DError_Alloc;
}
s32 ret = mSharedDLObj->newSingleDisplayList(dlSize);
if (ret != kJ3DError_Success) {
return ret;
}
}
return kJ3DError_Success;
}
void J3DPatchedMaterial::initialize() {
J3DMaterial::initialize();
}
void J3DPatchedMaterial::makeDisplayList() {}
void J3DPatchedMaterial::makeSharedDisplayList() {}
void J3DPatchedMaterial::load() {
j3dSys.setMaterialMode(mMaterialMode);
if (j3dSys.checkFlag(2)) {
return;
}
}
void J3DPatchedMaterial::loadSharedDL() {
j3dSys.setMaterialMode(mMaterialMode);
if (!j3dSys.checkFlag(0x02))
mSharedDLObj->callDL();
}
void J3DPatchedMaterial::reset() {}
void J3DPatchedMaterial::change() {}
void J3DLockedMaterial::initialize() {
J3DMaterial::initialize();
}
void J3DLockedMaterial::makeDisplayList() {}
void J3DLockedMaterial::makeSharedDisplayList() {}
void J3DLockedMaterial::load() {
j3dSys.setMaterialMode(mMaterialMode);
if (j3dSys.checkFlag(2)) {
return;
}
}
void J3DLockedMaterial::loadSharedDL() {
j3dSys.setMaterialMode(mMaterialMode);
if (!j3dSys.checkFlag(0x02))
mSharedDLObj->callDL();
}
void J3DLockedMaterial::patch() {}
void J3DLockedMaterial::diff(u32 diffFlags) {}
void J3DLockedMaterial::calc(const Mtx param_0) {}
void J3DLockedMaterial::reset() {}
void J3DLockedMaterial::change() {}