Aller au contenu principal

Session 63 — VectObj textures : fix decalage par bandes (OBSOLETE)

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

Laisser un commentaire

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