/* https://www.shadertoy.com/view/XsX3zB * * The MIT License * Copyright © 2013 Nikita Miropolskiy * * ( license has been changed from CCA-NC-SA 3.0 to MIT * * but thanks for attributing your source code when deriving from this sample * with a following link: https://www.shadertoy.com/view/XsX3zB ) * */ /* discontinuous pseudorandom uniformly distributed in [-0.5, +0.5]^3 */ vec3 random3(vec3 c) { float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0))); vec3 r; r.z = fract(512.0*j); j *= .125; r.x = fract(512.0*j); j *= .125; r.y = fract(512.0*j); return r-0.5; } vec3 hash33(vec3 p){ float n = sin(dot(p, vec3(7, 157, 113))); return fract(vec3(2097152, 262144, 32768)*n); } float worley(vec3 uv, float local_scale) { vec3 prod = uv * local_scale; vec3 index_uv = floor(prod); vec3 fract_uv = fract(prod); float minimum_dist = 0.6; for (int y = -1; y <= 1; y++) { for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { vec3 neighbor = vec3(float(x),float(y), float(z)); vec3 point = hash33(index_uv + neighbor); vec3 diff = neighbor + point - fract_uv; float dist = length(diff); minimum_dist = min(minimum_dist, dist); } } } return minimum_dist; } // FROM: https://www.shadertoy.com/view/XtBGDG //http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf //simplex pretty much 99% copied from there //adjusted by getting "completely random" gradients instead of randoming from 12 preset ones //and normalizing the gradient vector float noise3D(vec3 p) { return fract(sin(dot(p ,vec3(12.9898,78.233,128.852))) * 43758.5453)*2.0-1.0; } float simplex3D(vec3 p) { float f3 = 1.0/3.0; float s = (p.x+p.y+p.z)*f3; int i = int(floor(p.x+s)); int j = int(floor(p.y+s)); int k = int(floor(p.z+s)); float g3 = 1.0/6.0; float t = float((i+j+k))*g3; float x0 = float(i)-t; float y0 = float(j)-t; float z0 = float(k)-t; x0 = p.x-x0; y0 = p.y-y0; z0 = p.z-z0; int i1,j1,k1; int i2,j2,k2; if(x0>=y0) { if(y0>=z0){ i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order else if(x0>=z0){ i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Z order } else { if(y0=0.0) { t0*=t0; n0 = t0 * t0 * dot(gr0, vec3(x0, y0, z0)); } float t1 = 0.5 - x1*x1 - y1*y1 - z1*z1; if(t1>=0.0) { t1*=t1; n1 = t1 * t1 * dot(gr1, vec3(x1, y1, z1)); } float t2 = 0.5 - x2*x2 - y2*y2 - z2*z2; if(t2>=0.0) { t2 *= t2; n2 = t2 * t2 * dot(gr2, vec3(x2, y2, z2)); } float t3 = 0.5 - x3*x3 - y3*y3 - z3*z3; if(t3>=0.0) { t3 *= t3; n3 = t3 * t3 * dot(gr3, vec3(x3, y3, z3)); } return 96.0*(n0+n1+n2+n3); } float fbm(vec3 p) { float f; f = 0.50000*simplex3D( p ); p = p*2.01; f += 0.25000*simplex3D( p ); p = p*2.02; //from iq f += 0.12500*simplex3D( p ); p = p*2.03; f += 0.06250*simplex3D( p ); p = p*2.04; f += 0.03125*simplex3D( p ); return f; } float noise(vec3 noise_uv, float noise_scale) { return fbm(noise_uv * noise_scale); } /* https://www.shadertoy.com/view/XsX3zB * * The MIT License * Copyright © 2013 Nikita Miropolskiy * * ( license has been changed from CCA-NC-SA 3.0 to MIT * * but thanks for attributing your source code when deriving from this sample * with a following link: https://www.shadertoy.com/view/XsX3zB ) * */ /* discontinuous pseudorandom uniformly distributed in [-0.5, +0.5]^3 */ vec3 shell_random3(vec3 c) { float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0))); vec3 r; r.z = fract(512.0*j); j *= .125; r.x = fract(512.0*j); j *= .125; r.y = fract(512.0*j); return r-0.5; } vec3 shell_hash33(vec3 p){ float n = sin(dot(p, vec3(7, 157, 113))); return fract(vec3(2097152, 262144, 32768)*n); } float shell_worley(vec3 uv, float local_scale) { vec3 prod = uv * local_scale; vec3 index_uv = floor(prod); vec3 fract_uv = fract(prod); float minimum_dist = 1.0; for (int y = -1; y <= 1; y++) { for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { vec3 neighbor = vec3(float(x),float(y), float(z)); vec3 point = shell_random3(index_uv + neighbor); vec3 diff = neighbor + point - fract_uv; float dist = length(diff); minimum_dist = min(minimum_dist, dist); } } } return minimum_dist; } float shell_worley_color(vec3 uv, float local_scale, out vec3 vcolor) { vec3 prod = uv * local_scale; vec3 index_uv = floor(prod); vec3 fract_uv = fract(prod); float minimum_dist = 1.0; // This is magic, fixed some weird noisy glitches vcolor = vec3(-1.0); for (int y = -1; y <= 1; y++) { for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { vec3 neighbor = vec3(float(x),float(y), float(z)); vec3 point = shell_random3(index_uv + neighbor); vec3 diff = neighbor + point - fract_uv; float dist = length(diff); if (dist < minimum_dist) { minimum_dist = dist; vcolor = point; } } } } return minimum_dist; }