From d58bfe05e8224d7a7c9d1904007112dd7a18fceb Mon Sep 17 00:00:00 2001 From: D4rkst3r Date: Fri, 31 Jul 2026 02:42:17 +0200 Subject: [PATCH] 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 --- README.md | 9 +++- blender_manifest.toml | 2 +- dist/index.json | 8 ++-- dist/stylized_rock_generator-2.5.0.zip | Bin 16991 -> 0 bytes dist/stylized_rock_generator-2.6.0.zip | Bin 0 -> 17621 bytes stylized_rock_generator.py | 57 ++++++++++++++++++++++--- tests/test_rock_classes.py | 31 ++++++++++++++ 7 files changed, 93 insertions(+), 14 deletions(-) delete mode 100644 dist/stylized_rock_generator-2.5.0.zip create mode 100644 dist/stylized_rock_generator-2.6.0.zip create mode 100644 tests/test_rock_classes.py diff --git a/README.md b/README.md index c55f037..b526221 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,12 @@ 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. + Die Klasse setzt eine **Basis-Groesse** (S=0.45, M=1.0, L=1.9, XL=3.2) und ist + damit ein bewusst anderes Asset — gemessen: S 0.85 m, M 1.9 m, L 3.5 m, XL 6.0 m. + Davon strikt getrennt ist die **Zufalls-Streuung** (`scale_min/max`): die variiert + nur die FORM und wird von „Gesamtgroesse konstant halten" auf konstantes Volumen + normiert (1.11× statt 1.92×), damit sie sich nicht mit den ScaleMin/Max der Engine + multipliziert. - Baeume: `__S`, z. B. `Birke_01_S1` … `Birke_01_S4`. Zusatz-Ebenen haengen hinten an: `_Leaf`, `_Frucht`. - Texturen: `_albedo` und `_normal` — mehr nicht. @@ -197,6 +201,7 @@ Weitere Suiten (jeweils `blender --background --python `): | `tests/test_ecogame_tree.py` | Baum-Benennung `__S`, Ursprung, Lightmap-Default | | `tests/test_randomize.py` | Zufalls-Funktion beider Addons, `_Leaf`/`_Frucht` mit gleichem Ursprung | | `tests/test_leaves.py` | Blattwerk: Streuung, Ursprung, Tri-Budget, leeres `_Leaf` ohne Card | +| `tests/test_rock_classes.py` | Groessen-Klassen S/M/L/XL unterscheiden sich, Streuung bleibt formbezogen | Die Suiten erwarten die gebauten Zips in `dist/` bzw. lesen die `.py` direkt. diff --git a/blender_manifest.toml b/blender_manifest.toml index 806bc1a..9d70fde 100644 --- a/blender_manifest.toml +++ b/blender_manifest.toml @@ -1,7 +1,7 @@ schema_version = "1.0.0" id = "stylized_rock_generator" -version = "2.5.0" +version = "2.6.0" name = "Stylized Rock Generator" tagline = "Batch-Generator fuer stylized Rocks mit UE5-Export" maintainer = "D4rkst3r" diff --git a/dist/index.json b/dist/index.json index 82493f3..4483d2f 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.5.0", + "version": "2.6.0", "type": "add-on", "maintainer": "D4rkst3r", "license": [ @@ -23,9 +23,9 @@ "Mesh", "Modeling" ], - "archive_url": "./stylized_rock_generator-2.5.0.zip", - "archive_size": 16991, - "archive_hash": "sha256:f89c740398afb7550ccc109980be6d9ea9d785ccc9383e70aa8c7d7cb89006bd" + "archive_url": "./stylized_rock_generator-2.6.0.zip", + "archive_size": 17621, + "archive_hash": "sha256:f20343bd1aae3c03585e7621816b8934719e8855d7d4c411a0973df3d21ac397" }, { "schema_version": "1.0.0", diff --git a/dist/stylized_rock_generator-2.5.0.zip b/dist/stylized_rock_generator-2.5.0.zip deleted file mode 100644 index a8d5240720c2e0618dde04384395912883f0f1bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16991 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 diff --git a/dist/stylized_rock_generator-2.6.0.zip b/dist/stylized_rock_generator-2.6.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..69ab35b482fc70c57928aee497cc0819ef358508 GIT binary patch literal 17621 zcmV(^K-IrcO9KQH0000800J>rIx^Kl?) z(PCe(&LnvABv{;#NK}o|0W=j<*6jKT+dW!vw@e4EBKVj;u=!tSEO~w_lqP>X)Jx1p zcIRjqgb!U%6;d*zgMnY%I7Q*LChFWIO)EuQo=IF{dJ#x3eOYgl-P(+!J6POCO=Gsl{`%%04F0tuf6iOGtToIY!r+ll z*kwGvWk)>XiJ!$ut1HX-d3FOoq2%G~C zO>>^GR3A^uT3UH$n2*vtnX=xm>@Y|dp+DyIosWaLpV9Y|U>;;p8{VgJc*i>i1bD|T z5}xub?Xr{e!`@MnFBUxNvQwy^1b*0Kc{E|y?|MU?nP!V$Oh3Yh`1}^75D&b z@L8NZAU@7VfAVpLL;w4me|+BT1;1N*#8E`7# z)=zowAP#}fFOT;79hbf5$%ID?=20+B5@!LR$NlCXr~RwJ<#GSSyXc<`uC4~qqMTr- zb?RYZ?+9oF2))(ChnwyzWKs9kCjQ<2xy!cP&5okbq7HNc`bSl;&ej%|mVaM0)ENRP zrdb?eOHgNL2TQ*$TC>(Ujnni&G=p`vUzdH`()!jBh=X1QDKKKp)0DG6Ig?+b-fy9g zkDODENPXkqqLA?ODVz8ylmbSb^Yo_UB9!;X2XC*Ak5~`56-uY$n*gN1W1g@-@~Iz& zX%8rw=Xo^SWrxRu;XpORf;3|@ejkTnhP;o!atVTiRLj^T;7oKSazUoou33ah0wtnpTXQld4li|!khEUQx-%Z>wri`jDsjiBv=wT_dzmYcX7m8 zx12A$6l7qF279Y0Iz>?L;xL~h9Vd6)$YkhPNN4o>>Rp*KAKV=%;Jraf%$;#9+gw@=|K%o=<

Myyw-5OB zmAn17B!9`!S&4BvOL??A<=r``Oz$-_GV(;;$D8YY5Wd@*-bY07x1E}E+jh4sRzP5N~bV; z)D=ZP+7JJ8xpq$`-UtVbujz|-A56q3#Ltw^fEqGF2$sI**f^hfNFRP!LQ2zM7I||i zn9Tmh6RHoN-Z%!@S3d*}(u^+(I3rxL%TnpWAH(ucyoTwTz;ACJPY6e#e8lNIjO~Ysc@!WPD-%8iDGajT8^u``6N=Rn8jP6!%!`u%*gz{)@|=Q{ zLubawp7OCGNLfY-uK|n}mgXFk4@K&Z;J}=ZNQNXl7=dQA5rVWC-@rGNSNqq;Cs)U3 zo}m1prq=xyO34rav=DTPzclqlV+l|;jt|a<7jFlb0}FouYgSnVY8;%LUmp(D5QQ44 zaSihOk2bW^8x-Ajp20V-bbvJu(xB=bw99@(iK4Lpi5neMNelSuCym}v2<^zCf2$b- zfeyknVf#rwzL^RvG-L1Jdf$$?9Sh>#onM}xogXj3+!l1b33EG5h}&L?xYs*2%)PE* zu0%%-bKBH@iMbu9T*2Ilf9Lmb>HY$GGiI)ezr*9<)%oSs;Lrms4hL0nEmjvD7gjvJ zYDVPFN=#Z2xnm*0Uz!jprnp4pD+7^#3x$?M2I+IKuNfpsoH&EeV@}(j&aT9Fs|9Lm zmVnBEYcG)O8-5eQN2wm*QjI{w?g&bOy5S;xtp6TWg+gtd@hJ=k_b@^ez^b&ff&~^d z#3b~2J_Q9K133uF#C#F*EE9nI(PN%wu*G?#by)UId|ALaUP?zN8OPr8a0-2O#NbE# z2G)cS)v68D;*o?pFQCIu_>_76Vi7*zDiurtx6W8J*JbhO&n|<<9`3HS>3Wa5;f$2F zh@Hx6%#W1j2KXKEKu%+1Out)TRJP*Y!KT>@{Rf`7G3^&q*B@uW9fxHA9*DwO@~~Ud zAuKKM5_edz=aaQu)qODBUj+mzJ_dk(tK*^}BXK&*z?e`-RF!jOzKrrY=r6E^ z0;be)$9`p724RAnkHmO4wq5Q40UZ>IkNJBq@?VJztdcxnF@_ zh-S83b`5%D?;wt*!R+PMAZ*l|1i-Vqc9~C15U1_}txZsn1e^Npk5c?}JZ~C+isE%l zagRo)Dwe-xkM6z;Y5@?OpQkkRE13D-U=j$^N(#zE&To>e)(xERJPX3qg^f|-0Yc+E z8FQz7aDMjY_^91w*qgnUGT(X$T7qV12WI1hgEqEzmE?xBUeK&~Gzx_R7$sRKA3%ue z7%GT0iqVD&3+9-osZ$j1;=}je`ENRZ>A=2T|1ER#XB)H} zqi)C|#qbdtj@&>^F?Q8lkm8g(_p};4oGvm1bNHo0+UR1a#&vadm zRCMeG_C{6H>g)5hvL`^O@;z3o%tW1Wq_R}+v1pbCRbd51$yc!DT}jJUdX}rydo&;i zvna-GUxuVyYga6iQtf!`9f0z{ciH3t7Ki}N*2b|;?>OUg&|7mdsxyDiPH5qqaXPJ_ za}r^S1)4xxGrL8NWM7;Bg5Irmh@jbVe1#iU5T`v{E>Q^`-=axN+OoXC+4ZS+&_8&K zrxqVS)#ZJF-2tqI(=MwhBXt<=IOKjI|1Ix*JiePaPTTX&&d&y(2a>$ilelE}KJLgO z)Kd350cgD0AEP+DvnkE$nSZO(xHiVQuboX)r^e1o>;jHv$rFV zGsaUmgBd$$OBY=qC6M#JpimZT2h!=sXjN5t? z~P4cL;F!R=^7mXxax81N3nPPjy9mxmz_^K-K;}sa_LkX*^)pE*=Bh! zc^n>eUWh#lKL_Xf-6jlYIQJ9ukce?p*M-+x@bE;QXT2D+&iz|DMKkPhnvq8I>iV7P z7#)kkw%HHaCUeM^>xJm|L1(!^xpuvFKX2@~pIPEh{@E#wG`Jze;%IUkp?d?Y5NPZO zK#L^HWb69fslRBEt*7^E(NvUYkL4;E@!U1HC29uqJ7HqbX}tcjln>C{W~)jDWjSFS z^aN1?@jt_wxO}%hI6N-)>Z&B3th<_Z1!2a~UVAt=(RTKx=A`Q8cW#PP25TD4mt(TJ zHeq|@NCDFm_)+To_@ld7wO<8k=tmPEkz^J`dzy1ld?UI@8M!;wA2o6*;_G!EQa4yPK8I#uI0%s-ip?qCUXaZ77fhwfJ zsbyCT9cCHi^$Au3Vk6HDAqrJR+_Go_>OM!UUcoA6W#Nx+39b4Gb#eaFD1V^$;d}+x z8*Nm$9yHE3-og3V)!@U`Ub}yC;=Sn~42JElrPxLP;5QGHa!}~W>S8N%HhAw{zdPyw zKDZS7V_Tv9^AFzP@w>gPZQI+^{^b$0f(6X8*e^XfDJJ9salJ}hd}|PSm=+RYg9&0s z-Vjq;kq1<;r%8lm0$}-KWM5>O1%ND{h=o=uu`jcSfTgI{&!@1fdMOPA_jA(ZhYMdR zwra;n%KNp;l4vG&TYJdqnsD2P-5)OJxbElh4G-aK&DOXP=#aJRB8SB9Heb=vl-L8PWAty?U^?X_Ss9-A^)6sdnxn5F%oH8i1EUqk?8>)K zp<_Dr$b|t~D^Jc!pN6uO@@3Eq*8Cgl(^>J5(pQq$1M<5Gya+)GLxN-LL)Y3f^k(RE z3~&9ggOBd8SCa8)TUyQodxw#$YkLBaQAD*eIf*jN;k zZYpx=RY&Cdsw;iUTV00EDxlzA?+>pp-zfb|0&s<&i#~^@2aH)-h(&L`O3S?w6v*PN zTa5mdTe`si0J;VsxpzfgHx&$IB+m=;g!IhOF@WR^RZT9D=qNg_d-Pb&jP=(fex%2g zafrx2>vRacD(FLrn57_v_u7*nnuR8?nxk2Nd#&awK1!7bl=HDauqZRL=nxe6zpv#&MiXkP_QRC+GY9lXj(?;$S%x^}JGQ9!vz~ zk_~33q{eq397$@Eyga4@p~qc$c+KuW64Nm&xpVm9Xq!FeQ=f;RGIH`CAz##gmZ~og zvqhW+1eCnFN2QAs)W_`%tTGAf=PA67f=qZm>71Zof%4_g7XXl)tX+0KouYC07Tu7T zFoGk~+)}qFOrm#@`210^N+a{kh{Ht$;jXDp{sPnkGPV=TIUx4i3_7kw>(yJgH%?3KfPK6H@eN@Ah-f_da zi7bWo?i3kx)8dg}inxT&<2&wT#+v`yE#if`>=BL9Sw0PBlG6EjYZ*_)HB4@aXE&`;s6p;gB2iU6a#b`4RyK(s5#VjzPt}2Y#|kfBtQ{tcR)I4P5|FvsQN+p zQ><)XLM*lEu8~a6M?fbgnT%nx7NcR#A5B9%pN+~*MThm|nur#iv~b)FxC~xGzg>I- zq;wn4=UH9fGUFU{acsV+DwFCwzwGIcF1A!}K@V@y;oFV%OX_Rpz#5!JQ=#ggat%O6 zsJI5)_@L1UrN3#E<(~XpqJEd{lm7ApC>SDAM)IzR^b`)hZ9JHX+PEnPOonlMTW-Vk zAr|2|`o5UoEfJXeGMGmQ%l*N-!HMo92bEn4@X>{(7WZS8RIxwx!s?A#o*3DK4em{h zTfKJw?C50BHp}P&ONKcrrhl~ws=~VKKEg7EwSl!tn37HxOU$`X7Msh>y5zqTEtxGv zB4;v|N>1DR!ST^su`jqh?Hdz#AGsou2#9l0JK9~2GN@bgXQuMP5>N(?HBdWQq%^lq zJd(0l6ACbfW1x(0oXMETSrB5_ahyG(-rl3=LR`Ou=&MFlx*81$|7S-FCL}Yt#q(GM zg4R!gby_ilu*e2gHF&{u^9bA@rR0JP-NpvcVVU=StorpLRmi=YbXYF`RywtcB%ei= zt4Y(c#ualXUH%KBnRMxb2{V4v2=^**g-A8r)t@_E&z`C|>6P)VfXATZ(0|TP!1TwQTU~PWV&j4YD59H?~epckT z;#esBy<}J@UwnO(U+pIARM=qb6DSDQGV@J6C|j+4(<}grBR!snbWWn#0rbW;aWgK` z3+P+;FE7&hubq-US5^rxRzp-(7C;$Qyjsf}ayli)xOY*dcLK`WE_-v*zhVw*iW#L? z03IKno}XX6WoUO|{p+i9=FoBT`yjgIVduYkyi9Qyx{X*1qAq>Us1RsvI2PNvjzl|F z=ClcLI+~fYs4m965`YNWc63HUnSq#kLR5%=g+bs7AnBJ4o5^ahc*hoMqn*V9sViUG z&N}@t$E1WHXlhd~Reh$>04Tr7EeUC~4Zhj`&>I{c4SIvmDkTe_iL47CUfo7)F4?I+ zeWzTjfn5~3rbE7D)urAj%qKGri?bv_sziU$$L<+3($tZ!GP+fJ`Z9iOt=+CBA7*^js z#U;~Sx&*Duhp-1b(6v6vY?n%&TpzHm;(MRFm-3>WoC zcL(i(l9Ty4T6a^{CqWRR$rq|!4>XNoey>alKIs3Sz56%`CyD{(DcnaW^nVyijkRTl zsM{bn#wah+90uxsCWvE%D5`Wok48sk`Ab%KC@MUxRe{8fkV#`H>GUe{_%^YOQ8NdhE2oxp(_O5|CDkosS67Uo6z~?F}ji+Twe~) zFWW1|pyA?$T&A?tc0jqK&+=58ox~GLzJ@9dre~7gWFsETNyRx9ncH|maXv5R@IA?4 zyNY@9r2mfQZ1YQSVFQEu%9EV64 zNT-T`LQoVP3Bio7kq`CYCm%G)%%lCLX34t=!U=}(;Y&4KdgzL0NGSgMyJYeL_mR3loQ)@{{ zClro?R{oDz?Nf1_B2Qw;6-C9Qg?Aw(=fEs7&X#6(D-wcrjHMbue7|QFD^rE(j%C<^ zCCn}mfw?1~^WT-pBV;NO=$F3Xm~iyBfI3!NJwSj00ti%WI**osiX&-MtwB>HXGD0i z&iMxPfKH>`N?2D#&4FSao122wUl@naZv4!09BpFPJeL+@H8!-xN%Rk;TR5pMsMaKW zl9QE?v#WR!hw%&^Mm&Go@e1_le`vq^1O@dudiWELFIOC4;^b>c72K%exx`C#{wgh1 z{7a^$P|yJtpamfmb18^^BXPF6uA%eGtqY4VW(zPBf7R65D(^y?1B8! zg;oIz271aCYZ9mTnv0<#7-Y_xjH3FjE=5OlGypFBm5yf*N?&PTob*Ah>VFsv+j?P5 znKJ!_>Gj8!Qh8b!dfrl6PYZ{$MD3yc7x%~>*?Ma~wYC<{?aM!*TnAF26#bRdEM$on z(i;bX@InVU{CMvQ8%e24b{NKi=d%~dt&55YF%%F6X#-0X0WBZV-j<%tiMogBTq8f1 zhxs&|jp|U)iwDE!Gx!7spD2&i<(j^B3M<8*c9|7hc8Xs`?K8ZPg--s33f!8yTh)DKE!E9( zK5o=paj;OwaLuxy^Y{w0!x!m{S_rct4nD#QJ;wrhuH+bim1J12=mDZR^+p^Jq{phr zbW@okev!EsEg!T54I_V%-ozB_%Fv@EL$}+ArO*}FSW>#X8-JQfBdLCFvNGIKPlrG` zx@rqZJrM%hLa+)NM1sf|RQ-V8wkB1A`Zc&%p*e8ga4=QCq<^V!PmH}h!bPEWhLvz! zTrlHM9%fFwQ2B&F^iTaD#LqFN&w(XoB2^f*?H6xs8O?SIpxT13vlj~pY_x;PWpPK`-$~V40Hg)aOrs=o z4xw8CXbhNd1!!aV05W#o!`$p~$c5tSh|zV))Fisr=~xV|czRXf$J+V7+Q(;a&Y`cY z)i09-vL35^1u3mYh)@Ns{A@ej($am)V2sdV^q7? z^^4dfBj1chOw#F%g4W(p%4?04F%8V#M@Iyz0hSN)5f^D%y3A=8$!77@@i^`cDXL5q z_|(;RbCermPr@-yz0GKwUHy6lGx~>}sI=k=+)fv5ofxGCTg1H|HGLRSK~V;vRg||- zD6HsVBrEVDLlqtt7POdb=M>>IF#LCM5=U`>n0Qm1XhUCa6A+@XnF^v-^~}Rju``I~ zFwRB3@AsGu4=TpV%#YAf#Zs>t1OwF$MNA8MPQm~X66(`49?pG^%a#GgI#tDJjM>s6 zYIe=bD;y1B!f!>JDGDE)i{t=uy0%KasurVW2VG3$F!OnGtHa0q)(XA=zg<8_CD2M% zBE@_GLIO~0cO|sXxObyQCdfFoFht5rr@&XkpS2rT6qOOuC|j)>X-|%{1YHE=u*ZAy zTZ-6eAX40(mPzUBlZBpHD<@2VD7w7;v`K4jqL?@nKIMD1Oq$NbMHIjWI}mD9$;Q=) zjfTdHxC*1`?b^`FkyRoeR>0kE7*ZXs;fP;_S|zE%m0h|zI7f*;>FCl=n;y~B>m4IQ zw?Sg^CJl_nk^uLF@k-dSL~=18uhgH zS544ZA{vZho@o-lGMR5-C)ZPfxqA46n%L5VemR1a-~3to^M+@1k|A@p~Kxa6q27iB?7C?^vh9MiF;TV zsj6B}RIA`ro{J~EaJ;)lN}Tz~?hTx-44(xt=zec2R3}+?4aJGv<&>%HzW_K7O7@o2>d?-&{>9A_iDA!fe!2R z^9)qlqT&%c>vWkv!XB7r-gs1836M(hny%KcL^}pSSDm?5EfQK68`p_fo3({v>*vkp zl|qgQc7s7ElbuZPqLX6bAkSuwQMpOe3PJkNhK#N%h^G<|wL+Yj&Nb`uz$)jl?}THMJb|TG7_re{-83jXL8_}wWDj0G8Z?a$k+P+Qf8D_-lRF+i z_ux;YofM&=ojKzC2>C*t%Iv8FnT~$HVuj3#!)J4qwDvp0>lm~izZP7vEmha1zW1X? z|0ZN52q2i-(510hdQ+alu3}f5g-brkZ?T;Xf^Apiw-nd@($q(_6;RjT{mDs@2F3_Q zF8iYQbUhzv-ndw(BV;5pdf7xTMKYq2YHXomChbU>bc+`p;>9$e4hvs?RX45fP&H4g zBEZM4Rmsg_5E%&jxq`5ratFSA2Ws1UZj~Ff8n{|C(Q>XiLnXK;Yk=}opk&QGhpdpn zv`#qdk8fbR3{3vWL-gAc>&t~$DA*ln?0DxP2b~k-29K(OxeP{H-svMuhmomJKXtvJ zOoXvs$DP)hynm3yF?BqWBq|cnP0+X)Aq6(k6^nB3(764;DsoThf?@z=gPD*N za$_RGrbN7wf~!?(hODuU*ejV)P(3^nMm7U#6L?gC+4Yp*01x!3=X4f)bGWz&Myr zrd-1e{-Ex9*$wpLCJrad*A>xkf28lgOuTMwZZ_(<{gKjZDf^q8C(^G_ucDrCc~hW1 zB;LW>rE!O=GumsjtOg zf6II4$po|qZTPJgC8JWwh%UX0KJI@SFz`pf!9zp< zKjMs}>`cG0CzP*_vM%8j7^rgX=OBbL*g=8@-(~w6N%Z*e{`vgm!&^4sU<)Z2bdivo++|qfIF!|29!#!;` zu1#g%F|2vOM9L`AhKsmdSXnN`4NJ;;xuLG!Y!vWwpR(NO|iFn_Sn#%Q7_!Hb-iQy96&ooGr^6p}P z)I2h0C^n?*RGiYB?9tu9A5LIx+3vV9cNgg$U6#+A0kw@wqT6hm@BsHmA}eYYK}EFr zDm~qR+Hj<_Q!agtsDiaK4)G3Hg>BR!hOmu}QsxM)2u6Fv@iZe6`|rszLaQcN5MCLD zHihcCN=I28yK#BjN~@~8)=q3MBf87Zrn)ytp|@z?6IUOiy`O?5Nf}`t9#MFk+bDxD zmllpzz<=YjUp=49 z{O%%}k=iDo3d1Tsts053zj&7v%szl$AyfPL6mJ2}t%ggdy|cBA@((`BWALrb?brAa zKg*}vo3DSyr}(+#L|j(JH8tU+atmXvG;wZB$pnfT6Oxq55TFl@E-ak)M%9dm{v^8bQfqxfd4;uhQ?Y(aOEVv_>Z~SC53PQY) z67|SZH~cM*?tqsuTd{q98jt_$z3 zSd!PMd++Ebxh0D_2&X9^gX=o^!THJgCGb0Ca(-5MR&HfOkVh6M^;5d1EI9_=L6xL)lqig^o5kRr;;PiW~{gtTt5<4vH z*dd6m07vwv2s7ExjIkugs6drZWcNi(2A_Cw6h5pne&v*X^&YpjqWY5@QwFL^R%kY$ zDdjL740~})uL^}iTwe`Z5lMJP>GJErH)h4o~`0gKeMOuwIhmr`5rJclIGxUO^Z{)Y*-CJr8XiqX;=H*crR7-HaVP5M7*<`l zf=_KGVRqrWb36oI?oq)8bkUNDc#CU1q<*)G`>kdSe_paE`@cd z^I{&KBJRmMzw(OnA+#r_j_O|#)){)iL|ybEW2nq39@!^bMe)!dk@HXMNEVZ($)bQp zNLWlA9-WoP?t-ls{t;6?d!9{^Y-70(mYJn zfI=TVqvfN@Jr`aXFsT(1UdhEXoo>~P0o;qJKViZ5NQT%^>;JTB+=H?a| z`S0@-)PIttT{?iJlh}!$OtmYO1ee|hs2|jaAuwFr!x)qos&+bST=q!~);#A`Iu8U# zpz4sa#2=F#)g_o76mu-a){F$vLQc#$1xc1BJ=L$E{j2@v`0RN2c5qnoo8XWEUJD%X zS-QxhTae_q)dtoe_lZK@;h7eRJCiqp=q|pkum&LHjz?e2A$Uh35HC!di%7&kD7+Ud zG1FxhryKajMt$tx<>TtPLM7f;APUFgDxNO`Vf4X30o(mM;)NE`{i*s+V|FbS>0Cq0 zJ;06cy}2I&l_h#1pdxWH0~9d}B4@LK+p29UnF{s^hNlmiYE8W9(0VR1>$Z% z&WExp!nP!Py^oVyJiNkt3j8cjJ$y=`yp`}2;;JL$qs=kL z;nl)U3=+S*KEr4j@AUkze^SypMJ(bFzAB*_q)L$7;z|k_PP;;0k^+J#C?oHx`Acn_ zZBSL$AS68=$&!<_K+8e@>|k(mqO-oe+gHb@urBXfa)*{A|LdN0VyyQvuN?7nM%`(= zvD_x(UTAGJ`nUE9sp0YKu9c0*H`hM1{jazR8i4;x>!FRk1d0Bz$F}TQe@*dPid1=T zh6bb|ZScARt|H{Vn>0!}XEjlnpqse7LHHSEE--uW)!WPS>!Y`(d{lhesO7G;Ock<1 ztUAqMnw8Z^254$^JGSYq?+>bLBa-=()+L$V;6?V4n)S)K9`rz1Odeh=Rg+A8;7R*X z<|i|}rMxDEw3yI;_c;e_~qFs>(ujr0Ekzb;WCeGqT zs_8dnB&@NTN`b4#3#TH~9YgVBZ5=(mxca>Q#+2kt z2S|~&5}r)lByRw1u$~Cf>x1yw&I;~r3$}^g63irlG z)_n2w7NKJ{#^}KrtKUVMy3D22SqVB^b4yJ|WbgExqiEl+~D`V{Iv38?Y?8bU07;BKP|zmR zU}^mbuRcBf3X5V<#a1kPlX%5l73-u9gPv6y1wQ(wCFa%d9QuMq(<3$+V>?5WavaV3;9ym5gvAE7_|u7 zv8gu#9V4|~-(6lPgXi~AFke~z-Fr-`n4% z?WVo2qVrznL|q-ngDSr8ty!Ks1XK``@Kn zU#iWOi|A^5^9yXR4Cm^|zsbTlWy;B#-32~-eb~E-lRWKFg!!$=Xk~T2e%brVi8qQA zQKb_}-O&S9#M09OohGW+mE#!*F!m##HpXC`kmN7o(Jg+L{w(Rg zSc%b%5_=fD3R8_;l&3=2tmd6krj~PHZcr5&-*PNf`Khb_+%kV|e==+?8Aw&U?IbfV#*i%JU=Ht5!oFvsh~@<3jAr)7quS## z^#lx3&$OlJQRIJYc^*;=ju;50RaT)RmMBI?BK?}QNM1YV;wxC1xO$Eyy9^U-VTDK( zKr+oJ6=SLub1B8YQ>LlQ5vX`YeZuH*o}9r0nCnHJDNN$JQ;mIicL5@O42;ev zts;eG(AdUc9;A4Yuqq2m(l~A^48rFCGpe_WVB1AgQI-7R!|#8n(u4^rM~%2K4KMxJ zx_;OCgj)W>4I+B7`Ke=&%s5B@Ya->lCn#1Yop~NMbpw!h)9U;Si?}guNX2%seR_Rz zb$oI1d)ok`IOq0)s|&4@2utD7e(o%x>C)GDgj&ZQCYsiP6z$sCeyNct?7b@ z4{*I~sc{HURcfridR52Orn|LMa)Woj-T*{dv-ADK!}dzF%Zkm6qoby=-j>cPf86sx zX-K^@T8ZhJ>Iphhi}YWD@OK&JzU^V&H$TFATvyiFxVJR^(lsdt|+-6kWw1r9NjvJx-B^#2VD46kjVX=)LS9 zw*53LVU2aLMCCLrz1gb1{OWiypsvJ=QCi2#x1wdxF?ZP}1`MHn8EH&9&4Su0^z%YJ zM;%n<7sY}UZRjd!A}tdpfTGA3l-*>erd2>)t1b5$_ayQo_CDs}D34|s5$1!8kJP5{NfV5>FO(9K?{Wd5?nOqD1#K-5`Q=g!UZs|Utf(|5y>VicunwPqwugmHgOWi(fl@COCjVVP?E)dDVW*)znF)WT@CLrrZ zSAoMQ1W*m}fD40R%Z<1e?BXiN{CVRB4rcl)2Fh#|$^R+a{CwdOFb}_~H!gssoN+K% zcM+$7#BRxsW)abyJ!uO7Wo5ggj#4gRJIXc`2I{r9Dh>R+V=ZI0u;p%-EeIx7sFYj& z0Le##LD)bE)F}$odi|4vX=0O29uCue(8_j=lH66K;LU^2jkFwm)?~9N>y9vfy*M_mtZcH3A!nKiv78)| zPIdjG0*;<)bxj*COrF0Si{qe)ajW3U|*%U)jy-_}$^2E5bjC^in z8@d1Y?-qVb3hK?!(J9=sGME8+;Hbk0!KioO&>Cl8pj z^UKrz$&#DnvADbrRhC7RA>n(}@xAs{|LkaRhWU6!4x7rA<&{(AX7Gd4<3=DhZxS`3 z>LN1A=$xy4aduRq*-iaB?r3+!>U1EzkD-`(XO94H z^YD|&FUGf?yhdWZpv-zTiikz8lVi?M$9net^4@-8T9>-| zshnq~qn~=(=;kLOTYdb*yDxL_(=x0*+r2NLqf>M)F~?P=qtO5gH)6I|!GXoQ_=*l} zJvG@HZW?ZP*4^~}$jNt@vRUyYGTOiMxX7BNu79S4cd#L(rYcv;004p_x*&|31d51|u%8N~^Z7Tf9@O;sEOHs8ZY3KeI z_`H(cK&;QVRQR%SuvykZvAyjL`Rj});bheXGyVzg>~ zS;x;;OyrmQ@)DeC2Wmtq(}2}yQ9B$02BB@sC)1Y!9^=mDlXX8-BMKCliXK-h`f@$Q zOKBsSjcipw4Kvjaso3kPuGHLxHd>n-+JWFs%)`5Soixr9ROY2qOG+8>EPIRwoKzSpVVvn-j7q1bfkIT4gq$SkZ1pD(RT8k0~L#*(& z^e(#zs(N6n)p}2{5OelJ&quLwi5@bTDj%i(5zrbQn>}Jq*9d)DqlnRoCrorzMLLeM zo=l2|QTams!IN(?SHZd@(wPf`HDY-xZ?-VOTs-N3OiD#pxla zE&;5iD@n~hbji?0$)X$p-|2|3`5+Rfu+A7Wyh9Ob^tq!1ei|9McvCDA2Q-fqfY3I( z>=*c_H7uvUrCqMtq5z&QI`mo!)-Fn=;#(B^^OLQ7HiHLDSAMKwajFZOO&`+)kW zx(8d%@AxJTfFwSuo2|9GtgHK{)Yb2cuGTLveJ<~BuHDG|shXOrzNDV64THpI>U3)5KH@+=VQDo19_)@M!MHpw(JIBaD7~jKl?T!^q07(uRK>Sz;zf~b z)UZLswx5KJf~t&sxyTvV^WEJREOm&1m9jxH1w|r5zZ6@MT%a)fFOUj2PfwBxSfN=e zg#Kj7$>oX9Cm;=cygP}G)POT&McfeMr7gN_czOOWvfWrFs+!u04%j`A=w}1ZYdv>k7r8Rj=j$h<$ePW7{Vw>(S7U2Vl2NV-((ws8K9(JhnL~bI2{VJR^f!%%f zv=vrVS;9>*ry!qZhN1#hmXdycG6}cNL~AB(Eg~1Ksq+L758h4#(9i`i0prCPw$2JR z)@|kvMg0E+;zvSXpN}zQ^|X}AYgw-<0zgdNlSIH*w?SR_5f5L?>h$h-@cz}IcX8z@ z&JrTZp=LEfRmdNezEYHHStMB#%(AR-gj0UFSl)Z30^#6w!e_vr#rx~y^3@o2vonz( ztmug$#wLk>-z--`|3Rb^p!pZSzBJG8C`QK|0n3FSI$y$1moSGB{h7M60JqBlw6NC} zODotN#H=fJ>(*7H4yjjM5xZ18lS*n1@A`1|+%*Kcjg zXLY~U=PqzQkof<}qul@5JbQg~Zd&AI&t17={wGdT508k|H(p%Xv1i@ar_84LURM~G zS^hegEX$Iyub{GpuV3lT+DRh&TGGN+Zi|U=%#ht(Hz#uE*^Q63g)Zg(d&udnpL@i= zvYXG}-+7z4*mQ0X)9ab8D=+F0hJ}s=clKuDH&MhwC-D_ip75I`cs2PfeTik#$PvFJ0QcD&^>opKtO4XK`#h z$hY)hQRwbnriH4TGu@tvy1q_(7W(+P+W%XpLUMMOzB}Ue*y7CdiE|(OhUvao%2aMS zKg{>|+^0w1wmnYwf4|UV{b3&YjxSHN(-&nOsE_*j)-)~3{GokyO8(!JOOxZA&j_*? z)!m4^YNN&`qj9%v8>;3ogv#F8z7x_47!b%l=|hwyaqnEO`5Q?<1Y==kb@Kg)e=I zTeazk%<9yrXGc8^xWB~N<;$(VZ}{BGYlr-)KRdJ~7w;(7-hVr0w@z#P`M<0oRdwBXlqhdCNWTo7ZppZdQ{J z^;%TSD{15GAX{tOaQ25&FJAfncIoWk%Ntge$%V(=l99eB@G17@fla#wyX%~U<6d%n zc++X9_kV$E%F|nc%eKaEUQ$@^yjpO*uQ|^OMSeSt!{?1t=gsTb?r~suAe&TKnDOS0 z&(W*rm~^ZO-ompndUb{5+$~`rjkI2Bd%U~!S+-JrUZdW&GE-5>ivjBk8J6k)nhx9m zwIj4l+}P_?c4ENyka{JtlYjR}Hk;OMa``N_?fk*^)!C}HaSv8Jm~@`$fXvdos+Gdb zMKh)~=3OeUTVbF!&nz||x;l2M%~qz;kW)%#@i%{IpS^JVhY;`mUj0_x=zV!sR~xR+ zHF9@!3OGuizHudDiUo+gd#y$G@;MBA%X0HV8xl3vuotRj<##wu|F$k2}dKYTH|L5`l%mLnvOd<@p4-o;LYXJt^8bK7+BSnynz;-SM!~h0{ZH)!M Y(@Bs{$q4XfWdlhv0bvc0c6I^r01tQl;s5{u literal 0 HcmV?d00001 diff --git a/stylized_rock_generator.py b/stylized_rock_generator.py index 86adb1f..b917b7c 100644 --- a/stylized_rock_generator.py +++ b/stylized_rock_generator.py @@ -1,7 +1,7 @@ bl_info = { "name": "Stylized Rock Generator", "author": "D4rkst3r", - "version": (2, 5, 0), + "version": (2, 6, 0), "blender": (4, 2, 0), "location": "View3D > Sidebar > Rock Gen", "description": ( @@ -40,6 +40,14 @@ MATERIAL_PALETTE = ( ("M_Rock_Mossy", (0.24, 0.30, 0.18, 1.0)), ) +# Basis-Groesse je Groessen-Klasse (Meter-Faktor auf das Grundmesh). +# WICHTIG - Unterschied zur Zufalls-Streuung: DIESE Groesse ist gewollt und +# unterscheidet die Klassen. Die Streuung (scale_min/max) variiert dagegen nur +# die FORM innerhalb einer Klasse und wird von "keep_size" auf konstantes +# Volumen normiert, damit sie sich nicht mit den ScaleMin/Max der Engine +# multipliziert. +CLASS_SIZES = {'S': 0.45, 'M': 1.0, 'L': 1.9, 'XL': 3.2} + # Property-Keys, die von Presets gespeichert/geladen werden. PRESET_KEYS = ( "base_shape", "subsurf_levels", "texture_type", "noise_scale", @@ -52,6 +60,7 @@ PRESET_KEYS = ( "shading_mode", "autosmooth_angle", "randomize_shape", "noise_scale_max", "displace_strength_max", "nonuniform_scale", "flatten_bottom", "flatten_ratio", "set_origin_bottom", "keep_size", + "use_class_size", "base_size", ) # Eingebaute Presets (nicht ueberschreibbar/loeschbar). @@ -407,7 +416,18 @@ def _apply_hardsurface(context, obj, settings): def _apply_random_transform(context, obj, settings, rng): if not settings.randomize_transform: + # Klassengroesse gilt trotzdem - sie ist keine Zufalls-Streuung. + base = (CLASS_SIZES.get(settings.name_class, 1.0) + if settings.use_class_size else settings.base_size) + if abs(base - 1.0) > 1e-6: + obj.scale = (base, base, base) + _deselect_all(context) + context.view_layer.objects.active = obj + obj.select_set(True) + bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) return + base = (CLASS_SIZES.get(settings.name_class, 1.0) + if settings.use_class_size else settings.base_size) lo, hi = sorted((settings.scale_min, settings.scale_max)) if settings.nonuniform_scale: sx, sy, sz = (rng.uniform(lo, hi), rng.uniform(lo, hi), rng.uniform(lo, hi)) @@ -418,10 +438,10 @@ def _apply_random_transform(context, obj, settings, rng): g = (abs(sx) * abs(sy) * abs(sz)) ** (1.0 / 3.0) if g > 1e-6: sx, sy, sz = sx / g, sy / g, sz / g - obj.scale = (sx, sy, sz) + obj.scale = (sx * base, sy * base, sz * base) else: s = 1.0 if settings.keep_size else rng.uniform(lo, hi) - obj.scale = (s, s, s) + obj.scale = (s * base, s * base, s * base) obj.rotation_euler = ( rng.uniform(0.0, TWO_PI), rng.uniform(0.0, TWO_PI), @@ -781,6 +801,17 @@ class RockGenSettings(PropertyGroup): "macht die Engine ueber ScaleMin/Max - eine eigene Klasse nur, " "wenn sich die Silhouette aendert"), ) + use_class_size: BoolProperty( + name="Groesse aus Klasse", default=True, + description=("Leitet die Basisgroesse aus der Klasse ab " + "(S=0.45, M=1.0, L=1.9, XL=3.2). Ausschalten, um " + "'Basis-Groesse' frei zu setzen"), + ) + base_size: FloatProperty( + name="Basis-Groesse", default=1.0, min=0.05, max=20.0, + description=("Absolute Groesse des Steins (Faktor). Getrennt von der " + "Zufalls-Streuung, die nur die Form variiert"), + ) name_numbered: BoolProperty( name="Bei Batch durchnummerieren", default=True, description="Haengt bei mehreren Rocks _01, _02 ... an (sonst Blender-Suffix)", @@ -1316,11 +1347,15 @@ class ROCKGEN_OT_randomize(Operator): a = s.random_amount def jitter(prop, lo, hi): - """Wert um +-a in Richtung der Grenzen ziehen, dann clampen.""" + """Wert um +-a in Richtung der Grenzen ziehen, dann clampen. + + Int-Properties brauchen einen int - ein float wirft sonst + TypeError und der ganze Operator bricht ab. + """ cur = getattr(s, prop) span = (hi - lo) * a - val = cur + rng.uniform(-span, span) - setattr(s, prop, max(lo, min(hi, val))) + val = max(lo, min(hi, cur + rng.uniform(-span, span))) + setattr(s, prop, int(round(val)) if isinstance(cur, int) else val) s.seed = rng.randint(0, 9999) jitter("noise_scale", 0.4, 3.0) @@ -1329,7 +1364,6 @@ class ROCKGEN_OT_randomize(Operator): jitter("decimate_ratio_2", 0.3, 0.7) jitter("dissolve_angle", 2.0, 10.0) jitter("subsurf_levels", 3, 5) - s.subsurf_levels = int(round(s.subsurf_levels)) if s.randomize_shape: jitter("noise_scale_max", 0.6, 4.0) jitter("displace_strength_max", 0.2, 0.9) @@ -1444,6 +1478,15 @@ class VIEW3D_PT_rock_generator(Panel): row.prop(settings, "name_form", text="") row.prop(settings, "name_class", text="") box.prop(settings, "name_numbered") + row = box.row(align=True) + row.prop(settings, "use_class_size") + sub = row.row() + sub.enabled = not settings.use_class_size + sub.prop(settings, "base_size", text="") + if settings.use_class_size: + box.label(text="Basis-Groesse aus Klasse %s: x%.2f" + % (settings.name_class, CLASS_SIZES.get(settings.name_class, 1.0)), + icon='FIXED_SIZE') box.label(text="Ergebnis: %s" % _asset_name(settings, 0, settings.batch_count), icon='INFO') diff --git a/tests/test_rock_classes.py b/tests/test_rock_classes.py new file mode 100644 index 0000000..69c114d --- /dev/null +++ b/tests/test_rock_classes.py @@ -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))