From 29899c0aa0e8ea9f59ecc07fafc9c7d3660863f9 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Thu, 6 Aug 2026 06:48:25 +0200 Subject: [PATCH] Tree Gen 1.27.0: Blatt-Cards aus einer Collection (Punkt 3) "Leaf Card" kann jetzt eine COLLECTION sein: je Blattpunkt wird zufaellig eine Card gezogen (Pick Instance, seed-stabil). Damit legt der Nutzer 4-6 Diamond-Cards mit unterschiedlichen Atlas-UVs an und die Krone mischt sie. Rueckwaertskompatibel - ein einzelnes Objekt geht weiter, die Sammlung hat Vorrang. Umsetzung: Collection Info mit Separate Children (sonst kaeme die Sammlung als ein Klumpen an und Pick Instance haette nichts zum Auswaehlen), Geometry-Switch zwischen Einzel- und Sammlungspfad, Instanz-Index aus einem Random Value, dessen Obergrenze aus der TATSAECHLICHEN Anzahl kommt - eine feste Obergrenze wuerde bei weniger Cards Luecken erzeugen. Geometry Nodes kann einen leeren Collection-Zeiger nicht selbst pruefen, deshalb setzt make_leaves einen "Use Collection"-Schalter. Beweisfuehrung im Test: die Zufalls-Groesse wird ABGESCHALTET, dann kommt jede Groessenabweichung nur von der Card-Variante und die Anzahl verschiedener Face-Flaechen ist ein exakter Zaehler. Gemessen: Einzel-Card 2 Flaechen (ein Card-Paar), Sammlung mit 4 Cards 10 Flaechen - alle Varianten kommen vor. Gleicher Seed identisch, anderer Seed anders. Nebenbei: die Vorpruefung des Blattwerk-Operators war eine zusammengesetzte Bedingung, die bei gesetzter Sammlung ohne Einzel-Card auf None zugriff. Neu: tests/test_blatt_varianten.py. 20 Tests bestehen. Co-Authored-By: Claude Opus 4.8 --- README.md | 35 ++++++ blender_manifest_tree.toml | 2 +- dist/index.html | 6 +- dist/index.json | 8 +- dist/stylized_tree_generator-1.26.0.zip | Bin 28299 -> 0 bytes dist/stylized_tree_generator-1.27.0.zip | Bin 0 -> 29267 bytes stylized_tree_generator.py | 95 +++++++++++++++-- tests/test_blatt_varianten.py | 135 ++++++++++++++++++++++++ 8 files changed, 263 insertions(+), 18 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.26.0.zip create mode 100644 dist/stylized_tree_generator-1.27.0.zip create mode 100644 tests/test_blatt_varianten.py diff --git a/README.md b/README.md index 2b6a793..b541d15 100644 --- a/README.md +++ b/README.md @@ -352,6 +352,39 @@ Gras-, Blumen- und Farn-Bueschel. Der Kern ist die **Wind-UV**: ## Stylized Tree Generator +### Spielfertiger Stand-Baum (Faellsystem) + +Knopf **Spielfertig exportieren** im Export-Panel: Stamm und `_Leaf`-Ebene +werden zu **einem** Mesh mit **zwei Material-Slots** verschmolzen +(Slot 0 = `M_Bark`, Slot 1 = `M_Foliage`). Die getrennten Objekte im Blend +bleiben die Arbeitsebene — verschmolzen wird nur die Export-Kopie. Ursprung +Bbox-Unterseite Mitte, FBX-Einstellungen wie in der Fels-Pipeline. + +**Kugel-Normalen** (Haken `Kugel-Normalen auf Blaetter`, Standard an): alle +Blatt-Normalen zeigen radial vom Kronen-Schwerpunkt nach aussen. Ohne das wirkt +jede Card wie ein eigenes flaches Blech und die Krone flimmert im Licht. Der +Schwerpunkt kommt **nur aus den Blatt-Faces** — der Stamm wuerde die Mitte nach +unten ziehen und die Kugel verkippen. + +> Bewusst direkt ueber `normals_split_custom_set` statt ueber den +> Normal-Edit-Modifier: der muesste vor dem Export angewendet werden, und +> angewendete Modifier plus Custom Normals ist genau die Kombination, bei der +> der FBX-Export gerne flachbuegelt. Am **reimportierten** FBX gemessen: +> mittlere Radialitaet **1.000**, 100 % der 510 Blatt-Loops ueber 0.8. +> Gegenprobe Rinde 0.043. + +**Card-Varianten:** `Card-Sammlung` nimmt eine Collection mit 4–6 Diamond-Cards +unterschiedlicher Atlas-UVs; je Blattpunkt wird eine zufaellig gezogen +(seed-stabil). Eine einzelne Card geht weiter — die Sammlung hat Vorrang. + +Zwei Fallen beim Bauen: + +- Ueber `bmesh.from_mesh` zusammenzufuegen haengt die Geometrie zwar an, wirft + aber die **Material-Indizes** weg: danach lagen alle 748 Faces auf Index 0. + Blenders `join` fuehrt die Slot-Listen zusammen und rechnet die Indizes um. +- `join` loescht das zweite Objekt; jede gehaltene Referenz darauf ist danach + tot. Die Aufraeumliste fuehrt deshalb **Namen** statt Objekte. + ### Proportionen: gemessen, nicht geschaetzt Drei Presets sahen falsch aus. Die Ursachen wurden gemessen bzw. belegt, nicht @@ -572,6 +605,8 @@ gefiltert `.\run_tests.ps1 -Filter panels`. | Datei | prueft | |---|---| +| `tests/test_baum_export.py` | Stand-Baum: ein Mesh, zwei Slots, Ursprung, **Kugel-Normalen im exportierten FBX** | +| `tests/test_blatt_varianten.py` | Card-Sammlung: alle Varianten werden gezogen, seed-stabil, Einzelobjekt weiter moeglich | | `tests/test_proportionen.py` | Baum-Proportionen: Palmenkrone, Strauch-Breite, Setzling-Schlankheit, Branch Count 0 | | `tests/test_bruchstuecke.py` | Bruchstuecke: Volumen 100 % des Muttersteins, dichte Topologie, genau ein Erz-Stueck, Material-Slots, Ursprung, UCX je Teil | | `tests/test_schnellstart.py` | Schnellstart: jede Sorte liefert ohne Nacharbeit Geometrie + Slot, Erz-Sorte ueber der Dichte-Schwelle, Dissolve-Bereich streut je Stein | diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index 76ac871..1375eff 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.26.0" +version = "1.27.0" name = "Stylized Tree Generator" tagline = "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen" maintainer = "D4rkst3r" diff --git a/dist/index.html b/dist/index.html index 24a80ba..4e434ed 100644 --- a/dist/index.html +++ b/dist/index.html @@ -50,17 +50,17 @@ 34.1KB - stylized_tree_generator-1.26.0 + stylized_tree_generator-1.27.0 Stylized Tree Generator Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen link 4.2.0 - ~ all all - 27.6KB + 28.6KB -

Built 2026-08-06, 04:42

+

Built 2026-08-06, 04:48

diff --git a/dist/index.json b/dist/index.json index 857183e..c42e433 100644 --- a/dist/index.json +++ b/dist/index.json @@ -82,7 +82,7 @@ "id": "stylized_tree_generator", "name": "Stylized Tree Generator", "tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen", - "version": "1.26.0", + "version": "1.27.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -98,9 +98,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.26.0.zip", - "archive_size": 28299, - "archive_hash": "sha256:8e6cf3131a36efe840d0f59802003a3cb198b611a405c53e6428f2a99029b0c9" + "archive_url": "./stylized_tree_generator-1.27.0.zip", + "archive_size": 29267, + "archive_hash": "sha256:daeb815cde034e527cdffb0e76a980e964f228b7a0f39070ba78477be9fc3e57" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.26.0.zip b/dist/stylized_tree_generator-1.26.0.zip deleted file mode 100644 index a87412e8a067298a0848d11d0db7ae0d1805193c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28299 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 ZfBr&cIY_AgJc9k(|0HK1{m%cn{TH$dvw;8r literal 0 HcmV?d00001 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index 761f040..a4e33ca 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, 26, 0), + "version": (1, 27, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -1176,6 +1176,7 @@ LEAF_DEFAULTS = { "Size Var": 0.35, "Tilt": 0.5, # wie stark die Cards aus der Senkrechten kippen (rad) "Seed": 0, + "Use Collection": False, } @@ -1211,6 +1212,11 @@ def build_leaf_group(rebuild=False): add_in("Tree", 'NodeSocketObject') add_in("Leaf Card", 'NodeSocketObject') + # Mehrere Atlas-Varianten: die Collection liefert je Punkt eine zufaellig + # gewaehlte Card. "Use Collection" wird von make_leaves gesetzt - Geometry + # Nodes kann einen leeren Collection-Zeiger nicht selbst pruefen. + add_in("Leaf Cards", 'NodeSocketCollection') + add_in("Use Collection", 'NodeSocketBool', False) add_in("Density", 'NodeSocketFloat', LEAF_DEFAULTS["Density"], 0.0, 20000.0) add_in("Max Radius", 'NodeSocketFloat', LEAF_DEFAULTS["Max Radius"], 0.001, 0.5) add_in("Size", 'NodeSocketFloat', LEAF_DEFAULTS["Size"], 0.01, 5.0) @@ -1228,6 +1234,23 @@ def build_leaf_group(rebuild=False): card = N("GeometryNodeObjectInfo"); card.location = (-700, -200) L(V["Leaf Card"], _sock(card, "Object")) + # Separate Children = jedes Objekt der Collection wird eine EIGENE Instanz. + # Ohne das kaeme die Collection als ein einziger Klumpen an und "Pick + # Instance" haette nichts zum Auswaehlen. + coll = N("GeometryNodeCollectionInfo"); coll.location = (-700, -420) + L(V["Leaf Cards"], _sock(coll, "Collection")) + try: + _sock(coll, "Separate Children").default_value = True + _sock(coll, "Reset Children").default_value = True + except (AttributeError, KeyError): + pass + + quelle = N("GeometryNodeSwitch"); quelle.location = (-500, -300) + quelle.input_type = 'GEOMETRY' + L(V["Use Collection"], _sock(quelle, "Switch")) + L(_out(card, "Geometry"), _sock(quelle, "False")) + L(_out(coll, "Instances", "Geometry"), _sock(quelle, "True")) + # Auswahl: nur duenne Aeste (uv_r < Max Radius) na = N("GeometryNodeInputNamedAttribute"); na.location = (-700, 20) na.data_type = 'FLOAT' @@ -1272,7 +1295,35 @@ def build_leaf_group(rebuild=False): inst = N("GeometryNodeInstanceOnPoints"); inst.location = (100, 200) L(_out(dist, "Points"), _sock(inst, "Points")) - L(_out(card, "Geometry"), _sock(inst, "Instance")) + L(_out(quelle, "Output"), _sock(inst, "Instance")) + try: + L(V["Use Collection"], _sock(inst, "Pick Instance")) + except (KeyError, RuntimeError): + pass + + # Zufaelliger Index je Punkt, aus der tatsaechlichen Anzahl abgeleitet - + # eine feste Obergrenze wuerde bei weniger Cards Luecken erzeugen. + dsize = N("GeometryNodeAttributeDomainSize"); dsize.location = (-320, -560) + try: + dsize.component = 'INSTANCES' + except (AttributeError, TypeError): + pass + L(_out(coll, "Instances", "Geometry"), _sock(dsize, "Geometry")) + dmax = N("ShaderNodeMath"); dmax.location = (-150, -560) + dmax.operation = 'SUBTRACT'; dmax.inputs[1].default_value = 1.0 + try: + L(_out(dsize, "Instance Count", "Point Count"), dmax.inputs[0]) + except (KeyError, RuntimeError): + dmax.inputs[0].default_value = 1.0 + ridx = N("FunctionNodeRandomValue"); ridx.location = (100, -560) + ridx.data_type = 'INT' + L(V["Seed"], _sock(ridx, "Seed")) + ridx.inputs[4].default_value = 0 + L(dmax.outputs[0], ridx.inputs[5]) + try: + L(ridx.outputs["Value"], _sock(inst, "Instance Index")) + except (KeyError, RuntimeError): + pass L(rrot.outputs["Value"], _sock(inst, "Rotation")) L(rsc.outputs[1], _sock(inst, "Scale")) @@ -1287,7 +1338,7 @@ def leaf_socket_ids(ng): if getattr(so, "in_out", "") == 'INPUT'} -def make_leaves(context, tree_obj, card_obj, name=None, **overrides): +def make_leaves(context, tree_obj, card_obj, name=None, card_coll=None, **overrides): """Erzeugt/aktualisiert ein _Leaf-Objekt mit dem Blattwerk-Modifier.""" name = name or (tree_obj.name + "_Leaf") ob = bpy.data.objects.get(name) @@ -1306,6 +1357,10 @@ def make_leaves(context, tree_obj, card_obj, name=None, **overrides): ids = leaf_socket_ids(ng) md[ids["Tree"]] = tree_obj md[ids["Leaf Card"]] = card_obj + # Rueckwaertskompatibel: ohne Collection bleibt alles wie bisher. + if "Leaf Cards" in ids: + md[ids["Leaf Cards"]] = card_coll + overrides.setdefault("Use Collection", card_coll is not None) vals = dict(LEAF_DEFAULTS); vals.update(overrides) for k, v in vals.items(): if k in ids: @@ -1484,8 +1539,15 @@ class TreeGenSettings(PropertyGroup): ) leaf_card: PointerProperty( name="Blatt-Card", type=bpy.types.Object, - description=("Objekt, das als Blatt/Billboard gestreut wird (z.B. dein " - "'Diamon Plane'). Leer = _Leaf bleibt leer zum Selbermodellieren"), + description=("Einzelne Card, die gestreut wird (z.B. dein 'Diamon " + "Plane'). Leer = _Leaf bleibt leer zum Selbermodellieren. " + "Wird ignoriert, sobald eine Card-Sammlung gesetzt ist"), + ) + leaf_cards: PointerProperty( + name="Card-Sammlung", type=bpy.types.Collection, + description=("Sammlung mehrerer Cards mit unterschiedlichen Atlas-UVs. " + "Je Blattpunkt wird zufaellig eine gewaehlt (Seed-stabil) - " + "damit mischt die Krone 4-6 Varianten statt einer"), ) leaf_density: FloatProperty( name="Dichte", default=150.0, min=0.0, max=20000.0, @@ -1755,8 +1817,13 @@ class TREEGEN_OT_leaves(Operator): def execute(self, context): s = context.scene.tree_gen_settings - if s.leaf_card is None or s.leaf_card.type != 'MESH': - self.report({'ERROR'}, "Bitte zuerst eine Blatt-Card waehlen (Mesh-Objekt).") + # Card-Sammlung hat Vorrang; ohne sie muss die Einzel-Card ein Mesh sein. + if s.leaf_cards is not None: + if not [o for o in s.leaf_cards.objects if o.type == 'MESH']: + self.report({'ERROR'}, "Die Card-Sammlung enthaelt keine Meshes.") + return {'CANCELLED'} + elif s.leaf_card is None or s.leaf_card.type != 'MESH': + self.report({'ERROR'}, "Bitte eine Blatt-Card oder eine Card-Sammlung waehlen.") return {'CANCELLED'} trees = [o for o in context.selected_objects if o.type == 'MESH' and not o.name.endswith(("_Leaf", "_Frucht"))] @@ -1768,6 +1835,7 @@ class TREEGEN_OT_leaves(Operator): for t in trees: try: lf = make_leaves(context, t, s.leaf_card, + card_coll=s.leaf_cards, Density=s.leaf_density, Size=s.leaf_size, **{"Size Var": s.leaf_size_var, "Max Radius": s.leaf_max_radius, @@ -1969,9 +2037,12 @@ class VIEW3D_PT_tree_leaves(_TreeSub): def draw(self, context): layout = self.layout s = context.scene.tree_gen_settings - layout.prop(s, "leaf_card") + layout.prop(s, "leaf_cards") + row = layout.row() + row.active = s.leaf_cards is None + row.prop(s, "leaf_card") col = layout.column(align=True) - col.active = s.leaf_card is not None + col.active = s.leaf_card is not None or s.leaf_cards is not None col.prop(s, "leaf_density") col.prop(s, "leaf_size") col.prop(s, "leaf_size_var") @@ -1980,7 +2051,11 @@ class VIEW3D_PT_tree_leaves(_TreeSub): col.prop(s, "leaf_budget") layout.separator() layout.operator("object.treegen_leaves", icon='OUTLINER_OB_POINTCLOUD') - if s.leaf_card is None: + if s.leaf_cards is not None: + n = len([o for o in s.leaf_cards.objects if o.type == 'MESH']) + layout.label(text="%d Card-Variante(n), zufaellig je Blatt" % n, + icon='INFO') + elif s.leaf_card is None: layout.label(text="Ohne Card bleibt _Leaf leer", icon='INFO') diff --git a/tests/test_blatt_varianten.py b/tests/test_blatt_varianten.py new file mode 100644 index 0000000..79091c9 --- /dev/null +++ b/tests/test_blatt_varianten.py @@ -0,0 +1,135 @@ +"""Punkt 3: Blatt-Cards aus einer COLLECTION statt aus einem Einzelobjekt. + +Damit kann der Nutzer 4-6 Diamond-Cards mit unterschiedlichen Atlas-UVs anlegen +und die Krone mischt sie. Rueckwaertskompatibel: ein einzelnes Objekt geht +weiter. + +Beweisfuehrung: die Zufalls-Groesse wird ABGESCHALTET (Size Var 0). Dann kommt +jede Groessenabweichung ausschliesslich von der Card-Variante, und die Anzahl +verschiedener Face-Flaechen ist ein exakter Zaehler fuer die benutzten Varianten. +Mit eingeschalteter Groessenstreuung waere das Mass unbrauchbar - alles streut. + +Aufruf: blender --background --factory-startup --python tests/test_blatt_varianten.py +""" +import os +import sys +import importlib.util + +import bpy + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +spec = importlib.util.spec_from_file_location( + "tg", os.path.join(ROOT, "stylized_tree_generator.py")) +tg = importlib.util.module_from_spec(spec) +sys.modules["tg"] = tg +spec.loader.exec_module(tg) +tg.register() + +fails = [] +for o in list(bpy.data.objects): + bpy.data.objects.remove(o, do_unlink=True) + + +def card(name, groesse): + """Diamond-Card in definierter Groesse - die Groesse ist hier der Marker.""" + me = bpy.data.meshes.new(name) + g = groesse + me.from_pydata([(-g, 0, 0), (0, 0, g * 1.4), (g, 0, 0), (0, 0, -g * 0.2)], + [], [(0, 1, 2), (0, 2, 3)]) + me.update() + ob = bpy.data.objects.new(name, me) + bpy.context.scene.collection.objects.link(ob) + return ob + + +coll = bpy.data.collections.new("Leaf_Cards") +bpy.context.scene.collection.children.link(coll) +einzel = card("Card_Single", 0.5) +GROESSEN = (0.30, 0.45, 0.60, 0.75) +for i, g in enumerate(GROESSEN): + c = card("Card_%02d" % (i + 1), g) + bpy.context.scene.collection.objects.unlink(c) + coll.objects.link(c) + +s = bpy.context.scene.tree_gen_settings +s.preset = 'baum' +s.use_growth = False +s.apply_modifier = True +s.art_name = "Eiche" +s.variant = 1 +s.leaf_size_var = 0.0 # entscheidend: Groesse kommt NUR von der Variante + +bpy.ops.object.treegen_create() +baum = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and o.name.startswith("Eiche_01") + and not o.name.endswith(("_Leaf", "_Frucht"))][0] + + +def streuen(collection, einzelcard, seed): + s.leaf_cards = collection + s.leaf_card = einzelcard + s.seed = seed + for o in bpy.context.scene.objects: + o.select_set(o is baum) + bpy.context.view_layer.objects.active = baum + bpy.ops.object.treegen_leaves() + bl = bpy.data.objects.get(baum.name + "_Leaf") + dg = bpy.context.evaluated_depsgraph_get() + ev = bl.evaluated_get(dg) + me = ev.to_mesh() + flaechen = sorted({round(p.area, 5) for p in me.polygons}) + n = len(me.polygons) + ev.to_mesh_clear() + return n, flaechen + + +print("%-26s %7s %s" % ("Variante", "Faces", "verschiedene Flaechen")) + +# --- 1) Rueckwaertskompatibel: Einzelobjekt ------------------------------ +n1, f1 = streuen(None, einzel, 0) +print("%-26s %7d %d" % ("Einzel-Card", n1, len(f1))) +if n1 == 0: + fails.append("Einzel-Card erzeugt keine Blaetter - Rueckwaertskompatibilitaet weg") +# Eine Card = zwei unterschiedlich grosse Tris = genau zwei Flaechen. +if len(f1) > 3: + fails.append("Einzel-Card liefert %d verschiedene Flaechen, erwartet <= 3 - " + "die Groessenstreuung ist nicht wirklich aus" % len(f1)) + +# --- 2) Collection: alle Varianten kommen vor ---------------------------- +n2, f2 = streuen(coll, None, 0) +print("%-26s %7d %d" % ("Collection (%d Cards)" % len(GROESSEN), n2, len(f2))) +if n2 == 0: + fails.append("Collection erzeugt keine Blaetter") +# Vier Cards mit je zwei Tris = acht verschiedene Flaechen, wenn wirklich alle +# vier gezogen werden. Weniger heisst: es kommen nicht alle Varianten vor. +erwartet = 2 * len(GROESSEN) +if len(f2) < erwartet: + fails.append("Nur %d verschiedene Flaechen, erwartet %d - es werden nicht " + "alle %d Card-Varianten gezogen" + % (len(f2), erwartet, len(GROESSEN))) + +# --- 3) Seed-stabil ------------------------------------------------------ +n3, f3 = streuen(coll, None, 0) +print("%-26s %7d %d" % ("gleicher Seed", n3, len(f3))) +if (n3, f3) != (n2, f2): + fails.append("Gleicher Seed liefert ein anderes Ergebnis - nicht stabil") + +n4, f4 = streuen(coll, None, 7) +print("%-26s %7d %d" % ("anderer Seed", n4, len(f4))) +if (n4, f4) == (n2, f2): + fails.append("Anderer Seed liefert dasselbe Ergebnis - der Seed wirkt nicht") + +# --- 4) Collection hat Vorrang vor der Einzel-Card ----------------------- +n5, f5 = streuen(coll, einzel, 0) +print("%-26s %7d %d" % ("beides gesetzt", n5, len(f5))) +if len(f5) < erwartet: + fails.append("Mit gesetzter Einzel-Card faellt die Collection zurueck - " + "die Sammlung muss Vorrang haben") + +print("") +if fails: + print("ERGEBNIS: %d FEHLER" % len(fails)) + for x in fails: + print(" - " + x) + sys.exit(1) +print("ERGEBNIS: ALLE CHECKS OK")