#include "rmannotes.sl" /* SPACETILES.SL -- A surface shaders for creating space tiles */ surface spacetiles (float sfreq=1, tfreq=1, fuzz=.05, size=.8, border=.1, range=.2; color bgcolor = color(.2, .2, .2), wedgecolor=color(.7,.7,.7), specularcolor = color(1,1,1); float Ks = .7, Kd = .3, Ka=.3, roughness = .2) { color surface_color, surface_opac; color layer_color, layer_opac; float ss, tt; float a, b; color spec, amb, diff; point Nf, V; /* PREP FOR ILLUMINATION CALCS */ Nf = faceforward(normalize(N), I); V = -normalize(I); /* TILE COORDINATES */ ss = repeat(s, sfreq); tt = repeat(t, tfreq); /* BOUNDARIES */ a = (1 - size)/2; b = 1 - (1 - size)/2 + fuzz; /* BASE SURFACE */ surface_opac = Os; surface_color = Cs; /* layer 1 - background */ spec = Ks * specularcolor * specular(Nf, V, roughness); amb = Ka * ambient(); diff = Kd * diffuse(Nf); layer_opac = 1; layer_color = bgcolor; surface_color = blend(surface_color, layer_color, layer_opac) * (amb + diff + spec); /* layer 2 - interior detail */ if (ss > a+border+fuzz && ss < b-border-fuzz && tt > a+border+fuzz && tt < b-border-fuzz) { /* layer 2 - illumination calcs */ spec = Ks * specularcolor * specular(Nf, V, roughness); amb = Ka * ambient(); diff = Kd * diffuse(Nf); /* attenuate specularity */ spec *= float noise(P * sfreq * 6); layer_opac = 1; layer_color = wedgecolor * clamp(float noise(P * sfreq * 6), .6, 1); surface_color = blend(surface_color, layer_color, layer_opac) * (amb + spec + diff); } /* output */ Oi = surface_opac; Ci = surface_color; }