From d0557ff466cc9ca1c13845162071dce476d3cba1 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sat, 24 Jun 2023 16:30:53 +0200 Subject: [PATCH] lenia: more smoothing, better kernel generator --- Assets/automata/Automata.unity | 16 +-- Assets/automata/Lenia/glider.mat | 2 +- Assets/automata/Lenia/glider.png | Bin 3604 -> 1195 bytes Assets/automata/Lenia/glider.png.meta | 16 ++- Assets/automata/Lenia/glider_1.png | Bin 1202 -> 0 bytes Assets/automata/Lenia/glider_1.png.meta | 104 ------------------ Assets/automata/Lenia/lenia.shader | 55 ++------- .../Lenia/lenia_generated_kernel.cginc | 27 +++++ .../Lenia/lenia_generated_kernel.cginc.meta | 9 ++ Assets/automata/Lenia/lenia_out.mat | 2 +- lenia-kernel/Cargo.toml | 1 + lenia-kernel/kernel.png | Bin 0 -> 1512 bytes lenia-kernel/src/main.rs | 35 ++++-- 13 files changed, 95 insertions(+), 172 deletions(-) delete mode 100644 Assets/automata/Lenia/glider_1.png delete mode 100644 Assets/automata/Lenia/glider_1.png.meta create mode 100644 Assets/automata/Lenia/lenia_generated_kernel.cginc create mode 100644 Assets/automata/Lenia/lenia_generated_kernel.cginc.meta create mode 100644 lenia-kernel/kernel.png diff --git a/Assets/automata/Automata.unity b/Assets/automata/Automata.unity index 5bc3bb1..080ed51 100644 --- a/Assets/automata/Automata.unity +++ b/Assets/automata/Automata.unity @@ -439,7 +439,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 336599934} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -4.33, y: 0.894, z: 1.465} + m_LocalPosition: {x: -0.612, y: 0.137, z: 0} m_LocalScale: {x: 0.1, y: 0.3, z: 0.03} m_Children: [] m_Father: {fileID: 0} @@ -619,7 +619,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &1206554217 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1214,7 +1214,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1829861728} m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: -2, y: 1, z: 1.5} + m_LocalPosition: {x: -2, y: 1, z: 1.75} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -1396,7 +1396,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 2147880759 + m_Bits: 2147880727 m_RenderingPath: -1 m_TargetTexture: {fileID: 8400000, guid: b8b62218c9d4ca16f887e8ae9d9d2942, type: 2} m_TargetDisplay: 0 @@ -1441,7 +1441,7 @@ BoxCollider: m_IsTrigger: 1 m_Enabled: 1 serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 0.1} + m_Size: {x: 1, y: 1, z: 0.2} m_Center: {x: 0, y: 0, z: 0} --- !u!114 &2044521649 MonoBehaviour: @@ -1550,8 +1550,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2044521647} m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: -1.517, y: 0.543, z: 0.562} - m_LocalScale: {x: 0.123, y: 0.123, z: 0.123} + m_LocalPosition: {x: -2.402, y: 0.506, z: 0.292} + m_LocalScale: {x: 0.125, y: 0.125, z: 0.125} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 6 @@ -1579,7 +1579,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!114 &2129299479 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/automata/Lenia/glider.mat b/Assets/automata/Lenia/glider.mat index dc47608..16c0c3a 100644 --- a/Assets/automata/Lenia/glider.mat +++ b/Assets/automata/Lenia/glider.mat @@ -40,7 +40,7 @@ Material: m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MainTex: - m_Texture: {fileID: 2800000, guid: 46b1bc13f81b050d9b62892b4611d5b9, type: 3} + m_Texture: {fileID: 2800000, guid: 54ef4ec6401904800b71f7ed8b36f52b, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: diff --git a/Assets/automata/Lenia/glider.png b/Assets/automata/Lenia/glider.png index b09f9b39f08eb942119cc4376112c2efe4997032..61f0c7c53e693648074cd6675829da8d2c20490d 100644 GIT binary patch literal 1195 zcmV;c1XTNpP)1PK&F!Dv&Bg0)?swP!AP1B+f|iFCcN_h=c@x16A)F zP*tfHdI&0N5THZ}Y0|{bmlM0*uGhPso!#Y7DNXaKf)E_~+(z@x`_sHL^UMpp(toYk z$2S~16xDV9uJeEF+?1gPNb6=PyV>t~GmT-fM1@H}u0${99r zDSQ5+F_xh59l!PP$=nxnUoWHa5`bw;R*iCAOZyPpZgU0-}MZCzSZEJ@bdPNI@!E`N#ly|6ma2W#hGBt(0e(xU4am%90e9)Zh8i z35-R)c0oOpVaar4Eb-b&fY)(;R2eGKzKopAvQ$n<530qoHvEqMh8bmk<%`ELN>VZ@%?q@Yy4$c7ONb zH;wO~t@VKbA!Rh}8VA_V0UA^VRE45~$&dpCuJC*aTR5%2%Cc07CKyOu)(rH9)WY@R z)oOZtrMtewS7i_xQVd|A#{wt_1*IS{#3TX$0YV`>AAv7KQ?&C+T9KIxuM>0uXhhM8 zX2!Ds45k;hAc5jhO7`uK_e0o2nIqy1Ogs7cHp#xwd=Ka z#FH()+vHXNF~&wz!Wf~U7oJNDUvnq#*$)l^0*C-%gb;`TP|zgNHKG!kFqsfp4iVXb z6Cv`@BShlDZ*ptiU9s%8fark(X!ED@*79EV7XS`C4&R69ao#~!hC~TT$ni8wJbRG= zLKVzFJU|drV+s@sqBEtVxdoPuLv8W)D&M$c&m4VCJ7|t8V=0=DWvLr@Ex)}LG= zE`QP%wi9$aVb=|McH~%rZHbP>Z71x;0;x~Sj_QLYwJ)U^1ac_E+P<6mdX5c z{SNmWxGh-gR-O>U~9np;t_G<;$IQozmP%pb@6peE5 zb$9EwefPMhJBQ`HEI05rWyFX7$g2JLVto#p-7@Nb;<1OG1W7vNgGb7Qk=K$j#BAPO zu&Qejjdm`ILQ)KTH|HqhK3P{rBn=F~7Pa)`(7 z<`4G$zw_yjWALW=ZZ%QvBiV?+7M-TBRy&&>JcH>zM2kPIxtoU%_9eQCJ$-82yxMnZ zJTX#GvIf%yf+n|Cdh7SL9(>!l{qJ@@Rg8aROb^0*)dc=e^%tcT&u&lX_8R~I002ov JPDHLkV1guNHuC@g literal 3604 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 diff --git a/Assets/automata/Lenia/glider.png.meta b/Assets/automata/Lenia/glider.png.meta index 933d979..abb5e82 100644 --- a/Assets/automata/Lenia/glider.png.meta +++ b/Assets/automata/Lenia/glider.png.meta @@ -31,7 +31,7 @@ TextureImporter: maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: 1 + filterMode: 0 aniso: 1 mipBias: 0 wrapU: 0 @@ -64,7 +64,19 @@ TextureImporter: maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 - textureCompression: 1 + textureCompression: 2 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 2 compressionQuality: 50 crunchedCompression: 0 allowsAlphaSplitting: 0 diff --git a/Assets/automata/Lenia/glider_1.png b/Assets/automata/Lenia/glider_1.png deleted file mode 100644 index 990bb5a5305cd5d610699e173c24f0a2e9815508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo&iP)6K!O7i;);ZXK;p=OBLeYI z4?S?G#07ys` zJ3HT}08Ilo7Y*Jl02TlXfCaz;U;(fISO6>l761!CV>VBvC+sF5{X^}yfr5U2hY={) z<~Az5xnC4?`kFz3Te(0P@sTsf>JxzSny!BaIAvqSHdU$B9rE7<3ih-N2#sAX6Jn;< zVj}xIb^(BM+1P*1_wMcyP;ghc-;7o8)VFT~a3X>6KZyv!^TuJQCO?v)rAtyw~Ls zi^bQIpkOR9Eo0tKjQ=kk4}=Cp$Kf4!f`WaK8$`$G@(ch^jvcQx19Xl2T|3zYoL_G( z34r~c>jBsu>XYEsFP!4U$@i(z^SDP z(Q$n7hepZ-b;Vg#5(9PxdQ1k_6cWqk8PMr1$lAR@6Cm3LM0S72jiBJw$xpzQGI)>ZIM6i= z3QjEiEb|>(_zr-q*7Cog$5)FOpsQdVU9Ul~l)zU`8eJt9&>K2=&(6~sph>x}$_;dm zrd_^*%%c=2NTyRF`z$&E3O-o)NvIw1g#fs{wO16r)NC@#xhwI)29(Pw4A?3f>n(MQ zq5-(1m!bpSrT{EIx_=Jo+|gxo%%@oXw? zf?H-?sMzfB<*vnr?C<8#cH=6cPLch#{s#c#iA9mE=K^dZy(aS|Gsab>l7)KWNAsq_ z6xB(QrE1Fny@g{PQW2V1i<*K+bDzlOQon}v*dGv*J58+)IyJT+#)){Ui02jZOkWf zFJIo79u--PbkXxS{M+HO7!cmzK`-@(pM!f?BVb*06n?Dhl2BoC6h6( zOw~(C%=vALD?-<}3;a`ix%WYtd1o+UvbE^AobN}Y-(NN6U}z8&3t-n5qf@_9LmODRfs})E2}~>!7$XkF7u`I>(U1`GEbT^_ z$*ldePVK5QAq`nWSYp6A10=qwLSnCdQDO`w;vW(*-USGiMZ(yKE}6#P6<_EJU-~4^ z-HYeX@AvzDKfmXl?yfer#9D$7V%uMAeF^^0Xp_;w_i0`HHbOkKxs>?(Nm03=BA(t)cl_<0ZMyf!>izBO_;W zTFB1VH@~Et|22P}T5pU#ewMgiaV}eT33(kWOlq<2#sY(mop{&eH#OxagR!mJG$TYE zD~pDr?nf1umRo4s9ATR)uGF>*e468BE{dWH5*n+R39_qxRy1W53m-fUr#Yt>>cGV{ zat-X_>h1_ef^l4iO}+K zOuEe3KGN=+62!o{q-`ehqeNa24Jj__F#ErH@SRKzr4A>Hs`TbyB*S8>T?%eteH*5_ zGL(0jsMTS;kSm_tTWHElWLIW?x7ufPSgZ8Yx7Wv=6L++{`?1kJNlPJONd_56)H5+_ zvMWXhQ$@XhEs_~TPBG8{*LdfMtVA{?tC|pHQJI*+I42G@Z+`AwmMK26f(;HH?j^*) zyjmmDaoJVhOuo2^6lN#jPMuZm;PRULomqteBPj4-D0NY!veF?CXX7dw zqqh-wcUm-o)2X9c_@8k3lFa4mb#sJUp^|zKz^;fxr|3#l8Ff*mj<|*k_jbSTF$6f@>0ly8xlbcngV+TfGS*O zP~2svT?u-5RS=| z7bSw4nRbzeIuCMsWL24^G!ReLrU&zyP&eJ%zA0`=u2YJ4dwf(v!>9^{x5l7*bs%Zk zQ$WA2s06j);+@cRW?gOHH6{=3goRf#g(O}RcmkLEp_2n1d=k2KRT&2#E~~>y!!RTO zXcSri-j<@nATmdZfzP1qYyFtl`gJwjflWJbRwJm;+STWiCVK&(f{*swL6g&>mI5 = env::args().skip(1).collect(); if args.is_empty() { - println!("usage: kernel_radius"); + println!("specify kernel radius, eg:"); + println!("cargo run 16 > ../Assets/automata/Lenia/lenia_generated_kernel.cginc"); return; } let radius = args[0].parse().unwrap(); let k_offset = 0.435; let k_sharpness = 28.0; + let mut img = image::RgbImage::new(radius * 2 + 1, radius * 2 + 1); + let mut total_max = 0.0; - println!(" // generated by the rust program"); - println!(" const int Radius = {};", radius); - println!(" #define RADIUS {}", radius); - println!(" // kernel LUT size is {} bytes", radius * (radius + 1) * 2); - println!(" const half Kernel[{}][{}] = {{", radius + 1, radius); + println!("// generated by the rust program"); + println!("const int Radius = {};", radius); + println!("#define RADIUS {}", radius); + println!("const half Kernel[{}][{}] = {{", radius + 1, radius); for y in 0..=radius { - print!(" {{"); + print!(" {{"); for x in 1..=radius { - let k = k(x, y, radius, k_offset, k_sharpness); + let k = (k(x, y, radius, k_offset, k_sharpness) * 50.0).floor() / 50.0; total_max += k * 4.0; - print!("{:.4}, ", k); + print!("{:.2}, ", k); + { + let pixel = image::Rgb([0, (k * 255.0) as u8, 0]); + // let cx = radius + img.put_pixel(radius + x, radius + y, pixel); + img.put_pixel(radius - y, radius + x, pixel); + img.put_pixel(radius - x, radius - y, pixel); + img.put_pixel(radius + y, radius - x, pixel); + } } println!("}},"); } - println!(" }};"); - println!(" const float TOTAL_MAX = {};", total_max); + println!("}};"); + println!("const float total_max = {};", total_max); + img.save("kernel.png").unwrap(); } -fn k(x: usize, y: usize, radius: usize, k_offset: f32, k_sharpness: f32) -> f32 { +fn k(x: u32, y: u32, radius: u32, k_offset: f32, k_sharpness: f32) -> f32 { let x = x as f32; let y = y as f32; let r = (x * x + y * y).sqrt() / radius as f32;