shader TexturePickerCycle
[[
int rfm_nodeid = 12,
string rfm_classification = "rendernode/RenderMan/pattern",
string help = "Brief description goes here."
]]
(
    float s = 0 
        [[
        int lockgeom = 0,
        string widget = "null",
        ]],
    float t = 0 
        [[
        int lockgeom = 0,
        string widget = "null",
        ]],
    string tex1 = "" 
        [[
        string widget = "filename",
        string label = "Texture 1",
        ]],
    string tex2 = "" 
        [[
        string widget = "filename",
        string label = "Texture 2",
        ]],
    string tex3 = "" 
        [[
        string widget = "filename",
        string label = "Texture 3",
        ]],
    string tex4 = "" 
        [[
        string widget = "filename",
        string label = "Texture 4",
        ]],
    string tex5 = "" 
        [[
        string widget = "filename",
        string label = "Texture 5",
        ]],
    string tex6 = "" 
        [[
        string widget = "filename",
        string label = "Texture 6",
        ]],
    string tex7 = "" 
        [[
        string widget = "filename",
        string label = "Texture 7",
        ]],
    string tex8 = "" 
        [[
        string widget = "filename",
        string label = "Texture 8",
        ]],
    int cycles = 8,
    int invertTex = 1 
        [[
        string widget = "checkBox",
        ]],
    int linearize = 1
        [[
        string widget = "checkBox",
        ]],
    color missingTexColor = color(1,0,1),
    output color resultRGB = 0) 
{
resultRGB = missingTexColor;
string textures[8] = {tex1,tex2,tex3,tex4,tex5,tex6,tex7,tex8};
  
// Get the value of the objects id
float id;
if(getattribute("identifier:id", id)) {
    float rem = fmod(id/cycles, 1);
    int index = int(rem * 8);
    if(index >= 0 && index <= 8) {
        string texname = textures[index];
        if(texname != "") {
            float tt = (invertTex) ? 1 - t : t;
            resultRGB = texture(texname, s, tt);
    
            // The linearization code is from Pixar's implementation of
            // pxrsRGBLinearize() found in PxrTextureShared.h
            if(linearize) {
                float r = resultRGB[0];
                float g = resultRGB[1];
                float b = resultRGB[2];
                
                r = (r < 0.04045) ? r * 0.07739938 : pow((r + 0.055) * 0.947867299, 2.4);
                g = (g < 0.04045) ? g * 0.07739938 : pow((g + 0.055) * 0.947867299, 2.4);
                b = (b < 0.04045) ? b * 0.07739938 : pow((b + 0.055) * 0.947867299, 2.4);
                resultRGB = color(r, g, b);
                }
            }
        }
    }
}