reset modified graph nodes on network shutdown

This commit is contained in:
Isaac0-dev 2025-06-04 02:36:35 +10:00
parent 566e2ba934
commit f0d6e4331d
5 changed files with 61 additions and 2 deletions

View file

@ -39,6 +39,7 @@ void dynos_actor_override(struct Object* obj, void** aSharedChild);
void dynos_add_actor_custom(s32 modIndex, const char *filePath, const char* geoName); void dynos_add_actor_custom(s32 modIndex, const char *filePath, const char* geoName);
const void* dynos_geolayout_get(const char *name); const void* dynos_geolayout_get(const char *name);
bool dynos_actor_get_mod_index_and_token(struct GraphNode *graphNode, u32 tokenIndex, s32 *modIndex, const char **token); bool dynos_actor_get_mod_index_and_token(struct GraphNode *graphNode, u32 tokenIndex, s32 *modIndex, const char **token);
void dynos_actor_register_modified_graph_node(struct GraphNode *node);
// -- collisions -- // // -- collisions -- //
void dynos_add_collision(const char *filePath, const char* collisionName); void dynos_add_collision(const char *filePath, const char* collisionName);

View file

@ -896,6 +896,7 @@ void DynOS_Actor_Valid(const void* aGeoref, ActorGfx& aActorGfx);
void DynOS_Actor_Invalid(const void* aGeoref, s32 aPackIndex); void DynOS_Actor_Invalid(const void* aGeoref, s32 aPackIndex);
void DynOS_Actor_Override(struct Object* obj, void** aSharedChild); void DynOS_Actor_Override(struct Object* obj, void** aSharedChild);
void DynOS_Actor_Override_All(void); void DynOS_Actor_Override_All(void);
void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode);
void DynOS_Actor_ModShutdown(); void DynOS_Actor_ModShutdown();
// //

View file

@ -123,6 +123,10 @@ bool dynos_actor_get_mod_index_and_token(struct GraphNode *graphNode, u32 tokenI
return DynOS_Actor_GetModIndexAndToken(graphNode, tokenIndex, modIndex, token); return DynOS_Actor_GetModIndexAndToken(graphNode, tokenIndex, modIndex, token);
} }
void dynos_actor_register_modified_graph_node(struct GraphNode *node) {
DynOS_Actor_RegisterModifiedGraphNode(node);
}
// -- collisions -- // // -- collisions -- //
void dynos_add_collision(const char *filePath, const char* collisionName) { void dynos_add_collision(const char *filePath, const char* collisionName) {

View file

@ -1,5 +1,6 @@
#include <map> #include <map>
#include <algorithm> #include <algorithm>
#include <unordered_map>
#include "dynos.cpp.h" #include "dynos.cpp.h"
extern "C" { extern "C" {
@ -21,6 +22,8 @@ static Array<Pair<const char*, void *>>& DynosCustomActors() {
return sDynosCustomActors; return sDynosCustomActors;
} }
static std::map<struct GraphNode *, struct GraphNode *> sModifiedModels;
// TODO: the cleanup/refactor didn't really go as planned. // TODO: the cleanup/refactor didn't really go as planned.
// clean up the actor management code more // clean up the actor management code more
@ -234,6 +237,45 @@ void DynOS_Actor_Override_All(void) {
} }
} }
std::unordered_map<uint16_t, size_t> graphNodeInitMap = {
{ GRAPH_NODE_TYPE_ROOT, sizeof(GraphNodeRoot) },
{ GRAPH_NODE_TYPE_ORTHO_PROJECTION, sizeof(GraphNodeOrthoProjection) },
{ GRAPH_NODE_TYPE_PERSPECTIVE, sizeof(GraphNodePerspective) },
{ GRAPH_NODE_TYPE_START, sizeof(GraphNodeStart) },
{ GRAPH_NODE_TYPE_MASTER_LIST, sizeof(GraphNodeMasterList) },
{ GRAPH_NODE_TYPE_LEVEL_OF_DETAIL, sizeof(GraphNodeLevelOfDetail) },
{ GRAPH_NODE_TYPE_SWITCH_CASE, sizeof(GraphNodeSwitchCase) },
{ GRAPH_NODE_TYPE_CAMERA, sizeof(GraphNodeCamera) },
{ GRAPH_NODE_TYPE_TRANSLATION_ROTATION, sizeof(GraphNodeTranslationRotation) },
{ GRAPH_NODE_TYPE_TRANSLATION, sizeof(GraphNodeTranslation) },
{ GRAPH_NODE_TYPE_ROTATION, sizeof(GraphNodeRotation) },
{ GRAPH_NODE_TYPE_SCALE, sizeof(GraphNodeScale) },
{ GRAPH_NODE_TYPE_OBJECT, sizeof(GraphNodeObject) },
{ GRAPH_NODE_TYPE_CULLING_RADIUS, sizeof(GraphNodeCullingRadius) },
{ GRAPH_NODE_TYPE_ANIMATED_PART, sizeof(GraphNodeAnimatedPart) },
{ GRAPH_NODE_TYPE_BILLBOARD, sizeof(GraphNodeBillboard) },
{ GRAPH_NODE_TYPE_DISPLAY_LIST, sizeof(GraphNodeDisplayList) },
{ GRAPH_NODE_TYPE_SHADOW, sizeof(GraphNodeShadow) },
{ GRAPH_NODE_TYPE_OBJECT_PARENT, sizeof(GraphNodeObjectParent) },
{ GRAPH_NODE_TYPE_GENERATED_LIST, sizeof(GraphNodeGenerated) },
{ GRAPH_NODE_TYPE_BACKGROUND, sizeof(GraphNodeBackground) },
{ GRAPH_NODE_TYPE_HELD_OBJ, sizeof(GraphNodeHeldObject) },
};
size_t get_graph_node_size(uint16_t nodeType) {
auto it = graphNodeInitMap.find(nodeType);
return it != graphNodeInitMap.end() ? it->second : 0;
}
void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode) {
if (sModifiedModels.find(aNode) == sModifiedModels.end()) {
size_t size = get_graph_node_size(aNode->type);
GraphNode *graphNodeCopy = (GraphNode *) malloc(size);
memcpy(graphNodeCopy, aNode, size);
sModifiedModels[aNode] = graphNodeCopy;
}
}
void DynOS_Actor_ModShutdown() { void DynOS_Actor_ModShutdown() {
auto& _DynosCustomActors = DynosCustomActors(); auto& _DynosCustomActors = DynosCustomActors();
while (_DynosCustomActors.Count() > 0) { while (_DynosCustomActors.Count() > 0) {
@ -255,4 +297,12 @@ void DynOS_Actor_ModShutdown() {
} }
DynOS_Actor_Override_All(); DynOS_Actor_Override_All();
// Reset modified graph nodes
for (auto& node : sModifiedModels) {
size_t size = get_graph_node_size(node.second->type);
memcpy(node.first, node.second, size);
free(node.second);
}
sModifiedModels.clear();
} }

View file

@ -1098,7 +1098,7 @@ int smlua_func_collision_find_surface_on_ray(lua_State* L) {
//////////////// ////////////////
typedef struct { s16 type; u16 lot; } GraphNodeLot; typedef struct { s16 type; u16 lot; } GraphNodeLot;
static GraphNodeLot graphNodeLots[23] = { static GraphNodeLot graphNodeLots[] = {
{ GRAPH_NODE_TYPE_ANIMATED_PART, LOT_GRAPHNODEANIMATEDPART }, { GRAPH_NODE_TYPE_ANIMATED_PART, LOT_GRAPHNODEANIMATEDPART },
{ GRAPH_NODE_TYPE_BACKGROUND, LOT_GRAPHNODEBACKGROUND }, { GRAPH_NODE_TYPE_BACKGROUND, LOT_GRAPHNODEBACKGROUND },
{ GRAPH_NODE_TYPE_BILLBOARD, LOT_GRAPHNODEBILLBOARD }, { GRAPH_NODE_TYPE_BILLBOARD, LOT_GRAPHNODEBILLBOARD },
@ -1141,7 +1141,7 @@ int smlua_func_cast_graph_node(lua_State* L) {
} }
u16 lot = 0; u16 lot = 0;
for (u8 i = 0; i != 23; i++) { for (u8 i = 0; i < ARRAY_COUNT(graphNodeLots); i++) {
if (graphNode->type != graphNodeLots[i].type) continue; if (graphNode->type != graphNodeLots[i].type) continue;
lot = graphNodeLots[i].lot; lot = graphNodeLots[i].lot;
break; break;
@ -1153,6 +1153,9 @@ int smlua_func_cast_graph_node(lua_State* L) {
smlua_push_object(L, lot, graphNode, NULL); smlua_push_object(L, lot, graphNode, NULL);
// Register this graph node as modified so it can be reset later
dynos_actor_register_modified_graph_node(graphNode);
return 1; return 1;
} }