Aller au contenu principal

Session 124 — Phase B (revision) : correction inversion semantique low/high nibble

Probleme observe

Apres l’implementation initiale de la phase B, l’utilisateur a constate que
le sol-verre ne pulsait pas (ainsi que les lampes du couloir adjacent), bien
que la luminosite globale ait ete amelioree par les corrections de la
phase A revision 3.

Cause

Apres relecture attentive de l’ASM hires.s:1502-1543, j’ai constate que
j’avais inverse la semantique du high byte du raw word pointBrights :

and.w   #$f, d3      ; d3 = lowNibble = pattern index (1..7)  <- choix pattern
lsr.w   #4, d4       ; d4 = highNibble
add.w   #1, d4       ; d4 = highNibble + 1 = interp factor (1..16)  <- amplitude
move.w  -2(a0, d3.w*2), d3   ; lookup Anim_BrightTable[lowNibble - 1]
muls    d4, d3                ; * (highNibble + 1)

Dans la version initiale de la phase B, j’avais code l’inverse :

phase   = highByte & 0x0F      // <- mais c'est le pattern, pas la phase!
animIdx = (highByte >> 4) + 1  // <- mais c'est l'amplitude, pas l'index!

Resultat : pour un raw word avec highByte = 0xF1 (= cas typique : pattern
BrightPulse1, amplitude max 16), la formule incorrecte interpretait :
– patternIdx = 16 (= depasse les 7 patterns dispos -> tombe en fallback Lb_static)
– interpFactor = phase = 1 (= 1/16 d’amplitude minimale)

Et 48-60% des sommets « animes » detectes par isAnimated avaient en fait
phase=0 dans l’ancienne formule, soit aucune animation effective. D’ou
l’absence totale de pulse visible.

Modifications

world/BrightnessCalc.java
computeLbDynamic : low nibble = pattern index, high nibble + 1 =
interpolation factor
. Renomme les variables locales pour matcher la
semantique reelle (patternIdx, interpFactor).
isAnimated : test sur le low nibble (= patternIdx) au lieu du high nibble.
Les rawWords avec highByte != 0 mais lowNibble = 0 sont desormais
consideres non-animes (= correct).
computePointRbAnimated et computeZoneWbAnimated : meme correction par
symetrie.

world/AnimBrightnessSystem.java
scanRec : ajoute mesh.setDynamic() apres le chargement du .j3o pour
s’assurer que les updates GPU du buffer Color soient appliques (les .j3o
serialises peuvent restorer les meshes en mode static, ce qui empeche
les writes au buffer apres le 1er upload).
– Ajout d’un log warn si une geometry a animEntries mais pas de buffer
Color (= bug de serialisation potentiel a investiguer).
– Log de debug toutes les 50 ticks (~5s) pour confirmer que l’animation
tourne au runtime.

Action requise

./gradlew buildScenes run

Le rebuild des scenes met a jour la liste des animEntries avec la nouvelle
isAnimated (= retire les fausses entries lowNibble=0). Avec 48-60% des
rawWords avec highByte != 0 dans le binaire, on s’attend a ce que ~80% de
ces rawWords aient un lowNibble valide (et donc animent vraiment), reduisant
le nombre d’entries inutiles dans le UserData.

Laisser un commentaire

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