Rock Generator 2.6.0: Groessen-Klassen wirken jetzt + Randomize-Bug gefixt
1) KLASSEN-GROESSE (vom User gemeldet): S und M kamen gleich gross raus. Ursache war eine Luecke im Design, nicht in der Bedienung: "keep_size" normiert die Zufalls-Streuung auf konstantes Volumen - damit wurde alles, was ueber scale_min/max eingestellt war, wieder herausgerechnet. Fuer die Groesse der KLASSE gab es schlicht keinen Regler. Neu: CLASS_SIZES (S=0.45, M=1.0, L=1.9, XL=3.2) plus "Groesse aus Klasse" und eine freie "Basis-Groesse". Die Klassengroesse ist bewusst gesetzt und von der Streuung getrennt; sie greift auch bei abgeschalteter Randomisierung. Gemessen: S 0.85 m | M 1.9 m | L 3.5 m | XL 6.0 m, Volumen-Streuung INNERHALB jeder Klasse bleibt bei 1.11x (nur Form). 2) BUG im Zufalls-Button (kam mit 2.5.0): jitter() schrieb einen float in die int-Property subsurf_levels -> TypeError, der Operator brach komplett ab. jitter() rundet jetzt fuer Int-Properties. Von tests/test_randomize.py gefangen. Neuer Test tests/test_rock_classes.py deckt die Klassengroessen ab. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
import bpy, sys, importlib.util
|
||||
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
|
||||
s.batch_count=5; s.subsurf_levels=3; s.use_modal=False; s.spacing=3
|
||||
s.scale_min=0.75; s.scale_max=1.25; s.keep_size=True
|
||||
fails=[]; means={}
|
||||
print("Klasse | Groesse min..max (m) | Volumen min..max | Streuung")
|
||||
for kl in ('S','M','L','XL'):
|
||||
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
|
||||
s.name_class=kl
|
||||
bpy.ops.object.generate_rocks_batch()
|
||||
vols=[]; dims=[]
|
||||
for o in bpy.context.scene.objects:
|
||||
if o.type!='MESH': continue
|
||||
bb=o.bound_box
|
||||
d=[(max(v[i] for v in bb)-min(v[i] for v in bb))*o.scale[i] for i in range(3)]
|
||||
dims.append(max(d)); vols.append(d[0]*d[1]*d[2])
|
||||
means[kl]=sum(vols)/len(vols)
|
||||
print(" %-3s | %.2f .. %.2f | %.2f .. %.2f | %.2fx"
|
||||
% (kl, min(dims), max(dims), min(vols), max(vols), max(vols)/min(vols)))
|
||||
if max(vols)/min(vols) > 1.6: fails.append("streuung_%s"%kl)
|
||||
print("Volumen-Verhaeltnis M/S = %.1fx | L/M = %.1fx | XL/L = %.1fx"
|
||||
% (means['M']/means['S'], means['L']/means['M'], means['XL']/means['L']))
|
||||
if not (means['S'] < means['M'] < means['L'] < means['XL']): fails.append("reihenfolge")
|
||||
if means['M']/means['S'] < 3: fails.append("S_zu_gross")
|
||||
r.unregister()
|
||||
print("ERGEBNIS:", "OK" if not fails else "FEHLER: "+", ".join(fails))
|
||||
Reference in New Issue
Block a user