diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index b0c7ffd..5f65411 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.10.0" +version = "1.12.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 fe2b845..fc36ca4 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.10.0", + "version": "1.12.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.10.0.zip", - "archive_size": 15650, - "archive_hash": "sha256:995b37759449eab7f767bc87dcd7917bdac4382c3a2a8d37e1e0c9dc9d11eb30" + "archive_url": "./stylized_tree_generator-1.12.0.zip", + "archive_size": 15970, + "archive_hash": "sha256:f0dd283fe891b98f295882a73ba8d7f5dd9618d2367558ba580f3880fba5cc1c" } ] } \ 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 deleted file mode 100644 index a9a1bd9..0000000 Binary files a/dist/stylized_tree_generator-1.10.0.zip and /dev/null differ diff --git a/dist/stylized_tree_generator-1.12.0.zip b/dist/stylized_tree_generator-1.12.0.zip new file mode 100644 index 0000000..7dd4489 Binary files /dev/null and b/dist/stylized_tree_generator-1.12.0.zip differ diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index fc88c79..f378080 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, 10, 0), + "version": (1, 12, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -38,11 +38,14 @@ DEFAULTS = { "Branch End": 0.95, "Branch Bend": 0.75, # Krummheit je Ast/Zweig (0 = gerade Staebe) "Branch Droop": 0.0, # >0 haengt nach unten (Palme), <0 kruemmt nach oben (Kaktus) + "Droop Curve": 2.0, # 2 = weicher Bogen, 4+ = scharfer Ellbogen "Branch Thickness": 0.32, # Ast-Dicke relativ zum Stamm "Branch Taper": 0.55, # schwach verjuengen -> Roehre statt Kegel/Dorn "Sub Count": 2, # Sub-Aeste je Hauptast (0 = aus) + "Sub Start": 0.45, # Ansatzbereich der Zweige am Ast ... + "Sub End": 0.95, # ... nahe 1.0 + hohes Sub Up = Gabelung "Sub Length": 0.55, - "Sub Up": 1.4, + "Sub Up": 2.2, # hoch = Zweig folgt dem Ast (Gabel statt Nadel) "Sides": 12, # Stamm rund genug fuer die Wurzelbretter # (+104 Tris ggue. 8 - gemessen, lohnt sich) "Branch Sides": 4, # Aeste sparsamer @@ -129,14 +132,15 @@ PRESETS = { # Droop nach oben kruemmen (Saguaro-Silhouette). Keine Sub-Aeste. "kaktus": { "Height": 3.0, "Trunk Radius": 0.28, "Bend": 0.08, "Taper": 0.10, - "Branch Count": 2, "Branch Length": 1.6, "Branch Up": 0.05, - "Branch Start": 0.28, "Branch End": 0.5, + "Branch Count": 2, "Branch Length": 1.9, "Branch Up": 0.12, + "Branch Start": 0.30, "Branch End": 0.46, "Branch Bend": 0.0, - "Branch Droop": -2.2, # negativ = Arme kruemmen nach OBEN (Saguaro) + "Branch Droop": -3.0, # negativ = Arme kruemmen nach OBEN (Saguaro) + "Droop Curve": 4.5, # spaeter, dafuer scharfer Ellbogen "Branch Thickness": 0.72, # Arme fast so dick wie der Stamm "Branch Taper": 0.12, # Arme bleiben dick statt spitz zuzulaufen - "Sub Count": 0, - "Tip Blunt": 0.45, + "Sub Count": 0, "Crown Taper": 0.0, "Root Flare": 0.25, + "Root Lobe Depth": 0.0, "Tip Blunt": 0.45, "Sides": 16, "Branch Sides": 12, "Ribs": 9.0, "Rib Depth": 0.09, }, } @@ -211,9 +215,12 @@ def build_group(): # Droop darf NEGATIV sein: dann kruemmen sich die Aeste nach OBEN # (= Kaktus-Arme statt Palmwedel). add_in("Branch Droop", 'NodeSocketFloat', DEFAULTS["Branch Droop"], -3.0, 3.0) + add_in("Droop Curve", 'NodeSocketFloat', DEFAULTS["Droop Curve"], 1.0, 8.0) add_in("Branch Thickness", 'NodeSocketFloat', DEFAULTS["Branch Thickness"], 0.05, 1.0) add_in("Branch Taper", 'NodeSocketFloat', DEFAULTS["Branch Taper"], 0.0, 1.0) add_in("Sub Count", 'NodeSocketInt', DEFAULTS["Sub Count"], 0, 12) + add_in("Sub Start", 'NodeSocketFloat', DEFAULTS["Sub Start"], 0.0, 1.0) + add_in("Sub End", 'NodeSocketFloat', DEFAULTS["Sub End"], 0.0, 1.0) add_in("Sub Length", 'NodeSocketFloat', DEFAULTS["Sub Length"], 0.05, 5.0) add_in("Sub Up", 'NodeSocketFloat', DEFAULTS["Sub Up"], -3.0, 3.0) add_in("Sides", 'NodeSocketInt', DEFAULTS["Sides"], 3, 32) @@ -543,8 +550,10 @@ def build_group(): L(rfac.outputs[0], _sock(rscale, "Scale")) # Droop: Spitzen haengen nach unten (Palmwedel) -- quadratisch = schoene Kurve - dsq = N("ShaderNodeMath"); dsq.location = (1350, -320); dsq.operation = 'MULTIPLY' - L(rspar.outputs["Factor"], dsq.inputs[0]); L(rspar.outputs["Factor"], dsq.inputs[1]) + # Droop-Kurve: Exponent 2 = weicher Bogen (Palmwedel), hoeher = der Arm + # bleibt erst flach und knickt dann scharf ab (Saguaro-Ellbogen). + dsq = N("ShaderNodeMath"); dsq.location = (1350, -320); dsq.operation = 'POWER' + L(rspar.outputs["Factor"], dsq.inputs[0]); L(V["Droop Curve"], dsq.inputs[1]) dmul = N("ShaderNodeMath"); dmul.location = (1500, -320); dmul.operation = 'MULTIPLY' L(V["Branch Droop"], dmul.inputs[0]); L(dsq.outputs[0], dmul.inputs[1]) dneg = N("ShaderNodeMath"); dneg.location = (1650, -320); dneg.operation = 'MULTIPLY' @@ -567,9 +576,12 @@ def build_group(): # Curve to Points keine Punkte -> es entsteht schlicht nichts (kein Fehler). strim = N("GeometryNodeTrimCurve"); strim.location = (2100, 520) L(_out(rsetp, "Geometry"), _sock(strim, "Curve")) + # Wo am Elternast die Zweige sitzen. Nahe 1.0 zusammengedraengt + hohes + # "Sub Up" ergibt eine GABELUNG (Weber-Penn "split") statt seitlicher + # Kinder - das ist der Unterschied zwischen "Stab mit Nadeln" und Geaest. try: - _sock(strim, "Start").default_value = 0.3 - _sock(strim, "End").default_value = 0.9 + L(V["Sub Start"], _sock(strim, "Start")) + L(V["Sub End"], _sock(strim, "End")) except KeyError: pass sp = N("GeometryNodeCurveToPoints"); sp.location = (2250, 520)