From 57b4c12725431e423178ab4408aa5288af1a4b78 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 29 Jul 2026 11:13:43 +0200 Subject: [PATCH] Tree Generator v1.7.0: Tri-Budget, Detail-Regler, Wurzelanlauf - 'Detail' skaliert alle Resample-Counts -> zentrale Budget-Stellschraube - Defaults treffen jetzt das Projekt-Budget (baum 1368, busch 532 Tris) - 'Root Flare': Wurzelanlauf am Stammfuss, kostet keine Tris Co-Authored-By: Claude Opus 4.8 --- blender_manifest_tree.toml | 2 +- dist/index.json | 8 ++-- dist/stylized_tree_generator-1.6.0.zip | Bin 12916 -> 0 bytes dist/stylized_tree_generator-1.7.0.zip | Bin 0 -> 13398 bytes stylized_tree_generator.py | 52 ++++++++++++++++++++----- 5 files changed, 48 insertions(+), 14 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.6.0.zip create mode 100644 dist/stylized_tree_generator-1.7.0.zip diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index 9e7187d..8d72878 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.6.0" +version = "1.7.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 e593669..ecb43ac 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.6.0", + "version": "1.7.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.6.0.zip", - "archive_size": 12916, - "archive_hash": "sha256:48d7072d65d44c944fe7dd160147f37f496132d6c2583c5251f0d6aba499476b" + "archive_url": "./stylized_tree_generator-1.7.0.zip", + "archive_size": 13398, + "archive_hash": "sha256:3817ce7433ef63918ddf75a827591b3bb712c8659141ae85f73f4f1fd19e20fb" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.6.0.zip b/dist/stylized_tree_generator-1.6.0.zip deleted file mode 100644 index bd362ce1af9ca6397edf16cbfd15bedf1aeda794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12916 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 literal 0 HcmV?d00001 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index ea2e5c2..a913bbf 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, 6, 0), + "version": (1, 7, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -40,12 +40,14 @@ DEFAULTS = { "Branch Droop": 0.0, # >0 haengt nach unten (Palme), <0 kruemmt nach oben (Kaktus) "Branch Thickness": 0.32, # Ast-Dicke relativ zum Stamm "Branch Taper": 0.55, # schwach verjuengen -> Roehre statt Kegel/Dorn - "Sub Count": 3, # Sub-Aeste je Hauptast (0 = aus) + "Sub Count": 2, # Sub-Aeste je Hauptast (0 = aus) "Sub Length": 0.55, "Sub Up": 1.4, - "Sides": 6, + "Sides": 5, "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 + "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 "Merge Voxel": 0.03, # Voxelgroesse (m): klein = feiner, aber teuer @@ -69,7 +71,8 @@ PRESETS = { "Branch Count": 14, "Branch Length": 0.9, "Branch Up": 1.0, "Branch Start": 0.15, "Branch End": 0.95, "Branch Bend": 0.6, "Branch Droop": 0.0, - "Sub Count": 2, "Sub Length": 0.35, "Sub Up": 1.6, "Sides": 5, + "Sub Count": 1, "Sub Length": 0.35, "Sub Up": 1.6, "Sides": 4, + "Detail": 0.3, "Branch Count": 10, }, # Kaktus: dicker, kaum verjuengter Stamm, wenige Arme, die per NEGATIVEM # Droop nach oben kruemmen (Saguaro-Silhouette). Keine Sub-Aeste. @@ -112,6 +115,18 @@ def build_group(): N, L = ng.nodes.new, ng.links.new iface = ng.interface + def _count(base, x, y): + """Resample-Count = base * Detail, mindestens 3. Der zentrale + Tri-Budget-Regler: die Segmentzahl entlang der Kurven dominiert die + Dreiecke (Tris ~ Segmente * Sides * 2).""" + mul = N("ShaderNodeMath"); mul.location = (x, y); mul.operation = 'MULTIPLY' + mul.inputs[0].default_value = float(base) + L(V["Detail"], mul.inputs[1]) + mx = N("ShaderNodeMath"); mx.location = (x + 150, y); mx.operation = 'MAXIMUM' + mx.inputs[1].default_value = 3.0 + L(mul.outputs[0], mx.inputs[0]) + return mx + def _new_any(*bl_idnames): """Falle 2: erster Node-Typ, den diese Blender-Version kennt.""" for bid in bl_idnames: @@ -153,6 +168,8 @@ def build_group(): add_in("Sides", 'NodeSocketInt', DEFAULTS["Sides"], 3, 32) 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("Root Flare", 'NodeSocketFloat', DEFAULTS["Root Flare"], 0.0, 4.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) @@ -170,7 +187,7 @@ def build_group(): L(top.outputs[0], _sock(line, "End")) res = N("GeometryNodeResampleCurve"); res.location = (-950, 200) - _sock(res, "Count").default_value = 24 # genug Punkte, damit die Kuppel rund wird + L(_count(24, -1150, 380).outputs[0], _sock(res, "Count")) L(_out(line, "Curve"), _sock(res, "Curve")) spar = N("GeometryNodeSplineParameter"); spar.location = (-950, -60) @@ -270,8 +287,25 @@ def build_group(): L(inv.outputs[0], tmulr.inputs[0]); L(tdome.outputs[0], tmulr.inputs[1]) tmaxr = N("ShaderNodeMath"); tmaxr.location = (-110, 60); tmaxr.operation = 'MAXIMUM' L(tmulr.outputs[0], tmaxr.inputs[0]); L(ttip.outputs[0], tmaxr.inputs[1]) - trad = N("ShaderNodeMath"); trad.location = (40, 60); trad.operation = 'MULTIPLY' - L(V["Trunk Radius"], trad.inputs[0]); L(tmaxr.outputs[0], trad.inputs[1]) + + # Wurzelanlauf: der Stamm verbreitert sich am Fuss. Hoher Exponent -> nur + # das unterste Stueck ist betroffen. Kostet keine Tris, nur Radius. + rfi = N("ShaderNodeMath"); rfi.location = (-420, -220); rfi.operation = 'SUBTRACT' + rfi.inputs[0].default_value = 1.0 + L(spar.outputs["Factor"], rfi.inputs[1]) + rfp = N("ShaderNodeMath"); rfp.location = (-270, -220); rfp.operation = 'POWER' + rfp.inputs[1].default_value = 9.0 + L(rfi.outputs[0], rfp.inputs[0]) + rfm = N("ShaderNodeMath"); rfm.location = (-120, -220); rfm.operation = 'MULTIPLY' + L(V["Root Flare"], rfm.inputs[0]); L(rfp.outputs[0], rfm.inputs[1]) + rfa = N("ShaderNodeMath"); rfa.location = (30, -220); rfa.operation = 'ADD' + rfa.inputs[0].default_value = 1.0 + L(rfm.outputs[0], rfa.inputs[1]) + tflare = N("ShaderNodeMath"); tflare.location = (30, -60); tflare.operation = 'MULTIPLY' + L(tmaxr.outputs[0], tflare.inputs[0]); L(rfa.outputs[0], tflare.inputs[1]) + + trad = N("ShaderNodeMath"); trad.location = (190, 60); trad.operation = 'MULTIPLY' + L(V["Trunk Radius"], trad.inputs[0]); L(tflare.outputs[0], trad.inputs[1]) setrad = N("GeometryNodeSetCurveRadius"); setrad.location = (-80, 200) L(_out(setpos, "Geometry"), _sock(setrad, "Curve")) @@ -301,7 +335,7 @@ def build_group(): L(V["Branch Length"], btop.inputs["Z"]) L(btop.outputs[0], _sock(bline, "End")) bres = N("GeometryNodeResampleCurve"); bres.location = (280, 40) - _sock(bres, "Count").default_value = 14 # zu wenig -> Kuppel wird zum Kegel + L(_count(14, 100, 200).outputs[0], _sock(bres, "Count")) L(_out(bline, "Curve"), _sock(bres, "Curve")) # Ast-Verjuengung: 1 - BranchTaper*factor. Bei Kakteen klein halten, @@ -453,7 +487,7 @@ def build_group(): L(V["Sub Length"], stop.inputs["Z"]) L(stop.outputs[0], _sock(sline, "End")) sres = N("GeometryNodeResampleCurve"); sres.location = (2250, 760) - _sock(sres, "Count").default_value = 9 # genug Punkte, damit die Biegung sichtbar wird + L(_count(9, 2100, 700).outputs[0], _sock(sres, "Count")) L(_out(sline, "Curve"), _sock(sres, "Curve")) # Sub-Aeste: gleiche Verjuengungs-Logik wie Hauptaeste (Branch Taper + Kuppel).