Probleme
Apres session 60 la geometrie etait bonne mais il manquait des faces.
Diagnostic
Le passkey a des polygones avec numLines=3 mais contient des quads
(4 vertices) : par exemple le face arriere ptIdx [3,2,1,0] = le rectangle
au plan Z=-16 (tous les 4 points ont z=-16, coplanaires).
Avec numVerts = numLines = 3, on lisait seulement 3 des 4 vertices du quad,
generant un seul triangle au lieu de 2. Resultat : environ la moitie des
faces manquantes.
Preuve ASM (draw_PutInLines l.3352-3357)
this_line_flat:
addq #4, a1 ; avance vers vertex suivant
dbra d7, draw_PutInLines ; boucle numLines+1 fois (d7=numLines -> -1)
addq #4, a1 ; +4 final apres la boucle
rts
La boucle tourne numLines+1 fois, chaque iteration dessine un edge
v[i] -> v[i+1]. Pour un polygone FERME a V vertices il faut exactement
V edges donc V = numLines + 1.
Verification budget polygone
polySize = 18 + numLines*4 (verifie par lea 18(a1,d0.w*4),a1)
= 4 bytes header (numLines + flags)
+ 4*(numLines+1) bytes vertex list <- V = numLines+1 vertex reels
+ 4 bytes 1 vertex phantom (lu par PutInLines mais ignore)
+ 6 bytes footer (texOffset WORD + brightness BYTE + polyAngle BYTE + gouraud WORD)
= 4 + 4*numLines + 4 + 4 + 6 = 4*numLines + 18 ✓
Exemple passkey polygone 1
0070: 00 03 00 00 | 00 03 20 10 | 00 02 30 10 | 00 01 30 20 | 00 00 20 20 | ...
N=3 fl v[0]=3 v[1]=2 v[2]=1 v[3]=0 <-- FIX
Les 4 vertices pointent vers les pts 3,2,1,0 -> rectangle face Z=-16
(tous les points ont z=-16, verifie coplanarite).
Correction
// AVANT
int numVerts = numLines; // QUAD lu comme TRI -> 1 tri au lieu de 2
// APRES
int numVerts = numLines + 1; // QUAD lu comme QUAD -> fan 2 tris
Impact attendu
Les polygones reel du modele ont maintenant le bon nombre de sommets :
– numLines=2 -> 3 sommets = triangle
– numLines=3 -> 4 sommets = quad (fan 2 triangles)
– numLines=4 -> 5 sommets = pentagon (fan 3 triangles)
– etc.
Faces qui manquaient devraient etre maintenant visibles.