From ae351c021f81e535ded6cc49d44da4a5b59d659b Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Mon, 17 Aug 2020 13:50:36 -0700 Subject: [PATCH] Fix text rendering again, but break bold text again --- .../Plugins/ConformalDecals.dll | Bin 85504 -> 86016 bytes Source/ConformalDecals/ModuleConformalText.cs | 46 ++++------ Source/ConformalDecals/Text/DecalText.cs | 1 + .../ConformalDecals/Text/TextRenderOutput.cs | 5 +- Source/ConformalDecals/Text/TextRenderer.cs | 85 +++++++++++++----- 5 files changed, 82 insertions(+), 55 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index b9bb823b808a5c94d1d90514a28c411ddcd2121b..11ba28272c3c4bf5dd86a599bd459a8d86dc495d 100644 GIT binary patch delta 39962 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 I+3m_lOEEf6dLUfVnAh73=(HKiYRj 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 PIXUW`L!Z&kO#6QUORRC( delta 39327 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 F{1*r=A?*MF diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index 32733bd..b389311 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -78,7 +78,7 @@ namespace ConformalDecals { private ColorPickerController _outlineColorPickerController; private MaterialTextureProperty _decalTextureProperty; - private MaterialFloatProperty _decalTextWeightProperty; + private MaterialFloatProperty _decalTextWeightProperty; private MaterialKeywordProperty _fillEnabledProperty; private MaterialColorProperty _fillColorProperty; @@ -93,7 +93,7 @@ namespace ConformalDecals { public override void OnLoad(ConfigNode node) { base.OnLoad(node); OnAfterDeserialize(); - + UpdateTextRecursive(); } @@ -104,13 +104,13 @@ namespace ConformalDecals { public override void OnStart(StartState state) { base.OnStart(state); - + UpdateTextRecursive(); } public override void OnAwake() { base.OnAwake(); - + _decalTextureProperty = materialProperties.AddOrGetTextureProperty("_Decal", true); _decalTextWeightProperty = materialProperties.AddOrGetProperty("_Weight"); @@ -121,7 +121,7 @@ namespace ConformalDecals { _outlineColorProperty = materialProperties.AddOrGetProperty("_OutlineColor"); _outlineWidthProperty = materialProperties.AddOrGetProperty("_OutlineWidth"); } - + public void OnTextUpdate(string newText, DecalFont newFont, DecalTextStyle newStyle) { text = newText; _font = newFont; @@ -152,30 +152,28 @@ namespace ConformalDecals { } public void OnFillToggle(BaseField field, object obj) { - if (!fillEnabled && !outlineEnabled) { - outlineEnabled = true; - OnOutlineToggle(field, obj); - } + // fill and outline cant both be disabled + outlineEnabled = outlineEnabled || (!outlineEnabled && !fillEnabled); UpdateTweakables(); foreach (var counterpart in part.symmetryCounterparts) { var decal = counterpart.GetComponent(); decal.fillEnabled = fillEnabled; + decal.outlineEnabled = outlineEnabled; decal.UpdateTweakables(); } } public void OnOutlineToggle(BaseField field, object obj) { - if (!fillEnabled && !outlineEnabled) { - fillEnabled = true; - OnFillToggle(field, obj); - } + // fill and outline cant both be disabled + fillEnabled = fillEnabled || (!fillEnabled && !outlineEnabled); UpdateTweakables(); foreach (var counterpart in part.symmetryCounterparts) { var decal = counterpart.GetComponent(); + decal.fillEnabled = fillEnabled; decal.outlineEnabled = outlineEnabled; decal.UpdateTweakables(); } @@ -206,7 +204,7 @@ namespace ConformalDecals { public override void OnDestroy() { if (_currentText != null) TextRenderer.UnregisterText(_currentText); - + base.OnDestroy(); } @@ -215,7 +213,7 @@ namespace ConformalDecals { if (_textEntryController != null) _textEntryController.OnClose(); if (_fillColorPickerController != null) _fillColorPickerController.OnClose(); if (_outlineColorPickerController != null) _outlineColorPickerController.OnClose(); - + base.OnDetach(); } @@ -251,8 +249,7 @@ namespace ConformalDecals { public void UpdateTexture(TextRenderOutput output) { _decalTextureProperty.Texture = output.Texture; _decalTextureProperty.SetTile(output.Window); - _decalTextWeightProperty.value = output.Weight; - + UpdateMaterials(); UpdateScale(); } @@ -269,22 +266,17 @@ namespace ConformalDecals { } protected override void UpdateTweakables() { - Debug.Log($"Fields is null: {Fields == null}"); - Debug.Log($"Actions is null: {Actions == null}"); var fillEnabledField = Fields[nameof(fillEnabled)]; - var fillColorAction = Actions["SetFillColor"]; + var fillColorEvent = Events["SetFillColor"]; var outlineEnabledField = Fields[nameof(outlineEnabled)]; var outlineWidthField = Fields[nameof(outlineWidth)]; - var outlineColorAction = Actions["SetOutlineColor"]; - - Debug.Log($"outlineColorAction is null: {outlineColorAction == null}"); + var outlineColorEvent = Events["SetOutlineColor"]; - // fillColorAction.activeEditor = fillEnabled; - // outlineWidthField.guiActiveEditor = outlineEnabled; - // outlineColorAction.activeEditor = outlineEnabled; + fillColorEvent.guiActiveEditor = fillEnabled; + outlineWidthField.guiActiveEditor = outlineEnabled; + outlineColorEvent.guiActiveEditor = outlineEnabled; - Debug.Log("Fart"); ((UI_Toggle) fillEnabledField.uiControlEditor).onFieldChanged = OnFillToggle; ((UI_Toggle) outlineEnabledField.uiControlEditor).onFieldChanged = OnOutlineToggle; ((UI_FloatRange) outlineWidthField.uiControlEditor).onFieldChanged = OnOutlineWidthUpdate; diff --git a/Source/ConformalDecals/Text/DecalText.cs b/Source/ConformalDecals/Text/DecalText.cs index 1993b99..07ff603 100644 --- a/Source/ConformalDecals/Text/DecalText.cs +++ b/Source/ConformalDecals/Text/DecalText.cs @@ -21,6 +21,7 @@ namespace ConformalDecals.Text { } public DecalText(string text, DecalFont font, DecalTextStyle style) { + if (font == null) throw new ArgumentNullException(nameof(font)); Text = text; Font = font; Style = style; diff --git a/Source/ConformalDecals/Text/TextRenderOutput.cs b/Source/ConformalDecals/Text/TextRenderOutput.cs index b3b5f27..035bda5 100644 --- a/Source/ConformalDecals/Text/TextRenderOutput.cs +++ b/Source/ConformalDecals/Text/TextRenderOutput.cs @@ -6,14 +6,11 @@ namespace ConformalDecals.Text { public Rect Window { get; private set; } - public float Weight { get; private set; } - public int UserCount { get; set; } - public TextRenderOutput(Texture2D texture, Rect window, float weight) { + public TextRenderOutput(Texture2D texture, Rect window) { Texture = texture; Window = window; - Weight = weight; } } } \ No newline at end of file diff --git a/Source/ConformalDecals/Text/TextRenderer.cs b/Source/ConformalDecals/Text/TextRenderer.cs index 01c008d..669db76 100644 --- a/Source/ConformalDecals/Text/TextRenderer.cs +++ b/Source/ConformalDecals/Text/TextRenderer.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Collections.Generic; using TMPro; using UnityEngine; @@ -32,7 +33,7 @@ namespace ConformalDecals.Text { private bool _isSetup; private TextMeshPro _tmp; - private Material _blitMaterial; + private Shader _blitShader; private static readonly Dictionary RenderCache = new Dictionary(); private static readonly Queue RenderJobs = new Queue(); @@ -44,10 +45,10 @@ namespace ConformalDecals.Text { RenderJobs.Enqueue(job); return job; } - + public static TextRenderOutput UpdateTextNow(DecalText oldText, DecalText newText) { if (newText == null) throw new ArgumentNullException(nameof(newText)); - + return Instance.RunJob(new TextRenderJob(oldText, newText, null), out _); } @@ -91,7 +92,7 @@ namespace ConformalDecals.Text { var shader = Shabby.Shabby.FindShader(BlitShader); if (shader == null) Debug.LogError($"[ConformalDecals] could not find text blit shader named '{shader}'"); - _blitMaterial = new Material(Shabby.Shabby.FindShader(BlitShader)); + _blitShader = Shabby.Shabby.FindShader(BlitShader); _isSetup = true; } @@ -146,6 +147,11 @@ namespace ConformalDecals.Text { } public TextRenderOutput RenderText(DecalText text, Texture2D texture) { + if (text == null) throw new ArgumentNullException(nameof(text)); + if (_tmp == null) throw new InvalidOperationException("TextMeshPro object not yet created."); + + Debug.Log($"[ConformalDecals] rendering text '{text.Text}' in {text.Font.Name}"); + // SETUP TMP OBJECT FOR RENDERING _tmp.text = text.FormattedText; _tmp.font = text.Font.FontAsset; @@ -157,33 +163,54 @@ namespace ConformalDecals.Text { _tmp.enableKerning = true; _tmp.enableWordWrapping = false; _tmp.overflowMode = TextOverflowModes.Overflow; - _tmp.alignment = TextAlignmentOptions.Center | TextAlignmentOptions.Baseline; + _tmp.alignment = TextAlignmentOptions.Center; _tmp.fontSize = FontSize; - - // CALCULATE FONT WEIGHT - - float weight = 0; - if (text.Style.Bold && text.Font.FontAsset.fontWeights[7].regularTypeface == null) { - weight = text.Font.FontAsset.boldStyle; - } - - // SETUP BLIT MATERIAL - _blitMaterial.SetTexture(PropertyIDs._MainTex, text.Font.FontAsset.atlas); // GENERATE MESH _tmp.ForceMeshUpdate(); - var mesh = _tmp.mesh; - mesh.RecalculateBounds(); - var bounds = mesh.bounds; + + var meshFilters = gameObject.GetComponentsInChildren(); + var meshes = new Mesh[meshFilters.Length]; + var materials = new Material[meshFilters.Length]; + + var bounds = new Bounds(); + + Debug.Log($"meshFilter count: {meshFilters.Length}"); + // SETUP MATERIALS AND BOUNDS + for (int i = 0; i < meshFilters.Length; i++) { + var renderer = meshFilters[i].gameObject.GetComponent(); + + meshes[i] = meshFilters[i].mesh; + meshes[i].RecalculateBounds(); + + materials[i] = Instantiate(renderer.material); + materials[i].shader = _blitShader; + + if (renderer == null) throw new FormatException($"Object {meshFilters[i].gameObject.name} has filter but no renderer"); + if (meshes[i] == null) throw new FormatException($"Object {meshFilters[i].gameObject.name} has a null mesh"); + + if (i == 0) { + bounds = meshes[i].bounds; + } + else { + bounds.Encapsulate(meshes[i].bounds); + } + } // CALCULATE SIZES var size = bounds.size * PixelDensity; - var textureSize = new Vector2Int { x = Mathf.NextPowerOfTwo((int) size.x), y = Mathf.NextPowerOfTwo((int) size.y) }; + if (textureSize.x == 0 || textureSize.y == 0) { + Debug.LogWarning("[ConformalDecals] No text present or error in texture size calculation. Aborting."); + return new TextRenderOutput(Texture2D.blackTexture, Rect.zero); + } + + Debug.Log($"Texture size: {textureSize}"); + // make sure texture isnt too big, scale it down if it is // this is just so you dont crash the game by pasting in the entire script of The Bee Movie if (textureSize.x > MaxTextureSize) { @@ -204,9 +231,8 @@ namespace ConformalDecals.Text { size = size * sizeRatio, center = (Vector2) textureSize / 2 }; - + Debug.Log($"Window size: {window.size}"); - Debug.Log($"Texture size: {textureSize}"); // SETUP TEXTURE if (texture == null) { @@ -230,8 +256,14 @@ namespace ConformalDecals.Text { GL.PushMatrix(); GL.LoadProjectionMatrix(matrix); GL.Clear(false, true, Color.black); - _blitMaterial.SetPass(0); - Graphics.DrawMeshNow(mesh, Matrix4x4.identity); + + for (var i = 0; i < meshes.Length; i++) { + if (meshes[i].vertexCount >= 3) { + materials[i].SetPass(0); + Graphics.DrawMeshNow(meshes[i], Matrix4x4.identity); + } + } + GL.PopMatrix(); // COPY TEXTURE BACK INTO RAM @@ -242,7 +274,12 @@ namespace ConformalDecals.Text { // RELEASE RENDERTEX RenderTexture.ReleaseTemporary(renderTex); - return new TextRenderOutput(texture, window, weight); + // CLEAR SUBMESHES + for (int i = 0; i < transform.childCount; i++) { + Destroy(transform.GetChild(i).gameObject); + } + + return new TextRenderOutput(texture, window); } } } \ No newline at end of file