#include "octane-oslintrin.h" float sdSphere(vector p) { return sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]) - 1.0; } 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; } float 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); } d = max(d, -sdSphere(P - spherePos)); return d; } shader Menger( vector spherePos = vector(1,1,1), vector pos = vector(0,0,0), float scale = 1, color tex = 0, float texscale = 1, float k = 1, output _sdf c = _SDFDEF) { //c = smin(sdBox(P, vector(1,1,1)), // sdBox(P + vector(1,1,1), vector(1,1,1)), // k) ;//map(P+tex*scale, spherePos); c.dist = map(P, spherePos, k); }