/* IDGloop.sl written 8/99 by Ivan DeWolf
* courtesy of Rhythm & Hues (thanks!)
* ivan AT martian -labs.com
*
* an example of nonlinear displacements
* generated from the gradient of a noise function.
* Written as an explanation to the talk I gave at
* the "stupid renderman tricks" section of the 1998
* Renderman Users Group meeting at siggraph.
*
* freq - the frequency of the noise. Lower values
* will cause a larger displacement so you will
* have to change your displacement bounds to fit
* rhymes with freak.
*
* magnitude - how far to displace. probably fine set where it is.
*
* displacement bounds can be computed with the following
* wildly complex formula:
*
* 10*magnitude/freq
*
*/
displacement
IDgloop(float freq = 5, magnitude = .2){
vector overdist = .1;
vector stepsize = magnitude/freq;
float numsteps = 20;
point Psh = transform("object",P)*freq;
float i;
vector dPduN = normalize(vtransform("object",dPdu));
vector dPdvN = normalize(vtransform("object",dPdv));
point Pou = Psh + (dPduN*overdist);/*P Over a distance in U*/
point Pov = Psh + (dPdvN*overdist);
/*noise function at the point, over in u, and over in v*/
float nz = noise(Psh)-.5;
float nzou = noise(Pou)-.5;
float nzov = noise(Pov)-.5;
float chu = (nz - nzou);/*change in noise value in u*/
float chv = (nz - nzov);
/*init deflected derivatives*/
vector DdPdu = dPduN;
vector DdPdv = dPdvN;
vector step = DdPdu^DdPdv;
/*where it all happens*/
for(i=1;i