From ae7806e082a2a9d30bd519a4b74bf8f7954d748d Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Fri, 7 Aug 2026 06:18:29 +0200 Subject: [PATCH] Tree Gen 1.42.0: UCX-Stammhuelle im Spielfertig-Export Die Stand-Baeume bekommen eine konvexe Kollisionshuelle um den STAMM, vom Fuss bis zum Kronenansatz - keine Kronen-Huelle: gegen die liefe der Spieler, bevor er den Baum beruehrt. Die Trennung kommt aus ast_id (0 = Stamm), dasselbe Attribut wie beim Ursprung und bei den Faell-Teilen. Kronenansatz = tiefster Punkt mit ast_id > 0 plus ein Zehntel Stammhoehe Luft (der tiefste Astpunkt kann eine herabgebogene Spitze sein). Ohne Aeste ist die ganze Pflanze Stamm - beim Kaktus genau richtig. Name und Hierarchie sind NICHT geraten, sondern am Fels-Export nachgemessen, der in der Pipeline schon abgenommen ist: UCX_, als GESCHWISTER des LodGroup-Empty. Ein Kind der Gruppe wuerde Unreal als LOD-Stufe lesen. Zwei Befunde aus der Messung: - Die Huelle rutschte 4-6 cm UNTER den Boden. Das Vereinfachen auf 12 Verts schneidet Ecken ab, das anschliessende Aufblasen skaliert um die Huellenmitte und schiebt dabei die Unterseite nach unten. Im Spiel waere das eine Kollision, die aus dem Terrain ragt. Boden wird jetzt auf Z = 0 geklemmt. - Der erste Anlauf des Tests holte die FBX-Skala aus der Gesamthoehe - die Blatt-Cards ragen ueber die Rinde hinaus, die Skala kam zu gross heraus und die Huelle sah zu klein aus. Massstab kommt jetzt aus Material-Slot 0. Neu: tests/test_stamm_ucx.py, vier Faelle (gerader Stamm, krummer Stamm mit Bend 1.5, Obstbaum, einmal ohne LODs), gemessen im reimportierten FBX. Gegenprobe ohne Boden-Klemmung: vier Fehler. test_baum_export, test_baum_lod und test_ursprung zaehlten die Huelle als Render-Mesh mit und schlugen zu Recht an - sie filtern jetzt UCX_. Schalter im Export-Panel: "UCX-Stammhuelle" (an) + max. Verts (12). 27 Tests bestehen. Co-Authored-By: Claude Opus 4.8 --- README.md | 48 ++++++ blender_manifest_tree.toml | 2 +- dist/index.html | 6 +- dist/index.json | 8 +- dist/stylized_tree_generator-1.41.0.zip | Bin 47402 -> 0 bytes dist/stylized_tree_generator-1.42.0.zip | Bin 0 -> 48711 bytes stylized_tree_generator.py | 110 ++++++++++++- tests/test_baum_export.py | 4 +- tests/test_baum_lod.py | 4 +- tests/test_stamm_ucx.py | 200 ++++++++++++++++++++++++ tests/test_ursprung.py | 4 +- 11 files changed, 369 insertions(+), 17 deletions(-) delete mode 100644 dist/stylized_tree_generator-1.41.0.zip create mode 100644 dist/stylized_tree_generator-1.42.0.zip create mode 100644 tests/test_stamm_ucx.py diff --git a/README.md b/README.md index 9d0110b..3e645d8 100644 --- a/README.md +++ b/README.md @@ -563,6 +563,54 @@ Der Kaktus erzeugt regulaer **0 Cards** — kein Ast ist duenner als `Max Radius und das ist botanisch richtig. Vorher lief das still durch und man stand vor einer leeren `_Leaf`-Ebene; jetzt sagt der Operator es und nennt den Regler. +### Stamm-UCX fuer den Stand-Baum + +Die Stand-Baeume bekommen eine konvexe Kollisionshuelle um den **Stamm**, vom +Fuss bis zum Kronenansatz. Bewusst keine Kronen-Huelle: gegen die liefe der +Spieler, bevor er den Baum ueberhaupt beruehrt. + +Die Trennung kommt aus `ast_id` (0 = Stamm) - dasselbe Attribut wie beim +Ursprung und bei den Faell-Teilen. Kronenansatz ist der tiefste Punkt mit +ast_id > 0, plus ein Zehntel Stammhoehe Luft, weil der tiefste Astpunkt eine +herabgebogene Spitze sein kann. Ohne Aeste (Kaktus-Setzling) ist die ganze +Pflanze Stamm - und genau die soll dann die Kollision sein. + +**Name und Hierarchie sind nicht geraten, sondern vom Fels-Export abgeschaut**, +der in der Spiel-Pipeline schon abgenommen ist: dort exportiert eine LOD-Gruppe +als `UCX_`, und zwar als GESCHWISTER des LodGroup-Empty, nicht +als Kind - Unreal liest jedes Kind der Gruppe als LOD-Stufe. Nachgemessen im +Fels-FBX, bevor eine Zeile Baum-Code entstand. + +Ergebnis im reimportierten Baum-FBX: + +``` +Eiche_01_LOD0..3 MESH parent = Eiche_01_LODGroup +Eiche_01_LODGroup EMPTY parent = - +UCX_Eiche_01_LODGroup MESH parent = - 12 Verts +``` + +Zwei Dinge, die erst die Messung gezeigt hat: + +* Die Huelle rutschte **4-6 cm unter den Boden**. Das Vereinfachen auf 12 Verts + schneidet Ecken ab, und das anschliessende Aufblasen (damit wieder alles + hineinpasst) skaliert um die Huellenmitte - dabei wandert die Unterseite nach + unten. Im Spiel waere das eine Kollision, die aus dem Terrain herausragt. + Jetzt wird der Boden auf Z = 0 geklemmt. +* Der erste Anlauf des Tests rechnete die FBX-Skala aus der **Gesamthoehe** + zurueck - die Blatt-Cards ragen aber ueber die Rinde hinaus, die Skala kam zu + gross heraus und die Huelle sah zu klein aus. Jetzt kommt der Massstab aus + Material-Slot 0. Ein Massstab, der etwas anderes misst als die Referenz, + verschiebt jede Aussage. + +`tests/test_stamm_ucx.py` prueft an vier Faellen (gerader Stamm, krummer Stamm +mit Bend 1.5, Obstbaum, und einmal ohne LODs): genau eine Huelle, richtiger +Name, kein Elternteil, 8-24 Verts, Radius zwischen Stammradius und dem +2.5-fachen davon, Fuss auf Z = 0, Hoehe nicht ueber den Kronenansatz hinaus. +Gegenprobe ohne die Boden-Klemmung: vier Fehler. + +Drei bestehende Tests zaehlten die Huelle als Render-Mesh mit und schlugen zu +Recht an - sie filtern jetzt `UCX_`. + ### Vom Trichter ueber die Haube zur Kugel Zielbild ist der **Lollipop** der stilisierten Vektor-Illustration: kurzer diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index 192fc24..9008dab 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.41.0" +version = "1.42.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 81e469e..dc287cb 100644 --- a/dist/index.html +++ b/dist/index.html @@ -50,17 +50,17 @@ 34.1KB - stylized_tree_generator-1.41.0 + stylized_tree_generator-1.42.0 Stylized Tree Generator Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen link 4.2.0 - ~ all all - 46.3KB + 47.6KB -

Built 2026-08-06, 13:04

+

Built 2026-08-07, 04:18

diff --git a/dist/index.json b/dist/index.json index 24ec862..1ff78fc 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.41.0", + "version": "1.42.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -98,9 +98,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.41.0.zip", - "archive_size": 47402, - "archive_hash": "sha256:c5d5c612fd723af6c1e226ce0ca42cf6d28298641ec5af77bb12223ebd6935c6" + "archive_url": "./stylized_tree_generator-1.42.0.zip", + "archive_size": 48711, + "archive_hash": "sha256:e1b5eb8cb83ecabb60d24ce9c6be75be4c3d168aee86b9a3baa2856bdf440e80" } ] } \ No newline at end of file diff --git a/dist/stylized_tree_generator-1.41.0.zip b/dist/stylized_tree_generator-1.41.0.zip deleted file mode 100644 index a5bde7654d86ccd2be445ce67860fa91231573e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47402 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

yK)g#96MFCO|Nb+kpaG>BhCRM( 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 H00000KK-t( literal 0 HcmV?d00001 diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index 266490e..c1858f5 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, 41, 0), + "version": (1, 42, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -2177,17 +2177,25 @@ def _merge_for_export(context, tree_ob, leaf_ob, name, bark_decimate=1.0): # Faell-Teile: Stammsegmente und Aeste als eigene Physik-Assets # --------------------------------------------------------------------------- -def _tree_ucx(quell_objs, name, max_verts=32): +def _tree_ucx(quell_objs, name, max_verts=32, punkte=None): """Konvexe Huelle als `UCX_` - gleiches Muster wie bei den Felsen. Nur die PUNKTE einlesen: mit `from_mesh` kaemen die Originalflaechen mit und die Huelle laege obendrauf statt darum herum. + + `punkte` uebergeht `quell_objs` und huellt genau die gegebenen Koordinaten - + dafuer, dass die Stand-Baum-Huelle nur den STAMM umschliesst und nicht die + Krone. """ bm = bmesh.new() - for o in quell_objs: - if o.type == 'MESH': - for v in o.data.vertices: - bm.verts.new(o.matrix_world @ v.co) + if punkte is not None: + for co in punkte: + bm.verts.new(co) + else: + for o in quell_objs: + if o.type == 'MESH': + for v in o.data.vertices: + bm.verts.new(o.matrix_world @ v.co) if len(bm.verts) < 4: bm.free() return None @@ -2249,6 +2257,49 @@ def _tree_ucx(quell_objs, name, max_verts=32): return ob +def _stamm_punkte(tree_obj, matrix): + """Stamm-Koordinaten vom Fuss bis zum KRONENANSATZ, in Weltkoordinaten. + + Fuer die Kollision des Stand-Baums. Bewusst nur der Stamm: eine Huelle um + die ganze Krone waere ein Zylinder von mehreren Metern Durchmesser, gegen + den der Spieler laeuft, bevor er den Baum ueberhaupt beruehrt. + + Die Trennung kommt aus `ast_id` (0 = Stamm) - dasselbe Attribut wie beim + Ursprung und bei den Faell-Teilen. Der Kronenansatz ist der tiefste Punkt + mit ast_id > 0; oberhalb davon steckt der Stamm ohnehin in der Krone. + + Ohne Aeste (Kaktus-Setzling: `Branch Count 0` schaltet den Ast-Zweig des + Graphen ab, dann gibt es gar kein ast_id) ist die ganze Pflanze Stamm - und + genau die soll dann auch die Kollision sein. + """ + dg = bpy.context.evaluated_depsgraph_get() + ev = tree_obj.evaluated_get(dg) + me = ev.to_mesh() + attr = me.attributes.get("ast_id") + hat_id = (attr is not None and attr.domain == 'POINT' + and len(attr.data) == len(me.vertices)) + stamm, aeste = [], [] + for i, v in enumerate(me.vertices): + co = matrix @ v.co + if hat_id and attr.data[i].value > 0: + aeste.append(co) + else: + stamm.append(co) + ev.to_mesh_clear() + if not stamm: + return [] + if aeste: + # Etwas Luft ueber den Ansatz: der tiefste Astpunkt kann eine + # herabgebogene Spitze sein, dann waere die Huelle zu kurz. Ein Zehntel + # der Stammhoehe reicht und bleibt weit unter der Krone. + zs = [c.z for c in stamm] + grenze = min(aeste, key=lambda c: c.z).z + (max(zs) - min(zs)) * 0.1 + gekuerzt = [c for c in stamm if c.z <= grenze] + if len(gekuerzt) >= 8: + return gekuerzt + return stamm + + def _mass_center(me): """Massenmittelpunkt als flaechengewichteter Schwerpunkt der Faces. @@ -2485,6 +2536,17 @@ class TreeGenSettings(PropertyGroup): name="_Frucht-Ebene anlegen", default=False, description="Zusaetzlich _Frucht (gleicher Ursprung) fuer die Frucht-Ebene", ) + stand_ucx: BoolProperty( + name="UCX-Stammhuelle", default=True, + description=("Legt dem spielfertigen Baum eine konvexe Huelle um den " + "STAMM (Fuss bis Kronenansatz) ins FBX. Bewusst keine " + "Kronen-Huelle: gegen die liefe der Spieler, bevor er den " + "Baum beruehrt"), + ) + stand_ucx_verts: IntProperty( + name="Stammhuelle max. Verts", default=12, min=8, max=32, + description="Ein Stamm braucht keine feine Huelle - 8-12 reichen", + ) piece_trunk_segments: IntProperty( name="Stamm-Segmente", default=3, min=2, max=3, description="In wie viele Stuecke der Stamm beim Faellen zerfaellt", @@ -2790,6 +2852,33 @@ class TREEGEN_OT_export_game(Operator): weitere.matrix_parent_inverse = Matrix.Identity(4) weitere.data.transform(versatz) + # UCX-Stammhuelle. Die Punkte kommen aus dem QUELLBAUM, weil nur + # der noch `ast_id` traegt - die Export-Kopie ist verschmolzen + # und bei LOD1-3 zusaetzlich dezimiert. Sie durchlaufen dieselbe + # Kette wie die Stufen: eigene Weltmatrix, dann die gemeinsame + # Zentrierung `versatz`. + stamm_ucx_name = (basis_name + "_LODGroup") if s.generate_lods \ + else basis_name + hull = None + if s.stand_ucx: + pts = _stamm_punkte(baum, baum.matrix_world) + pts = [versatz @ c for c in pts] + hull = _tree_ucx(None, stamm_ucx_name, + max_verts=s.stand_ucx_verts, punkte=pts) + if hull is not None: + # Der Boden der Huelle MUSS auf Z = 0 liegen. Das + # Vereinfachen schneidet Ecken ab, und das anschliessende + # Aufblasen (damit wieder alles hineinpasst) skaliert um + # die Huellenmitte - dabei rutschte die Unterseite + # gemessen 4-6 cm unter den Boden. Im Spiel waere das + # eine Kollision, die aus dem Terrain herausragt. + for v in hull.data.vertices: + if v.co.z < 0.0: + v.co.z = 0.0 + aufraeumen.append(hull.name) + print("[TreeGen] %s: Stamm-UCX mit %d Verts" + % (hull.name, len(hull.data.vertices))) + _deselect(context) if s.generate_lods: gruppe = bpy.data.objects.new(basis_name + "_LODGroup", None) @@ -2807,6 +2896,11 @@ class TREEGEN_OT_export_game(Operator): else: lods[0].select_set(True) context.view_layer.objects.active = lods[0] + # Die Huelle wird MITEXPORTIERT, aber NICHT unter das + # LodGroup-Empty gehaengt: Unreal liest jedes Kind der Gruppe + # als LOD-Stufe. Geschwister, so wie es der Fels-Export macht. + if hull is not None: + hull.select_set(True) bpy.ops.export_scene.fbx( filepath=ziel, @@ -3339,6 +3433,10 @@ class VIEW3D_PT_tree_export(_TreeSub): layout.separator() layout.prop(s, "sphere_normals") layout.prop(s, "generate_lods") + layout.prop(s, "stand_ucx") + row = layout.row() + row.active = s.stand_ucx + row.prop(s, "stand_ucx_verts") layout.prop(s, "export_dir") layout.operator("treegen.export_game", icon='EXPORT') diff --git a/tests/test_baum_export.py b/tests/test_baum_export.py index cabf858..fd31dfa 100644 --- a/tests/test_baum_export.py +++ b/tests/test_baum_export.py @@ -94,7 +94,9 @@ if not dateien: bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.fbx(filepath=os.path.join(OUT, dateien[0])) -meshes = [o for o in bpy.context.scene.objects if o.type == 'MESH'] +# Die UCX-Stammhuelle ist KEIN Render-Mesh - sie gehoert nicht in diese Zaehlung. +meshes = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and not o.name.startswith("UCX_")] print("") print("FBX %s: %d Mesh(es)" % (dateien[0], len(meshes))) if len(meshes) != 1: diff --git a/tests/test_baum_lod.py b/tests/test_baum_lod.py index 03cbc88..83275eb 100644 --- a/tests/test_baum_lod.py +++ b/tests/test_baum_lod.py @@ -96,7 +96,9 @@ if not lodfile: bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.fbx(filepath=os.path.join(OUT, lodfile[0])) -meshes = [o for o in bpy.context.scene.objects if o.type == 'MESH'] +# Die UCX-Stammhuelle ist KEIN Render-Mesh - sie gehoert nicht in diese Zaehlung. +meshes = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and not o.name.startswith("UCX_")] empties = [o for o in bpy.context.scene.objects if o.type == 'EMPTY'] stufen = sorted(meshes, key=lambda o: o.name) print("") diff --git a/tests/test_stamm_ucx.py b/tests/test_stamm_ucx.py new file mode 100644 index 0000000..a82cf60 --- /dev/null +++ b/tests/test_stamm_ucx.py @@ -0,0 +1,200 @@ +"""Stamm-UCX fuer den spielfertigen Stand-Baum. + +Die Stand-Baeume brauchen Kollision. Gefordert ist EIN konvexer Stamm-Zylinder +vom Fuss bis zum Kronenansatz - KEINE Kronen-Huelle: gegen die liefe der +Spieler, bevor er den Baum ueberhaupt beruehrt. + +Die Namens- und Hierarchie-Konvention ist nicht geraten, sondern vom +Fels-Export abgeschaut, der in der Spiel-Pipeline bereits abgenommen ist: +`UCX_`, und zwar als GESCHWISTER der LodGroup, nicht als Kind - +Unreal liest jedes Kind der Gruppe als LOD-Stufe. + +Gemessen wird im reimportierten FBX. + +Aufruf: blender --background --factory-startup --python tests/test_stamm_ucx.py +""" +import os +import sys +import math +import tempfile +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 = [] +OUT = tempfile.mkdtemp() + +for o in list(bpy.data.objects): + bpy.data.objects.remove(o, do_unlink=True) + +me = bpy.data.meshes.new("Leaf_Card") +me.from_pydata([(-0.5, 0, 0), (0, 0, 0.7), (0.5, 0, 0), (0, 0, -0.1)], + [], [(0, 1, 2), (0, 2, 3)]) +me.update() +card = bpy.data.objects.new("Leaf_Card", me) +bpy.context.scene.collection.objects.link(card) + +s = bpy.context.scene.tree_gen_settings +s.apply_modifier = True +s.leaf_card = card +s.use_growth = False +s.stand_ucx = True + +# Presets mit verschiedenen Stamm-Formen: gerade, krumm (Bend 1.5), ohne Aeste +# am Setzling, und der Obstbaum als Produktionsfall. +FAELLE = (("eiche", True), ("toter_baum", True), ("obstbaum", True), + ("eiche", False)) + +# Erst ALLE Faelle exportieren, dann reimportieren. `read_factory_settings` +# raeumt die Szene komplett aus - Blatt-Card und Einstellungen inklusive -, +# ein Reimport mitten in der Schleife killt also den naechsten Durchlauf. +ergebnisse = [] +for preset, mit_lods in FAELLE: + for o in list(bpy.context.scene.objects): + if o is not card: + bpy.data.objects.remove(o, do_unlink=True) + ziel_dir = os.path.join(OUT, "%s_%d" % (preset, int(mit_lods))) + os.makedirs(ziel_dir, exist_ok=True) + + s.preset = preset + s.art_name = preset.capitalize() + s.variant = 1 + s.seed = 1 + s.generate_lods = mit_lods + s.export_dir = ziel_dir + bpy.ops.object.treegen_create() + baum = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and o is not card + and not o.name.endswith(("_Leaf", "_Frucht"))][0] + # BEWUSST nicht am Ursprung - eine Huelle, die die Weltmatrix mitschleppt, + # faellt bei (0,0,0) nicht auf. + baum.location = (9.0, -5.0, 0.0) + 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") + if bl is not None: + bl.location = baum.location + + # Kronenansatz und Stammradius am Quellbaum, als Sollwerte. + dg = bpy.context.evaluated_depsgraph_get() + ev = baum.evaluated_get(dg) + m = ev.to_mesh() + attr = m.attributes.get("ast_id") + vs = [v.co.copy() for v in m.vertices] + aid = [attr.data[i].value for i in range(len(vs))] if attr else [0] * len(vs) + ev.to_mesh_clear() + z0 = min(v.z for v in vs) + astz = [v.z for v, i in zip(vs, aid) if i > 0] + ansatz = (min(astz) - z0) if astz else (max(v.z for v in vs) - z0) + stamm_r = max((math.hypot(v.x, v.y) for v, i in zip(vs, aid) + if i == 0 and v.z - z0 <= ansatz), default=0.0) + + for o in bpy.context.scene.objects: + o.select_set(o is baum) + bpy.context.view_layer.objects.active = baum + bpy.ops.treegen.export_game() + + dateien = sorted(f for f in os.listdir(ziel_dir) + if f.lower().endswith(".fbx")) + if not dateien: + fails.append("%s: kein FBX geschrieben" % preset) + continue + ergebnisse.append((preset, mit_lods, os.path.join(ziel_dir, dateien[0]), + stamm_r, ansatz, max(v.z for v in vs) - z0, + s.stand_ucx_verts)) + +print("%-12s %-5s %6s %8s %8s %8s %8s" + % ("Preset", "LODs", "Verts", "UCX-R", "Stamm-R", "UCX-Z", "Ansatz-Z")) + +for preset, mit_lods, pfad, stamm_r, ansatz, blender_h, max_verts in ergebnisse: + bpy.ops.wm.read_factory_settings(use_empty=True) + bpy.ops.import_scene.fbx(filepath=pfad) + + ucx = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and o.name.startswith("UCX_")] + rest = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and not o.name.startswith("UCX_")] + gruppe = [o for o in bpy.context.scene.objects if o.type == 'EMPTY'] + + if len(ucx) != 1: + fails.append("%s (LODs %s): %d UCX-Meshes im FBX, erwartet genau eines" + % (preset, mit_lods, len(ucx))) + continue + u = ucx[0] + + # Name: exakt die Konvention des Fels-Exports. + erwartet = ("UCX_" + gruppe[0].name) if gruppe else ("UCX_" + rest[0].name) + if u.name != erwartet: + fails.append("%s: Huelle heisst '%s', erwartet '%s' - Unreal ordnet " + "die Kollision ueber den Namen zu" + % (preset, u.name, erwartet)) + + # Hierarchie: NICHT unter der LodGroup, sonst waere sie eine LOD-Stufe. + if u.parent is not None: + fails.append("%s: Huelle haengt unter '%s' - Unreal liest jedes Kind " + "der LodGroup als LOD-Stufe" % (preset, u.parent.name)) + + co = [u.matrix_world @ v.co for v in u.data.vertices] + u_r = max(math.hypot(c.x, c.y) for c in co) + u_z0 = min(c.z for c in co) + u_z1 = max(c.z for c in co) + n = len(u.data.vertices) + + # Skala aus dem FBX zurueckrechnen, damit die Vergleiche unabhaengig von + # FBX_SCALE_ALL sind. NUR ueber die RINDE (Material-Slot 0): der erste + # Anlauf nahm die Gesamthoehe inklusive Blatt-Cards, und die ragen ueber die + # Rinde hinaus - die Skala kam dadurch zu gross heraus und die Huelle sah + # zu klein aus. Ein Massstab, der etwas anderes misst als die Referenz, + # verschiebt jede Aussage. + lod0 = max(rest, key=lambda o: len(o.data.vertices)) + rinde = [lod0.matrix_world @ lod0.data.vertices[vi].co + for p in lod0.data.polygons if p.material_index == 0 + for vi in p.vertices] + fbx_h = (max(c.z for c in rinde) - min(c.z for c in rinde)) if rinde else 1.0 + skala = fbx_h / blender_h if blender_h else 1.0 + + print("%-12s %-5s %6d %8.3f %8.3f %8.3f %8.3f" + % (preset, mit_lods, n, u_r / skala, stamm_r, + (u_z1 - u_z0) / skala, ansatz)) + + if not (8 <= n <= max_verts * 2): + fails.append("%s: Huelle hat %d Verts, erwartet 8-%d" + % (preset, n, max_verts * 2)) + + # DIE Bedingung: Stamm umschlossen, Krone NICHT. Der Stammradius liegt bei + # wenigen Zentimetern, die Krone bei ein bis zwei Metern - dazwischen ist + # so viel Luft, dass die Schranke nicht knapp sein muss. + if u_r / skala < stamm_r * 0.95: + fails.append("%s: Huellenradius %.3f m unter dem Stammradius %.3f - " + "der Spieler wuerde in den Stamm laufen" + % (preset, u_r / skala, stamm_r)) + if u_r / skala > max(stamm_r * 2.5, stamm_r + 0.15): + fails.append("%s: Huellenradius %.3f m gegen Stammradius %.3f - das " + "ist keine Stammhuelle mehr" + % (preset, u_r / skala, stamm_r)) + + # Fuss auf Z = 0 und nicht in die Krone hinaufreichend. + if abs(u_z0 / skala) > 0.02: + fails.append("%s: Huelle beginnt bei Z %.3f statt 0" % (preset, u_z0 / skala)) + if (u_z1 - u_z0) / skala > ansatz * 1.35 + 0.05: + fails.append("%s: Huelle ist %.2f m hoch, Kronenansatz liegt bei " + "%.2f m - sie reicht in die Krone" + % (preset, (u_z1 - u_z0) / skala, ansatz)) + +print("") +if fails: + print("ERGEBNIS: %d FEHLER" % len(fails)) + for f in fails: + print(" - " + f) + sys.exit(1) +print("ERGEBNIS: ALLE CHECKS OK") diff --git a/tests/test_ursprung.py b/tests/test_ursprung.py index ac473dd..05a304b 100644 --- a/tests/test_ursprung.py +++ b/tests/test_ursprung.py @@ -146,7 +146,9 @@ print("%-12s %3s %9s %11s %11s %10s" for preset, stufe, pfad, r_rel in ergebnisse: bpy.ops.wm.read_factory_settings(use_empty=True) bpy.ops.import_scene.fbx(filepath=pfad) - meshes = [o for o in bpy.context.scene.objects if o.type == 'MESH'] + # Die UCX-Stammhuelle ist KEIN Render-Mesh - sie gehoert nicht in diese Zaehlung. + meshes = [o for o in bpy.context.scene.objects + if o.type == 'MESH' and not o.name.startswith("UCX_")] if not meshes: fails.append("%s S%d: kein Mesh im FBX" % (preset, stufe)) continue