From 91e30ca05a755a89eb01367132e408e09848c0c6 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 29 Jul 2026 11:07:16 +0200 Subject: [PATCH] Tree Generator v1.6.0: Ansatz-Verdickung (Collar), Stammspitze, optionaler Merge - 'Branch Collar': Aeste werden an der Basis leicht breiter -> gewachsener Uebergang zum Stamm, ohne einen einzigen zusaetzlichen Vert - Stammspitze laeuft duenn aus statt mit flachem Deckel zu enden - 'Merge'/'Merge Voxel' (Voxel-Remesh) optional, Default AUS: verschmilzt Aeste organisch, kostet aber die UVs und bis zu 14x Verts (gemessen), duenne Zweige zerfallen -> fuer Game-Assets nicht empfohlen Co-Authored-By: Claude Opus 4.8 --- blender_manifest_tree.toml | 2 +- dist/index.json | 8 +-- dist/stylized_tree_generator-1.5.0.zip | Bin 11772 -> 0 bytes dist/stylized_tree_generator-1.6.0.zip | Bin 0 -> 12916 bytes stylized_tree_generator.py | 85 ++++++++++++++++++++++--- 5 files changed, 81 insertions(+), 14 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.5.0.zip create mode 100644 dist/stylized_tree_generator-1.6.0.zip diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index 58aa4af..9e7187d 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.5.0" +version = "1.6.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 d170991..e593669 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.5.0", + "version": "1.6.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.5.0.zip", - "archive_size": 11772, - "archive_hash": "sha256:fe45391647074729afaac194801ab55c0d004c38f36b94737fdd6715e9c9501c" + "archive_url": "./stylized_tree_generator-1.6.0.zip", + "archive_size": 12916, + "archive_hash": "sha256:48d7072d65d44c944fe7dd160147f37f496132d6c2583c5251f0d6aba499476b" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.5.0.zip b/dist/stylized_tree_generator-1.5.0.zip deleted file mode 100644 index 8d87d57a0dacda67e4719ffa6db4a2b62d6b01d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11772 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 diff --git a/dist/stylized_tree_generator-1.6.0.zip b/dist/stylized_tree_generator-1.6.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd362ce1af9ca6397edf16cbfd15bedf1aeda794 GIT binary patch literal 12916 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 Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -46,6 +46,9 @@ DEFAULTS = { "Sides": 6, "UV Scale": 1.0, # Rinden-Dichte; UVs sind world-space (m) "Tip Blunt": 0.18, # >0 verhindert Nadelspitzen (0 = spitz, 0.45 = Kaktus) + "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 "Ribs": 0.0, # senkrechte Kanneluren (0 = glatt); Kaktus ~9 "Rib Depth": 0.0, } @@ -150,6 +153,9 @@ 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("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) add_in("Ribs", 'NodeSocketFloat', DEFAULTS["Ribs"], 0.0, 20.0) add_in("Rib Depth", 'NodeSocketFloat', DEFAULTS["Rib Depth"], 0.0, 0.5) @@ -226,17 +232,46 @@ def build_group(): # multiplizieren. Wirkt der Mindestwert nur auf die Kuppel, bleibt der bereits # verjuengte Radius trotzdem winzig — gemessen: Sub-Ast-Spitze 0.8 mm bei # 31 mm Basis, also weiterhin eine Nadel. - def _shape(inv_taper_socket, dome_node, base_socket, x, y): + def _shape(inv_taper_socket, dome_node, base_socket, x, y, + spar_node=None, collar=False): mul = N("ShaderNodeMath"); mul.location = (x, y); mul.operation = 'MULTIPLY' L(inv_taper_socket, mul.inputs[0]); L(dome_node.outputs[0], mul.inputs[1]) mx = N("ShaderNodeMath"); mx.location = (x + 150, y); mx.operation = 'MAXIMUM' L(mul.outputs[0], mx.inputs[0]); L(V["Tip Blunt"], mx.inputs[1]) - r = N("ShaderNodeMath"); r.location = (x + 300, y); r.operation = 'MULTIPLY' - L(base_socket, r.inputs[0]); L(mx.outputs[0], r.inputs[1]) + src = mx + if collar and spar_node is not None: + # Ansatz-Verdickung ("Collar"): der Ast wird an seiner Basis breiter + # und laeuft schnell aus -> der Uebergang zum Stamm sieht gewachsen + # aus statt wie eine durchgesteckte Roehre. Kostet KEINE Verts. + ci = N("ShaderNodeMath"); ci.location = (x, y - 160); ci.operation = 'SUBTRACT' + ci.inputs[0].default_value = 1.0 + L(spar_node.outputs["Factor"], ci.inputs[1]) + cp = N("ShaderNodeMath"); cp.location = (x + 150, y - 160); cp.operation = 'POWER' + cp.inputs[1].default_value = 6.0 # faellt schnell ab -> kein Trichter + L(ci.outputs[0], cp.inputs[0]) + cm = N("ShaderNodeMath"); cm.location = (x + 300, y - 160); cm.operation = 'MULTIPLY' + L(V["Branch Collar"], cm.inputs[0]); L(cp.outputs[0], cm.inputs[1]) + ca = N("ShaderNodeMath"); ca.location = (x + 450, y - 160); ca.operation = 'ADD' + ca.inputs[0].default_value = 1.0 + L(cm.outputs[0], ca.inputs[1]) + cf = N("ShaderNodeMath"); cf.location = (x + 450, y - 60); cf.operation = 'MULTIPLY' + L(mx.outputs[0], cf.inputs[0]); L(ca.outputs[0], cf.inputs[1]) + src = cf + r = N("ShaderNodeMath"); r.location = (x + 620, y); r.operation = 'MULTIPLY' + L(base_socket, r.inputs[0]); L(src.outputs[0], r.inputs[1]) return r tdome = _dome(spar, -900, 220) - trad = _shape(inv.outputs[0], tdome, V["Trunk Radius"], -260, 60) + # Stammspitze duenner auslaufen lassen als die Aeste: sonst endet der Stamm + # mit einem sichtbaren flachen Deckel. Ein eigener, kleinerer Mindestwert. + ttip = N("ShaderNodeMath"); ttip.location = (-420, -80); ttip.operation = 'MULTIPLY' + L(V["Tip Blunt"], ttip.inputs[0]); ttip.inputs[1].default_value = 0.3 + tmulr = N("ShaderNodeMath"); tmulr.location = (-260, 60); tmulr.operation = 'MULTIPLY' + 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]) setrad = N("GeometryNodeSetCurveRadius"); setrad.location = (-80, 200) L(_out(setpos, "Geometry"), _sock(setrad, "Curve")) @@ -283,7 +318,8 @@ def build_group(): bbase = N("ShaderNodeMath"); bbase.location = (600, -140); bbase.operation = 'MULTIPLY' L(V["Trunk Radius"], bbase.inputs[0]); L(V["Branch Thickness"], bbase.inputs[1]) bdome = _dome(bspar, 600, -600) - bscl = _shape(binv.outputs[0], bdome, bbase.outputs[0], 780, -140) + bscl = _shape(binv.outputs[0], bdome, bbase.outputs[0], 780, -140, + spar_node=bspar, collar=True) bsetr = N("GeometryNodeSetCurveRadius"); bsetr.location = (600, 40) L(_out(bres, "Curve"), _sock(bsetr, "Curve")) @@ -436,7 +472,8 @@ def build_group(): L(V["Trunk Radius"], sbase.inputs[0]) sbase.inputs[1].default_value = 0.12 # Zweige sind DUENN ... sdome = _dome(sspar, 2550, 1200) - srad2 = _shape(sinv.outputs[0], sdome, sbase.outputs[0], 2750, 900) + srad2 = _shape(sinv.outputs[0], sdome, sbase.outputs[0], 2750, 900, + spar_node=sspar, collar=True) ssetr = N("GeometryNodeSetCurveRadius"); ssetr.location = (2550, 760) L(_out(sres, "Curve"), _sock(ssetr, "Curve")) L(srad2.outputs[0], _sock(ssetr, "Radius")) @@ -605,8 +642,38 @@ def build_group(): _sock(stuv, "Name").default_value = "UVMap" L(uvvec.outputs[0], _sock(stuv, "Value")) - shade = N("GeometryNodeSetShadeSmooth"); shade.location = (1650, 200) - L(_out(stuv, "Geometry"), _sock(shade, "Geometry")) + # ---------- optional: Aeste mit dem Stamm VERSCHMELZEN ---------- + # Voxel-Remesh (Mesh to Volume -> Volume to Mesh) macht aus den sich + # durchdringenden Roehren EINE organische Oberflaeche mit weichen Uebergaengen. + # ACHTUNG, ehrlicher Preis: der Remesh erzeugt komplett neue Topologie -> + # die UVs sind danach WEG und der Vert-Count steigt deutlich. Deshalb als + # Schalter (Merge = 0 laesst den schnellen, UV-tauglichen Pfad unberuehrt). + m2v = N("GeometryNodeMeshToVolume"); m2v.location = (1650, -200) + L(_out(stuv, "Geometry"), _sock(m2v, "Mesh")) + try: + _sock(m2v, "Resolution Mode").default_value = 'Size' + except Exception: + pass + L(V["Merge Voxel"], _sock(m2v, "Voxel Size")) + v2m = N("GeometryNodeVolumeToMesh"); v2m.location = (1820, -200) + L(_out(m2v, "Volume", "Geometry"), _sock(v2m, "Volume")) + try: + _sock(v2m, "Resolution Mode").default_value = 'Size' + except Exception: + pass + L(V["Merge Voxel"], _sock(v2m, "Voxel Size")) + + pick = N("GeometryNodeSwitch"); pick.location = (2000, 100) + pick.input_type = 'GEOMETRY' + mgt = N("ShaderNodeMath"); mgt.location = (1820, 60); mgt.operation = 'GREATER_THAN' + mgt.inputs[1].default_value = 0.5 + L(V["Merge"], mgt.inputs[0]) + L(mgt.outputs[0], _sock(pick, "Switch")) + L(_out(stuv, "Geometry"), _sock(pick, "False")) + L(_out(v2m, "Mesh", "Geometry"), _sock(pick, "True")) + + shade = N("GeometryNodeSetShadeSmooth"); shade.location = (2200, 200) + L(_out(pick, "Output"), _sock(shade, "Geometry")) L(_out(shade, "Geometry"), gout.inputs[0]) return ng