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,64 @@
|
||||
import bpy, sys, importlib.util
|
||||
fails=[]
|
||||
|
||||
# ---------- ROCK ----------
|
||||
spec=importlib.util.spec_from_file_location("srg", r"A:\eco\stylized_rock_generator\stylized_rock_generator.py")
|
||||
r=importlib.util.module_from_spec(spec); sys.modules["srg"]=r; spec.loader.exec_module(r)
|
||||
try: r.unregister()
|
||||
except Exception: pass
|
||||
r.register()
|
||||
s=bpy.context.scene.rock_gen_settings
|
||||
before=(s.seed, round(s.noise_scale,3), round(s.displace_strength,3), round(s.decimate_ratio_1,3))
|
||||
s.random_amount=0.5
|
||||
bpy.ops.rockgen.randomize()
|
||||
after=(s.seed, round(s.noise_scale,3), round(s.displace_strength,3), round(s.decimate_ratio_1,3))
|
||||
print("ROCK vorher:", before)
|
||||
print("ROCK nachher:", after)
|
||||
if before==after: fails.append("rock_randomize_ohne_wirkung")
|
||||
# Grenzen eingehalten?
|
||||
if not (0.01<=s.noise_scale<=10 and 0<=s.displace_strength<=2 and 0.01<=s.decimate_ratio_1<=1):
|
||||
fails.append("rock_grenzen")
|
||||
# Erzeugt der Rock danach noch gueltige Geometrie?
|
||||
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
|
||||
s.batch_count=1; s.use_modal=False; s.subsurf_levels=3
|
||||
res=bpy.ops.object.generate_rocks_batch()
|
||||
meshes=[o for o in bpy.context.scene.objects if o.type=='MESH']
|
||||
print("ROCK nach Randomize erzeugt:", [o.name for o in meshes], "faces=", len(meshes[0].data.polygons) if meshes else 0)
|
||||
if not meshes or len(meshes[0].data.polygons)==0: fails.append("rock_leer")
|
||||
r.unregister()
|
||||
|
||||
# ---------- TREE ----------
|
||||
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
|
||||
spec2=importlib.util.spec_from_file_location("stg", r"A:\eco\stylized_rock_generator\stylized_tree_generator.py")
|
||||
t=importlib.util.module_from_spec(spec2); sys.modules["stg"]=t; spec2.loader.exec_module(t)
|
||||
try: t.unregister()
|
||||
except Exception: pass
|
||||
t.register()
|
||||
ts=bpy.context.scene.tree_gen_settings
|
||||
ts.preset='birke'; ts.art_name="Birke"; ts.variant=1; ts.use_growth=False
|
||||
ts.make_leaf=True; ts.make_frucht=True; ts.random_amount=0.5
|
||||
ts.seed=0
|
||||
bpy.ops.object.treegen_randomize()
|
||||
print("TREE Seed nach Randomize:", ts.seed)
|
||||
if ts.seed==0: fails.append("tree_seed")
|
||||
bpy.ops.object.treegen_create()
|
||||
names=sorted(o.name for o in bpy.context.scene.objects)
|
||||
print("TREE Objekte:", names)
|
||||
if not {"Birke_01","Birke_01_Leaf","Birke_01_Frucht"} <= set(names): fails.append("zusatz_ebenen")
|
||||
# Ursprung identisch?
|
||||
base=bpy.context.scene.objects["Birke_01"]; leaf=bpy.context.scene.objects["Birke_01_Leaf"]
|
||||
d=(base.location-leaf.location).length
|
||||
print("URSPRUNG-Abstand Stamm<->Leaf: %.6f" % d)
|
||||
if d>1e-6: fails.append("ursprung_leaf")
|
||||
# Zwei Randomize-Durchlaeufe -> unterschiedliche Geometrie?
|
||||
def height():
|
||||
ev=bpy.context.scene.objects["Birke_01"].evaluated_get(bpy.context.evaluated_depsgraph_get())
|
||||
zs=[v.co.z for v in ev.data.vertices]; return round(max(zs)-min(zs),3)
|
||||
h1=height()
|
||||
bpy.ops.object.treegen_randomize(); bpy.ops.object.treegen_create()
|
||||
h2=height()
|
||||
print("TREE Hoehe Lauf1=%.3f Lauf2=%.3f" % (h1,h2))
|
||||
if abs(h1-h2)<1e-4: fails.append("tree_keine_variation")
|
||||
t.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