From f5bcc25e1066cb926ca1a95e067b5db8a853003a Mon Sep 17 00:00:00 2001 From: fgsfds Date: Mon, 14 Aug 2023 18:30:02 +0200 Subject: [PATCH] port: fix textureconfig-related texture corruption explosions are still miscolored, but no longer garbage --- src/game/texreset.c | 60 +++++++++++++++++++++++++++++++++---- src/include/textureconfig.h | 6 ++-- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/game/texreset.c b/src/game/texreset.c index d70547469..80112e685 100644 --- a/src/game/texreset.c +++ b/src/game/texreset.c @@ -53,9 +53,6 @@ void texReset(void) g_TextureConfigSegment = mempAlloc(len, MEMPOOL_STAGE); dmaExec(g_TextureConfigSegment, (romptr_t)&_textureconfigSegmentRomStart, len); g_TexBase = (uintptr_t)g_TextureConfigSegment - ROM_SIZE * 1024 * 1024; -#else - g_TexBase = 0; -#endif g_TexGdl1 = (Gfx *)(g_TexBase + (uintptr_t)g_TcGdl1); g_TexGdl2 = (Gfx *)(g_TexBase + (uintptr_t)g_TcGdl2); @@ -78,12 +75,63 @@ void texReset(void) g_TexGeneralConfigs = (struct textureconfig *)(g_TexBase + (uintptr_t)g_TcGeneralConfigs); g_TexRadarConfigs = (struct textureconfig *)(g_TexBase + (uintptr_t)g_TcRadarConfigs); -#ifdef PLATFORM_N64 g_TexNumConfigs = (len - (uintptr_t)&g_TcWallhitConfigs + ROM_SIZE * 1024 * 1024) / sizeof(struct textureconfig); #else - // TODO: load this shit externally for fuck's sake - g_TexNumConfigs = 18 + 5 + 6 + 2 + 96 + 3 + 6 + 10 + 1 + 56 + 1; + // HACK: define a big table of pointers we need to fill and sizes of the textureconfig data that goes there + #define DEFINE_TCPTR(ptr, data) { (void **)&ptr, (const void *)data, sizeof(data), ARRAYCOUNT(data) } + static const struct { + void **dst; + const void *src; + u32 size; + s32 count; + } tcptrs[] = { + DEFINE_TCPTR(g_TexGdl1, g_TcGdl1), + DEFINE_TCPTR(g_TexGdl2, g_TcGdl2), + DEFINE_TCPTR(g_TexGdl3, g_TcGdl3), + DEFINE_TCPTR(g_ExplosionTexturePairs, g_TcExplosionTexturePairs), + DEFINE_TCPTR(g_TexWallhitConfigs, g_TcWallhitConfigs), + DEFINE_TCPTR(g_TexBeamConfigs, g_TcBeamConfigs), + DEFINE_TCPTR(g_TexLaserConfigs, g_TcLaserConfigs), + DEFINE_TCPTR(g_TexGroup03Configs, g_TcGroup03Configs), + DEFINE_TCPTR(g_TexGeCrosshairConfigs, g_TcGeCrosshairConfigs), + DEFINE_TCPTR(g_TexRedLinesConfigs, g_TcRedLineConfigs), + DEFINE_TCPTR(g_TexShadowConfigs, g_TcShadowConfigs), + DEFINE_TCPTR(g_TexShieldConfigs, g_TcShieldConfigs), + DEFINE_TCPTR(g_TexShardConfigs, g_TcShardConfigs), + DEFINE_TCPTR(g_TexScreenConfigs, g_TcScreenConfigs), + DEFINE_TCPTR(g_TexSkyWaterConfigs, g_TcSkyWaterConfigs), + DEFINE_TCPTR(g_TexGroup11Configs, g_TcGroup11Configs), + DEFINE_TCPTR(g_TexLightGlareConfigs, g_TcLightGlareConfigs), + DEFINE_TCPTR(g_TexSparkConfigs, g_TcSparkConfigs), + DEFINE_TCPTR(g_TexGeneralConfigs, g_TcGeneralConfigs), + DEFINE_TCPTR(g_TexRadarConfigs, g_TcRadarConfigs), + }; + #undef DEFINE_TCPTR + + // calculate total length, should be 0xb50 on a 32-bit platform with an unmodified textureconfig.c + u32 len = 0; + for (s32 i = 0; i < ARRAYCOUNT(tcptrs); ++i) { + len += tcptrs[i].size; + } + + g_TextureConfigSegment = mempAlloc(len, MEMPOOL_STAGE); + g_TexBase = 0; // unused + + // set up pointers and fill them in + u32 tcofs = 0; + for (s32 i = 0; i < ARRAYCOUNT(tcptrs); ++i) { + *tcptrs[i].dst = g_TextureConfigSegment + tcofs; + bcopy(tcptrs[i].src, *tcptrs[i].dst, tcptrs[i].size); + tcofs += tcptrs[i].size; + } + + // calculate tc count, skipping the gdls and explosion pairs + g_TexNumConfigs = 0; + for (s32 i = 4; i < ARRAYCOUNT(tcptrs); ++i) { + g_TexNumConfigs += tcptrs[i].count; + } #endif + g_TexWords = mempAlloc(ALIGN16(g_TexNumConfigs * 4), MEMPOOL_STAGE); for (i = 0; i < g_TexNumConfigs; i++) { diff --git a/src/include/textureconfig.h b/src/include/textureconfig.h index 6842c2d12..a9d613d2e 100644 --- a/src/include/textureconfig.h +++ b/src/include/textureconfig.h @@ -2,9 +2,9 @@ #define IN_TEXTURECONFIG_H #include -extern Gfx g_TcGdl1[]; -extern Gfx g_TcGdl2[]; -extern Gfx g_TcGdl3[]; +extern Gfx g_TcGdl1[14]; +extern Gfx g_TcGdl2[13]; +extern Gfx g_TcGdl3[14]; extern struct texturepair g_TcExplosionTexturePairs[15]; extern struct textureconfig g_TcWallhitConfigs[18]; extern struct textureconfig g_TcBeamConfigs[5];