Gfx Vtx vanilla only duplicates (#733)

Some changes for gfx vtx duplication:
- Only vanilla (read-only) stuff is duplicated
- Stuff is duplicated only once, and uses a map rom->ram for next iterations
- Stuff is restored to original values on network shutdown

also fixes incorrect types in some extern declarations
This commit is contained in:
PeachyPeach 2025-04-08 02:20:50 +02:00 committed by GitHub
parent e46d3185cb
commit b190ee09fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 3111 additions and 159 deletions

View file

@ -1,7 +1,7 @@
extern const GeoLayout error_model_geo[];
extern Lights1 error_model_f3d_material_lights;
extern Vtx error_model_error_bone_mesh_layer_1_vtx_0[336];
extern Gfx error_model_error_bone_mesh_layer_1_tri_0[];
extern Gfx mat_error_model_f3d_material[];
extern Gfx error_model_error_bone_mesh_layer_1[];
extern Gfx error_model_material_revert_render_settings[];
extern const Lights1 error_model_f3d_material_lights;
extern const Vtx error_model_error_bone_mesh_layer_1_vtx_0[336];
extern const Gfx error_model_error_bone_mesh_layer_1_tri_0[];
extern const Gfx mat_error_model_f3d_material[];
extern const Gfx error_model_error_bone_mesh_layer_1[];
extern const Gfx error_model_material_revert_render_settings[];

View file

@ -2,3 +2,4 @@
python3 ./autogen/convert_structs.py $1
python3 ./autogen/convert_functions.py $1
python3 ./autogen/convert_constants.py $1
python3 ./autogen/extract_display_lists.py $1

View file

@ -0,0 +1,122 @@
import os
import re
import sys
DIRECTORIES = [
"actors",
"bin",
"levels",
]
FILE_EXTENSIONS = [
".c",
".h",
]
CUSTOM_DEFINED = [
"dl_billboard_num3_0",
"dl_billboard_num3_1",
"dl_billboard_num3_2",
"dl_billboard_num3_3",
"dl_billboard_num3_4",
"dl_billboard_num3_5",
"dl_billboard_num3_6",
"dl_billboard_num3_7",
"dl_billboard_num3_8",
"dl_billboard_num3_9",
"dl_billboard_num3_0x",
"dl_billboard_num3_1x",
"dl_billboard_num3_2x",
"dl_billboard_num3_3x",
"dl_billboard_num3_4x",
"dl_billboard_num3_5x",
"dl_billboard_num3_6x",
"dl_billboard_num3_7x",
"dl_billboard_num3_8x",
"dl_billboard_num3_9x",
"dl_billboard_num3_x0",
"dl_billboard_num3_x1",
"dl_billboard_num3_x2",
"dl_billboard_num3_x3",
"dl_billboard_num3_x4",
"dl_billboard_num3_x5",
"dl_billboard_num3_x6",
"dl_billboard_num3_x7",
"dl_billboard_num3_x8",
"dl_billboard_num3_x9",
"dl_billboard_num3_0xx",
"dl_billboard_num3_1xx",
"dl_billboard_num3_2xx",
"dl_billboard_num3_3xx",
"dl_billboard_num3_4xx",
"dl_billboard_num3_5xx",
"dl_billboard_num3_6xx",
"dl_billboard_num3_7xx",
"dl_billboard_num3_8xx",
"dl_billboard_num3_9xx",
"dl_billboard_num3_x0x",
"dl_billboard_num3_x1x",
"dl_billboard_num3_x2x",
"dl_billboard_num3_x3x",
"dl_billboard_num3_x4x",
"dl_billboard_num3_x5x",
"dl_billboard_num3_x6x",
"dl_billboard_num3_x7x",
"dl_billboard_num3_x8x",
"dl_billboard_num3_x9x",
"dl_billboard_num3_xx0",
"dl_billboard_num3_xx1",
"dl_billboard_num3_xx2",
"dl_billboard_num3_xx3",
"dl_billboard_num3_xx4",
"dl_billboard_num3_xx5",
"dl_billboard_num3_xx6",
"dl_billboard_num3_xx7",
"dl_billboard_num3_xx8",
"dl_billboard_num3_xx9",
]
def main():
verbose = len(sys.argv) > 1 and (sys.argv[1] == "-v" or sys.argv[1] == "--verbose")
pattern = re.compile("[\W]+")
display_lists = []
for dir in DIRECTORIES:
for root, _, filenames in os.walk(dir):
for filename in filenames:
if filename[filename.rfind("."):] in FILE_EXTENSIONS:
display_lists_in_file = []
filepath = os.path.join(root, filename)
lines = open(filepath, "r").readlines()
ignore = False
for line in lines:
if ("#ifdef VERSION_EU" in line or
"#ifdef VERSION_SH" in line or
"#ifdef VERSION_JP" in line):
ignore = True
if "#endif" in line:
ignore = False
if not ignore and "Gfx" in line and "static" not in line and "extern" not in line and "#" not in line:
identifiers = pattern.sub(" ", line).split()
index_gfx = identifiers.index("Gfx")
name = identifiers[index_gfx + 1]
if name not in display_lists:
display_lists.append(name)
if verbose:
display_lists_in_file.append(name)
if verbose and display_lists_in_file:
print("%s\n %s" % (filepath, "\n ".join(display_lists_in_file)))
# Add these manually because they are defined by a macro
display_lists += CUSTOM_DEFINED
with open("include/display_lists.inl", "w") as f:
for name in display_lists:
f.write("DISPLAY_LIST(%s)\n" % (name))
print("Total display lists: %d" % (len(display_lists)))
if __name__ == "__main__":
main()

View file

@ -79,7 +79,8 @@ struct GraphNode* dynos_model_load_dl(u32* aId, enum ModelPool aModelPool, u8 aL
struct GraphNode* dynos_model_store_geo(u32* aId, enum ModelPool aModelPool, void* aAsset, struct GraphNode* aGraphNode);
struct GraphNode* dynos_model_get_geo(u32 aId);
void dynos_model_overwrite_slot(u32 srcSlot, u32 dstSlot);
Gfx *dynos_model_duplicate_displaylist(Gfx* gfx);
Gfx *dynos_model_get_writable_display_list(Gfx* gfx);
void dynos_model_restore_vanilla_display_lists();
u32 dynos_model_get_id_from_asset(void* aAsset);
u32 dynos_model_get_id_from_graph_node(struct GraphNode* aGraphNode);
void dynos_model_clear_pool(enum ModelPool aModelPool);

View file

@ -865,6 +865,8 @@ const void* DynOS_Builtin_Func_GetFromName(const char* aDataName);
const void* DynOS_Builtin_Func_GetFromIndex(s32 aIndex);
const char * DynOS_Builtin_Func_GetNameFromIndex(s64 aIndex);
s32 DynOS_Builtin_Func_GetIndexFromData(const void* aData);
const Gfx * DynOS_Builtin_Gfx_GetFromName(const char *aDataName);
const char * DynOS_Builtin_Gfx_GetFromData(const Gfx *aData);
//
// Pack Manager
@ -972,7 +974,8 @@ struct GraphNode* DynOS_Model_GetGeo(u32 aId);
u32 DynOS_Model_GetIdFromAsset(void* asset);
u32 DynOS_Model_GetIdFromGraphNode(struct GraphNode* aNode);
void DynOS_Model_OverwriteSlot(u32 srcSlot, u32 dstSlot);
Gfx *DynOS_Model_Duplicate_DisplayList(Gfx* aGfx);
Gfx *DynOS_Model_GetWritableDisplayList(Gfx* aGfx);
void DynOS_Model_RestoreVanillaDisplayLists();
void DynOS_Model_ClearPool(enum ModelPool aModelPool);
//

View file

@ -270,8 +270,12 @@ void dynos_model_overwrite_slot(u32 srcSlot, u32 dstSlot) {
DynOS_Model_OverwriteSlot(srcSlot, dstSlot);
}
Gfx *dynos_model_duplicate_displaylist(Gfx* gfx) {
return DynOS_Model_Duplicate_DisplayList(gfx);
Gfx *dynos_model_get_writable_display_list(Gfx* gfx) {
return DynOS_Model_GetWritableDisplayList(gfx);
}
void dynos_model_restore_vanilla_display_lists() {
return DynOS_Model_RestoreVanillaDisplayLists();
}
// -- other -- //

View file

@ -126,9 +126,9 @@ extern "C" {
} \
return NULL;
///////////////////////
// Function Pointers //
///////////////////////
/////////////////////
// Script Pointers //
/////////////////////
static const void* sDynosBuiltinScriptPtrs[] = {
define_builtin(level_main_scripts_entry),
@ -2060,3 +2060,21 @@ s32 DynOS_Builtin_Func_GetIndexFromData(const void* aData) {
}
return -1;
}
///////////////////
// Display Lists //
///////////////////
static const void *sDynosBuiltinDisplayLists[] = {
#define DISPLAY_LIST(name) define_builtin(name),
#include "include/display_lists.inl"
#undef DISPLAY_LIST
};
const Gfx *DynOS_Builtin_Gfx_GetFromName(const char *aDataName) {
MGR_FIND_DATA(sDynosBuiltinDisplayLists, (const Gfx *));
}
const char *DynOS_Builtin_Gfx_GetFromData(const Gfx *aData) {
MGR_FIND_NAME(sDynosBuiltinDisplayLists);
}

View file

@ -1,4 +1,9 @@
#include "include/types.h"
//////////////
// Textures //
//////////////
extern ALIGNED8 const Texture amp_seg8_texture_08000F18[];
extern ALIGNED8 const Texture amp_seg8_texture_08001318[];
extern ALIGNED8 const Texture amp_seg8_texture_08001B18[];
@ -2359,3 +2364,12 @@ extern ALIGNED8 const Texture cake_end_texture_44[];
extern ALIGNED8 const Texture cake_end_texture_45[];
extern ALIGNED8 const Texture cake_end_texture_46[];
extern ALIGNED8 const Texture cake_end_texture_47[];
///////////////////
// Display lists //
///////////////////
#define DISPLAY_LIST(name) \
extern const Gfx name[];
#include "include/display_lists.inl"
#undef DISPLAY_LIST

View file

@ -8,6 +8,7 @@ extern "C" {
#include "model_ids.h"
#include "pc/lua/utils/smlua_model_utils.h"
#include "engine/display_list.h"
#include "dynos_mgr_builtin_externs.h"
}
enum ModelLoadType {
@ -21,7 +22,6 @@ struct ModelInfo {
void* asset;
struct GraphNode* graphNode;
enum ModelPool modelPool;
std::vector<void*> *duplicates;
};
static struct DynamicPool* sModelPools[MODEL_POOL_MAX] = { 0 };
@ -30,9 +30,8 @@ static std::map<void*, struct ModelInfo> sAssetMap[MODEL_POOL_MAX];
static std::map<u32, std::vector<struct ModelInfo>> sIdMap;
static std::map<u32, u32> sOverwriteMap;
// An array of display list and/or vertex buffer duplicates for the current model processed in process_geo_layout
static std::vector<void*> *sCurrModelDuplicates = nullptr;
static std::vector<void*> sScheduledFree[MODEL_POOL_MAX];
// Maps read-only Gfx and Vtx buffers to their writable duplicates
static std::map<void *, std::pair<void *, size_t>> sRomToRamGfxVtxMap;
static u32 find_empty_id(bool aIsPermanent) {
u32 id = aIsPermanent ? 9999 : VANILLA_ID_END + 1;
@ -96,8 +95,6 @@ static struct GraphNode* DynOS_Model_LoadCommonInternal(u32* aId, enum ModelPool
return found.graphNode;
}
sCurrModelDuplicates = new std::vector<void*>();
// load geo
struct GraphNode* node = NULL;
switch (mlt) {
@ -111,14 +108,7 @@ static struct GraphNode* DynOS_Model_LoadCommonInternal(u32* aId, enum ModelPool
node = aGraphNode;
break;
}
if (!node) {
for (auto &duplicate : *sCurrModelDuplicates) {
free(duplicate);
}
delete sCurrModelDuplicates;
sCurrModelDuplicates = nullptr;
return NULL;
}
if (!node) { return NULL; }
// figure out id
if (!*aId) { *aId = find_empty_id(aModelPool == MODEL_POOL_PERMANENT); }
@ -129,9 +119,7 @@ static struct GraphNode* DynOS_Model_LoadCommonInternal(u32* aId, enum ModelPool
.asset = aAsset,
.graphNode = node,
.modelPool = aModelPool,
.duplicates = sCurrModelDuplicates,
};
sCurrModelDuplicates = nullptr;
// store in maps
sIdMap[*aId].push_back(info);
@ -241,54 +229,93 @@ void DynOS_Model_OverwriteSlot(u32 srcSlot, u32 dstSlot) {
sOverwriteMap[srcSlot] = dstSlot;
}
// Display lists need to be duplicated so they can be modified by mods
// also to prevent trying to write to read only memory for vanilla display lists
Gfx *DynOS_Model_Duplicate_DisplayList(Gfx* aGfx) {
if (!aGfx) { return nullptr; }
static Vtx *DynOS_Model_DuplicateVtx(Vtx *aVtx, u32 vtxCount, bool shouldDuplicate) {
if (!aVtx) { return NULL; }
u32 size = gfx_get_size(aGfx) * sizeof(Gfx);
Gfx *gfxDuplicate = (Gfx *) malloc(size);
memcpy(gfxDuplicate, aGfx, size);
// Return duplicate if it already exists
auto it = sRomToRamGfxVtxMap.find((void *) aVtx);
if (it != sRomToRamGfxVtxMap.end()) {
return (Vtx *) it->second.first;
}
// Duplicate vertex buffer and return the copy
if (shouldDuplicate) {
size_t vtxSize = vtxCount * sizeof(Vtx);
Vtx *vtxDuplicate = (Vtx *) malloc(vtxSize);
memcpy(vtxDuplicate, aVtx, vtxSize);
DynOS_Find_Pending_Scroll_Target(aVtx, vtxDuplicate);
sRomToRamGfxVtxMap[(void *) aVtx] = { (void *) vtxDuplicate, vtxSize };
return vtxDuplicate;
}
return aVtx;
}
static Gfx *DynOS_Model_DuplicateDisplayList(Gfx *aGfx, bool shouldDuplicate) {
if (!aGfx) { return NULL; }
// Return duplicate if it already exists
auto it = sRomToRamGfxVtxMap.find((void *) aGfx);
if (it != sRomToRamGfxVtxMap.end()) {
return (Gfx *) it->second.first;
}
// Check if it's vanilla
if (!shouldDuplicate) {
shouldDuplicate = (DynOS_Builtin_Gfx_GetFromData(aGfx) != NULL);
}
// Duplicate display list
Gfx *gfxDuplicate = aGfx;
u32 gfxLength = gfx_get_size(aGfx);
if (shouldDuplicate) {
size_t gfxSize = gfxLength * sizeof(Gfx);
gfxDuplicate = (Gfx *) malloc(gfxSize);
memcpy(gfxDuplicate, aGfx, gfxSize);
sRomToRamGfxVtxMap[(void *) aGfx] = { (void *) gfxDuplicate, gfxSize };
}
// Look for other display lists or vertices
for (u32 i = 0; i < size / sizeof(Gfx); i++) {
for (u32 i = 0; i < gfxLength; i++) {
Gfx *cmd = gfxDuplicate + i;
u32 op = cmd->words.w0 >> 24;
// Duplicate referenced display lists
if (op == G_DL) {
cmd->words.w1 = (uintptr_t) DynOS_Model_Duplicate_DisplayList((Gfx *) cmd->words.w1);
cmd->words.w1 = (uintptr_t) DynOS_Model_DuplicateDisplayList((Gfx *) cmd->words.w1, shouldDuplicate);
if (C0(cmd, 16, 1) == G_DL_NOPUSH) { break; } // This is a branch (jump), end of display list
}
// Duplicate referenced vertices
if (op == G_VTX) {
u32 size = C0(cmd, 12, 8) * sizeof(Vtx);
Vtx *vtxDuplicate = (Vtx *) malloc(size);
memcpy(vtxDuplicate, (Vtx *) cmd->words.w1, size);
DynOS_Find_Pending_Scroll_Target((Vtx *) cmd->words.w1, vtxDuplicate);
cmd->words.w1 = (uintptr_t) vtxDuplicate;
sCurrModelDuplicates->push_back(vtxDuplicate);
cmd->words.w1 = (uintptr_t) DynOS_Model_DuplicateVtx((Vtx *) cmd->words.w1, C0(cmd, 12, 8), shouldDuplicate);
}
}
sCurrModelDuplicates->push_back(gfxDuplicate);
return gfxDuplicate;
}
// Get a writable display list so it can be modified by mods
// If it's a vanilla display list, duplicate it, so it can be restored later
Gfx *DynOS_Model_GetWritableDisplayList(Gfx *aGfx) {
return DynOS_Model_DuplicateDisplayList(aGfx, false);
}
void DynOS_Model_RestoreVanillaDisplayLists() {
for (auto &it : sRomToRamGfxVtxMap) {
const void *original = it.first;
void *duplicate = it.second.first;
size_t size = it.second.second;
memcpy(duplicate, original, size);
}
}
void DynOS_Model_ClearPool(enum ModelPool aModelPool) {
if (!sModelPools[aModelPool]) { return; }
// schedule pool to be freed
dynamic_pool_free_pool(sModelPools[aModelPool]);
// free scheduled duplicates
for (auto &duplicate : sScheduledFree[aModelPool]) {
free(duplicate);
}
sScheduledFree[aModelPool].clear();
// clear overwrite
if (aModelPool == MODEL_POOL_LEVEL) {
sOverwriteMap.clear();
@ -316,15 +343,6 @@ void DynOS_Model_ClearPool(enum ModelPool aModelPool) {
info2++;
}
}
// schedule duplicates to be freed
if (info.duplicates) {
for (auto &duplicate : *info.duplicates) {
sScheduledFree[aModelPool].push_back(duplicate);
}
delete info.duplicates;
info.duplicates = nullptr;
}
}
assetMap.clear();

2769
include/display_lists.inl Normal file

File diff suppressed because it is too large Load diff

View file

@ -235,7 +235,7 @@ init_graph_node_translation_rotation(struct DynamicPool *pool,
vec3s_copy(graphNode->translation, translation);
vec3s_copy(graphNode->rotation, rotation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;
@ -257,7 +257,7 @@ struct GraphNodeTranslation *init_graph_node_translation(struct DynamicPool *poo
vec3s_copy(graphNode->translation, translation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;
@ -278,7 +278,7 @@ struct GraphNodeRotation *init_graph_node_rotation(struct DynamicPool *pool,
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_ROTATION);
vec3s_copy(graphNode->rotation, rotation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;
@ -299,7 +299,7 @@ struct GraphNodeScale *init_graph_node_scale(struct DynamicPool *pool,
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->scale = scale;
graphNode->prevScale = scale;
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;
@ -369,7 +369,7 @@ struct GraphNodeAnimatedPart *init_graph_node_animated_part(struct DynamicPool *
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_ANIMATED_PART);
vec3s_copy(graphNode->translation, translation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;
@ -390,7 +390,7 @@ struct GraphNodeBillboard *init_graph_node_billboard(struct DynamicPool *pool,
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_BILLBOARD);
vec3s_copy(graphNode->translation, translation);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;
@ -409,7 +409,7 @@ struct GraphNodeDisplayList *init_graph_node_display_list(struct DynamicPool *po
if (graphNode != NULL) {
init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_DISPLAY_LIST);
graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF);
graphNode->displayList = dynos_model_duplicate_displaylist(displayList);
graphNode->displayList = dynos_model_get_writable_display_list(displayList);
}
return graphNode;

View file

@ -90,12 +90,12 @@ struct MovtexObject {
/// segmented address to movtex mesh with vertices
void *movtexVerts;
/// display list inserted before moving triangles
Gfx *beginDl;
const Gfx *beginDl;
/// display list inserted after moving triangles
Gfx *endDl;
const Gfx *endDl;
/// display list with the actual moving texture triangles.
/// Assumes the animated vertices are buffered and correct texture is set
Gfx *triDl;
const Gfx *triDl;
// if the list does not have per-vertex colors, all vertices have these colors
u8 r; /// red
u8 g; /// green
@ -134,58 +134,58 @@ u8 *gMovtexIdToTexture[] = { texture_waterbox_water, texture_waterbox_mist,
texture_waterbox_lava, ssl_quicksand,
ssl_pyramid_sand, ttc_yellow_triangle };
extern Gfx castle_grounds_dl_waterfall[];
extern const Gfx castle_grounds_dl_waterfall[];
extern s16 castle_grounds_movtex_tris_waterfall[];
extern s16 ssl_movtex_tris_pyramid_sand_pathway_front[];
extern Gfx ssl_dl_pyramid_sand_pathway_begin[];
extern Gfx ssl_dl_pyramid_sand_pathway_end[];
extern Gfx ssl_dl_pyramid_sand_pathway_front_end[];
extern const Gfx ssl_dl_pyramid_sand_pathway_begin[];
extern const Gfx ssl_dl_pyramid_sand_pathway_end[];
extern const Gfx ssl_dl_pyramid_sand_pathway_front_end[];
extern s16 ssl_movtex_tris_pyramid_sand_pathway_floor[];
extern Gfx ssl_dl_pyramid_sand_pathway_floor_begin[];
extern Gfx ssl_dl_pyramid_sand_pathway_floor_end[];
extern const Gfx ssl_dl_pyramid_sand_pathway_floor_begin[];
extern const Gfx ssl_dl_pyramid_sand_pathway_floor_end[];
extern s16 ssl_movtex_tris_pyramid_sand_pathway_side[];
extern Gfx ssl_dl_pyramid_sand_pathway_side_end[];
extern const Gfx ssl_dl_pyramid_sand_pathway_side_end[];
extern s16 bitfs_movtex_tris_lava_first_section[];
extern Gfx bitfs_dl_lava_sections[];
extern const Gfx bitfs_dl_lava_sections[];
extern s16 bitfs_movtex_tris_lava_second_section[];
extern s16 bitfs_movtex_tris_lava_floor[];
extern Gfx bitfs_dl_lava_floor[];
extern const Gfx bitfs_dl_lava_floor[];
extern s16 lll_movtex_tris_lava_floor[];
extern Gfx lll_dl_lava_floor[];
extern const Gfx lll_dl_lava_floor[];
extern s16 lll_movtex_tris_lavafall_volcano[];
extern Gfx lll_dl_lavafall_volcano[];
extern const Gfx lll_dl_lavafall_volcano[];
extern s16 cotmc_movtex_tris_water[];
extern Gfx cotmc_dl_water_begin[];
extern Gfx cotmc_dl_water_end[];
extern Gfx cotmc_dl_water[];
extern const Gfx cotmc_dl_water_begin[];
extern const Gfx cotmc_dl_water_end[];
extern const Gfx cotmc_dl_water[];
extern s16 ttm_movtex_tris_begin_waterfall[];
extern Gfx ttm_dl_waterfall[];
extern const Gfx ttm_dl_waterfall[];
extern s16 ttm_movtex_tris_end_waterfall[];
extern s16 ttm_movtex_tris_begin_puddle_waterfall[];
extern Gfx ttm_dl_bottom_waterfall[];
extern const Gfx ttm_dl_bottom_waterfall[];
extern s16 ttm_movtex_tris_end_puddle_waterfall[];
extern s16 ttm_movtex_tris_puddle_waterfall[];
extern Gfx ttm_dl_puddle_waterfall[];
extern const Gfx ttm_dl_puddle_waterfall[];
extern s16 ssl_movtex_tris_pyramid_quicksand[];
extern Gfx ssl_dl_quicksand_begin[];
extern Gfx ssl_dl_quicksand_end[];
extern Gfx ssl_dl_pyramid_quicksand[];
extern const Gfx ssl_dl_quicksand_begin[];
extern const Gfx ssl_dl_quicksand_end[];
extern const Gfx ssl_dl_pyramid_quicksand[];
extern s16 ssl_movtex_tris_pyramid_corners_quicksand[];
extern Gfx ssl_dl_pyramid_corners_quicksand[];
extern const Gfx ssl_dl_pyramid_corners_quicksand[];
extern s16 ssl_movtex_tris_sides_quicksand[];
extern Gfx ssl_dl_sides_quicksand[];
extern const Gfx ssl_dl_sides_quicksand[];
extern s16 ttc_movtex_tris_big_surface_treadmill[];
extern Gfx ttc_dl_surface_treadmill_begin[];
extern Gfx ttc_dl_surface_treadmill_end[];
extern Gfx ttc_dl_surface_treadmill[];
extern const Gfx ttc_dl_surface_treadmill_begin[];
extern const Gfx ttc_dl_surface_treadmill_end[];
extern const Gfx ttc_dl_surface_treadmill[];
extern s16 ttc_movtex_tris_small_surface_treadmill[];
extern s16 ssl_movtex_tris_quicksand_pit[];
extern Gfx ssl_dl_quicksand_pit_begin[];
extern Gfx ssl_dl_quicksand_pit_end[];
extern Gfx ssl_dl_quicksand_pit[];
extern const Gfx ssl_dl_quicksand_pit_begin[];
extern const Gfx ssl_dl_quicksand_pit_end[];
extern const Gfx ssl_dl_quicksand_pit[];
extern s16 ssl_movtex_tris_pyramid_quicksand_pit[];
extern Gfx ssl_dl_pyramid_quicksand_pit_begin[];
extern Gfx ssl_dl_pyramid_quicksand_pit_end[];
extern const Gfx ssl_dl_pyramid_quicksand_pit_begin[];
extern const Gfx ssl_dl_pyramid_quicksand_pit_end[];
/**
* MovtexObjects that have no color attributes per vertex (though the mesh

View file

@ -9,10 +9,10 @@ extern u8* seg2_course_name_table[];
extern u8* seg2_course_name_table_original[];
extern u8* seg2_act_name_table[];
extern u8* seg2_act_name_table_original[];
extern Gfx dl_rgba16_text_begin[];
extern Gfx dl_rgba16_text_end[];
extern Gfx dl_ia_text_begin[];
extern Gfx dl_ia_text_end[];
extern const Gfx dl_rgba16_text_begin[];
extern const Gfx dl_rgba16_text_end[];
extern const Gfx dl_ia_text_begin[];
extern const Gfx dl_ia_text_end[];
extern Texture texture_transition_star_half[];
extern Texture texture_transition_circle_half[];
extern Texture texture_transition_mario[];
@ -22,51 +22,51 @@ extern Texture texture_waterbox_mist[];
extern Texture texture_waterbox_jrb_water[];
extern Texture texture_waterbox_unknown_water[];
extern Texture texture_waterbox_lava[];
extern Gfx dl_proj_mtx_fullscreen[];
extern Gfx dl_draw_quad_verts_0123[];
extern Gfx dl_screen_transition_end[];
extern Gfx dl_transition_draw_filled_region[];
extern Gfx dl_shadow_circle[];
extern Gfx dl_shadow_square[];
extern Gfx dl_shadow_spike_ext[];
extern Gfx dl_shadow_9_verts[];
extern Gfx dl_shadow_4_verts[];
extern Gfx dl_shadow_end[];
extern Gfx dl_skybox_begin[];
extern Gfx dl_skybox_tile_tex_settings[];
extern Gfx dl_skybox_end[];
extern Gfx dl_waterbox_ia16_begin[];
extern Gfx dl_waterbox_rgba16_begin[];
extern Gfx dl_waterbox_end[];
extern Gfx dl_paintings_draw_ripples[];
extern Gfx dl_paintings_rippling_begin[];
extern Gfx dl_paintings_rippling_end[];
extern Gfx dl_paintings_env_mapped_begin[];
extern Gfx dl_paintings_env_mapped_end[];
extern const Gfx dl_proj_mtx_fullscreen[];
extern const Gfx dl_draw_quad_verts_0123[];
extern const Gfx dl_screen_transition_end[];
extern const Gfx dl_transition_draw_filled_region[];
extern const Gfx dl_shadow_circle[];
extern const Gfx dl_shadow_square[];
extern const Gfx dl_shadow_spike_ext[];
extern const Gfx dl_shadow_9_verts[];
extern const Gfx dl_shadow_4_verts[];
extern const Gfx dl_shadow_end[];
extern const Gfx dl_skybox_begin[];
extern const Gfx dl_skybox_tile_tex_settings[];
extern const Gfx dl_skybox_end[];
extern const Gfx dl_waterbox_ia16_begin[];
extern const Gfx dl_waterbox_rgba16_begin[];
extern const Gfx dl_waterbox_end[];
extern const Gfx dl_paintings_draw_ripples[];
extern const Gfx dl_paintings_rippling_begin[];
extern const Gfx dl_paintings_rippling_end[];
extern const Gfx dl_paintings_env_mapped_begin[];
extern const Gfx dl_paintings_env_mapped_end[];
extern u8 seg2_painting_triangle_mesh[];
extern u8 seg2_painting_mesh_neighbor_tris[];
extern u8* main_hud_lut[58];
extern Gfx dl_hud_img_load_tex_block[];
extern Gfx dl_hud_img_begin[];
extern Gfx dl_hud_img_end[];
extern const Gfx dl_hud_img_load_tex_block[];
extern const Gfx dl_hud_img_begin[];
extern const Gfx dl_hud_img_end[];
extern void *main_font_lut[];
extern Gfx dl_ia_text_tex_settings[];
extern Gfx dl_rgba16_load_tex_block[];
extern const Gfx dl_ia_text_tex_settings[];
extern const Gfx dl_rgba16_load_tex_block[];
extern void *main_credits_font_lut[];
extern u8* main_hud_camera_lut[6];
extern Gfx dl_draw_text_bg_box[];
extern Gfx dl_draw_triangle[];
extern const Gfx dl_draw_text_bg_box[];
extern const Gfx dl_draw_triangle[];
extern const u8* seg2_dialog_original[];
extern void *seg2_dialog_table[];
extern Gfx dl_billboard_num_0[];
extern Gfx dl_billboard_num_1[];
extern Gfx dl_billboard_num_2[];
extern Gfx dl_billboard_num_3[];
extern Gfx dl_billboard_num_4[];
extern Gfx dl_billboard_num_5[];
extern Gfx dl_billboard_num_6[];
extern Gfx dl_billboard_num_7[];
extern Gfx dl_billboard_num_8[];
extern Gfx dl_billboard_num_9[];
extern const Gfx dl_billboard_num_0[];
extern const Gfx dl_billboard_num_1[];
extern const Gfx dl_billboard_num_2[];
extern const Gfx dl_billboard_num_3[];
extern const Gfx dl_billboard_num_4[];
extern const Gfx dl_billboard_num_5[];
extern const Gfx dl_billboard_num_6[];
extern const Gfx dl_billboard_num_7[];
extern const Gfx dl_billboard_num_8[];
extern const Gfx dl_billboard_num_9[];
#endif // SEGMENT2_H

View file

@ -5,27 +5,27 @@
#include <PR/gbi.h>
// from main menu segment 7
extern u8 dl_menu_idle_hand[];
extern u8 dl_menu_grabbing_hand[];
extern u8 menu_hud_lut[];
extern u8 menu_font_lut[];
extern u8 dl_menu_ia8_text_begin[];
extern u8 dl_menu_ia8_text_end[];
extern u8 dl_menu_rgba16_wood_course[];
extern const Gfx dl_menu_idle_hand[];
extern const Gfx dl_menu_grabbing_hand[];
extern const Gfx menu_hud_lut[];
extern const Gfx menu_font_lut[];
extern const Gfx dl_menu_ia8_text_begin[];
extern const Gfx dl_menu_ia8_text_end[];
extern const Gfx dl_menu_rgba16_wood_course[];
#ifdef VERSION_EU
extern u8 dl_menu_rgba16_wood_course_end[];
extern u8 dl_menu_texture_course_upper[];
extern u8 dl_menu_texture_niveau_upper[];
extern u8 dl_menu_texture_kurs_upper[];
extern const Gfx dl_menu_rgba16_wood_course_end[];
extern const Gfx dl_menu_texture_course_upper[];
extern const Gfx dl_menu_texture_niveau_upper[];
extern const Gfx dl_menu_texture_kurs_upper[];
extern const u8 eu_course_strings_en_table[];
extern const u8 eu_course_strings_fr_table[];
extern const u8 eu_course_strings_de_table[];
extern const Gfx eu_course_strings_en_table[];
extern const Gfx eu_course_strings_fr_table[];
extern const Gfx eu_course_strings_de_table[];
#endif
// from intro_segment7
extern Gfx *intro_seg7_dl_0700B3A0;
extern Gfx *intro_seg7_dl_0700C6A0;
extern const Gfx intro_seg7_dl_0700B3A0[];
extern const Gfx intro_seg7_dl_0700C6A0[];
extern f32 intro_seg7_table_0700C790[];
extern f32 intro_seg7_table_0700C880[];

View file

@ -669,6 +669,8 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect
if (exiting) { return; }
dynos_model_restore_vanilla_display_lists();
// reset other stuff
extern u8* gOverrideEeprom;
gOverrideEeprom = NULL;