surface sub_surf(float Km = 0, /* sub-surface bumpiness */ Ka = 1, /* ambient brightness */ Kd = .5, /* basic brightness */ Ks = 0.7, /* hilite brightness */ Ksub = 0.5, Ktop = 0.5, Kenv = 0, /* controls the environment lighting */ roughness = 0.1;/* hilite spread */ color hilitecolor = 1,/* hilite color */ c1 = (0,0,1), /* color 1*/ c2 = (0,1,1), /* color 2*/ c3 = (1,0,1); /* color 3*/ string envname = "" ) { color ambientcolor, diffusecolor, speccolor, surfcolor = 1; normal n = normalize(N); normal nf = faceforward(n, I); vector i; vector Nnorm = normalize(N); vector Inorm = normalize(I); vector myVector = (1,0,0); vector myCamera = transform ("object", "camera", myVector); Oi = Os; ambientcolor = Ka * ambient(); diffusecolor = Kd * diffuse(nf); i = normalize(-I); speccolor = Ks * specular(nf, i, roughness) * hilitecolor; color trueLightColor =(ambientcolor + diffusecolor + speccolor); point oldP = P; normal oldN = N; float hump = noise(P * 70); P = P - hump * n * Km; N = calculatenormal(P); n = normalize(N); nf = faceforward(n, I); ambientcolor = Ka * ambient(); diffusecolor = Kd * diffuse(nf); i = normalize(-I); speccolor = Ks * specular(nf, i, roughness) * hilitecolor; color fakeLightColor =(ambientcolor + (((spline((1-abs(Nnorm.Inorm)),c1,c2,c3))*diffusecolor )+speccolor ) ); color envcolor = 0, reflectColor = 0; if(envname != "") { vector R = reflect(I, nf); envcolor = ((environment(envname, R)))*mix(c1,c2, (1-abs(Nnorm.Inorm))) * Kenv; R = reflect(I, oldN); reflectColor = environment(envname, R) * Kenv; } trueLightColor = trueLightColor * Ktop; Ci = Oi * Cs * surfcolor * (envcolor + reflectColor + trueLightColor + fakeLightColor * Ksub); P = oldP; N = oldN; }