# SOEST 3D – Hinweise · Stable Multiplayer 0.3.5

## Architektur

**Sichtbare Welt:** ausschließlich das 3D-Mesh. Bevorzugt wird ein lokales Game-Mesh unter `world/soest/mesh/tileset.json`; solange dieses fehlt, wird der externe Soest-Photomesh-Fallback über den eigenen Same-Origin-Mesh-Gateway geladen. Der sichtbare Cesium-Globus und sämtliche Raster-/Luftbild-Baselayer sind abgeschaltet.

**Spielwelt:** vereinfachte Straßen- und Gebäudekollision aus OpenStreetMap. Die Daten werden serverseitig in räumlichen Chunks persistent gecacht und während der Fahrt ergänzt. Die Local Map ist ab 0.7.1.6.9 wieder als leichte Canvas-Straßenführung aktiv. Sie nutzt ausschließlich die zentrale GEO-ALIGNMENT-Road-Registry und keine öffentlichen OSM-Rastertiles.

## Mesh-Reparaturmodus

Photogrammetrie kann grobe Parent-LODs, lokale Spikes, deformierte Fahrzeuge, Bäume und Gebäudeteile enthalten. `MESH · REPARATUR` setzt konservativere Detailregeln, bevorzugt Leaf-Tiles, fordert gewünschte LODs direkter an und erhöht den Tile-Cache. Das kann LOD-Übergangsartefakte deutlich reduzieren, kann aber echte Fehler der Ausgangsgeometrie nicht vollständig rekonstruieren.

## Mesh-Diagnose

`MESH-DIAGNOSE` schaltet nacheinander Tile-Bounding-Volumes, Content-Bounding-Volumes und eine Tile-Farbansicht ein. Das ist bewusst ein Diagnosewerkzeug: Bei großen Dreiecksflächen/Keilen kann damit sichtbar werden, welches Tile bzw. welcher LOD-Bereich betroffen ist.

## Freie Kamera

First und Third Person verwenden jetzt denselben freien Blick-Pitch. Mausbewegung, Touch-Look und rechter Gamepad-Stick können bis weit nach oben und unten schauen. Die Pitch-Werte sind begrenzt, damit die Kamera nicht überschlägt.

## Lokales Game-Mesh

Sobald ein rechtlich freigegebenes, aufbereitetes Soest-Tileset unter `world/soest/mesh/tileset.json` liegt, wird es automatisch vor der externen Quelle geladen. Der Ordner ist damit bereits für den geplanten SO City Mesh Builder vorbereitet.

Mit `tools/mesh-builder/prepare_game_mesh.py` kann ein lokal vorhandenes,
lizenziertes Original-Tileset in eine bearbeitbare Spielkopie umgewandelt
werden. Die erzeugte `mesh-edits.json` ist als Arbeitsdatei gedacht: dort
können problematische Tile-URIs ausgeblendet oder auf bereinigte Ersatzdateien
umgeleitet werden. Das Tool lädt keine fremden Mesh-Daten herunter.

## Performance Mesh

Die AUTO-Qualität ist auf stabile Photomesh-Darstellung ausgelegt. Nach Tests
mit dem externen Soest-Stream bleibt Tile-Skipping deaktiviert, weil grobe
Parent-LODs sonst als große graue Keile oder Flächen in der Spielstraße sichtbar
werden können. Die Framerate-Optimierung erfolgt stattdessen über adaptive
Renderauflösung, gedrosselte HUD-Arbeit und maßvolle Screen-Space-
Error-Werte.

Die DETAIL-Stufe bleibt für Nahansicht und Diagnose verfügbar, kostet aber mehr
GPU- und Streaming-Leistung. Die PERFORMANCE-Stufe reduziert Details vorsichtig,
überspringt aber ebenfalls keine LOD-Ebenen.

Im laufenden Spiel verwendet die Bodenmessung bevorzugt bereits geladene
Mesh-Geometrie. Die teurere Detailmessung bleibt für Spawn und Reset aktiv,
damit Startpositionen weiterhin robust gegen Dächer, Fahrzeuge und Spikes
geprüft werden.

## Multiplayer / Chat

`api/multiplayer.php` bietet einen einfachen PHP-basierten Treffpunkt ohne
Accounts und ohne WebSocket-Server. Spieler senden in kurzen Abständen Position,
Name und optional eine Chatnachricht. Der Server hält diese Daten nur kurzlebig
in `data/cache/multiplayer-state.json`; inaktive Spieler werden automatisch
entfernt. Für sehr weiche Echtzeitbewegung wäre später ein WebSocket-Server der
nächste Ausbauschritt.


## Spawn Guard / City Preload

Beim ersten Seitenstart bleibt das Ladebild sichtbar, während Mesh und lokale Spielwelt parallel anlaufen. Nach Auswahl von **Zu Fuß** oder **Freie Fahrt** wird die konkrete Startregion noch einmal gezielt vorgewärmt. Erst danach erfolgt eine Mehrpunkt-Bodenmessung. Dächer, Fahrzeuge und einzelne Photogrammetrie-Spikes werden dabei über Höhenband und robuste Quantile gefiltert.

Der Spieler wird nicht direkt in die Szene gesetzt: Er startet mit kleinem Sicherheitsabstand über dem vorbereiteten Boden und fällt mit einfacher Gravitation darauf. Während dieser kurzen Landung ist Bewegung gesperrt. Der Reset verwendet dieselbe Pipeline.

## Grenzen

- Ein Client-seitiger Reparaturmodus kann keine stark deformierte Original-Photogrammetrie vollständig „neu modellieren“.
- Statische Fahrzeuge und unförmige Gebäudeteile müssen für eine perfekte Spielwelt später im eigenen Game-Mesh entfernt/ersetzt werden.
- OSM-Gebäude sind vereinfachte 2D-Fußabdrücke, keine vollständige 3D-Physik.
- Der Prototyp ist kein offizielles Angebot der Stadt Soest.

## Quellen / Attribution

- derzeitiger externer Fallback: Soest-Photomesh / Virtual City Systems
- Straßen-/Gebäudedaten: © OpenStreetMap-Mitwirkende

Für ein dauerhaft selbst gehostetes Game-Mesh sollte ausschließlich ein Datensatz verwendet werden, dessen Lizenz Kopie, Bearbeitung und Weiterverteilung ausdrücklich erlaubt.

## Mesh-only Szene

Cesium bleibt als georeferenzierte 3D-Engine erhalten, aber `scene.globe.show` ist deaktiviert und die Imagery-Layer sind leer. Dadurch kann unter dem Stadtmesh keine flache Globus-/Luftbildfläche mehr durchscheinen. Die Local Map ist wieder als eigenständiges HUD-Canvas aktiv; sie zeichnet dieselben OSM/GEO-verifizierten Vektorstraßen wie Spielphysik und Renderer, ohne Cesium-Basiskarte oder Rastertiles.


## Resilient Mesh-Gateway 0.3.5.11
Der Browser spricht `soest.virtualcitymap.de` nicht direkt an. 3D-Tile-Pfade laufen über `api/mesh-gateway.php`, werden serverseitig validiert und mit gleicher Herkunft an Cesium ausgeliefert. Erfolgreich geladene Tiles werden temporär unter `data/cache/mesh-proxy-identity-v3/` gespeichert. Bei kurzzeitigen Upstream-Ausfällen kann eine bereits vorhandene Kachel bis zu sieben Tage als Stale-Fallback weitergegeben werden. Neue Tiles werden mehrfach versucht; nach cURL kann – sofern das Hosting es erlaubt – zusätzlich der PHP-Stream-Transport einspringen. Das lokale, rechtlich freigegebene Game-Mesh bleibt die bevorzugte langfristige Lösung.

Seit 0.3.5.11 schreibt der API-Gateway verschachtelte Tile-Links als `api/mesh-gateway.php/.../tileset.json?path=...`. Die sichtbare `.json`-/`.b3dm`-Endung verhindert, dass Cesium Unter-Tilesets als ungültigen Binärinhalt behandelt. Die Cache-Generation `mesh-proxy-identity-v3` trennt diese reparierten Antworten von älteren Gateway-Caches.

Seit 0.3.5.12 enthält der Gateway zusätzlich feste IPv4-Notfalladressen für den Upstream-Loadbalancer. Wenn der Hoster `soest.virtualcitymap.de` nicht verbinden kann und DNS-over-HTTPS keine IP liefert, werden diese Adressen mit korrektem TLS/SNI als letzter Rettungsweg verwendet.

Seit 0.3.5.13 wird der externe Photomesh-Stream bevorzugt direkt vom Browser geladen, weil der Origin CORS erlaubt. Dadurch muss der PHP-Host die vielen `.b3dm`-Dateien nicht mehr stellvertretend herunterladen. Der Gateway bleibt als Fallback bestehen. Zusätzlich begrenzt Cesium die parallelen Mesh-Anfragen und der Reparaturmodus lädt keine Geschwister-Tiles mehr auf Vorrat.

Seit 0.3.5.16 besitzt die Spielwelt einen aktiven Sichtkreis. Die Kamera-Far-Plane begrenzt, wie weit das Photomesh gerendert und gestreamt wird. OSM-/Kollisionsdaten werden in kleineren Chunks geladen und außerhalb des aktiven Radius wieder aus Speicher und Indizes entfernt.

## Avatar-Sprung
Zu Fuß startet `Leertaste` einen einfachen physikalischen Sprung. Die horizontale WASD-Steuerung bleibt während des Sprungs aktiv; ein zweiter Sprung ist erst nach der Landung möglich. Im Fahrzeug behält `Leertaste` die Handbremsfunktion. Auf Touch-Geräten gibt es zusätzlich eine `SPRUNG`-Taste.


0.3.5.10 – DNS RESCUE
Der Mesh-Gateway umgeht bei Resolver-Time-outs den DNS-Resolver des Hosters. Er fragt Cloudflare DNS-over-HTTPS über feste Resolver-IPs ab, cached die A-Adressen und setzt für den eigentlichen HTTPS-Abruf CURLOPT_RESOLVE. TLS/SNI bleiben auf soest.virtualcitymap.de.

## 0.3.5.10 – Identity Transport
Die Live-Antwort des Mesh-Gateways zeigte gzip-Magic-Bytes (`1F 8B`) an Stelle von direkt parsebarem JSON. Deshalb wird JSON nun transportseitig von automatischer Server-Kompression ausgeschlossen und zusätzlich im Browser vor Cesium auf rohe gzip-Daten geprüft. Dieser Schutz betrifft nur JSON-Anfragen an `mesh-gateway.php`; b3dm/glb bleiben binär.

## Community Mesh 0.3.7.0

`/scan/` stellt die erste SOEST-SCAN-Beta bereit. Beiträge landen ausschließlich in einer nicht öffentlich ausgelieferten Quarantäne. Kamera-Tests werden nicht aufgezeichnet; Mikrofon ist per Permissions-Policy gesperrt. 3D-Dateien werden in 1-MiB-Blöcken übertragen, damit mobile Verbindungen und Shared-Hosting-Limits weniger empfindlich sind.

Der sichtbare StreetGuard ist ab diesem Stand höhenadaptiv. Die vier Eckpunkte werden nur an bereits geladenem Mesh gemessen. Kann keine belastbare Straßenhöhe ermittelt werden, wird die Guard-Fläche verborgen. Dadurch soll insbesondere eine sichtbare starre Straßenplatte über/unter geneigtem Photomesh vermieden werden.

Siehe `COMMUNITY-SCAN.md` für Pipeline und Review-Prinzipien.


## Mesh Repository / SOEST Surface Map 0.3.7.0

- Beim Laufen/Fahren wird nach erfolgreichen Bodenmessungen eine eigene leichte Surface Map aufgebaut.
- Der Client sendet nur Höhe, lokale Position und Straßenbezug; keine Bilder, Namen oder Spieler-ID.
- Der Server aggregiert sofort auf ein 2-m-Raster und speichert keine geordneten Rohtracks.
- Eigene freigegebene 3D-Tiles gehören nach `world/soest/game-mesh/live/` und werden vor dem externen Übergangsmesh bevorzugt.
- Tile-Versionen/Releases werden in MySQL verwaltet; die großen Dateien bleiben statisch im Dateisystem.
- Admin-Rollbacks ändern nur die aktive Version. Frühere Versionen werden nicht gelöscht.
