Zufalls-Funktion in beiden Addons + Zusatz-Ebenen + Form-statt-Groesse
Rock Generator 2.5.0: - "Zufaellig"-Button: wuerfelt Seed und Form-Parameter, "Streuung" steuert die Abweichung von den aktuellen Werten (0 = nur neuer Seed). Optional werden auch Basis-Form und Noise-Typ gewuerfelt. Werte werden auf ihre Grenzen geklemmt. - Skalierung streut jetzt die FORM, nicht die Groesse: nicht-uniform ist Default, und "Gesamtgroesse konstant halten" normiert das geometrische Mittel auf 1. Gemessen ueber 6 Rocks: Volumen-Spanne 1.92x -> 1.11x. Wichtig, weil EcoGame die Groesse zusaetzlich ueber ScaleMin/Max streut. Tree Generator 1.19.0: - "Zufaellig"-Button: neuer Seed plus Streuung auf Hoehe, Radius, Biegung, Ast-Anzahl/-Laenge, Kronenform und Wurzelanlauf. Preset-Charakter bleibt, weil relativ zu den aktuellen Werten gestreut wird (gemessen: Hoehe 6.65 -> 8.34 m). - "_Leaf"- und "_Frucht"-Ebenen: leere Objekte mit IDENTISCHEM Ursprung neben dem Baum (gemessen: Abstand 0.000000), damit die Ebenen in UE deckungsgleich sitzen. Vier Test-Suiten liegen jetzt unter tests/ statt nur im Scratchpad. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import bpy, sys, importlib.util
|
||||
ADDON=r"A:\eco\stylized_rock_generator\stylized_tree_generator.py"
|
||||
spec=importlib.util.spec_from_file_location("stg",ADDON)
|
||||
m=importlib.util.module_from_spec(spec); sys.modules["stg"]=m; spec.loader.exec_module(m)
|
||||
try: m.unregister()
|
||||
except Exception: pass
|
||||
m.register()
|
||||
fails=[]
|
||||
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
|
||||
s=bpy.context.scene.tree_gen_settings
|
||||
|
||||
print("LIGHTMAP-Default aus:", not m.TreeGenSettings.bl_rna.properties['generate_lightmap_uv'].default)
|
||||
if m.TreeGenSettings.bl_rna.properties['generate_lightmap_uv'].default: fails.append("lightmap_default")
|
||||
|
||||
# Wachstums-Stufen mit Art-Name
|
||||
s.preset='birke'; s.art_name="Birke"; s.variant=1
|
||||
s.use_growth=True; s.stages=4; s.apply_modifier=False
|
||||
bpy.ops.object.treegen_create()
|
||||
names=sorted(o.name for o in bpy.context.scene.objects if o.type=='MESH')
|
||||
print("STUFEN:", names)
|
||||
if names != ["Birke_01_S1","Birke_01_S2","Birke_01_S3","Birke_01_S4"]: fails.append("stufen_namen")
|
||||
|
||||
# Einzelbaum, Art aus Preset abgeleitet
|
||||
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
|
||||
s.use_growth=False; s.art_name=""; s.preset='eiche'; s.variant=2
|
||||
bpy.ops.object.treegen_create()
|
||||
single=[o.name for o in bpy.context.scene.objects if o.type=='MESH']
|
||||
print("EINZELN:", single)
|
||||
if single != ["Eiche_02"]: fails.append("einzel_name")
|
||||
|
||||
# Ursprung unten-mittig + echte Meter
|
||||
ob=bpy.context.scene.objects[single[0]]
|
||||
ev=ob.evaluated_get(bpy.context.evaluated_depsgraph_get())
|
||||
zs=[v.co.z for v in ev.data.vertices]
|
||||
print("URSPRUNG z=%.3f min_z=%.3f Hoehe=%.2f m" % (ob.location.z, min(zs), max(zs)-min(zs)))
|
||||
if abs(min(zs)) > 0.02: fails.append("ursprung")
|
||||
m.unregister()
|
||||
print("ERGEBNIS:", "ALLE CHECKS OK" if not fails else "FEHLER: "+", ".join(fails))
|
||||
sys.exit(1 if fails else 0)
|
||||
Reference in New Issue
Block a user