#pragma once static const int RainbowColorsSize = 16; static const float3 RainbowColors[RainbowColorsSize] = { float3(1.00, 0.05, 0.05), // 0 red float3(0.45, 0.00, 0.00), // 1 dark red float3(1.00, 0.20, 0.00), // 2 orange float3(0.20, 0.05, 0.01), // 3 dark orange (brown) float3(1.00, 1.00, 0.00), // 4 yellow float3(0.35, 0.45, 0.00), // 5 olive float3(0.00, 1.00, 0.00), // 6 green float3(0.00, 0.30, 0.00), // 7 dark green float3(0.00, 1.00, 1.00), // 10 cyan float3(0.00, 0.40, 0.40), // 11 dark cyan float3(0.00, 0.00, 1.00), // 8 blue float3(0.00, 0.00, 0.25), // 9 dark blue float3(0.25, 0.00, 1.00), // 12 purple float3(0.10, 0.00, 0.25), // 13 dark purple float3(1.00, 0.05, 1.00), // 14 pink float3(0.45, 0.00, 0.25) // 15 dark pink }; // Given a color index, find the associated color. // If NColors is 8 or less, skips the "dark" colors. // If NColors is 4 or less, skips 3 out of 4 colors. // float3 RainbowColorLookup(int coloridx, int ncolors) { if (ncolors <= 8) coloridx *= 2; if (ncolors <= 4) coloridx *= 2; float3 color = float3(1,1,1); if (coloridx < RainbowColorsSize) color = RainbowColors[coloridx]; return color; } // Create a striped rainbow pattern. The pattern has ncolors // color bands, separated by thin white lines. Using the mask, // which is a bitmask, you can turn any band to black. // float3 MaskedRainbowPattern(float texcoord, int ncolors, int mask) { float bandPos = texcoord * ncolors; int coloridx = (int)floor(fmod(bandPos, ncolors)); float3 color = RainbowColorLookup(coloridx, ncolors); if (mask & (1 << coloridx)) color = float3(0, 0, 0); float edge = frac(bandPos); if ((edge <= 0.1) || (edge >= 0.9)) color = float3(1, 1, 1); return color; }