A group's colour was a hue dial at full saturation and nothing else. An
application that keeps a palette for its show can now lay it over the rig.
- RigColors holds an optional RGB for the washes and one for the laser
and strobe; a group left at none keeps its hue dial.
- apply_dmx_mapping_with_colors is the mapping with that input;
apply_dmx_mapping keeps its signature and calls it with none, and its
frames are byte for byte what they were. A colour goes out at the
level the hue would have had: the strobe still follows its fader.
Components outside 0 to 1 are clamped, one that is not a number
counts as 0.
- group_colors answers what the two groups wear now, from the override
where there is one and the dial otherwise.
- the desk carries it: RoomShow::set_colors, held in DeskState and
returned in the snapshot. Scenes neither save nor recall it, and power
off still gives a dark frame. The beam lasers take a wheel position,
not a colour, and stay on their dial.
Tests: 36 pass (27 before), among them the frames compared against the
old mapping over 802 states and 9 clock values. No test starts the
writer or sends to a network beyond the loopback test that was there.