Aller au contenu principal

Session 78 — Fix majeur layout atlas textures : 32 tiles de 64×64

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> dans build.gradle.

Fichiers modifies

  • src/main/java/com/ab3d2/tools/VectObjConverter.java : fix generation UV
  • src/main/java/com/ab3d2/tools/VectObjTexOffsetInventory.java : nouvel outil
  • build.gradle : ajout task dumpTexOffsets

Validation

A relancer : ./gradlew convertVectObj puis ./gradlew run pour verifier que
le crab et les autres modeles ont leurs textures correctes.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *