/* Pete Hriso Assignment #6 d */ #include "rmannotes.sl" surface smoken (float Ka = 1, Kd = .5; float offset = 0.25; float amountofsmoke = 8 ; float scale = 1; float fadeaway = 2; color black = color (0, 0, 0);) { color paper, ink, smoke; float paper_opac, ink_opac; point Nf, V; float variable; float limit; float amplitude = 1; float sum = 0; point PP; /* init */ V = normalize(I); Nf = faceforward (normalize(N),V); paper = Cs; paper_opac = 0; /* 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; } /* layer 1 */ smoke = spline(s, (color (1, 1, 1)), (color (1, 1, 1)), (color (.789, .789, 1)), (color (.960, .960, .960)), (color (1, 1, .89)), (color (1, 1,.89))); ink= smoke; ink_opac=clamp(sum+offset, 0, 1) * pow(abs(Nf . V), fadeaway); paper = mix(paper, ink, ink_opac); /* illum for all layers */ paper = paper * Ka * ambient() + paper * Kd * diffuse(Nf); Oi = ink_opac; Ci = paper * ink_opac ; }