mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-05 02:37:50 -04:00
110 lines
2.9 KiB
C++
110 lines
2.9 KiB
C++
//
|
|
// J3DModelData
|
|
//
|
|
|
|
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
|
|
|
#include "JSystem/J3DGraphAnimator/J3DModelData.h"
|
|
#include "JSystem/J3DGraphAnimator/J3DJoint.h"
|
|
#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h"
|
|
#include "JSystem/J3DGraphAnimator/J3DModel.h"
|
|
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
|
|
|
void J3DModelData::clear() {
|
|
mpRawData = 0;
|
|
mFlags = 0;
|
|
mbHasBumpArray = 0;
|
|
mbHasBillboard = 0;
|
|
}
|
|
|
|
J3DModelData::J3DModelData() {
|
|
clear();
|
|
}
|
|
|
|
s32 J3DModelData::newSharedDisplayList(u32 mdlFlags) {
|
|
u16 matNum = getMaterialNum();
|
|
|
|
for (u16 i = 0; i < matNum; i++) {
|
|
s32 ret;
|
|
if (mdlFlags & J3DMdlFlag_UseSingleDL) {
|
|
ret = getMaterialNodePointer(i)->newSingleSharedDisplayList(getMaterialNodePointer(i)->countDLSize());
|
|
if (ret != kJ3DError_Success)
|
|
return ret;
|
|
} else {
|
|
ret = getMaterialNodePointer(i)->newSharedDisplayList(getMaterialNodePointer(i)->countDLSize());
|
|
if (ret != kJ3DError_Success)
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
return kJ3DError_Success;
|
|
}
|
|
|
|
void J3DModelData::indexToPtr() {
|
|
j3dSys.setTexture(getTexture());
|
|
|
|
static BOOL sInterruptFlag = OSDisableInterrupts();
|
|
OSDisableScheduler();
|
|
|
|
GDLObj gdl_obj;
|
|
u16 matNum = getMaterialNum();
|
|
for (u16 i = 0; i < matNum; i++) {
|
|
J3DMaterial* matNode = getMaterialNodePointer(i);
|
|
J3DDisplayListObj* dl_obj = matNode->getSharedDisplayListObj();
|
|
|
|
GDInitGDLObj(&gdl_obj, dl_obj->getDisplayList(0), dl_obj->getDisplayListSize());
|
|
GDSetCurrent(&gdl_obj);
|
|
matNode->getTevBlock()->indexToPtr();
|
|
}
|
|
|
|
GDSetCurrent(NULL);
|
|
OSEnableScheduler();
|
|
OSRestoreInterrupts(sInterruptFlag);
|
|
}
|
|
|
|
void J3DModelData::makeSharedDL() {
|
|
j3dSys.setTexture(getTexture());
|
|
|
|
u16 matNum = getMaterialNum();
|
|
for (u16 i = 0; i < matNum; i++) {
|
|
getMaterialNodePointer(i)->makeSharedDisplayList();
|
|
}
|
|
}
|
|
|
|
void J3DModelData::simpleCalcMaterial(u16 idx, Mtx param_1) {
|
|
syncJ3DSysFlags();
|
|
|
|
J3DMaterial* mat;
|
|
J3DJoint* jointNode = getJointNodePointer(idx);
|
|
for (mat = jointNode->getMesh(); mat != NULL; mat = mat->getNext()) {
|
|
if (mat->getMaterialAnm() != NULL) {
|
|
mat->getMaterialAnm()->calc(mat);
|
|
}
|
|
mat->calc(param_1);
|
|
}
|
|
}
|
|
|
|
#if TARGET_PC
|
|
bool J3DModelData::needsInterpCallBack() const {
|
|
for (u16 i = 0, n = getMaterialNum(); i < n; i++)
|
|
if (getMaterialNodePointer(i)->needsInterpCallBack())
|
|
return true;
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
void J3DModelData::syncJ3DSysPointers() const {
|
|
j3dSys.setTexture(getTexture());
|
|
j3dSys.setVtxPos(getVtxPosArray(), getVtxNum());
|
|
j3dSys.setVtxNrm(getVtxNrmArray(), getNrmNum());
|
|
j3dSys.setVtxCol(getVtxColorArray(0), getColNum());
|
|
}
|
|
|
|
void J3DModelData::syncJ3DSysFlags() const {
|
|
if (checkFlag(0x20)) {
|
|
j3dSys.onFlag(J3DSysFlag_PostTexMtx);
|
|
} else {
|
|
j3dSys.offFlag(J3DSysFlag_PostTexMtx);
|
|
}
|
|
}
|