diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index c435983..cf7de5f 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.20.0" +version = "1.21.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 35cbc74..45bf113 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.20.0", + "version": "1.21.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.20.0.zip", - "archive_size": 18130, - "archive_hash": "sha256:1b3f215f320072966f3ced2aa15dff1acdcace63f9640b4af51c1eca3bcee95a" + "archive_url": "./stylized_tree_generator-1.21.0.zip", + "archive_size": 18435, + "archive_hash": "sha256:eb093c862dc7192728e86ef07d45fc1a9f4381044c2f8560b399f2a85911ec94" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.20.0.zip b/dist/stylized_tree_generator-1.20.0.zip deleted file mode 100644 index 6789b96..0000000 Binary files a/dist/stylized_tree_generator-1.20.0.zip and /dev/null differ diff --git a/dist/stylized_tree_generator-1.21.0.zip b/dist/stylized_tree_generator-1.21.0.zip new file mode 100644 index 0000000..ee00ac4 Binary files /dev/null and b/dist/stylized_tree_generator-1.21.0.zip differ diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index 6c5b0c9..ccf0db0 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, 20, 0), + "version": (1, 21, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -80,27 +80,30 @@ DEFAULTS = { # Presets: nur die Abweichungen von DEFAULTS. PRESETS = { "baum": {}, - # Palme: ein Palmenstamm ist KEIN Baumstamm - er hat nahezu konstanten - # Durchmesser (kaum Taper), einen glatt geschwollenen Fuss ohne Wurzelbretter, - # und die Wedel sitzen alle in EINER Krone ganz oben. + # Palme - am TreeIt-Referenzbaum ausgemessen (palm07_0 + frond stem_1): + # Stamm 4.33 m, Radius 0.133 unten -> ~0.086 Mitte -> 0.106 OBEN + # (Kronenschaft!), 11 Seiten, nur 150 Tris. + # Wedel-STIELE sind kurze Stummel von 0.49-0.80 m - die langen Wedel machen + # dort die BLATT-Cards (Spannweite 3.3 m, eigenes Objekt). Mein Generator + # liefert also nur die Stiele; die Fiederung kommt als _Leaf-Ebene dazu. "palme": { - "Height": 6.0, "Trunk Radius": 0.115, "Bend": 1.1, - "Taper": 0.22, # fast konstanter Durchmesser statt Kegel - "Trunk Tip": 0.9, # Krone endet stumpf, nicht spitz - "Branch Count": 15, "Branch Length": 3.4, "Branch Up": 1.05, - "Branch Start": 0.95, "Branch End": 1.0, - "Branch Bend": 0.35, - "Branch Droop": 1.15, "Droop Curve": 2.4, # Bogen, nicht haengend - "Branch Thickness": 0.32, # Wedelstiel ist kraeftig wie ein Besenstiel - "Branch Taper": 0.38, # bleiben bis zur Spitze Stiel, kein Draht - "Tip Blunt": 0.24, # stumpfes Ende statt Antenne - "Root Flare": 0.55, # nur leichte Verdickung ... + "Height": 4.4, "Trunk Radius": 0.133, "Bend": 0.7, + "Taper": 0.35, # sanft, nicht kegelig + "Tip Blunt": 0.7, # Krone bleibt dick (Kronenschaft) UND die + # Stiele laufen nicht drahtig aus + "Trunk Tip": 1.0, + "Branch Count": 11, "Branch Length": 0.78, "Branch Up": 0.9, + "Branch Start": 0.9, "Branch End": 1.0, + "Branch Bend": 0.3, + "Branch Droop": 0.5, "Droop Curve": 2.2, + "Branch Thickness": 0.16, + "Branch Taper": 0.45, + "Root Flare": 0.5, # leichte Verdickung ... "Root Lobes": 0.0, "Root Lobe Depth": 0.0, # ... ohne Wurzelbretter "Crown Taper": 0.0, "Crown Bulge": 0.0, - "Sub Count": 0, # Wedel-Fiederung macht der User als Blattwerk - "Detail": 0.7, # mehr Segmente -> weicher Bogen, kein - # langes gerades Endsegment als "Draht" - "Sides": 9, "Branch Sides": 4, + "Sub Count": 0, # Fiederung = _Leaf-Ebene + "Detail": 0.55, + "Sides": 11, "Branch Sides": 4, }, "busch": { "Height": 1.6, "Trunk Radius": 0.07, "Bend": 0.4, "Taper": 0.8, @@ -864,8 +867,27 @@ def build_group(): mesh_branch = _to_mesh(rsetp, "Geometry", V["Branch Sides"], 3400, 200) mesh_sub = _to_mesh(sbset, "Geometry", V["Sub Sides"], 3400, -500) + # FALLE: "Curve to Points" klemmt Count auf mindestens 1 -> Sub Count = 0 + # schaltet die Zweige NICHT ab, es entsteht trotzdem einer pro Ast (gemessen: + # Sub Count 0 und 1 ergeben identische 583 Verts). Bei Palme und Kaktus waren + # das duenne, gerade "Nadeln" neben den richtigen Aesten. Deshalb hier ein + # echter Schalter, der die Sub-Ebene bei 0 komplett verwirft. + sub_on = N("FunctionNodeCompare"); sub_on.location = (4400, -350) + try: + sub_on.data_type = 'INT'; sub_on.operation = 'GREATER_THAN' + L(V["Sub Count"], sub_on.inputs[2]) + sub_on.inputs[3].default_value = 0 + except Exception: + sub_on = N("ShaderNodeMath"); sub_on.location = (4400, -350) + sub_on.operation = 'GREATER_THAN'; sub_on.inputs[1].default_value = 0.5 + L(V["Sub Count"], sub_on.inputs[0]) + sub_sw = N("GeometryNodeSwitch"); sub_sw.location = (4550, -250) + sub_sw.input_type = 'GEOMETRY' + L(sub_on.outputs[0], _sock(sub_sw, "Switch")) + L(_out(mesh_sub, "Geometry"), _sock(sub_sw, "True")) + join = N("GeometryNodeJoinGeometry"); join.location = (4700, 300) - L(_out(mesh_sub, "Geometry"), join.inputs[0]) + L(_out(sub_sw, "Output"), join.inputs[0]) L(_out(mesh_branch, "Geometry"), join.inputs[0]) L(_out(mesh_trunk, "Geometry"), join.inputs[0]) stuv = join # Name beibehalten fuer den nachfolgenden Merge-Zweig diff --git a/tests/test_tree_addon.py b/tests/test_tree_addon.py index 892ead0..53860fb 100644 --- a/tests/test_tree_addon.py +++ b/tests/test_tree_addon.py @@ -1,7 +1,7 @@ """Prueft das gebaute Tree-Addon: registrieren, Operator ausfuehren, Ergebnis messen.""" import bpy, sys, zipfile, os, tempfile, importlib.util, traceback -ZIP = r"A:\eco\stylized_rock_generator\dist\stylized_tree_generator-1.20.0.zip" +ZIP = r"A:\eco\stylized_rock_generator\dist\stylized_tree_generator-1.21.0.zip" fails = [] tmp = tempfile.mkdtemp()