Finally starting to implement illuminated materials 😎
#TangerineCSGEssentially what's going on here is the cosine angle between the surface normal and the inverse light ray is clamped to 0-1 range and then passes into the color gradient eval function. I figure this would be useful for weird cell shading, but I'm still deciding how I want this to work. For example, should the ramp be evaluated once per light and averaged, or just evaluated once per vertex with a combined parameter.
Also I'm unsure if I want to separate this into multiple terms, each with their own gradients and so on.