From e3ad1727b60e205a661bc3a577c8deede8c87e48 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 29 Jul 2026 11:23:32 +0200 Subject: [PATCH] Tree Generator v1.9.0: Wurzelbretter am Stammfuss Gelappter Wurzelanlauf statt glattem Trichter (Root Lobes / Root Lobe Depth / Root Height). Als Mesh-Offset umgesetzt -> 0 zusaetzliche Tris. Stamm-Sides auf 12 fuer saubere Lappen (+104 Tris, gemessen). Co-Authored-By: Claude Opus 4.8 --- blender_manifest_tree.toml | 2 +- dist/index.json | 8 +-- dist/stylized_tree_generator-1.8.0.zip | Bin 13440 -> 0 bytes dist/stylized_tree_generator-1.9.0.zip | Bin 0 -> 14478 bytes stylized_tree_generator.py | 71 +++++++++++++++++++++++-- 5 files changed, 73 insertions(+), 8 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.8.0.zip create mode 100644 dist/stylized_tree_generator-1.9.0.zip diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index 04f4798..b8953a3 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.8.0" +version = "1.9.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 2d79fbf..3660413 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.8.0", + "version": "1.9.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.8.0.zip", - "archive_size": 13440, - "archive_hash": "sha256:e96e6ec6f8009708ce0611dea6ea50e3271b6603d60bce84ebeab2e365bba983" + "archive_url": "./stylized_tree_generator-1.9.0.zip", + "archive_size": 14478, + "archive_hash": "sha256:07c964096cd907dab9e22e1bc936621ed25476e188ebaa6176a18e98c5f76a4c" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.8.0.zip b/dist/stylized_tree_generator-1.8.0.zip deleted file mode 100644 index 9090f97ad70c631b547d9a4fee7646e732f8e8ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13440 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 literal 0 HcmV?d00001 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index fce99f8..a3ca791 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, 8, 0), + "version": (1, 9, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -43,12 +43,18 @@ DEFAULTS = { "Sub Count": 2, # Sub-Aeste je Hauptast (0 = aus) "Sub Length": 0.55, "Sub Up": 1.4, - "Sides": 8, # Stamm rund (Referenz TreeIt: ~9) + "Sides": 12, # Stamm rund genug fuer die Wurzelbretter + # (+104 Tris ggue. 8 - gemessen, lohnt sich) "Branch Sides": 4, # Aeste sparsamer "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) "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 + "Root Lobe Depth": 1.3, # wie weit die Lappen rausstehen + "Root Height": 1.1, # Hoehe (m) des Anlaufs; zu klein -> zu wenige + # Ringe liegen drin und man sieht nichts "Detail": 0.55, # skaliert alle Resample-Counts = Tri-Budget-Regler "Branch Collar": 0.4, # Ansatz-Verdickung: Uebergang Ast->Stamm (0 = aus) "Merge": 0.0, # 1 = Aeste per Voxel-Remesh mit dem Stamm verschmelzen @@ -174,6 +180,9 @@ def build_group(): add_in("UV Scale", 'NodeSocketFloat', DEFAULTS["UV Scale"], 0.01, 20.0) add_in("Detail", 'NodeSocketFloat', DEFAULTS["Detail"], 0.2, 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) + add_in("Root Height", 'NodeSocketFloat', DEFAULTS["Root Height"], 0.05, 3.0) add_in("Branch Collar", 'NodeSocketFloat', DEFAULTS["Branch Collar"], 0.0, 3.0) add_in("Merge", 'NodeSocketFloat', DEFAULTS["Merge"], 0.0, 1.0) add_in("Merge Voxel", 'NodeSocketFloat', DEFAULTS["Merge Voxel"], 0.005, 0.2) @@ -664,7 +673,63 @@ def build_group(): L(uv.outputs[0], _sock(sm, "Value")) return sm - mesh_trunk = _to_mesh(setrad, "Curve", V["Sides"], 3400, 900) + mesh_trunk0 = _to_mesh(setrad, "Curve", V["Sides"], 3400, 900) + + # ---------- Wurzelanlauf ausformen (Wurzelbretter) ---------- + # Der reine Radius-Flare ergibt einen glatten Trichter. Echte Wurzelanlaeufe + # sind GELAPPT. Das laesst sich nicht ueber den Kurvenradius machen (der ist + # rundum gleich), sondern erst am fertigen Mesh: Vertices nahe dem Boden + # radial nach aussen schieben, moduliert ueber den Winkel. Kostet 0 Tris. + fpos = N("GeometryNodeInputPosition"); fpos.location = (4750, 1150) + fsep = N("ShaderNodeSeparateXYZ"); fsep.location = (4900, 1150) + L(fpos.outputs[0], fsep.inputs[0]) + + # Hoehen-Abfall: nur das unterste Stueck ist betroffen + fh = N("ShaderNodeMath"); fh.location = (5050, 1300); fh.operation = 'DIVIDE' + L(fsep.outputs["Z"], fh.inputs[0]); L(V["Root Height"], fh.inputs[1]) + fc = N("ShaderNodeMath"); fc.location = (5200, 1300); fc.operation = 'MINIMUM' + fc.inputs[1].default_value = 1.0 + L(fh.outputs[0], fc.inputs[0]) + fi = N("ShaderNodeMath"); fi.location = (5350, 1300); fi.operation = 'SUBTRACT' + fi.inputs[0].default_value = 1.0 + L(fc.outputs[0], fi.inputs[1]) + fp = N("ShaderNodeMath"); fp.location = (5500, 1300); fp.operation = 'POWER' + fp.inputs[1].default_value = 2.5 + L(fi.outputs[0], fp.inputs[0]) + fpc = N("ShaderNodeMath"); fpc.location = (5650, 1300); fpc.operation = 'MAXIMUM' + fpc.inputs[1].default_value = 0.0 + L(fp.outputs[0], fpc.inputs[0]) + + # Lappen ueber den Winkel: cos(Lobes * atan2(y,x)), auf 0..1 gehoben + fat = N("ShaderNodeMath"); fat.location = (5050, 1000); fat.operation = 'ARCTAN2' + L(fsep.outputs["Y"], fat.inputs[0]); L(fsep.outputs["X"], fat.inputs[1]) + fml = N("ShaderNodeMath"); fml.location = (5200, 1000); fml.operation = 'MULTIPLY' + L(fat.outputs[0], fml.inputs[0]); L(V["Root Lobes"], fml.inputs[1]) + fco = N("ShaderNodeMath"); fco.location = (5350, 1000); fco.operation = 'COSINE' + L(fml.outputs[0], fco.inputs[0]) + fno = N("ShaderNodeMath"); fno.location = (5500, 1000); fno.operation = 'MULTIPLY_ADD' + fno.inputs[1].default_value = 0.5; fno.inputs[2].default_value = 0.5 + L(fco.outputs[0], fno.inputs[0]) + + # Betrag = RootLobeDepth * Hoehenabfall * Lappen * Stammradius + fa1 = N("ShaderNodeMath"); fa1.location = (5800, 1150); fa1.operation = 'MULTIPLY' + L(fpc.outputs[0], fa1.inputs[0]); L(fno.outputs[0], fa1.inputs[1]) + fa2 = N("ShaderNodeMath"); fa2.location = (5950, 1150); fa2.operation = 'MULTIPLY' + L(fa1.outputs[0], fa2.inputs[0]); L(V["Root Lobe Depth"], fa2.inputs[1]) + fa3 = N("ShaderNodeMath"); fa3.location = (6100, 1150); fa3.operation = 'MULTIPLY' + L(fa2.outputs[0], fa3.inputs[0]); L(V["Trunk Radius"], fa3.inputs[1]) + + # Richtung: radial nach aussen (XY), Z bleibt unangetastet + fxy = N("ShaderNodeCombineXYZ"); fxy.location = (5200, 850) + L(fsep.outputs["X"], fxy.inputs["X"]); L(fsep.outputs["Y"], fxy.inputs["Y"]) + fnrm = N("ShaderNodeVectorMath"); fnrm.location = (5350, 850); fnrm.operation = 'NORMALIZE' + L(fxy.outputs[0], fnrm.inputs[0]) + foff = N("ShaderNodeVectorMath"); foff.location = (6250, 1000); foff.operation = 'SCALE' + L(fnrm.outputs[0], foff.inputs[0]); L(fa3.outputs[0], _sock(foff, "Scale")) + + mesh_trunk = N("GeometryNodeSetPosition"); mesh_trunk.location = (6400, 900) + L(_out(mesh_trunk0, "Geometry"), _sock(mesh_trunk, "Geometry")) + L(foff.outputs[0], _sock(mesh_trunk, "Offset")) mesh_branch = _to_mesh(rsetp, "Geometry", V["Branch Sides"], 3400, 200) mesh_sub = _to_mesh(sbset, "Geometry", V["Sub Sides"], 3400, -500)