8.7 KiB
Fiche STM1-SPEC-04 — Niveau N2 — Modèle prévu opus medium | utilisé claude-opus-5-5 — Agent session « Medium · STM1 » (pas de sous-agent) — Skills sk-protocol
STM1-SPEC-04 : bâtiments posés dans l'eau après le pilote (2026-10-20)
Ordre : Big Boss (local_104ff22d). Essai COMMUN-16, utilisateur cité : « la tamise est ok, mais des batiments sont sous l'eau ».
Capture …\images\8.webp (dossier temporaire de la session Big Boss) ; journal : « [LPCity] EAU CentralLondon : pose … ; Z eau=-298.0 (plan MapMarkers Z=-300.0 + 2 cm) ; Z carte=0.0 ».
Sans copie UE ni IMPL.
Résultat : cause établie, options proposées. Les « bâtiments dans l'eau » ne sont pas un décor indépendant de la carte. MapMarkers pose
une maison générique par bâtiment OSM de l'UStreetMap, au centre de son polygone. Ceux qui tombent dans la Tamise sont des bâtiments OSM
réels flottants ou sur pilotis : pontons, jetées, bateaux amarrés, restaurants flottants, péniches. Depuis qu'il y a de l'eau, ils se voient
comme des maisons posées sur le fleuve. Recommandation : O2, masquer à la pose les maisons génériques dont le centre tombe dans l'eau (échelle 0, indices conservés), en épargnant les grands bâtiments flottants (seuil d'aire réglable). Aucune modification du GI, de MapMarkers ni des données.
1. Ce qui vient de quoi (établi)
| Élément visible | Origine | Preuve |
|---|---|---|
| Maisons à toit rouge, immeubles turquoise (dans la ville et dans le fleuve) | MapMarkers : une instance par bâtiment de GI.StreetMapStatic.StreetMap ; position = GI.FindCenterOfPolygon(BuildingPoints) ; taille selon GI.calculateArea(BuildingPoints), hauteur bornée à 3-5 ; composant HISM_Home ou HISM_Work selon le type |
etat/ST/STA/dumps/MapMarkers__EventGraph.txt:156-163 (FindCenterOfPolygon), :643-650 (AddInstance sur HISM_Which), :670-690 (calculateArea, FClamp 3-5) |
| Composants des maisons | créés à l'exécution par AddComponent (NODE_AddHISM-0, NODE_AddHISM-1), rangés dans les tableaux HISM_Home et HISM_Work |
MapMarkers__EventGraph.txt:651-668 |
| Arbres et jeeps | composants SCS Tree et Car (HISM, sans collision), instances le long des routes (StreetMap.Roads) avec des décalages aléatoires |
:700-735 (Roads, Tree.AddInstance), :972-1012 (RandomInteger, Car.AddInstance) ; STM1_LPDumpComponents_20261020-104435.txt |
| Ponts gris au-dessus de l'eau | carte StreetMap (routes, StreetMapMasked), Z ≥ 0, au-dessus de l'eau à −298 |
journal COMMUN-16 ; CART-04 § 1 |
| Eau bleue | ULPCityWaterSubsystem, maillage Water/CentralLondon à Z = −298 |
journal [LPCity] EAU |
- Indices non suivis :
AddInstancea sa valeur de retour non branchée (ReturnValue = '0',:649,:735).MapMarkersne garde aucun indice d'instance. Masquer une instance ne casse donc aucun lien du Blueprint (estimé fort). - Données de jeu inchangées : les bâtiments OSM restent dans l'
UStreetMap, cliquables par la carte (StreetMap_Static), pas par les HISM (collision retirée en O9b,d13a17d). - Le grand bâtiment au milieu du fleuve (capture) : un bâtiment OSM de grande surface, rendu comme une maison générique de grande taille (estimé : un bateau-musée, un ponton ou une barge amarrée). Son nom est à lire au DryRun (option O3).
- Arbres et jeeps dans l'eau : possibles là où des routes passent sur les ponts, puisqu'ils suivent les routes. Ils ne se voient pas sur la capture : à vérifier.
2. Options
| Option | Principe | Pour | Contre | Coût | Risque |
|---|---|---|---|---|---|
| O1 | masquer toutes les instances (HISM_Home, HISM_Work, Tree, Car) dont le centre tombe dans un polygone d'eau, par échelle 0 (UpdateInstanceTransform, indices conservés) |
le fleuve est net | fait aussi disparaître les vrais bâtiments flottants (bateau-musée, pontons) | ≈ 0,5-1 j | faible |
| O2 (recommandée) | comme O1, mais épargner les bâtiments dont l'emprise dépasse un seuil d'aire (réglable, par défaut 1 500 m²), qui restent visibles ; arbres et jeeps dans l'eau toujours masqués | le fleuve est net, et les grands objets flottants réels restent | seuil à régler à l'essai ; un grand objet reste rendu comme une « maison » | ≈ 1 j | faible |
| O3 | rapport seul : liste des bâtiments OSM dont le centre est dans l'eau (nom, aire, type), produite par le commandlet LPBuildCityWater en DryRun |
décision éclairée, nom par nom | n'enlève rien à l'écran | ≈ 0,25 j | nul |
| O4 | percer l'eau autour des emprises des bâtiments (trous dans le maillage) | les bâtiments semblent sur des îlots | aspect « îles de pavé » sur le fleuve, pire visuellement | ≈ 1 j | moyen |
| O5 | modifier MapMarkers pour ne pas créer ces instances |
à la source | touche un Blueprint partagé ; consigne : ni GI ni MapMarkers |
— | écarté |
3. Esquisse d'O2 (à préciser en SPEC exécutable après accord)
- Polygones d'eau disponibles en jeu. Le maillage d'eau cuit ne garde pas ses sommets accessibles au CPU. Le commandlet crée donc, en plus du maillage :
- soit
bAllowCPUAccess = truesurWater/<Ville>, pour relire les triangles au CPU ; - soit, de préférence, un petit asset de données
/Game/Heavy/StreetMap/Water/<Ville>_Mask: grille 2D de booléens (pas de 5 m, ≈ 225 × 162 cases pour Londres, ≈ 36 ko) marquant les cases d'eau. La grille est la plus simple et la plus rapide à tester : une lecture par instance. Elle demande une option-Overwritecontrôlée au commandlet, ou un passage limité au masque, pour ne pas toucher au maillage déjà validé.
- soit
- Masquage à la pose (
ULPCityWaterSubsystem, après la pose de l'eau, puis à chaque hausse du nombre d'instances,MapMarkerspouvant compléter ses HISM après coup) :- pour chaque acteur
MapMarkers, ses composantsHierarchicalInstancedStaticMeshComponent; - pour chaque instance : position (XY dans le repère de la carte) → case de la grille ;
- si la case est de l'eau et que ce n'est pas un grand bâtiment épargné :
UpdateInstanceTransform(Index, Transform avec échelle 0, bWorldSpace=false, bMarkRenderStateDirty); - un seul
MarkRenderStateDirtypar composant à la fin. Côté bâtiments, l'aire de l'instance est estimée par son échelle X·Y (la taille vient decalculateArea), ou mieux par l'aire du polygone de l'UStreetMaple plus proche.
- pour chaque acteur
- Journal
[LPCity] EAU <Ville> : n instances masquées (maisons a, arbres b, jeeps c) ; k grands bâtiments épargnés. - Mode classique : hors périmètre (correction après COMMUN-16.24, P4 PASS, capture
…\images\10.webprelayée par Big Boss).- En mode classique, il n'y a pas de maisons génériques de
MapMarkersdans le fleuve : on voit la carte StreetMap (bâtiments OSM extrudés). - Les objets allongés posés sur l'eau ont une forme de coque : ce sont des bateaux ou des pontons OSM, ce qui confirme le § 1 (estimé fort, lecture visuelle).
- Le masquage ne vise donc que le mode par défaut, donc les instances de
MapMarkers. - En mode classique, les coques OSM sur l'eau sont un rendu juste (les garder).
- L'hypothèse initiale (« pas les maisons de MapMarkers, même masquage en classique ») est retirée.
- En mode classique, il n'y a pas de maisons génériques de
- Sans GI, sans
MapMarkers, sans données modifiées ; Shipping compris.
4. Coût, risques
- Coût d'O2 (estimé) : commandlet avec masque ≈ 0,25 j ; sous-système ≈ 0,5 j ; BUILD et VAL ≈ 0,25 j ; essai.
- Risques :
MapMarkerspeut recréer ou compléter des instances plus tard (changement de ville, rafraîchissement) : il faut un nouveau passage à chaque changement du nombre d'instances ;- une grille de 5 m peut masquer une maison de quai dont le centre tombe à moins de 5 m de l'eau : réglable (pas de 2,5 m, ou test au triangle exact) ;
- les grands bâtiments épargnés restent des « maisons » génériques sur l'eau : c'est un choix de rendu ;
- performance : environ 50 000 instances testées une fois par changement de ville, quelques millisecondes (estimé).
- Les données de jeu, les sauvegardes et les clics ne changent pas.
5. Décisions attendues (utilisateur, via Big Boss)
- Option : O2 (recommandée), O1, O3 seule ou O4.
- Si O2 : seuil d'aire des grands bâtiments épargnés (proposé 1 500 m²). La question du mode classique ne se pose plus : il est hors périmètre (§ 3.4).
- Faire d'abord O3 (liste nominative des bâtiments dans l'eau) pour choisir le seuil : proposé, coût faible.
Tours : ≈ 4 / 40 (déclaré ; FicheStats.py fait foi).
Suite : Big Boss doit présenter le § 5 à l'utilisateur ; ensuite, SPEC exécutable et IMPL, sous GO et jeton UE. État : étude close, rien modifié.