3#define_import_path noisy_bevy 5fn permute_3_(x: vec3<f32>) -> vec3<f32> { 6 return (((x * 34.) + 1.) * x) % vec3(289.); 9fn step_3(edge: vec3<f32>, x: vec3<f32>) -> vec3<f32> { 10 let b = vec3(edge.x < x.x, edge.y <= x.y, edge.z <= x.z); 11 return select(vec3(0.), vec3(1.), b); 14fn simplex_noise_2d(v: vec2<f32>) -> f32 { 23 var i = floor(v + dot(v, C.yy)); 24 let x0 = v - i + dot(i, C.xx); 27 var i1 = select(vec2(0., 1.), vec2(1., 0.), x0.x > x0.y); 28 var x12 = x0.xyxy + C.xxzz - vec4(i1, 0., 0.); 33 let p = permute_3_(permute_3_(i.y + vec3(0., i1.y, 1.)) + i.x + vec3(0., i1.x, 1.)); 34 var m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), vec3(0.)); 40 let x = 2. * fract(p * C.www) - 1.; 42 let ox = floor(x + 0.5); 47 m = m * (1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h)); 50 let g = vec3(a0.x * x0.x + h.x * x0.y, a0.yz * x12.xz + h.yz * x12.yw); 51 return 130. * dot(m, g); 54fn simplex_noise_2d_seeded(v: vec2<f32>, seed: f32) -> f32 { 63 var i = floor(v + dot(v, C.yy)); 64 let x0 = v - i + dot(i, C.xx); 67 var i1 = select(vec2(0., 1.), vec2(1., 0.), x0.x > x0.y); 68 var x12 = x0.xyxy + C.xxzz - vec4(i1, 0., 0.); 73 var p = permute_3_(permute_3_(i.y + vec3(0., i1.y, 1.)) + i.x + vec3(0., i1.x, 1.)); 74 p = permute_3_(p + vec3(seed)); 75 var m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), vec3(0.)); 81 let x = 2. * fract(p * C.www) - 1.; 83 let ox = floor(x + 0.5); 88 m = m * (1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h)); 91 let g = vec3(a0.x * x0.x + h.x * x0.y, a0.yz * x12.xz + h.yz * x12.yw); 92 return 130. * dot(m, g); 95fn permute_4_(x: vec4<f32>) -> vec4<f32> { 96 return ((x * 34. + 1.) * x) % vec4<f32>(289.); 99fn taylor_inv_sqrt_4_(r: vec4<f32>) -> vec4<f32> { 100 return 1.79284291400159 - 0.85373472095314 * r; 103fn simplex_noise_3d(v: vec3<f32>) -> f32 { 104 let C = vec2(1. / 6., 1. / 3.); 105 let D = vec4(0., 0.5, 1., 2.); 108 var i = floor(v + dot(v, C.yyy)); 109 let x0 = v - i + dot(i, C.xxx); 112 let g = step_3(x0.yzx, x0.xyz); 114 let i1 = min(g.xyz, l.zxy); 115 let i2 = max(g.xyz, l.zxy); 118 let x1 = x0 - i1 + 1. * C.xxx; 119 let x2 = x0 - i2 + 2. * C.xxx; 120 let x3 = x0 - 1. + 3. * C.xxx; 124 let p = permute_4_(permute_4_(permute_4_( 125 i.z + vec4(0., i1.z, i2.z, 1.)) + 126 i.y + vec4(0., i1.y, i2.y, 1.)) + 127 i.x + vec4(0., i1.x, i2.x, 1.) 132 let ns = n_ * D.wyz - D.xzx; 134 let j = p - 49. * floor(p * ns.z * ns.z); 136 let x_ = floor(j * ns.z); 137 let y_ = floor(j - 7. * x_); 139 let x = x_ * ns.x + ns.yyyy; 140 let y = y_ * ns.x + ns.yyyy; 141 let h = 1. - abs(x) - abs(y); 143 let b0 = vec4(x.xy, y.xy); 144 let b1 = vec4(x.zw, y.zw); 146 let s0 = floor(b0) * 2. + 1.; 147 let s1 = floor(b1) * 2. + 1.; 148 let sh = -step(h, vec4(0.)); 150 let a0 = b0.xzyw + s0.xzyw * sh.xxyy; 151 let a1 = b1.xzyw + s1.xzyw * sh.zzww; 153 var p0 = vec3(a0.xy, h.x); 154 var p1 = vec3(a0.zw, h.y); 155 var p2 = vec3(a1.xy, h.z); 156 var p3 = vec3(a1.zw, h.w); 159 let norm = taylor_inv_sqrt_4_(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); 166 var m = 0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)); 167 m = max(m, vec4(0.)); 169 return 105. * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); 172fn simplex_noise_3d_seeded(v: vec3<f32>, seed: vec3<f32>) -> f32 { 173 let C = vec2(1. / 6., 1. / 3.); 174 let D = vec4(0., 0.5, 1., 2.); 177 var i = floor(v + dot(v, C.yyy)); 178 let x0 = v - i + dot(i, C.xxx); 181 let g = step_3(x0.yzx, x0.xyz); 183 let i1 = min(g.xyz, l.zxy); 184 let i2 = max(g.xyz, l.zxy); 187 let x1 = x0 - i1 + 1. * C.xxx; 188 let x2 = x0 - i2 + 2. * C.xxx; 189 let x3 = x0 - 1. + 3. * C.xxx; 193 let s = floor(seed + vec3(0.5)); 194 let p = permute_4_(permute_4_(permute_4_( 195 i.z + vec4(0., i1.z, i2.z, 1.) + s.z) + 196 i.y + vec4(0., i1.y, i2.y, 1.) + s.y) + 197 i.x + vec4(0., i1.x, i2.x, 1.) + s.x 202 let ns = n_ * D.wyz - D.xzx; 204 let j = p - 49. * floor(p * ns.z * ns.z); 206 let x_ = floor(j * ns.z); 207 let y_ = floor(j - 7. * x_); 209 let x = x_ * ns.x + ns.yyyy; 210 let y = y_ * ns.x + ns.yyyy; 211 let h = 1. - abs(x) - abs(y); 213 let b0 = vec4(x.xy, y.xy); 214 let b1 = vec4(x.zw, y.zw); 216 let s0 = floor(b0) * 2. + 1.; 217 let s1 = floor(b1) * 2. + 1.; 218 let sh = -step(h, vec4(0.)); 220 let a0 = b0.xzyw + s0.xzyw * sh.xxyy; 221 let a1 = b1.xzyw + s1.xzyw * sh.zzww; 223 var p0 = vec3(a0.xy, h.x); 224 var p1 = vec3(a0.zw, h.y); 225 var p2 = vec3(a1.xy, h.z); 226 var p3 = vec3(a1.zw, h.w); 229 let norm = taylor_inv_sqrt_4_(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); 236 var m = 0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)); 237 m = max(m, vec4(0.)); 239 return 42. * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); 245fn fbm_simplex_2d(pos: vec2<f32>, octaves: i32, lacunarity: f32, gain: f32) -> f32 { 250 for (var i = 0; i < octaves; i+= 1) { 251 sum += simplex_noise_2d(pos * frequency) * amplitude; 253 frequency *= lacunarity; 260fn fbm_simplex_2d_seeded(pos: vec2<f32>, octaves: i32, lacunarity: f32, gain: f32, seed: f32) -> f32 { 265 for (var i = 0; i < octaves; i+= 1) { 266 sum += simplex_noise_2d_seeded(pos * frequency, seed) * amplitude; 268 frequency *= lacunarity; 274const max_warp_iterations = 4; 280 positions: array<vec2f, max_warp_iterations> 285fn fbm_simplex_2d_warp_seeded(pos_initial: vec2<f32>, octaves: i32, lacunarity: f32, gain: f32, seed: f32, warp_iterations: i32, warp_scale: vec2<f32>, falloff: f32) -> WarpResult { 287 var positions = array<vec2f, max_warp_iterations>(); 288 var pos = pos_initial; 291 let iterations = min(warp_iterations, i32(max_warp_iterations)); 293 for (var i: i32 = 0; i < iterations; i++) { 294 pos.x += scale * warp_scale.x * fbm_simplex_2d_seeded(pos, octaves, lacunarity, gain, seed); 295 pos.y += scale * warp_scale.y * fbm_simplex_2d_seeded(pos, octaves, lacunarity, gain, seed); 298 let index = max_warp_iterations - 1 - i; 299 if (index < max_warp_iterations) { 300 positions[index] = pos; 306 let noise_value = fbm_simplex_2d_seeded(positions[0], octaves, lacunarity, gain, seed); 308 return WarpResult(noise_value, positions); 312fn fbm_simplex_3d(pos: vec3<f32>, octaves: i32, lacunarity: f32, gain: f32) -> f32 { 317 for (var i = 0; i < octaves; i+= 1) { 318 sum += simplex_noise_3d(pos * frequency) * amplitude; 320 frequency *= lacunarity; 327fn fbm_simplex_3d_seeded(pos: vec3<f32>, octaves: i32, lacunarity: f32, gain: f32, seed: vec3<f32>) -> f32 { 332 for (var i = 0; i < octaves; i+= 1) { 333 sum += simplex_noise_3d_seeded(pos * frequency, seed) * amplitude; 335 frequency *= lacunarity; 345fn worley_2d(pos: vec2<f32>, jitter: f32) -> vec2<f32> { 346 let k = 0.142857142857; 347 let ko = 0.428571428571; 354 let oi = vec3(-1.0, 0.0, 1.0); 355 let of_ = vec3(-0.5, 0.5, 1.5); 358 let px = permute_3_(pi.x + oi); 359 var p = permute_3_(px.x + pi.y + oi); 361 var ox = fract(p * k) - ko; 362 var oy = (floor(p * k) % 7.0) * k - ko; 363 var dx = pf.x + 0.5 + jitter * ox; 364 var dy = pf.y - of_ + jitter * oy; 365 var d1 = dx * dx + dy * dy; 367 p = permute_3_(px.y + pi.y + oi); 368 ox = fract(p * k) - ko; 369 oy = (floor(p * k) % 7.0) * k - ko; 370 dx = pf.x - 0.5 + jitter * ox; 371 dy = pf.y - of_ + jitter * oy; 372 var d2 = dx * dx + dy * dy; 374 p = permute_3_(px.z + pi.y + oi); 375 ox = fract(p * k) - ko; 376 oy = (floor(p * k) % 7.0) * k - ko; 377 dx = pf.x - 1.5 + jitter * ox; 378 dy = pf.y - of_ + jitter * oy; 379 let d3 = dx * dx + dy * dy; 382 let d1a = min(d1, d2); 399 d1.y = min(d1.y, d2.y); 400 d1.z = min(d1.z, d2.z); 401 d1.y = min(d1.y, d1.z); 402 d1.y = min(d1.y, d2.x);