From 5feb16dcfb83d281ac539108b27089bd12972902 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Fri, 18 Dec 2020 21:14:34 -0800 Subject: [PATCH] Only update text once per frame Fixed text re-rendering several times in a single frame when pasting in text --- .../Plugins/ConformalDecals.dll | Bin 82432 -> 82432 bytes .../ConformalDecals/Text/TextRenderOutput.cs | 2 +- .../ConformalDecals/UI/TextEntryController.cs | 44 +++++++++--------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index a3b191fd2a8641bb7bc1b1f3b32d95fe230b7534..9c632579cffea1cdeae81877f563bb56c52af25f 100644 GIT binary patch delta 22780 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 ZlBG5 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 diff --git a/Source/ConformalDecals/Text/TextRenderOutput.cs b/Source/ConformalDecals/Text/TextRenderOutput.cs index 210e14a..8dff52f 100644 --- a/Source/ConformalDecals/Text/TextRenderOutput.cs +++ b/Source/ConformalDecals/Text/TextRenderOutput.cs @@ -9,7 +9,7 @@ namespace ConformalDecals.Text { /// The rectangle that the rendered text takes up within the texture public Rect Window { get; private set; } - /// The number of users for this render output. If 0, it can be discarded from the cache and the texture reused + /// The number of users for this render output. If 0, it can be discarded from the cache public int UserCount { get; set; } public TextRenderOutput(Texture2D texture, Rect window) { diff --git a/Source/ConformalDecals/UI/TextEntryController.cs b/Source/ConformalDecals/UI/TextEntryController.cs index 8a783b0..d763217 100644 --- a/Source/ConformalDecals/UI/TextEntryController.cs +++ b/Source/ConformalDecals/UI/TextEntryController.cs @@ -3,7 +3,6 @@ using ConformalDecals.Text; using ConformalDecals.Util; using TMPro; using UnityEngine; -using UnityEngine.Events; using UnityEngine.UI; namespace ConformalDecals.UI { @@ -35,14 +34,15 @@ namespace ConformalDecals.UI { private Vector2 _lineSpacingRange; private Vector2 _charSpacingRange; private TMP_InputField _textBoxTMP; + private FontMenuController _fontMenu; private TextUpdateDelegate _onValueChanged; - private FontMenuController _fontMenu; + private static int _lockCounter; - private bool _ignoreUpdates; private bool _isLocked; private string _lockString; - private static int _lockCounter; + private bool _ignoreUpdates; + private bool _textUpdated; public static TextEntryController Create( string text, DecalFont font, FontStyles style, bool vertical, float linespacing, float charspacing, @@ -74,7 +74,7 @@ namespace ConformalDecals.UI { public void SetControlLock(string value = null) { if (_isLocked) return; - InputLockManager.SetControlLock(_lockString); + InputLockManager.SetControlLock(ControlTypes.EDITOR_UI, _lockString); _isLocked = true; } @@ -86,8 +86,7 @@ namespace ConformalDecals.UI { public void OnTextUpdate(string newText) { this._text = newText; - - OnValueChanged(); + _textUpdated = true; } public void OnFontMenu() { @@ -105,7 +104,7 @@ namespace ConformalDecals.UI { _textBoxTMP.fontAsset = _font.FontAsset; UpdateStyleButtons(); - OnValueChanged(); + _textUpdated = true; } public void OnLineSpacingUpdate(float value) { @@ -114,7 +113,7 @@ namespace ConformalDecals.UI { _lineSpacing = Mathf.Lerp(_lineSpacingRange.x, _lineSpacingRange.y, value); UpdateLineSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnLineSpacingUpdate(string text) { @@ -128,7 +127,7 @@ namespace ConformalDecals.UI { } UpdateLineSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnCharSpacingUpdate(float value) { @@ -137,7 +136,7 @@ namespace ConformalDecals.UI { _charSpacing = Mathf.Lerp(_charSpacingRange.x, _charSpacingRange.y, value); UpdateCharSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnCharSpacingUpdate(string text) { @@ -151,7 +150,7 @@ namespace ConformalDecals.UI { } UpdateCharSpacing(); - OnValueChanged(); + _textUpdated = true; } public void OnBoldUpdate(bool state) { @@ -163,7 +162,7 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.Bold; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnItalicUpdate(bool state) { @@ -175,7 +174,7 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.Italic; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnUnderlineUpdate(bool state) { @@ -187,7 +186,7 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.Underline; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnSmallCapsUpdate(bool state) { @@ -199,19 +198,19 @@ namespace ConformalDecals.UI { _style &= ~FontStyles.SmallCaps; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; - OnValueChanged(); + _textUpdated = true; } public void OnVerticalUpdate(bool state) { if (_ignoreUpdates) return; _vertical = state; - OnValueChanged(); + _textUpdated = true; } private void Start() { _lockString = $"ConformalDecals_TextEditor_{_lockCounter++}"; - + _textBoxTMP = ((TMP_InputField) _textBox); _textBoxTMP.text = _text; _textBoxTMP.textComponent.fontStyle = _style | _font.FontStyle & ~_font.FontStyleMask; @@ -229,9 +228,12 @@ namespace ConformalDecals.UI { private void OnDestroy() { RemoveControlLock(); } - - private void OnValueChanged() { - _onValueChanged(_text, _font, _style, _vertical, _lineSpacing, _charSpacing); + + private void LateUpdate() { + if (_textUpdated) { + _onValueChanged(_text, _font, _style, _vertical, _lineSpacing, _charSpacing); + _textUpdated = false; + } } private void UpdateStyleButtons() {