From bf8e98caf015279941956abf3bd2cf8fdd60d167 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Thu, 17 Dec 2020 16:14:33 -0800 Subject: [PATCH] Fix text rendering for some non-ascii strings --- Assets/Scripts/TextRenderTest.cs | 2 + .../Plugins/ConformalDecals.dll | Bin 81920 -> 82432 bytes Source/ConformalDecals/Text/DecalFont.cs | 4 + Source/ConformalDecals/Text/DecalText.cs | 4 + Source/ConformalDecals/Text/TextRenderer.cs | 84 ++++++++---------- changelog.txt | 6 ++ 6 files changed, 55 insertions(+), 45 deletions(-) diff --git a/Assets/Scripts/TextRenderTest.cs b/Assets/Scripts/TextRenderTest.cs index 6e2fc85..75df98f 100644 --- a/Assets/Scripts/TextRenderTest.cs +++ b/Assets/Scripts/TextRenderTest.cs @@ -30,6 +30,8 @@ public class TextRenderTest : MonoBehaviour { Debug.Log("starting..."); StartCoroutine(OnRender()); + var thing = new GameObject(); + thing.AddComponent(); } // Update is called once per frame diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 0cced2bd70436cbd5c30a462c520fb08c5f0451f..a3b191fd2a8641bb7bc1b1f3b32d95fe230b7534 100644 GIT binary patch delta 24009 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 delta 23706 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 z z^goLc&|3P7%_aI-@B=up3(M}tA;6m+#$kLG4CAw)OsI7EDHBWZCa6rTV@&cIQBDbL zwv~yvf^PN$qQ-lzeG8A=3ycTE!rZ}ji&9-W3azv!KER<5aM};x*|frb6wjt7?I%U4 z_f3>(yL*7w&;xjqe}biG5j!9*s5qi03`=m0J7JiQuRaRIlGshSE1aLd30KBx+5Jqj zU^Aw)OlVh8B|i!(POxEp;ugKj|-YJ(M?vk%T+$|4q;A_cu<-thKv(p81a^sy075f2Q-S8vJ zm$<;MSip>TsN`=j+<<5{+>B^9j6rl7ZbOVRR3T0_%*IAk8L8jX5cBZM^6rQpFm}kp zub~}?DUjPCPlaqKM$!c;5WB%ch`r%O!~yUYVg@{Yf3df_V;5r! zV~Y3?RwVRh94Dx<`HW}88CaiiMtlP=CR9rGsBdK4$k;5Yq;1}@83##qVN$T;6Xjo!#|Gh>UPUPaXzHVFJa zv%5n!l9Qk1GR8{AM#c@s``}oIjV$j%In&#W^10|{<9saDg7UbS7M9O&9HG?1sThHu zXJSm02gdqYE<^dX*fNyW?v6?%>2c!}s<=V959W9qQG*F&%?8vQ^loI$Cf4jiO|7q) zH7$&1ST9W6d&V-xO2)C~b&wq0Y^GXT7=?vB2~|fK9@66~85<_N;m5jI3{5c(aL5qq*+#L zWYWNfU5qWPfk-MQBB_|4v5c{iaU)|hV+*5jvL|C1Vm^MN=6Z*Qf2-a!ZOB6 z#zw|w#ui2q%bu~^AjV3@M#hbd&5SLKB95zMY-Vg>6!ENQEQ`NP^S_cwBjbj6s%9h0 z&5SLKB7utSN?Qk&(LFQBXDnj_;|9iEjHekPKt4%~yBJS1LMH1Odm`feAIs!)_B#9` z=XAmQSPVK7_GBE(*uc1}i1eo!lZx4gaV+Bo#$Ak1Le?b4o{VD|8yN9-mhkOpDPCDb z_~08=X(Mcvwp#mK`#bji_7CkX_P^VIu^S^2B1$95BCd}Z6EQwwVZ`F_$T!ER9TP@H z0h~#%L|lSk@aXC$$J>3c#;G0DjlkdDUep#yBugF zo9~IH2JL4&T0}m_Ek_W)D*6a|#pdJ_*0DUDVw$K#Oc&!2 zGsJkrd~pY2S5bx7O-w}WE+%8t9*7ct7#2eLYD5YDa7H!C^b7tH{&IXR%KZ=}=r5+B zT#hK=M^`gY9-!hu!rz3Sh2$ng34aZ~9_3pQB^WK{B96gd<&j`4{_ea4m0~{Ptzsei zj6=j%i{fs?IbsoN<|0ZkPuz#HiYP&YSc2FnmLc9HmLtv=VZ;SuCE`M%uEs-?co1=g zScmw4cnI+Y@d)BJu@UhVu?g`tu^C@q&J;Z$1Cr!S#AG=eF;&h*OqV+$2IK<#i@2lF zS_EU!S_HSE6(9SewFquUYY9w3YY9w2YYF~QxxQXJ)S$Tp>exJ8?uYWs@T>1s-;!l3 zvp;O#Zl4`-Yy>^JHZ*}S|18Hx>VN+6hwt89*dXY1_tLE{%Sahbec>@1fwE0axQe?Qq0s74F7k z#w2hz8jbkJJ%>0tGi_izuoL^*y3tDn>&`>DnL6x|S+w&foCa-n(}_bNjCwnpQ{j5W$xnSBbyN{|ClgW^w=k diff --git a/Source/ConformalDecals/Text/DecalFont.cs b/Source/ConformalDecals/Text/DecalFont.cs index bf422ee..683acd3 100644 --- a/Source/ConformalDecals/Text/DecalFont.cs +++ b/Source/ConformalDecals/Text/DecalFont.cs @@ -105,5 +105,9 @@ namespace ConformalDecals.Text { public void OnBeforeSerialize() { } public void OnAfterDeserialize() { } + + public override string ToString() { + return _title; + } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Text/DecalText.cs b/Source/ConformalDecals/Text/DecalText.cs index d6af8d1..d02c23e 100644 --- a/Source/ConformalDecals/Text/DecalText.cs +++ b/Source/ConformalDecals/Text/DecalText.cs @@ -86,5 +86,9 @@ namespace ConformalDecals.Text { public static bool operator !=(DecalText left, DecalText right) { return !Equals(left, right); } + + public override string ToString() { + return $"{nameof(_text)}: {_text}, {nameof(_font)}: {_font}, {nameof(_style)}: {_style}, {nameof(_vertical)}: {_vertical}, {nameof(_lineSpacing)}: {_lineSpacing}, {nameof(_charSpacing)}: {_charSpacing}"; + } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index 0704026..7a527ea 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -44,12 +44,13 @@ namespace ConformalDecals.Text { private static TextRenderer _instance; - private bool _isSetup; - private TextMeshPro _tmp; - private Shader _blitShader; + private bool _isSetup; + private Shader _blitShader; private static readonly Dictionary RenderCache = new Dictionary(); private static readonly Queue RenderJobs = new Queue(); + private static Texture2D _blankTexture; + /// Update text using the job queue public static TextRenderJob UpdateText(DecalText oldText, DecalText newText, UnityAction renderFinishedCallback) { @@ -69,11 +70,14 @@ namespace ConformalDecals.Text { /// Unregister a user of a piece of text public static void UnregisterText(DecalText text) { + if (text == null) throw new ArgumentNullException(nameof(text)); + if (RenderCache.TryGetValue(text, out var renderedText)) { renderedText.UserCount--; if (renderedText.UserCount <= 0) { RenderCache.Remove(text); - Destroy(renderedText.Texture); + var texture = renderedText.Texture; + if (texture != _blankTexture) Destroy(texture); } } } @@ -97,6 +101,8 @@ namespace ConformalDecals.Text { if (!SystemInfo.SupportsRenderTextureFormat(textRenderTextureFormat)) { Logging.LogError($"Text texture format {textRenderTextureFormat} not supported on this platform."); } + + _blankTexture = Texture2D.blackTexture; } /// Setup this text renderer instance for rendering @@ -105,8 +111,8 @@ namespace ConformalDecals.Text { Logging.Log("Setting Up TextRenderer Object"); - _tmp = gameObject.AddComponent(); - _tmp.renderer.enabled = false; // dont automatically render + // _tmp = gameObject.AddComponent(); + // _tmp.renderer.enabled = false; // dont automatically render _blitShader = Shabby.Shabby.FindShader(ShaderName); if (_blitShader == null) Logging.LogError($"Could not find text blit shader named '{ShaderName}'"); @@ -120,21 +126,11 @@ namespace ConformalDecals.Text { renderNeeded = false; return null; } + + Logging.Log($"Rendering text {job.NewText}"); job.Start(); - - if (job.OldText != null && RenderCache.TryGetValue(job.OldText, out var oldRender)) { - // old output still exists - - oldRender.UserCount--; - - if (oldRender.UserCount <= 0) { - // this is the only usage of this output, so we are free to re-render into the texture - - Destroy(oldRender.Texture); - RenderCache.Remove(job.OldText); - } - } + if (!(job.OldText is null)) UnregisterText(job.OldText); // now that all old references are handled, begin rendering the new output @@ -156,28 +152,31 @@ namespace ConformalDecals.Text { /// Render a piece of text to a given texture public TextRenderOutput RenderText(DecalText text) { + var tmpObject = new GameObject("Text Mesh Pro renderer"); + var tmp = tmpObject.AddComponent(); + if (text == null) throw new ArgumentNullException(nameof(text)); - if (_tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); + if (tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); // SETUP TMP OBJECT FOR RENDERING - _tmp.text = text.FormattedText; - _tmp.font = text.Font.FontAsset; - _tmp.fontStyle = text.Style | text.Font.FontStyle; - _tmp.lineSpacing = text.LineSpacing; - _tmp.characterSpacing = text.CharSpacing; - - _tmp.extraPadding = true; - _tmp.enableKerning = true; - _tmp.enableWordWrapping = false; - _tmp.overflowMode = TextOverflowModes.Overflow; - _tmp.alignment = TextAlignmentOptions.Center; - _tmp.fontSize = FontSize; + tmp.text = text.FormattedText; + tmp.font = text.Font.FontAsset; + tmp.fontStyle = text.Style | text.Font.FontStyle; + tmp.lineSpacing = text.LineSpacing; + tmp.characterSpacing = text.CharSpacing; + + tmp.extraPadding = true; + tmp.enableKerning = true; + tmp.enableWordWrapping = false; + tmp.overflowMode = TextOverflowModes.Overflow; + tmp.alignment = TextAlignmentOptions.Center; + tmp.fontSize = FontSize; // GENERATE MESH - _tmp.ClearMesh(false); - _tmp.ForceMeshUpdate(); + tmp.ClearMesh(false); + tmp.ForceMeshUpdate(); - var meshFilters = gameObject.GetComponentsInChildren(); + var meshFilters = tmpObject.GetComponentsInChildren(); var meshes = new Mesh[meshFilters.Length]; var materials = new Material[meshFilters.Length]; @@ -188,7 +187,7 @@ namespace ConformalDecals.Text { var renderer = meshFilters[i].gameObject.GetComponent(); meshes[i] = meshFilters[i].mesh; - if (i == 0) meshes[i] = _tmp.mesh; + if (i == 0) meshes[i] = tmp.mesh; materials[i] = Instantiate(renderer.material); materials[i].shader = _blitShader; @@ -215,8 +214,8 @@ namespace ConformalDecals.Text { }; if (textureSize.x == 0 || textureSize.y == 0) { - Logging.LogWarning("No text present or error in texture size calculation. Aborting."); - return new TextRenderOutput(Texture2D.blackTexture, Rect.zero); + Logging.LogError("No text present or error in texture size calculation. Aborting."); + return new TextRenderOutput(_blankTexture, Rect.zero); } // make sure texture isnt too big, scale it down if it is @@ -265,7 +264,7 @@ namespace ConformalDecals.Text { } } - // COPY TEXTURE BACK INTO RAM + // COPY RENDERTEX INTO TEXTURE var prevRT = RenderTexture.active; RenderTexture.active = renderTex; texture.ReadPixels(new Rect(0, 0, textureSize.x, textureSize.y), 0, 0, false); @@ -278,12 +277,7 @@ namespace ConformalDecals.Text { RenderTexture.ReleaseTemporary(renderTex); // CLEAR SUBMESHES - _tmp.text = ""; - - for (int i = 0; i < transform.childCount; i++) { - var child = transform.GetChild(i); - Destroy(child.gameObject); - } + Destroy(tmpObject); return new TextRenderOutput(texture, window); } diff --git a/changelog.txt b/changelog.txt index dbaba71..b9077f1 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +v0.2.7 +------ +- Fixes: + - Fixed certain non-ascii strings not rendering correctly under certain circumstances. + - Yet another attempted fix for the planet text glitch. + v0.2.6 ------ - Fixes: