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);
où 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.yBotetacc.yTopviennent 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
makePolyCapGeopour 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.)