feat: multibrot exponent up to 20
This commit is contained in:
@@ -106,7 +106,7 @@ fn advance(z: vec2<f32>, zp: vec2<f32>, c: vec2<f32>) -> vec2<f32> {
|
||||
} else if KIND == KIND_TRICORN {
|
||||
return vec2<f32>(z.x * z.x - z.y * z.y, -2.0 * z.x * z.y) + c;
|
||||
} else if KIND == KIND_MULTIBROT {
|
||||
return complex_pow(z, clamp(u.power, 2u, 8u)) + c;
|
||||
return complex_pow(z, clamp(u.power, 2u, MULTIBROT_MAX_POWER)) + c;
|
||||
} else if KIND == KIND_CELTIC {
|
||||
return vec2<f32>(abs(z.x * z.x - z.y * z.y), 2.0 * z.x * z.y) + c;
|
||||
} else if KIND == KIND_PERPENDICULAR {
|
||||
|
||||
@@ -43,6 +43,10 @@ const KIND_MANDELBROT: u32 = 0u;
|
||||
const KIND_BURNING_SHIP: u32 = 1u;
|
||||
const KIND_TRICORN: u32 = 2u;
|
||||
const KIND_MULTIBROT: u32 = 3u;
|
||||
// Highest Multibrot power (the UI/CLI/share-link clamp in app.rs matches).
|
||||
// `bailout_sq` in app.rs shrinks the bailout with the power so z^p stays a
|
||||
// finite f32.
|
||||
const MULTIBROT_MAX_POWER: u32 = 20u;
|
||||
const KIND_CELTIC: u32 = 4u;
|
||||
const KIND_PERPENDICULAR: u32 = 5u;
|
||||
const KIND_BUFFALO: u32 = 6u;
|
||||
|
||||
@@ -187,7 +187,7 @@ fn advance_delta_kind(kind: u32, z: vec2<f32>, e: vec2<f32>) -> vec2<f32> {
|
||||
let ce = conj(e);
|
||||
return 2.0 * cmul(cz, ce) + cmul(ce, ce);
|
||||
} else if kind == KIND_MULTIBROT {
|
||||
return multibrot_delta(z, e, clamp(u.power, 2u, 8u));
|
||||
return multibrot_delta(z, e, clamp(u.power, 2u, MULTIBROT_MAX_POWER));
|
||||
} else if kind == KIND_CELTIC {
|
||||
// z^2 delta split: sq.x = delta of Re(z^2), sq.y = delta of Im(z^2).
|
||||
// Celtic abs the real output, so |Re(z^2)| delta = diffabs(Re(Z^2), sq.x).
|
||||
@@ -222,7 +222,7 @@ fn advance_delta_kind(kind: u32, z: vec2<f32>, e: vec2<f32>) -> vec2<f32> {
|
||||
// enough to de-speckle filaments.
|
||||
fn fprime_kind(kind: u32, z: vec2<f32>) -> vec2<f32> {
|
||||
if kind == KIND_MULTIBROT {
|
||||
let p = clamp(u.power, 2u, 8u);
|
||||
let p = clamp(u.power, 2u, MULTIBROT_MAX_POWER);
|
||||
var zk = z; // Z^1
|
||||
for (var k: u32 = 2u; k < p; k = k + 1u) {
|
||||
zk = cmul(zk, z); // -> Z^{p-1}
|
||||
@@ -382,7 +382,7 @@ fn advance_delta_scaled_kind(kind: u32, x: vec2<f32>, w: vec2<f32>, sc: f32, se:
|
||||
let cw = conj(w);
|
||||
return 2.0 * cmul(cx, cw) + sc * cmul(cw, cw);
|
||||
} else if kind == KIND_MULTIBROT {
|
||||
return cmul(w, multibrot_sum(x, x + sc * w, clamp(u.power, 2u, 8u)));
|
||||
return cmul(w, multibrot_sum(x, x + sc * w, clamp(u.power, 2u, MULTIBROT_MAX_POWER)));
|
||||
} else if kind == KIND_CELTIC {
|
||||
let sq = 2.0 * cmul(x, w) + sc * cmul(w, w);
|
||||
return vec2<f32>(diffabs_scaled(x.x * x.x - x.y * x.y, sq.x, se), sq.y);
|
||||
@@ -434,7 +434,7 @@ fn deep_step_kind(kind: u32, x: vec2<f32>, xf: Fe, w: vec2<f32>, sc: f32, s: i32
|
||||
}
|
||||
var deg = 2;
|
||||
if kind == KIND_MULTIBROT {
|
||||
deg = i32(clamp(u.power, 2u, 8u));
|
||||
deg = i32(clamp(u.power, 2u, MULTIBROT_MAX_POWER));
|
||||
}
|
||||
let xk = ldexp2_sat(xf.m, xf.e - ue);
|
||||
let se = s - ue;
|
||||
@@ -545,7 +545,7 @@ fn deep_fprime(xf: Fe, w: vec2<f32>, s: i32, yt: vec2<f32>) -> Fe {
|
||||
return Fe(fprime(vec2<f32>(0.0, 0.0)), 0);
|
||||
}
|
||||
if KIND == KIND_MULTIBROT {
|
||||
let p = clamp(u.power, 2u, 8u);
|
||||
let p = clamp(u.power, 2u, MULTIBROT_MAX_POWER);
|
||||
var ym = yf.m; // m^(p-1)
|
||||
for (var k: u32 = 2u; k < p; k = k + 1u) {
|
||||
ym = cmul(ym, yf.m);
|
||||
|
||||
Reference in New Issue
Block a user