From 111f4a21aff56ab7e63273836eb52c5a80b60f16 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Sun, 25 Jun 2023 18:33:37 +0200 Subject: [PATCH] lenia: normalize time --- Assets/automata/Lenia/lenia.shader | 28 +++++-------------- .../Lenia/lenia_generated_kernel.cginc | 1 - lenia-kernel/src/main.rs | 1 - 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/Assets/automata/Lenia/lenia.shader b/Assets/automata/Lenia/lenia.shader index 49f08f0..dbbe5bf 100644 --- a/Assets/automata/Lenia/lenia.shader +++ b/Assets/automata/Lenia/lenia.shader @@ -74,8 +74,6 @@ return exp(-((u-mu) * (u-mu)) / (2 * sigma * sigma)) * 2.0 - 1.0; } - - inline half value(float2 center, float x, float y) { return tex2D(_LastFrame, center + float2(x, y)).r; } @@ -86,14 +84,14 @@ const float resolution = 512.0; const float d = 1.0 / resolution; - // Defines RADIUS Radius Kernel total_max + // Defines RADIUS Kernel total_max #include "lenia_generated_kernel.cginc" float total = 0.0; [unroll(RADIUS)] - for (int y = 0; y < Radius; y++) { + for (int y = 0; y < RADIUS; y++) { [unroll(RADIUS)] - for (int x = 1; x <= Radius; x++) { + for (int x = 1; x <= RADIUS; x++) { const float xx = (float)x * d; const float yy = (float)y * d; total += value(i.uv, xx, yy) * Kernel[y][x-1]; @@ -102,23 +100,11 @@ total += value(i.uv, yy, -xx) * Kernel[y][x-1]; } } - // */ - /* - float total_max = 0; - float total = 0; - for (int x = -Radius; x <= Radius; x++) { - for (int y = -Radius; y <= Radius; y++) { - float dist = sqrt(x*x+y*y); - float kval = kernel(dist); - total_max += kval; - total += value(i.uv, x*d, y*d) * kval; - } - } - // */ float old_state = value(i.uv, 0.0, 0.0) ; float count = total / total_max; - float state = activation(count) * _Speed + old_state; + const float step = _Speed / _Time.x; + float state = activation(count) * step + old_state; state = clamp(state, 0, 1); // kernel visualization: lookup table (SLOW) @@ -139,10 +125,10 @@ // kernel visualisation: real size // float2 p = (i.uv - 0.5) * resolution; - // float k = kernel(length(p)) * (max(abs(p.x), abs(p.y)) <= _Radius); + // float k = kernel(length(p)) * (max(abs(p.x), abs(p.y)) <= RADIUS); // kernel visualisation: fill square - // float k = kernel(length(i.uv - 0.5) * _Radius * 2); + // float k = kernel(length(i.uv - 0.5) * RADIUS * 2); // float a = activation(i.uv.x); // float4 col = float4(state, k, a, 1); diff --git a/Assets/automata/Lenia/lenia_generated_kernel.cginc b/Assets/automata/Lenia/lenia_generated_kernel.cginc index 5bb2204..b98614d 100644 --- a/Assets/automata/Lenia/lenia_generated_kernel.cginc +++ b/Assets/automata/Lenia/lenia_generated_kernel.cginc @@ -1,5 +1,4 @@ // generated by the rust program -const int Radius = 20; #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, }, diff --git a/lenia-kernel/src/main.rs b/lenia-kernel/src/main.rs index aa010ed..6cf0754 100644 --- a/lenia-kernel/src/main.rs +++ b/lenia-kernel/src/main.rs @@ -15,7 +15,6 @@ fn main() { let mut total_max = 0.0; 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 {