/* bubbly.sl written a while ago by Ivan DeWolf * ivan AT martian -tools.com * feel free to copy, distribute, hack and/or abuse this code * in any way you see fit, but please leave my name near the top * * basicly it's F1 squared as described in * "a cellular texture basis function" by Steven Worley in the * siggraph proceedings from 1996, except this uses a noised grid of cells * instead of the sparse convolution in the paper. * not as elegant, but hey, it works. * * the "bubbles" are paraboloids diplaced along the normal. * try lowering bubsize for pimples. * try negative values for Kd. * try anything you feel like. * * PARAMETERS: * mult - multiples of bubbles per unit * Nzscale - scale of the noise that randomizes the location of * the bubbles. set this to zero for a perfect grid of bubbles. * dont go higher than two with this. * Kd - coefficient of displacement. * Displacement bounds and this value should be equal. * bubsize - basicly the radius of the bubbles. distance in rVu's. */ displacement IDbubbly( float mult = 5, Nzscale = 1, Kd = .2, bubsize = 1) { normal Nn = normalize(N); float a,b,c,bub; float dist, shortest=10000; point Po = transform("object",P)*mult; /*true cell center, surrounding cell centers, noised cell center*/ point trucell, surrcell, nzcell; vector offset; setxcomp(trucell,floor(xcomp(Po))+.5); setycomp(trucell,floor(ycomp(Po))+.5); setzcomp(trucell,floor(zcomp(Po))+.5); /*what is the shortest distance to a noised cell center?*/ for(a = -1; a<= 1; a+=1){ for(b = -1; b<=1; b += 1){ for(c = -1; c<=1; c += 1){ offset = vector(a,b,c); surrcell = trucell+offset; nzcell = surrcell + ((vector cellnoise(surrcell)-.5)*Nzscale); dist = distance(Po,nzcell); if(dist