fix graph node reset memory corruption

by only resetting permanent models (which is all that needs to be reset anyway).
This commit is contained in:
Isaac0-dev 2025-06-18 17:10:01 +10:00
parent b9db3d5416
commit d4ca501a5c
3 changed files with 13 additions and 0 deletions

View file

@ -979,6 +979,7 @@ struct GraphNode* DynOS_Model_StoreGeo(u32* aId, enum ModelPool aModelPool, void
struct GraphNode* DynOS_Model_GetGeo(u32 aId);
u32 DynOS_Model_GetIdFromAsset(void* asset);
u32 DynOS_Model_GetIdFromGraphNode(struct GraphNode* aNode);
enum ModelPool DynOS_Model_GetModelPoolFromGraphNode(struct GraphNode* aNode);
void DynOS_Model_OverwriteSlot(u32 srcSlot, u32 dstSlot);
void DynOS_Model_ClearPool(enum ModelPool aModelPool);

View file

@ -276,6 +276,7 @@ size_t get_graph_node_size(s16 nodeType) {
void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode) {
if (sModifiedGraphNodes.find(aNode) == sModifiedGraphNodes.end()) {
if (DynOS_Model_GetModelPoolFromGraphNode(aNode) != MODEL_POOL_PERMANENT) { return; } // Only need to reset permanent models
size_t size = get_graph_node_size(aNode->type);
if (size == 0) { return; } // Unexpected
GraphNode *graphNodeCopy = (GraphNode *) malloc(size);

View file

@ -237,6 +237,17 @@ u32 DynOS_Model_GetIdFromAsset(void* asset) {
return MODEL_ERROR_MODEL;
}
enum ModelPool DynOS_Model_GetModelPoolFromGraphNode(struct GraphNode* aNode) {
for (auto& it : sIdMap) {
if (!it.second.size() || it.second.empty()) { continue; }
auto& node = it.second.back();
if (aNode == node.graphNode) {
return node.modelPool;
}
}
return MODEL_POOL_MAX;
}
void DynOS_Model_OverwriteSlot(u32 srcSlot, u32 dstSlot) {
sOverwriteMap[srcSlot] = dstSlot;
}