/* Pete Hriso Assignment #6 d */ #include "rmannotes.sl" displacement dissmoken( float offset = 0.25; float amountofsmoke = 8 ; float scale = 1; float fadeaway = 2; float Km = .1; color black = color (0, 0, 0);) { color paper, ink, smoke; float paper_opac, ink_opac; float variable; float limit; float amplitude = 1; float sum = 0; float magnitude; point PP, Nf, V; float pixelsize, twice; float turb; /* init */ V = normalize(I); Nf = faceforward (normalize(N),V); /* transform P to shader */ PP = scale * transform ("shader", P); limit = sqrt (area(PP)); for(variable = 0; variable < amountofsmoke && amplitude > limit; variable += 1){ sum += amplitude * snoise(PP); PP *= 2; amplitude *= 0.5; } /* raise by the power */ magnitude = clamp(sum+offset, 0, 1) * pow(abs(Nf . V), fadeaway); /* output */ P += Km * magnitude * normalize(N); N = calculatenormal(P); }