Deux fixes après test session 106
(1) Texture qui glisse « dans le mur du haut » (priorité utilisateur)
Après session 106, le panneau s’ouvre bien et le plafond mobile remonte
en synchro. Mais l’utilisateur a remarqué que la texture du chevron
s’efface par le bas au lieu de glisser vers le haut. Visuellement
ça donnait l’impression que la porte se faisait « manger » par le sol
plutôt qu’elle ne montait dans le plafond.
Diagnostic : la session 104 mappait l’UV pour que la texture reste
fixe dans le monde :
ub.put(BL_v + vShift); // BL voit une portion plus haute de la texture
ub.put(TL_v); // TL reste au sommet de la texture
Du coup, à mi-ouverture, le bas du quad visible voyait V=0.5 (= moitié
basse de la texture) au lieu de V=0 (= base du chevron). La portion
basse du chevron était coupée du quad.
Fix : inverser le sens du décalage.
ub.put(BL_v); // BL voit toujours V=0 (= base du chevron)
ub.put(TL_v - vShift); // TL voit V=vMax-vShift (= la partie haute sort par le haut)
La texture suit le quad qui monte. Le bas du quad voit toujours la
base du chevron, et la partie haute de la texture sort par le haut du
quad (= « glisse dans le mur du haut »).
Vérification mathématique à state=1 :
– effectiveRise = panelHeight
– vShift = panelHeight × 32 / tileH = vMax
– TL.v = vMax − vMax = 0
– BL.v = 0
– Quad collapse en V (texture invisible)
– CullHint.Always (state ≥ 0.999) cache le tout ✅
(2) Plafond zone-porte avec son propre floorH/roofH (détail mineur)
La porte rouge (zone 132) a son propre roofH plus bas que celui du
couloir. Après session 106, le plafond mobile montait jusqu’au plafond
du couloir, ce qui dépassait visuellement.
Fix : utiliser les floorH/roofH propres de la zone-porte :
float doorYBot = -doorZone.floorH() / SCALE; // sol propre de la zone-porte
float doorYTop = -doorZone.roofH() / SCALE; // plafond propre de la zone-porte
au lieu de acc.yBot / acc.yTop (qui viennent du premier couloir voisin).
La synchronisation reste assurée par maxPanelHeight (session 104) :
l’animation tourne à la même vitesse pour toute la porte, mais le plafond
mobile clampe à son propre panelHeight (= doorYTop − doorYBot) et
s’arrête pile au plafond rouge.
Pour tester
./gradlew buildScenes run
(Rebuild nécessaire pour le fix ③. Le fix ② est runtime-only mais le
build redonne la scène propre.)
Observations attendues :
– En s’approchant d’une porte fermée : chevron complet visible.
– Pendant l’ouverture : la texture monte avec le quad. Le bas du
chevron reste visible en bas du quad. La pointe (haut du chevron)
disparaît « dans le plafond ».
– Porte rouge zone 132 : le plafond mobile s’arrête à la hauteur du
plafond rouge propre (plus bas que le plafond couloir voisin).
Fichiers modifiés
world/DoorControl.java:updateMeshes— inversion du sens de
vShift(BL/BR fixes, TL/TR décrémentés).tools/LevelSceneBuilder.java: création du plafond mobile zone-porte
utilisedoorZone.floorH()/doorZone.roofH()au lieu de
acc.yBot/acc.yTop.