float sdBox(vector p, vector b) { vector d = abs(p) - b; return min(max(d[0],max(d[1],d[2])),0.0) + length(max(d,0.0)); } float displace() { return 0.001*length(P); } float smax(float a, float b, float k) { return log(exp(k*a) + exp(k*b)) / k; } float smin( float a, float b, float k ) { float res = exp( -k*a ) + exp( -k*b ); return -log( res )/k; } vector map(vector p, vector spherePos, float k) { float d = sdBox(p,vector(1.0)); float s = 1.0; for( int m=0; m<8; m++ ) { vector a = mod( p*s, 2.0 )-1.0; s *= 3.0; vector r = abs(1.0 - 3.0*abs(a)); float da = max(r[0],r[1]); float db = max(r[1],r[2]); float dc = max(r[2],r[0]); float c = (smin(da,smin(db,dc, k), k)-1.0)/s; d = max(d,c); } return vector(d, u, v); } shader Menger( vector spherePos = vector(1,1,1), float k = 1, output color c = 0) { // rescale the roundedness to [0,1] float s = 35*(1 - k) + 1; c = map(P, spherePos, s); }