Symptome
Apres session 64, majorite des modeles textures correctement mais Mantis
et certains enemies/parties ont des textures incorrectes.
Diagnostic via VectObjTextureScan
Scan des 112 polygones du Mantis revele :
– TOUS utilisent texOffset = 0x8302 ou 0x8303 (bank 1, col 192, row 0)
– Brightness=100 sur tous
Decouverte
0x8302 = relOfs 770 = 192*4 + 2 → lane=2 (et pas lane=0).
0x8303 = relOfs 771 = 192*4 + 3 → lane=3.
L’ASM move.b (a0, d0.w*4), d3 avec d0=(U<<8)|V lit toujours dans le MEME
slot. Si a0 est aligne sur lane 2, tous les samples viennent du slot 2 du
buffer, jamais du slot 0.
Nouvelle theorie validee (via TextureLayoutExplorer)
Chaque banque de 64KB contient 4 textures differentes interleaved
byte-par-byte :
Slot 0 : bytes 0, 4, 8, 12, ...
Slot 1 : bytes 1, 5, 9, 13, ...
Slot 2 : bytes 2, 6, 10, 14, ...
Slot 3 : bytes 3, 7, 11, 15, ...
2 banques * 4 slots = 8 textures de 256×64 au total.
Validation visuelle (all_slots.png) : on voit enfin TOUTES les
textures du jeu (panneaux EXIT, boutons numeriques, logo radioactif,
circuits imprimes, claviers 0-9, segments mecaniques, peau alien…)
au lieu d’un seul slot.
Dans les sessions precedentes on ne rendait QUE le slot 0, ce qui
explique pourquoi les aliens et un tas d’objets etaient mal mappes.
Corrections appliquees
TextureMapConverter.java :
– renderSlot(texData, shade, pal, bank, slot) : nouvelle methode generalisee
– renderBank() devient un alias pour renderSlot(..., slot=0) (API compat)
– Atlas PNG final : 256×512 (8 tuiles 256×64 empilees verticalement)
– texOffsetToSlot(texOffset) : retourne 0..3
– texOffsetToAtlasTile(texOffset) : retourne 0..7 (bank*4 + slot)
– sampleColor() corrige pour inclure le slot dans le byte offset
VectObjConverter.java :
– UVs normalisees sur l’atlas 256×512 via texOffsetToAtlasTile()
– Chaque polygone pointe sur sa tile (0..7) au lieu d’une banque (0..1)
Outils
VectObjTextureScan(NOUVEAU) : scan les texOffsets d’un vectobj +
genere atlas annote PNG. Usage :./gradlew scanVectObjTex -Pvectobj=MantisTextureLayoutExplorerreecrit : rend les 4 slots de chaque banque en
PNG separes + atlas combineall_slots.png.
Pipeline
./gradlew convertTextureMaps # regenere l'atlas 256x512 avec les 8 tuiles
./gradlew convertVectObj # regenere les .j3o avec les bons UV
./gradlew run # verifier visuellement le Mantis
Verification attendue
assets/Textures/vectobj/texturemaps_atlas.png= 256×512, avec 8 zones
de textures distinctes- Le Mantis affiche enfin une vraie texture d’alien (pas du metal gris)
- Tous les objets qui utilisaient les slots 1/2/3 sont correctement mappes
Statut final session 65
✅ VALIDE : atlas 8 slots genere avec les 32 textures reconnaissables
(EXIT, claviers, circuits, peau alien…). Mantis et autres modeles utilisant
slots 1/2/3 maintenant mappes sur les bonnes textures.
Residuel : certaines textures sont encore mal positionnees ou mal orientees
sur quelques polygones. Hypotheses a investiguer en session suivante :
– Flip U/V ou axes inverses sur certains modeles
– Interpretation signee vs non-signee des bytes U,V vertex
– Wraparound/modulo 64 sur row_final pour polygones qui debordent