Aller au contenu principal

Session 106 — Plafond mobile commun (ASM-fidèle)

Suggestion utilisateur (excellente)

« Il faut que les n faces de la porte aient le même fond, un quad du
plafond. Ou alors tu descends le plafond : pour la porte rouge le
plafond devrait toucher le sol et monter en même temps que les pans,
et tout s’arrête une fois la hauteur du plafond initial atteinte. »

C’est exactement la mécanique ASM ! Dans newanims.s::DoorRoutine,
ZoneT_Roof_l de la zone-porte est patché à chaque frame pour suivre
le mouvement des ZDoorWalls. Au repos la zone-porte est aplatie (plafond
= sol), elle s’élève avec l’ouverture, et atteint sa hauteur finale
(plafond du couloir) quand la porte est complètement ouverte.

Fix : 1 quad polygonal partagé, animé en synchro

Les N caps par-pan (session 105) sont retirés. À leur place, un
seul quad polygonal
couvrant toute la zone-porte est créé après la
boucle des pans, et attaché au même dn (DoorNode).

ZD doorZone = zones.get(doorZoneId);
List<Float> roofCoords = ...;  // polygone XZ depuis edges de la zone-porte
float[] roofXZ = ...;

Geometry roofGeo = makePolyCapGeo("door_<id>_roof",
    roofXZ, acc.yBot, roofMat, false /* normalDown */);
roofGeo.setUserData("faceType", "bottom");
roofGeo.setUserData("yBotSeg", acc.yBot);  // sol couloir
roofGeo.setUserData("yTopSeg", acc.yTop);  // plafond couloir
dn.attachChild(roofGeo);

L’animation est gérée par DoorControl via la branche "bottom"
faceType existante (session 105) :

geo.setLocalTranslation(0, effectiveRise, 0);

effectiveRise = min(maxPanelHeight * state, panelHeight). À
state=1, le plafond a remonté de toute la hauteur couloir et atteint
sa position normale.

Texture

ceilTile est maintenant pris directement de la zone-porte
(doorZone.ceilTile()), pas du couloir voisin. Plus cohérent : le
plafond mobile a la texture du plafond original de la zone-porte (qui
apparaîtra finalement à sa place quand la porte est ouverte).

Nouveau helper makePolyCapGeo

Quad triangle-fan couvrant un polygone XZ arbitraire (vs l’ancien
makeCapGeo qui faisait des quads rectangulaires à 4 corners). Sup-
porte les zones-portes avec N edges (3, 4, 5, 6 ou plus). Pour zone 30
qui a 6 walls, c’est utile.

Pour tester

./gradlew buildScenes run

(Rebuild nécessaire — la géométrie change.)

Observations attendues :
– Au repos, devant une porte fermée : on voit les pans verticaux
(chevron) avec un « fond » au niveau du sol (le plafond mobile posé
au sol, texture du plafond couloir).
– Pendant l’ouverture : les pans remontent ET le plafond remonte avec.
Les deux atteignent leur position finale ensemble.
– Après ouverture complète : le plafond est à hauteur normale, les
pans ont disparu, on traverse librement.
– Plus de « cube ouvert » au-dessus, plus d’effet feuille de papier.

Limites

  • Le plafond mobile peut être vu à travers les ZDoorWalls (FaceCullMode.
    Off) qui sont juste devant. Quand la porte est fermée, le sol couloir
    rend en premier, puis le plafond mobile (au même Y), puis les pans :
    pas de problème en pratique tant que le plafond mobile a une normale
    opposée au pan front.
  • acc.yBot et acc.yTop viennent du PREMIER couloir voisin. Si la
    porte est entre 2 couloirs de hauteurs différentes, le plafond mobile
    utilise les valeurs du premier. La synchro session 104 (maxPanelHeight)
    garantit que tous les pans suivent ensemble.

Fichiers modifiés

  • tools/LevelSceneBuilder.java :
  • retrait du bloc « caps par pan » (session 105)
  • ajout du bloc « plafond mobile zone-porte » après la boucle des pans
  • nouveau helper makePolyCapGeo pour quads polygonaux N-côtés

(DoorControl.java inchangé — la branche "bottom" de session 105
fait déjà le bon travail pour le nouveau plafond mobile.)

Laisser un commentaire

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