Probleme
Le crab et de nombreux autres vectobj presentaient des zones noires ou des
mauvaises textures sur leurs faces. Exemple visible : le corps du crab avec
2 grandes zones noires au lieu de la texture 27 (sur 32) de l’atlas.
Diagnostic
Outil VectObjTexOffsetInventory cree et lance sur le crab :
0x8201 | bank=1 slot=1 | colBk=128 | U:0-63 V:0-63 | tile22 (64x64 col=0)
0x8202 | bank=1 slot=2 | colBk=128 | U:0-63 V:0-63 | tile26 (64x64 col=0)
Les deltas UV (V range 0-63) ne depassent jamais 64. Preuve que chaque
tile fait bien 64×64 pixels, pas 256×64 comme suppose precedemment.
Cause racine
Le code assumait le layout A (8 tiles de 256×64 empilees verticalement).
Le vrai layout est B (grille 4 colonnes x 8 lignes de tiles 64×64).
Les deux interpretations ont la meme dimension totale (256×512) mais une
decoupe radicalement differente. La generation de l’atlas PNG elle-meme etait
correcte, mais le calcul d’UV utilisait un colStart dans 0..255 au lieu
de decomposer en tileCol (0..3) + colIn64 (0..63).
Fix (VectObjConverter.java)
Remplacement de la generation d’UV avec decomposition complete :
int bank = (rawTexOffset & 0x8000) != 0 ? 1 : 0;
int relOfs = rawTexOffset & 0x7FFF;
int slot = relOfs & 3; // 0..3
int rowBk = relOfs / 1024; // 0..63 (dans la tile)
int colBk = (relOfs % 1024) / 4; // 0..255 dans le slot
int tileCol = colBk / 64; // 0..3 (colonne tile dans atlas)
int tileRow = bank * 4 + slot; // 0..7 (ligne tile dans atlas)
int colIn64 = colBk % 64; // 0..63 (col de depart DANS tile)
int rowIn64 = rowBk; // 0..63
// Pour chaque vertex :
int colRaw = colIn64 + vtxU[v];
int rowRaw = rowIn64 + vtxV[v];
int colFinal = ((colRaw % 64) + 64) % 64; // wrap intra-tile modulo 64
int rowFinal = ((rowRaw % 64) + 64) % 64;
int pixelX = tileCol * 64 + colFinal;
int pixelY = tileRow * 64 + rowFinal;
Outil de diagnostic ajoute
VectObjTexOffsetInventory.java: liste les texOffsets d’un vectobj avec les
deltas UV pour chacun, et affiche les deux interpretations A et B cote a cote.- Task gradle
dumpTexOffsets -Pvectobj=<nom>dansbuild.gradle.
Fichiers modifies
src/main/java/com/ab3d2/tools/VectObjConverter.java: fix generation UVsrc/main/java/com/ab3d2/tools/VectObjTexOffsetInventory.java: nouvel outilbuild.gradle: ajout taskdumpTexOffsets
Validation
A relancer : ./gradlew convertVectObj puis ./gradlew run pour verifier que
le crab et les autres modeles ont leurs textures correctes.