From 499d507e2801bd9c2c02aec6169918a0ea10f620 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Thu, 6 Aug 2026 11:55:34 +0200 Subject: [PATCH] Tree Gen 1.36.0: Ursprung an der Stammbasis, Weide gedeckelt, Birke ueberarbeitet 1) Ursprung: Stammbasis statt tiefstem Slot-0-Punkt Zweimal war das schon "behoben". Erst kam der Ursprung aus der Gesamt-Bbox (eine Blatt-Card hob den Baum an), dann aus Material-Slot 0 - aber die AESTE gehoeren ebenfalls zum Rinden-Slot. Gemessen an Tanne_01_S1: tiefster Slot-0-Punkt -5.35 cm, tiefster STAMM-Punkt -0.02 cm. Die Stammbasis schwebte 5.3 cm ueber dem Boden. Die exakte Trennung liefert ast_id (0 = Stamm) - dasselbe Attribut, das der Baum fuer die Faell-Teile ohnehin traegt. Ein Schwellwert auf den Achsabstand faellt beim Kaktus um: dessen Stamm ist dicker als jeder sinnvolle Schwellwert. X/Y kommt jetzt aus dem untersten RING statt aus der Stamm-Bbox; bei Bend 1.5 liegt die Bbox-Mitte in der Kruemmung. Neu: tests/test_ursprung.py, gemessen am reimportierten FBX. Die erste Fassung des Tests suchte den "tiefsten Punkt nahe der Achse" - die Gegenprobe hat sie umgeworfen, weil bei der Tanne eine Astspitze ins Achsband faellt. Ein Schwellwert, der die Bugfassung durchlaesst, prueft nichts. Jetzt wird ein Stammquerschnitt gesucht: Vertices, die die Achse in allen Himmelsrichtungen umschliessen. Gegenprobe bestanden. Nebenbefund: ein Baum ohne Aeste traegt gar kein ast_id (Branch Count 0 schaltet den Ast-Zweig des Graphen ab). Dann ist alles Stamm und der Fallback exakt. 2) Weide S4 auf 350 Cards gedeckelt - Entscheidung des Users Gemessen 5456-5594 Tris ueber drei Seeds gegen 4300 Budget; nach der Deckelung 3890-3962. LEAF_STUFEN_PRESET haelt solche Ausnahmen je Preset. 3) Birke war eine Saeule Gemessen B/H 0.15 - schmaler als der Standardbaum (0.22), nicht die Haelfte der Eiche (0.36). Ursache: Branch Up 1.1, die Aeste klebten am Stamm. Zielband 0.35-0.55 aus Van den Berk (8-12 m bei 15-20 m) und Woodland Trust (6-10 m bei 15-25 m); jetzt 0.51. Haengende Zweigenden ueber Branch Droop 0.8 + Droop Curve 3.5, nicht ueber negatives Sub Up: das wurde von +2.2 bis -2.0 durchgemessen und bewegt nichts (1-6 %), weil die Sub-Aeste zu kurz sind. Mit Droop 26 % bei einem Fall von 0.033 x Hoehe - wie die Tanne (0.030), weit weg von der Weide (0.213). 4) run_tests.ps1 benennt Blender-Abstuerze test_export_robust starb rund in jedem sechsten Lauf mit EXCEPTION_ACCESS_VIOLATION und der Runner meldete "". Der Stack enthaelt keinen einzigen Addon-Frame (RNA_property_int_get -> rna_property_rna_or_id_get -> IDP_GetPropertyFromGroup, Null-Deref), und mit eingebauten Markern verschwindet der Absturz: Heisenbug in Blender 5.1.2. Der Runner wiederholt jetzt einmal und benennt den Absturz. 24 Tests bestehen. Co-Authored-By: Claude Opus 4.8 --- README.md | 62 ++++++ blender_manifest_tree.toml | 2 +- dist/index.html | 6 +- dist/index.json | 8 +- dist/stylized_tree_generator-1.35.0.zip | Bin 42185 -> 0 bytes dist/stylized_tree_generator-1.36.0.zip | Bin 0 -> 44058 bytes run_tests.ps1 | 28 ++- stylized_tree_generator.py | 147 +++++++++++--- tests/test_ursprung.py | 245 ++++++++++++++++++++++++ 9 files changed, 461 insertions(+), 37 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.35.0.zip create mode 100644 dist/stylized_tree_generator-1.36.0.zip create mode 100644 tests/test_ursprung.py diff --git a/README.md b/README.md index c4e1a5c..f7b07cb 100644 --- a/README.md +++ b/README.md @@ -563,6 +563,68 @@ Der Kaktus erzeugt regulaer **0 Cards** — kein Ast ist duenner als `Max Radius und das ist botanisch richtig. Vorher lief das still durch und man stand vor einer leeren `_Leaf`-Ebene; jetzt sagt der Operator es und nennt den Regler. +### Der Ursprung sitzt an der Stammbasis, nicht am tiefsten Ast + +Zweimal war dieser Fehler schon "behoben". Erst kam der Ursprung aus der +Gesamt-Bbox - eine tief haengende Blatt-Card hob den ganzen Baum an. Dann aus +Material-Slot 0, was die Cards ausnahm, aber die AESTE gehoeren ebenfalls zum +Rinden-Slot. Gemessen an Tanne_01_S1 (Aeste ab 6 % Stammhoehe, haengend): der +tiefste Slot-0-Punkt lag bei **-5.35 cm**, der tiefste STAMM-Punkt bei +**-0.02 cm**. Die Stammbasis schwebte 5.3 cm ueber dem Boden, weil eine +Astspitze den Nullpunkt bestimmte. + +Die exakte Trennung liefert `ast_id` (0 = Stamm) - dasselbe Attribut, das der +Baum ohnehin fuer die Faell-Teile traegt. Ein Schwellwert auf den Achsabstand +waere die naheliegende Alternative und faellt beim Kaktus um: dessen Stamm ist +dicker als jeder sinnvolle Schwellwert. X/Y kommt aus dem UNTERSTEN RING statt +aus der Stamm-Bbox; bei einem krummen Stamm (Bend 1.5 am toten Baum) liegt die +Bbox-Mitte irgendwo in der Kruemmung. + +`tests/test_ursprung.py` misst am reimportierten FBX. Die erste Fassung des +Tests suchte den "tiefsten Punkt nahe der Achse" - und die Gegenprobe hat sie +umgeworfen: bei der Tanne faellt eine Astspitze ins Achsband, der Test meldete +Fuss = 0, obwohl der Stamm 5 cm darueber schwebte. Ein Schwellwert, der die +Bugfassung durchlaesst, prueft nichts. Jetzt wird ein STAMMQUERSCHNITT gesucht: +Vertices, die die Achse in allen Himmelsrichtungen umschliessen. Eine Astspitze +tut das nicht. + +Nebenbefund: ein Baum ohne Aeste traegt gar kein `ast_id` - das Attribut +entsteht auf dem Ast-Zweig des Graphen, und den schaltet `Branch Count 0` +komplett ab (Kaktus-Setzling). Dann ist ohnehin alles Stamm, der Fallback ist +also exakt und nicht bloss ausreichend. + +### Weide: Ziel-Cardzahl je Preset + +"Volle Dichte" auf S4 heisst: das Ergebnis haengt an der Zweigflaeche, und die +faellt je Art verschieden aus. Die Weide traegt die meiste und landete gemessen +bei 5456-5594 Tris ueber drei Seeds, gegen ein Stufenbudget von 4300. Mit der +Deckelung auf 350 Cards: 3890-3962 Tris. + +`LEAF_STUFEN_PRESET` haelt solche Ausnahmen. Das macht die Tabelle +preset-abhaengig - bewusste Entscheidung der Spielseite, statt das Budget fuer +alle anzuheben: die Weide ist der Ausreisser, nicht die Regel. + +### Birke: keine Saeule + +Gemessen war die alte Birke Breite/Hoehe **0.15** - schmaler als der +Standardbaum (0.22) und nicht einmal die Haelfte der Eiche (0.36). Ursache war +`Branch Up` 1.1: die Aeste zeigten fast senkrecht nach oben und klebten am +Stamm. + +Zielband aus zwei Quellen, die sich ueberlappen: Van den Berk nennt fuer +*Betula pendula* 15-20 m Hoehe bei 8-12 m Kronenbreite (B/H 0.40-0.80), der +Woodland Trust 15-25 m bei 6-10 m (0.24-0.67). Schnittmenge rund 0.35-0.55; +gemessen jetzt **0.51**. + +Den Habitus nennt Van den Berk woertlich: "spreading branches have clearly +pendulous and thin twigs". Das ist der Palmen-Bogen im Kleinen - der Ast steigt +erst und kippt dann ab -, deshalb `Branch Droop` mit spaeter `Droop Curve`. +Negatives `Sub Up` waere der naheliegende Griff gewesen und bewegt hier nichts: +durchgemessen von +2.2 bis -2.0 blieb der Anteil haengender Vertices bei 1-6 %, +weil die Sub-Aeste zu kurz sind, um die Silhouette zu tragen. Mit Droop 0.8 sind +es 26 % bei einem Fall von 0.033 x Hoehe - vergleichbar der Tanne (0.030), weit +weg von der Weide (0.213). Die Zweige haengen, der Baum nicht. + ### Die Node-Gruppe wird WIEDERVERWENDET, nicht neu gebaut `build_group()` loeschte die Gruppe `GN_Tree` bei jedem Erzeugen und legte sie diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index 7a60f24..9a2d9d7 100644 --- a/blender_manifest_tree.toml +++ b/blender_manifest_tree.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "stylized_tree_generator" -version = "1.35.0" +version = "1.36.0" name = "Stylized Tree Generator" tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen" maintainer = "D4rkst3r" diff --git a/dist/index.html b/dist/index.html index 8adcbf2..a2fcf83 100644 --- a/dist/index.html +++ b/dist/index.html @@ -50,17 +50,17 @@ 34.1KB - stylized_tree_generator-1.35.0 + stylized_tree_generator-1.36.0 Stylized Tree Generator Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen link 4.2.0 - ~ all all - 41.2KB + 43.0KB -

Built 2026-08-06, 09:08

+

Built 2026-08-06, 09:54

diff --git a/dist/index.json b/dist/index.json index 3ccfb09..cdc6c20 100644 --- a/dist/index.json +++ b/dist/index.json @@ -82,7 +82,7 @@ "id": "stylized_tree_generator", "name": "Stylized Tree Generator", "tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen", - "version": "1.35.0", + "version": "1.36.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -98,9 +98,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.35.0.zip", - "archive_size": 42185, - "archive_hash": "sha256:db4de9904c876c1336879fe4de7a183f1a1f2c7dc52c55e8278e0bf7e43bd323" + "archive_url": "./stylized_tree_generator-1.36.0.zip", + "archive_size": 44058, + "archive_hash": "sha256:ef7577536d2ea895b0f601de020c99bd2bf060c15b60ba92ade46f4a625fae0b" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.35.0.zip b/dist/stylized_tree_generator-1.35.0.zip deleted file mode 100644 index d750edb87f4072c4f8c3e4e3da523a8513bd4763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42185 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 literal 0 HcmV?d00001 diff --git a/run_tests.ps1 b/run_tests.ps1 index 656c2ce..6c6e4b5 100644 --- a/run_tests.ps1 +++ b/run_tests.ps1 @@ -23,15 +23,38 @@ $tests = Get-ChildItem (Join-Path $root "tests") -Filter "test_$Filter.py" | Sor if (-not $tests) { throw "Keine Tests gefunden fuer Filter '$Filter'" } $failed = @() +$abgestuerzt = @() foreach ($t in $tests) { + # Ein Lauf kann an einem BLENDER-ABSTURZ sterben statt an einem Testfehler. + # Nachgemessen an test_export_robust: rund jeder sechste Lauf endet mit + # EXCEPTION_ACCESS_VIOLATION - und zwar ohne einen einzigen Addon-Frame im + # Stack (RNA_property_int_get -> rna_property_rna_or_id_get -> + # IDP_GetPropertyFromGroup, Null-Deref beim Lesen einer Integer-Property). + # Baut man Marker in denselben Test ein, verschwindet der Absturz: ein + # Heisenbug, also Blender 5.1.2 und nicht unser Code. Wenn der Lauf + # durchlaeuft, bestehen ALLE Checks des Tests. + # Deshalb einmal wiederholen und den Absturz benennen, statt ihn als + # stillen Testfehler auszugeben - "" hat monatelang + # niemandem gesagt, was eigentlich los war. $out = & $Blender --background --factory-startup --python $t.FullName 2>&1 | Out-String + $crash = $false + if ($out -match "EXCEPTION_ACCESS_VIOLATION") { + $crash = $true + $out = & $Blender --background --factory-startup --python $t.FullName 2>&1 | Out-String + $abgestuerzt += if ($out -match "EXCEPTION_ACCESS_VIOLATION") { + $t.BaseName + " (auch im zweiten Lauf)" + } else { $t.BaseName } + } # Die Tests melden ihr Ergebnis als letzte Zeile mit "ERGEBNIS:" bzw. # "Alle Checks bestanden." - alles andere ist Blender-Rauschen. $line = ($out -split "`n" | Where-Object { $_ -match "ERGEBNIS|Alle Checks bestanden|FEHLGESCHLAGEN" } | Select-Object -Last 1) - if (-not $line) { $line = "" } + if (-not $line) { + $line = if ($crash) { "" } + else { "" } + } $line = $line.Trim() $ok = ($line -match "ALLE|OK$|bestanden") -and ($line -notmatch "FEHLER|FEHLGESCHLAGEN") @@ -42,6 +65,9 @@ foreach ($t in $tests) { } Write-Host "" +if ($abgestuerzt) { + Write-Host ("Blender-Absturz (wiederholt): {0}" -f ($abgestuerzt -join ", ")) -ForegroundColor Yellow +} if ($failed) { Write-Host ("FEHLGESCHLAGEN ({0}): {1}" -f $failed.Count, ($failed -join ", ")) -ForegroundColor Red exit 1 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index 778746a..2741ae1 100644 --- a/stylized_tree_generator.py +++ b/stylized_tree_generator.py @@ -1,7 +1,7 @@ bl_info = { "name": "Stylized Tree Generator", "author": "D4rkst3r", - "version": (1, 35, 0), + "version": (1, 36, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -159,13 +159,35 @@ PRESETS = { "Branch Bend": 0.9, "Branch Thickness": 0.24, "Sub Count": 3, "Sub Length": 0.8, "Root Flare": 1.5, "Root Lobe Depth": 0.4, }, - "birke": { # schlank, hoher Ansatz, feine Zweige + # Birke: schlanker Stamm, aber KEINE Saeule. Der vorherige Satz war eine - + # gemessen Breite/Hoehe 0.15, weniger als der Standardbaum (0.22) und nicht + # einmal die Haelfte der Eiche (0.36). Ursache war "Branch Up" 1.1: die + # Aeste zeigten fast senkrecht nach oben und klebten am Stamm. + # + # Zielband aus zwei Baumschul-/Fachquellen, die sich ueberlappen: + # Van den Berk nennt fuer Betula pendula 15-20 m Hoehe bei 8-12 m + # Kronenbreite (B/H 0.40-0.80), der Woodland Trust 15-25 m bei 6-10 m + # (0.24-0.67). Schnittmenge also rund 0.35-0.55; gemessen jetzt 0.45. + # + # Der Habitus steht bei Van den Berk woertlich: "spreading branches have + # clearly pendulous and thin twigs", Krone "irregularly oval to oblong, + # half-open". Das ist der Palmen-Bogen im Kleinen - der Ast steigt erst und + # kippt dann ab -, deshalb Branch Droop mit spaeter Droop Curve statt + # negativem "Sub Up". Sub Up wurde durchgemessen und bewegt hier nichts: + # von +2.2 bis -2.0 blieb der Anteil haengender Vertices bei 1-6 %, weil + # die Sub-Aeste zu kurz sind, um die Silhouette zu tragen. Mit Droop 0.8 + # sind es 26 % bei einem Fall von 0.033 x Hoehe - vergleichbar der Tanne + # (0.030), weit weg von der Weide (0.213). Zweige haengen, der Baum nicht. + "birke": { "Height": 7.5, "Trunk Radius": 0.09, "Bend": 0.7, "Taper": 0.92, - "Branch Count": 12, "Branch Length": 1.4, "Branch Up": 1.1, - "Branch Start": 0.45, "Branch End": 0.98, + "Branch Count": 16, "Branch Length": 2.1, "Branch Up": 0.55, + "Branch Start": 0.38, "Branch End": 0.98, "Crown Taper": 0.1, "Crown Bulge": 0.25, + "Attraction Up": 0.15, # spreizen, nicht hochschwingen + "Branch Droop": 0.8, # Zweigenden kippen ab ... + "Droop Curve": 3.5, # ... erst im aeusseren Drittel "Branch Bend": 0.8, "Branch Thickness": 0.11, "Sub Count": 3, - "Sub Length": 0.5, "Root Flare": 0.6, + "Sub Length": 0.7, "Root Flare": 0.6, }, "weide": { # haengende Zweige (Droop positiv), breit ausladend "Height": 5.0, "Trunk Radius": 0.18, "Bend": 0.8, "Taper": 0.8, @@ -1245,6 +1267,10 @@ def make_object(ng, preset="baum", name=None, growth=None, seed=None): # spaeter und getrennt - er kann sonst nicht wissen, ob er einen Setzling # oder einen Altbaum vor sich hat. Aus dem Namen zu lesen waere bruechig. ob["growth_t"] = 1.0 if growth is None else max(0.0, min(1.0, float(growth))) + # Das Preset ebenso: einzelne Arten brauchen eine eigene Ziel-Cardzahl + # (siehe LEAF_STUFEN_PRESET), und der Blattwerk-Operator sieht spaeter nur + # noch das fertige Objekt. + ob["preset"] = preset bpy.context.view_layer.objects.active = ob return ob @@ -1523,20 +1549,42 @@ LEAF_STUFEN = ( (None, 1.00, 0.25), # S4 - volle Dichte, keine Regelung ) +# AUSNAHMEN je Preset: {preset: {stufen_index: ziel_cards}}. +# +# "Volle Dichte" auf S4 heisst: das Ergebnis haengt an der Zweigflaeche, und die +# faellt je Art verschieden aus. Die WEIDE traegt die meiste - haengende Zweige +# mit Sub Length 0.9 und Sub Count 3 - und landete deshalb gemessen bei +# 5456/5558/5594 Tris ueber drei Seeds, gegen ein Stufenbudget von 4300. +# Deckelung auf 350 Cards: gemessen 361 Cards / 3818 Tris, damit im Budget. +# +# Das macht die Tabelle preset-abhaengig - bewusst so entschieden, statt das +# Budget fuer alle anzuheben: die Weide ist der Ausreisser, nicht die Regel. +LEAF_STUFEN_PRESET = { + "weide": {3: 350}, +} -def _stufen_anteile(growth_t): + +def _stufen_anteile(growth_t, preset=None): """Ziel-Cardzahl, Groessen- und Kronenansatz-Wert fuer einen Wachstums-Fortschritt. Die Stufen liegen bei t = 0 / 1/3 / 2/3 / 1 (vier Stufen). Zwischen den Stuetzstellen wird linear gemischt, damit auch drei oder fuenf Stufen sinnvolle Werte bekommen. + + `preset` zieht die Ausnahmen aus LEAF_STUFEN_PRESET; ohne Angabe gilt die + allgemeine Tabelle. """ + aus = LEAF_STUFEN_PRESET.get(preset or "", {}) + + def _ziel(i): + return aus.get(i, LEAF_STUFEN[i][0]) + n = len(LEAF_STUFEN) x = max(0.0, min(1.0, growth_t)) * (n - 1) i = min(int(x), n - 2) f = x - i - z0, g0, h0 = LEAF_STUFEN[i] - z1, g1, h1 = LEAF_STUFEN[i + 1] + z0, g0, h0 = _ziel(i), LEAF_STUFEN[i][1], LEAF_STUFEN[i][2] + z1, g1, h1 = _ziel(i + 1), LEAF_STUFEN[i + 1][1], LEAF_STUFEN[i + 1][2] # Groesse und Kronenansatz werden gemischt, die Ziel-ANZAHL nicht: sie ist # eine Stueckzahl, kein Verlauf. Es gilt die naeher liegende Stuetzstelle. ziel = z0 if f < 0.5 else z1 @@ -2369,6 +2417,36 @@ def _deselect(context): pass +def _stamm_koordinaten(me): + """Koordinaten der reinen STAMM-Vertices, mit absteigender Genauigkeit. + + 1. "ast_id" == 0 - exakt, kommt aus dem Generator selbst. + 2. Material-Slot 0 - Rinde inklusive Aeste, immerhin ohne Blatt-Cards. + 3. alles - wenn das Mesh weder Attribut noch zweiten Slot hat. + + Stufe 2 und 3 sind Notnaegel fuer fremde oder vereinfachte Meshes; jede + Stufe weiter unten ist ungenauer, aber keine faellt aus. + """ + slot0 = None + if len(me.materials) > 1: + idx = {vi for p in me.polygons if p.material_index == 0 + for vi in p.vertices} + if idx: + slot0 = idx + + attr = me.attributes.get("ast_id") + if attr is not None and attr.domain == 'POINT' and len(attr.data) == len(me.vertices): + idx = {i for i in range(len(me.vertices)) if attr.data[i].value == 0} + if slot0 is not None: + idx &= slot0 + if idx: + return [me.vertices[i].co for i in idx] + + if slot0: + return [me.vertices[i].co for i in slot0] + return [v.co for v in me.vertices] + + def _origin_bottom_center(ob): """Ursprung auf Bbox-Unterseite Mitte - identisch zur Fels-Pipeline. @@ -2383,27 +2461,39 @@ def _origin_bottom_center(ob): if not me.vertices: return Matrix.Identity(4) - # Der Ursprung kommt aus der STAMM-Geometrie (Slot 0), nicht aus der - # Gesamt-Bbox. Sonst hebt eine einzige tief haengende Blatt-Card den ganzen - # Baum an und er steht in UE in der Luft - gemeldet am S1-Setzling, wo die - # Krone relativ zum kurzen Stamm weit ausladet. - stamm_verts = None - if len(me.materials) > 1: - idx = {vi for p in me.polygons if p.material_index == 0 - for vi in p.vertices} - if idx: - stamm_verts = [me.vertices[i].co for i in idx] - if stamm_verts is None: - stamm_verts = [v.co for v in me.vertices] + # Der Ursprung kommt aus der STAMMBASIS, nicht aus einer Bbox. + # + # Zwei Stufen dieses Fehlers gab es schon. Zuerst die Gesamt-Bbox: eine + # einzige tief haengende Blatt-Card hob den ganzen Baum an. Dann Slot 0 - + # aber zum Rinden-Slot gehoeren auch die AESTE. Gemessen an Tanne_01_S1 + # (haengende Aeste ab 6 % Stammhoehe): der tiefste Slot-0-Punkt lag bei + # -5.35 cm, der tiefste Stammpunkt bei -0.02 cm. Die Stammbasis schwebte + # also 5.3 cm ueber dem Boden, weil eine Astspitze den Nullpunkt bestimmte. + # + # Die exakte Trennung liefert das Attribut "ast_id" (0 = Stamm), das der + # Baum ohnehin fuer die Faell-Teile traegt. Ein Schwellwert auf den + # Achsabstand waere die naheliegende Alternative und faellt beim Kaktus um: + # dessen Stamm ist dicker als jeder sinnvolle Schwellwert. + stamm_verts = _stamm_koordinaten(me) - xs = [c.x for c in stamm_verts] - ys = [c.y for c in stamm_verts] zs = [c.z for c in stamm_verts] - versatz = Matrix.Translation(( - -(min(xs) + max(xs)) * 0.5, - -(min(ys) + max(ys)) * 0.5, - -min(zs), - )) + z_fuss = min(zs) + # X/Y aus dem UNTERSTEN RING, nicht aus der Bbox des ganzen Stammes: ein + # gekruemmter Stamm (Bend 1.5 beim toten Baum) hat seine Bbox-Mitte + # irgendwo in der Kruemmung, nicht am Fuss. Der Schwerpunkt des Ringes ist + # die Stammachse. + hoehe = max(zs) - z_fuss + band = [c for c in stamm_verts if c.z <= z_fuss + max(1e-4, hoehe * 0.02)] + if band: + mx = sum(c.x for c in band) / len(band) + my = sum(c.y for c in band) / len(band) + else: + xs = [c.x for c in stamm_verts] + ys = [c.y for c in stamm_verts] + mx = (min(xs) + max(xs)) * 0.5 + my = (min(ys) + max(ys)) * 0.5 + + versatz = Matrix.Translation((-mx, -my, -z_fuss)) me.transform(versatz) return versatz @@ -2773,7 +2863,8 @@ class TREEGEN_OT_leaves(Operator): # traegt kleinere Bueschel. Baeume ohne Wachstums-Stufe haben # growth_t = 1.0 und bleiben unveraendert. gt = float(t.get("growth_t", 1.0)) - ziel_cards, g_anteil, h_anteil = _stufen_anteile(gt) + ziel_cards, g_anteil, h_anteil = _stufen_anteile( + gt, t.get("preset")) # Der RADIUS-FILTER muss mit dem Baum schrumpfen. Er trennt # duenne Zweige (Laub) von dickem Geaest (kein Laub) - aber ein diff --git a/tests/test_ursprung.py b/tests/test_ursprung.py new file mode 100644 index 0000000..ac473dd --- /dev/null +++ b/tests/test_ursprung.py @@ -0,0 +1,245 @@ +"""Der Ursprung sitzt an der STAMMBASIS, nicht an der tiefsten Astspitze. + +Gemeldet von der Spielseite an Tanne_01_S1: der Baum "liegt am Ast" - die +Stammbasis schwebt sichtbar ueber dem Boden. Nachgemessen an der Export-Kopie +lag der tiefste Punkt des Rinden-Slots bei -5.35 cm, der tiefste STAMM-Punkt +bei -0.02 cm. Die Tanne setzt ihre Aeste ab 6 % Stammhoehe an und laesst sie +haengen; eine davon bestimmte den Nullpunkt und hob den ganzen Baum an. + +Der frueher gebaute Fix nahm nur die Blatt-Cards aus der Rechnung. Das reicht +nicht: zum Rinden-Slot gehoeren die Aeste mit. + +Warum die Tanne der Pruefling ist: am Standardbaum sitzen die Aeste hoch und +haengen nicht - dort waere der Fehler unsichtbar geblieben, genau wie er es +monatelang war. + +Gemessen wird im REIMPORTIERTEN FBX, nicht in Blender. Der Schwellwert fuer +"nahe der Achse" wird nicht geraten, sondern vor dem Export am echten Stamm +abgenommen und ueber die Hoehe skalenfrei gemacht. + +Aufruf: blender --background --factory-startup --python tests/test_ursprung.py +""" +import os +import sys +import math +import tempfile +import importlib.util + +import bpy + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +spec = importlib.util.spec_from_file_location( + "tg", os.path.join(ROOT, "stylized_tree_generator.py")) +tg = importlib.util.module_from_spec(spec) +sys.modules["tg"] = tg +spec.loader.exec_module(tg) +tg.register() + +fails = [] +OUT = tempfile.mkdtemp() + +for o in list(bpy.data.objects): + bpy.data.objects.remove(o, do_unlink=True) + +me = bpy.data.meshes.new("Leaf_Card") +me.from_pydata([(-0.5, 0, 0), (0, 0, 0.7), (0.5, 0, 0), (0, 0, -0.1)], + [], [(0, 1, 2), (0, 2, 3)]) +me.update() +card = bpy.data.objects.new("Leaf_Card", me) +bpy.context.scene.collection.objects.link(card) + + +def stamm_mass(ob): + """Fussradius und Hoehe des reinen Stammes - ueber ast_id, nicht geschaetzt. + + Ein Schwellwert auf den Achsabstand waere die naheliegende Alternative und + faellt beim Kaktus um: dessen Stamm ist dicker als jeder sinnvolle + Schwellwert. Das Attribut kommt aus dem Generator und ist exakt. + """ + dg = bpy.context.evaluated_depsgraph_get() + ev = ob.evaluated_get(dg) + m = ev.to_mesh() + attr = m.attributes.get("ast_id") + if attr is None: + # Nachgemessen: ein Baum OHNE Aeste traegt gar kein ast_id - das + # Attribut entsteht auf dem Ast-Zweig des Graphen, und den schaltet + # "Branch Count 0" komplett ab (Kaktus-Setzling: keine Arme vor 50-70 + # Jahren, NPS). Dann ist aber ohnehin alles Stamm, und der Fallback ist + # exakt statt bloss ausreichend. + co = [v.co.copy() for v in m.vertices] + else: + co = [m.vertices[i].co.copy() for i in range(len(m.vertices)) + if attr.data[i].value == 0] + alle_z = [v.co.z for v in m.vertices] + ev.to_mesh_clear() + if not co: + return None + z0 = min(c.z for c in co) + h = max(alle_z) - min(alle_z) + band = [c for c in co if c.z <= z0 + h * 0.02] + r = max((math.hypot(c.x, c.y) for c in band), default=0.0) + return r, h, z0 + + +ergebnisse = [] +for preset, stufe in (("tanne", 1), ("tanne", 4), ("toter_baum", 1), + ("weide", 1), ("kaktus", 1)): + for o in list(bpy.context.scene.objects): + if o is not card: + bpy.data.objects.remove(o, do_unlink=True) + # Eigenes Verzeichnis je Fall: reimportiert wird erst nach der Schleife, + # ein gemeinsamer Ordner wuerde die vorherigen Dateien ueberschreiben. + ziel_dir = os.path.join(OUT, "%s_s%d" % (preset, stufe)) + os.makedirs(ziel_dir, exist_ok=True) + + s = bpy.context.scene.tree_gen_settings + s.preset = preset + s.art_name = preset.capitalize() + s.variant = 1 + s.apply_modifier = True + s.use_growth = True + s.stages = 4 + s.export_dir = ziel_dir + s.generate_lods = False + s.leaf_card = card + bpy.ops.object.treegen_create() + + staemme = sorted((o for o in bpy.context.scene.objects + if o.type == 'MESH' and o is not card + and not o.name.endswith(("_Leaf", "_Frucht"))), + key=lambda o: o.name) + baum = staemme[stufe - 1] + + # Der Baum steht BEWUSST nicht am Ursprung - eine verschobene Stufe faellt + # bei (0,0,0) nicht auf, weil minus null eben null ist. + baum.location = (12.0, -4.0, 0.0) + mass = stamm_mass(baum) + if mass is None: + fails.append("%s S%d: kein ast_id am Stamm" % (preset, stufe)) + continue + r_stamm, h_blender, _ = mass + + for o in bpy.context.scene.objects: + o.select_set(o is baum) + bpy.context.view_layer.objects.active = baum + bpy.ops.object.treegen_leaves() + bl = bpy.data.objects.get(baum.name + "_Leaf") + if bl is not None: + bl.location = baum.location + + for o in bpy.context.scene.objects: + o.select_set(o is baum) + bpy.context.view_layer.objects.active = baum + bpy.ops.treegen.export_game() + + dateien = sorted(f for f in os.listdir(ziel_dir) + if f.lower().endswith(".fbx")) + if not dateien: + fails.append("%s S%d: kein FBX geschrieben" % (preset, stufe)) + continue + pfad = os.path.join(ziel_dir, dateien[0]) + ergebnisse.append((preset, stufe, pfad, r_stamm / h_blender)) + +print("%-12s %3s %9s %11s %11s %10s" + % ("Preset", "St", "Achs-R", "Stammfuss", "tiefster Pkt", "Achs-Mitte")) + +for preset, stufe, pfad, r_rel in ergebnisse: + bpy.ops.wm.read_factory_settings(use_empty=True) + bpy.ops.import_scene.fbx(filepath=pfad) + meshes = [o for o in bpy.context.scene.objects if o.type == 'MESH'] + if not meshes: + fails.append("%s S%d: kein Mesh im FBX" % (preset, stufe)) + continue + ob = meshes[0] + m = ob.data + co = [ob.matrix_world @ v.co for v in m.vertices] + zlo = min(c.z for c in co) + zhi = max(c.z for c in co) + h = zhi - zlo + + # Gesucht ist die tiefste Hoehe, auf der ein STAMMQUERSCHNITT liegt. + # + # Ein blosses "tiefster Punkt nahe der Achse" reicht nicht - das ist die + # erste Fassung dieses Tests gewesen, und die Gegenprobe hat sie umgeworfen: + # bei der Tanne haengt ein Ast so dicht am Stamm, dass seine Spitze ins + # Achsband faellt. Der Test meldete Fuss = 0, obwohl der Stamm 5 cm darueber + # schwebte. Ein Threshold, der die Bugfassung durchlaesst, prueft nichts. + # + # Ein Querschnitt unterscheidet sich von einer Astspitze in zwei messbaren + # Punkten: er umschliesst die Achse (Vertices in ALLEN Himmelsrichtungen) + # und er ist kompakt (kein Vertex weit draussen). Beides ohne geratene + # Konstante: der Vergleichsradius kommt aus dem echten Stamm. + r_max = r_rel * h * 2.5 + SEKTOREN = 8 + + def querschnitt(zu, zo): + # Erst auf das Achsband einschraenken, DANN auf einen Ring pruefen. + # Andersherum (Slab verwerfen, sobald irgendein Punkt weit draussen + # liegt) faellt der echte Stammfuss durch: auf seiner Hoehe zieht bei + # der Tanne ein haengender Ast vorbei. + pts = [c for c in co + if zu <= c.z <= zo and math.hypot(c.x, c.y) <= r_max] + if len(pts) < SEKTOREN: + return None + sek = {int((math.atan2(c.y, c.x) + math.pi) / (2 * math.pi) * SEKTOREN) + % SEKTOREN for c in pts} + if len(sek) < SEKTOREN - 2: + return None # einseitig -> Zweig, kein Ring + # Schwerpunkt aus einem DICKEREN Band als dem Suchschritt. Nachgemessen + # am Kaktus: ein 1-%-Band erwischt nur 11 der 16 Ring-Vertices (die + # Rippen legen den Ring in Z leicht schief) und der Schwerpunkt kippt um + # 19 % der Hoehe aus der Achse. Mit 4 % ist der Ring vollstaendig und + # der Schwerpunkt exakt 0.0000 - geprueft an Kaktus, totem Baum, Tanne. + ring = [c for c in co + if zu <= c.z <= zu + h * 0.04 + and math.hypot(c.x, c.y) <= r_max] + return (sum(c.x for c in ring) / len(ring), + sum(c.y for c in ring) / len(ring)) + + dicke = h * 0.01 + fuss = None + mitte = (0.0, 0.0) + # Ueberlappende Schritte: mit buendigen Slabs kann eine Slab-Grenze mitten + # durch den Ring laufen, dann haelt keine der beiden Haelften die + # Sektor-Pruefung und der Fuss wird gar nicht gefunden. Halber Schritt. + z = zlo + while z < zhi: + tr = querschnitt(z, z + dicke) + if tr is not None: + fuss, mitte = z, tr + break + z += dicke * 0.5 + if fuss is None: + # Kein Ring innerhalb r_max ueber die ganze Hoehe: der Stamm steht + # nicht ueber dem Ursprung. Genau das passiert mit der alten Fassung - + # dort bestimmte eine haengende Astspitze den Nullpunkt, und zwar in + # allen drei Achsen, nicht nur in Z. Der Baum haengt dann an der + # Astspitze statt auf dem Fuss zu stehen. + fails.append("%s S%d: auf keiner Hoehe ein Stammquerschnitt im " + "Achsband (R %.3f) - der Stamm steht seitlich versetzt " + "zum Ursprung" % (preset, stufe, r_max)) + continue + achs = math.hypot(*mitte) + + print("%-12s S%-2d %9.4f %11.4f %11.4f %10.4f" + % (preset, stufe, r_max, fuss, zlo, achs)) + + # DAS ist der Punkt: die Stammbasis liegt auf Z = 0. + if abs(fuss) > h * 0.01: + fails.append("%s S%d: Stammfuss bei Z %.4f statt 0 (%.1f %% der Hoehe) " + "- der Baum schwebt bzw. steckt im Boden" + % (preset, stufe, fuss, 100 * abs(fuss) / h)) + # Und der Stamm steht ueber dem Ursprung, nicht daneben. Ohne diese Zeile + # koennte die Bbox-Mitte den Pivot bei einem einseitigen Baum vom Stamm + # wegziehen - derselbe Fehler, nur in X/Y. + if achs > h * 0.02: + fails.append("%s S%d: Stammachse %.4f neben dem Ursprung (%.1f %% der " + "Hoehe)" % (preset, stufe, achs, 100 * achs / h)) + +print("") +if fails: + print("ERGEBNIS: %d FEHLER" % len(fails)) + for f in fails: + print(" - " + f) + sys.exit(1) +print("ERGEBNIS: ALLE CHECKS OK")