Worker hatte die Arbeit fertig, aber NICHT committet/gepusht (3. Fall heute) — aus dem Karten-Arbeitsordner gerettet und hier gepusht. - GlbMeshStore.quellen(): Reihenfolge EINE Stelle — Setting -> Sibling-Repos -> mitgelieferter Ordner models/ direkt neben der App (dedupliziert, typisiert) - Klartext-Meldung FEHLT_TEXT statt stillem Platzhalter; Notfall-Modus: Terrain und Bauteile laufen ohne GLBs - neu: tools/sync_models.sh (fuellt models/, --check), utils/modelle_status.gd (Autoload ModelleStatus), tools/probe_gen_map.gd - neu: README_INSTALL.md (85 Zeilen, Schritt fuer Schritt + §5 Lizenzhinweis: ITHappy-Rohdaten NICHT weitergeben, App fuer Slys eigene Rechner) - export_presets.cfg (eigenstaendiger Linux-/Windows-Export), .gitignore: models/ + export/ bleiben draussen (Lizenz + Groesse) - Tests: test_model_sources (26/27; die rote ist umgebungsabhaengig: 'lager_ist_leer' erwartet fehlende Sibling-Repos) Belegt: Import 0 Fehler, gui_smoke 92, ui_layout 71, playtest_spawn 56.
102 lines
3.9 KiB
GDScript
102 lines
3.9 KiB
GDScript
extends Node
|
|
## Autoload: Modell-Status + Probe (Karte t_12cf94fe).
|
|
##
|
|
## Zwei Aufgaben:
|
|
## 1. Banner/Klartext: Wenn beim App-Start KEINE Modell-Quelle irgendeine
|
|
## GLB enthält, sagt die App deutlich, wie sie die Modelle bekommt
|
|
## (GlbMeshStore.fehl_text()). Kein stiller Kisten-Platzhalter.
|
|
## 2. Probe-Modus für den Eigenständigkeits-Beweis: startet die exportierte
|
|
## App mit --probe-map=/pfad/test.svmap (NUR user-args, also nach --),
|
|
## öffnet die Map über die Editor-Methode, sammelt die OID-Belege
|
|
## (Quellpfad je Objekt, fehlende_glbs) und beendet sich mit Exit 0/1.
|
|
##
|
|
## Aufruf (exportierte App, headless):
|
|
## ./MapEditor.x86_64 --headless -- --probe-map=/pfad/test.svmap
|
|
##
|
|
## main.gd wird NICHT anfasst (Kollisionsschutz U1) — alle Aufrufe gehen
|
|
## über call() auf die laufende Szene.
|
|
|
|
const PROBE_ARG := "--probe-map="
|
|
const PROBE_WARTEFRAMES_START := 2
|
|
const PROBE_WARTEFRAMES_MAP := 20
|
|
|
|
|
|
func _ready() -> void:
|
|
var args := OS.get_cmdline_user_args()
|
|
for a in args:
|
|
if a.begins_with(PROBE_ARG):
|
|
_probe(str(a.substr(PROBE_ARG.length())))
|
|
return
|
|
_bannern()
|
|
|
|
|
|
## 1. Klartext-Banner, wenn nirgends Modelle liegen (GUI + Log).
|
|
func _bannern() -> void:
|
|
await get_tree().process_frame
|
|
await get_tree().process_frame
|
|
if GlbMeshStore.lager_ist_leer():
|
|
var text := GlbMeshStore.fehl_text()
|
|
print("⚠ MODELL-FEHLT-BANNER:")
|
|
for zeile in text.split("\n"):
|
|
print(" " + zeile)
|
|
var szene := get_tree().current_scene
|
|
if szene != null and szene.has_method("_set_status"):
|
|
szene.call("_set_status", "⚠ Modelle fehlen — Terrain/Bauteile funktionieren. Details im Log.")
|
|
if DisplayServer.get_name() != "headless":
|
|
var dialog := AcceptDialog.new()
|
|
dialog.title = "Modelle fehlen"
|
|
dialog.dialog_text = text
|
|
dialog.ok_button_text = "Verstanden"
|
|
get_tree().root.add_child(dialog)
|
|
dialog.popup_centered()
|
|
|
|
|
|
## 2. Probe: Map öffnen, Belege sammeln, Exit 0/1.
|
|
func _probe(map_pfad: String) -> void:
|
|
for i in PROBE_WARTEFRAMES_START:
|
|
await get_tree().process_frame
|
|
var szene := get_tree().current_scene
|
|
if szene == null or not szene.has_method("_on_open_selected"):
|
|
print("PROBE FEHLGESCHLAGEN: keine Szene mit _on_open_selected")
|
|
get_tree().quit(1)
|
|
return
|
|
var result: Variant = szene.call("_on_open_selected", map_pfad)
|
|
for i in PROBE_WARTEFRAMES_MAP:
|
|
await get_tree().process_frame
|
|
|
|
# --- Belege sammeln -------------------------------------------------------
|
|
var fehlend: Array = []
|
|
var view_builder: Variant = szene.get("view_builder")
|
|
if view_builder != null:
|
|
fehlend = view_builder.get("fehlende_glbs")
|
|
var oids: Array = []
|
|
var doc: Variant = szene.get("doc")
|
|
if doc is Dictionary:
|
|
for obj in (doc as Dictionary).get("objects", []):
|
|
if obj is Dictionary:
|
|
var oid := str((obj as Dictionary).get("id", ""))
|
|
if oid != "" and not oids.has(oid):
|
|
oids.append(oid)
|
|
var modelle_da := DirAccess.dir_exists_absolute(GlbMeshStore.models_pfad())
|
|
var geladen: bool = doc is Dictionary and SvmapDocument.object_count(doc) > 0
|
|
|
|
print("PROBE map=%s" % map_pfad)
|
|
print("PROBE map_geladen=%s objekte=%d" % [str(geladen), oids.size()])
|
|
print("PROBE modelle_ordinar=%s pfad=%s" % [str(modelle_da), GlbMeshStore.models_pfad()])
|
|
print("PROBE quellen=%s" % ", ".join(PackedStringArray(GlbMeshStore.quellen())))
|
|
var quellen_pro_oid := 0
|
|
for oid in oids:
|
|
var pfad := GlbMeshStore.probe_source_fuer(oid)
|
|
if pfad.contains("/models/"):
|
|
quellen_pro_oid += 1
|
|
var muster: Array = []
|
|
for oid in oids.slice(0, 5):
|
|
muster.append("%s -> %s" % [oid, GlbMeshStore.probe_source_fuer(oid)])
|
|
if not muster.is_empty():
|
|
print("PROBE oid-quellen (erste %d):" % muster.size())
|
|
for m in muster:
|
|
print(" " + m)
|
|
print("PROBE aus-models=%d/%d fehlende_glbs=%d" % [quellen_pro_oid, oids.size(), fehlend.size()])
|
|
var ok := geladen and fehlend.is_empty()
|
|
print("PROBE ERGEBNIS: %s" % ("OK" if ok else "FEHLGESCHLAGEN"))
|
|
get_tree().quit(0 if ok else 1)
|