mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
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:
parent
b9db3d5416
commit
d4ca501a5c
3 changed files with 13 additions and 0 deletions
|
|
@ -979,6 +979,7 @@ struct GraphNode* DynOS_Model_StoreGeo(u32* aId, enum ModelPool aModelPool, void
|
||||||
struct GraphNode* DynOS_Model_GetGeo(u32 aId);
|
struct GraphNode* DynOS_Model_GetGeo(u32 aId);
|
||||||
u32 DynOS_Model_GetIdFromAsset(void* asset);
|
u32 DynOS_Model_GetIdFromAsset(void* asset);
|
||||||
u32 DynOS_Model_GetIdFromGraphNode(struct GraphNode* aNode);
|
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_OverwriteSlot(u32 srcSlot, u32 dstSlot);
|
||||||
void DynOS_Model_ClearPool(enum ModelPool aModelPool);
|
void DynOS_Model_ClearPool(enum ModelPool aModelPool);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -276,6 +276,7 @@ size_t get_graph_node_size(s16 nodeType) {
|
||||||
|
|
||||||
void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode) {
|
void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode) {
|
||||||
if (sModifiedGraphNodes.find(aNode) == sModifiedGraphNodes.end()) {
|
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);
|
size_t size = get_graph_node_size(aNode->type);
|
||||||
if (size == 0) { return; } // Unexpected
|
if (size == 0) { return; } // Unexpected
|
||||||
GraphNode *graphNodeCopy = (GraphNode *) malloc(size);
|
GraphNode *graphNodeCopy = (GraphNode *) malloc(size);
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,17 @@ u32 DynOS_Model_GetIdFromAsset(void* asset) {
|
||||||
return MODEL_ERROR_MODEL;
|
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) {
|
void DynOS_Model_OverwriteSlot(u32 srcSlot, u32 dstSlot) {
|
||||||
sOverwriteMap[srcSlot] = dstSlot;
|
sOverwriteMap[srcSlot] = dstSlot;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue