mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
reset modified graph nodes on network shutdown
This commit is contained in:
parent
566e2ba934
commit
f0d6e4331d
5 changed files with 61 additions and 2 deletions
|
|
@ -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);
|
||||
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);
|
||||
void dynos_actor_register_modified_graph_node(struct GraphNode *node);
|
||||
|
||||
// -- collisions -- //
|
||||
void dynos_add_collision(const char *filePath, const char* collisionName);
|
||||
|
|
|
|||
|
|
@ -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_Override(struct Object* obj, void** aSharedChild);
|
||||
void DynOS_Actor_Override_All(void);
|
||||
void DynOS_Actor_RegisterModifiedGraphNode(GraphNode *aNode);
|
||||
void DynOS_Actor_ModShutdown();
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
void dynos_actor_register_modified_graph_node(struct GraphNode *node) {
|
||||
DynOS_Actor_RegisterModifiedGraphNode(node);
|
||||
}
|
||||
|
||||
// -- collisions -- //
|
||||
|
||||
void dynos_add_collision(const char *filePath, const char* collisionName) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <unordered_map>
|
||||
#include "dynos.cpp.h"
|
||||
|
||||
extern "C" {
|
||||
|
|
@ -21,6 +22,8 @@ static Array<Pair<const char*, void *>>& DynosCustomActors() {
|
|||
return sDynosCustomActors;
|
||||
}
|
||||
|
||||
static std::map<struct GraphNode *, struct GraphNode *> sModifiedModels;
|
||||
|
||||
// TODO: the cleanup/refactor didn't really go as planned.
|
||||
// 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() {
|
||||
auto& _DynosCustomActors = DynosCustomActors();
|
||||
while (_DynosCustomActors.Count() > 0) {
|
||||
|
|
@ -255,4 +297,12 @@ void DynOS_Actor_ModShutdown() {
|
|||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1098,7 +1098,7 @@ int smlua_func_collision_find_surface_on_ray(lua_State* L) {
|
|||
////////////////
|
||||
|
||||
typedef struct { s16 type; u16 lot; } GraphNodeLot;
|
||||
static GraphNodeLot graphNodeLots[23] = {
|
||||
static GraphNodeLot graphNodeLots[] = {
|
||||
{ GRAPH_NODE_TYPE_ANIMATED_PART, LOT_GRAPHNODEANIMATEDPART },
|
||||
{ GRAPH_NODE_TYPE_BACKGROUND, LOT_GRAPHNODEBACKGROUND },
|
||||
{ GRAPH_NODE_TYPE_BILLBOARD, LOT_GRAPHNODEBILLBOARD },
|
||||
|
|
@ -1141,7 +1141,7 @@ int smlua_func_cast_graph_node(lua_State* L) {
|
|||
}
|
||||
|
||||
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;
|
||||
lot = graphNodeLots[i].lot;
|
||||
break;
|
||||
|
|
@ -1153,6 +1153,9 @@ int smlua_func_cast_graph_node(lua_State* L) {
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue