Tree Gen 1.30.0: Bueschel-Defaults, Wachstums-Kopplung, Stufen-Budget

Blatt-Defaults auf die Bueschel-Atlas-Aera umgestellt. Eine Card ist ein ganzer
Zweigbueschel, kein einzelnes Blatt - die alten Werte streuten hunderte winziger
Cards, wo ein paar Dutzend grosse hingehoeren. Werte an einer S4-Eiche in UE
gemessen und abgenommen:

    Groesse      0.22 -> 0.85
    Dichte        500 -> 170
    Max Radius   0.02 -> 0.04     <- der Volumen-Hebel
    Kippung       0.5 -> 0.9

Max Radius ist der unscheinbare Held: bei 0.02 trugen nur die aeussersten
Zweigspitzen Laub, die Krone hatte nur Kontur und war innen nackt.

Bueschelgroesse haengt jetzt am Wachstum: make_object merkt growth_t am Objekt
(aus dem Namen zu lesen waere bruechig), der Blattwerk-Operator skaliert die
Cards damit. Gemessen ueber vier Stufen: Card-Kante 0.19/0.28/0.37/0.45.

Falle dabei: "Dichte" ist Punkte pro m2 Zweigflaeche, und ein Setzling hat davon
fast keine - bei Stufe 1 kamen exakt NULL Cards heraus, der Setzling stand kahl
da. Da die Bueschel um denselben Faktor kleiner sind, deckt jeder nur faktor^2
der Flaeche; die Dichte gegenlaeufig anzuheben haelt die Blattdeckung gleich.

Tri-Budget PRO STUFE (ASSETS.md Teil 6): S1 <= 800, S2 <= 1200, S3/S4 <= 4000.
Bewusst Stufen und keine Interpolation; die Schwellen greifen auch bei drei
Stufen richtig (t = 0 / 0.5 / 1.0). Gemessen 494 / 878 / 1032 / 1396 - alle im
Rahmen.

WICHTIGSTE FALLE, von der UE-Seite gemeldet und hier nachgestellt:
md[socket] = wert loest KEINE Neuauswertung des GN-Modifiers aus. Die
Blattebene blieb bei 118 Faces stehen, obwohl die Dichte von 90 auf 400
geschrieben war - auch view_layer.update() half nicht, erst ein
show_viewport-Toggle. Der Knopf-Weg funktionierte bisher nur ZUFAELLIG, weil
make_leaves jedes Mal auch die Objekt-Zeiger neu schreibt und das Aendern eines
ID-Zeigers die Depsgraph-Beziehungen umbaut. Wer das spaeter optimiert ("nur
geaenderte Werte schreiben"), haette den Fehler still zurueck.
_modifier_anstossen() macht es jetzt explizit - in make_leaves UND make_object.

Nebenbei: der Variantentest rundete Card-Flaechen auf 5 Stellen; seit die
Kippung bei 0.9 steht streuen sie in der sechsten und eine einzige Card-Sorte
zerfiel in vier Eimer.

Neu: tests/test_blatt_bueschel.py. 23 Tests bestehen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 08:23:27 +02:00
co-authored by Claude Opus 4.8
parent 914a1af967
commit b1fdad8106
9 changed files with 387 additions and 26 deletions
+46
View File
@@ -385,6 +385,51 @@ Zwei Fallen beim Bauen:
- `join` loescht das zweite Objekt; jede gehaltene Referenz darauf ist danach
tot. Die Aufraeumliste fuehrt deshalb **Namen** statt Objekte.
### Blatt-Defaults: Bueschel, nicht Blaettchen
Eine Card ist ein ganzer **Zweigbueschel**, kein einzelnes Blatt. Die alten Werte
stammten aus der Blaettchen-Aera und streuten hunderte winziger Cards, wo ein
paar Dutzend grosse hingehoeren. Die neuen Werte sind an einer S4-Eiche in UE
gemessen und abgenommen:
| | vorher | jetzt | Wirkung |
|---|---|---|---|
| Groesse | 0.22 | **0.85** | Bueschel statt Bonsai |
| Dichte | 500 | **170** | wenige grosse statt viele Fussel |
| **Max Radius** | 0.02 | **0.04** | der Volumen-Hebel |
| Kippung | 0.5 | **0.9** | Rotations-Chaos schliesst Sichtluecken |
`Max Radius` ist der unscheinbare Held: bei 0.02 trugen nur die aeussersten
Zweigspitzen Laub, die Krone hatte nur Kontur und war innen nackt. Bei 0.04
wachsen Bueschel auch am mittleren Geaest und die Krone bekommt Tiefe.
**Bueschelgroesse haengt am Wachstum.** Der Generator merkt sich `growth_t` am
Objekt; der Blattwerk-Operator skaliert die Cards damit (`Setzlings-Anteil`,
Standard 45 %). Gemessen ueber vier Stufen: Card-Kante 0.19 → 0.28 → 0.37 → 0.45.
> **Falle dabei:** „Dichte" ist Punkte pro m² Zweigflaeche, und ein Setzling hat
> davon fast keine — bei Stufe 1 kamen exakt **null** Cards heraus, der Setzling
> stand kahl da. Da die Bueschel um denselben Faktor kleiner sind, deckt jeder
> nur faktor² der Flaeche; die Dichte entsprechend gegenlaeufig anzuheben haelt
> die Blattdeckung ueber alle Stufen gleich.
**Tri-Budget pro Stufe** (ASSETS.md Teil 6) statt global: S1 ≤ 800, S2 ≤ 1200,
S3/S4 ≤ 4000. Bewusst Stufen und keine Interpolation. Die Schwellen greifen auch
bei drei Stufen richtig (t = 0 / 0.5 / 1.0). Die 2500 von frueher waren eine
konservative Setzung — bei ISM-Instanzen mit LOD-Kette sind Roh-Dreiecke nicht
der Engpass, sondern **Overdraw** der Cards (die GPU zahlt pro Bildschirmflaeche,
nicht pro Dreieck) und die Schattenpaesse. Genau deshalb sind 170 grosse Bueschel
guenstiger als 500 kleine, bei gleichem Tri-Zaehler.
> **Die wichtigste Code-Falle in diesem Addon.** `md[socket] = wert` loest
> **keine** Neuauswertung des Geometry-Nodes-Modifiers aus. Nachgestellt: die
> Blattebene blieb bei 118 Faces stehen, obwohl die Dichte von 90 auf 400
> geschrieben war — auch `view_layer.update()` half nicht. Erst ein
> `show_viewport`-Toggle brachte das Ergebnis. Der Knopf-Weg funktionierte
> bisher nur ZUFAELLIG, weil `make_leaves` jedes Mal auch die Objekt-Zeiger neu
> schreibt und das Aendern eines ID-Zeigers die Depsgraph-Beziehungen umbaut.
> `_modifier_anstossen()` macht das jetzt explizit.
### LOD-Kette (Stand-Baum)
Haken `LOD-Kette erzeugen`: exportiert `<Name>_LODGroup.fbx` mit `_LOD0..3` unter
@@ -699,6 +744,7 @@ gefiltert `.\run_tests.ps1 -Filter panels`.
| Datei | prueft |
|---|---|
| `tests/test_baum_export.py` | Stand-Baum: ein Mesh, zwei Slots, Ursprung, **Kugel-Normalen im exportierten FBX** |
| `tests/test_blatt_bueschel.py` | Bueschel-Defaults, Wachstums-Kopplung der Card-Groesse, Stufen-Budget 800/1200/4000 |
| `tests/test_baum_lod.py` | LOD-Kette: 4 Stufen unter LodGroup, Cards werden nach oben duenner, **Kugel-Normalen auf jeder Stufe**, kein Hoehenversatz |
| `tests/test_faell_teile.py` | Faell-Teile: **Blatt-Bilanz 170=170**, Pivot am Massenmittelpunkt, UCX je Teil, Gesamtdatei mit gemeinsamem Ursprung |
| `tests/test_blatt_varianten.py` | Card-Sammlung: alle Varianten werden gezogen, seed-stabil, Einzelobjekt weiter moeglich |