From 05e078907797c43cf1c98852abcf7530bac06daa Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sun, 30 Jul 2023 18:40:00 +0200 Subject: [PATCH] Lenia: replace kernel with one from the paper, replace glider with a new life form --- Assets/automata/Automata.unity | 32 +++++++----- Assets/automata/Lenia/glider.png | Bin 1195 -> 3444 bytes Assets/automata/Lenia/glider.png.meta | 2 +- Assets/automata/Lenia/lenia.shader | 21 +++----- .../Lenia/lenia_generated_kernel.cginc | 48 +++++++++--------- Assets/automata/Lenia/lenia_sim.mat | 6 +-- Assets/automata/ca_output.shader | 10 ++-- lenia-kernel/kernel.png | Bin 1512 -> 1439 bytes lenia-kernel/src/main.rs | 25 ++++----- 9 files changed, 71 insertions(+), 73 deletions(-) diff --git a/Assets/automata/Automata.unity b/Assets/automata/Automata.unity index a6a1faa..463cc80 100644 --- a/Assets/automata/Automata.unity +++ b/Assets/automata/Automata.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.17288938, g: 0.21605867, b: 0.2980182, a: 1} + m_IndirectSpecularColor: {r: 0.12732331, g: 0.1341519, b: 0.12107962, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -149,7 +149,7 @@ Light: serializedVersion: 10 m_Type: 1 m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Color: {r: 1, g: 1, b: 1, a: 1} m_Intensity: 1 m_Range: 10 m_SpotAngle: 30 @@ -206,13 +206,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 88997009} - m_LocalRotation: {x: 0.7321534, y: -0.01281865, z: 0.00015350126, w: 0.68101907} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 85.73, y: -166.615, z: -165.563} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!1 &128608326 GameObject: m_ObjectHideFlags: 0 @@ -830,7 +830,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 336599934} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -8.069, y: 0.308, z: -0.419} + m_LocalPosition: {x: -4.62, y: 0.628, z: -0.16} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -1241,7 +1241,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &1144161807 Transform: m_ObjectHideFlags: 0 @@ -1273,6 +1273,7 @@ MonoBehaviour: m_EditorClassIdentifier: type: 3 objectId: e534d995-c7d9-4760-a831-8afcd31677ec + randomNum: --- !u!114 &1144161809 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1343,7 +1344,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &1170317911 Transform: m_ObjectHideFlags: 0 @@ -1397,6 +1398,7 @@ MonoBehaviour: m_EditorClassIdentifier: type: 3 objectId: 6969fb97-fd3c-4d86-bc5e-d36b10bc55fc + randomNum: --- !u!114 &1170317914 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1773,7 +1775,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!65 &1377711729 BoxCollider: m_ObjectHideFlags: 0 @@ -1866,6 +1868,7 @@ MonoBehaviour: m_EditorClassIdentifier: type: 3 objectId: a35590d3-83fd-413c-89cf-7b7741360e1b + randomNum: --- !u!114 &1377711734 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2269,8 +2272,8 @@ Camera: near clip plane: 0.3 far clip plane: 1000 field of view: 60 - orthographic: 0 - orthographic size: 5 + orthographic: 1 + orthographic size: 1 m_Depth: -1 m_CullingMask: serializedVersion: 2 @@ -2346,6 +2349,7 @@ MonoBehaviour: m_EditorClassIdentifier: type: 3 objectId: c4c0c234-abdc-4599-9251-2ba11d272218 + randomNum: 83754194 --- !u!114 &1928596181 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2635,6 +2639,7 @@ MonoBehaviour: m_EditorClassIdentifier: type: 3 objectId: 10538b39-c796-453b-bbdd-6ea4d67d6aa1 + randomNum: 15816574 --- !u!114 &2044521651 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2709,8 +2714,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2044521647} m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: -2.402, y: 0.506, z: 0.277} - m_LocalScale: {x: 0.125, y: 0.125, z: 0.125} + m_LocalPosition: {x: -2.402, y: 0.506, z: 1.22} + m_LocalScale: {x: 0.25, y: 0.25, z: 0.25} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 7 @@ -2738,7 +2743,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 @@ -2753,6 +2758,7 @@ MonoBehaviour: m_EditorClassIdentifier: type: 3 objectId: 9e648b07-a7c6-4bdb-80b5-6e399757a224 + randomNum: --- !u!114 &2129299480 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/automata/Lenia/glider.png b/Assets/automata/Lenia/glider.png index 61f0c7c53e693648074cd6675829da8d2c20490d..d7741b3de71107d664a3c5993cd0b30f97133c86 100644 GIT binary patch literal 3444 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 SLdw531wbLu2pRM{T?S 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 diff --git a/Assets/automata/Lenia/glider.png.meta b/Assets/automata/Lenia/glider.png.meta index abb5e82..4c10254 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: 0 + filterMode: 1 aniso: 1 mipBias: 0 wrapU: 0 diff --git a/Assets/automata/Lenia/lenia.shader b/Assets/automata/Lenia/lenia.shader index 53ffc0b..013ca87 100644 --- a/Assets/automata/Lenia/lenia.shader +++ b/Assets/automata/Lenia/lenia.shader @@ -5,7 +5,7 @@ _LastFrame ("Texture", 2D) = "white" {} _GrowtCenter ("Growth fn center (mu)", Range(0, 1)) = 0.2 _GrowthWidth ("Growth fn width (sigma / std deviation)", Range(0, 1)) = 0.07 - _Speed ("Speed factor", Range(0.3, 5)) = 1 + _Speed ("Speed factor", Range(0.01, 0.5)) = 0.05 } SubShader { @@ -22,16 +22,13 @@ #define WIDTH 512 - struct appdata - { + struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; - struct v2f - { + struct v2f { float2 uv : TEXCOORD0; - float4 vertex : SV_POSITION; }; @@ -40,8 +37,7 @@ float _GrowthWidth; float _Speed; - v2f vert (appdata v) - { + v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; @@ -63,7 +59,7 @@ // return exp(alpha - alpha/(4.0 * r * (1.0 - r))); } - inline float activation(float neighbors) { + float activation(float neighbors) { // return old_state * (neighbors > 2 && neighbors < 5) + // ((1 - old_state) * neighbors == 3); @@ -76,14 +72,13 @@ return exp(-((u-mu) * (u-mu)) / (2 * sigma * sigma)) * 2.0 - 1.0; } - inline float value(uint2 p, int dx, int dy) { + float value(uint2 p, int dx, int dy) { const uint x = (p.x + dx) % WIDTH; const uint y = (p.y + dy) % WIDTH; return _LastFrame[uint2(x, y)].r; } - fixed4 frag (v2f i) : SV_Target - { + float4 frag (v2f i) : SV_Target { if(_ProjectionParams.z > 1) discard; // Defines RADIUS Kernel total_max @@ -104,7 +99,7 @@ float old_state = value(p, 0, 0) ; float count = total / total_max; - const float step = _Speed * unity_DeltaTime.x; + const float step = _Speed * unity_DeltaTime.x * 60; float state = activation(count) * step + old_state; state = clamp(state, 0, 1); diff --git a/Assets/automata/Lenia/lenia_generated_kernel.cginc b/Assets/automata/Lenia/lenia_generated_kernel.cginc index 55e4e32..3939d01 100644 --- a/Assets/automata/Lenia/lenia_generated_kernel.cginc +++ b/Assets/automata/Lenia/lenia_generated_kernel.cginc @@ -1,28 +1,26 @@ // generated by the rust program -#define RADIUS 20 -const half Kernel[21][20] = { - {0.00, 0.04, 0.10, 0.20, 0.38, 0.60, 0.80, 0.96, 0.98, 0.88, 0.68, 0.46, 0.26, 0.12, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, }, - {0.02, 0.04, 0.10, 0.22, 0.40, 0.60, 0.82, 0.96, 0.98, 0.88, 0.68, 0.44, 0.26, 0.12, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, }, - {0.04, 0.08, 0.16, 0.28, 0.46, 0.66, 0.86, 0.98, 0.98, 0.84, 0.64, 0.42, 0.24, 0.12, 0.04, 0.02, 0.00, 0.00, 0.00, 0.00, }, - {0.10, 0.16, 0.24, 0.38, 0.56, 0.74, 0.92, 0.98, 0.94, 0.80, 0.58, 0.38, 0.22, 0.10, 0.04, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.22, 0.28, 0.38, 0.52, 0.68, 0.84, 0.96, 0.98, 0.90, 0.74, 0.52, 0.32, 0.18, 0.08, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.40, 0.46, 0.56, 0.68, 0.82, 0.94, 0.98, 0.96, 0.82, 0.64, 0.44, 0.26, 0.14, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.60, 0.66, 0.74, 0.84, 0.94, 0.98, 0.98, 0.88, 0.72, 0.54, 0.34, 0.20, 0.10, 0.04, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.82, 0.86, 0.92, 0.96, 0.98, 0.98, 0.90, 0.76, 0.58, 0.42, 0.26, 0.14, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.96, 0.98, 0.98, 0.98, 0.96, 0.88, 0.76, 0.60, 0.44, 0.30, 0.18, 0.10, 0.04, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.98, 0.98, 0.94, 0.90, 0.82, 0.72, 0.58, 0.44, 0.32, 0.20, 0.10, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.88, 0.84, 0.80, 0.74, 0.64, 0.54, 0.42, 0.30, 0.20, 0.12, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.68, 0.64, 0.58, 0.52, 0.44, 0.34, 0.26, 0.18, 0.10, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.44, 0.42, 0.38, 0.32, 0.26, 0.20, 0.14, 0.10, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.26, 0.24, 0.22, 0.18, 0.14, 0.10, 0.06, 0.04, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.12, 0.12, 0.10, 0.08, 0.06, 0.04, 0.02, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.06, 0.04, 0.04, 0.02, 0.02, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.02, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, - {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, +#define RADIUS 18 +const float Kernel[19][18] = { + {0.00, 0.00, 0.04, 0.16, 0.37, 0.60, 0.81, 0.95, 1.00, 0.95, 0.81, 0.60, 0.37, 0.16, 0.04, 0.00, 0.00, 0.00, }, + {0.00, 0.00, 0.05, 0.18, 0.39, 0.62, 0.82, 0.95, 0.99, 0.94, 0.80, 0.59, 0.36, 0.16, 0.03, 0.00, 0.00, 0.00, }, + {0.00, 0.02, 0.10, 0.25, 0.46, 0.67, 0.85, 0.97, 0.99, 0.93, 0.77, 0.56, 0.33, 0.14, 0.03, 0.00, 0.00, 0.00, }, + {0.05, 0.10, 0.21, 0.37, 0.56, 0.75, 0.90, 0.98, 0.98, 0.90, 0.73, 0.52, 0.29, 0.11, 0.02, 0.00, 0.00, 0.00, }, + {0.18, 0.25, 0.37, 0.52, 0.69, 0.84, 0.95, 0.99, 0.96, 0.85, 0.67, 0.45, 0.24, 0.08, 0.01, 0.00, 0.00, 0.00, }, + {0.39, 0.46, 0.56, 0.69, 0.82, 0.93, 0.99, 0.99, 0.91, 0.77, 0.58, 0.37, 0.18, 0.05, 0.00, 0.00, 0.00, 0.00, }, + {0.62, 0.67, 0.75, 0.84, 0.93, 0.98, 0.99, 0.95, 0.84, 0.68, 0.48, 0.28, 0.11, 0.02, 0.00, 0.00, 0.00, 0.00, }, + {0.82, 0.85, 0.90, 0.95, 0.99, 0.99, 0.96, 0.87, 0.73, 0.55, 0.36, 0.18, 0.06, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.95, 0.97, 0.98, 0.99, 0.99, 0.95, 0.87, 0.75, 0.59, 0.41, 0.24, 0.10, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.99, 0.99, 0.98, 0.96, 0.91, 0.84, 0.73, 0.59, 0.43, 0.27, 0.13, 0.04, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.94, 0.93, 0.90, 0.85, 0.77, 0.68, 0.55, 0.41, 0.27, 0.14, 0.05, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.80, 0.77, 0.73, 0.67, 0.58, 0.48, 0.36, 0.24, 0.13, 0.05, 0.01, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.59, 0.56, 0.52, 0.45, 0.37, 0.28, 0.18, 0.10, 0.04, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.36, 0.33, 0.29, 0.24, 0.18, 0.11, 0.06, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.16, 0.14, 0.11, 0.08, 0.05, 0.02, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.03, 0.03, 0.02, 0.01, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, + {0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, }, }; -const float total_max = 356.63977; -// Total texture lookups: 206 * 4 + 1 = 825 +const float total_max = 386.71994; +// Total texture lookups: 185 * 4 + 1 = 741 // (lookups multiplied by 0.0 get optimised away by the shader compiler, and this giant table generally only exists at compile time) diff --git a/Assets/automata/Lenia/lenia_sim.mat b/Assets/automata/Lenia/lenia_sim.mat index 0e01792..3f56f7c 100644 --- a/Assets/automata/Lenia/lenia_sim.mat +++ b/Assets/automata/Lenia/lenia_sim.mat @@ -70,8 +70,8 @@ Material: - _GlossMapScale: 1 - _Glossiness: 0.5 - _GlossyReflections: 1 - - _GrowtCenter: 0.14 - - _GrowthWidth: 0.013 + - _GrowtCenter: 0.28 + - _GrowthWidth: 0.04 - _KOffset: 0.436 - _KSharpness: 28.3 - _Metallic: 0 @@ -81,7 +81,7 @@ Material: - _Radius: 13 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - - _Speed: 2 + - _Speed: 0.05 - _SrcBlend: 1 - _UVSec: 0 - _ZWrite: 1 diff --git a/Assets/automata/ca_output.shader b/Assets/automata/ca_output.shader index 0e82a51..85daf99 100644 --- a/Assets/automata/ca_output.shader +++ b/Assets/automata/ca_output.shader @@ -18,21 +18,19 @@ // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 - struct Input - { + struct Input { float2 uv_MainTex; }; sampler2D _MainTex; - half _Emission; + float _Emission; - void surf (Input IN, inout SurfaceOutputStandard o) - { + void surf (Input IN, inout SurfaceOutputStandard o) { // don't interfere with simulation camera if(_ProjectionParams.z < 1) discard; // Albedo comes from a texture tinted by color - fixed4 c = tex2D(_MainTex, IN.uv_MainTex); + float4 c = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Emission = c.rgb * _Emission; diff --git a/lenia-kernel/kernel.png b/lenia-kernel/kernel.png index c5a987f385b234c4008aa6bae582d7f63bd705fe..cab78445bc83c6ce659e3e8356f152b16b8ff165 100644 GIT binary patch literal 1439 zcmcIk{ZA8T9KXA^*Ef3=6bkLp!CGJD3p5ey!5Y>=Eie_`qENMvt0pZAh1~*OtF>EqpcL9X3pKQ#`RUUw6`x~1OSEb_{_v8^omMq-{bxUUXD;%Tl#Gi~Ji0v- zE?(cx_16(}YeMlCB{fwz=OP*UIHm8RJH*OZSTj@?Lbno(n!*+%69VpGOl@bTRth-S zFKkT6jMDq*8x(FOF<1#utqI*?|6R(Eh5e%9+@nK%x2(dEpu&b5F>MIs3#4&GRoUQ9 z)x=nXU=F0$Ad3;nNXuMbXR;XJP@_Z}9R@!fav6Je{|nJA z@VBoY9N9o(lVYVueZ{M$O$pry`U2X|_>;1tQTF^&DS^aU%u1@8Ku-N&8XqkE@$&LE z**quPBocu-x#qdp7Ob`@joRL1jaeFFO^{U}aJIOI)8u-T!d2#$ToH7bgAJA_Vp>Qa zP8deu-egr#-#0rU1GPO1)M|W8Vg?Q#wy?rsM*f6EyNBu^3$Mon#6zDd>Ko5{E`pQ9 zomSYB_`HQ3lwY;&f#dcNjmT)!G+?P+&gQ#{ykXQHLSUH+iuk{??UBSCY#7zhNJ-DE zV=0SNKaR7Aokf)zJ#^ZyG`5F#j*&8@UA`m3oTu`~M;|_@&h+O_Bw7L~x4Kh$m+{-> zZORTJY$BL~fFo&*g`SEIN}8h^Nbg%JO&ISathXVg~G-$R-uSGgHbIhqsL`^|k+iiR14(B&>>PJEwA)oYOpd|wUe}jTukAYZP zZ79m$;NT=2V^50s0S!k120`%!(u)*{`3NrO@GQV&nQ8*6erlTUO zS><=TSL_$$dhctC%w53Di{9t)L5F-&_{d$yB0Dnuof(Lf`9%x}DOqGdx8qaYRZKT! zcxmxiNCQk9duix6L`nUkHK?-5y4Y^&*X}oL7sKH{9!Tl3xIKc+9~h;*U}kkA@P1}8 zeO@T0jQ4C8`4zpF$=e9TQKCaYkvx|>rFt&lS@7 zD^KNBd>Rz1Gjt~bPkPl>FDlcIiEA-ZSI*bqsoUzZw)G{`U^s^ylRHj>*&HJ^rWdb2 syR6>47Fyp9nJXLGoWH-iyY9V(9Q)Y&elvBl23)*QODRfs})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 0.0 { total_lookups += 1; @@ -50,15 +48,18 @@ fn main() { img.save("kernel.png").unwrap(); } -fn k(x: u32, y: u32, radius: u32, k_offset: f32, k_sharpness: f32) -> f32 { +fn k(x: u32, y: u32, radius: u32) -> f32 { let x = x as f32; let y = y as f32; let r = (x * x + y * y).sqrt() / radius as f32; - f32::exp(-((r - k_offset) * (r - k_offset)) * k_sharpness) + // let k_offset = 0.435; + // let k_sharpness = 28.0; + // f32::exp(-((r - k_offset) * (r - k_offset)) * k_sharpness) + // lenia paper example kernel - // if r < 1.0 { - // f32::exp(4.0 - 4.0 / (4.0 * r * (1.0 - r))) - // } else { - // 0.0 - // } + if r < 1.0 { + f32::exp(4.0 - 4.0 / (4.0 * r * (1.0 - r))) + } else { + 0.0 + } }