Aller au contenu principal

Session 130 — Recalibration amplitude + animation zone-level (sols/plafonds)

Confirmation session 129

Le pipeline GPU est valide : strobe rouge↔vert visible sur les murs animes
de LEVEL_A. Les sols ne strobaient pas car aucun {@code animEntries} n’etait
emis pour eux. C’est l’objet de cette session.

Retours utilisateur post-session 130 v1

  1. « L’animation est plus rapide dans le vrai jeu » → vérification ASM dans
    newanims.s:807 : move.w #5, Anim_Timer_w ;was 2 AL. La version
    originale ‘AL’ utilisait 2 frames Amiga (= 40ms), 2.5x plus rapide que
    les 5 frames (= 100ms) du binaire actuel. On retient la valeur originale.

  2. « Le sol est synchro avec les murs dans le vrai jeu » → vérification ASM
    dans hires.s:1549 (routine whythehell) : Plr1_RoomBright_w est
    calcule comme la moyenne des pointBrights des points frontiere
    de la zone, PAS comme zone.brightness. C’est pour cela que sols et
    murs pulsent en synchro : ils partagent la meme source de luminosite
    animée (pointBrights), pas zone.brightness qui est rarement animé.

Modifications (revision 2)

world/AnimBrightnessSystem.java
TICK_INTERVAL_SEC : 0.1f → 0.04f (40ms = ASM-AL original)

tools/LevelSceneBuilder.java
PolyData record refactore : remplace zoneBrightnessRaw par le couple
(animRawWord, animWbZone) qui peut driver soit l’animation zone-only
(rawWord = zone.brightness, wbZone = -1) soit l’animation wall-style
(rawWord = pointBrights animé, wbZone = wbZoneStatic).
collectHoriz : signature étendue avec animRawWord et animWbZone.
– Boucle buildScene : pour chaque zone, choisit la source d’animation
des sols/plafonds par priorite :
1. Premier pointBrights animé trouvé dans la zone → wall-style path
(sols pulsent en synchro avec les murs, comme l’ASM)
2. zone.brightness animé (rare) → zone-only path
3. Sinon pas d’animation
buildHorizGeo : utilise pd.animRawWord() et pd.animWbZone() au lieu
de l’ancien zoneBrightnessRaw. Log message mis a jour.

Effet attendu

Apres ./gradlew convertLevels buildScenes puis ./gradlew run :

  • Animation 2.5x plus rapide (40ms/tick au lieu de 100ms) : les pulses
    des lampes sont plus vifs, conforme a l’ASM-AL original.
  • Sols synchros : les zones avec lampes animées ont leur sol et
    plafond qui pulsent au même rythme que les murs, partagent la même
    source pointBrights.
  • Plus de « lumieres manquantes » sur les sols : les sols utilisent
    maintenant la même source de luminosité que les murs adjacents (au
    moins pour l’animation ; le shading statique reste a améliorer en V2
    pour passer en gouraud par-vertex).

Limitations connues

  • Le shading statique des sols reste uniforme par zone (= moyenne
    baked au build). Une V2 future devrait passer en gouraud par-vertex
    comme les murs, en utilisant les pointBrights des coins du polygone.
    C’est un refactor plus important (per-zone vs per-vertex meshing).
  • L’approximation « premier pointBrights animé » donne le bon rythme
    mais pas exactement la moyenne ASM. Pour avoir l’amplitude exacte,
    il faudrait porter le calcul de moyenne dynamique a chaque tick.

Modifications session 130 v1 (toujours valides)

world/BrightnessCalc.java (inchangé v1)
MIN_INTENSITY : 0.25 → 0.10 (zones sombres plus sombres)
rbToIntensity : courbe ratio² (squared) pour plus de contraste
– Nouveau computeZoneWbDynamic(rawWord, tickCounter)

tools/LevelJsonExporter.java (inchangé v1)
– Nouveau champ "brightnessRaw" (16-bit complet) par zone

tools/LevelSceneBuilder.java (additionnel v1)
ZD record : ajout brightnessRaw
parseZones : lit brightnessRaw du JSON

world/AnimBrightnessSystem.java (inchangé v1)
DEBUG_AMPLIFY = false (mode production)
updateAnimatedColors gère le sentinel wbZone < 0

Laisser un commentaire

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