diff options
Diffstat (limited to 'src/toBeSorted/arc_callback_handler.cpp')
| -rw-r--r-- | src/toBeSorted/arc_callback_handler.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/toBeSorted/arc_callback_handler.cpp b/src/toBeSorted/arc_callback_handler.cpp new file mode 100644 index 00000000..55a329e7 --- /dev/null +++ b/src/toBeSorted/arc_callback_handler.cpp @@ -0,0 +1,97 @@ +#include <d/d_rawarchive.h> +#include <egg/gfx/eggLight.h> +#include <m/m3d/m3d.h> +#include <toBeSorted/arc_managers/oarc_manager.h> +#include <toBeSorted/arc_managers/current_stage_arc_manager.h> +#include <nw4r/g3d/g3d_resfile.h> +#include <nw4r/g3d/g3d_resmdl.h> +#include <nw4r/g3d/g3d_resmat.h> + +ArcCallbackHandler ArcCallbackHandler::sInstance; + +#define NAME_DZB 'dzb ' +#define NAME_G3D 'g3d ' +#define NAME_KCL 'kcl ' +#define NAME_OARC 'oarc' +#define NAME_RARC 'rarc' + +extern "C" void FUN_804a7260(nw4r::g3d::ResMdl, const char *prefix); + + +void BindSystemModelsAndLighting(nw4r::g3d::ResFile file) { + nw4r::g3d::ResFile sysFile = OarcManager::sInstance->getMdlFromArc2("System"); + if (sysFile.mFile.IsValid()) { + file.Bind(sysFile); + } + + EGG::LightManager *mgr = m3d::getLightMgr(0); + if (mgr != nullptr && mgr->GetTextureMgr() != nullptr) { + EGG::LightTextureManager *lightTexMgr = mgr->GetTextureMgr(); + for (int i = 0; i < file.GetResMdlNumEntries(); i++) { + nw4r::g3d::ResMdl mdl = file.GetResMdl(i); + lightTexMgr->replaceModelTextures(mdl); + FUN_804a7260(mdl, "Lm"); + for (int j = 0; j < mdl.GetResMatNumEntries(); j++) { + nw4r::g3d::ResMat mat = mdl.GetResMat(j); + if (mat.IsOpaque()) { + nw4r::g3d::ResMatPix pix = mat.GetResMatPix(); + u8 bAlpha; + u8 uAlpha; + pix.GXGetDstAlpha(&bAlpha, &uAlpha); + if (!bAlpha) { + pix.GXSetDstAlpha(1, 0x80); + pix.DCStore(0); + } + } + } + } + } +} + +extern "C" void fn_8033A140(void *data); +extern "C" void dBgWKCol__initKCollision(void *dat); + +void ArcCallbackHandlerBase::CreateArcEntry(void *data, const char *path) { + if (mPrefix == NAME_G3D) { + nw4r::g3d::ResFile file = data; + file.Init(); + file.Bind(); + BindSystemModelsAndLighting(file); + } else if (mPrefix == NAME_KCL) { + dBgWKCol__initKCollision(data); + } else if (mPrefix == NAME_DZB) { + fn_8033A140(data); + } else if (mPrefix == NAME_OARC) { + SizedString<64> oarcPath = path; + char buf[64]; + sscanf(&oarcPath, "/oarc/%31[^.]arc", buf); + u32 oldPrefix = mPrefix; + OarcManager::sInstance->addEntryFromSuperArc(buf, data, nullptr); + mPrefix = oldPrefix; + } else if (mPrefix == NAME_RARC) { + SizedString<64> oarcPath = path; + char buf[64]; + sscanf(&oarcPath, "/rarc/%31[^.]arc", buf); + u32 oldPrefix = mPrefix; + CurrentStageArcManager::sInstance->addEntryFromSuperArc(buf, data); + mPrefix = oldPrefix; + } +} + +void ArcCallbackHandlerBase::DestroyArcEntry(const char *path) { + if (mPrefix == NAME_OARC) { + SizedString<64> oarcPath = path; + char buf[64]; + sscanf(&oarcPath, "/oarc/%31[^.]arc", buf); + u32 oldPrefix = mPrefix; + OarcManager::sInstance->decrement(buf); + mPrefix = oldPrefix; + } else if (mPrefix == NAME_RARC) { + SizedString<64> oarcPath = path; + char buf[64]; + sscanf(&oarcPath, "/rarc/%31[^.]arc", buf); + u32 oldPrefix = mPrefix; + CurrentStageArcManager::sInstance->decrement(buf); + mPrefix = oldPrefix; + } +} |
