Aller au contenu principal

Session 134bis (suite 2) — Glarebox echelle native + flare additif + yaw 180°

Resume

Faisant suite a la session 134bis (lampes au plafond + adoucissement lumiere),
trois fixes pour le glarebox (defIndex=14, vectobj 3D du flare lumineux) :

  1. Echelle native : ne plus rescaler le glarebox a 0.8m, garder sa taille
    naturelle du binaire Amiga (= flare de plusieurs metres qui sort du plafond)
  2. Blending additif : rendu en flare lumineux (AlphaAdditive + depth-write off)
  3. Rotation 180° Y : correction de l’orientation native pour compenser le
    flip Z du builder (sinon les flares apparaissent a l’envers)

Fix 1 — Echelle native pour vectobj ceiling avec colHeight=0

Cause : addItems clampait spriteH a 0.8m pour les ceiling objects, ce qui
etait raisonnable pour les sprites 2D (RoofGlare, Lampglare) mais absurde pour
le glarebox qui est un vectobj 3D avec ses propres dimensions baked-in
depuis le binaire Amiga (VectObjConverter::readPoints, coords / SCALE=128).

Fix : detection gfxType==1 && colHeight==0 -> signal vectobjTargetH=-1f
pour indiquer « taille native ». Dans tryLoadVectObj :
keepNativeScale=true -> pas de setLocalScale()
– Translation : top du bbox a Y=0 local, donc jy=roofY du caller place
exactement le sommet au plafond et le flare descend naturellement.

Cohabitation avec les autres ceiling objects : les sprites 2D ceiling
(RoofGlare gfxType=2, Lampglare gfxType=2) gardent leur clamp 0.8m car ils
n’ont pas de taille intrinseque, juste une PNG centree.

Fix 2 — Blending additif pour le flare glarebox

Cause : VectObjConverter::buildMaterial cree un materiau Unshaded.j3md
opaque pour tous les vectobj. Pour le glarebox, qui est un effet de flare
lumineux « blanc qui s’ajoute au fond », le rendu opaque donne un cube blanc
dur sans degrade, alors que le user attend du « blanc au depart, transparent
a la fin ».

Fix ASM-fidele : l’Amiga rend les flares avec une additive blending
operation (pixel_final = pixel_back + pixel_flare * brightness). En JME on
simule cela via BlendMode.AlphaAdditive + depthWrite=false +
FaceCullMode.Off + bucket=Transparent.

Detection par nom vectobj "glarebox" dans tryLoadVectObj (post-load).

TODO : le rendu actuel est « presque transparent » car AlphaAdditive +
texture vectobj claire = faible contribution. A revoir ulterieurement
(peut-etre BlendMode.Additive simple ou ajustement des vertex colors
du vectobj).

Fix 3 — Yaw 180° pour orienter correctement le flare

Cause : le builder applique un flip Z (jz = -worldZ / XZ_SCALE) pour
convertir le repere Amiga (Z+ = profondeur, main-droite) vers JME (Z+ = vers
la camera, main-droite). Le VectObjConverter::readPoints applique aussi
un negate sur Y et Z pour traduire l’espace local du vectobj. Resultat
combine : le glarebox apparait tourne 180° par rapport a son orientation
Amiga d’origine.

Fix : model.rotate(0f, (float) Math.PI, 0f) apres le post-traitement
de materiau. Comme la rotation est autour de Y et que la translation native
est aussi sur Y, les deux operations commutent et le sommet reste au plafond.

Validation user : zone 87 de LEVEL_A montre les 4 flares correctement orientes.

Files

  • MODIFIED : src/main/java/com/ab3d2/tools/convert/LevelSceneBuilder.java
  • addItems() : signal vectobjTargetH=-1f pour gfxType=1+colHeight=0
  • addItems() : jy=roofY (pas roofY - spriteH/2) pour native ceiling
  • tryLoadVectObj() : mode keepNativeScale (translate top a Y=0 local)
  • tryLoadVectObj() : rotation 180° Y pour glarebox
  • Nouvelle methode applyGlareMaterial() (AlphaAdditive + depth-write off)

Laisser un commentaire

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