scopedvr-map-editor/tests/probe_fein_export.gd
slyphax 69668eb250 Feines Material-Raster: Malen auf ~1 m statt Höhenraster (bei 1024 m vorher 8 m)
Sly: „feiner malen“. Die Material-Schicht bekommt ein eigenes Raster
(terrain.material_resolution, optional; Default = resolution → alte Karten
unverändert gültig): ~1 m pro Punkt, auf dem Höhenraster ausgerichtet,
max. 1025 (1024 m → 1025, 256 m → 257, 2048 m → 1025 = 2 m).

- SvmapIO: material_resolution / material_resolution_for / resample /
  upgrade_material_layer / material_at_height_point; V15 prüft Raster + Länge.
- Neue Karten starten fein; beim Öffnen werden alte Karten optisch identisch
  angehoben (Datei ändert sich erst beim Speichern); Resize rechnet die
  Schicht auf ihrem eigenen Raster an der Weltposition um.
- Pinsel, Spiegeln (Symmetrie live + „Symmetrie anwenden“) und Live-Splat
  arbeiten auf dem Material-Raster; Vertex-Farben lesen den passenden Punkt.
- Malen-Hinweis zeigt die echte feinste Einheit.
- Tests: test_mal_fein 22/22 (Raster, Anheben, 2-m-Pinsel ≈ 13 Punkte,
  V15, Roundtrip, Resize); test_terrain/test_terrain_mirror/
  test_symmetry_onclick auf das neue Raster nachgezogen; Identitäts-Runner OK.
  Kette Editor → Server (Prüfsumme) → Client per run_map_download_e2e 15/15.

Format-Spiegel: Match-Server svmap_loader (V15) + Client svmap_terrain.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 00:07:25 +02:00

22 lines
982 B
GDScript

extends SceneTree
## Probe (Karte 24.10.): alte Karte öffnen → feines Raster → 1-m-Sandpfad malen
## → speichern. Ausgabe-Pfad = erstes User-Arg. Für die Client-E2E-Kette.
func _initialize() -> void:
var out := OS.get_cmdline_user_args()[0]
var ld := SvmapIO.load_from_file(ProjectSettings.globalize_path("res://FirstFight.svmap"))
if not bool(ld["ok"]):
print("PROBE_FAIL load ", ld["errors"])
quit(1)
return
var doc: Dictionary = ld["data"]
var t: Dictionary = doc["terrain"]
SvmapIO.upgrade_material_layer(t)
var mres := SvmapIO.material_resolution(t)
var mats := SvmapIO.decode_materials(t)
for i in 40:
TerrainField.apply_material_brush(mats, mres, float(t["size_x_m"]), float(t["size_z_m"]),
-20.0 + float(i), 5.0, 0.6, 2)
t["materials_r8_b64"] = SvmapIO.encode_materials(mats)
var sv := SvmapIO.save_to_file(out, doc)
print("PROBE ", "OK" if bool(sv["ok"]) else "FAIL %s" % str(sv["errors"]), " mres=", mres)
quit(0 if bool(sv["ok"]) else 1)