diff --git a/ld/pd.ld b/ld/pd.ld index 791dcb5ea..71602d4f3 100644 --- a/ld/pd.ld +++ b/ld/pd.ld @@ -119,12 +119,6 @@ SECTIONS _jpndata2 = 0x154340; #endif -#if VERSION >= VERSION_JPN_FINAL - _numtextures = 3511; -#else - _numtextures = 3503; -#endif - #if VERSION >= VERSION_JPN_FINAL _val7f11aa14 = 0x0e52; _val7f11aae4 = 0x0e60; diff --git a/src/game/bondgun.c b/src/game/bondgun.c index d4c1c3dd4..d6be2c0c9 100644 --- a/src/game/bondgun.c +++ b/src/game/bondgun.c @@ -5463,7 +5463,7 @@ void bgunTickGunLoad(void) osSyncPrintf("BriGun: Texture Block at 0x%08x size %d, endp 0x%08x\n"); - tex0f172e70(&player->gunctrl.unk15c0, (u8 *)end, remaining); + texInitPool(&player->gunctrl.unk15c0, (u8 *)end, remaining); // Tidy up the model modelPromoteTypeToPointer(modeldef); @@ -5495,7 +5495,7 @@ void bgunTickGunLoad(void) if (modeldef->texconfigs[i].texturenum < NUM_TEXTURES) { osSyncPrintf("BriGun: Uncompress %d of %d\n", i, modeldef->numtexconfigs); - texLoad(&modeldef->texconfigs[i].texturenum, &player->gunctrl.unk15c0, 1); + texLoad(&modeldef->texconfigs[i].texturenum, &player->gunctrl.unk15c0, true); modeldef->texconfigs[i].unk0b = 1; } @@ -5538,7 +5538,7 @@ void bgunTickGunLoad(void) osSyncPrintf("BriGun: DL waste space %d from %d (Used %d, Ramlen %d, ObSize %d)\n"); osSyncPrintf("Increase GUNSAVESIZE to %d!!!\n"); - newvalue = ALIGN64(func0f172f54(&player->gunctrl.unk15c0)); + newvalue = ALIGN64(texGetPoolLeftPos(&player->gunctrl.unk15c0)); remaining = *player->gunctrl.loadmemremaining; remaining -= (s32)(newvalue - *player->gunctrl.loadmemptr); diff --git a/src/game/camdraw.c b/src/game/camdraw.c index 293d5c352..741763811 100644 --- a/src/game/camdraw.c +++ b/src/game/camdraw.c @@ -42,7 +42,7 @@ struct camerafile { struct var800a45a0 *var800a45a0; u32 var800a45a4; -struct texturething var800a45a8; +struct texpool var800a45a8; u32 var800a45b8; u32 var800a45bc; diff --git a/src/game/menu.c b/src/game/menu.c index fc57f80d5..0927b0643 100644 --- a/src/game/menu.c +++ b/src/game/menu.c @@ -1735,7 +1735,7 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) f32 sp428; f32 sp424; s32 totalfilelen; - struct texturething sp410; + struct texpool texpool; s32 bodyfilelen2; u16 bodyfilenum; u16 headfilenum; @@ -1811,18 +1811,18 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) totalfilelen += 0x4000; - tex0f172e70(&sp410, thing->unk004 + totalfilelen, thing->unk008 - totalfilelen); + texInitPool(&texpool, thing->unk004 + totalfilelen, thing->unk008 - totalfilelen); thing->headnum = headnum; thing->bodynum = bodynum; - thing->bodymodeldef = modeldefLoad(bodyfilenum, thing->unk004, totalfilelen, &sp410); + thing->bodymodeldef = modeldefLoad(bodyfilenum, thing->unk004, totalfilelen, &texpool); bodyfilelen2 = ALIGN64(fileGetLoadedSize(bodyfilenum)); modelCalculateRwDataLen(thing->bodymodeldef); if (headnum < 0) { thing->headmodeldef = NULL; } else { - thing->headmodeldef = modeldefLoad(headfilenum, thing->unk004 + bodyfilelen2, totalfilelen - bodyfilelen2, &sp410); + thing->headmodeldef = modeldefLoad(headfilenum, thing->unk004 + bodyfilelen2, totalfilelen - bodyfilelen2, &texpool); fileGetLoadedSize(headfilenum); bodyCalculateHeadOffset(thing->headmodeldef, headnum, bodynum); modelCalculateRwDataLen(thing->headmodeldef); @@ -1839,11 +1839,11 @@ Gfx *menuRenderModels(Gfx *gdl, struct menu840 *thing, s32 arg2) totalfilelen = ALIGN64(fileGetInflatedSize(thing->unk00c)) + 0x4000; if (1); - tex0f172e70(&sp410, &thing->unk004[(u32)totalfilelen], thing->unk008 - totalfilelen); + texInitPool(&texpool, &thing->unk004[(u32)totalfilelen], thing->unk008 - totalfilelen); thing->headnum = -1; thing->bodynum = -1; - thing->bodymodeldef = modeldefLoad(thing->unk00c, thing->unk004, totalfilelen, &sp410); + thing->bodymodeldef = modeldefLoad(thing->unk00c, thing->unk004, totalfilelen, &texpool); fileGetLoadedSize(thing->unk00c); modelCalculateRwDataLen(thing->bodymodeldef); @@ -2574,7 +2574,7 @@ glabel var7f1b2948 /* f0f0650: afa30448 */ sw $v1,0x448($sp) /* f0f0654: 27a40438 */ addiu $a0,$sp,0x438 /* f0f0658: 03032821 */ addu $a1,$t8,$v1 -/* f0f065c: 0fc5b6c2 */ jal tex0f172e70 +/* f0f065c: 0fc5b6c2 */ jal texInitPool /* f0f0660: 03233023 */ subu $a2,$t9,$v1 /* f0f0664: 8faa0428 */ lw $t2,0x428($sp) /* f0f0668: 8e250004 */ lw $a1,0x4($s1) @@ -2655,7 +2655,7 @@ glabel var7f1b2948 /* f0f0788: afa30448 */ sw $v1,0x448($sp) /* f0f078c: 27a40438 */ addiu $a0,$sp,0x438 /* f0f0790: 01c32821 */ addu $a1,$t6,$v1 -/* f0f0794: 0fc5b6c2 */ jal tex0f172e70 +/* f0f0794: 0fc5b6c2 */ jal texInitPool /* f0f0798: 01e33023 */ subu $a2,$t7,$v1 /* f0f079c: 2402ffff */ addiu $v0,$zero,-1 /* f0f07a0: a6220002 */ sh $v0,0x2($s1) diff --git a/src/game/modeldef.c b/src/game/modeldef.c index bb5c27593..6de63e7c7 100644 --- a/src/game/modeldef.c +++ b/src/game/modeldef.c @@ -105,7 +105,7 @@ struct skeleton *g_Skeletons[] = { &g_SkelBB, }; -void modeldef0f1a7560(struct modelfiledata *modeldef, u16 filenum, u32 arg2, u32 arg3, struct texturething *arg4, bool arg5) +void modeldef0f1a7560(struct modelfiledata *modeldef, u16 filenum, u32 arg2, u32 arg3, struct texpool *arg4, bool arg5) { s32 allocsize; s32 loadedsize; @@ -175,7 +175,7 @@ void modelPromoteTypeToPointer(struct modelfiledata *filedata) } } -struct modelfiledata *modeldefLoad(u16 fileid, u8 *dst, s32 size, struct texturething *arg3) +struct modelfiledata *modeldefLoad(u16 fileid, u8 *dst, s32 size, struct texpool *arg3) { struct modelfiledata *filedata; diff --git a/src/game/player.c b/src/game/player.c index 5276d4763..c45fdead4 100644 --- a/src/game/player.c +++ b/src/game/player.c @@ -1272,7 +1272,7 @@ void playerTickChrBody(void) if (g_Vars.currentplayer->haschrbody == false) { struct chrdata *chr; - struct texturething sp100; + struct texpool texpool; struct modelfiledata *bodyfiledata; struct modelfiledata *headfiledata = NULL; struct modelfiledata *weaponfiledata; @@ -1394,12 +1394,12 @@ void playerTickChrBody(void) offset2 += 0x4000; bgunCalculateGunMemCapacity(); spe8 = g_Vars.currentplayer->gunmem2 + offset2; - tex0f172e70(&sp100, spe8, bgunCalculateGunMemCapacity() - offset2); - bodyfiledata = modeldefLoad(g_HeadsAndBodies[bodynum].filenum, allocation + offset1, offset2 - offset1, &sp100); + texInitPool(&texpool, spe8, bgunCalculateGunMemCapacity() - offset2); + bodyfiledata = modeldefLoad(g_HeadsAndBodies[bodynum].filenum, allocation + offset1, offset2 - offset1, &texpool); offset1 = ALIGN64(fileGetLoadedSize(g_HeadsAndBodies[bodynum].filenum) + offset1); if (headnum >= 0) { - headfiledata = modeldefLoad(g_HeadsAndBodies[headnum].filenum, allocation + offset1, offset2 - offset1, &sp100); + headfiledata = modeldefLoad(g_HeadsAndBodies[headnum].filenum, allocation + offset1, offset2 - offset1, &texpool); offset1 = ALIGN64(fileGetLoadedSize(g_HeadsAndBodies[headnum].filenum) + offset1); } @@ -1414,7 +1414,7 @@ void playerTickChrBody(void) model->rwdatalen = 256; - func0f172f54(&sp100); + texGetPoolLeftPos(&texpool); // @TODO: Figure out these arguments osSyncPrintf("Jo using %d bytes gunmem (gunmemsize %d)\n"); @@ -1422,7 +1422,7 @@ void playerTickChrBody(void) osSyncPrintf("Gunmem: tex block free 0x%08x\n"); osSyncPrintf("Gunmem: Free at end %d\n"); - func0f172f54(&sp100); + texGetPoolLeftPos(&texpool); } else { // 2-4 players if (g_HeadsAndBodies[bodynum].filedata == NULL) { @@ -1497,7 +1497,7 @@ void playerTickChrBody(void) if (weaponmodelnum >= 0) { if (g_Vars.mplayerisrunning == false) { - weaponfiledata = modeldefLoad(g_ModelStates[weaponmodelnum].fileid, allocation + offset1, offset2 - offset1, &sp100); + weaponfiledata = modeldefLoad(g_ModelStates[weaponmodelnum].fileid, allocation + offset1, offset2 - offset1, &texpool); fileGetLoadedSize(g_ModelStates[weaponmodelnum].fileid); modelCalculateRwDataLen(weaponfiledata); } else { diff --git a/src/game/surfacereset.c b/src/game/surfacereset.c index 6d993effb..4acfa08dc 100644 --- a/src/game/surfacereset.c +++ b/src/game/surfacereset.c @@ -8,7 +8,8 @@ void surfaceReset(void) { g_TexCacheCount = 0; - var800aabc8.unk00 = NULL; - var800aabc8.unk04 = NULL; - var800aabc8.unk0c = NULL; + + g_TexSharedPool.start = NULL; + g_TexSharedPool.end = NULL; + g_TexSharedPool.rightpos = NULL; } diff --git a/src/game/tex.c b/src/game/tex.c index 74751cc2c..728ad2d4e 100644 --- a/src/game/tex.c +++ b/src/game/tex.c @@ -258,18 +258,18 @@ bool tex0f173b8c(s32 index, s32 uls, s32 ult, s32 lrs, s32 lrt) return result; } -s32 texGetWidthAtLod(struct texloadthing *arg0, s32 lod) +s32 texGetWidthAtLod(struct tex *tex, s32 lod) { s32 i; - s32 width = arg0->width; + s32 width = tex->width; if (lod == 0) { return width; } - if (arg0->unk0c_02) { + if (tex->unk0c_02) { for (i = 0; i < g_TexCacheCount; i++) { - if (arg0->texturenum == g_TexCacheItems[i].texturenum) { + if (tex->texturenum == g_TexCacheItems[i].texturenum) { return g_TexCacheItems[i].widths[lod - 1]; } } @@ -284,18 +284,18 @@ s32 texGetWidthAtLod(struct texloadthing *arg0, s32 lod) return width; } -s32 texGetHeightAtLod(struct texloadthing *arg0, s32 lod) +s32 texGetHeightAtLod(struct tex *tex, s32 lod) { s32 i; - s32 height = arg0->height; + s32 height = tex->height; if (lod == 0) { return height; } - if (arg0->unk0c_02) { + if (tex->unk0c_02) { for (i = 0; i < g_TexCacheCount; i++) { - if (arg0->texturenum == g_TexCacheItems[i].texturenum) { + if (tex->texturenum == g_TexCacheItems[i].texturenum) { return g_TexCacheItems[i].heights[lod - 1]; } } @@ -310,10 +310,10 @@ s32 texGetHeightAtLod(struct texloadthing *arg0, s32 lod) return height; } -s32 texGetLineSizeInBytes(struct texloadthing *arg0, s32 lod) +s32 texGetLineSizeInBytes(struct tex *tex, s32 lod) { - s32 depth = arg0->depth; - s32 width = texGetWidthAtLod(arg0, lod); + s32 depth = tex->depth; + s32 width = texGetWidthAtLod(tex, lod); if (depth == G_IM_SIZ_32b) { return (width + 3) / 4; @@ -330,15 +330,15 @@ s32 texGetLineSizeInBytes(struct texloadthing *arg0, s32 lod) return (width + 15) / 16; } -s32 texGetSizeInBytes(struct texloadthing *arg0, s32 lod) +s32 texGetSizeInBytes(struct tex *tex, s32 lod) { - return texGetHeightAtLod(arg0, lod) * texGetLineSizeInBytes(arg0, lod); + return texGetHeightAtLod(tex, lod) * texGetLineSizeInBytes(tex, lod); } -void tex0f173e50(struct texloadthing *arg0, s32 *deptharg, s32 *lenarg) +void tex0f173e50(struct tex *tex, s32 *deptharg, s32 *lenarg) { - s32 depth = arg0->depth; - s32 maxlod = arg0->maxlod ? arg0->maxlod : 1; + s32 depth = tex->depth; + s32 maxlod = tex->maxlod ? tex->maxlod : 1; s32 lod; *lenarg = 0; @@ -354,7 +354,7 @@ void tex0f173e50(struct texloadthing *arg0, s32 *deptharg, s32 *lenarg) } for (lod = 0; lod < maxlod; lod++) { - *lenarg += texGetSizeInBytes(arg0, lod) * 4; + *lenarg += texGetSizeInBytes(tex, lod) * 4; } } @@ -385,9 +385,9 @@ s32 tex0f173f48(s32 arg0) return 0; } -Gfx *tex0f173f78(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 shifts, s32 shiftt, s32 arg5) +Gfx *tex0f173f78(Gfx *gdl, struct tex *tex, s32 arg2, s32 shifts, s32 shiftt, s32 arg5) { - struct texture *s0 = &g_Textures[arg1->texturenum]; + struct texture *s0 = &g_Textures[tex->texturenum]; s32 sp88; s32 sp84; s32 line; @@ -397,27 +397,27 @@ Gfx *tex0f173f78(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 shifts, s32 s32 lrs; s32 lrt; - sp88 = tex0f173f18(arg1->width); - sp84 = tex0f173f18(arg1->height); + sp88 = tex0f173f18(tex->width); + sp84 = tex0f173f18(tex->height); - line = texGetLineSizeInBytes(arg1, 0); + line = texGetLineSizeInBytes(tex, 0); gDPSetPrimColorViaWord(gdl++, arg5, 0, 0xffffffff); - if (texSetLutMode(arg1->lutmodeindex << G_MDSFT_TEXTLUT)) { - gDPSetTextureLUT(gdl++, arg1->lutmodeindex << G_MDSFT_TEXTLUT); + if (texSetLutMode(tex->lutmodeindex << G_MDSFT_TEXTLUT)) { + gDPSetTextureLUT(gdl++, tex->lutmodeindex << G_MDSFT_TEXTLUT); } - if (tex0f173a70(0, arg1->gbiformat, arg1->depth, line, s0->unk04_00 + line * s0->unk04_04, 0, 0, sp88 - s0->unk04_08, sp84 - s0->unk04_0c, shifts, shiftt)) { - gDPSetTile(gdl++, arg1->gbiformat, arg1->depth, line, s0->unk04_00 + line * s0->unk04_04, 0, 0, + if (tex0f173a70(0, tex->gbiformat, tex->depth, line, s0->unk04_00 + line * s0->unk04_04, 0, 0, sp88 - s0->unk04_08, sp84 - s0->unk04_0c, shifts, shiftt)) { + gDPSetTile(gdl++, tex->gbiformat, tex->depth, line, s0->unk04_00 + line * s0->unk04_04, 0, 0, tex0f173f48(0), sp84 - s0->unk04_0c, shiftt, tex0f173f48(0), sp88 - s0->unk04_08, shifts); } - uls = (arg2 == 2 && !arg1->unk0c_02 ? 2 : 0) + 0; - ult = (arg2 == 2 && !arg1->unk0c_02 ? 2 : 0) + 0; - lrs = (arg2 == 2 && !arg1->unk0c_02 ? 2 : 0) + ((arg1->width - 1) << 2); - lrt = (arg2 == 2 && !arg1->unk0c_02 ? 2 : 0) + ((arg1->height - 1) << 2); + uls = (arg2 == 2 && !tex->unk0c_02 ? 2 : 0) + 0; + ult = (arg2 == 2 && !tex->unk0c_02 ? 2 : 0) + 0; + lrs = (arg2 == 2 && !tex->unk0c_02 ? 2 : 0) + ((tex->width - 1) << 2); + lrt = (arg2 == 2 && !tex->unk0c_02 ? 2 : 0) + ((tex->height - 1) << 2); if (tex0f173b8c(0, uls, ult, lrs, lrt)) { gDPSetTileSize(gdl++, 0, uls, ult, lrs, lrt); @@ -426,9 +426,9 @@ Gfx *tex0f173f78(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 shifts, s32 return gdl; } -Gfx *tex0f1742e4(Gfx *arg0, Gfx *arg1, struct texloadthing *arg2, bool arg3) +Gfx *tex0f1742e4(Gfx *arg0, Gfx *arg1, struct tex *tex, bool arg3) { - s32 lod = arg2->maxlod ? arg2->maxlod - 1 : 0; + s32 lod = tex->maxlod ? tex->maxlod - 1 : 0; if (arg3) { if (arg1 != NULL) { @@ -450,15 +450,15 @@ Gfx *tex0f1742e4(Gfx *arg0, Gfx *arg1, struct texloadthing *arg2, bool arg3) return arg0; } -Gfx *tex0f1743a0(Gfx *gdl, struct texloadthing *arg1, s32 arg2) +Gfx *tex0f1743a0(Gfx *gdl, struct tex *tex, s32 arg2) { s32 depth; s32 len; - tex0f173e50(arg1, &depth, &len); + tex0f173e50(tex, &depth, &len); - if (arg1->lutmodeindex == 0) { - gDPSetTextureImage(gdl++, arg1->gbiformat, depth, 1, arg1->unk04); + if (tex->lutmodeindex == 0) { + gDPSetTextureImage(gdl++, tex->gbiformat, depth, 1, tex->data); if (!var800844d0) { gDPPipeSync(gdl++); @@ -479,7 +479,7 @@ Gfx *tex0f1743a0(Gfx *gdl, struct texloadthing *arg1, s32 arg2) gDPLoadBlock(gdl++, 5, 0, 0, len - 1, 0); } } else { - gDPSetTextureImage(gdl++, arg1->gbiformat, depth, 1, arg1->unk04); + gDPSetTextureImage(gdl++, tex->gbiformat, depth, 1, tex->data); if (!var800844d0) { gDPPipeSync(gdl++); @@ -502,26 +502,26 @@ Gfx *tex0f1743a0(Gfx *gdl, struct texloadthing *arg1, s32 arg2) { s32 tmp = len; - s32 a2 = (u32)(0x3ff - arg1->unk0a) < len ? (u32)(0x3ff - arg1->unk0a) : 0; + s32 a2 = (u32)(0x3ff - tex->unk0a) < len ? (u32)(0x3ff - tex->unk0a) : 0; tmp -= a2; gDPLoadSync(gdl++); - gDPLoadTLUT06(gdl++, tmp, a2, arg1->unk0a + tmp, a2); + gDPLoadTLUT06(gdl++, tmp, a2, tex->unk0a + tmp, a2); } } return gdl; } -Gfx *tex0f1747a4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, u32 arg7) +Gfx *tex0f1747a4(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, u32 arg7) { u32 tmem; s32 maxlod; s32 tile; tmem = arg7; - maxlod = arg1->maxlod; + maxlod = tex->maxlod; if (arg6 >= 0 && arg6 < maxlod) { maxlod = arg6; @@ -530,30 +530,30 @@ Gfx *tex0f1747a4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar for (tile = arg5; tile < maxlod + arg5 && tile < 6; tile++) { s32 stack[2]; s32 lod = tile - arg5; - u32 masks = tex0f173f18(texGetWidthAtLod(arg1, lod)); - u32 maskt = tex0f173f18(texGetHeightAtLod(arg1, lod)); - s32 line = texGetLineSizeInBytes(arg1, lod); + u32 masks = tex0f173f18(texGetWidthAtLod(tex, lod)); + u32 maskt = tex0f173f18(texGetHeightAtLod(tex, lod)); + s32 line = texGetLineSizeInBytes(tex, lod); s32 uls; s32 ult; s32 lrs; s32 lrt; - s32 bytes = texGetSizeInBytes(arg1, lod); - s32 sp7c = arg1->unk0c_02; + s32 bytes = texGetSizeInBytes(tex, lod); + s32 sp7c = tex->unk0c_02; - if (texSetLutMode(arg1->lutmodeindex << G_MDSFT_TEXTLUT)) { - gDPSetTextureLUT(gdl++, arg1->lutmodeindex << G_MDSFT_TEXTLUT); + if (texSetLutMode(tex->lutmodeindex << G_MDSFT_TEXTLUT)) { + gDPSetTextureLUT(gdl++, tex->lutmodeindex << G_MDSFT_TEXTLUT); } - if (tex0f173a70(tile, arg1->gbiformat, arg1->depth, line, tmem, arg2, arg3, masks, maskt, lod, lod)) { - gDPSetTile(gdl++, arg1->gbiformat, arg1->depth, line, tmem, tile, 0, + if (tex0f173a70(tile, tex->gbiformat, tex->depth, line, tmem, arg2, arg3, masks, maskt, lod, lod)) { + gDPSetTile(gdl++, tex->gbiformat, tex->depth, line, tmem, tile, 0, tex0f173f48(arg3), maskt, lod, tex0f173f48(arg2), masks, tile - arg5); } uls = (arg4 == 2 && sp7c == 0 ? 2 : 0) + 0; ult = (arg4 == 2 && sp7c == 0 ? 2 : 0) + 0; - lrs = ((texGetWidthAtLod(arg1, lod) - 1) << 2) + (arg4 == 2 && sp7c == 0 ? 2 : 0); - lrt = ((texGetHeightAtLod(arg1, lod) - 1) << 2) + (arg4 == 2 && sp7c == 0 ? 2 : 0); + lrs = ((texGetWidthAtLod(tex, lod) - 1) << 2) + (arg4 == 2 && sp7c == 0 ? 2 : 0); + lrt = ((texGetHeightAtLod(tex, lod) - 1) << 2) + (arg4 == 2 && sp7c == 0 ? 2 : 0); if (tex0f173b8c(tile, uls, ult, lrs, lrt)) { gDPSetTileSize(gdl++, tile, uls, ult, lrs, lrt); @@ -565,15 +565,15 @@ Gfx *tex0f1747a4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar return gdl; } -Gfx *tex0f174b54(Gfx *gdl, struct texloadthing *arg1) +Gfx *tex0f174b54(Gfx *gdl, struct tex *tex) { s32 depth; s32 len; - tex0f173e50(arg1, &depth, &len); + tex0f173e50(tex, &depth, &len); - if (arg1->lutmodeindex == 0) { - gDPSetTextureImage(gdl++, arg1->gbiformat, depth, 1, arg1->unk04); + if (tex->lutmodeindex == 0) { + gDPSetTextureImage(gdl++, tex->gbiformat, depth, 1, tex->data); if (!var800844d0) { gDPPipeSync(gdl++); @@ -592,7 +592,7 @@ Gfx *tex0f174b54(Gfx *gdl, struct texloadthing *arg1) gDPLoadBlock(gdl++, 5, 0, 0, len - 1, 0); } } else { - gDPSetTextureImage(gdl++, arg1->gbiformat, depth, 1, arg1->unk04); + gDPSetTextureImage(gdl++, tex->gbiformat, depth, 1, tex->data); if (!var800844d0) { gDPPipeSync(gdl++); @@ -613,19 +613,19 @@ Gfx *tex0f174b54(Gfx *gdl, struct texloadthing *arg1) { s32 tmp = len; - s32 a2 = (u32)(0x3ff - arg1->unk0a) < len ? (u32)(0x3ff - arg1->unk0a) : 0; + s32 a2 = (u32)(0x3ff - tex->unk0a) < len ? (u32)(0x3ff - tex->unk0a) : 0; tmp -= a2; gDPLoadSync(gdl++); - gDPLoadTLUT06(gdl++, tmp, a2, arg1->unk0a + tmp, a2); + gDPLoadTLUT06(gdl++, tmp, a2, tex->unk0a + tmp, a2); } } return gdl; } -Gfx *tex0f174f30(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 tile) +Gfx *tex0f174f30(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 tile) { s32 masks; s32 maskt; @@ -636,25 +636,25 @@ Gfx *tex0f174f30(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar s32 lrt; s32 sp50; - masks = tex0f173f18(arg1->width); - maskt = tex0f173f18(arg1->height); - line = texGetLineSizeInBytes(arg1, 0); - sp50 = arg1->unk0c_02; + masks = tex0f173f18(tex->width); + maskt = tex0f173f18(tex->height); + line = texGetLineSizeInBytes(tex, 0); + sp50 = tex->unk0c_02; - if (texSetLutMode(arg1->lutmodeindex << G_MDSFT_TEXTLUT)) { - gDPSetTextureLUT(gdl++, arg1->lutmodeindex << G_MDSFT_TEXTLUT); + if (texSetLutMode(tex->lutmodeindex << G_MDSFT_TEXTLUT)) { + gDPSetTextureLUT(gdl++, tex->lutmodeindex << G_MDSFT_TEXTLUT); } - if (tex0f173a70(tile, arg1->gbiformat, arg1->depth, line, 0, arg2, arg3, masks, maskt, 0, 0)) { - gDPSetTile(gdl++, arg1->gbiformat, arg1->depth, line, 0x0000, tile, 0, + if (tex0f173a70(tile, tex->gbiformat, tex->depth, line, 0, arg2, arg3, masks, maskt, 0, 0)) { + gDPSetTile(gdl++, tex->gbiformat, tex->depth, line, 0x0000, tile, 0, tex0f173f48(arg3), maskt, G_TX_NOLOD, tex0f173f48(arg2), masks, G_TX_NOLOD); } uls = (arg4 == 2 && sp50 == 0 ? 2 : 0) + 0; ult = (arg4 == 2 && sp50 == 0 ? 2 : 0) + 0; - lrs = (arg4 == 2 && sp50 == 0 ? 2 : 0) + ((arg1->width - 1) << 2); - lrt = (arg4 == 2 && sp50 == 0 ? 2 : 0) + ((arg1->height - 1) << 2); + lrs = (arg4 == 2 && sp50 == 0 ? 2 : 0) + ((tex->width - 1) << 2); + lrt = (arg4 == 2 && sp50 == 0 ? 2 : 0) + ((tex->height - 1) << 2); if (tex0f173b8c(tile, uls, ult, lrs, lrt)) { gDPSetTileSize(gdl++, tile, uls, ult, lrs, lrt); @@ -663,23 +663,23 @@ Gfx *tex0f174f30(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar return gdl; } -Gfx *tex0f1751e4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5) +Gfx *tex0f1751e4(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 arg5) { s32 sp34 = 0; - gdl = tex0f1743a0(gdl, arg1, 0); + gdl = tex0f1743a0(gdl, tex, 0); if (arg5) { - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, 0, 1, 0); + gdl = tex0f1747a4(gdl, tex, arg2, arg3, arg4, 0, 1, 0); sp34++; } - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp34, -1, 0); + gdl = tex0f1747a4(gdl, tex, arg2, arg3, arg4, sp34, -1, 0); - sp34 += arg1->maxlod; + sp34 += tex->maxlod; - if (!arg5 && arg1->maxlod == 1) { - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp34, -1, 0); + if (!arg5 && tex->maxlod == 1) { + gdl = tex0f1747a4(gdl, tex, arg2, arg3, arg4, sp34, -1, 0); } gDPPipeSync(gdl++); @@ -689,31 +689,31 @@ Gfx *tex0f1751e4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar return gdl; } -Gfx *tex0f175308(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, struct texloadthing *arg5, s32 arg6, s32 arg7, s32 arg8, bool arg9) +Gfx *tex0f175308(Gfx *gdl, struct tex *tex1, s32 arg2, s32 arg3, s32 arg4, struct tex *tex2, s32 arg6, s32 arg7, s32 arg8, bool arg9) { - s32 size = texGetSizeInBytes(arg5, 0); + s32 size = texGetSizeInBytes(tex2, 0); s32 sp38 = 0; - gdl = tex0f174b54(gdl, arg5); + gdl = tex0f174b54(gdl, tex2); gDPTileSync(gdl++); - gdl = tex0f1743a0(gdl, arg1, size); - gdl = tex0f173f78(gdl, arg5, arg4, arg6, arg7, arg8); + gdl = tex0f1743a0(gdl, tex1, size); + gdl = tex0f173f78(gdl, tex2, arg4, arg6, arg7, arg8); sp38++; if (arg9) { - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp38, 1, size); + gdl = tex0f1747a4(gdl, tex1, arg2, arg3, arg4, sp38, 1, size); sp38++; } - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp38, -1, size); + gdl = tex0f1747a4(gdl, tex1, arg2, arg3, arg4, sp38, -1, size); - sp38 += arg1->maxlod; + sp38 += tex1->maxlod; - if (!arg9 && arg1->maxlod == 1) { - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp38, -1, size); + if (!arg9 && tex1->maxlod == 1) { + gdl = tex0f1747a4(gdl, tex1, arg2, arg3, arg4, sp38, -1, size); } gDPPipeSync(gdl++); @@ -723,26 +723,26 @@ Gfx *tex0f175308(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar return gdl; } -Gfx *tex0f175490(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, bool arg8) +Gfx *tex0f175490(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, bool arg8) { s32 sp34 = 0; - gdl = tex0f1743a0(gdl, arg1, 0); - gdl = tex0f173f78(gdl, arg1, arg4, arg5, arg6, arg7); + gdl = tex0f1743a0(gdl, tex, 0); + gdl = tex0f173f78(gdl, tex, arg4, arg5, arg6, arg7); sp34++; if (arg8) { - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp34, 1, 0); + gdl = tex0f1747a4(gdl, tex, arg2, arg3, arg4, sp34, 1, 0); sp34++; } - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp34, -1, 0); + gdl = tex0f1747a4(gdl, tex, arg2, arg3, arg4, sp34, -1, 0); - sp34 += arg1->maxlod; + sp34 += tex->maxlod; - if (!arg8 && arg1->maxlod == 1) { - gdl = tex0f1747a4(gdl, arg1, arg2, arg3, arg4, sp34, -1, 0); + if (!arg8 && tex->maxlod == 1) { + gdl = tex0f1747a4(gdl, tex, arg2, arg3, arg4, sp34, -1, 0); } gDPPipeSync(gdl++); @@ -752,10 +752,10 @@ Gfx *tex0f175490(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar return gdl; } -Gfx *tex0f1755dc(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4) +Gfx *tex0f1755dc(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4) { - gdl = tex0f174b54(gdl, arg1); - gdl = tex0f174f30(gdl, arg1, arg2, arg3, arg4, 0); + gdl = tex0f174b54(gdl, tex); + gdl = tex0f174f30(gdl, tex, arg2, arg3, arg4, 0); gDPPipeSync(gdl++); @@ -764,11 +764,11 @@ Gfx *tex0f1755dc(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 ar return gdl; } -Gfx *tex0f17563c(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4) +Gfx *tex0f17563c(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4) { - gdl = tex0f174b54(gdl, arg1); - gdl = tex0f174f30(gdl, arg1, arg2, arg3, arg4, 0); - gdl = tex0f174f30(gdl, arg1, arg2, arg3, arg4, 1); + gdl = tex0f174b54(gdl, tex); + gdl = tex0f174f30(gdl, tex, arg2, arg3, arg4, 0); + gdl = tex0f174f30(gdl, tex, arg2, arg3, arg4, 1); gDPPipeSync(gdl++); @@ -843,8 +843,8 @@ glabel jtbl_var7f1b7c70 /* f17574c: a040ffff */ sb $zero,-0x1($v0) .L0f175750: /* f175750: 8faf0144 */ lw $t7,0x144($sp) -/* f175754: 3c18800b */ lui $t8,%hi(var800aabc8) -/* f175758: 2718abc8 */ addiu $t8,$t8,%lo(var800aabc8) +/* f175754: 3c18800b */ lui $t8,%hi(g_TexSharedPool) +/* f175758: 2718abc8 */ addiu $t8,$t8,%lo(g_TexSharedPool) /* f17575c: 15e00002 */ bnez $t7,.L0f175768 /* f175760: 27b70090 */ addiu $s7,$sp,0x90 /* f175764: afb80144 */ sw $t8,0x144($sp) @@ -895,7 +895,7 @@ glabel jtbl_var7f1b7c70 /* f175800: 0fc5cd3a */ jal texLoadFromTextureNum /* f175804: 01e09825 */ or $s3,$t7,$zero /* f175808: 02402025 */ or $a0,$s2,$zero -/* f17580c: 0fc5cba3 */ jal tex0f172e8c +/* f17580c: 0fc5cba3 */ jal texFindInPool /* f175810: 8fa50144 */ lw $a1,0x144($sp) /* f175814: 10400006 */ beqz $v0,.L0f175830 /* f175818: 00408825 */ or $s1,$v0,$zero @@ -960,7 +960,7 @@ glabel jtbl_var7f1b7c70 /* f1758f4: 0fc5cd3a */ jal texLoadFromTextureNum /* f1758f8: 00808025 */ or $s0,$a0,$zero /* f1758fc: 02002025 */ or $a0,$s0,$zero -/* f175900: 0fc5cba3 */ jal tex0f172e8c +/* f175900: 0fc5cba3 */ jal texFindInPool /* f175904: 8fa50144 */ lw $a1,0x144($sp) /* f175908: 10400046 */ beqz $v0,.L0f175a24 /* f17590c: 00405825 */ or $t3,$v0,$zero @@ -1388,10 +1388,10 @@ glabel jtbl_var7f1b7c70 ); // Mismatch: Extra move instruction in last half of G_VTX case -//s32 tex0f1756c0(Gfx *arg0, s32 arg1, Gfx *arg2, struct texturething *arg3, u32 arg4) +//s32 tex0f1756c0(Gfx *arg0, s32 arg1, Gfx *arg2, struct texpool *arg3, u32 arg4) //{ -// struct texloadthing *v0; -// struct texloadthing *v0_2; +// struct tex *v0; +// struct tex *v0_2; // Gfx *sp12c; // s32 sp128; // u32 tmp1; @@ -1440,7 +1440,7 @@ glabel jtbl_var7f1b7c70 // } // // if (arg3 == NULL) { -// arg3 = &var800aabc8; +// arg3 = &g_TexSharedPool; // } // // while (sp128 > 0) { @@ -1457,7 +1457,7 @@ glabel jtbl_var7f1b7c70 // // texLoadFromTextureNum(texturenum, arg3); // -// v0 = tex0f172e8c(texturenum, arg3); +// v0 = texFindInPool(texturenum, arg3); // // if (v0 != NULL) { // spf4 = v0->unk0c_03; @@ -1484,7 +1484,7 @@ glabel jtbl_var7f1b7c70 // case 1: // texturenum2 = (s5->words.w1 >> 12) & 0xfff; // texLoadFromTextureNum(texturenum2, arg3); -// v0_2 = tex0f172e8c(texturenum2, arg3); +// v0_2 = texFindInPool(texturenum2, arg3); // // if (v0_2 != NULL) { // tmp6 = (s5->words.w1 >> 24) & 0xff; diff --git a/src/game/texdecompress.c b/src/game/texdecompress.c index 167136408..3df10f7f7 100644 --- a/src/game/texdecompress.c +++ b/src/game/texdecompress.c @@ -12,10 +12,10 @@ struct texture *g_Textures; u32 var800aabc4; -struct texturething var800aabc8; +struct texpool g_TexSharedPool; struct texcacheitem g_TexCacheItems[150]; s32 g_TexCacheCount; -s32 var800ab53c; +s32 g_TexNumToLoad; u8 *var800ab540; u32 var800ab544; s32 var800ab548; @@ -23,7 +23,7 @@ u32 var800ab54c; u32 g_TexBase; u8 *g_TextureConfigSegment; s32 g_TexNumConfigs; -struct texloadthing **g_TexWords; +struct tex **g_TexWords; struct textureconfig *g_TexWallhitConfigs; Gfx *g_TexGdl1; Gfx *g_TexGdl2; @@ -140,7 +140,7 @@ void func0f16e810(u32 arg0) * * The zlib data is prefixed with the standard 5-byte rarezip header. */ -s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texturething *arg4, s32 arg5) +s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texpool *pool, s32 arg5) { s32 i; s32 imagebytesout; @@ -170,14 +170,14 @@ s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct textur numimages = 1; } - arg4->unk0c->maxlod = forcenumimages; - arg4->unk0c->unk0c_02 = arg2; + pool->rightpos->maxlod = forcenumimages; + pool->rightpos->unk0c_02 = arg2; if (arg2) { writetocache = true; for (i = 0; i < g_TexCacheCount; i++) { - if (g_TexCacheItems[i].texturenum == arg4->unk0c->texturenum) { + if (g_TexCacheItems[i].texturenum == pool->rightpos->texturenum) { writetocache = false; } } @@ -197,12 +197,12 @@ s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct textur height = texReadBits(8); if (j == 0) { - arg4->unk0c->width = width; - arg4->unk0c->height = height; - arg4->unk0c->unk0a = numcolours - 1; - arg4->unk0c->gbiformat = g_TexFormatGbiMappings[format]; - arg4->unk0c->depth = g_TexFormatDepths[format]; - arg4->unk0c->lutmodeindex = g_TexFormatLutModes[format] >> G_MDSFT_TEXTLUT; + pool->rightpos->width = width; + pool->rightpos->height = height; + pool->rightpos->unk0a = numcolours - 1; + pool->rightpos->gbiformat = g_TexFormatGbiMappings[format]; + pool->rightpos->depth = g_TexFormatDepths[format]; + pool->rightpos->lutmodeindex = g_TexFormatLutModes[format] >> G_MDSFT_TEXTLUT; } else if (writetocache) { g_TexCacheItems[g_TexCacheCount].widths[j - 1] = width; g_TexCacheItems[g_TexCacheCount].heights[j - 1] = height; @@ -227,13 +227,13 @@ s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct textur if (arg2 == 1) { if (IS4MB() && j == 2 && !foundthething) { - arg4->unk0c->maxlod = j; + pool->rightpos->maxlod = j; foundthething = true; } if (totalbytesout + imagebytesout > 0x800 || foundthething) { if (!foundthething) { - arg4->unk0c->maxlod = j; + pool->rightpos->maxlod = j; foundthething = true; } } else { @@ -246,7 +246,7 @@ s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct textur } if (writetocache) { - g_TexCacheItems[g_TexCacheCount].texturenum = arg4->unk0c->texturenum; + g_TexCacheItems[g_TexCacheCount].texturenum = pool->rightpos->texturenum; g_TexCacheCount++; @@ -267,12 +267,12 @@ s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct textur imagebytesout = texShrinkPaletted(start, end, tmpwidth, tmpheight, format, palette, numcolours); if (IS4MB() && j == 2) { - arg4->unk0c->maxlod = j; + pool->rightpos->maxlod = j; break; } if (totalbytesout + imagebytesout > 0x800) { - arg4->unk0c->maxlod = j; + pool->rightpos->maxlod = j; break; } @@ -307,7 +307,7 @@ s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct textur dst[totalbytesout + 0] = dst[totalbytesout - 2]; dst[totalbytesout + 1] = dst[totalbytesout - 1]; totalbytesout += 2; - arg4->unk0c->unk0a++; + pool->rightpos->unk0a++; } totalbytesout = (totalbytesout + 7) & ~7; @@ -677,7 +677,7 @@ s32 texFindClosestColourIndexIA(u16 *palette, s32 numcolours, s32 intensity, s32 * h = height in pixels * c = compression method (see TEXCOMPMETHOD constants) */ -s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texturething *arg4, s32 arg5) +s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texpool *pool, s32 arg5) { u8 scratch[0x2000]; u8 lookup[0x1000]; @@ -700,14 +700,14 @@ s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct tex numimages = arg2 && forcenumimages ? forcenumimages : 1; - arg4->unk0c->maxlod = forcenumimages; - arg4->unk0c->unk0c_02 = arg2; + pool->rightpos->maxlod = forcenumimages; + pool->rightpos->unk0c_02 = arg2; if (arg2) { writetocache = true; for (i = 0; i < g_TexCacheCount; i++) { - if (g_TexCacheItems[i].texturenum == arg4->unk0c->texturenum) { + if (g_TexCacheItems[i].texturenum == pool->rightpos->texturenum) { writetocache = false; } } @@ -720,11 +720,11 @@ s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct tex compmethod = texReadBits(4); if (i == 0) { - arg4->unk0c->width = width; - arg4->unk0c->height = height; - arg4->unk0c->gbiformat = g_TexFormatGbiMappings[format]; - arg4->unk0c->depth = g_TexFormatDepths[format]; - arg4->unk0c->lutmodeindex = g_TexFormatLutModes[format] >> G_MDSFT_TEXTLUT; + pool->rightpos->width = width; + pool->rightpos->height = height; + pool->rightpos->gbiformat = g_TexFormatGbiMappings[format]; + pool->rightpos->depth = g_TexFormatDepths[format]; + pool->rightpos->lutmodeindex = g_TexFormatLutModes[format] >> G_MDSFT_TEXTLUT; } else if (writetocache) { g_TexCacheItems[g_TexCacheCount].widths[i - 1] = width; g_TexCacheItems[g_TexCacheCount].heights[i - 1] = height; @@ -821,7 +821,7 @@ s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct tex } if (writetocache) { - g_TexCacheItems[g_TexCacheCount].texturenum = arg4->unk0c->texturenum; + g_TexCacheItems[g_TexCacheCount].texturenum = pool->rightpos->texturenum; g_TexCacheCount++; @@ -2009,44 +2009,44 @@ void texBlur(u8 *pixels, s32 width, s32 height, s32 method, s32 chansize) } } -void tex0f172e70(struct texturething *arg0, u8 *arg1, s32 arg2) +void texInitPool(struct texpool *pool, u8 *start, s32 len) { - arg0->unk00 = (struct texloadthing *)arg1; - arg0->unk04 = (struct texloadthing *)(arg1 + arg2); - arg0->unk08 = (struct texloadthing *)arg1; - arg0->unk0c = (struct texloadthing *)((s32)arg1 + arg2); + pool->start = start; + pool->end = (struct tex *)(start + len); + pool->leftpos = start; + pool->rightpos = (struct tex *)((s32)start + len); } -struct texloadthing *tex0f172e8c(s32 texturenum, struct texturething *arg1) +struct tex *texFindInPool(s32 texturenum, struct texpool *pool) { - struct texloadthing *end; - struct texloadthing *cur; + struct tex *end; + struct tex *cur; s32 i; - if (arg1 == NULL) { - arg1 = &var800aabc8; + if (pool == NULL) { + pool = &g_TexSharedPool; } - if (arg1 == &var800aabc8) { - cur = arg1->unk04; + if (pool == &g_TexSharedPool) { + cur = pool->head; while (cur) { if (cur->texturenum == texturenum) { return cur; } - if (!cur->unk0c_04) { + if (!cur->next) { return NULL; } - cur = (struct texloadthing *)PHYS_TO_K0(cur->unk0c_04); + cur = (struct tex *) PHYS_TO_K0(cur->next); } return NULL; } - end = arg1->unk04; - cur = arg1->unk0c; + end = pool->end; + cur = pool->rightpos; while (cur < end) { if (cur->texturenum == texturenum) { @@ -2059,321 +2059,31 @@ struct texloadthing *tex0f172e8c(s32 texturenum, struct texturething *arg1) return NULL; } -s32 func0f172f44(struct texturething *arg0) +s32 texGetPoolFreeBytes(struct texpool *pool) { - return (u32)arg0->unk0c - (u32)arg0->unk08; + return (s32) pool->rightpos - (s32) pool->leftpos; } -struct texloadthing *func0f172f54(struct texturething *arg0) +u8 *texGetPoolLeftPos(struct texpool *pool) { - return arg0->unk08; + return pool->leftpos; } -void texLoadFromDisplayList(Gfx *gdl, struct texturething *arg1, s32 arg2) +void texLoadFromDisplayList(Gfx *gdl, struct texpool *pool, s32 arg2) { u8 *bytes = (u8 *)gdl; while (bytes[0] != (u8)G_ENDDL) { // Look for GBI sequence: fd...... abcd.... if (bytes[0] == G_SETTIMG && bytes[4] == 0xab && bytes[5] == 0xcd) { - texLoad((s32 *)((s32)bytes + 4), arg1, arg2); + texLoad((s32 *)((s32)bytes + 4), pool, arg2); } bytes += 8; } } -GLOBAL_ASM( -glabel texLoad -/* f173010: 27bddb10 */ addiu $sp,$sp,-9456 -/* f173014: afb00020 */ sw $s0,0x20($sp) -/* f173018: 00a08025 */ or $s0,$a1,$zero -/* f17301c: afbf0024 */ sw $ra,0x24($sp) -/* f173020: afa424f0 */ sw $a0,0x24f0($sp) -/* f173024: afa624f8 */ sw $a2,0x24f8($sp) -/* f173028: 14a00003 */ bnez $a1,.L0f173038 -/* f17302c: 00003825 */ or $a3,$zero,$zero -/* f173030: 3c10800b */ lui $s0,%hi(var800aabc8) -/* f173034: 2610abc8 */ addiu $s0,$s0,%lo(var800aabc8) -.L0f173038: -/* f173038: 3c0e800b */ lui $t6,%hi(var800aabc8) -/* f17303c: 25ceabc8 */ addiu $t6,$t6,%lo(var800aabc8) -/* f173040: 160e0002 */ bne $s0,$t6,.L0f17304c -/* f173044: 8faf24f0 */ lw $t7,0x24f0($sp) -/* f173048: 24070001 */ addiu $a3,$zero,0x1 -.L0f17304c: -/* f17304c: 8de20000 */ lw $v0,0x0($t7) -/* f173050: 3c01ffff */ lui $at,0xffff -/* f173054: 02002825 */ or $a1,$s0,$zero -/* f173058: 00411824 */ and $v1,$v0,$at -/* f17305c: 10600002 */ beqz $v1,.L0f173068 -/* f173060: 3c01abcd */ lui $at,0xabcd -/* f173064: 146100ee */ bne $v1,$at,.L0f173420 -.L0f173068: -/* f173068: 3c03800b */ lui $v1,%hi(var800ab53c) -/* f17306c: 2463b53c */ addiu $v1,$v1,%lo(var800ab53c) -/* f173070: 3044ffff */ andi $a0,$v0,0xffff -/* f173074: ac640000 */ sw $a0,0x0($v1) -/* f173078: 0fc5cba3 */ jal tex0f172e8c -/* f17307c: a3a7148b */ sb $a3,0x148b($sp) -/* f173080: 144000e2 */ bnez $v0,.L0f17340c -/* f173084: afa2149c */ sw $v0,0x149c($sp) -/* f173088: 3c19800b */ lui $t9,%hi(var800ab53c) -/* f17308c: 8f39b53c */ lw $t9,%lo(var800ab53c)($t9) -/* f173090: 27a314bf */ addiu $v1,$sp,0x14bf -/* f173094: 00035102 */ srl $t2,$v1,0x4 -/* f173098: 2b210daf */ slti $at,$t9,_numtextures -/* f17309c: 102000e0 */ beqz $at,.L0f173420 -/* f1730a0: 000a5900 */ sll $t3,$t2,0x4 -/* f1730a4: 0c012048 */ jal osWritebackDCacheAll -/* f1730a8: afab002c */ sw $t3,0x2c($sp) -/* f1730ac: 8fa4002c */ lw $a0,0x2c($sp) -/* f1730b0: 0c013920 */ jal osInvalDCache -/* f1730b4: 24052000 */ addiu $a1,$zero,0x2000 -/* f1730b8: 3c0d800b */ lui $t5,%hi(var800ab53c) -/* f1730bc: 8dadb53c */ lw $t5,%lo(var800ab53c)($t5) -/* f1730c0: 3c0c800b */ lui $t4,%hi(g_Textures) -/* f1730c4: 8d8cabc0 */ lw $t4,%lo(g_Textures)($t4) -/* f1730c8: 000d70c0 */ sll $t6,$t5,0x3 -/* f1730cc: 3c0100ff */ lui $at,0xff -/* f1730d0: 018e1021 */ addu $v0,$t4,$t6 -/* f1730d4: 8c430000 */ lw $v1,0x0($v0) -/* f1730d8: 8c470008 */ lw $a3,0x8($v0) -/* f1730dc: 3421ffff */ ori $at,$at,0xffff -/* f1730e0: 00617824 */ and $t7,$v1,$at -/* f1730e4: 00e1c024 */ and $t8,$a3,$at -/* f1730e8: 11f800cd */ beq $t7,$t8,.L0f173420 -/* f1730ec: 8fa4002c */ lw $a0,0x2c($sp) -/* f1730f0: 030f3023 */ subu $a2,$t8,$t7 -/* f1730f4: 24c6001f */ addiu $a2,$a2,0x1f -/* f1730f8: 2401fff8 */ addiu $at,$zero,-8 -/* f1730fc: 3c0a01d6 */ lui $t2,%hi(_texturesdataSegmentRomStart) -/* f173100: 254a5f40 */ addiu $t2,$t2,%lo(_texturesdataSegmentRomStart) -/* f173104: 01e1c824 */ and $t9,$t7,$at -/* f173108: 00065902 */ srl $t3,$a2,0x4 -/* f17310c: 000b3100 */ sll $a2,$t3,0x4 -/* f173110: 032a2821 */ addu $a1,$t9,$t2 -/* f173114: 0c003504 */ jal dmaExec -/* f173118: afaf0044 */ sw $t7,0x44($sp) -/* f17311c: 8fa30044 */ lw $v1,0x44($sp) -/* f173120: 8fac002c */ lw $t4,0x2c($sp) -/* f173124: 93aa148b */ lbu $t2,0x148b($sp) -/* f173128: 306e0007 */ andi $t6,$v1,0x7 -/* f17312c: 018e3021 */ addu $a2,$t4,$t6 -/* f173130: 90c20000 */ lbu $v0,0x0($a2) -/* f173134: 00002825 */ or $a1,$zero,$zero -/* f173138: 02002025 */ or $a0,$s0,$zero -/* f17313c: 304f0080 */ andi $t7,$v0,0x80 -/* f173140: 30490040 */ andi $t1,$v0,0x40 -/* f173144: 3047003f */ andi $a3,$v0,0x3f -/* f173148: 000fc1c3 */ sra $t8,$t7,0x7 -/* f17314c: 0009c983 */ sra $t9,$t1,0x6 -/* f173150: 28e10006 */ slti $at,$a3,0x6 -/* f173154: afb814a8 */ sw $t8,0x14a8($sp) -/* f173158: 14200002 */ bnez $at,.L0f173164 -/* f17315c: 03204825 */ or $t1,$t9,$zero -/* f173160: 24070005 */ addiu $a3,$zero,0x5 -.L0f173164: -/* f173164: 1140000f */ beqz $t2,.L0f1731a4 -/* f173168: 24c60001 */ addiu $a2,$a2,0x1 -/* f17316c: 24040004 */ addiu $a0,$zero,0x4 -/* f173170: afa614ac */ sw $a2,0x14ac($sp) -/* f173174: afa714a0 */ sw $a3,0x14a0($sp) -/* f173178: 0c004935 */ jal mempGetPoolFree -/* f17317c: afa914a4 */ sw $t1,0x14a4($sp) -/* f173180: afa20030 */ sw $v0,0x30($sp) -/* f173184: 24040004 */ addiu $a0,$zero,0x4 -/* f173188: 0c004935 */ jal mempGetPoolFree -/* f17318c: 24050001 */ addiu $a1,$zero,0x1 -/* f173190: 8fab0030 */ lw $t3,0x30($sp) -/* f173194: 8fa714a0 */ lw $a3,0x14a0($sp) -/* f173198: 8fa914a4 */ lw $t1,0x14a4($sp) -/* f17319c: 10000008 */ b .L0f1731c0 -/* f1731a0: 004b1821 */ addu $v1,$v0,$t3 -.L0f1731a4: -/* f1731a4: afa614ac */ sw $a2,0x14ac($sp) -/* f1731a8: afa714a0 */ sw $a3,0x14a0($sp) -/* f1731ac: 0fc5cbd1 */ jal func0f172f44 -/* f1731b0: afa914a4 */ sw $t1,0x14a4($sp) -/* f1731b4: 8fa714a0 */ lw $a3,0x14a0($sp) -/* f1731b8: 8fa914a4 */ lw $t1,0x14a4($sp) -/* f1731bc: 00401825 */ or $v1,$v0,$zero -.L0f1731c0: -/* f1731c0: 15200003 */ bnez $t1,.L0f1731d0 -/* f1731c4: 2c6110cc */ sltiu $at,$v1,0x10cc -/* f1731c8: 14200005 */ bnez $at,.L0f1731e0 -/* f1731cc: 00000000 */ nop -.L0f1731d0: -/* f1731d0: 11200008 */ beqz $t1,.L0f1731f4 -/* f1731d4: 2c610a28 */ sltiu $at,$v1,0xa28 -/* f1731d8: 50200007 */ beqzl $at,.L0f1731f8 -/* f1731dc: 93ac148b */ lbu $t4,0x148b($sp) -.L0f1731e0: -/* f1731e0: 0c012d20 */ jal osVirtualToPhysical -/* f1731e4: 8e040000 */ lw $a0,0x0($s0) -/* f1731e8: 8fad24f0 */ lw $t5,0x24f0($sp) -/* f1731ec: 1000008c */ b .L0f173420 -/* f1731f0: ada20000 */ sw $v0,0x0($t5) -.L0f1731f4: -/* f1731f4: 93ac148b */ lbu $t4,0x148b($sp) -.L0f1731f8: -/* f1731f8: 27a20057 */ addiu $v0,$sp,0x57 -/* f1731fc: 00027102 */ srl $t6,$v0,0x4 -/* f173200: 11800015 */ beqz $t4,.L0f173258 -/* f173204: 3c0b800b */ lui $t3,%hi(var800ab53c) -/* f173208: 8e03000c */ lw $v1,0xc($s0) -/* f17320c: 000e7900 */ sll $t7,$t6,0x4 -/* f173210: 25e20010 */ addiu $v0,$t7,0x10 -/* f173214: 24580010 */ addiu $t8,$v0,0x10 -/* f173218: ae02000c */ sw $v0,0xc($s0) -/* f17321c: ae180008 */ sw $t8,0x8($s0) -/* f173220: 1060000d */ beqz $v1,.L0f173258 -/* f173224: afa31490 */ sw $v1,0x1490($sp) -/* f173228: 3c048000 */ lui $a0,0x8000 -/* f17322c: 8c62000c */ lw $v0,0xc($v1) -.L0f173230: -/* f173230: 0002c900 */ sll $t9,$v0,0x4 -/* f173234: 00191202 */ srl $v0,$t9,0x8 -/* f173238: 54400004 */ bnezl $v0,.L0f17324c -/* f17323c: 00441825 */ or $v1,$v0,$a0 -/* f173240: 10000005 */ b .L0f173258 -/* f173244: afa31490 */ sw $v1,0x1490($sp) -/* f173248: 00441825 */ or $v1,$v0,$a0 -.L0f17324c: -/* f17324c: 5460fff8 */ bnezl $v1,.L0f173230 -/* f173250: 8c62000c */ lw $v0,0xc($v1) -/* f173254: afa31490 */ sw $v1,0x1490($sp) -.L0f173258: -/* f173258: 8e020008 */ lw $v0,0x8($s0) -/* f17325c: 8d6bb53c */ lw $t3,%lo(var800ab53c)($t3) -/* f173260: 8fa31490 */ lw $v1,0x1490($sp) -/* f173264: 3c18800b */ lui $t8,%hi(var800ab53c) -/* f173268: a44b0000 */ sh $t3,0x0($v0) -/* f17326c: 8e0d0008 */ lw $t5,0x8($s0) -/* f173270: 8e0e000c */ lw $t6,0xc($s0) -/* f173274: 25ac0008 */ addiu $t4,$t5,0x8 -/* f173278: 25c8fff0 */ addiu $t0,$t6,-16 -/* f17327c: ae0c0008 */ sw $t4,0x8($s0) -/* f173280: ae08000c */ sw $t0,0xc($s0) -/* f173284: 950d0000 */ lhu $t5,0x0($t0) -/* f173288: 8f19b53c */ lw $t9,%lo(var800ab53c)($t8) -/* f17328c: 9118000c */ lbu $t8,0xc($t0) -/* f173290: 31ac000f */ andi $t4,$t5,0xf -/* f173294: 00195900 */ sll $t3,$t9,0x4 -/* f173298: 016c7025 */ or $t6,$t3,$t4 -/* f17329c: a50e0000 */ sh $t6,0x0($t0) -/* f1732a0: 8e0f0008 */ lw $t7,0x8($s0) -/* f1732a4: 3319ffef */ andi $t9,$t8,0xffef -/* f1732a8: a119000c */ sb $t9,0xc($t0) -/* f1732ac: 1120000d */ beqz $t1,.L0f1732e4 -/* f1732b0: ad0f0004 */ sw $t7,0x4($t0) -/* f1732b4: 8e050008 */ lw $a1,0x8($s0) -/* f1732b8: 8faa24f8 */ lw $t2,0x24f8($sp) -/* f1732bc: afa8149c */ sw $t0,0x149c($sp) -/* f1732c0: afa31490 */ sw $v1,0x1490($sp) -/* f1732c4: afb00010 */ sw $s0,0x10($sp) -/* f1732c8: 8fa414ac */ lw $a0,0x14ac($sp) -/* f1732cc: 8fa614a8 */ lw $a2,0x14a8($sp) -/* f1732d0: 0fc5ba06 */ jal texInflateZlib -/* f1732d4: afaa0014 */ sw $t2,0x14($sp) -/* f1732d8: 8fa31490 */ lw $v1,0x1490($sp) -/* f1732dc: 1000000c */ b .L0f173310 -/* f1732e0: afa20038 */ sw $v0,0x38($sp) -.L0f1732e4: -/* f1732e4: 8e050008 */ lw $a1,0x8($s0) -/* f1732e8: 8fad24f8 */ lw $t5,0x24f8($sp) -/* f1732ec: afa8149c */ sw $t0,0x149c($sp) -/* f1732f0: afa31490 */ sw $v1,0x1490($sp) -/* f1732f4: afb00010 */ sw $s0,0x10($sp) -/* f1732f8: 8fa414ac */ lw $a0,0x14ac($sp) -/* f1732fc: 8fa614a8 */ lw $a2,0x14a8($sp) -/* f173300: 0fc5bf79 */ jal texInflateNonZlib -/* f173304: afad0014 */ sw $t5,0x14($sp) -/* f173308: 8fa31490 */ lw $v1,0x1490($sp) -/* f17330c: afa20038 */ sw $v0,0x38($sp) -.L0f173310: -/* f173310: 93ab148b */ lbu $t3,0x148b($sp) -/* f173314: 8fa40038 */ lw $a0,0x38($sp) -/* f173318: 24050004 */ addiu $a1,$zero,0x4 -/* f17331c: 11600032 */ beqz $t3,.L0f1733e8 -/* f173320: 2484002f */ addiu $a0,$a0,0x2f -/* f173324: 348c000f */ ori $t4,$a0,0xf -/* f173328: 3984000f */ xori $a0,$t4,0xf -/* f17332c: 0c004991 */ jal mempAllocFromRight -/* f173330: afa31490 */ sw $v1,0x1490($sp) -/* f173334: ae02000c */ sw $v0,0xc($s0) -/* f173338: afa20034 */ sw $v0,0x34($sp) -/* f17333c: 8fa4149c */ lw $a0,0x149c($sp) -/* f173340: 00402825 */ or $a1,$v0,$zero -/* f173344: 0c012c5c */ jal bcopy -/* f173348: 24060010 */ addiu $a2,$zero,0x10 -/* f17334c: 8fa70034 */ lw $a3,0x34($sp) -/* f173350: 8fa60038 */ lw $a2,0x38($sp) -/* f173354: afa7149c */ sw $a3,0x149c($sp) -/* f173358: 8e040008 */ lw $a0,0x8($s0) -/* f17335c: 24e50010 */ addiu $a1,$a3,0x10 -/* f173360: afa50034 */ sw $a1,0x34($sp) -/* f173364: 24c60008 */ addiu $a2,$a2,0x8 -/* f173368: 0c012c5c */ jal bcopy -/* f17336c: 2484fff8 */ addiu $a0,$a0,-8 -/* f173370: 8fa70034 */ lw $a3,0x34($sp) -/* f173374: 8e18000c */ lw $t8,0xc($s0) -/* f173378: 8fa31490 */ lw $v1,0x1490($sp) -/* f17337c: 24ef0008 */ addiu $t7,$a3,0x8 -/* f173380: af0f0004 */ sw $t7,0x4($t8) -/* f173384: 8e02000c */ lw $v0,0xc($s0) -/* f173388: 3c0100ff */ lui $at,0xff -/* f17338c: 8c44000c */ lw $a0,0xc($v0) -/* f173390: 0004c902 */ srl $t9,$a0,0x4 -/* f173394: 00195200 */ sll $t2,$t9,0x8 -/* f173398: 000a6902 */ srl $t5,$t2,0x4 -/* f17339c: 01a45826 */ xor $t3,$t5,$a0 -/* f1733a0: 1060000e */ beqz $v1,.L0f1733dc -/* f1733a4: ac4b000c */ sw $t3,0xc($v0) -/* f1733a8: 8e0c000c */ lw $t4,0xc($s0) -/* f1733ac: 8c64000c */ lw $a0,0xc($v1) -/* f1733b0: 3421ffff */ ori $at,$at,0xffff -/* f1733b4: 01817024 */ and $t6,$t4,$at -/* f1733b8: 01c17824 */ and $t7,$t6,$at -/* f1733bc: 0004c102 */ srl $t8,$a0,0x4 -/* f1733c0: 01f8c826 */ xor $t9,$t7,$t8 -/* f1733c4: 00195200 */ sll $t2,$t9,0x8 -/* f1733c8: 000a6902 */ srl $t5,$t2,0x4 -/* f1733cc: 01a45826 */ xor $t3,$t5,$a0 -/* f1733d0: ac6b000c */ sw $t3,0xc($v1) -/* f1733d4: 10000003 */ b .L0f1733e4 -/* f1733d8: 8e02000c */ lw $v0,0xc($s0) -.L0f1733dc: -/* f1733dc: 8e02000c */ lw $v0,0xc($s0) -/* f1733e0: ae020004 */ sw $v0,0x4($s0) -.L0f1733e4: -/* f1733e4: ae020000 */ sw $v0,0x0($s0) -.L0f1733e8: -/* f1733e8: 8e0c0008 */ lw $t4,0x8($s0) -/* f1733ec: 8fae0038 */ lw $t6,0x38($sp) -/* f1733f0: 018e7821 */ addu $t7,$t4,$t6 -/* f1733f4: ae0f0008 */ sw $t7,0x8($s0) -/* f1733f8: 93b8148b */ lbu $t8,0x148b($sp) -/* f1733fc: 57000004 */ bnezl $t8,.L0f173410 -/* f173400: 8fb9149c */ lw $t9,0x149c($sp) -/* f173404: 0fc5cbd1 */ jal func0f172f44 -/* f173408: 02002025 */ or $a0,$s0,$zero -.L0f17340c: -/* f17340c: 8fb9149c */ lw $t9,0x149c($sp) -.L0f173410: -/* f173410: 0c012d20 */ jal osVirtualToPhysical -/* f173414: 8f240004 */ lw $a0,0x4($t9) -/* f173418: 8faa24f0 */ lw $t2,0x24f0($sp) -/* f17341c: ad420000 */ sw $v0,0x0($t2) -.L0f173420: -/* f173420: 8fbf0024 */ lw $ra,0x24($sp) -/* f173424: 8fb00020 */ lw $s0,0x20($sp) -/* f173428: 27bd24f0 */ addiu $sp,$sp,0x24f0 -/* f17342c: 03e00008 */ jr $ra -/* f173430: 00000000 */ nop -); - -//extern u8 _texturesdataSegmentRomStart; +extern u8 _texturesdataSegmentRomStart; /** * Load and decompress a texture from ROM. @@ -2410,152 +2120,174 @@ glabel texLoad * z = texture is compressed with zlib * l = number of levels of detail within the texture */ -// Mismatch: Reordered instructions and regalloc. Is functionally identical. -//void texLoad(u32 *ptr, struct texturething *arg1, s32 arg2) -//{ -// s32 sp14b0[1040]; -// u8 *sp14ac_ptr; -// s32 sp14a8; -// s32 sp14a4_iszlib; -// s32 sp14a0_lod; -// struct texloadthing *sp149c; -// u32 freebytes; -// u32 stack; -// struct texloadthing *sp1490; -// u32 stack2; -// u8 sp148b_usingsharedstruct; -// s8 sp48[5187]; -// s32 sp44; -// s32 sp38; -// struct texloadthing *sp34; -// s32 sp30; -// u8 *sp2c; -// -// sp148b_usingsharedstruct = 0; -// -// if (arg1 == NULL) { -// arg1 = &var800aabc8; -// } -// -// if (arg1 == &var800aabc8) { -// sp148b_usingsharedstruct = 1; -// } -// -// if ((*ptr & 0xffff0000) == 0 || (*ptr & 0xffff0000) == 0xabcd0000) { -// var800ab53c = *ptr & 0xffff; -// -// sp149c = tex0f172e8c(var800ab53c, arg1); -// -// if (sp149c == NULL && var800ab53c < NUM_TEXTURES) { -// sp2c = (void *)(((u32)sp14b0 + 0xf) >> 4 << 4); -// -// if (sp2c); -// -// osWritebackDCacheAll(); -// osInvalDCache(sp2c, DCACHE_SIZE); -// -// if (g_Textures[var800ab53c].dataoffset == g_Textures[var800ab53c + 1].dataoffset) { -// return; -// } -// -// sp44 = g_Textures[var800ab53c].dataoffset; -// -// dmaExec(sp2c, -// (u32)&_texturesdataSegmentRomStart + (sp44 & 0xfffffff8), -// (((g_Textures[var800ab53c + 1].dataoffset - sp44) + 0x1f) >> 4) * 0x10); -// -// if (sp148b_usingsharedstruct); -// sp14ac_ptr = sp2c + (sp44 & 7); -// sp14a8 = (*sp14ac_ptr & 0x80) >> 7; -// sp14a4_iszlib = (*sp14ac_ptr & 0x40) >> 6; -// sp14a0_lod = *sp14ac_ptr & 0x3f; -// -// if (sp14a0_lod > 5) { -// sp14a0_lod = 5; -// } -// -// sp14ac_ptr++; -// -// if (sp148b_usingsharedstruct) { -// freebytes = mempGetPoolFree(MEMPOOL_STAGE, MEMBANK_ONBOARD) + mempGetPoolFree(MEMPOOL_STAGE, MEMBANK_EXPANSION); -// } else { -// freebytes = func0f172f44(arg1); -// } -// -// if ((sp14a4_iszlib == 0 && freebytes < 4300) || (sp14a4_iszlib != 0 && freebytes < 2600)) { -// *ptr = osVirtualToPhysical(arg1->unk00); -// return; -// } -// -// if (sp148b_usingsharedstruct) { -// sp1490 = arg1->unk0c; -// arg1->unk0c = (struct texloadthing *)((((u32)sp48 + 0xf) >> 4 << 4) + 0x10); -// arg1->unk08 = arg1->unk0c + 1; -// -// while (sp1490) { -// if (sp1490->unk0c_04 == 0) { -// break; -// } -// -// sp1490 = (struct texloadthing *)PHYS_TO_K0(sp1490->unk0c_04); -// } -// } -// -// *(s16 *)(arg1->unk08) = var800ab53c; -// arg1->unk08 = (void *)((u32)arg1->unk08 + 8); -// sp149c = (struct texloadthing *)(arg1->unk0c - 1); -// arg1->unk0c = sp149c; -// sp149c->texturenum = var800ab53c; -// sp149c->unk04 = arg1->unk08; -// sp149c->unk0c_03 = false; -// -// if (sp14a4_iszlib) { -// sp38 = texInflateZlib(sp14ac_ptr, (u32 *)arg1->unk08, sp14a8, sp14a0_lod, arg1, arg2); -// } else { -// sp38 = texInflateNonZlib(sp14ac_ptr, (u32 *)arg1->unk08, sp14a8, sp14a0_lod, arg1, arg2); -// } -// -// if (sp148b_usingsharedstruct) { -// sp34 = mempAllocFromRight(ALIGN16(sp38 + 0x20), MEMPOOL_STAGE); -// arg1->unk0c = sp34; -// -// bcopy(sp149c, sp34, 0x10); -// -// sp149c = sp34; -// sp34++; -// -// bcopy((void *)((u32)arg1->unk08 - 8), sp34, sp38 + 8); -// -// arg1->unk0c->unk04 = (void *)((u32)sp34 + 8); -// arg1->unk0c->unk0c_04 = 0; -// -// if (sp1490 != NULL) { -// sp1490->unk0c_04 = (u32)arg1->unk0c & 0xffffff; -// } else { -// arg1->unk04 = arg1->unk0c; -// } -// -// arg1->unk00 = arg1->unk0c; -// } -// -// arg1->unk08 = (void *)((u32)arg1->unk08 + sp38); -// -// if (!sp148b_usingsharedstruct) { -// func0f172f44(arg1); -// } -// } -// } -// -// *ptr = osVirtualToPhysical(sp149c->unk04); -//} +void texLoad(s32 *updateword, struct texpool *pool, bool arg2) +{ + u8 compbuffer[4 * 1024 + 0x40]; + u8 *compptr; + s32 sp14a8; + s32 iszlib; + s32 lod; + struct tex *tex; + u8 *alignedcompbuffer; + u32 stack; + struct tex *tail; + u32 freebytes; + u8 usingsharedpool = 0; + s8 buffer5kb[5 * 1024 + 0x40]; + s32 thisoffset; + s32 nextoffset; + s16 *texnumptr; + s32 bytesout; -void texLoadFromConfigs(struct textureconfig *configs, s32 numconfigs, struct texturething *arg2, s32 arg3) + usingsharedpool = 0; + + if (pool == NULL) { + pool = &g_TexSharedPool; + } + + if (pool == &g_TexSharedPool) { + usingsharedpool = 1; + } + + // If the value at updateword isn't already a pointer + if ((*updateword & 0xffff0000) == 0 || (*updateword & 0xffff0000) == 0xabcd0000) { + g_TexNumToLoad = *updateword & 0xffff; + + tex = texFindInPool(g_TexNumToLoad, pool); + + if (tex == NULL) { + if (g_TexNumToLoad >= NUM_TEXTURES) { + return; + } + + alignedcompbuffer = (u8 *) (((u32)compbuffer + 0xf) >> 4 << 4); + + if (alignedcompbuffer); + if (tex); + + osWritebackDCacheAll(); + osInvalDCache(alignedcompbuffer, DCACHE_SIZE); + + thisoffset = g_Textures[g_TexNumToLoad].dataoffset; + nextoffset = g_Textures[g_TexNumToLoad + 1].dataoffset; + + if (thisoffset == nextoffset) { + // The texture has no data + return; + } + + // Copy the compressed texture to RAM + dmaExec(alignedcompbuffer, + (u32) &_texturesdataSegmentRomStart + (thisoffset & 0xfffffff8), + ((u32) (nextoffset - thisoffset) + 0x1f) >> 4 << 4); + + compptr = (u8 *) alignedcompbuffer + (thisoffset & 7); + thisoffset = 0; + sp14a8 = (*compptr & 0x80) >> 7; + iszlib = (*compptr & 0x40) >> 6; + lod = *compptr & 0x3f; + + if (lod > 5) { + lod = 5; + } + + compptr++; + + // If there's not enough memory to load the texture, set the texture + // pointer to the start of the pool. It'll be garbage data but the + // only other option is a crash. GBI commands contain texture IDs + // instead of pointers, and they must be replaced with pointers. + if (usingsharedpool) { + freebytes = mempGetPoolFree(MEMPOOL_STAGE, MEMBANK_ONBOARD) + mempGetPoolFree(MEMPOOL_STAGE, MEMBANK_EXPANSION); + } else { + freebytes = texGetPoolFreeBytes(pool); + } + + if ((!iszlib && freebytes < 4300) || (iszlib && freebytes < 2600)) { + *updateword = osVirtualToPhysical(pool->start); + return; + } + + // If we're using the shared pool: + // - rightpos is the head of a linked list, so grab it and find the tail + // - set rightpos to a spot in the buffer that can fit a tex before it + // - set leftpos to 0x10 after rightpos + if (usingsharedpool) { + tail = pool->rightpos; + pool->rightpos = (struct tex *) ((((u32) buffer5kb + 0xf) >> 4 << 4) + sizeof(struct tex)); + pool->leftpos = ((u8 *) pool->rightpos + sizeof(struct tex)); + + while (tail) { + if (tail->next == 0) { + break; + } + + tail = (struct tex *) PHYS_TO_K0(tail->next); + } + } + + // Write the texturenum into the allocation + texnumptr = (s16 *) pool->leftpos; + *texnumptr = g_TexNumToLoad; + pool->leftpos += 8; + + // Write a tex into the allocation + pool->rightpos--; + tex = pool->rightpos; + tex->texturenum = g_TexNumToLoad; + tex->data = pool->leftpos; + tex->unk0c_03 = false; + + // Extract the texture data to the allocation (pool->leftpos) + if (iszlib) { + bytesout = texInflateZlib(compptr, pool->leftpos, sp14a8, lod, pool, arg2); + } else { + bytesout = texInflateNonZlib(compptr, pool->leftpos, sp14a8, lod, pool, arg2); + } + + // If we're using the shared pool, the data must be copied out of + // the stack and into the heap. + if (usingsharedpool) { + u8 *ptr = mempAllocFromRight(ALIGN16(bytesout + 2 * sizeof(struct tex)), MEMPOOL_STAGE); + pool->rightpos = (struct tex *) ptr; + + bcopy(tex, ptr, sizeof(struct tex)); + + tex = (struct tex *) ptr; + ptr += sizeof(struct tex); + + bcopy(pool->leftpos - 8, ptr, bytesout + 8); + + pool->rightpos->data = ptr + 8; + pool->rightpos->next = 0; + + if (tail != NULL) { + tail->next = (u32) pool->rightpos & 0xffffff; + } else { + pool->head = pool->rightpos; + } + + pool->start = (u8 *) pool->rightpos; + } + + pool->leftpos += bytesout; + + if (!usingsharedpool) { + texGetPoolFreeBytes(pool); + } + } + + *updateword = osVirtualToPhysical(tex->data); + } +} + +void texLoadFromConfigs(struct textureconfig *configs, s32 numconfigs, struct texpool *pool, s32 arg3) { s32 i; for (i = 0; i < numconfigs; i++) { if ((s32)configs[i].texturenum < NUM_TEXTURES) { - texLoad(&configs[i].texturenum, arg2, 1); + texLoad(&configs[i].texturenum, pool, true); configs[i].unk0b = 1; } else { configs[i].texturenum += arg3; @@ -2563,11 +2295,11 @@ void texLoadFromConfigs(struct textureconfig *configs, s32 numconfigs, struct te } } -void texLoadFromTextureNum(u32 texturenum, struct texturething *arg1) +void texLoadFromTextureNum(u32 texturenum, struct texpool *pool) { s32 texturenumcopy = texturenum; - texLoad(&texturenumcopy, arg1, 1); + texLoad(&texturenumcopy, pool, true); } s32 func0f173510(s32 arg0, s32 arg1, s32 arg3) diff --git a/src/game/texreset.c b/src/game/texreset.c index e216f2db7..90f920a68 100644 --- a/src/game/texreset.c +++ b/src/game/texreset.c @@ -80,8 +80,8 @@ void texReset(void) } for (i = 0; i < ARRAYCOUNT(g_TcExplosionTexturePairs); i++) { - texLoad(&g_ExplosionTexturePairs[i].texturenum1, 0, 0); - texLoad(&g_ExplosionTexturePairs[i].texturenum2, 0, 0); + texLoad(&g_ExplosionTexturePairs[i].texturenum1, NULL, false); + texLoad(&g_ExplosionTexturePairs[i].texturenum2, NULL, false); } texLoadFromDisplayList(g_TexGdl1, 0, 0); diff --git a/src/game/texselect.c b/src/game/texselect.c index 4b7a2f2ca..4425ffa88 100644 --- a/src/game/texselect.c +++ b/src/game/texselect.c @@ -249,9 +249,9 @@ void texLoadFromConfig(struct textureconfig *config) } } -void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, u32 ulst, bool arg5, struct texturething *arg6) +void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, u32 ulst, bool arg5, struct texpool *pool) { - struct texloadthing *s4; + struct tex *tex; Gfx *gdl; s32 tile; @@ -280,10 +280,10 @@ void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, s32 line; u16 texturenum; - s4 = NULL; + tex = NULL; if ((u32)tconfig->texturenum < NUM_TEXTURES) { - texLoadFromConfigs(tconfig, 1, arg6, 0); + texLoadFromConfigs(tconfig, 1, pool, 0); } if (tconfig->unk0b == 1) { @@ -292,23 +292,23 @@ void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, index = tconfig - g_TexWallhitConfigs; if (index >= 0 && index < g_TexNumConfigs) { - s4 = g_TexWords[index]; + tex = g_TexWords[index]; } - if (s4 == NULL) { - s4 = tex0f172e8c(texturenum, arg6); + if (tex == NULL) { + tex = texFindInPool(texturenum, pool); if (index >= 0 && index < g_TexNumConfigs) { - g_TexWords[index] = s4; + g_TexWords[index] = tex; } } } if (tconfig->level == 0) { - if (s4) { - format = s4->gbiformat; - depth = s4->depth; - lutmode = s4->lutmodeindex << G_MDSFT_TEXTLUT; + if (tex) { + format = tex->gbiformat; + depth = tex->depth; + lutmode = tex->lutmodeindex << G_MDSFT_TEXTLUT; } else { format = tconfig->format; depth = tconfig->depth; @@ -388,12 +388,12 @@ void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, if (format == G_IM_FMT_CI) { u32 a3 = lrs + 1; - u32 t0 = (0x3ff - s4->unk0a) < a3 ? (0x3ff - s4->unk0a) : 0; + u32 t0 = (0x3ff - tex->unk0a) < a3 ? (0x3ff - tex->unk0a) : 0; a3 -= t0; gDPLoadSync(gdl++); - gDPLoadTLUT06(gdl++, a3, t0, s4->unk0a + a3, t0); + gDPLoadTLUT06(gdl++, a3, t0, tex->unk0a + a3, t0); gDPPipeSync(gdl++); if (arg5) { @@ -425,17 +425,17 @@ void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, lod = 6; } - if (s4) { - format = s4->gbiformat; - depth = s4->depth; - lutmode = s4->lutmodeindex << G_MDSFT_TEXTLUT; + if (tex) { + format = tex->gbiformat; + depth = tex->depth; + lutmode = tex->lutmodeindex << G_MDSFT_TEXTLUT; } else { format = tconfig->format; depth = tconfig->depth; } - if (s4 && s4->unk0c_02) { - tex0f173e50(s4, &depth2, &lrs); + if (tex && tex->unk0c_02) { + tex0f173e50(tex, &depth2, &lrs); } else { switch (depth) { case G_IM_SIZ_32b: @@ -506,12 +506,12 @@ void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, if (format == G_IM_FMT_CI) { u32 a2 = lrs + 1; - u32 a3 = (0x3ff - s4->unk0a) < a2 ? (0x3ff - s4->unk0a) : 0; + u32 a3 = (0x3ff - tex->unk0a) < a2 ? (0x3ff - tex->unk0a) : 0; a2 -= a3; gDPLoadSync(gdl++); - gDPLoadTLUT06(gdl++, a2, a3, s4->unk0a + a2, a3); + gDPLoadTLUT06(gdl++, a2, a3, tex->unk0a + a2, a3); gDPPipeSync(gdl++); if (arg5) { @@ -527,9 +527,9 @@ void texSelect(Gfx **gdlptr, struct textureconfig *tconfig, u32 arg2, s32 arg3, s32 line; if (tile > 0) { - if (s4 && s4->unk0c_02) { - width = texGetWidthAtLod(s4, tile); - height = texGetHeightAtLod(s4, tile); + if (tex && tex->unk0c_02) { + width = texGetWidthAtLod(tex, tile); + height = texGetHeightAtLod(tex, tile); } else { if (width >= 2) { width >>= 1; diff --git a/src/include/bss.h b/src/include/bss.h index 40615ed89..c901421d8 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -250,14 +250,14 @@ extern u32 *g_LangBanks[69]; extern struct var800aabb4 *var800aabb4; extern struct var800aabb8 *var800aabb8; extern struct texture *g_Textures; -extern struct texturething var800aabc8; +extern struct texpool g_TexSharedPool; extern struct texcacheitem g_TexCacheItems[150]; extern s32 g_TexCacheCount; extern u8 *var800ab540; extern u32 var800ab544; extern s32 var800ab548; extern s32 g_TexNumConfigs; -extern struct texloadthing **g_TexWords; +extern struct tex **g_TexWords; extern struct textureconfig *g_TexWallhitConfigs; extern Gfx *g_TexGdl1; extern Gfx *g_TexGdl2; diff --git a/src/include/game/modeldef.h b/src/include/game/modeldef.h index 311836e55..76491e3b8 100644 --- a/src/include/game/modeldef.h +++ b/src/include/game/modeldef.h @@ -4,9 +4,9 @@ #include "data.h" #include "types.h" -void modeldef0f1a7560(struct modelfiledata *modeldef, u16 filenum, u32 arg2, u32 arg3, struct texturething *arg4, bool arg5); +void modeldef0f1a7560(struct modelfiledata *modeldef, u16 filenum, u32 arg2, u32 arg3, struct texpool *arg4, bool arg5); void modelPromoteTypeToPointer(struct modelfiledata *filedata); -struct modelfiledata *modeldefLoad(u16 fileid, u8 *arg1, s32 arg2, struct texturething *arg3); +struct modelfiledata *modeldefLoad(u16 fileid, u8 *arg1, s32 arg2, struct texpool *arg3); struct modelfiledata *modeldefLoadToNew(u16 fileid); #endif diff --git a/src/include/game/tex.h b/src/include/game/tex.h index e91ba1501..e85b742b4 100644 --- a/src/include/game/tex.h +++ b/src/include/game/tex.h @@ -19,31 +19,31 @@ s32 tex0f0b34d8(s32 width, s32 height, s32 lod); s32 tex0f0b3548(s32 width, s32 height, s32 lod); void texSetRenderMode(Gfx **gdlptr, s32 arg1, s32 numcycles, s32 arg3); void texLoadFromConfig(struct textureconfig *config); -void texSelect(Gfx **gdl, struct textureconfig *tconfig, u32 arg2, s32 arg3, u32 arg4, bool arg5, struct texturething *arg6); +void texSelect(Gfx **gdl, struct textureconfig *tconfig, u32 arg2, s32 arg3, u32 arg4, bool arg5, struct texpool *pool); void tex0f173a08(void); bool texSetLutMode(u32 value); bool tex0f173a70(s32 index, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8, s32 shifts, s32 shiftt); bool tex0f173b8c(s32 index, s32 uls, s32 ult, s32 lrs, s32 lrt); -s32 texGetWidthAtLod(struct texloadthing *arg0, s32 lod); -s32 texGetHeightAtLod(struct texloadthing *arg0, s32 lod); -s32 texGetLineSizeInBytes(struct texloadthing *arg0, s32 lod); -s32 texGetSizeInBytes(struct texloadthing *arg0, s32 lod); -void tex0f173e50(struct texloadthing *arg0, s32 *arg1, s32 *arg2); +s32 texGetWidthAtLod(struct tex *tex, s32 lod); +s32 texGetHeightAtLod(struct tex *tex, s32 lod); +s32 texGetLineSizeInBytes(struct tex *tex, s32 lod); +s32 texGetSizeInBytes(struct tex *tex, s32 lod); +void tex0f173e50(struct tex *tex, s32 *arg1, s32 *arg2); s32 tex0f173f18(s32 arg0); s32 tex0f173f48(s32 arg0); -Gfx *tex0f173f78(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 shifts, s32 shiftt, s32 arg5); -Gfx *tex0f1742e4(Gfx *arg0, Gfx *arg1, struct texloadthing *arg2, bool arg3); -Gfx *tex0f1743a0(Gfx *gdl, struct texloadthing *arg1, s32 arg2); -Gfx *tex0f1747a4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, u32 size); -Gfx *tex0f174b54(Gfx *gdl, struct texloadthing *arg1); -Gfx *tex0f174f30(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 tile); -Gfx *tex0f1751e4(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, bool arg5); -Gfx *tex0f175308(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, struct texloadthing *arg5, s32 arg6, s32 arg7, s32 arg8, bool arg9); -Gfx *tex0f175490(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, bool arg8); -Gfx *tex0f1755dc(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4); -Gfx *tex0f17563c(Gfx *gdl, struct texloadthing *arg1, s32 arg2, s32 arg3, s32 arg4); -s32 tex0f1756c0(Gfx *arg0, s32 arg1, Gfx *arg2, struct texturething *arg3, u32 arg4); +Gfx *tex0f173f78(Gfx *gdl, struct tex *tex, s32 arg2, s32 shifts, s32 shiftt, s32 arg5); +Gfx *tex0f1742e4(Gfx *arg0, Gfx *arg1, struct tex *tex, bool arg3); +Gfx *tex0f1743a0(Gfx *gdl, struct tex *tex, s32 arg2); +Gfx *tex0f1747a4(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, u32 size); +Gfx *tex0f174b54(Gfx *gdl, struct tex *tex); +Gfx *tex0f174f30(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 tile); +Gfx *tex0f1751e4(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, bool arg5); +Gfx *tex0f175308(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, struct tex *arg5, s32 arg6, s32 arg7, s32 arg8, bool arg9); +Gfx *tex0f175490(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, bool arg8); +Gfx *tex0f1755dc(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4); +Gfx *tex0f17563c(Gfx *gdl, struct tex *tex, s32 arg2, s32 arg3, s32 arg4); +s32 tex0f1756c0(Gfx *arg0, s32 arg1, Gfx *arg2, struct texpool *pool, u32 arg4); void tex0f175ef4(Gfx *arg0, Gfx *arg1, s32 arg2); #endif diff --git a/src/include/game/texdecompress.h b/src/include/game/texdecompress.h index a489abdb2..cbecd9a80 100644 --- a/src/include/game/texdecompress.h +++ b/src/include/game/texdecompress.h @@ -5,7 +5,7 @@ #include "types.h" void func0f16e810(u32 arg0); -s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texturething *arg4, s32 arg5); +s32 texInflateZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texpool *pool, s32 arg5); s32 texAlignIndices(u8 *arg0, s32 width, s32 height, s32 format, u8 *dst); s32 texGetAverageRed(u16 colour1, u16 colour2, u16 colour3, u16 colour4); s32 texGetAverageGreen(u16 colour1, u16 colour2, u16 colour3, u16 colour4); @@ -14,7 +14,7 @@ s32 texGetAverageAlpha(u16 colour1, u16 colour2, u16 colour3, u16 colour4); s32 texShrinkPaletted(u8 *src, u8 *dst, s32 srcwidth, s32 srcheight, s32 format, u16 *palette, s32 numcolours); s32 texFindClosestColourIndexRGBA(u8 *palette, s32 numcolours, s32 r, s32 g, s32 b, s32 a); s32 texFindClosestColourIndexIA(u16 *palette, s32 numcolours, s32 intensity, s32 alpha); -s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texturething *arg4, s32 arg5); +s32 texInflateNonZlib(u8 *src, u8 *dst, s32 arg2, s32 forcenumimages, struct texpool *pool, s32 arg5); s32 texShrinkNonPaletted(u8 *src, u8 *dst, s32 srcwidth, s32 srcheight, s32 format); void texInflateHuffman(u8 *dst, s32 numiterations, s32 chansize); void texInflateRle(u8 *arg0, s32 arg1); @@ -27,13 +27,13 @@ s32 texInflateLookup(s32 width, s32 height, u8 *dst, u8 *lookup, s32 numcolours, s32 texInflateLookupFromBuffer(u8 *src, s32 width, s32 height, u8 *dst, u8 *lookup, s32 numcolours, s32 format); void texSwapAltRowBytes(u8 *arg0, s32 width, s32 height, s32 format); void texBlur(u8 *pixels, s32 width, s32 height, s32 method, s32 chansize); -void tex0f172e70(struct texturething *arg0, u8 *arg1, s32 arg2); -struct texloadthing *tex0f172e8c(s32 texturenum, struct texturething *arg1); -s32 func0f172f44(struct texturething *arg0); -struct texloadthing *func0f172f54(struct texturething *arg0); -void texLoadFromDisplayList(Gfx *gdl, struct texturething *arg1, s32 arg2); -void texLoad(s32 *texturenum, struct texturething *arg1, s32 arg2); -void texLoadFromConfigs(struct textureconfig *configs, s32 numconfigs, struct texturething *arg2, s32 arg3); -void texLoadFromTextureNum(u32 arg0, struct texturething *arg1); +void texInitPool(struct texpool *pool, u8 *start, s32 len); +struct tex *texFindInPool(s32 texturenum, struct texpool *pool); +s32 texGetPoolFreeBytes(struct texpool *pool); +u8 *texGetPoolLeftPos(struct texpool *pool); +void texLoadFromDisplayList(Gfx *gdl, struct texpool *pool, s32 arg2); +void texLoad(s32 *updateword, struct texpool *pool, bool arg2); +void texLoadFromConfigs(struct textureconfig *configs, s32 numconfigs, struct texpool *pool, s32 arg3); +void texLoadFromTextureNum(u32 arg0, struct texpool *pool); #endif diff --git a/src/include/types.h b/src/include/types.h index 897cb0d11..a56889a37 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -2285,11 +2285,14 @@ struct hand { /*0x0dd8*/ Mtxf *unk0dd8; }; -struct texturething { - struct texloadthing *unk00; - struct texloadthing *unk04; - struct texloadthing *unk08; - struct texloadthing *unk0c; +struct texpool { + u8 *start; + union { + struct tex *head; // for shared pool + struct tex *end; // for dedicated pools + }; + u8 *leftpos; + struct tex *rightpos; }; struct fileinfo { @@ -2326,7 +2329,7 @@ struct gunctrl { /*0x15b4*/ struct modelfiledata **loadtomodeldef; /*0x15b8*/ u32 *loadmemptr; /*0x15bc*/ u32 *loadmemremaining; - /*0x15c0*/ struct texturething unk15c0; + /*0x15c0*/ struct texpool unk15c0; /*0x15d0*/ u32 nexttexturetoload; /*0x15d4*/ struct fileinfo fileinfo; /*0x15dc*/ struct abmag abmag; @@ -6262,10 +6265,10 @@ struct awardmetrics { /*0x38*/ f32 accuracyfrac; }; -struct texloadthing { +struct tex { /*0x00*/ u16 texturenum : 12; /*0x00*/ u16 unk00_0c : 4; - /*0x04*/ u32 unk04; + /*0x04*/ u8 *data; /*0x08*/ u8 width; /*0x09*/ u8 height; /*0x0a*/ u8 unk0a; @@ -6275,7 +6278,7 @@ struct texloadthing { /*0x0c*/ u32 lutmodeindex : 2; /*0x0c*/ u32 unk0c_02 : 1; /*0x0c*/ u32 unk0c_03 : 1; - /*0x0c*/ u32 unk0c_04 : 24; + /*0x0c*/ u32 next : 24; }; struct texcacheitem {