Rewrote extended model loading code. Should (hopefully) fix floating player models replacing stars

This commit is contained in:
MysterD 2022-04-10 16:19:07 -07:00
parent 87e772c8ea
commit d92c9dcfd4
2 changed files with 184 additions and 141 deletions

View file

@ -55,69 +55,76 @@
#include "pc/debuglog.h" #include "pc/debuglog.h"
struct ModelUtilsInfo { struct ModelUtilsInfo {
enum ModelExtendedId id; enum ModelExtendedId extId;
const void* asset;
u8 layer; u8 layer;
u8 loadedId;
bool permanent;
bool isDisplayList; bool isDisplayList;
u8 cacheId; const void* asset;
}; };
#define MODEL_UTIL_GEO(x, y) [x] = { .id = x, .asset = y, .layer = LAYER_OPAQUE, .isDisplayList = false, .cacheId = 0xFF } #define UNLOADED_ID 0xFF
#define MODEL_UTIL_DL(x, y, z) [x] = { .id = x, .asset = y, .layer = z, .isDisplayList = true, .cacheId = 0xFF }
#define MODEL_UTIL_GEO(x, y) [x] = { .extId = x, .asset = y, .layer = LAYER_OPAQUE, .isDisplayList = false, .loadedId = UNLOADED_ID, .permanent = false }
#define MODEL_UTIL_DL(x, y, z) [x] = { .extId = x, .asset = y, .layer = z, .isDisplayList = true, .loadedId = UNLOADED_ID, .permanent = false }
#define MODEL_UTIL_GEO_PERM(x, y) [x] = { .extId = x, .asset = y, .layer = LAYER_OPAQUE, .isDisplayList = false, .loadedId = UNLOADED_ID, .permanent = true }
#define MODEL_UTIL_DL_PERM(x, y, z) [x] = { .extId = x, .asset = y, .layer = z, .isDisplayList = true, .loadedId = UNLOADED_ID, .permanent = true }
struct ModelUtilsInfo sModels[E_MODEL_MAX] = { struct ModelUtilsInfo sModels[E_MODEL_MAX] = {
MODEL_UTIL_GEO(E_MODEL_NONE, NULL), MODEL_UTIL_GEO(E_MODEL_NONE, NULL),
// actors // actors
MODEL_UTIL_GEO(E_MODEL_MARIO, mario_geo), MODEL_UTIL_GEO_PERM(E_MODEL_MARIO, mario_geo),
MODEL_UTIL_GEO(E_MODEL_SMOKE, smoke_geo), MODEL_UTIL_GEO_PERM(E_MODEL_SMOKE, smoke_geo),
MODEL_UTIL_GEO(E_MODEL_SPARKLES, sparkles_geo), MODEL_UTIL_GEO_PERM(E_MODEL_SPARKLES, sparkles_geo),
MODEL_UTIL_GEO(E_MODEL_BUBBLE, bubble_geo), MODEL_UTIL_GEO_PERM(E_MODEL_BUBBLE, bubble_geo),
MODEL_UTIL_GEO(E_MODEL_SMALL_WATER_SPLASH, small_water_splash_geo), MODEL_UTIL_GEO_PERM(E_MODEL_SMALL_WATER_SPLASH, small_water_splash_geo),
MODEL_UTIL_GEO(E_MODEL_IDLE_WATER_WAVE, idle_water_wave_geo), MODEL_UTIL_GEO_PERM(E_MODEL_IDLE_WATER_WAVE, idle_water_wave_geo),
MODEL_UTIL_GEO(E_MODEL_WATER_SPLASH, water_splash_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WATER_SPLASH, water_splash_geo),
MODEL_UTIL_GEO(E_MODEL_WAVE_TRAIL, wave_trail_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WAVE_TRAIL, wave_trail_geo),
MODEL_UTIL_GEO(E_MODEL_YELLOW_COIN, yellow_coin_geo), MODEL_UTIL_GEO_PERM(E_MODEL_YELLOW_COIN, yellow_coin_geo),
MODEL_UTIL_GEO(E_MODEL_STAR, star_geo), MODEL_UTIL_GEO_PERM(E_MODEL_STAR, star_geo),
MODEL_UTIL_GEO(E_MODEL_TRANSPARENT_STAR, transparent_star_geo), MODEL_UTIL_GEO_PERM(E_MODEL_TRANSPARENT_STAR, transparent_star_geo),
MODEL_UTIL_GEO(E_MODEL_WOODEN_SIGNPOST, wooden_signpost_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WOODEN_SIGNPOST, wooden_signpost_geo),
MODEL_UTIL_DL (E_MODEL_WHITE_PARTICLE_SMALL, white_particle_small_dl, LAYER_ALPHA), MODEL_UTIL_DL_PERM (E_MODEL_WHITE_PARTICLE_SMALL, white_particle_small_dl, LAYER_ALPHA),
MODEL_UTIL_GEO(E_MODEL_RED_FLAME, red_flame_geo), MODEL_UTIL_GEO_PERM(E_MODEL_RED_FLAME, red_flame_geo),
MODEL_UTIL_GEO(E_MODEL_BLUE_FLAME, blue_flame_geo), MODEL_UTIL_GEO_PERM(E_MODEL_BLUE_FLAME, blue_flame_geo),
MODEL_UTIL_GEO(E_MODEL_BURN_SMOKE, burn_smoke_geo), MODEL_UTIL_GEO_PERM(E_MODEL_BURN_SMOKE, burn_smoke_geo),
MODEL_UTIL_GEO(E_MODEL_LEAVES, leaves_geo), MODEL_UTIL_GEO_PERM(E_MODEL_LEAVES, leaves_geo),
MODEL_UTIL_GEO(E_MODEL_PURPLE_MARBLE, purple_marble_geo), MODEL_UTIL_GEO_PERM(E_MODEL_PURPLE_MARBLE, purple_marble_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_FISH, fish_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_FISH_SHADOW, fish_shadow_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_SPARKLES_ANIMATION, sparkles_animation_geo),
MODEL_UTIL_DL_PERM (E_MODEL_SAND_DUST, sand_seg3_dl_0302BCD0, LAYER_ALPHA),
MODEL_UTIL_GEO_PERM(E_MODEL_BUTTERFLY, butterfly_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_BURN_SMOKE_UNUSED, burn_smoke_geo),
MODEL_UTIL_DL_PERM (E_MODEL_PEBBLE, pebble_seg3_dl_0301CB00, LAYER_ALPHA),
MODEL_UTIL_GEO_PERM(E_MODEL_MIST, mist_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_WHITE_PUFF, white_puff_geo),
MODEL_UTIL_DL_PERM (E_MODEL_WHITE_PARTICLE_DL, white_particle_dl, LAYER_ALPHA),
MODEL_UTIL_GEO_PERM(E_MODEL_WHITE_PARTICLE, white_particle_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_YELLOW_COIN_NO_SHADOW, yellow_coin_no_shadow_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_BLUE_COIN, blue_coin_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_BLUE_COIN_NO_SHADOW, blue_coin_no_shadow_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_MARIOS_WINGED_METAL_CAP, marios_winged_metal_cap_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_MARIOS_METAL_CAP, marios_metal_cap_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_MARIOS_WING_CAP, marios_wing_cap_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_MARIOS_CAP, marios_cap_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_BOWSER_KEY_CUTSCENE, bowser_key_cutscene_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_BOWSER_KEY, bowser_key_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_RED_FLAME_SHADOW, red_flame_shadow_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_1UP, mushroom_1up_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_RED_COIN, red_coin_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_RED_COIN_NO_SHADOW, red_coin_no_shadow_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_NUMBER, number_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_EXPLOSION, explosion_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_DIRT_ANIMATION, dirt_animation_geo),
MODEL_UTIL_GEO_PERM(E_MODEL_CARTOON_STAR, cartoon_star_geo),
// Non-permanent actors
MODEL_UTIL_GEO(E_MODEL_TRAMPOLINE, springboard_top_geo), MODEL_UTIL_GEO(E_MODEL_TRAMPOLINE, springboard_top_geo),
MODEL_UTIL_GEO(E_MODEL_TRAMPOLINE_CENTER, springboard_spring_geo), MODEL_UTIL_GEO(E_MODEL_TRAMPOLINE_CENTER, springboard_spring_geo),
MODEL_UTIL_GEO(E_MODEL_TRAMPOLINE_BASE, springboard_bottom_geo), MODEL_UTIL_GEO(E_MODEL_TRAMPOLINE_BASE, springboard_bottom_geo),
MODEL_UTIL_GEO(E_MODEL_FISH, fish_geo),
MODEL_UTIL_GEO(E_MODEL_FISH_SHADOW, fish_shadow_geo),
MODEL_UTIL_GEO(E_MODEL_SPARKLES_ANIMATION, sparkles_animation_geo),
MODEL_UTIL_DL (E_MODEL_SAND_DUST, sand_seg3_dl_0302BCD0, LAYER_ALPHA),
MODEL_UTIL_GEO(E_MODEL_BUTTERFLY, butterfly_geo),
MODEL_UTIL_GEO(E_MODEL_BURN_SMOKE_UNUSED, burn_smoke_geo),
MODEL_UTIL_DL (E_MODEL_PEBBLE, pebble_seg3_dl_0301CB00, LAYER_ALPHA),
MODEL_UTIL_GEO(E_MODEL_MIST, mist_geo),
MODEL_UTIL_GEO(E_MODEL_WHITE_PUFF, white_puff_geo),
MODEL_UTIL_DL (E_MODEL_WHITE_PARTICLE_DL, white_particle_dl, LAYER_ALPHA),
MODEL_UTIL_GEO(E_MODEL_WHITE_PARTICLE, white_particle_geo),
MODEL_UTIL_GEO(E_MODEL_YELLOW_COIN_NO_SHADOW, yellow_coin_no_shadow_geo),
MODEL_UTIL_GEO(E_MODEL_BLUE_COIN, blue_coin_geo),
MODEL_UTIL_GEO(E_MODEL_BLUE_COIN_NO_SHADOW, blue_coin_no_shadow_geo),
MODEL_UTIL_GEO(E_MODEL_MARIOS_WINGED_METAL_CAP, marios_winged_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_MARIOS_METAL_CAP, marios_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_MARIOS_WING_CAP, marios_wing_cap_geo),
MODEL_UTIL_GEO(E_MODEL_MARIOS_CAP, marios_cap_geo),
MODEL_UTIL_GEO(E_MODEL_BOWSER_KEY_CUTSCENE, bowser_key_cutscene_geo),
MODEL_UTIL_GEO(E_MODEL_BOWSER_KEY, bowser_key_geo),
MODEL_UTIL_GEO(E_MODEL_RED_FLAME_SHADOW, red_flame_shadow_geo),
MODEL_UTIL_GEO(E_MODEL_1UP, mushroom_1up_geo),
MODEL_UTIL_GEO(E_MODEL_RED_COIN, red_coin_geo),
MODEL_UTIL_GEO(E_MODEL_RED_COIN_NO_SHADOW, red_coin_no_shadow_geo),
MODEL_UTIL_GEO(E_MODEL_NUMBER, number_geo),
MODEL_UTIL_GEO(E_MODEL_EXPLOSION, explosion_geo),
MODEL_UTIL_GEO(E_MODEL_DIRT_ANIMATION, dirt_animation_geo),
MODEL_UTIL_GEO(E_MODEL_CARTOON_STAR, cartoon_star_geo),
MODEL_UTIL_GEO(E_MODEL_BLUE_COIN_SWITCH, blue_coin_switch_geo), MODEL_UTIL_GEO(E_MODEL_BLUE_COIN_SWITCH, blue_coin_switch_geo),
MODEL_UTIL_GEO(E_MODEL_AMP, amp_geo), MODEL_UTIL_GEO(E_MODEL_AMP, amp_geo),
MODEL_UTIL_GEO(E_MODEL_PURPLE_SWITCH, purple_switch_geo), MODEL_UTIL_GEO(E_MODEL_PURPLE_SWITCH, purple_switch_geo),
@ -428,93 +435,123 @@ struct ModelUtilsInfo sModels[E_MODEL_MAX] = {
MODEL_UTIL_GEO(E_MODEL_TTM_MOON_SMILEY, ttm_geo_000DBC), MODEL_UTIL_GEO(E_MODEL_TTM_MOON_SMILEY, ttm_geo_000DBC),
// custom models // custom models
MODEL_UTIL_GEO(E_MODEL_BUBBLE_PLAYER, water_bomb_geo), MODEL_UTIL_GEO_PERM(E_MODEL_BUBBLE_PLAYER, water_bomb_geo),
MODEL_UTIL_GEO(E_MODEL_LUIGI, luigi_geo), MODEL_UTIL_GEO_PERM(E_MODEL_LUIGI, luigi_geo),
MODEL_UTIL_GEO(E_MODEL_LUIGIS_CAP, luigis_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_LUIGIS_CAP, luigis_cap_geo),
MODEL_UTIL_GEO(E_MODEL_LUIGIS_METAL_CAP, luigis_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_LUIGIS_METAL_CAP, luigis_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_LUIGIS_WING_CAP, luigis_wing_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_LUIGIS_WING_CAP, luigis_wing_cap_geo),
MODEL_UTIL_GEO(E_MODEL_LUIGIS_WINGED_METAL_CAP, luigis_winged_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_LUIGIS_WINGED_METAL_CAP, luigis_winged_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_TOAD_PLAYER, toad_player_geo), MODEL_UTIL_GEO_PERM(E_MODEL_TOAD_PLAYER, toad_player_geo),
MODEL_UTIL_GEO(E_MODEL_TOADS_CAP, toads_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_TOADS_CAP, toads_cap_geo),
MODEL_UTIL_GEO(E_MODEL_TOADS_METAL_CAP, toads_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_TOADS_METAL_CAP, toads_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_TOADS_WING_CAP, toads_wing_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_TOADS_WING_CAP, toads_wing_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WALUIGI, waluigi_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WALUIGI, waluigi_geo),
MODEL_UTIL_GEO(E_MODEL_WALUIGIS_CAP, waluigis_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WALUIGIS_CAP, waluigis_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WALUIGIS_METAL_CAP, waluigis_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WALUIGIS_METAL_CAP, waluigis_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WALUIGIS_WING_CAP, waluigis_wing_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WALUIGIS_WING_CAP, waluigis_wing_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WALUIGIS_WINGED_METAL_CAP, waluigis_winged_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WALUIGIS_WINGED_METAL_CAP, waluigis_winged_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WARIO, wario_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WARIO, wario_geo),
MODEL_UTIL_GEO(E_MODEL_WARIOS_CAP, warios_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WARIOS_CAP, warios_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WARIOS_METAL_CAP, warios_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WARIOS_METAL_CAP, warios_metal_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WARIOS_WING_CAP, warios_wing_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WARIOS_WING_CAP, warios_wing_cap_geo),
MODEL_UTIL_GEO(E_MODEL_WARIOS_WINGED_METAL_CAP, warios_winged_metal_cap_geo), MODEL_UTIL_GEO_PERM(E_MODEL_WARIOS_WINGED_METAL_CAP, warios_winged_metal_cap_geo),
}; };
struct ModelUtilsInfo* sCustomModels = NULL; #define MAX_CUSTOM_MODELS 256
u32 sCustomModelsCount = 0; struct ModelUtilsInfo sCustomModels[MAX_CUSTOM_MODELS] = { 0 };
static u16 sCustomModelsCount = 0;
struct ModelUtilsInfo sCachedAssets[256] = { 0 }; #define MAX_CACHED_ASSETS 256
struct ModelUtilsInfo* sCachedAssets[MAX_CACHED_ASSETS] = { 0 };
void smlua_model_util_remember(u8 modelId, u8 layer, const void* asset, u8 isDisplayList) { void smlua_model_util_remember(u8 loadedId, UNUSED u8 layer, const void* asset, UNUSED u8 isDisplayList) {
struct ModelUtilsInfo* c = &sCachedAssets[modelId]; struct ModelUtilsInfo* found = NULL;
c->id = modelId;
c->layer = layer; // find in sModels
c->asset = asset; for (s32 i = 0; i < E_MODEL_MAX; i++) {
c->isDisplayList = isDisplayList; struct ModelUtilsInfo* m = &sModels[i];
if (m->asset != asset) { continue; }
found = m;
break;
}
// find in sCustomModels
if (!found) {
for (s32 i = 0; i < sCustomModelsCount; i++) {
struct ModelUtilsInfo* m = &sCustomModels[i];
if (m->asset != asset) { continue; }
found = m;
break;
}
}
// sanity check
if (found == NULL) {
LOG_ERROR("Could not find asset to remember!");
return;
}
// remember
if (sCachedAssets[loadedId] != NULL && sCachedAssets[loadedId] != found) {
if (sCachedAssets[loadedId]->permanent) {
LOG_ERROR("OVERRIDING PERMANENT MODEL: %u -> %u", sCachedAssets[loadedId]->loadedId, loadedId);
} else {
LOG_INFO("Overriding model: loadedId %u was extId %u, now extId %u", loadedId, sCachedAssets[loadedId]->extId, found->extId);
}
sCachedAssets[loadedId]->loadedId = UNLOADED_ID;
}
found->loadedId = loadedId;
sCachedAssets[loadedId] = found;
//LOG_INFO("Remember model: %u -> %u", found->extId, loadedId);
} }
void smlua_model_util_clear(void) { void smlua_model_util_clear(void) {
memset(sCachedAssets, 0, sizeof(sCachedAssets)); for (int i = 0; i < MAX_CACHED_ASSETS; i++) {
for (int i = 0; i < E_MODEL_MAX; i++) { struct ModelUtilsInfo* m = sCachedAssets[i];
if (sModels[i].cacheId != 0xFF) { if (m == NULL || m->permanent) { continue; }
gLoadedGraphNodes[sModels[i].cacheId] = NULL; //LOG_INFO("Forget: %u -> %u", m->extId, m->loadedId);
} m->loadedId = UNLOADED_ID;
sModels[i].cacheId = 0xFF; sCachedAssets[i] = NULL;
} }
for (u32 i = 0; i < sCustomModelsCount; i++) { //LOG_INFO("Cleared runtime model cache.");
if (sCustomModels[i].cacheId != 0xFF) {
gLoadedGraphNodes[sCustomModels[i].cacheId] = NULL;
}
sCustomModels[i].cacheId = 0xFF;
}
} }
u8 smlua_model_util_load_with_pool_and_cache_id(enum ModelExtendedId id, struct AllocOnlyPool* pool, u8 cacheId) { u8 smlua_model_util_load_with_pool_and_cache_id(enum ModelExtendedId extId, struct AllocOnlyPool* pool, u8 loadedId) {
if (id == E_MODEL_NONE) { return MODEL_NONE; } if (extId == E_MODEL_NONE) { return MODEL_NONE; }
if (id == E_MODEL_MAX) { LOG_ERROR("id invalid"); return MODEL_NONE; } if (extId >= (u16)(E_MODEL_MAX + sCustomModelsCount)) {
if (id > E_MODEL_MAX + sCustomModelsCount) { LOG_ERROR("id invalid"); return MODEL_NONE; } LOG_ERROR("Tried to load invalid extId: %u >= %u (%u)", extId, (E_MODEL_MAX + sCustomModelsCount), sCustomModelsCount);
extId = E_MODEL_ERROR_MODEL;
}
struct ModelUtilsInfo* info = (id >= E_MODEL_MAX) struct ModelUtilsInfo* info = (extId >= E_MODEL_MAX)
? &sCustomModels[id - E_MODEL_MAX - 1] ? &sCustomModels[extId - E_MODEL_MAX]
: &sModels[id]; : &sModels[extId];
// check cache // check cache
if (info->cacheId != 0xFF) { if (info->loadedId != UNLOADED_ID) {
//LOG_INFO("Found in info cache"); //LOG_INFO("Found in cache - %u -> %u", extId, info->loadedId);
return info->cacheId; return info->loadedId;
} }
// find cached asset // find cached asset
u8 emptyCacheId = 0; u8 pickLoadedId = loadedId;
if (cacheId == 0) { if (loadedId == UNLOADED_ID) {
bool foundEmptyCacheId = false; for (s32 i = 0; i < (MAX_CACHED_ASSETS-1); i++) {
for (int i = 0; i < 255; i++) { struct ModelUtilsInfo* m = sCachedAssets[i];
if (sCachedAssets[i].asset == info->asset) { if (m == info) {
//LOG_INFO("Found in cached assets"); //LOG_INFO("Found in cache (but late, confused?) - %u -> %u", extId, i);
return sCachedAssets[i].id; info->loadedId = m->loadedId;
} return info->loadedId;
if (sCachedAssets[i].asset == NULL) { } else if (m == NULL) {
foundEmptyCacheId = true; pickLoadedId = i;
emptyCacheId = i;
} }
} }
if (!foundEmptyCacheId) {
LOG_ERROR("No empty cache"); if (pickLoadedId == UNLOADED_ID) {
return 0xFF; LOG_ERROR("Could not find slot for extId - %u", extId);
return UNLOADED_ID;
} }
} else {
emptyCacheId = cacheId;
} }
// load // load
@ -525,9 +562,9 @@ u8 smlua_model_util_load_with_pool_and_cache_id(enum ModelExtendedId id, struct
} }
if (info->isDisplayList) { if (info->isDisplayList) {
gLoadedGraphNodes[emptyCacheId] = (struct GraphNode *) init_graph_node_display_list(pool, NULL, info->layer, (void*)info->asset); gLoadedGraphNodes[pickLoadedId] = (struct GraphNode *) init_graph_node_display_list(pool, NULL, info->layer, (void*)info->asset);
} else { } else {
gLoadedGraphNodes[emptyCacheId] = process_geo_layout(pool, (void*)info->asset); gLoadedGraphNodes[pickLoadedId] = process_geo_layout(pool, (void*)info->asset);
} }
if (resizePool) { if (resizePool) {
@ -535,49 +572,55 @@ u8 smlua_model_util_load_with_pool_and_cache_id(enum ModelExtendedId id, struct
} }
// remember // remember
smlua_model_util_remember(emptyCacheId, info->layer, info->asset, info->isDisplayList); smlua_model_util_remember(pickLoadedId, info->layer, info->asset, info->isDisplayList);
info->cacheId = emptyCacheId; //LOG_INFO("Loaded custom model - %u -> %u", extId, pickLoadedId);
return emptyCacheId; return pickLoadedId;
} }
u8 smlua_model_util_load_with_pool(enum ModelExtendedId id, struct AllocOnlyPool* pool) { u8 smlua_model_util_load_with_pool(enum ModelExtendedId extId, struct AllocOnlyPool* pool) {
return smlua_model_util_load_with_pool_and_cache_id(id, pool, 0); return smlua_model_util_load_with_pool_and_cache_id(extId, pool, UNLOADED_ID);
} }
u8 smlua_model_util_load(enum ModelExtendedId id) { u8 smlua_model_util_load(enum ModelExtendedId extId) {
return smlua_model_util_load_with_pool(id, NULL); return smlua_model_util_load_with_pool(extId, NULL);
} }
u32 smlua_model_util_get_id(const char* name) { u32 smlua_model_util_get_id(const char* name) {
// find geolayout // find geolayout
const void* layout = dynos_geolayout_get(name); const void* layout = dynos_geolayout_get(name);
if (layout == NULL) { if (layout == NULL) {
LOG_ERROR("Failed to find model: %s", name); LOG_ERROR("Failed to find model: %s - %u", name, E_MODEL_ERROR_MODEL);
return E_MODEL_ERROR_MODEL; return E_MODEL_ERROR_MODEL;
} }
// find existing model // find existing model
for (u32 i = 0; i < E_MODEL_MAX; i++) { for (u32 i = 0; i < E_MODEL_MAX; i++) {
if (sModels[i].asset == layout) { struct ModelUtilsInfo* m = &sModels[i];
return i; if (m->asset == layout) {
//LOG_INFO("Found existing model: %s :: %u -> %u", name, m->extId, m->loadedId);
return m->extId;
} }
} }
for (u32 i = 0; i < sCustomModelsCount; i++) { for (u32 i = 0; i < sCustomModelsCount; i++) {
if (sCustomModels[i].asset == layout) { struct ModelUtilsInfo* m = &sCustomModels[i];
return E_MODEL_MAX + i + 1; if (m->asset == layout) {
//LOG_INFO("Found existing custom model: %s :: %u -> %u", name, m->extId, m->loadedId);
return m->extId;
} }
} }
// allocate custom model // allocate custom model
u32 customIndex = sCustomModelsCount++; u16 customIndex = sCustomModelsCount++;
sCustomModels = realloc(sCustomModels, sizeof(struct ModelUtilsInfo) * sCustomModelsCount);
struct ModelUtilsInfo* info = &sCustomModels[customIndex]; struct ModelUtilsInfo* info = &sCustomModels[customIndex];
info->asset = layout; info->asset = layout;
info->cacheId = 0xFF; info->loadedId = UNLOADED_ID;
info->id = E_MODEL_MAX + sCustomModelsCount; info->extId = E_MODEL_MAX + customIndex;
info->isDisplayList = false; info->isDisplayList = false;
info->layer = LAYER_OPAQUE; info->layer = LAYER_OPAQUE;
//LOG_INFO("Allocated model: %s :: %u -> %u", name, info->extId, info->loadedId);
return info->id; return info->extId;
} }

View file

@ -390,11 +390,11 @@ enum ModelExtendedId {
E_MODEL_MAX E_MODEL_MAX
}; };
void smlua_model_util_remember(u8 modelId, u8 layer, const void* asset, u8 isDisplayList); void smlua_model_util_remember(u8 loadedId, u8 layer, const void* asset, u8 isDisplayList);
void smlua_model_util_clear(void); void smlua_model_util_clear(void);
u8 smlua_model_util_load_with_pool_and_cache_id(enum ModelExtendedId id, struct AllocOnlyPool* pool, u8 cacheId); u8 smlua_model_util_load_with_pool_and_cache_id(enum ModelExtendedId extId, struct AllocOnlyPool* pool, u8 loadedId);
u8 smlua_model_util_load_with_pool(enum ModelExtendedId id, struct AllocOnlyPool* pool); u8 smlua_model_util_load_with_pool(enum ModelExtendedId extId, struct AllocOnlyPool* pool);
u8 smlua_model_util_load(enum ModelExtendedId id); u8 smlua_model_util_load(enum ModelExtendedId extId);
u32 smlua_model_util_get_id(const char* name); u32 smlua_model_util_get_id(const char* name);
#endif #endif