fn sdfJulia(position: vec3<f32>, c: vec4<f32>, iterations: f32, bailout: f32) -> f32 {
var z = vec4<f32>(position, 0.0);
var dz = vec4<f32>(1.0, 0.0, 0.0, 0.0);
var m = dot(z, z);
var i = 0;
// Julia set iteration
for (i = 0; i < i32(iterations) && m < bailout * bailout; i += 1) {
// Quaternion multiplication for dz = 2.0 * z * dz
dz = 2.0 * vec4<f32>(
z.x * dz.x - z.y * dz.y - z.z * dz.z - z.w * dz.w,
z.x * dz.y + z.y * dz.x + z.z * dz.w - z.w * dz.z,
z.x * dz.z - z.y * dz.w + z.z * dz.x + z.w * dz.y,
z.x * dz.w + z.y * dz.z - z.z * dz.y + z.w * dz.x
);
// Quaternion multiplication for z = z * z + c
z = vec4<f32>(
z.x * z.x - z.y * z.y - z.z * z.z - z.w * z.w,
z.x * z.y + z.y * z.x + z.z * z.w - z.w * z.z,
z.x * z.z - z.y * z.w + z.z * z.x + z.w * z.y,
z.x * z.w + z.y * z.z - z.z * z.y + z.w * z.x
) + c;
m = dot(z, z);
}
// Compute the distance
let dist = 0.5 * log(m) * sqrt(m) / length(dz);
return dist;
}