mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "dynos.cpp.h"
 | 
						|
extern "C" {
 | 
						|
#include "game/area.h"
 | 
						|
}
 | 
						|
 | 
						|
struct RegisteredMovtexQC {
 | 
						|
    DataNode<MovtexQC>* dataNode;
 | 
						|
    s16 level;
 | 
						|
    s16 area;
 | 
						|
    s16 type;
 | 
						|
};
 | 
						|
 | 
						|
static Array<RegisteredMovtexQC>& DynosRegisteredMovtexQCs() {
 | 
						|
    static Array<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.Add({
 | 
						|
                    .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();
 | 
						|
    while (_DynosRegisteredMovtexQCs.Count() > 0) {
 | 
						|
        auto& registered = _DynosRegisteredMovtexQCs[0];
 | 
						|
        Delete(registered.dataNode);
 | 
						|
        _DynosRegisteredMovtexQCs.Remove(0);
 | 
						|
    }
 | 
						|
}
 |