From a61a2b81a19c7af8ee6c8a95c1782ae731f155cc Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Wed, 2 Dec 2020 01:40:46 -0800 Subject: [PATCH] Cleanup refactor --- .../Plugins/ConformalDecals.dll | Bin 86016 -> 86016 bytes .../MaterialPropertyCollection.cs | 22 + .../MaterialTextureProperty.cs | 2 +- .../ConformalDecals/ModuleConformalDecal.cs | 414 +++++++++--------- Source/ConformalDecals/ModuleConformalFlag.cs | 84 ++-- Source/ConformalDecals/ModuleConformalText.cs | 93 ++-- 6 files changed, 329 insertions(+), 286 deletions(-) diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 95daf2b9467022133a3d5342abc7f54dac965fb9..2c9d0fe4ee4e3b88181e2c5f4768bbbd27a120ed 100644 GIT binary patch literal 86016 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 } + public void Load(ConfigNode node) { + // add keyword nodes + foreach (var keywordNode in node.GetNodes("KEYWORD")) { + ParseProperty(keywordNode); + } + + // add texture nodes + foreach (var textureNode in node.GetNodes("TEXTURE")) { + ParseProperty(textureNode); + } + + // add float nodes + foreach (var floatNode in node.GetNodes("FLOAT")) { + ParseProperty(floatNode); + } + + // add color nodes + foreach (var colorNode in node.GetNodes("COLOR")) { + ParseProperty(colorNode); + } + } + public void OnDestroy() { if (_decalMaterial != null) Destroy(_decalMaterial); if (_previewMaterial != null) Destroy(_previewMaterial); diff --git a/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs b/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs index 9a096aa..e7310ab 100644 --- a/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs +++ b/Source/ConformalDecals/MaterialProperties/MaterialTextureProperty.cs @@ -44,7 +44,7 @@ namespace ConformalDecals.MaterialProperties { public float AspectRatio { get { if (_texture == null) return 1; - if (_textureUrl?.Contains("Squad/Flags") == true) return 0.625f; + if (_textureUrl?.Contains("Squad/Flags") == true) return 0.625f; // squad flags are slightly stretched, so unstretch them return MaskedHeight / (float) MaskedWidth; } } diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index 2fb883d..3580f2e 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -119,6 +119,8 @@ namespace ConformalDecals { } } + // EVENTS + /// public override void OnAwake() { base.OnAwake(); @@ -133,116 +135,20 @@ namespace ConformalDecals { /// public override void OnLoad(ConfigNode node) { + // Load try { - // SETUP TRANSFORMS - decalFrontTransform = part.FindModelTransform(decalFront); - if (decalFrontTransform == null) throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); - - decalBackTransform = part.FindModelTransform(decalBack); - if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); - - decalModelTransform = part.FindModelTransform(decalModel); - if (decalModelTransform == null) throw new FormatException($"Could not find decalModel transform: '{decalModel}'."); - - decalProjectorTransform = part.FindModelTransform(decalProjector); - if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); - - decalColliderTransform = part.FindModelTransform(decalCollider); - if (decalColliderTransform == null) throw new FormatException($"Could not find decalCollider transform: '{decalCollider}'."); - - // SETUP BACK MATERIAL - if (updateBackScale) { - var backRenderer = decalBackTransform.GetComponent(); - if (backRenderer == null) { - this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false."); - updateBackScale = false; - } - else { - backMaterial = backRenderer.material; - if (backMaterial == null) { - this.LogError($"Specified decalBack transform {decalBack} has a renderer but no material! Setting updateBackScale to false."); - updateBackScale = false; - } - else { - if (backTextureBaseScale == default) backTextureBaseScale = backMaterial.GetTextureScale(PropertyIDs._MainTex); - } - } - } - - // PARSE MATERIAL PROPERTIES - - // set shader - materialProperties.SetShader(shader); - materialProperties.AddOrGetProperty("DECAL_BASE_NORMAL").value = useBaseNormal; - - // add keyword nodes - foreach (var keywordNode in node.GetNodes("KEYWORD")) { - materialProperties.ParseProperty(keywordNode); - } - - // add texture nodes - foreach (var textureNode in node.GetNodes("TEXTURE")) { - materialProperties.ParseProperty(textureNode); - } - - // add float nodes - foreach (var floatNode in node.GetNodes("FLOAT")) { - materialProperties.ParseProperty(floatNode); - } - - // add color nodes - foreach (var colorNode in node.GetNodes("COLOR")) { - materialProperties.ParseProperty(colorNode); - } - - // handle texture tiling parameters - var tileString = node.GetValue("tile"); - if (!string.IsNullOrEmpty(tileString)) { - var tileValid = ParseExtensions.TryParseRect(tileString, out tileRect); - if (!tileValid) throw new FormatException($"Invalid rect value for tile '{tileString}'"); - } - - if (tileRect.x >= 0) { - materialProperties.UpdateTile(tileRect); - } - else if (tileIndex >= 0) { - materialProperties.UpdateTile(tileIndex, tileSize); - } + LoadDecal(node); } catch (Exception e) { - this.LogException("Exception parsing partmodule", e); + this.LogException("Error loading decal", e); } - UpdateMaterials(); - - foreach (var keyword in _decalMaterial.shaderKeywords) { - this.Log($"keyword: {keyword}"); + // Setup + try { + SetupDecal(); } - - if (HighLogic.LoadedSceneIsEditor) { - UpdateTweakables(); - UpdateTextures(); - UpdateScale(); - UpdateTargets(); - } - else if (HighLogic.LoadedSceneIsFlight) { - UpdateTextures(); - UpdateScale(); - UpdateTargets(); - //TODO: Target loading - } - else { - scale = defaultScale; - depth = defaultDepth; - opacity = defaultOpacity; - cutoff = defaultCutoff; - wear = defaultWear; - - UpdateTextures(); - UpdateScale(); - - // QUEUE PART FOR ICON FIXING IN VAB - DecalIconFixer.QueuePart(part.name); + catch (Exception e) { + this.LogException("Error setting up decal", e); } } @@ -267,6 +173,8 @@ namespace ConformalDecals { } } + /// Called after OnStart is finished for all parts + /// This is mostly used to make sure all B9 variants are already in place for the rest of the vessel public override void OnStartFinished(StartState state) { // handle game events if (HighLogic.LoadedSceneIsGame) { @@ -295,6 +203,7 @@ namespace ConformalDecals { } } + /// Called when the decal is destroyed public virtual void OnDestroy() { // remove GameEvents if (HighLogic.LoadedSceneIsEditor) { @@ -313,6 +222,7 @@ namespace ConformalDecals { Destroy(materialProperties); } + /// Called when the decal's projection and scale is modified through a tweakable protected void OnProjectionTweakEvent(BaseField field, object obj) { // scale or depth values have been changed, so update scale // and update projection matrices if attached @@ -326,6 +236,7 @@ namespace ConformalDecals { } } + /// Called when the decal's material is modified through a tweakable protected void OnMaterialTweakEvent(BaseField field, object obj) { materialProperties.SetOpacity(opacity); materialProperties.SetCutoff(cutoff); @@ -343,6 +254,7 @@ namespace ConformalDecals { } } + /// Called when a new variant is applied in the editor protected void OnVariantApplied(Part eventPart, PartVariant variant) { if (_isAttached && eventPart != null) { if (projectMultiple && eventPart != part.parent) return; @@ -352,6 +264,7 @@ namespace ConformalDecals { } } + /// Called when an editor event occurs protected void OnEditorEvent(ConstructionEventType eventType, Part eventPart) { if (this.part != eventPart && !part.symmetryCounterparts.Contains(eventPart)) return; switch (eventType) { @@ -369,6 +282,7 @@ namespace ConformalDecals { } } + /// Called when part `willDie` will be destroyed protected void OnPartWillDie(Part willDie) { if (willDie == part.parent) { this.Log("Parent part about to be destroyed! Killing decal part."); @@ -376,6 +290,7 @@ namespace ConformalDecals { } } + /// Called when decal is attached to a new part protected virtual void OnAttach() { if (part.parent == null) { this.LogError("Attach function called but part has no parent!"); @@ -399,6 +314,7 @@ namespace ConformalDecals { UpdateTargets(); } + /// Called when decal is detached from its parent part protected virtual void OnDetach() { _isAttached = false; @@ -415,117 +331,91 @@ namespace ConformalDecals { UpdateScale(); } - protected void UpdateScale() { + // FUNCTIONS + + /// Load any settings from the decal config + protected virtual void LoadDecal(ConfigNode node) { + // PARSE TRANSFORMS + decalFrontTransform = part.FindModelTransform(decalFront); + if (decalFrontTransform == null) throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); - // Update scale and depth - scale = Mathf.Max(0.01f, scale); - depth = Mathf.Max(0.01f, depth); - var aspectRatio = Mathf.Max(0.01f, materialProperties.AspectRatio); - Vector2 size; + decalBackTransform = part.FindModelTransform(decalBack); + if (decalBackTransform == null) throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); - switch (scaleMode) { - default: - case DecalScaleMode.HEIGHT: - size = new Vector2(scale / aspectRatio, scale); - break; - case DecalScaleMode.WIDTH: - size = new Vector2(scale, scale * aspectRatio); - break; - case DecalScaleMode.AVERAGE: - var width1 = 2 * scale / (1 + aspectRatio); - size = new Vector2(width1, width1 * aspectRatio); - break; - case DecalScaleMode.AREA: - var width2 = Mathf.Sqrt(scale / aspectRatio); - size = new Vector2(width2, width2 * aspectRatio); - break; - case DecalScaleMode.MINIMUM: - if (aspectRatio > 1) goto case DecalScaleMode.WIDTH; - else goto case DecalScaleMode.HEIGHT; - case DecalScaleMode.MAXIMUM: - if (aspectRatio > 1) goto case DecalScaleMode.HEIGHT; - else goto case DecalScaleMode.WIDTH; - } + decalModelTransform = part.FindModelTransform(decalModel); + if (decalModelTransform == null) throw new FormatException($"Could not find decalModel transform: '{decalModel}'."); - // update material scale - materialProperties.UpdateScale(size); + decalProjectorTransform = part.FindModelTransform(decalProjector); + if (decalProjectorTransform == null) throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); - if (_isAttached) { - // Update projection targets - if (_targets == null) { - _targets = new List(); + decalColliderTransform = part.FindModelTransform(decalCollider); + if (decalColliderTransform == null) throw new FormatException($"Could not find decalCollider transform: '{decalCollider}'."); + + // SETUP BACK MATERIAL + if (updateBackScale) { + var backRenderer = decalBackTransform.GetComponent(); + if (backRenderer == null) { + this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false."); + updateBackScale = false; } else { - _targets.Clear(); - } - - // update orthogonal matrix - _orthoMatrix = Matrix4x4.identity; - _orthoMatrix[0, 3] = 0.5f; - _orthoMatrix[1, 3] = 0.5f; - - decalProjectorTransform.localScale = new Vector3(size.x, size.y, depth); - } - else { - // rescale preview model - decalModelTransform.localScale = new Vector3(size.x, size.y, (size.x + size.y) / 2); - - // update back material scale - if (updateBackScale) { - backMaterial.SetTextureScale(PropertyIDs._MainTex, new Vector2(size.x * backTextureBaseScale.x, size.y * backTextureBaseScale.y)); - } - } - } - - protected void UpdateTargets() { - if (!_isAttached) return; - - IEnumerable targetParts; - if (projectMultiple) { - targetParts = HighLogic.LoadedSceneIsFlight ? part.vessel.parts : EditorLogic.fetch.ship.parts; - } - else { - targetParts = new[] {part.parent}; - } - - foreach (var targetPart in targetParts) { - if (targetPart.GetComponent() != null) continue; // skip other decals - - foreach (var renderer in targetPart.FindModelComponents()) { - var target = renderer.transform; - var filter = target.GetComponent(); - - // check if the target has any missing data - if (!ProjectionTarget.ValidateTarget(target, renderer, filter)) continue; - - // check bounds for intersection - if (_boundsRenderer.bounds.Intersects(renderer.bounds)) { - // create new ProjectionTarget to represent the renderer - var projectionTarget = new ProjectionTarget(targetPart, target, renderer, filter, _orthoMatrix, decalProjectorTransform, useBaseNormal); - - // add the target to the list - _targets.Add(projectionTarget); + backMaterial = backRenderer.material; + if (backMaterial == null) { + this.LogError($"Specified decalBack transform {decalBack} has a renderer but no material! Setting updateBackScale to false."); + updateBackScale = false; + } + else { + if (backTextureBaseScale == default) backTextureBaseScale = backMaterial.GetTextureScale(PropertyIDs._MainTex); } } } - } - protected virtual void UpdateTextures() { } + // PARSE MATERIAL PROPERTIES + // set shader + materialProperties.SetShader(shader); + materialProperties.AddOrGetProperty("DECAL_BASE_NORMAL").value = useBaseNormal; + materialProperties.Load(node); - protected virtual void UpdateMaterials() { - materialProperties.UpdateMaterials(); - materialProperties.SetOpacity(opacity); - materialProperties.SetCutoff(cutoff); - if (useBaseNormal) { - materialProperties.SetWear(wear); + // handle texture tiling parameters + var tileString = node.GetValue("tile"); + if (!string.IsNullOrEmpty(tileString)) { + var tileValid = ParseExtensions.TryParseRect(tileString, out tileRect); + if (!tileValid) throw new FormatException($"Invalid rect value for tile '{tileString}'"); } - _decalMaterial = materialProperties.DecalMaterial; - _previewMaterial = materialProperties.PreviewMaterial; - - if (!_isAttached) decalFrontTransform.GetComponent().material = _previewMaterial; + if (tileRect.x >= 0) { + materialProperties.UpdateTile(tileRect); + } + else if (tileIndex >= 0) { + materialProperties.UpdateTile(tileIndex, tileSize); + } } + /// Setup decal by calling update functions relevent for the current situation + protected virtual void SetupDecal() { + if (HighLogic.LoadedSceneIsEditor) { + // Update tweakables in editor mode + UpdateTweakables(); + } + + if (HighLogic.LoadedSceneIsGame) { + UpdateAll(); + } + else { + scale = defaultScale; + depth = defaultDepth; + opacity = defaultOpacity; + cutoff = defaultCutoff; + wear = defaultWear; + + UpdateAll(); + + // QUEUE PART FOR ICON FIXING IN VAB + DecalIconFixer.QueuePart(part.name); + } + } + + /// Update decal editor tweakables protected virtual void UpdateTweakables() { // setup tweakable fields var scaleField = Fields[nameof(scale)]; @@ -604,6 +494,130 @@ namespace ConformalDecals { multiprojectEditor.onFieldChanged = OnProjectionTweakEvent; } + /// Updates textures, materials, scale and targets + protected virtual void UpdateAll() { + UpdateTextures(); + UpdateMaterials(); + UpdateScale(); + UpdateTargets(); + } + + /// Update decal textures + protected virtual void UpdateTextures() { } + + /// Update decal materials + protected virtual void UpdateMaterials() { + materialProperties.UpdateMaterials(); + materialProperties.SetOpacity(opacity); + materialProperties.SetCutoff(cutoff); + if (useBaseNormal) { + materialProperties.SetWear(wear); + } + + _decalMaterial = materialProperties.DecalMaterial; + _previewMaterial = materialProperties.PreviewMaterial; + + if (!_isAttached) decalFrontTransform.GetComponent().material = _previewMaterial; + } + + /// Update decal scale and projection + protected void UpdateScale() { + + // Update scale and depth + scale = Mathf.Max(0.01f, scale); + depth = Mathf.Max(0.01f, depth); + var aspectRatio = Mathf.Max(0.01f, materialProperties.AspectRatio); + Vector2 size; + + switch (scaleMode) { + default: + case DecalScaleMode.HEIGHT: + size = new Vector2(scale / aspectRatio, scale); + break; + case DecalScaleMode.WIDTH: + size = new Vector2(scale, scale * aspectRatio); + break; + case DecalScaleMode.AVERAGE: + var width1 = 2 * scale / (1 + aspectRatio); + size = new Vector2(width1, width1 * aspectRatio); + break; + case DecalScaleMode.AREA: + var width2 = Mathf.Sqrt(scale / aspectRatio); + size = new Vector2(width2, width2 * aspectRatio); + break; + case DecalScaleMode.MINIMUM: + if (aspectRatio > 1) goto case DecalScaleMode.WIDTH; + else goto case DecalScaleMode.HEIGHT; + case DecalScaleMode.MAXIMUM: + if (aspectRatio > 1) goto case DecalScaleMode.HEIGHT; + else goto case DecalScaleMode.WIDTH; + } + + // update material scale + materialProperties.UpdateScale(size); + + if (_isAttached) { + // Update projection targets + if (_targets == null) { + _targets = new List(); + } + else { + _targets.Clear(); + } + + // update orthogonal matrix + _orthoMatrix = Matrix4x4.identity; + _orthoMatrix[0, 3] = 0.5f; + _orthoMatrix[1, 3] = 0.5f; + + decalProjectorTransform.localScale = new Vector3(size.x, size.y, depth); + } + else { + // rescale preview model + decalModelTransform.localScale = new Vector3(size.x, size.y, (size.x + size.y) / 2); + + // update back material scale + if (updateBackScale) { + backMaterial.SetTextureScale(PropertyIDs._MainTex, new Vector2(size.x * backTextureBaseScale.x, size.y * backTextureBaseScale.y)); + } + } + } + + /// Called when updating decal targets + protected void UpdateTargets() { + if (!_isAttached) return; + + IEnumerable targetParts; + if (projectMultiple) { + targetParts = HighLogic.LoadedSceneIsFlight ? part.vessel.parts : EditorLogic.fetch.ship.parts; + } + else { + targetParts = new[] {part.parent}; + } + + foreach (var targetPart in targetParts) { + if (targetPart.GetComponent() != null) continue; // skip other decals + + foreach (var renderer in targetPart.FindModelComponents()) { + var target = renderer.transform; + var filter = target.GetComponent(); + + // check if the target has any missing data + if (!ProjectionTarget.ValidateTarget(target, renderer, filter)) continue; + + // check bounds for intersection + if (_boundsRenderer.bounds.Intersects(renderer.bounds)) { + // create new ProjectionTarget to represent the renderer + var projectionTarget = new ProjectionTarget(targetPart, target, renderer, filter, _orthoMatrix, decalProjectorTransform, useBaseNormal); + + // add the target to the list + _targets.Add(projectionTarget); + } + } + } + } + + /// Render the decal public void Render(Camera camera) { if (!_isAttached) return; diff --git a/Source/ConformalDecals/ModuleConformalFlag.cs b/Source/ConformalDecals/ModuleConformalFlag.cs index cc11d07..a537916 100644 --- a/Source/ConformalDecals/ModuleConformalFlag.cs +++ b/Source/ConformalDecals/ModuleConformalFlag.cs @@ -1,4 +1,6 @@ +using ConformalDecals.MaterialProperties; using ConformalDecals.Util; +using UniLinq; using UnityEngine; namespace ConformalDecals { @@ -9,6 +11,8 @@ namespace ConformalDecals { [KSPField(isPersistant = true)] public bool useCustomFlag; + private MaterialTextureProperty _flagTextureProperty; + public string MissionFlagUrl { get { if (HighLogic.LoadedSceneIsEditor) { @@ -23,15 +27,10 @@ namespace ConformalDecals { } } - public override void OnLoad(ConfigNode node) { - base.OnLoad(node); + protected override void SetupDecal() { + _flagTextureProperty = materialProperties.AddOrGetTextureProperty("_Decal"); - if (useCustomFlag) { - SetFlag(flagUrl); - } - else { - SetFlag(MissionFlagUrl); - } + base.SetupDecal(); } public override void OnStart(StartState state) { @@ -44,17 +43,10 @@ namespace ConformalDecals { if (HighLogic.LoadedSceneIsEditor) { Events[nameof(ResetFlag)].guiActiveEditor = useCustomFlag; } - - if (useCustomFlag) { - SetFlag(flagUrl); - } - else { - SetFlag(MissionFlagUrl); - } } public override void OnDestroy() { - GameEvents.onMissionFlagSelect.Remove(SetFlag); + GameEvents.onMissionFlagSelect.Remove(OnEditorFlagSelected); base.OnDestroy(); } @@ -66,45 +58,43 @@ namespace ConformalDecals { [KSPEvent(guiActive = false, guiActiveEditor = true, guiName = "#LOC_ConformalDecals_gui-reset-flag")] public void ResetFlag() { - SetFlag(MissionFlagUrl); - SetFlagSymmetryCounterparts(MissionFlagUrl); - - useCustomFlag = false; Events[nameof(ResetFlag)].guiActiveEditor = false; - } - - private void OnCustomFlagSelected(FlagBrowser.FlagEntry newFlagEntry) { - SetFlag(newFlagEntry.textureInfo.name); - SetFlagSymmetryCounterparts(newFlagEntry.textureInfo.name); - - useCustomFlag = true; - Events[nameof(ResetFlag)].guiActiveEditor = true; - } - - private void OnEditorFlagSelected(string newFlagUrl) { - if (!useCustomFlag) { - SetFlag(newFlagUrl); - SetFlagSymmetryCounterparts(newFlagUrl); + flagUrl = MissionFlagUrl; + useCustomFlag = false; + UpdateAll(); + foreach (var decal in part.symmetryCounterparts.Select(o => o.GetComponent())) { + decal.Events[nameof(ResetFlag)].guiActiveEditor = false; + decal.flagUrl = flagUrl; + decal.useCustomFlag = false; + decal.UpdateAll(); } } - private void SetFlag(string newFlagUrl) { - this.Log($"Loading flag texture '{newFlagUrl}'."); + private void OnCustomFlagSelected(FlagBrowser.FlagEntry newFlagEntry) { + Events[nameof(ResetFlag)].guiActiveEditor = true; + flagUrl = newFlagEntry.textureInfo.name; + useCustomFlag = true; + UpdateAll(); - flagUrl = newFlagUrl; - materialProperties.AddOrGetTextureProperty("_Decal", true).TextureUrl = newFlagUrl; - - UpdateMaterials(); - UpdateScale(); - UpdateTargets(); + foreach (var decal in part.symmetryCounterparts.Select(o => o.GetComponent())) { + decal.Events[nameof(ResetFlag)].guiActiveEditor = true; + decal.flagUrl = flagUrl; + decal.useCustomFlag = true; + decal.UpdateAll(); + } } - private void SetFlagSymmetryCounterparts(string newFlagUrl) { - foreach (var counterpart in part.symmetryCounterparts) { - var decal = counterpart.GetComponent(); + private void OnEditorFlagSelected(string newFlagUrl) { + if (!useCustomFlag) UpdateAll(); + } - decal.SetFlag(newFlagUrl); - decal.useCustomFlag = useCustomFlag; + protected override void UpdateTextures() { + base.UpdateTextures(); + if (useCustomFlag) { + _flagTextureProperty.TextureUrl = flagUrl; + } + else { + _flagTextureProperty.TextureUrl = MissionFlagUrl; } } } diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index 0b6145b..608fb58 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -90,43 +90,9 @@ namespace ConformalDecals { private MaterialColorProperty _outlineColorProperty; private MaterialFloatProperty _outlineWidthProperty; - private DecalText _currentText; + private DecalText _currentText; - public override void OnLoad(ConfigNode node) { - base.OnLoad(node); - - string textRaw = ""; - if (ParseUtil.ParseStringIndirect(ref textRaw, node, "text")) { - text = WebUtility.UrlDecode(textRaw); - } - - string fontName = ""; - if (ParseUtil.ParseStringIndirect(ref fontName, node, "fontName")) { - font = DecalConfig.GetFont(fontName); - } - else if (font == null) font = DecalConfig.GetFont("Calibri SDF"); - - int styleInt = 0; - if (ParseUtil.ParseIntIndirect(ref styleInt, node, "style")) { - style = (FontStyles) styleInt; - } - - ParseUtil.ParseColor32Indirect(ref fillColor, node, "fillColor"); - ParseUtil.ParseColor32Indirect(ref outlineColor, node, "outlineColor"); - - if (HighLogic.LoadedSceneIsGame) { - // For some reason, rendering doesnt work right on the first frame a scene is loaded - // So delay any rendering until the next frame when called in OnLoad - // This is probably a problem with Unity, not KSP - StartCoroutine(UpdateTextLate()); - } - else { - UpdateTextures(); - UpdateMaterials(); - UpdateScale(); - UpdateTargets(); - } - } + // EVENTS public override void OnSave(ConfigNode node) { node.AddValue("text", WebUtility.UrlEncode(text)); @@ -254,18 +220,69 @@ namespace ConformalDecals { base.OnDetach(); } + // FUNCTIONS + + protected override void LoadDecal(ConfigNode node) { + base.LoadDecal(node); + + string textRaw = ""; + if (ParseUtil.ParseStringIndirect(ref textRaw, node, "text")) { + text = WebUtility.UrlDecode(textRaw); + } + + string fontName = ""; + if (ParseUtil.ParseStringIndirect(ref fontName, node, "fontName")) { + font = DecalConfig.GetFont(fontName); + } + else if (font == null) font = DecalConfig.GetFont("Calibri SDF"); + + int styleInt = 0; + if (ParseUtil.ParseIntIndirect(ref styleInt, node, "style")) { + style = (FontStyles) styleInt; + } + + ParseUtil.ParseColor32Indirect(ref fillColor, node, "fillColor"); + ParseUtil.ParseColor32Indirect(ref outlineColor, node, "outlineColor"); + } + + protected override void SetupDecal() { + if (HighLogic.LoadedSceneIsEditor) { + // Update tweakables in editor mode + UpdateTweakables(); + } + + if (HighLogic.LoadedSceneIsGame) { + // For some reason text rendering fails on the first frame of a scene, so this is my workaround + StartCoroutine(UpdateTextLate()); + } + else { + scale = defaultScale; + depth = defaultDepth; + opacity = defaultOpacity; + cutoff = defaultCutoff; + wear = defaultWear; + + UpdateTextures(); + UpdateMaterials(); + UpdateScale(); + + // QUEUE PART FOR ICON FIXING IN VAB + DecalIconFixer.QueuePart(part.name); + } + } + protected void UpdateText() { UpdateTextures(); UpdateMaterials(); UpdateScale(); UpdateTargets(); } - + private IEnumerator UpdateTextLate() { yield return null; UpdateText(); } - + protected override void UpdateTextures() { // Render text var newText = new DecalText(text, font, style, vertical, lineSpacing, charSpacing);