From e82b02b0e55ef92cff63ac852bf5cfb019045400 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Thu, 12 Nov 2020 21:25:24 -0800 Subject: [PATCH] Fix overlapping text and add text escaping --- .../Plugins/ConformalDecals.dll | Bin 84480 -> 84992 bytes Source/ConformalDecals/ConformalDecals.csproj | 1 + Source/ConformalDecals/ModuleConformalText.cs | 2 ++ Source/ConformalDecals/Text/TextEncoder.cs | 31 ++++++++++++++++++ Source/ConformalDecals/Text/TextRenderer.cs | 18 ++-------- 5 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 Source/ConformalDecals/Text/TextEncoder.cs diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 902be6de71d00c960d0329a77c1bb7027f829f59..e36bb223f267d96632f4d4a0be887e89c7a94034 100644 GIT binary patch delta 28024 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

I?jN7_P}!g6vxD7&4Wpe$jX%h_@#6)A50@|X|G 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 diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index 8ab7fce..9501b09 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -91,6 +91,7 @@ + diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index bc282e4..501a1a4 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -99,6 +99,7 @@ namespace ConformalDecals { public override void OnLoad(ConfigNode node) { base.OnLoad(node); OnAfterDeserialize(); + text = TextEncoder.Decode(text); if (HighLogic.LoadedSceneIsGame) { // For some reason, rendering doesnt work right on the first frame a scene is loaded @@ -112,6 +113,7 @@ namespace ConformalDecals { } public override void OnSave(ConfigNode node) { + text = TextEncoder.Encode(text); OnBeforeSerialize(); base.OnSave(node); } diff --git a/Source/ConformalDecals/Text/TextEncoder.cs b/Source/ConformalDecals/Text/TextEncoder.cs new file mode 100644 index 0000000..d804baa --- /dev/null +++ b/Source/ConformalDecals/Text/TextEncoder.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Text; + +namespace ConformalDecals.Text { + public static class TextEncoder { + private static readonly Dictionary _escapeSequences = new Dictionary() { + {"\n", "\\n"}, + {"\\", "\\\\"}, + {"/", "\\/"}, + {"=", "\\="} + }; + + public static string Encode(string input) { + var builder = new StringBuilder(input); + foreach (var escapePair in _escapeSequences) { + builder.Replace(escapePair.Key, escapePair.Value); + } + + return builder.ToString(); + } + + public static string Decode(string input) { + var builder = new StringBuilder(input); + foreach (var escapePair in _escapeSequences) { + builder.Replace(escapePair.Value, escapePair.Key); + } + + return builder.ToString(); + } + } +} \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index 8915905..4eefd64 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -280,25 +280,13 @@ namespace ConformalDecals.Text { RenderTexture.ReleaseTemporary(renderTex); // CLEAR SUBMESHES + _tmp.text = ""; + for (int i = 0; i < transform.childCount; i++) { var child = transform.GetChild(i); - var renderer = child.GetComponent(); - var filter = child.GetComponent(); - if (filter == null || renderer == null) { - Logging.Log("TMP Sub object has no filter or renderer, destroying"); - Destroy(child.gameObject); - } - - if (filter.mesh.vertexCount < 3) { - Logging.Log("TMP Sub object has no mesh, destroying"); - Destroy(child.gameObject); - } - - renderer.enabled = false; + Destroy(child.gameObject); } - _tmp.ClearMesh(true); - return new TextRenderOutput(texture, window); } }