Symptome
Apres session 62, les textures apparaissaient decalees par bandes
horizontales : chaque polygone prenait une bande de texture qui n’avait
pas de rapport avec son contenu, comme si on demarrait toujours au row 0
alors que ce n’etait pas le cas.
Analyse ASM (l.2371-2376)
move.l Draw_TextureMapsPtr_l, a0
move.w (a1)+, d0 ; texOffset (WORD)
bge.s .notsec
and.w #$7fff, d0
add.l #65536, a0 ; banque 1
.notsec:
add.w d0, a0 ; a0 += texOffset (byte offset)
texOffset est un byte offset arbitraire dans la banque. Dans le layout
interleaved 4-chunky :
byte_ofs = block * 256 + row * 4 + lane
Ce texOffset peut donc pointer au milieu d’une colonne (row > 0), pas
seulement au debut.
La session 62 traduisait texOffset → column en ignorant totalement le
row de depart, d’ou le decalage par bandes : chaque poly demarrait au row 0
meme s’il etait cense commencer row 17, 32, etc.
Decomposition correcte du texOffset
texOffset = block * 256 + rowStart * 4 + lane
→ block = relOfs / 256 (0..255)
→ rowStart = (relOfs % 256) / 4 (0..63) <-- MANQUANT session 62
→ lane = relOfs % 4 (0..3)
→ col = block * 4 + lane (colonne globale dans l'atlas)
Step size des U,V vertex (formule ASM drawpol)
Le sample final : d0 = (U_int << 8) | V_int, puis d0 * 4 = byte offset :
byte_ofs_from_a0 = (U * 1024) + (V * 4)
Dans le layout atlas :
– 1024 bytes = 4 blocks = 16 colonnes
– 4 bytes = 1 row
Donc :
col_final = baseCol + U_vertex * 16
row_final = rowStart + V_vertex
La session 62 utilisait U_vertex * 1 (1 unite = 1 colonne) ce qui ne
correspondait a rien dans le mapping ASM.
Correction
TextureMapConverter.java :
– Nouvelle methode texOffsetToRowStart(texOffset) qui retourne le row
de depart (0..63).
– Documentation enrichie de texOffsetToColumn().
VectObjConverter.java : dans readPolygons(), generation des UV :
int baseCol = texOffsetToColumn(rawTexOffset);
int rowStart = texOffsetToRowStart(rawTexOffset); // NOUVEAU
int bankRowOfs = texOffsetToBank(rawTexOffset) * 64;
int colFinal = baseCol + vtxU[v] * 16; // *16 et non *1
int rowFinal = rowStart + vtxV[v]; // + rowStart et non 0
Verification attendue
Apres re-conversion, les textures doivent etre correctement alignees sur
chaque polygone, sans bande horizontale decalee.
Pipeline
./gradlew convertVectObj # pas besoin de reconvertir les PNG atlas
./gradlew run