#define INNER 0.00 displacement ovalnoised( float Ad = 0.10, // u diameter Bd = 0.10, // v diameter NoiseAmp = 0.00, // noise amplitude DispAmp = 0.10 // displacement amplitude ) { float Ar = Ad / 2.; // u radius float Br = Bd / 2.; // v radius point PP = point "shader" P; float magnitude = 0.; float size = 1.; float i; for( i = 0.; i < 6.0; i += 1.0 ) { magnitude += ( .5 - noise( size * PP ) ) / size; size *= 2.0; } float up = 2. * u; float vp = v; float numinu = floor( up / Ad ); float numinv = floor( vp / Bd ); up = up - numinu * Ad; vp = vp - numinv * Bd; point upvp = point( up, vp, 0. ); point cntr = point( Ar, Br, 0. ); vector delta = upvp - cntr; float oldrad = length( delta ); float newrad = oldrad + NoiseAmp*magnitude; delta = delta * newrad / oldrad; float du = xcomp(delta)/Ar; float dv = ycomp(delta)/Br; float d = du*du + dv*dv; float disp = DispAmp * ( 1. - d ); disp = disp * ( 1. - smoothstep( INNER, 1., d ) ); if( disp != 0. ) { P = P + normalize(N) * disp; N = calculatenormal(P); } // N = calculatenormal( P + normalize(N) * disp ); }