From ece70c0e68f014da2bb6cfcde03c71bbaf7e8688 Mon Sep 17 00:00:00 2001 From: yum Date: Fri, 9 May 2025 14:44:26 -0700 Subject: Fix screen wrapping edge cases in unigram text display --- unigram_letter_grid.cginc | 56 +++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/unigram_letter_grid.cginc b/unigram_letter_grid.cginc index f5cfc59..bc7aa94 100644 --- a/unigram_letter_grid.cginc +++ b/unigram_letter_grid.cginc @@ -75,7 +75,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block00_Datum02_Byte00_Animated : packoffset(c2); float _Unigram_Letter_Grid_Data_Block00_Datum03_Byte00_Animated : packoffset(c3); float _Unigram_Letter_Grid_Data_Block00_Datum04_Byte00_Animated : packoffset(c4); - float _Unigram_Letter_Grid_Data_Block01_Datum00_Byte00_Animated : packoffset(c5); float _Unigram_Letter_Grid_Data_Block01_Datum01_Byte00_Animated : packoffset(c6); float _Unigram_Letter_Grid_Data_Block01_Datum02_Byte00_Animated : packoffset(c7); @@ -87,7 +86,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block02_Datum02_Byte00_Animated : packoffset(c12); float _Unigram_Letter_Grid_Data_Block02_Datum03_Byte00_Animated : packoffset(c13); float _Unigram_Letter_Grid_Data_Block02_Datum04_Byte00_Animated : packoffset(c14); - float _Unigram_Letter_Grid_Data_Block03_Datum00_Byte00_Animated : packoffset(c15); float _Unigram_Letter_Grid_Data_Block03_Datum01_Byte00_Animated : packoffset(c16); float _Unigram_Letter_Grid_Data_Block03_Datum02_Byte00_Animated : packoffset(c17); @@ -99,7 +97,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block04_Datum02_Byte00_Animated : packoffset(c22); float _Unigram_Letter_Grid_Data_Block04_Datum03_Byte00_Animated : packoffset(c23); float _Unigram_Letter_Grid_Data_Block04_Datum04_Byte00_Animated : packoffset(c24); - float _Unigram_Letter_Grid_Data_Block05_Datum00_Byte00_Animated : packoffset(c25); float _Unigram_Letter_Grid_Data_Block05_Datum01_Byte00_Animated : packoffset(c26); float _Unigram_Letter_Grid_Data_Block05_Datum02_Byte00_Animated : packoffset(c27); @@ -111,7 +108,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block06_Datum02_Byte00_Animated : packoffset(c32); float _Unigram_Letter_Grid_Data_Block06_Datum03_Byte00_Animated : packoffset(c33); float _Unigram_Letter_Grid_Data_Block06_Datum04_Byte00_Animated : packoffset(c34); - float _Unigram_Letter_Grid_Data_Block07_Datum00_Byte00_Animated : packoffset(c35); float _Unigram_Letter_Grid_Data_Block07_Datum01_Byte00_Animated : packoffset(c36); float _Unigram_Letter_Grid_Data_Block07_Datum02_Byte00_Animated : packoffset(c37); @@ -123,7 +119,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block08_Datum02_Byte00_Animated : packoffset(c42); float _Unigram_Letter_Grid_Data_Block08_Datum03_Byte00_Animated : packoffset(c43); float _Unigram_Letter_Grid_Data_Block08_Datum04_Byte00_Animated : packoffset(c44); - float _Unigram_Letter_Grid_Data_Block09_Datum00_Byte00_Animated : packoffset(c45); float _Unigram_Letter_Grid_Data_Block09_Datum01_Byte00_Animated : packoffset(c46); float _Unigram_Letter_Grid_Data_Block09_Datum02_Byte00_Animated : packoffset(c47); @@ -135,7 +130,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block10_Datum02_Byte00_Animated : packoffset(c52); float _Unigram_Letter_Grid_Data_Block10_Datum03_Byte00_Animated : packoffset(c53); float _Unigram_Letter_Grid_Data_Block10_Datum04_Byte00_Animated : packoffset(c54); - float _Unigram_Letter_Grid_Data_Block11_Datum00_Byte00_Animated : packoffset(c55); float _Unigram_Letter_Grid_Data_Block11_Datum01_Byte00_Animated : packoffset(c56); float _Unigram_Letter_Grid_Data_Block11_Datum02_Byte00_Animated : packoffset(c57); @@ -147,7 +141,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block12_Datum02_Byte00_Animated : packoffset(c62); float _Unigram_Letter_Grid_Data_Block12_Datum03_Byte00_Animated : packoffset(c63); float _Unigram_Letter_Grid_Data_Block12_Datum04_Byte00_Animated : packoffset(c64); - float _Unigram_Letter_Grid_Data_Block13_Datum00_Byte00_Animated : packoffset(c65); float _Unigram_Letter_Grid_Data_Block13_Datum01_Byte00_Animated : packoffset(c66); float _Unigram_Letter_Grid_Data_Block13_Datum02_Byte00_Animated : packoffset(c67); @@ -159,7 +152,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block14_Datum02_Byte00_Animated : packoffset(c72); float _Unigram_Letter_Grid_Data_Block14_Datum03_Byte00_Animated : packoffset(c73); float _Unigram_Letter_Grid_Data_Block14_Datum04_Byte00_Animated : packoffset(c74); - float _Unigram_Letter_Grid_Data_Block15_Datum00_Byte00_Animated : packoffset(c75); float _Unigram_Letter_Grid_Data_Block15_Datum01_Byte00_Animated : packoffset(c76); float _Unigram_Letter_Grid_Data_Block15_Datum02_Byte00_Animated : packoffset(c77); @@ -171,7 +163,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block16_Datum02_Byte00_Animated : packoffset(c82); float _Unigram_Letter_Grid_Data_Block16_Datum03_Byte00_Animated : packoffset(c83); float _Unigram_Letter_Grid_Data_Block16_Datum04_Byte00_Animated : packoffset(c84); - float _Unigram_Letter_Grid_Data_Block17_Datum00_Byte00_Animated : packoffset(c85); float _Unigram_Letter_Grid_Data_Block17_Datum01_Byte00_Animated : packoffset(c86); float _Unigram_Letter_Grid_Data_Block17_Datum02_Byte00_Animated : packoffset(c87); @@ -183,7 +174,6 @@ cbuffer UnigramLetterGridDataByte00_Animated float _Unigram_Letter_Grid_Data_Block18_Datum02_Byte00_Animated : packoffset(c92); float _Unigram_Letter_Grid_Data_Block18_Datum03_Byte00_Animated : packoffset(c93); float _Unigram_Letter_Grid_Data_Block18_Datum04_Byte00_Animated : packoffset(c94); - float _Unigram_Letter_Grid_Data_Block19_Datum00_Byte00_Animated : packoffset(c95); float _Unigram_Letter_Grid_Data_Block19_Datum01_Byte00_Animated : packoffset(c96); float _Unigram_Letter_Grid_Data_Block19_Datum02_Byte00_Animated : packoffset(c97); @@ -202,7 +192,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block00_Datum02_Byte01_Animated : packoffset(c2); float _Unigram_Letter_Grid_Data_Block00_Datum03_Byte01_Animated : packoffset(c3); float _Unigram_Letter_Grid_Data_Block00_Datum04_Byte01_Animated : packoffset(c4); - float _Unigram_Letter_Grid_Data_Block01_Datum00_Byte01_Animated : packoffset(c5); float _Unigram_Letter_Grid_Data_Block01_Datum01_Byte01_Animated : packoffset(c6); float _Unigram_Letter_Grid_Data_Block01_Datum02_Byte01_Animated : packoffset(c7); @@ -214,7 +203,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block02_Datum02_Byte01_Animated : packoffset(c12); float _Unigram_Letter_Grid_Data_Block02_Datum03_Byte01_Animated : packoffset(c13); float _Unigram_Letter_Grid_Data_Block02_Datum04_Byte01_Animated : packoffset(c14); - float _Unigram_Letter_Grid_Data_Block03_Datum00_Byte01_Animated : packoffset(c15); float _Unigram_Letter_Grid_Data_Block03_Datum01_Byte01_Animated : packoffset(c16); float _Unigram_Letter_Grid_Data_Block03_Datum02_Byte01_Animated : packoffset(c17); @@ -226,7 +214,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block04_Datum02_Byte01_Animated : packoffset(c22); float _Unigram_Letter_Grid_Data_Block04_Datum03_Byte01_Animated : packoffset(c23); float _Unigram_Letter_Grid_Data_Block04_Datum04_Byte01_Animated : packoffset(c24); - float _Unigram_Letter_Grid_Data_Block05_Datum00_Byte01_Animated : packoffset(c25); float _Unigram_Letter_Grid_Data_Block05_Datum01_Byte01_Animated : packoffset(c26); float _Unigram_Letter_Grid_Data_Block05_Datum02_Byte01_Animated : packoffset(c27); @@ -238,7 +225,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block06_Datum02_Byte01_Animated : packoffset(c32); float _Unigram_Letter_Grid_Data_Block06_Datum03_Byte01_Animated : packoffset(c33); float _Unigram_Letter_Grid_Data_Block06_Datum04_Byte01_Animated : packoffset(c34); - float _Unigram_Letter_Grid_Data_Block07_Datum00_Byte01_Animated : packoffset(c35); float _Unigram_Letter_Grid_Data_Block07_Datum01_Byte01_Animated : packoffset(c36); float _Unigram_Letter_Grid_Data_Block07_Datum02_Byte01_Animated : packoffset(c37); @@ -250,7 +236,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block08_Datum02_Byte01_Animated : packoffset(c42); float _Unigram_Letter_Grid_Data_Block08_Datum03_Byte01_Animated : packoffset(c43); float _Unigram_Letter_Grid_Data_Block08_Datum04_Byte01_Animated : packoffset(c44); - float _Unigram_Letter_Grid_Data_Block09_Datum00_Byte01_Animated : packoffset(c45); float _Unigram_Letter_Grid_Data_Block09_Datum01_Byte01_Animated : packoffset(c46); float _Unigram_Letter_Grid_Data_Block09_Datum02_Byte01_Animated : packoffset(c47); @@ -262,7 +247,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block10_Datum02_Byte01_Animated : packoffset(c52); float _Unigram_Letter_Grid_Data_Block10_Datum03_Byte01_Animated : packoffset(c53); float _Unigram_Letter_Grid_Data_Block10_Datum04_Byte01_Animated : packoffset(c54); - float _Unigram_Letter_Grid_Data_Block11_Datum00_Byte01_Animated : packoffset(c55); float _Unigram_Letter_Grid_Data_Block11_Datum01_Byte01_Animated : packoffset(c56); float _Unigram_Letter_Grid_Data_Block11_Datum02_Byte01_Animated : packoffset(c57); @@ -274,7 +258,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block12_Datum02_Byte01_Animated : packoffset(c62); float _Unigram_Letter_Grid_Data_Block12_Datum03_Byte01_Animated : packoffset(c63); float _Unigram_Letter_Grid_Data_Block12_Datum04_Byte01_Animated : packoffset(c64); - float _Unigram_Letter_Grid_Data_Block13_Datum00_Byte01_Animated : packoffset(c65); float _Unigram_Letter_Grid_Data_Block13_Datum01_Byte01_Animated : packoffset(c66); float _Unigram_Letter_Grid_Data_Block13_Datum02_Byte01_Animated : packoffset(c67); @@ -286,7 +269,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block14_Datum02_Byte01_Animated : packoffset(c72); float _Unigram_Letter_Grid_Data_Block14_Datum03_Byte01_Animated : packoffset(c73); float _Unigram_Letter_Grid_Data_Block14_Datum04_Byte01_Animated : packoffset(c74); - float _Unigram_Letter_Grid_Data_Block15_Datum00_Byte01_Animated : packoffset(c75); float _Unigram_Letter_Grid_Data_Block15_Datum01_Byte01_Animated : packoffset(c76); float _Unigram_Letter_Grid_Data_Block15_Datum02_Byte01_Animated : packoffset(c77); @@ -298,7 +280,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block16_Datum02_Byte01_Animated : packoffset(c82); float _Unigram_Letter_Grid_Data_Block16_Datum03_Byte01_Animated : packoffset(c83); float _Unigram_Letter_Grid_Data_Block16_Datum04_Byte01_Animated : packoffset(c84); - float _Unigram_Letter_Grid_Data_Block17_Datum00_Byte01_Animated : packoffset(c85); float _Unigram_Letter_Grid_Data_Block17_Datum01_Byte01_Animated : packoffset(c86); float _Unigram_Letter_Grid_Data_Block17_Datum02_Byte01_Animated : packoffset(c87); @@ -310,7 +291,6 @@ cbuffer UnigramLetterGridDataByte01_Animated float _Unigram_Letter_Grid_Data_Block18_Datum02_Byte01_Animated : packoffset(c92); float _Unigram_Letter_Grid_Data_Block18_Datum03_Byte01_Animated : packoffset(c93); float _Unigram_Letter_Grid_Data_Block18_Datum04_Byte01_Animated : packoffset(c94); - float _Unigram_Letter_Grid_Data_Block19_Datum00_Byte01_Animated : packoffset(c95); float _Unigram_Letter_Grid_Data_Block19_Datum01_Byte01_Animated : packoffset(c96); float _Unigram_Letter_Grid_Data_Block19_Datum02_Byte01_Animated : packoffset(c97); @@ -576,10 +556,20 @@ void GetTokens(uint screen_ptr, uint which_block = 0; [loop] for (uint i = 1; i < ULG_NUM_BLOCKS; i++) { - if (screen_ptr < floor(_Unigram_Letter_Visual_Pointers[i])) { - break; + uint next_ptr = floor(_Unigram_Letter_Visual_Pointers[i]); + if (block_ptr < next_ptr) { + // Case 1: visual pointers are increasing + if (screen_ptr >= block_ptr && screen_ptr < next_ptr) { + break; + } + } else { + // Case 2: visual pointer went backwards. This happens when we page long + // data, wrapping around finite number of blocks. + if (screen_ptr >= block_ptr || screen_ptr < next_ptr) { + break; + } } - block_ptr = floor(_Unigram_Letter_Visual_Pointers[i]); + block_ptr = next_ptr; which_block = i; } GetBlock(which_block, tokens); @@ -647,24 +637,38 @@ uint GetChar(uint screen_ptr) { // The current token is rendered starting at this location. // In other words, it covers [token_ptr, token_ptr + token_length) uint token_ptr = block_ptr; + // Wrap the block pointer around the board. + const uint BOARD_SIZE = _Unigram_Letter_Grid_Res_X * _Unigram_Letter_Grid_Res_Y; + token_ptr = token_ptr % BOARD_SIZE; uint token_offset; uint token_length = 0; bool got_match = false; [loop] for (uint i = 0; i < ULG_BLOCK_WIDTH; i++) { TokenLengthOffset(tokens[i], token_length, token_offset); - if (screen_ptr >= token_ptr && - screen_ptr < token_ptr + token_length) { + if (token_length == 0) { + continue; + } + if (screen_ptr >= token_ptr && screen_ptr < token_ptr + token_length) { + got_match = true; + break; + } + // Edge case: the token pointer may be partially outside of the visible + // part of the board. + if (screen_ptr + BOARD_SIZE >= token_ptr && + screen_ptr + BOARD_SIZE < token_ptr + token_length) { got_match = true; break; } + token_ptr += token_length; + token_ptr = token_ptr % BOARD_SIZE; } // Edge case: no match if (!got_match) { return ' '; } - uint nth_char = screen_ptr - token_ptr; + uint nth_char = (screen_ptr >= token_ptr) ? screen_ptr - token_ptr : (screen_ptr + BOARD_SIZE) - token_ptr; return GetTokenChar(token_offset, nth_char); } #endif -- cgit v1.2.3