From d9c642fcd22b3259034eefd8117a40fc9839bb67 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 29 Jul 2026 11:27:50 +0200 Subject: [PATCH] Tree Generator v1.10.0: Kronenform + 5 neue Baum-Varianten Crown Taper / Crown Bulge steuern die botanische Huellkurve (kegelfoermig bis rund) - damit sind Tanne, Eiche, Birke, Weide und toter Baum als Presets moeglich. Alle neun Presets liegen im Tri-Budget des Projekts. Co-Authored-By: Claude Opus 4.8 --- README.md | 7 +- blender_manifest_tree.toml | 2 +- dist/index.json | 8 +-- dist/stylized_tree_generator-1.10.0.zip | Bin 0 -> 15650 bytes dist/stylized_tree_generator-1.9.0.zip | Bin 14478 -> 0 bytes stylized_tree_generator.py | 89 +++++++++++++++++++++++- 6 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 dist/stylized_tree_generator-1.10.0.zip delete mode 100644 dist/stylized_tree_generator-1.9.0.zip diff --git a/README.md b/README.md index 2708624..d76ccd6 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,12 @@ Parametrischer **Geaest**-Generator (Stamm + Aeste + Sub-Aeste) als Geometry-Nodes- Gruppe. Blaetter/Krone macht man selbst — das Addon liefert die Struktur. -- **Presets:** `baum`, `palme`, `busch`, `kaktus` +- **Presets:** `baum`, `palme`, `busch`, `tanne`, `eiche`, `birke`, `weide`, + `toter_baum`, `kaktus` — die Silhouette steuert die **Kronenform** + (`Crown Taper` / `Crown Bulge`, Idee aus modular_tree / Weber-Penn). +- **Tri-Budget:** alle Presets liegen unter dem Projektlimit (Baum ≤2500, + Busch ≤800). Stellschrauben: `Detail` (Segmente) und `Sides` / `Branch Sides` / + `Sub Sides` (Profilaufloesung je Ebene — Stamm rund, Zweige nur Dreiecke). - **Wachstums-Stufen:** Haken setzen + Anzahl waehlen → Setzling bis ausgewachsen, **gleicher Seed = dieselbe Baum-Identitaet** (fuer Wachstums-Systeme im Spiel). - **Live bearbeiten:** Nach dem Erzeugen liegen alle Regler am Modifier `GN_Tree` — diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index b8953a3..b0c7ffd 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.9.0" +version = "1.10.0" name = "Stylized Tree Generator" tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen" maintainer = "D4rkst3r" diff --git a/dist/index.json b/dist/index.json index 3660413..fe2b845 100644 --- a/dist/index.json +++ b/dist/index.json @@ -32,7 +32,7 @@ "id": "stylized_tree_generator", "name": "Stylized Tree Generator", "tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen", - "version": "1.9.0", + "version": "1.10.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.9.0.zip", - "archive_size": 14478, - "archive_hash": "sha256:07c964096cd907dab9e22e1bc936621ed25476e188ebaa6176a18e98c5f76a4c" + "archive_url": "./stylized_tree_generator-1.10.0.zip", + "archive_size": 15650, + "archive_hash": "sha256:995b37759449eab7f767bc87dcd7917bdac4382c3a2a8d37e1e0c9dc9d11eb30" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.10.0.zip b/dist/stylized_tree_generator-1.10.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9a1bd948d7be969df29e37e42eaff1bc938d993 GIT binary patch literal 15650 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 I|7Z3808qCpF#rGn literal 0 HcmV?d00001 diff --git a/dist/stylized_tree_generator-1.9.0.zip b/dist/stylized_tree_generator-1.9.0.zip deleted file mode 100644 index b8a2023b9b21b7700bb59d86e93e6cc665ce2f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14478 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 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index a3ca791..fc88c79 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, 9, 0), + "version": (1, 10, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -49,6 +49,8 @@ DEFAULTS = { "Sub Sides": 3, # Zweige nur Dreiecke - sieht man nicht "UV Scale": 1.0, # Rinden-Dichte; UVs sind world-space (m) "Tip Blunt": 0.18, # >0 verhindert Nadelspitzen (0 = spitz, 0.45 = Kaktus) + "Crown Taper": 0.35, # >0 kegelfoermig, 0 saeulig, <0 besenfoermig + "Crown Bulge": 0.0, # >0 = Bauch in der Mitte (runde Krone) "Root Flare": 1.1, # Wurzelanlauf: Stamm verbreitert sich am Fuss "Root Lobes": 6.0, # Wurzelbretter; sollte in "Sides" aufgehen, # sonst sampelt das Profil die Lappen weg @@ -82,6 +84,47 @@ PRESETS = { "Sub Count": 1, "Sub Length": 0.35, "Sub Up": 1.6, "Sides": 4, "Detail": 0.3, "Branch Count": 10, }, + # --- Varianten ueber die Kronenform (Idee: modular_tree "envelope shapes") --- + "tanne": { # kegelfoermig: unten lange Aeste, oben kurz, leicht haengend + "Height": 7.0, "Trunk Radius": 0.15, "Bend": 0.15, "Taper": 0.95, + "Branch Count": 22, "Branch Length": 1.9, "Branch Up": -0.25, + "Branch Start": 0.12, "Branch End": 0.97, + "Crown Taper": 0.9, "Crown Bulge": 0.0, + "Branch Bend": 0.3, "Branch Thickness": 0.2, "Sub Count": 1, + "Sub Length": 0.4, "Root Flare": 0.7, + }, + "eiche": { # runde, breite Krone: Bauch in der Mitte, dicker Stamm + "Height": 5.5, "Trunk Radius": 0.24, "Bend": 0.5, "Taper": 0.75, + "Branch Count": 10, "Branch Length": 2.2, "Branch Up": 0.9, + "Branch Start": 0.3, "Branch End": 0.95, + "Crown Taper": -0.15, "Crown Bulge": 0.5, + "Branch Bend": 0.9, "Branch Thickness": 0.4, "Sub Count": 3, + "Sub Length": 0.8, "Root Flare": 1.6, "Root Lobe Depth": 1.6, + }, + "birke": { # schlank, hoher Ansatz, feine Zweige + "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, + "Crown Taper": 0.1, "Crown Bulge": 0.25, + "Branch Bend": 0.8, "Branch Thickness": 0.22, "Sub Count": 3, + "Sub Length": 0.5, "Root Flare": 0.6, + }, + "weide": { # haengende Zweige (Droop positiv), breit ausladend + "Height": 5.0, "Trunk Radius": 0.18, "Bend": 0.8, "Taper": 0.8, + "Branch Count": 12, "Branch Length": 2.0, "Branch Up": 0.5, + "Branch Start": 0.35, "Branch End": 0.95, + "Crown Taper": -0.2, "Crown Bulge": 0.4, + "Branch Droop": 1.2, "Branch Bend": 0.7, "Branch Thickness": 0.28, + "Sub Count": 3, "Sub Length": 0.9, "Root Flare": 1.2, + }, + "toter_baum": { # knorrig, kaum Zweige, starke Kruemmung + "Height": 4.5, "Trunk Radius": 0.17, "Bend": 1.5, "Taper": 0.88, + "Branch Count": 6, "Branch Length": 1.5, "Branch Up": 0.9, + "Branch Start": 0.3, "Branch End": 0.9, + "Crown Taper": 0.3, "Crown Bulge": 0.0, + "Branch Bend": 1.4, "Branch Thickness": 0.3, "Sub Count": 1, + "Sub Length": 0.5, "Root Flare": 1.4, "Tip Blunt": 0.08, + }, # Kaktus: dicker, kaum verjuengter Stamm, wenige Arme, die per NEGATIVEM # Droop nach oben kruemmen (Saguaro-Silhouette). Keine Sub-Aeste. "kaktus": { @@ -179,6 +222,8 @@ def build_group(): add_in("Tip Blunt", 'NodeSocketFloat', DEFAULTS["Tip Blunt"], 0.0, 0.9) add_in("UV Scale", 'NodeSocketFloat', DEFAULTS["UV Scale"], 0.01, 20.0) add_in("Detail", 'NodeSocketFloat', DEFAULTS["Detail"], 0.2, 2.0) + add_in("Crown Taper", 'NodeSocketFloat', DEFAULTS["Crown Taper"], -1.5, 1.5) + add_in("Crown Bulge", 'NodeSocketFloat', DEFAULTS["Crown Bulge"], -1.0, 2.0) add_in("Root Flare", 'NodeSocketFloat', DEFAULTS["Root Flare"], 0.0, 4.0) add_in("Root Lobes", 'NodeSocketFloat', DEFAULTS["Root Lobes"], 0.0, 12.0) add_in("Root Lobe Depth", 'NodeSocketFloat', DEFAULTS["Root Lobe Depth"], 0.0, 3.0) @@ -422,10 +467,50 @@ def build_group(): pscale.inputs["To Max"].default_value = 1.0 pscale.clamp = True + # ---------- Kronenform (botanische Huellkurve) ---------- + # Idee aus modular_tree / Weber-Penn: die Astlaenge haengt von der relativen + # Hoehe am Stamm ab. Das entscheidet die Silhouette: + # Crown Taper > 0 -> unten lang, oben kurz = kegelfoermig (Tanne) + # Crown Taper = 0 -> ueberall gleich = saeulenfoermig (Pappel) + # Crown Taper < 0 -> unten kurz, oben lang = besenfoermig + # Crown Bulge > 0 -> Maximum in der Mitte = rund (Eiche) + czp = N("GeometryNodeInputPosition"); czp.location = (750, -20) + czs = N("ShaderNodeSeparateXYZ"); czs.location = (900, -20) + L(czp.outputs[0], czs.inputs[0]) + czn = N("ShaderNodeMath"); czn.location = (1050, -20); czn.operation = 'DIVIDE' + L(czs.outputs["Z"], czn.inputs[0]); L(V["Height"], czn.inputs[1]) + czc = N("ShaderNodeMath"); czc.location = (1200, -20); czc.operation = 'MINIMUM' + czc.inputs[1].default_value = 1.0 + L(czn.outputs[0], czc.inputs[0]) + ctm = N("ShaderNodeMath"); ctm.location = (1350, -20); ctm.operation = 'MULTIPLY' + L(V["Crown Taper"], ctm.inputs[0]); L(czc.outputs[0], ctm.inputs[1]) + cts = N("ShaderNodeMath"); cts.location = (1500, -20); cts.operation = 'SUBTRACT' + cts.inputs[0].default_value = 1.0 + L(ctm.outputs[0], cts.inputs[1]) + # Bauch in der Mitte: sin(pi * t) + cbs = N("ShaderNodeMath"); cbs.location = (1350, -180); cbs.operation = 'MULTIPLY' + cbs.inputs[1].default_value = 3.14159 + L(czc.outputs[0], cbs.inputs[0]) + cbi = N("ShaderNodeMath"); cbi.location = (1500, -180); cbi.operation = 'SINE' + L(cbs.outputs[0], cbi.inputs[0]) + cbm = N("ShaderNodeMath"); cbm.location = (1650, -180); cbm.operation = 'MULTIPLY' + L(V["Crown Bulge"], cbm.inputs[0]); L(cbi.outputs[0], cbm.inputs[1]) + cba = N("ShaderNodeMath"); cba.location = (1800, -180); cba.operation = 'ADD' + cba.inputs[0].default_value = 1.0 + L(cbm.outputs[0], cba.inputs[1]) + ccm = N("ShaderNodeMath"); ccm.location = (1800, -20); ccm.operation = 'MULTIPLY' + L(cts.outputs[0], ccm.inputs[0]); L(cba.outputs[0], ccm.inputs[1]) + ccl = N("ShaderNodeMath"); ccl.location = (1950, -20); ccl.operation = 'MAXIMUM' + ccl.inputs[1].default_value = 0.05 + L(ccm.outputs[0], ccl.inputs[0]) + # mit der Elterndicken-Skalierung kombinieren + pfin = N("ShaderNodeMath"); pfin.location = (2100, 120); pfin.operation = 'MULTIPLY' + L(pscale.outputs[0], pfin.inputs[0]); L(ccl.outputs[0], pfin.inputs[1]) + inst = N("GeometryNodeInstanceOnPoints"); inst.location = (1400, 320) L(_out(c2p, "Points"), _sock(inst, "Points")) L(_out(bsetr, "Curve"), _sock(inst, "Instance")) - L(pscale.outputs[0], _sock(inst, "Scale")) + L(pfin.outputs[0], _sock(inst, "Scale")) if align is not None: L(align.outputs[0], _sock(inst, "Rotation"))