surface ovalnoises( float Ad = 0.10, // u diameter Bd = 0.10, // v diameter NoiseAmp = 0.00, // noise amplitude Ks = 0.5, Kd = 0.5, Ka = .1, roughness = 0.1; color specularColor = color( 1, 1, 1 ) ) { 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 ); color dotColor = Cs; 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; if( d <= 1. ) { dotColor = color( 1., .5, 0. ); } varying vector Nf = faceforward( normalize( N ), I ); vector V = normalize( -I ); Oi = 1.; Ci = Oi * ( dotColor * ( Ka * ambient() + Kd * diffuse(Nf) ) + specularColor * Ks * specular( Nf, V, roughness ) ); }