match load_texture (#563)

* match load_texture

* fix

* clean up a bit
This commit is contained in:
Unnunu
2025-05-13 07:33:39 -04:00
committed by GitHub
parent 3d154cf767
commit 0f0b9e06f3
2 changed files with 35 additions and 43 deletions
+6 -6
View File
@@ -7,7 +7,7 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd
<!-- README_SCORE_SUMMARY_BEGIN -->
As of May 12, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 86.85%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 86.98%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 56.95%
<!-- README_SCORE_SUMMARY_END -->
@@ -121,16 +121,16 @@ As of May 12, 2025, this is our current score:
```
=====================================================================
ADVENTURE ONE (ASM -> C Decompilation)
--------------- 86.85% Complete (88.01% NON_MATCHING) ---------------
# Decompiled functions: 1887
# GLOBAL_ASM remaining: 64
--------------- 86.98% Complete (88.14% NON_MATCHING) ---------------
# Decompiled functions: 1888
# GLOBAL_ASM remaining: 63
# NON_MATCHING functions: 7
# NON_EQUIVALENT WIP functions: 22
# NON_EQUIVALENT WIP functions: 21
---------------------------- Game Status ----------------------------
Balloons: 40/47, Keys: 4/4, Trophies: 4/5
T.T. Amulets: 4/4, Wizpig Amulets: 4/4
---------------------------------------------------------------------
We are racing in Darkmoon Caverns. (Lap 1/3)
We are racing in Darkmoon Caverns. (Lap 2/3)
=====================================================================
ADVENTURE TWO (Cleanup & Documentation)
-------------------------- 56.95% Complete --------------------------
+29 -37
View File
@@ -416,26 +416,21 @@ UNUSED s32 sprite_table_size(void) {
return gSpriteTableSize;
}
#ifdef NON_EQUIVALENT
// Minor matching issues with loops, but should be functionally the same.
// Official Name: texLoadTexture
// Official Name: texLoadTexture
TextureHeader *load_texture(s32 arg0) {
s32 assetSection;
TextureHeader *tex;
TextureHeader *texTemp;
u32 temp_a1;
s32 assetIndex;
s32 assetOffset;
s32 assetSize;
s32 assetTable;
s32 texIndex;
s32 temp_a1;
s32 paletteOffset;
s32 assetSection;
s32 texIndex;
s32 assetTable;
s32 i;
u8 *alignedAddress;
TextureHeader *tex;
TextureHeader *texTemp;
s32 numberOfTextures;
u16 numberOfTextures;
s32 sp3C;
s32 temp_a0;
s32 temp_v0_5;
arg0 &= 0xFFFF;
assetIndex = arg0;
@@ -450,8 +445,8 @@ TextureHeader *load_texture(s32 arg0) {
arg0 = 0;
}
for (i = 0; i < gNumberOfLoadedTextures; i++) {
if (arg0 == gTextureCache[(i << 1)]) {
tex = (TextureHeader *) gTextureCache[(i << 1) + 1];
if (arg0 == gTextureCache[ASSETCACHE_ID(i)]) {
tex = (TextureHeader *) gTextureCache[ASSETCACHE_PTR(i)];
tex->numberOfInstances++;
return tex;
}
@@ -459,39 +454,38 @@ TextureHeader *load_texture(s32 arg0) {
assetOffset = gTextureAssetTable[assetTable][assetIndex];
assetSize = gTextureAssetTable[assetTable][assetIndex + 1] - assetOffset;
load_asset_to_address(assetSection, (u32) gTempTextureHeader, assetOffset, 0x28);
numberOfTextures = (gTempTextureHeader->header.numOfTextures >> 8) & 0xFFFF;
numberOfTextures = gTempTextureHeader->header.numOfTextures >> 8;
if (!gTempTextureHeader->header.isCompressed) {
tex = (TextureHeader *) mempool_alloc((numberOfTextures * 0x60) + assetSize, gTexColourTag);
tex = (TextureHeader *) mempool_alloc(numberOfTextures * 0x60 + assetSize, gTexColourTag);
if (tex == NULL) {
return NULL;
}
load_asset_to_address(assetSection, (u32) tex, assetOffset, assetSize);
} else {
temp_v0_5 = byteswap32((u8 *) &gTempTextureHeader->uncompressedSize);
temp_a0 = (numberOfTextures * 0x60) + temp_v0_5;
sp3C = temp_v0_5 + 0x20;
tex = (TextureHeader *) mempool_alloc(temp_a0 + 0x20, gTexColourTag);
sp3C = byteswap32((u8 *) &gTempTextureHeader->uncompressedSize) + sizeof(TextureHeader);
tex = (TextureHeader *) mempool_alloc(numberOfTextures * 0x60 + sp3C, gTexColourTag);
if (tex == NULL) {
return NULL;
}
temp_a1 = ((s32) tex + sp3C) - assetSize;
temp_a1 -= temp_a1 % 0x10;
temp_a1 = (((s32) tex + sp3C) - assetSize);
temp_a1 = (s32) temp_a1 - (s32) temp_a1 % 16;
load_asset_to_address(assetSection, temp_a1, assetOffset, assetSize);
gzip_inflate((u8 *) (temp_a1 + 0x20), (u8 *) tex);
assetSize = sp3C - 0x20;
gzip_inflate((u8 *) (temp_a1 + sizeof(TextureHeader)), (u8 *) tex);
assetSize = sp3C - sizeof(TextureHeader);
}
texIndex = -1;
for (i = 0; i < gNumberOfLoadedTextures; i++) {
if (gTextureCache[(i << 1)] == -1) {
if (gTextureCache[ASSETCACHE_ID(i)] == -1) {
texIndex = i;
}
}
if (texIndex == -1) {
texIndex = gNumberOfLoadedTextures++;
texIndex = gNumberOfLoadedTextures;
gNumberOfLoadedTextures++;
}
gTextureCache[(texIndex << 1)] = arg0;
gTextureCache[(texIndex << 1) + 1] = (s32) tex;
gTextureCache[ASSETCACHE_ID(texIndex)] = arg0;
gTextureCache[ASSETCACHE_PTR(texIndex)] = (s32) tex;
paletteOffset = -1;
if ((tex->format & 0xF) == TEX_FORMAT_CI4) {
if (D_80126344 == 0) {
@@ -510,28 +504,26 @@ TextureHeader *load_texture(s32 arg0) {
paletteOffset = gCiPalettesSize - 128;
}
D_80126344 = 0;
assetOffset = (s32)align16((u8 *) ((s32) tex + assetSize));
texTemp = tex;
alignedAddress = align16((u8 *) ((s32) texTemp + assetSize));
for (i = 0; i < numberOfTextures; i++) {
material_init(texTemp, (Gfx *) alignedAddress);
material_init(texTemp, (Gfx *) assetOffset);
if (paletteOffset >= 0) {
texTemp->ciPaletteOffset = paletteOffset;
alignedAddress += 0x30; // I'm guessing it takes 6 f3d commands to load the palette
assetOffset += 0x30; // I'm guessing it takes 6 f3d commands to load the palette
}
alignedAddress += 0x60; // I'm guessing it takes 12 f3d commands to load the texture
assetOffset += 0x60; // I'm guessing it takes 12 f3d commands to load the texture
texTemp = (TextureHeader *) ((s32) texTemp + texTemp->textureSize);
}
if (gCiPalettesSize >= 0x280) {
return NULL;
}
if (gNumberOfLoadedTextures >= 701) {
if (gNumberOfLoadedTextures > 700) {
return NULL;
}
return tex;
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/textures_sprites/load_texture.s")
#endif
/**
* This function attempts to free the texture from memory.