Do three shiftouts here
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, patterns[index * 2]);
digitalWrite(latchPin, HIGH);
instead of patterns array, just define 3 bytes and use << and >> to walk a 1 across them
shiftOut(dataPin, clockPin, MSBFIRST, byte1);
shiftOut(dataPin, clockPin, MSBFIRST, byte2);
shiftOut(dataPin, clockPin, MSBFIRST, byte3);
Hardware engineer approach (check the reference section for correct format of bit-shift command)
byte1 = 0x01;
next time thru
byte1 = byte1<<1;
if byte1 == 0x80, the byte2 = 0x01;
etc.
When byte3 = 0x80, then shift the other way to walk the 1 back across.
Others might say make byte1 a 4byte-long variable, then do shift-outs as
shiftOut(dataPin, clockPin, MSBFIRST, byte1);
shiftOut(dataPin, clockPin, MSBFIRST, byte1>>

;
shiftOut(dataPin, clockPin, MSBFIRST, byte1>>16);
Many options exist...