sm64coopdx/data/dynos_mgr_movtexqc.cpp
Isaac0-dev 39d351d753
Some checks failed
Build coop / build-linux (push) Has been cancelled
Build coop / build-steamos (push) Has been cancelled
Build coop / build-windows-opengl (push) Has been cancelled
Build coop / build-windows-directx (push) Has been cancelled
Build coop / build-macos-arm (push) Has been cancelled
Build coop / build-macos-intel (push) Has been cancelled
some fixes for dynos, and a crash fix (#1040)
2025-12-26 12:59:47 +10:00

77 lines
2.1 KiB
C++

#include "dynos.cpp.h"
extern "C" {
#include "game/area.h"
}
struct RegisteredMovtexQC {
DataNode<MovtexQC>* dataNode;
s16 level;
s16 area;
s16 type;
};
static std::vector<RegisteredMovtexQC> &DynosRegisteredMovtexQCs() {
static std::vector<RegisteredMovtexQC> sDynosRegisteredMovtexQCs;
return sDynosRegisteredMovtexQCs;
}
void DynOS_MovtexQC_Register(const char* name, s16 level, s16 area, s16 type) {
auto& _DynosRegisteredMovtexQCs = DynosRegisteredMovtexQCs();
// check for duplicates
for (auto& registered : _DynosRegisteredMovtexQCs) {
if (registered.level == level && registered.area == area && registered.type == type) { return; }
}
// find it in the levels
for (auto& lvlPair : DynOS_Lvl_GetArray()) {
for (auto& node : lvlPair.second->mMovtexQCs) {
if (node->mName == name) {
// add it
_DynosRegisteredMovtexQCs.push_back({
.dataNode = node,
.level = level,
.area = area,
.type = type
});
}
}
}
}
DataNode<MovtexQC>* DynOS_MovtexQC_GetFromId(u32 id) {
auto& _DynosRegisteredMovtexQCs = DynosRegisteredMovtexQCs();
// find the datanode
s16 type = (id & 0xF);
for (auto& registered : _DynosRegisteredMovtexQCs) {
if (registered.level == gCurrLevelNum && registered.area == gCurrAreaIndex && registered.type == type) {
return registered.dataNode;
}
}
return NULL;
}
DataNode<MovtexQC>* DynOS_MovtexQC_GetFromIndex(s32 index) {
GfxData* gfxData = DynOS_Lvl_GetActiveGfx();
if (gfxData == NULL) {
return NULL;
}
auto &mMovtexQCs = gfxData->mMovtexQCs;
// Sanity check the index we passed.
if (index < 0 || index >= mMovtexQCs.Count()) {
return NULL;
}
return mMovtexQCs[index];
}
void DynOS_MovtexQC_ModShutdown() {
auto& _DynosRegisteredMovtexQCs = DynosRegisteredMovtexQCs();
for (auto &registered : _DynosRegisteredMovtexQCs) {
Delete(registered.dataNode);
}
_DynosRegisteredMovtexQCs.clear();
}