Last active
September 9, 2024 05:08
-
-
Save allfake/d4fde9c573eaa4d5461a07ad446faf18 to your computer and use it in GitHub Desktop.
Patch Unity Text mesh pro For fix thai vowel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
For Unity 2019 plase use this | |
==> https://github.com/rutcreate/TextMesh-Pro-Thai | |
==> 90% of font need to edit for some character | |
==> or add | |
==> "com.unity.textmeshpro": "https://github.com/rutcreate/TextMesh-Pro-Thai.git" | |
==> To manifest.json in your project | |
==> Unity5 or lower | |
Manual Patch | |
Generate Font by range 0-255,688-767,3584-3711,7104-7167,8192-8304,63232-63258 | |
This asset cannot be use https://www.assetstore.unity3d.com/en/#!/content/84126 | |
because this asset don't include source code see http://digitalnativestudios.com/forum/index.php?topic=1471.0. | |
Please contact Stephan B. . | |
แก้สระลอยของภาษาไทยใน asset ที่ชื่อว่า Text Mesh Pro | |
โดยแก้ตามไฟล์ด้านล่าง | |
https://www.assetstore.unity3d.com/en/#!/content/84126 ใช้ไม่ได้เพราะไม่มี source code นาจา | |
ดูได้ตาม link http://digitalnativestudios.com/forum/index.php?topic=1471.0. | |
------ | |
TMPro_uiEditorPanel.cs | |
Add before "private SerializedProperty horizontalMapping_prop;". | |
private SerializedProperty fixThaiVowel_prop; | |
Add before "enableWordWrapping_prop = serializedObject.FindProperty("m_enableWordWrapping");" | |
fixThaiVowel_prop = serializedObject.FindProperty("m_fixThaiVowel"); | |
Add after | |
" | |
// EXTRA PADDING | |
EditorGUI.BeginChangeCheck(); | |
EditorGUILayout.PropertyField(enableExtraPadding_prop, new GUIContent("Extra Padding?")); | |
if (EditorGUI.EndChangeCheck()) | |
{ | |
havePropertiesChanged = true; | |
checkPaddingRequired_prop.boolValue = true; | |
} | |
" | |
EditorGUI.BeginChangeCheck(); | |
EditorGUILayout.PropertyField(fixThaiVowel_prop, new GUIContent("Fix Thai Vowel?")); | |
if (EditorGUI.EndChangeCheck()) | |
{ | |
havePropertiesChanged = true; | |
} | |
------ | |
TMP_EditorPanel.cs | |
Add before "private SerializedProperty enableWordWrapping_prop;". | |
private SerializedProperty fixThaiVowel_prop; | |
Add before "horizontalMapping_prop = serializedObject.FindProperty("m_horizontalMapping");" | |
fixThaiVowel_prop = serializedObject.FindProperty("m_fixThaiVowel"); | |
Add after | |
" | |
// EXTRA PADDING | |
EditorGUI.BeginChangeCheck(); | |
EditorGUILayout.PropertyField(enableExtraPadding_prop, new GUIContent("Extra Padding?")); | |
if (EditorGUI.EndChangeCheck()) | |
{ | |
havePropertiesChanged = true; | |
checkPaddingRequired_prop.boolValue = true; | |
} | |
" | |
// FIX THAI VOWEL | |
EditorGUI.BeginChangeCheck(); | |
EditorGUILayout.PropertyField(fixThaiVowel_prop, new GUIContent("Fix Thai Vowel?")); | |
if (EditorGUI.EndChangeCheck()) | |
{ | |
havePropertiesChanged = true; | |
} | |
------ | |
TMP_Text.cs | |
Add before "protected virtual void LoadFontAsset() { }". | |
[SerializeField] | |
private bool m_fixThaiVowel = true; | |
Add after | |
" | |
switch (m_inputSource) | |
{ | |
case TextInputSources.String: | |
case TextInputSources.Text: | |
StringToCharArray(m_text, ref m_char_buffer); | |
break; | |
case TextInputSources.SetText: | |
SetTextArrayToCharArray(m_input_CharArray, ref m_char_buffer); | |
break; | |
case TextInputSources.SetCharArray: | |
break; | |
} | |
" | |
if (m_fixThaiVowel) | |
{ | |
FixThaiVowel(); | |
} | |
Add Before end. | |
#region Fix Thai Vowel | |
// Lower level characters | |
private const int SARA_U = 3640; | |
private const int SARA_UU = 3641; | |
private const int PHINTHU = 3642; | |
// Lower level characters after pullDown | |
private const int SARA_U_DOWN = 63256; | |
private const int SARA_UU_DOWN = 63257; | |
private const int PHINTHU_DOWN = 63258; | |
// Upper level 1 characters | |
private const int MAI_HAN_AKAT = 3633; | |
private const int SARA_AM = 3635; | |
private const int SARA_I = 3636; | |
private const int SARA_Ii = 3637; | |
private const int SARA_Ue = 3638; | |
private const int SARA_Uee = 3639; | |
private const int MAI_TAI_KHU = 3655; | |
// Upper level 1 characters after shift left | |
private const int MAI_HAN_AKAT_LEFT_SHIFT = 63248; | |
private const int SARA_I_LEFT_SHIFT = 63233; | |
private const int SARA_Ii_LEFT_SHIFT = 63234; | |
private const int SARA_Ue_LEFT_SHIFT = 63235; | |
private const int SARA_Uee_LEFT_SHIFT = 63236; | |
private const int MAI_TAI_KHU_LEFT_SHIFT = 63250; | |
// Upper level 2 characters | |
private const int MAI_EK = 3656; | |
private const int MAI_THO = 3657; | |
private const int MAI_TRI = 3658; | |
private const int MAI_CHATTAWA = 3659; | |
private const int THANTHAKHAT = 3660; | |
private const int NIKHAHIT = 3661; | |
// Upper level 2 characters after pull down | |
private const int MAI_EK_DOWN = 63242; | |
private const int MAI_THO_DOWN = 63243; | |
private const int MAI_TRI_DOWN = 63244; | |
private const int MAI_CHATTAWA_DOWN = 63245; | |
private const int THANTHAKHAT_DOWN = 63246; | |
// Upper level 2 characters after pull down and shift left | |
private const int MAI_EK_PULL_DOWN_AND_LEFT_SHIFT = 63237; | |
private const int MAI_THO_PULL_DOWN_AND_LEFT_SHIFT = 63238; | |
private const int MAI_TRI_PULL_DOWN_AND_LEFT_SHIFT = 63239; | |
private const int MAI_CHATTAWA_PULL_DOWN_AND_LEFT_SHIFT = 63240; | |
private const int THANTHAKHAT_PULL_DOWN_AND_LEFT_SHIFT = 63241; | |
// Upper level 2 characters after shift left | |
private const int MAI_EK_LEFT_SHIFT = 63251; | |
private const int MAI_THO_LEFT_SHIFT = 63252; | |
private const int MAI_TRI_LEFT_SHIFT = 63253; | |
private const int MAI_CHATTAWA_LEFT_SHIFT = 63254; | |
private const int THANTHAKHAT_LEFT_SHIFT = 63255; | |
private const int NIKHAHIT_LEFT_SHIFT = 63249; | |
// Up tail characters | |
private const int PO_PLA = 3611; | |
private const int FO_FA = 3613; | |
private const int FO_FAN = 3615; | |
private const int LOchULA = 3628; | |
// Down tail characters | |
private const int THO_THAN = 3600; | |
private const int YO_YING = 3597; | |
private const int DOchADA = 3598; | |
private const int TO_PATAK = 3599; | |
private const int RU = 3620; | |
private const int LU = 3622; | |
// Cut tail characters | |
private const int THO_THAN_CUT_TAIL = 63232; | |
private const int YO_YING_CUT_TAIL = 63247; | |
// for exploded SARA_AM (NIKHAHIT + SARA_AA) | |
private const int SARA_AA = 3634; | |
protected virtual void FixThaiVowel() | |
{ | |
// ExplodeSaraAm(); | |
int prevCode = 0; | |
int cutCode = 0; | |
for (int i = 0; m_char_buffer[i] != 0; i++) | |
{ | |
int code = m_char_buffer[i]; | |
if (IsUpperLevel1(code) && IsUpTail(prevCode)) | |
{ | |
m_char_buffer[i] = GetShiftLeftCharacter(code); | |
} | |
else if (IsUpperLevel2(code)) | |
{ | |
if (IsLowerLevel(prevCode)) | |
{ | |
prevCode = m_char_buffer[i - 2]; | |
} | |
if (IsUpTail(prevCode)) | |
{ | |
m_char_buffer[i] = GetPullDownAndShiftLeftCharacter(code); | |
} | |
else if (IsLeftShiftUpperLevel1(prevCode)) | |
{ | |
m_char_buffer[i] = GetShiftLeftCharacter(code); | |
} | |
else if (!IsUpperLevel1(prevCode)) | |
{ | |
m_char_buffer[i] = GetPullDownCharacter(code); | |
} | |
} | |
else if (IsLowerLevel(code) && IsDownTail(prevCode)) | |
{ | |
cutCode = GetCutTailCharacter(prevCode); | |
if (prevCode != cutCode) | |
{ | |
m_char_buffer[i - 1] = cutCode; | |
} | |
else | |
{ | |
m_char_buffer[i] = GetPullDownCharacter(code); | |
} | |
} | |
else if (IsSaraAm(code) && i > 0) | |
{ | |
if (IsPullDown(prevCode)) | |
{ | |
m_char_buffer[i - 1] = GetPullUpCharacter(prevCode); | |
} | |
} | |
prevCode = m_char_buffer[i]; | |
} | |
} | |
private void ExplodeSaraAm() | |
{ | |
if (CountSaraAm() == 0) return; | |
List<int> buffers = new List<int>(); | |
for (int i = 0; i < m_char_buffer.Length; i++) | |
{ | |
int charCode = m_char_buffer[i]; | |
if (i < m_char_buffer.Length - 1 && m_char_buffer[i + 1] == SARA_AM) | |
{ | |
if (IsUpperLevel2(charCode)) | |
{ | |
buffers.Add(NIKHAHIT); | |
buffers.Add(charCode); | |
} | |
else | |
{ | |
buffers.Add(charCode); | |
buffers.Add(NIKHAHIT); | |
} | |
} | |
else if (charCode == SARA_AM) | |
{ | |
buffers.Add(SARA_AA); | |
} | |
else | |
{ | |
buffers.Add(charCode); | |
} | |
} | |
m_char_buffer = buffers.ToArray(); | |
} | |
private int GetPullUpCharacter(int charCode) | |
{ | |
switch (charCode) | |
{ | |
case MAI_EK_DOWN: return MAI_EK; | |
case MAI_THO_DOWN: return MAI_THO; | |
case MAI_TRI_DOWN: return MAI_TRI; | |
case MAI_CHATTAWA_DOWN: return MAI_CHATTAWA; | |
case THANTHAKHAT_DOWN: return THANTHAKHAT; | |
case SARA_U_DOWN: return SARA_U; | |
case SARA_UU_DOWN: return SARA_UU; | |
case PHINTHU_DOWN: return PHINTHU; | |
default: return charCode; | |
} | |
} | |
private int GetPullDownCharacter(int charCode) | |
{ | |
switch (charCode) | |
{ | |
case MAI_EK: return MAI_EK_DOWN; | |
case MAI_THO: return MAI_THO_DOWN; | |
case MAI_TRI: return MAI_TRI_DOWN; | |
case MAI_CHATTAWA: return MAI_CHATTAWA_DOWN; | |
case THANTHAKHAT: return THANTHAKHAT_DOWN; | |
case SARA_U: return SARA_U_DOWN; | |
case SARA_UU: return SARA_UU_DOWN; | |
case PHINTHU: return PHINTHU_DOWN; | |
default: return charCode; | |
} | |
} | |
private int GetCutTailCharacter(int charCode) | |
{ | |
switch (charCode) | |
{ | |
case THO_THAN: return THO_THAN_CUT_TAIL; | |
case YO_YING: return YO_YING_CUT_TAIL; | |
default: return charCode; | |
} | |
} | |
private int GetShiftLeftCharacter(int charCode) | |
{ | |
switch (charCode) | |
{ | |
case MAI_EK: return MAI_EK_LEFT_SHIFT; | |
case MAI_THO: return MAI_THO_LEFT_SHIFT; | |
case MAI_TRI: return MAI_TRI_LEFT_SHIFT; | |
case MAI_CHATTAWA: return MAI_CHATTAWA_LEFT_SHIFT; | |
case MAI_HAN_AKAT: return MAI_HAN_AKAT_LEFT_SHIFT; | |
case SARA_I: return SARA_I_LEFT_SHIFT; | |
case SARA_Ii: return SARA_Ii_LEFT_SHIFT; | |
case SARA_Ue: return SARA_Ue_LEFT_SHIFT; | |
case SARA_Uee: return SARA_Uee_LEFT_SHIFT; | |
case MAI_TAI_KHU: return MAI_TAI_KHU_LEFT_SHIFT; | |
case NIKHAHIT: return NIKHAHIT_LEFT_SHIFT; | |
default: return charCode; | |
} | |
} | |
private int GetPullDownAndShiftLeftCharacter(int charCode) | |
{ | |
switch (charCode) | |
{ | |
case MAI_EK: return MAI_EK_PULL_DOWN_AND_LEFT_SHIFT; | |
case MAI_THO: return MAI_THO_PULL_DOWN_AND_LEFT_SHIFT; | |
case MAI_TRI: return MAI_TRI_PULL_DOWN_AND_LEFT_SHIFT; | |
case MAI_CHATTAWA: return MAI_CHATTAWA_PULL_DOWN_AND_LEFT_SHIFT; | |
case MAI_HAN_AKAT: return MAI_HAN_AKAT_LEFT_SHIFT; | |
case THANTHAKHAT: return THANTHAKHAT_PULL_DOWN_AND_LEFT_SHIFT; | |
default: return charCode; | |
} | |
} | |
private bool IsPullDown(int charCode) | |
{ | |
return charCode == MAI_EK_DOWN || charCode == MAI_THO_DOWN || | |
charCode == MAI_TRI_DOWN || charCode == MAI_CHATTAWA_DOWN || | |
charCode == THANTHAKHAT_DOWN || charCode == SARA_U_DOWN || | |
charCode == SARA_UU_DOWN || charCode == PHINTHU_DOWN; | |
} | |
private bool IsUpTail(int charCode) | |
{ | |
return charCode == PO_PLA || charCode == FO_FA || charCode == FO_FAN | |
|| charCode == LOchULA; | |
} | |
private bool IsDownTail(int charCode) | |
{ | |
return charCode == THO_THAN || charCode == YO_YING || charCode == DOchADA | |
|| charCode == TO_PATAK || charCode == RU || charCode == LU; | |
} | |
private bool IsUpperLevel1(int charCode) | |
{ | |
return charCode == MAI_HAN_AKAT || charCode == SARA_I || charCode == SARA_Ii | |
|| charCode == SARA_Ue || charCode == SARA_Uee || charCode == MAI_TAI_KHU | |
|| charCode == NIKHAHIT; | |
} | |
private bool IsUpperLevel2(int charCode) | |
{ | |
return charCode == MAI_EK || charCode == MAI_THO || charCode == MAI_TRI | |
|| charCode == MAI_CHATTAWA || charCode == THANTHAKHAT; | |
} | |
private bool IsLeftShiftUpperLevel1(int charCode) | |
{ | |
return charCode == MAI_HAN_AKAT_LEFT_SHIFT || charCode == SARA_I_LEFT_SHIFT | |
|| charCode == SARA_Ii_LEFT_SHIFT || charCode == SARA_Ue_LEFT_SHIFT | |
|| charCode == SARA_Uee_LEFT_SHIFT || charCode == MAI_TAI_KHU_LEFT_SHIFT | |
|| charCode == NIKHAHIT_LEFT_SHIFT; | |
} | |
private bool IsLowerLevel(int charCode) | |
{ | |
return charCode == SARA_U || charCode == SARA_UU || charCode == PHINTHU; | |
} | |
private bool IsSaraAm(int charCode) | |
{ | |
return charCode == SARA_AM; | |
} | |
private int CountSaraAm() | |
{ | |
int count = 0; | |
for (int i = 0; m_char_buffer[i] != 0; i++) | |
{ | |
if (m_char_buffer[i] == SARA_AM) | |
{ | |
count++; | |
} | |
} | |
return count; | |
} | |
#endregion | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Character set view here
https://gist.github.com/allfake/1d5a64c2a1eca36a660c
Or just thai and english
Character set => Unicode Range(Hex) in font asset creator
00,0D,20-7E,A0-B4,B6-FF,2BB-2BC,2BE-2BF,2C6-2CC,2D8-2DD,E01-E3A,E3F-E5B,F700-F710,F712-F71A