The fix is mostly duct-tape. Those templates need moved to their own header, as they are general purpose (which is why I wrote the signed-int set as well). The color_t type also needs used in more places. The point for now was to make sure it was the same size as the union. Switching gs_scalar to double might yet break it; at very least, it will waste four bytes.
Works for me. Gotta say, I'm impressed by the way the union works. Anyway, GL3 is working great now. Thanks for the fix.