From 2c339b5d0c513497e2aa2d11f6a24e2332b23524 Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Thu, 6 Aug 2026 09:20:18 +0200 Subject: [PATCH] Tree Gen 1.31.0: LOD1-3 trugen die Standposition mit (aus UE gemeldet) Fehler: _origin_bottom_center backt zuerst die Weltmatrix ins Mesh und wendet DANN die Zentrierung an - zurueck gibt es aber nur die Zentrierung. Den Stufen 1-3 wurde nur diese aufgedrueckt, ihre Weltmatrix blieb ungebacken. Ergebnis: sie landeten bei MINUS der Standposition. Gemeldet fuer einen Baum bei x = 18 m, dessen LOD1-3 bei x = -1894 cm sassen - exakt die Standposition, in Zentimetern wegen FBX_SCALE_ALL. Jetzt backt jede Stufe erst ihre EIGENE Weltmatrix, dann kommt die gemeinsame Zentrierung aus LOD0. Warum der Test das nicht gefunden hat: er baute den Baum am URSPRUNG. Dort ist minus null eben null. Der Baum steht jetzt bewusst bei (18, -7.5), und je Stufe wird die X/Y-Mitte im reimportierten FBX gemessen - an derselben Stelle wie die Radialitaets-Pruefung. Gegenprobe gemacht: mit zurueckgedrehtem Fix meldet der Test LOD1-3 bei -17.87/7.46, also exakt minus der Standposition, und faellt mit 6 Fehlern durch. Mit Fix liegen alle Stufen bei 0.000-0.135 um den Ursprung. Ausserdem Dichte 170 -> 150. Grund: mit der REALEN Diamond-Card (6 Tris, nicht die 2-Tri-Attrappe aus meinen Sweeps) landet die Eiche bei Dichte 170 auf 4206 Tris - 2778 Krone plus 1428 Stamm - und damit ueber dem 4000er-Budget aus ASSETS.md Teil 6. Die abgenommene Krone (2778) und das dokumentierte Budget (4000) sind also nicht gleichzeitig haltbar. 150 liegt im abgesegneten Sweetspot 130-170 und haelt das Budget mit 3816. Wenn der Look bei 170 wichtiger ist, muesste das Budget auf ~4300 - das ist eine Entscheidung der Spielseite. Nebenbei: test_leaves hatte leaf_size fest auf 0.22 stehen (alter Blaettchen-Wert) und pruefte gegen ein fest verdrahtetes 2500er-Budget. Beides kommt jetzt aus den Einstellungen. 23 Tests bestehen. Co-Authored-By: Claude Opus 4.8 --- README.md | 11 +++- blender_manifest_tree.toml | 2 +- dist/index.html | 6 +-- dist/index.json | 8 +-- dist/stylized_tree_generator-1.30.0.zip | Bin 36830 -> 0 bytes dist/stylized_tree_generator-1.31.0.zip | Bin 0 -> 37196 bytes stylized_tree_generator.py | 27 +++++++--- tests/test_baum_lod.py | 67 ++++++++++++++++++------ tests/test_leaves.py | 16 ++++-- 9 files changed, 104 insertions(+), 33 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.30.0.zip create mode 100644 dist/stylized_tree_generator-1.31.0.zip diff --git a/README.md b/README.md index d17074f..71f76a6 100644 --- a/README.md +++ b/README.md @@ -395,7 +395,7 @@ gemessen und abgenommen: | | vorher | jetzt | Wirkung | |---|---|---|---| | Groesse | 0.22 | **0.85** | Bueschel statt Bonsai | -| Dichte | 500 | **170** | wenige grosse statt viele Fussel | +| Dichte | 500 | **150** | wenige grosse statt viele Fussel | | **Max Radius** | 0.02 | **0.04** | der Volumen-Hebel | | Kippung | 0.5 | **0.9** | Rotations-Chaos schliesst Sichtluecken | @@ -454,6 +454,15 @@ radial auf allen vier Stufen**. LOD3 traegt 16 % der Cards von LOD0. Der Ursprung kommt aus **LOD0** (Unreal platziert danach); alle Stufen werden um denselben Betrag verschoben, damit der Baum beim LOD-Wechsel nicht springt. + +> **Falle, aus UE gemeldet:** `_origin_bottom_center` backt zuerst die Weltmatrix +> ins Mesh und wendet **dann** die Zentrierung an — zurueck gibt es aber nur die +> Zentrierung. Wer den Stufen 1–3 nur diese aufdrueckt, laesst ihre Weltmatrix +> ungebacken: sie landen bei **minus der Standposition**. Gemessen an einem Baum +> bei x = 18 m: LOD1–3 bei x = −17.87. Bei einem Baum am Ursprung faellt das +> nicht auf, weil minus null eben null ist — genau deshalb steht der Baum im +> Test jetzt **bewusst nicht** am Ursprung, und die X/Y-Mitte wird je Stufe im +> reimportierten FBX gemessen. Das Decimate der Rinde laeuft **vor** dem Verschmelzen — danach wuerde es die Blatt-Cards mit einschmelzen, und eine halbe Card ist keine Card. diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index bfa9c34..0f61dd5 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.30.0" +version = "1.31.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 5d738c9..30d5d95 100644 --- a/dist/index.html +++ b/dist/index.html @@ -50,17 +50,17 @@ 34.1KB - stylized_tree_generator-1.30.0 + stylized_tree_generator-1.31.0 Stylized Tree Generator Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen link 4.2.0 - ~ all all - 36.0KB + 36.3KB -

Built 2026-08-06, 06:22

+

Built 2026-08-06, 07:20

diff --git a/dist/index.json b/dist/index.json index 92ad9d3..bc7bffa 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.30.0", + "version": "1.31.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -98,9 +98,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.30.0.zip", - "archive_size": 36830, - "archive_hash": "sha256:d54440c3d577440ff97b0415ef101801b0b7bf50b6df05e3645cc3d1e1eb15e5" + "archive_url": "./stylized_tree_generator-1.31.0.zip", + "archive_size": 37196, + "archive_hash": "sha256:2afb514c39d4378baa8885b53e117bb460987ac57178a826bc20cc8b1efd71b5" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.30.0.zip b/dist/stylized_tree_generator-1.30.0.zip deleted file mode 100644 index 42f2c20084408ebde3feeb17eb81886711e291b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36830 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 q`y)D1W)bLQP!}(qGoD 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 literal 0 HcmV?d00001 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index 996435a..9d609f8 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, 30, 0), + "version": (1, 31, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -1195,7 +1195,11 @@ LEAF_GROUP_NAME = "GN_TreeLeaves" # hingehoeren. Mit Bueschel-Atlanten liegen die Groessenordnungen bei # Size ~0.7 und Density ~90. LEAF_DEFAULTS = { - "Density": 170.0, # Punkte pro m2 Zweigoberflaeche + # 150 statt der zunaechst gemessenen 170: mit der REALEN Diamond-Card + # (6 Tris, nicht 2) landet die Eiche bei 170 auf 4206 Tris und damit ueber + # dem 4000er-Budget aus ASSETS.md Teil 6 - 2778 Krone plus 1428 Stamm. + # 150 liegt im abgesegneten Sweetspot 130-170 und haelt das Budget (3816). + "Density": 150.0, # Punkte pro m2 Zweigoberflaeche # DER Volumen-Hebel. Bei 0.02 trugen nur die aeussersten Zweigspitzen Laub - # die Krone hatte nur Kontur und war innen nackt. Bei 0.04 wachsen Bueschel # auch am mittleren Geaest und die Krone bekommt Tiefe. Am fertigen Baum in @@ -1861,7 +1865,7 @@ class TreeGenSettings(PropertyGroup): "damit mischt die Krone 4-6 Varianten statt einer"), ) leaf_density: FloatProperty( - name="Dichte", default=170.0, min=0.0, max=20000.0, + name="Dichte", default=150.0, min=0.0, max=20000.0, description=("Cards pro m2 Zweigoberflaeche. Presets mit viel Geaest (Eiche) " "bekommen dadurch automatisch mehr Blaetter als schlanke. 150 haelt " "auch die Eiche im 2500-Tri-Budget; der Button meldet die Summe"), @@ -2147,13 +2151,24 @@ class TREEGEN_OT_export_game(Operator): % (merge.name, mitte.x, mitte.y, mitte.z)) lods.append(merge) - # Ursprung aus LOD0 - Unreal platziert nach LOD0. Alle Stufen um - # denselben Betrag verschieben, damit sie deckungsgleich bleiben. + # Ursprung aus LOD0 - Unreal platziert nach LOD0. Alle Stufen + # bekommen DIESELBE Zentrierung, damit sie deckungsgleich bleiben. + # + # FALLE: _origin_bottom_center backt zuerst die Weltmatrix ins + # Mesh und wendet DANN die Zentrierung an - zurueck gibt es aber + # nur die Zentrierung. Wer den Stufen 1-3 nur diese aufdrueckt, + # laesst ihre Weltmatrix ungebacken: sie landen bei MINUS der + # Standposition. Gemeldet aus UE fuer einen Baum bei x = 18 m, + # dessen LOD1-3 bei x = -1894 cm sassen - exakt die + # Standposition, in Zentimetern wegen FBX_SCALE_ALL. + # Deshalb je Stufe erst die EIGENE Weltmatrix backen, dann die + # gemeinsame Zentrierung. versatz = _origin_bottom_center(lods[0]) for weitere in lods[1:]: - weitere.data.transform(versatz) + weitere.data.transform(weitere.matrix_world) weitere.matrix_basis = Matrix.Identity(4) weitere.matrix_parent_inverse = Matrix.Identity(4) + weitere.data.transform(versatz) _deselect(context) if s.generate_lods: diff --git a/tests/test_baum_lod.py b/tests/test_baum_lod.py index f9fbe3f..4b483c5 100644 --- a/tests/test_baum_lod.py +++ b/tests/test_baum_lod.py @@ -8,6 +8,12 @@ Gemessen wird am reimportierten FBX, und die Kugel-Normalen werden auf JEDER Stufe geprueft: LOD1-3 haben eine eigene Card-Verteilung, die Normalen muessen dazu passen. Nur LOD0 zu pruefen wuerde genau das verfehlen. +WICHTIG: Der Baum steht hier NICHT am Ursprung. Eine fruehere Fassung dieses +Tests baute ihn bei (0,0,0) - und ist damit an einem Fehler vorbeigelaufen, den +die Spielseite gefunden hat: LOD1-3 landeten bei MINUS der Standposition, weil +ihre Weltmatrix nie ins Mesh gebacken wurde. Bei x = 0 faellt das nicht auf, +weil minus null eben null ist. + Aufruf: blender --background --factory-startup --python tests/test_baum_lod.py """ import os @@ -53,11 +59,19 @@ 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] + +# Der Baum wird BEWUSST weit vom Ursprung gestellt - siehe Kopf der Datei. +STANDORT = (18.0, -7.5, 0.0) +baum.location = STANDORT for o in bpy.context.scene.objects: o.select_set(o is baum) bpy.context.view_layer.objects.active = baum s.leaf_card = card bpy.ops.object.treegen_leaves() +# Die Blattebene muss mit an die Standposition - sie folgt dem Stamm. +_bl = bpy.data.objects.get(baum.name + "_Leaf") +if _bl is not None: + _bl.location = STANDORT for o in bpy.context.scene.objects: o.select_set(o is baum) @@ -86,8 +100,11 @@ meshes = [o for o in bpy.context.scene.objects if o.type == 'MESH'] empties = [o for o in bpy.context.scene.objects if o.type == 'EMPTY'] stufen = sorted(meshes, key=lambda o: o.name) print("") -print("%-24s %7s %7s %7s %9s %s" - % ("Stufe", "Rinde", "Blatt", "Tris", "Radial", "Slots")) +print("Baum stand bei x=%.1f, y=%.1f - die Stufen muessen trotzdem um den " + "Ursprung liegen." % (STANDORT[0], STANDORT[1])) +print("") +print("%-24s %7s %7s %7s %9s %9s %9s" + % ("Stufe", "Rinde", "Blatt", "Tris", "Radial", "X-Mitte", "Y-Mitte")) if len(stufen) != len(tg.LOD_STUFEN): fails.append("%d LOD-Meshes, erwartet %d" % (len(stufen), len(tg.LOD_STUFEN))) @@ -96,6 +113,7 @@ if not empties: blatt_zahlen = [] rinde_zahlen = [] +spannen = [] for ob in stufen: m = ob.data rinde = sum(1 for p in m.polygons if p.material_index == 0) @@ -126,9 +144,18 @@ for ob in stufen: treffer += 1 quote = 100.0 * treffer / gesamt if gesamt else 0.0 - print("%-24s %7d %7d %7d %8.0f%% %s" - % (ob.name, rinde, laub, tris, quote, - [x.name if x else "-" for x in m.materials])) + # X/Y-Spanne dieser Stufe im FBX. Alle Stufen muessen deckungsgleich um + # den Ursprung liegen - eine verschobene Stufe waere in UE beim + # LOD-Wechsel schlagartig woanders. + co = [ob.matrix_world @ v.co for v in m.vertices] + lo = [min(c[i] for c in co) for i in range(3)] + hi = [max(c[i] for c in co) for i in range(3)] + xm = (lo[0] + hi[0]) * 0.5 + ym = (lo[1] + hi[1]) * 0.5 + spannen.append((ob.name, xm, ym, lo, hi)) + + print("%-24s %7d %7d %7d %8.0f%% %9.3f %9.3f" + % (ob.name, rinde, laub, tris, quote, xm, ym)) if len(m.materials) != 2: fails.append("%s: %d Slots, erwartet 2" % (ob.name, len(m.materials))) @@ -160,18 +187,28 @@ if blatt_zahlen and blatt_zahlen[0] > 0: "teuer" % anteil) # --- Alle Stufen deckungsgleich am Ursprung ------------------------------ -for ob in stufen: - co = [ob.matrix_world @ v.co for v in ob.data.vertices] - lo = [min(c[i] for c in co) for i in range(3)] - hi = [max(c[i] for c in co) for i in range(3)] - if abs((lo[0] + hi[0]) * 0.5) > 0.25 or abs((lo[1] + hi[1]) * 0.5) > 0.25: - fails.append("%s: Bbox nicht zentriert (%.2f/%.2f)" - % (ob.name, (lo[0] + hi[0]) * 0.5, (lo[1] + hi[1]) * 0.5)) - # Die Stufen muessen auf derselben Hoehe stehen - sonst springt der Baum - # beim LOD-Wechsel. +# Das ist der Test fuer den aus UE gemeldeten Fehler: LOD1-3 sassen bei MINUS +# der Standposition, weil ihre Weltmatrix nie ins Mesh gebacken wurde. +print("") +for name, xm, ym, lo, hi in spannen: + if abs(xm) > 0.25 or abs(ym) > 0.25: + fails.append("%s: Mitte bei %.2f/%.2f statt am Ursprung - die Stufe " + "traegt die Standposition des Baums (%.1f/%.1f) mit" + % (name, xm, ym, STANDORT[0], STANDORT[1])) if abs(lo[2]) > 0.15: fails.append("%s: steht %.3f m ueber/unter dem Ursprung - der Baum " - "wuerde beim LOD-Wechsel springen" % (ob.name, lo[2])) + "wuerde beim LOD-Wechsel springen" % (name, lo[2])) + +# Und die Stufen muessen ZUEINANDER passen, nicht nur je einzeln zum Ursprung. +if len(spannen) > 1: + _, x0, y0, lo0, hi0 = spannen[0] + for name, xm, ym, lo, hi in spannen[1:]: + if abs(xm - x0) > 0.30 or abs(ym - y0) > 0.30: + fails.append("%s liegt %.2f/%.2f neben LOD0 - beim LOD-Wechsel " + "wuerde der Baum springen" % (name, xm - x0, ym - y0)) + print("Versatz zu LOD0: %s" + % ", ".join("%s %.3f/%.3f" % (n.split("_")[-1], x - x0, y - y0) + for n, x, y, _, _ in spannen[1:])) print("") if fails: diff --git a/tests/test_leaves.py b/tests/test_leaves.py index c3c877e..cbd0483 100644 --- a/tests/test_leaves.py +++ b/tests/test_leaves.py @@ -29,7 +29,11 @@ card=bpy.data.objects.new("Diamon Plane", me); bpy.context.collection.objects.li s=bpy.context.scene.tree_gen_settings s.preset='eiche'; s.art_name="Eiche"; s.variant=1 -s.leaf_card=card; s.leaf_size=0.22 # Dichte: Default verwenden +# Groesse und Dichte aus den Defaults nehmen. Frueher stand hier fest +# leaf_size=0.22 - der alte Blaettchen-Wert. Zusammen mit der neuen Dichte 170 +# ergab das genau die Kombination, die wir loswerden wollten: hunderte winziger +# Cards (gemessen 2778 Blatt-Tris statt ~1000). +s.leaf_card=card s.make_leaf=True; s.use_growth=False r=bpy.ops.object.treegen_create() names=sorted(o.name for o in bpy.context.scene.objects if o.type=='MESH') @@ -41,9 +45,15 @@ def tris(n): ob=bpy.context.scene.objects[n] return sum(len(p.vertices)-2 for p in ob.evaluated_get(dg).data.polygons) tt,tl=tris("Eiche_01"), tris("Eiche_01_Leaf") -print("TRIS Stamm=%d Blatt=%d Summe=%d / 2500 %s (Dichte %.0f)" % (tt,tl,tt+tl,"OK" if tt+tl<=2500 else "UEBER", s.leaf_density)) +# Budget aus den Einstellungen holen, nicht fest verdrahten: es steht seit +# ASSETS.md Teil 6 pro Wachstumsstufe (S1 800 / S2 1200 / S3+S4 4000) und wurde +# von 2500 angehoben, weil bei ISM-Instanzen mit LOD-Kette nicht die Dreiecke +# der Engpass sind, sondern Overdraw und Schatten der Cards. +budget = s.leaf_budget +print("TRIS Stamm=%d Blatt=%d Summe=%d / %d %s (Dichte %.0f)" + % (tt,tl,tt+tl,budget,"OK" if tt+tl<=budget else "UEBER", s.leaf_density)) if tl==0: fails.append("blattwerk_leer") -if tt+tl>2500: fails.append("budget") +if tt+tl>budget: fails.append("budget") # Ursprung deckungsgleich a=bpy.context.scene.objects["Eiche_01"]; b=bpy.context.scene.objects["Eiche_01_Leaf"] d=(a.location-b.location).length