Symptôme
Après session 103, la porte 132 s’ouvre fluide (plus de saccades) et a une
vraie épaisseur. Mais on observait encore que les différents pans d’une
porte ne montaient pas tous à la même vitesse ni jusqu’à un Y
final commun. Résultat : pendant l’ouverture, certains pans étaient
plus avancés que d’autres.
Diagnostic
Depuis la session 100, l’animation était par-seg :
float riseAmount = panelHeight * state; // panelHeight propre au seg
La session 102 imposait panelHeight = yR - yF (hauteur du couloir). Mais
si une porte est entre deux couloirs de hauteurs différentes (zone A
avec roofH=-128, zone B avec roofH=-256 par exemple), alors :
– les pans du côté A ont panelHeight_A = yR_A - yF_A
– les pans du côté B ont panelHeight_B = yR_B - yF_B ≠ panelHeight_A
À la même valeur de state, les deux groupes ont monté de quantités
différentes en JME, et leurs Y finaux étaient différents.
Fix (DoorControl.java)
Pre-pass dans updateMeshes pour calculer un maxPanelHeight commun à
toute la porte, puis utiliser ce max pour le riseAmount :
float maxPanelHeight = 0f;
for (Spatial child : doorNode.getChildren()) {
Float yBotSeg = geo.getUserData("yBotSeg");
Float yTopSeg = geo.getUserData("yTopSeg");
float h = yTopSeg - yBotSeg;
if (h > maxPanelHeight) maxPanelHeight = h;
}
// Dans la boucle principale :
float panelHeight = segTop - segBot;
float riseAmount = maxPanelHeight * state; // commun
float effectiveRise = Math.min(riseAmount, panelHeight); // clamp
float curYBot = segBot + effectiveRise;
Comportement :
– Tous les pans montent à la même vitesse JME (maxPanelHeight * d_state/dt)
– À state=1, le pan le plus grand atteint pile son segTop
– Les pans plus courts collapsent à leur segTop plus tôt (quand
riseAmount > panelHeight_seg), puis restent invisibles le reste de
l’animation — c’est l’effet « le pan disparait dans le plafond »
– L’UV vShift utilise effectiveRise au lieu de riseAmount pour ne
pas faire déborder la texture au-delà du sommet
Pour tester
./gradlew run
(Pas besoin de buildScenes cette fois : c’est un changement purement
runtime dans DoorControl.)
Zones de test :
– Porte zone 30 (6 pans) : test critique, les 6 pans doivent monter
parfaitement synchronisés
– Porte zone 132 (rouge) : confirme que la fluidité session 103 est
préservée, et vérifie la synchronisation
– Toutes les portes à 2 couloirs de hauteurs différentes (à chercher
dans le binaire si besoin)
Fichiers modifiés
world/DoorControl.java:updateMeshes— ajout pre-pass
maxPanelHeight, modifriseAmount(commun) +effectiveRise
(clamp), UV basé sureffectiveRise.