From f5bbd1bc35a7c70db531245c7ef445ec80c1e7ae Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Wed, 29 Jul 2026 12:25:09 +0200 Subject: [PATCH] Beide Addons auf die EcoGame-Konventionen abgestimmt Rock Generator 2.4.0: - Benennung Fels_
_ statt Rock_000 (Praefix/Form/Klasse im Panel, Klasse S/M/L/XL, optionale Durchnummerierung bei Batches) - Bake liefert jetzt _albedo und _normal. AO/Cavity wird per Option MULTIPLIKATIV ins Albedo gebacken (Staerke regelbar) - separate Roughness- und AO-Paesse sind Default aus, weil Roughness in EcoGame eine Zahl im Master- Material ist. Gemessen: Albedo-Mittelwert 0.549 -> 0.433 mit AO, Kontrast rauf. - UV1 Lightmap Default AUS (EcoGame beleuchtet dynamisch) Tree Generator 1.18.0: - Benennung __S, z.B. Birke_01_S1..S4 (statt stage0..3); Art-Feld und Varianten-Nummer im Panel, Art leer = Preset-Name - UV1 Lightmap Default AUS README: Konventionen dokumentiert. Co-Authored-By: Claude Opus 4.8 --- README.md | 31 ++++++ blender_manifest.toml | 2 +- blender_manifest_tree.toml | 2 +- dist/index.json | 16 +-- dist/stylized_rock_generator-2.3.0.zip | Bin 14694 -> 0 bytes dist/stylized_rock_generator-2.4.0.zip | Bin 0 -> 16036 bytes dist/stylized_tree_generator-1.17.0.zip | Bin 16523 -> 0 bytes dist/stylized_tree_generator-1.18.0.zip | Bin 0 -> 16777 bytes stylized_rock_generator.py | 137 +++++++++++++++++++----- stylized_tree_generator.py | 35 ++++-- 10 files changed, 182 insertions(+), 41 deletions(-) delete mode 100644 dist/stylized_rock_generator-2.3.0.zip create mode 100644 dist/stylized_rock_generator-2.4.0.zip delete mode 100644 dist/stylized_tree_generator-1.17.0.zip create mode 100644 dist/stylized_tree_generator-1.18.0.zip diff --git a/README.md b/README.md index 1213083..0d7d09a 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,37 @@ --- +## EcoGame-Konventionen (beide Addons) + +Abgestimmt auf `A:\eco\EcoGame` (UE 5.8). Kurzfassung: + +**Benennung** +- Felsen: `Fels__` — Form = Buchstabe (A, B, …), Klasse = `S/M/L/XL`. + Die Klasse meint eine eigene **Silhouette**, nicht blosse Groesse: rein + groesser/kleiner macht die Engine ueber ScaleMin/Max. +- Baeume: `__S`, z. B. `Birke_01_S1` … `Birke_01_S4`. + Zusatz-Ebenen haengen hinten an: `_Leaf`, `_Frucht`. +- Texturen: `_albedo` und `_normal` — mehr nicht. + +**Textur-Bake** +- Nur **Albedo + Normal**. Roughness ist im Master-Material eine **Zahl**, + keine Textur. +- **AO/Cavity wird ins Albedo multipliziert** (Option „AO ins Albedo einrechnen", + Staerke regelbar). Dunkle Ritzen und helle Platten stecken im Farbbild — das + traegt den Stylized-Look. Separate Rough-/AO-Paesse sind Default **aus**. +- 1024 px reicht fuer stylized Formen. +- Tileable (4D-Torus) passt zum triplanar mappenden Master-Material. + +**Mesh** +- Echte Meter, Ursprung unten-mittig, FBX pro Asset bzw. LOD-Gruppe. +- **UV1 Lightmap ist Default aus** — EcoGame beleuchtet dynamisch. +- Meshes brauchen **keine eigenen Materialien**; in UE bekommt alles die + Material-Instanz vom Master. Ein Platzhalter im FBX ist okay. +- Scale-Randomisierung nur fuer die **Form** (nicht-uniform) nutzen, nicht fuer + die Gesamtgroesse — sonst multipliziert sie sich mit ScaleMin/Max der Engine. + +--- + ## Stylized Tree Generator Parametrischer **Geaest**-Generator (Stamm + Aeste + Sub-Aeste) als Geometry-Nodes- diff --git a/blender_manifest.toml b/blender_manifest.toml index d40f40f..d78c793 100644 --- a/blender_manifest.toml +++ b/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "stylized_rock_generator" -version = "2.3.0" +version = "2.4.0" name = "Stylized Rock Generator" tagline = "Batch-Generator fuer stylized Rocks mit UE5-Export" maintainer = "D4rkst3r" diff --git a/blender_manifest_tree.toml b/blender_manifest_tree.toml index cdb0e8e..6e64508 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.17.0" +version = "1.18.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 2596408..52c751c 100644 --- a/dist/index.json +++ b/dist/index.json @@ -7,7 +7,7 @@ "id": "stylized_rock_generator", "name": "Stylized Rock Generator", "tagline": "Batch-Generator fuer stylized Rocks mit UE5-Export", - "version": "2.3.0", + "version": "2.4.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -23,16 +23,16 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_rock_generator-2.3.0.zip", - "archive_size": 14694, - "archive_hash": "sha256:a6e15dd94c6b77dc1ef7c631d1d1dce275a8d3550d16369d90675a2f42fa6298" + "archive_url": "./stylized_rock_generator-2.4.0.zip", + "archive_size": 16036, + "archive_hash": "sha256:e7163f6f0c53731f897b8a1ba63db1cdab94aa182dd720ca1a5653a2ca3df9ec" }, { "schema_version": "1.0.0", "id": "stylized_tree_generator", "name": "Stylized Tree Generator", "tagline": "Parametrische Baeume, Palmen, Bueschen mit Wachstums-Stufen", - "version": "1.17.0", + "version": "1.18.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -48,9 +48,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_tree_generator-1.17.0.zip", - "archive_size": 16523, - "archive_hash": "sha256:49c3e777aa602ba3c63537aacd866bb5b11ac6484dbc0f91b28d26f497f98c00" + "archive_url": "./stylized_tree_generator-1.18.0.zip", + "archive_size": 16777, + "archive_hash": "sha256:9ea5b7a9c01f3c1b382436d25539ab9ec41ffb8b051d26c17c82783c594680a0" } ] } \ No newline at end of file diff --git a/dist/stylized_rock_generator-2.3.0.zip b/dist/stylized_rock_generator-2.3.0.zip deleted file mode 100644 index 2de9afce25e2854c5a539cd96c89a5e92a2edf08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14694 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 diff --git a/dist/stylized_rock_generator-2.4.0.zip b/dist/stylized_rock_generator-2.4.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..264d8219591610e07c6fcb1305fc78785c4dc8fd GIT binary patch literal 16036 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 DjTMQb diff --git a/dist/stylized_tree_generator-1.18.0.zip b/dist/stylized_tree_generator-1.18.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..f8b8bd12ba59fc8c2b794a4822afab65db40e779 GIT binary patch literal 16777 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 OB$ Sidebar > Rock Gen", "description": ( @@ -102,6 +102,16 @@ def _apply_modifier(context, obj, mod_name): raise RockGenError("Modifier '%s' Apply wurde abgebrochen." % mod_name) +def _asset_name(settings, index, batch_count): + """EcoGame-Schema: Fels__, bei Batches mit laufender Nummer.""" + base = "%s_%s_%s" % (settings.name_prefix.strip() or "Fels", + (settings.name_form.strip() or "A").upper(), + settings.name_class) + if settings.name_numbered and batch_count > 1: + return "%s_%02d" % (base, index + 1) + return base + + def _face_count(obj): return len(obj.data.polygons) @@ -279,7 +289,7 @@ def _make_lightmap_uv(context, obj): # Mesh-Aufbau # --------------------------------------------------------------------------- -def _build_rock_mesh(context, settings, index, location, rng): +def _build_rock_mesh(context, settings, index, location, rng, name=None): """Baut das reine Rock-Mesh (ohne Transform/Material). Kann RockGenError werfen.""" # 1. Basis-Mesh if settings.base_shape == 'CUBE': @@ -289,7 +299,7 @@ def _build_rock_mesh(context, settings, index, location, rng): subdivisions=1, radius=1.0, location=location ) obj = context.active_object - obj.name = "Rock_%03d" % index + obj.name = name or ("Rock_%03d" % index) # Effektive Form-Parameter (optional pro Rock variiert) eff_noise = settings.noise_scale @@ -504,10 +514,10 @@ def _parent_keep_transform(child, parent): child.matrix_parent_inverse = parent.matrix_world.inverted() -def _build_lod_group(context, settings, index, location, rng): - base_name = "Rock_%03d" % index +def _build_lod_group(context, settings, index, location, rng, base_name=None): + base_name = base_name or ("Rock_%03d" % index) - lod0 = _build_rock_mesh(context, settings, index, location, rng) + lod0 = _build_rock_mesh(context, settings, index, location, rng, name=base_name) _apply_hardsurface(context, lod0, settings) _apply_random_transform(context, lod0, settings, rng) if settings.assign_material: @@ -556,15 +566,16 @@ def _build_lod_group(context, settings, index, location, rng): # Ein Rock (bzw. eine LOD-Gruppe) erzeugen # --------------------------------------------------------------------------- -def make_one_rock(context, settings, index): +def make_one_rock(context, settings, index, batch_count=1): """Erzeugt genau einen Rock / eine LOD-Gruppe. Liefert Liste der Objekte.""" rng = random.Random(settings.seed + index * 9973) location = (index * settings.spacing, 0.0, 0.0) + name = _asset_name(settings, index, batch_count) if settings.generate_lods: - return _build_lod_group(context, settings, index, location, rng) + return _build_lod_group(context, settings, index, location, rng, base_name=name) - obj = _build_rock_mesh(context, settings, index, location, rng) + obj = _build_rock_mesh(context, settings, index, location, rng, name=name) _apply_hardsurface(context, obj, settings) _apply_random_transform(context, obj, settings, rng) _apply_shading(context, obj, settings) @@ -645,8 +656,9 @@ class RockGenSettings(PropertyGroup): description="Fuer Material-Maker-Texturen (Albedo/Normal/Roughness/AO)", ) generate_lightmap_uv: BoolProperty( - name="UV1 Lightmap-UV", default=True, - description="Separates, nicht ueberlappendes UV fuer Unreal Static-Mesh-Lightmaps", + name="UV1 Lightmap-UV", default=False, + description=("Separates, nicht ueberlappendes UV fuer Static-Mesh-Lightmaps. " + "EcoGame beleuchtet dynamisch - dort nicht noetig"), ) # --- Hard-Surface (optional) --- @@ -736,19 +748,57 @@ class RockGenSettings(PropertyGroup): name="Bake-Ordner", default="", subtype='DIR_PATH', description="Zielordner fuer die gebackenen Textur-PNGs", ) + # --- Benennung (EcoGame-Schema: Fels__) --- + name_prefix: StringProperty( + name="Praefix", default="Fels", + description="Basisname, z.B. 'Fels' oder 'Felsblock'", + ) + name_form: StringProperty( + name="Form", default="A", + description="Form-Variante als Buchstabe (A, B, C ...)", + ) + name_class: EnumProperty( + name="Groessen-Klasse", + items=[('S', "S", "klein"), ('M', "M", "mittel"), + ('L', "L", "gross"), ('XL', "XL", "sehr gross")], + default='M', + description=("Groessen-KLASSE mit eigener Geometrie. Reines Groesser/Kleiner " + "macht die Engine ueber ScaleMin/Max - eine eigene Klasse nur, " + "wenn sich die Silhouette aendert"), + ) + name_numbered: BoolProperty( + name="Bei Batch durchnummerieren", default=True, + description="Haengt bei mehreren Rocks _01, _02 ... an (sonst Blender-Suffix)", + ) + bake_prefix: StringProperty( - name="Textur-Prefix", default="T_Rock_Stylized", - description="Dateiname-Prefix (UE-Konvention T_)", + name="Textur-Name", default="fels_a", + description="Basisname; es entstehen _albedo.png und _normal.png", ) bake_resolution: EnumProperty( name="Aufloesung", items=[('512', "512", ""), ('1024', "1024", ""), ('2048', "2048", "")], - default='1024', + default='1024', # reicht fuer stylized/flaechige Formen ) - bake_color: BoolProperty(name="BaseColor", default=True) + bake_color: BoolProperty(name="Albedo", default=True) bake_normal: BoolProperty(name="Normal", default=True) - bake_roughness: BoolProperty(name="Roughness", default=True) - bake_ao: BoolProperty(name="AO / Cavity", default=True) + bake_roughness: BoolProperty( + name="Roughness", default=False, + description="In EcoGame ist Roughness eine ZAHL im Master-Material, keine Textur", + ) + bake_ao: BoolProperty( + name="AO separat", default=False, + description=("Eigene AO-Textur. In EcoGame nicht noetig - dort wird AO ins " + "Albedo eingerechnet (siehe unten)"), + ) + bake_ao_into_albedo: BoolProperty( + name="AO ins Albedo einrechnen", default=True, + description="Cavity/AO multiplikativ ins Farbbild backen (EcoGame-Konvention)", + ) + bake_ao_strength: FloatProperty( + name="AO-Staerke", default=1.0, min=0.0, max=1.0, + description="0 = kein AO im Albedo, 1 = voll", + ) bake_base_color: FloatVectorProperty( name="Grundfarbe", subtype='COLOR', size=4, default=(0.52, 0.47, 0.40, 1.0), min=0.0, max=1.0, @@ -796,7 +846,7 @@ class OBJECT_OT_generate_rocks(Operator): for i in range(settings.batch_count): names_before = set(bpy.data.objects.keys()) try: - created.extend(make_one_rock(context, settings, i)) + created.extend(make_one_rock(context, settings, i, settings.batch_count)) except Exception as exc: # noqa: BLE001 - bewusst breit, ein Rock darf nicht den Batch killen failed.append((i, str(exc))) print("[RockGen] Rock %d fehlgeschlagen: %s" % (i, exc)) @@ -839,7 +889,7 @@ class OBJECT_OT_generate_rocks(Operator): names_before = set(bpy.data.objects.keys()) try: - self._created.extend(make_one_rock(context, settings, self._index)) + self._created.extend(make_one_rock(context, settings, self._index, settings.batch_count)) except Exception as exc: # noqa: BLE001 self._failed.append((self._index, str(exc))) print("[RockGen] Rock %d fehlgeschlagen: %s" % (self._index, exc)) @@ -873,7 +923,9 @@ def _collect_export_targets(context, settings): tops = [] for o in context.scene.objects: is_group = (o.type == 'EMPTY' and o.get("fbx_type") == "LodGroup") - is_standalone = (o.type == 'MESH' and o.name.startswith("Rock_") and o.parent is None) + is_standalone = (o.type == 'MESH' and o.parent is None + and (o.name.startswith(settings.name_prefix.strip() or "Fels") + or o.name.startswith("Rock_"))) if is_group or is_standalone: tops.append(o) if settings.export_selected_only: @@ -1073,6 +1125,19 @@ def _build_bake_material(base_color=(0.52, 0.47, 0.40), cell_scale=2.5): bump.inputs["Distance"].default_value = 0.4 links.new(cell_fac.outputs[0], bump.inputs["Height"]) + # EcoGame-Konvention: AO/Cavity wird NICHT als eigene Textur exportiert, + # sondern direkt ins Albedo multipliziert - dunkle Ritzen und helle Platten + # sind im Farbbild eingebacken. Das traegt den Stylized-Look. + ao_mix = nodes.new("ShaderNodeMixRGB") + ao_mix.blend_type = 'MULTIPLY' + ao_mix.inputs["Fac"].default_value = 1.0 + links.new(ramp.outputs["Color"], ao_mix.inputs["Color1"]) + ao_rgb = nodes.new("ShaderNodeCombineXYZ") + links.new(ao.outputs[0], ao_rgb.inputs["X"]) + links.new(ao.outputs[0], ao_rgb.inputs["Y"]) + links.new(ao.outputs[0], ao_rgb.inputs["Z"]) + links.new(ao_rgb.outputs[0], ao_mix.inputs["Color2"]) + links.new(ramp.outputs["Color"], bsdf.inputs["Base Color"]) links.new(rough.outputs[0], bsdf.inputs["Roughness"]) links.new(bump.outputs["Normal"], bsdf.inputs["Normal"]) @@ -1081,6 +1146,8 @@ def _build_bake_material(base_color=(0.52, 0.47, 0.40), cell_scale=2.5): sockets = { "out": out, "bsdf": bsdf, "emit": emit, "color": ramp.outputs["Color"], + "color_ao": ao_mix.outputs["Color"], # Albedo mit eingebackenem AO + "ao_mix": ao_mix, "roughness": rough.outputs[0], "ao": ao.outputs[0], } @@ -1139,6 +1206,10 @@ class OBJECT_OT_bake_rock_textures(Operator): base_color=tuple(settings.bake_base_color), cell_scale=settings.bake_cell_scale, ) + # AO-Staerke ins Albedo (Fac 0 = aus, 1 = voll) + sk["ao_mix"].inputs["Fac"].default_value = ( + settings.bake_ao_strength if settings.bake_ao_into_albedo else 0.0 + ) plane.data.materials.clear() plane.data.materials.append(mat) @@ -1157,7 +1228,7 @@ class OBJECT_OT_bake_rock_textures(Operator): if settings.bake_normal: links.new(sk["bsdf"].outputs[0], sk["out"].inputs["Surface"]) - saved.append(_bake_one(context, mat, img_node, prefix + "_N", + saved.append(_bake_one(context, mat, img_node, prefix + "_normal", folder, res, 'NORMAL', non_color=True)) def _emit_pass(source_socket, suffix, non_color): @@ -1167,11 +1238,14 @@ class OBJECT_OT_bake_rock_textures(Operator): folder, res, 'EMIT', non_color)) if settings.bake_color: - _emit_pass(sk["color"], "_BC", non_color=False) + # EcoGame braucht nur _albedo und _normal. Das AO steckt bereits + # im Farbbild, sofern "AO ins Albedo einrechnen" aktiv ist. + src = sk["color_ao"] if settings.bake_ao_into_albedo else sk["color"] + _emit_pass(src, "_albedo", non_color=False) if settings.bake_roughness: - _emit_pass(sk["roughness"], "_R", non_color=True) + _emit_pass(sk["roughness"], "_roughness", non_color=True) if settings.bake_ao: - _emit_pass(sk["ao"], "_AO", non_color=True) + _emit_pass(sk["ao"], "_ao", non_color=True) except Exception as exc: # noqa: BLE001 print("[RockGen] Bake fehlgeschlagen: %s" % exc) @@ -1300,6 +1374,16 @@ class VIEW3D_PT_rock_generator(Panel): row.prop(settings, "new_preset_name", text="") row.operator("rockgen.preset_save", text="Speichern", icon='ADD') + box = layout.box() + box.label(text="Benennung", icon='SORTALPHA') + row = box.row(align=True) + row.prop(settings, "name_prefix", text="") + row.prop(settings, "name_form", text="") + row.prop(settings, "name_class", text="") + box.prop(settings, "name_numbered") + box.label(text="Ergebnis: %s" % _asset_name(settings, 0, settings.batch_count), + icon='INFO') + box = layout.box() box.label(text="Basis") box.prop(settings, "base_shape") @@ -1397,6 +1481,11 @@ class VIEW3D_PT_rock_generator(Panel): row = box.row(align=True) row.prop(settings, "bake_color", toggle=True) row.prop(settings, "bake_normal", toggle=True) + box.prop(settings, "bake_ao_into_albedo") + sub = box.row() + sub.enabled = settings.bake_ao_into_albedo + sub.prop(settings, "bake_ao_strength") + row = box.row(align=True) row.prop(settings, "bake_roughness", toggle=True) row.prop(settings, "bake_ao", toggle=True) box.operator("object.bake_rock_textures", icon='TEXTURE') diff --git a/stylized_tree_generator.py b/stylized_tree_generator.py index 55835b2..9353768 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, 17, 0), + "version": (1, 18, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Tree Gen", "description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen", @@ -964,7 +964,8 @@ def make_object(ng, preset="baum", name=None, growth=None, seed=None): # --------------------------------------------------------------------------- from bpy.props import ( - IntProperty, FloatProperty, EnumProperty, BoolProperty, PointerProperty, + IntProperty, FloatProperty, EnumProperty, BoolProperty, StringProperty, + PointerProperty, ) from bpy.types import Operator, Panel, PropertyGroup @@ -981,18 +982,32 @@ class TreeGenSettings(PropertyGroup): description="Erzeugt mehrere Stufen (Setzling .. ausgewachsen) mit gleichem Seed", ) stages: IntProperty(name="Anzahl Stufen", default=4, min=2, max=8) + art_name: StringProperty( + name="Art", default="", + description=("Art-Name fuer den Export, z.B. 'Birke'. Leer = Preset-Name. " + "Schema: __S"), + ) + variant: IntProperty( + name="Variante", default=1, min=1, max=99, + description="Laufende Variante derselben Art (Birke_01, Birke_02 ...)", + ) spacing: FloatProperty(name="Abstand", default=4.0, min=0.0, max=20.0) apply_modifier: BoolProperty( name="Modifier anwenden", default=False, description="Ergebnis als normales Mesh einfrieren (fuer den Export)", ) generate_lightmap_uv: BoolProperty( - name="UV1 Lightmap-UV", default=True, - description=("Zweiter, nicht ueberlappender UV-Kanal fuer Unreal-Lightmaps. " - "Braucht 'Modifier anwenden' (nur echte Meshes lassen sich unwrappen)"), + name="UV1 Lightmap-UV", default=False, + description=("Zweiter, nicht ueberlappender UV-Kanal fuer Lightmaps. Braucht " + "'Modifier anwenden'. EcoGame beleuchtet dynamisch -> nicht noetig"), ) +def _art(s): + """Art-Name fuer das EcoGame-Schema __S.""" + return (s.art_name.strip() or s.preset).capitalize() + + def _place(ob, x): ob.location.x = x @@ -1049,12 +1064,12 @@ class TREEGEN_OT_create(Operator): for i in range(s.stages): t = i / float(s.stages - 1) if s.stages > 1 else 1.0 ob = make_object(ng, preset=s.preset, growth=t, seed=s.seed, - name="%s_%s_stage%d" % (OBJ_NAME, s.preset, i)) + name="%s_%02d_S%d" % (_art(s), s.variant, i + 1)) _place(ob, x); x += s.spacing created.append(ob) else: ob = make_object(ng, preset=s.preset, seed=s.seed, - name="%s_%s" % (OBJ_NAME, s.preset)) + name="%s_%02d" % (_art(s), s.variant)) created.append(ob) except Exception as exc: # noqa: BLE001 self.report({'ERROR'}, "Erzeugen fehlgeschlagen: %s" % exc) @@ -1099,6 +1114,12 @@ class VIEW3D_PT_tree_generator(Panel): box.label(text="Vorlage", icon='PRESET') box.prop(s, "preset", text="") box.prop(s, "seed") + row = box.row(align=True) + row.prop(s, "art_name", text="") + row.prop(s, "variant") + box.label(text="Name: %s_%02d%s" % (_art(s), s.variant, + "_S1..S%d" % s.stages if s.use_growth else ""), + icon='INFO') box = layout.box() box.label(text="Wachstum")