From 100b7e095369d9f60e13e5b2ba24faa3930ab84e Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Wed, 21 Aug 2024 14:36:55 +0200 Subject: [PATCH] qr shader: correct data bit order, everywhere hopefully --- Assets/test/QRCode.shader | 146 +++++++++++++++++++++++++++----------- 1 file changed, 103 insertions(+), 43 deletions(-) diff --git a/Assets/test/QRCode.shader b/Assets/test/QRCode.shader index cec001d..82be720 100644 --- a/Assets/test/QRCode.shader +++ b/Assets/test/QRCode.shader @@ -34,7 +34,8 @@ CGPROGRAM #define ALIGNER_SPACING_IDEAL ((WIDTH - 13) / (ALIGNERS-1)) #define ALIGNER_SPACING (ALIGNER_SPACING_IDEAL + ALIGNER_SPACING_IDEAL % 2) #define MISALIGNMENT ((WIDTH - 13) - ALIGNER_SPACING * ALIGNERS) - #define BIT_COUNT (WIDTH * WIDTH - 225 - (WIDTH - 17)*2 - 25 * (ALIGNERS * ALIGNERS - 3) * (VERSION > 1)) + #define ALIGNER_COUNT ((ALIGNERS * ALIGNERS - 3) * (VERSION > 1)) + #define BIT_COUNT (WIDTH * WIDTH - 225 - (WIDTH - 17)*2 - 25 * ALIGNER_COUNT + 10*(ALIGNERS-2)*(ALIGNERS>2) - 36 * (VERSION > 6)) #define TIME_MANUAL (_TimeSlider + _TimeSliderCoarse*100) #define TIME (uint)(_Animate ? _Time.y * _AnimationSpeed + TIME_MANUAL : TIME_MANUAL) @@ -167,8 +168,22 @@ CGPROGRAM // aligners always cover a half column to the left and two full columns to the right // outer aligners are always 4 from all edges + if (VERSION > 6) { + // top version info section + if (column == 5){ + bit_index -= 12; + bit_index -= min(py + 1, 6); + } else if (column > 5) { + bit_index -= 18; + } + } + uint aligner_col = (column - 2) / (ALIGNER_SPACING/2); uint aligner_col_mod = (column - 2) % (ALIGNER_SPACING/2); + if (aligner_col > (ALIGNERS - 2)){ + aligner_col_mod = (column-2) - (aligner_col-1) * (ALIGNER_SPACING/2); + aligner_col -= 1; + } if (aligner_col > 0) { // full columns passed bit_index -= (ALIGNERS - 1) * aligner_col*25; if (aligner_col > 1) { @@ -177,62 +192,107 @@ CGPROGRAM } } - uint passed_up = (y_relative - 9 + ALIGNER_SPACING - (!direction_up * (MISALIGNMENT+ALIGNER_SPACING))) / ALIGNER_SPACING; - passed_up = min(passed_up, ALIGNERS-1); + uint passed_up = min((y_relative - 9 + ALIGNER_SPACING)/ALIGNER_SPACING, ALIGNERS-1); + + #define ALIGNER_GRID_Y_START (WIDTH - 9 - ALIGNER_SPACING * (ALIGNERS - 1)) + + uint passed_down = py > ALIGNER_GRID_Y_START ? (py - ALIGNER_GRID_Y_START) / ALIGNER_SPACING : 0; + + if (px < 9) { + if (passed_up>0) passed_up -= 1; + if (passed_down>(ALIGNERS-2)) passed_down-=1; + // if (passed_down>0) return 5; + // if (passed_up>0) return 5; + if (tiny_columns == 0) { + bit_index -= passed_up*10; + } else if (tiny_columns == 1) { + // bit_index += 16; + bit_index -= passed_down*10; + bit_index -= (ALIGNERS-2)*10; + } else if (tiny_columns == 2) { + if (VERSION > 6) { + bit_index -= 12; + } + bit_index -= (ALIGNERS-2) * 20; + } else if (tiny_columns == 3) { + if (VERSION > 6) { + bit_index -= 12; + bit_index -= (ALIGNERS-2)*20; + } + } + } if (aligner_col_mod == 0) { - bit_index -= passed_up * 10; - if (direction_up && py < 5){ - bit_index -= 8; - } - if (!direction_up && py > 5){ - bit_index += 2; - if (py > WIDTH-5){ - bit_index -= 10; - } + if (direction_up) { + bit_index -= passed_up * 10; + if (py < 8) + bit_index -= 8; + } else { + bit_index -= passed_down * 10; + if (py > 8) + bit_index -= 8; } } else if (aligner_col_mod == 1) { - uint passed_down = (y_relative - 8 + ALIGNER_SPACING - !direction_up*MISALIGNMENT) / ALIGNER_SPACING; - bit_index -= (passed_down + ALIGNERS - 1) * 10; - if (!direction_up) - bit_index += 10; - if (aligner_col > 0) { - bit_index -= 8; + if (column > 3){ + bit_index -= ALIGNERS*10 - 2; } else { - bit_index += 8; + bit_index -= ALIGNERS*10; + bit_index += 26; // right finder } - if (direction_up ? py < 5 : py > 5){ - bit_index += 2; + if (direction_up){ + bit_index -= passed_up*10; + if (py < 5) + bit_index -= 8; + } else { + bit_index -= passed_down*10; + if (py > 8) + bit_index -= 8; + if (column == 3) + bit_index -= 8; } - } else if (aligner_col_mod == 2) { + } else if (aligner_col_mod == 2 && px > 5) { bit_index -= (ALIGNERS - 1) * 20; - if (aligner_col > 0) { + if (aligner_col > 0) bit_index -= 16; // most of the current column top aligner, excluding the left 4 pixels - if (py < 9) {// top aligner - if (direction_up){ - bit_index -= min(9-py, 5) - (py < 6); - } else if (py > 3) { - bit_index -= py - 3 - (py > 6); - } - } else { - bit_index += !direction_up; + if (direction_up) { + bit_index -= passed_up*5; + uint progress = (y_relative - 4) % ALIGNER_SPACING; + if (y_relative - 4 >= ALIGNER_SPACING*(ALIGNERS-1)) { + progress = 999; } - if (!direction_up && py > WIDTH-5){ - bit_index-=5; + if (progress < 5) { + bit_index -= progress+1; + } + if (py < 9) { + if (py < 4) + bit_index -= 4; + else + bit_index -= (9-py) - (py<6); + } + } else { + bit_index -= passed_down*5; + if (py < 6 && py > 3) { + bit_index -= py-3; + } + else if (py < 9 && py > 6) { + bit_index -= py-4; + } else if (py > 8){ + bit_index -= 4; + } + + uint progress = (py - ALIGNER_GRID_Y_START) % ALIGNER_SPACING; + if (py < WIDTH-((ALIGNERS-1)*ALIGNER_SPACING+4)) { + progress = 999; + } + if (progress < 5) { + bit_index -= progress; + bit_index += 4; } } - uint offset = (column_progress + ALIGNER_SPACING - 3 - !direction_up*0 + (!direction_up * (-MISALIGNMENT+1))) % ALIGNER_SPACING; - // left side of regular aligners - if (offset < 6 && py > 9 && px > 9) { - bit_index -= offset; - } - bit_index -= passed_up * 5; - - } else { // include the full row + } else if (aligner_col_mod > 2) { // include the full column of aligners bit_index -= (ALIGNERS - 1)*25; if (aligner_col > 0){ - // return PINK; bit_index -= 20; } } @@ -289,7 +349,7 @@ CGPROGRAM const uint length = 6; if (worm == 0) return float3(3,0,0); if (worm < length) return lerp(PINK, BLUE, (worm/(float)length)); - if (bit_index > BIT_COUNT) return float3(1,0,0); + if (bit_index >= BIT_COUNT) return float3(1,0,0); // #define BIT_COUNT 24 return (float)(bit_index%BIT_COUNT)/(float)BIT_COUNT; }