Files
ss/src/egg/gfx/eggIScnProc.cpp
T
2025-03-16 22:14:44 +01:00

89 lines
2.7 KiB
C++

#include "egg/gfx/eggIScnProc.h"
#include "common.h"
#include "egg/egg_types.h"
#include "egg/gfx/eggG3DUtility.h"
#include "egg/gfx/eggGlobalDrawState.h"
#include "egg/gfx/eggStateGX.h"
#include "nw4r/g3d/g3d_scnobj.h"
#include "nw4r/math/math_types.h"
#include "rvl/MTX/mtx.h"
namespace EGG {
IScnProc::~IScnProc() {
if (mpDataSet != nullptr) {
for (int i = 0; i < getNumScnProc(); i++) {
mpDataSet[i].mpScnProc->Destroy();
mpDataSet[i].mpScnProc = nullptr;
}
delete[] mpDataSet;
mpDataSet = nullptr;
}
}
void IScnProc::createScnProc(u16 procNum, MEMAllocator *pAllocator) {
mNumScnProc = procNum;
mpDataSet = new ProcData[mNumScnProc];
nw4r::math::MTX34 mtx;
PSMTXIdentity(mtx);
for (u16 i = 0; i < getNumScnProc(); i++) {
u32 sp8;
MEMAllocator *allocator = (pAllocator == nullptr) ? G3DUtility::getAllocator() : pAllocator;
mpDataSet[i].mpScnProc = nw4r::g3d::ScnProc::Construct(allocator, &sp8, IScnProc::drawProcFunc, true, false, 0);
mpDataSet[i].mpScnProc->SetUserData(&mpDataSet[i]);
mpDataSet[i].mpScnProc->SetMtx(nw4r::g3d::ScnObj::MTX_LOCAL, mtx);
mpDataSet[i].mIndex = i;
mpDataSet[i].mpThis = this;
mpDataSet[i].mFlags = 1 | 2;
setPriorityScnProc(i, i, true);
}
}
void IScnProc::setPriorityScnProc(u16 procIndex, u8 priority, bool bUseOpa) {
nw4r::g3d::ScnProc *pScnProc = getData(procIndex)->mpScnProc;
if (bUseOpa) {
pScnProc->SetDrawProc(IScnProc::drawProcFunc, true, false);
pScnProc->SetPriorityDrawOpa(priority);
mpDataSet[procIndex].mFlags |= 1;
} else {
pScnProc->SetDrawProc(IScnProc::drawProcFunc, false, true);
pScnProc->SetPriorityDrawXlu(priority);
mpDataSet[procIndex].mFlags &= ~1;
}
}
void IScnProc::pushBackToScnGroup(nw4r::g3d::ScnGroup *pScnGroup) {
for (u16 i = 0; i < getNumScnProc(); i++) {
bool is_push_back = pScnGroup->Insert(pScnGroup->Size(), getData(i)->mpScnProc);
}
}
void IScnProc::removeFromScnGroup(nw4r::g3d::ScnGroup *pScnGroup) {
for (u16 i = 0; i < getNumScnProc(); i++) {
bool is_remove = pScnGroup->Remove(getData(i)->mpScnProc);
}
}
void IScnProc::drawProcFunc(nw4r::g3d::ScnProc *pScnProc, bool b) {
GlobalDrawState::setDrawSettingGX(b, false);
StateGX::s_commandFlag &= ~0xF;
drawProcFuncNoGlobalState(pScnProc, b);
StateGX::resetGXCache();
GlobalDrawState::setDrawSettingGX(b, (StateGX::s_commandFlag & 0xF) != 0);
}
void IScnProc::drawProcFuncNoGlobalState(nw4r::g3d::ScnProc *pScnProc, bool b) {
ProcData *dat = static_cast<ProcData *>(pScnProc->GetUserData());
dat->mpThis->doDraw(dat->mIndex);
}
} // namespace EGG