mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-12-01 16:27:27 +00:00
Have levels automatically clean up their loaded graph nodes
This commit is contained in:
parent
81870df88b
commit
f66530dd17
3 changed files with 25 additions and 2 deletions
|
@ -60,6 +60,8 @@ static s16 sScriptStatus;
|
||||||
static s32 sRegister;
|
static s32 sRegister;
|
||||||
static struct LevelCommand *sCurrentCmd;
|
static struct LevelCommand *sCurrentCmd;
|
||||||
|
|
||||||
|
static u8 sLevelOwnedGraphNodes[MAX_LOADED_GRAPH_NODES] = { 0 };
|
||||||
|
|
||||||
static s32 eval_script_area(s32 arg) {
|
static s32 eval_script_area(s32 arg) {
|
||||||
return (sWarpDest.areaIdx == arg);
|
return (sWarpDest.areaIdx == arg);
|
||||||
}
|
}
|
||||||
|
@ -316,7 +318,6 @@ static void level_cmd_init_level(void) {
|
||||||
main_pool_push_state();
|
main_pool_push_state();
|
||||||
smlua_model_util_clear();
|
smlua_model_util_clear();
|
||||||
|
|
||||||
|
|
||||||
sCurrentCmd = CMD_NEXT;
|
sCurrentCmd = CMD_NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,12 +325,29 @@ static void level_cmd_clear_level(void) {
|
||||||
clear_objects();
|
clear_objects();
|
||||||
clear_area_graph_nodes();
|
clear_area_graph_nodes();
|
||||||
clear_areas();
|
clear_areas();
|
||||||
|
|
||||||
|
// reset the level's graph nodes to NULL
|
||||||
|
for (s32 i = 0; i < MAX_LOADED_GRAPH_NODES; i++) {
|
||||||
|
if (sLevelOwnedGraphNodes[i]) {
|
||||||
|
gLoadedGraphNodes[i] = NULL;
|
||||||
|
sLevelOwnedGraphNodes[i] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
main_pool_pop_state();
|
main_pool_pop_state();
|
||||||
|
|
||||||
|
|
||||||
sCurrentCmd = CMD_NEXT;
|
sCurrentCmd = CMD_NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void level_cmd_alloc_level_pool(void) {
|
static void level_cmd_alloc_level_pool(void) {
|
||||||
|
|
||||||
|
// reset level graph node ownership
|
||||||
|
for (s32 i = 0; i < MAX_LOADED_GRAPH_NODES; i++) {
|
||||||
|
if (sLevelOwnedGraphNodes[i]) {
|
||||||
|
sLevelOwnedGraphNodes[i] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (sLevelPool == NULL) {
|
if (sLevelPool == NULL) {
|
||||||
sLevelPool = alloc_only_pool_init(main_pool_available() - sizeof(struct AllocOnlyPool),
|
sLevelPool = alloc_only_pool_init(main_pool_available() - sizeof(struct AllocOnlyPool),
|
||||||
MEMORY_POOL_LEFT);
|
MEMORY_POOL_LEFT);
|
||||||
|
@ -390,6 +408,7 @@ static void level_cmd_load_model_from_dl(void) {
|
||||||
if (val1 < 256) {
|
if (val1 < 256) {
|
||||||
gLoadedGraphNodes[val1] =
|
gLoadedGraphNodes[val1] =
|
||||||
(struct GraphNode *) init_graph_node_display_list(sLevelPool, 0, val2, val3);
|
(struct GraphNode *) init_graph_node_display_list(sLevelPool, 0, val2, val3);
|
||||||
|
sLevelOwnedGraphNodes[val1] = true;
|
||||||
smlua_model_util_remember(val1, val2, val3, 1);
|
smlua_model_util_remember(val1, val2, val3, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,6 +421,7 @@ static void level_cmd_load_model_from_geo(void) {
|
||||||
|
|
||||||
if (arg0 < 256) {
|
if (arg0 < 256) {
|
||||||
gLoadedGraphNodes[arg0] = process_geo_layout(sLevelPool, arg1);
|
gLoadedGraphNodes[arg0] = process_geo_layout(sLevelPool, arg1);
|
||||||
|
sLevelOwnedGraphNodes[arg0] = true;
|
||||||
smlua_model_util_remember(arg0, LAYER_OPAQUE, arg1, 0);
|
smlua_model_util_remember(arg0, LAYER_OPAQUE, arg1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,6 +445,7 @@ static void level_cmd_23(void) {
|
||||||
// is being stored to the array, so cast the pointer.
|
// is being stored to the array, so cast the pointer.
|
||||||
gLoadedGraphNodes[model] =
|
gLoadedGraphNodes[model] =
|
||||||
(struct GraphNode *) init_graph_node_scale(sLevelPool, 0, arg0H, arg1, arg2.f);
|
(struct GraphNode *) init_graph_node_scale(sLevelPool, 0, arg0H, arg1, arg2.f);
|
||||||
|
sLevelOwnedGraphNodes[model] = true;
|
||||||
smlua_model_util_remember(model, arg0H, arg1, 1);
|
smlua_model_util_remember(model, arg0H, arg1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "pc/network/network.h"
|
#include "pc/network/network.h"
|
||||||
|
|
||||||
struct SpawnInfo gPlayerSpawnInfos[MAX_PLAYERS];
|
struct SpawnInfo gPlayerSpawnInfos[MAX_PLAYERS];
|
||||||
struct GraphNode *D_8033A160[0x100];
|
struct GraphNode *D_8033A160[MAX_LOADED_GRAPH_NODES];
|
||||||
struct Area gAreaData[8];
|
struct Area gAreaData[8];
|
||||||
|
|
||||||
struct WarpTransition gWarpTransition;
|
struct WarpTransition gWarpTransition;
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
#include "engine/graph_node.h"
|
#include "engine/graph_node.h"
|
||||||
|
|
||||||
|
#define MAX_LOADED_GRAPH_NODES 0x100
|
||||||
|
|
||||||
struct WarpNode
|
struct WarpNode
|
||||||
{
|
{
|
||||||
/*00*/ u8 id;
|
/*00*/ u8 id;
|
||||||
|
|
Loading…
Reference in a new issue