mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-16 19:54:29 +02:00
add pnoise3
This commit is contained in:
96
src/experimental/_impl/_pnoise3_impl.scad
Normal file
96
src/experimental/_impl/_pnoise3_impl.scad
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
use <experimental/_impl/_pnoise_comm.scad>;
|
||||||
|
|
||||||
|
function _pnoise3_grad3(hashvalue, x, y, z) =
|
||||||
|
let(case = hashvalue % 16)
|
||||||
|
case == 0 ? x + y :
|
||||||
|
case == 1 ? -x + y :
|
||||||
|
case == 2 ? x - y:
|
||||||
|
case == 3 ? -x - y:
|
||||||
|
case == 4 ? x + z:
|
||||||
|
case == 5 ? -x + z:
|
||||||
|
case == 6 ? x - z :
|
||||||
|
case == 7 ? -x - z :
|
||||||
|
case == 8 ? y + z :
|
||||||
|
case == 9 ? -y + z :
|
||||||
|
case == 10 ? y - z :
|
||||||
|
case == 11 ? -y - z :
|
||||||
|
case == 12 ? y + x :
|
||||||
|
case == 13 ? -y + z :
|
||||||
|
case == 14 ? y - x : -y - z;
|
||||||
|
|
||||||
|
function _pnoise3(x, y, z, seed) =
|
||||||
|
let(
|
||||||
|
xi = floor(x),
|
||||||
|
yi = floor(y),
|
||||||
|
zi = floor(z),
|
||||||
|
xf = x - xi,
|
||||||
|
yf = y - yi,
|
||||||
|
zf = z - zi,
|
||||||
|
u = _pnoise_fade(xf),
|
||||||
|
v = _pnoise_fade(yf),
|
||||||
|
w = _pnoise_fade(zf),
|
||||||
|
|
||||||
|
aaa = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi) + yi
|
||||||
|
) + zi
|
||||||
|
),
|
||||||
|
aba = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi) + yi + 1
|
||||||
|
) + zi
|
||||||
|
),
|
||||||
|
aab = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi) + yi
|
||||||
|
) + zi + 1
|
||||||
|
),
|
||||||
|
abb = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi) + yi + 1
|
||||||
|
) + zi + 1
|
||||||
|
),
|
||||||
|
baa = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi + 1) + yi
|
||||||
|
) + zi
|
||||||
|
),
|
||||||
|
bba = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi + 1) + yi + 1
|
||||||
|
) + zi
|
||||||
|
),
|
||||||
|
bab = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi + 1) + yi
|
||||||
|
) + zi + 1
|
||||||
|
),
|
||||||
|
bbb = _pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(
|
||||||
|
_pnoise_lookup_poise_table(seed + xi + 1) + yi + 1
|
||||||
|
) + zi + 1
|
||||||
|
),
|
||||||
|
x1 = _pnoise_lerp(
|
||||||
|
_pnoise3_grad3(aaa, xf, yf, zf),
|
||||||
|
_pnoise3_grad3(baa, xf - 1, yf, zf),
|
||||||
|
u
|
||||||
|
),
|
||||||
|
x2 = _pnoise_lerp(
|
||||||
|
_pnoise3_grad3(aba, xf, yf - 1, zf),
|
||||||
|
_pnoise3_grad3(bba, xf - 1, yf - 1, zf),
|
||||||
|
u
|
||||||
|
),
|
||||||
|
y1 = _pnoise_lerp(x1, x2, v),
|
||||||
|
x3 = _pnoise_lerp(
|
||||||
|
_pnoise3_grad3(aab, xf, yf, zf - 1),
|
||||||
|
_pnoise3_grad3(bab, xf - 1, yf, zf - 1),
|
||||||
|
u
|
||||||
|
),
|
||||||
|
x4 = _pnoise_lerp(
|
||||||
|
_pnoise3_grad3(abb, xf, yf - 1, zf - 1),
|
||||||
|
_pnoise3_grad3(bbb, xf - 1, yf - 1, zf - 1),
|
||||||
|
u
|
||||||
|
),
|
||||||
|
y2 = _pnoise_lerp(x3, x4, v)
|
||||||
|
)
|
||||||
|
_pnoise_lerp(y1, y2, w);
|
6
src/experimental/pnoise3.scad
Normal file
6
src/experimental/pnoise3.scad
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
use <util/rand.scad>;
|
||||||
|
use <experimental/_impl/_pnoise3_impl.scad>;
|
||||||
|
|
||||||
|
function pnoise3(points, seed) =
|
||||||
|
let(sd = is_undef(seed) ? floor(rand(0, 256)) : seed % 256)
|
||||||
|
[for(p = points) _pnoise3(p[0], p[1], p[2], sd)];
|
Reference in New Issue
Block a user