Skip to content

Instantly share code, notes, and snippets.

@allfake
Last active October 5, 2023 02:45
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save allfake/d4fde9c573eaa4d5461a07ad446faf18 to your computer and use it in GitHub Desktop.
Save allfake/d4fde9c573eaa4d5461a07ad446faf18 to your computer and use it in GitHub Desktop.
Patch Unity Text mesh pro For fix thai vowel
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
@allfake
Copy link
Author

allfake commented Apr 24, 2017

screen shot 2560-04-24 at 11 56 41 am

@allfake
Copy link
Author

allfake commented Oct 1, 2020

For now, Go here https://github.com/rutcreate/TextMesh-Pro-Thai.git

Add
"com.unity.textmeshpro": "https://github.com/rutcreate/TextMesh-Pro-Thai.git"
To manifest.json in your project


If you use textmeshpro then replace instead of add
Like this
"com.unity.textmeshpro": "2.1.1",
to
"com.unity.textmeshpro": "https://github.com/rutcreate/TextMesh-Pro-Thai.git",


เปลี่ยนไปใช้อันนี้เน้อว https://github.com/rutcreate/TextMesh-Pro-Thai.git

เพิ่ม
"com.unity.textmeshpro": "https://github.com/rutcreate/TextMesh-Pro-Thai.git"
ใน manifest.json ใน unity proejct นะ


ถ้าใช้ textmeshpro อยู่แล้วก็แก้จาก
"com.unity.textmeshpro": "2.1.1",
เป็น
"com.unity.textmeshpro": "https://github.com/rutcreate/TextMesh-Pro-Thai.git",

@allfake
Copy link
Author

allfake commented Oct 1, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment