Diagrams may have attributes which affect the way they are
rendered. This module defines some common attributes relevant in
3D; particular backends may also define more backend-specific
attributes.

Every attribute type must have a semigroup structure, that is, an
associative binary operation for combining two attributes into one.
Unless otherwise noted, all the attributes defined here use the
Last structure, that is, combining two attributes simply keeps
the second one and throws away the first. This means that child
attributes always override parent attributes.

Diffuse is the fraction of incident light reflected diffusely,
that is, in all directions. The actual light reflected is the
product of this value, the incident light, and the SurfaceColor
Attribute. For physical reasonableness, Diffuse should have a
value between 0 and 1; this is not checked.

Ambient is an ad-hoc representation of indirect lighting. The
product of Ambient and SurfaceColor is added to the light
leaving an object due to diffuse and specular terms. Ambient can
be set per-object, and can be loosely thought of as the product of
indirect lighting incident on that object and the diffuse
reflectance.

A specular highlight has two terms, the intensity, between 0 and
1, and the size. The highlight size is assumed to be the exponent
in a Phong shading model (though Backends are free to use a
different shading model). In this model, reasonable values are
between 1 and 50 or so, with higher values for shinier objects.
Physically, the intensity and the value of Diffuse must add up to
less than 1; this is not enforced.