extends SceneTree ## Beweis-Probe (Karte t_34908425, WEGWERF — nicht Teil der Suite): ## M3 Objekte spiegeln — Beweis-Bild mit markierten Partnern. Ein Paar wird ## über den ECHTEN Editor-Pfad erzeugt (ObjectOps.symmetry_place_twin wie in ## _place_object), die Quelle über die echte Auswahl angewählt → der Zwilling ## muss die SCHWÄCHERE Partner-Markierung tragen (gleiche Material-Technik). ## Aufruf: xvfb-run -a godot4 --path . --rendering-driver opengl3 \ ## -s res://tests/probe_m3_partner_render.gd func _initialize() -> void: _run.call_deferred() func _run() -> void: var scene: PackedScene = load("res://scenes/main.tscn") var main = scene.instantiate() root.add_child(main) await process_frame await process_frame DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) DisplayServer.window_set_size(Vector2i(2328, 1310)) # Symmetrie-Modus PUNKT (Standard) + Paar über den echten Objekt-Pfad. main.set("sym_mode", SymmetryCore.Mode.POINT) (main.doc["objects"] as Array).append({ "id": "box_001", "pos": [14.0, 0.0, 6.0], "scale": 1.0, "rot_y_deg": 30.0, }) var res: Dictionary = ObjectOps.symmetry_place_twin(main.doc, 0, SymmetryCore.Mode.POINT) print("PRUEF twin_index=%d (soll 1)" % int(res.get("twin", -1))) main.call("_after_structure_change") await process_frame await process_frame var cam = main.get("camera") if cam != null: cam.set("distance", 34.0) cam.call("focus_on", Vector3(0.0, 0.0, 0.0)) await process_frame await process_frame # Echte Auswahl: Quelle anwählen → Zwilling schwächer markiert. main.interaction.call("select_object", 0) await process_frame await process_frame var builder = main.get("view_builder") var m0 = (builder.object_markers[0] as Node3D).get_child(0) as MeshInstance3D var m1 = (builder.object_markers[1] as Node3D).get_child(0) as MeshInstance3D var select_mat: StandardMaterial3D = builder.get("_select_mat") var partner_mat: StandardMaterial3D = builder.get("_partner_mat") var ok := true if m0.material_override != select_mat: ok = false print("PRUEF FAIL: Quelle trägt nicht das Auswahl-Material") else: print("PRUEF ok: Quelle = volle Auswahl-Markierung") if m1.material_override != partner_mat: ok = false print("PRUEF FAIL: Zwilling trägt nicht das Partner-Material") else: print("PRUEF ok: Zwilling = schwächere Partner-Markierung") # Klartext-Beleg: die zwei Materialien sind verschieden UND der Zwilling # dunkler (schwächer) als die Auswahl. print("PRUEF farben: select=%s partner=%s" % [ str(select_mat.albedo_color), str(partner_mat.albedo_color)]) if not partner_mat.albedo_color.is_equal_approx(select_mat.albedo_color.darkened(0.45)): ok = false print("PRUEF FAIL: Partner-Farbe ist nicht die abgeschwächte Auswahl-Farbe") var pfad := OS.get_environment("PROBE_PNG") if pfad.is_empty(): pfad = "user://probe_m3_partner.png" var img := root.get_viewport().get_texture().get_image() img.save_png(pfad) print("Bild: %s (%dx%d)" % [pfad, img.get_width(), img.get_height()]) print("PROBE_M3_PARTNER_%s" % ("OK" if ok else "FAIL")) quit(0 if ok else 1)