Beide Addons auf die EcoGame-Konventionen abgestimmt

Rock Generator 2.4.0:
- Benennung Fels_<Form>_<Klasse> statt Rock_000 (Praefix/Form/Klasse im Panel,
  Klasse S/M/L/XL, optionale Durchnummerierung bei Batches)
- Bake liefert jetzt <name>_albedo und <name>_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 <Art>_<Variante>_S<Stufe>, 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 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 12:25:09 +02:00
co-authored by Claude Opus 4.8
parent ca13e9f573
commit f5bbd1bc35
10 changed files with 182 additions and 41 deletions
+28 -7
View File
@@ -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: <Art>_<Variante>_S<Stufe>"),
)
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 <Art>_<Variante>_S<Stufe>."""
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")