From d1e4d2ac4f69fef8532b71e91b42222bc50af240 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Tue, 2 Jun 2020 18:26:40 -0700 Subject: [PATCH] Small refactor to reload tweakables on load --- .../ConformalDecals/ModuleConformalDecal.cs | 193 +++++++++--------- 1 file changed, 101 insertions(+), 92 deletions(-) diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index d503306..ac0f3bd 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -85,6 +85,9 @@ namespace ConformalDecals { public override void OnLoad(ConfigNode node) { this.Log("Loading module"); try { + if (HighLogic.LoadedSceneIsEditor) { + UpdateTweakables(); + } if (materialProperties == null) { // materialProperties is null, so make a new one @@ -164,8 +167,8 @@ namespace ConformalDecals { // update EVERYTHING if currently attached if (_isAttached) { - OnDetach(); - OnAttach(); + UpdateScale(); + UpdateTargets(); } } catch (Exception e) { @@ -176,65 +179,18 @@ namespace ConformalDecals { public override void OnStart(StartState state) { this.Log("Starting module"); + if (HighLogic.LoadedSceneIsEditor) { + GameEvents.onEditorPartEvent.Add(OnEditorEvent); + GameEvents.onVariantApplied.Add(OnVariantApplied); + + UpdateTweakables(); + } + // generate orthogonal projection matrix and offset it by 0.5 on x and y axes _orthoMatrix = Matrix4x4.identity; _orthoMatrix[0, 3] = 0.5f; _orthoMatrix[1, 3] = 0.5f; - // setup OnTweakEvent for scale and depth fields in editor - if ((state & StartState.Editor) != 0) { - GameEvents.onEditorPartEvent.Add(OnEditorEvent); - GameEvents.onVariantApplied.Add(OnVariantApplied); - - // setup tweakable fields - var scaleField = Fields[nameof(scale)]; - var depthField = Fields[nameof(depth)]; - var opacityField = Fields[nameof(opacity)]; - var cutoffField = Fields[nameof(cutoff)]; - - scaleField.guiActiveEditor = scaleAdjustable; - depthField.guiActiveEditor = depthAdjustable; - opacityField.guiActiveEditor = opacityAdjustable; - cutoffField.guiActiveEditor = cutoffAdjustable; - - if (scaleAdjustable) { - var minValue = Mathf.Max(Mathf.Epsilon, scaleRange.x); - var maxValue = Mathf.Max(minValue, scaleRange.y); - - ((UI_FloatRange) scaleField.uiControlEditor).minValue = minValue; - ((UI_FloatRange) scaleField.uiControlEditor).maxValue = maxValue; - scaleField.uiControlEditor.onFieldChanged = OnSizeTweakEvent; - } - - if (depthAdjustable) { - var minValue = Mathf.Max(Mathf.Epsilon, depthRange.x); - var maxValue = Mathf.Max(minValue, depthRange.y); - ((UI_FloatRange) depthField.uiControlEditor).minValue = minValue; - ((UI_FloatRange) depthField.uiControlEditor).maxValue = maxValue; - depthField.uiControlEditor.onFieldChanged = OnSizeTweakEvent; - } - - if (opacityAdjustable) { - var minValue = Mathf.Max(0, opacityRange.x); - var maxValue = Mathf.Max(minValue, opacityRange.y); - maxValue = Mathf.Min(1, maxValue); - - ((UI_FloatRange) opacityField.uiControlEditor).minValue = minValue; - ((UI_FloatRange) opacityField.uiControlEditor).maxValue = maxValue; - opacityField.uiControlEditor.onFieldChanged = OnMaterialTweakEvent; - } - - if (cutoffAdjustable) { - var minValue = Mathf.Max(0, cutoffRange.x); - var maxValue = Mathf.Max(minValue, cutoffRange.y); - maxValue = Mathf.Min(1, maxValue); - - ((UI_FloatRange) cutoffField.uiControlEditor).minValue = minValue; - ((UI_FloatRange) cutoffField.uiControlEditor).maxValue = maxValue; - cutoffField.uiControlEditor.onFieldChanged = OnMaterialTweakEvent; - } - } - // instantiate decal material and set uniqueish queue decalMaterial = Material.Instantiate(decalMaterial); decalMaterial.renderQueue = DecalQueue; @@ -287,8 +243,7 @@ namespace ConformalDecals { private void OnVariantApplied(Part eventPart, PartVariant variant) { if (_isAttached && eventPart == part.parent) { - OnDetach(); - OnAttach(); + UpdateTargets(); } } @@ -303,7 +258,6 @@ namespace ConformalDecals { break; case ConstructionEventType.PartOffsetting: case ConstructionEventType.PartRotating: - case ConstructionEventType.PartDragging: UpdateProjection(); break; } @@ -320,39 +274,7 @@ namespace ConformalDecals { this.Log($"Decal attached to {part.parent.partName}"); - if (_targets == null) { - _targets = new List(); - } - else { - _targets.Clear(); - } - - // find all valid renderers - var renderers = part.parent.FindModelComponents(); - foreach (var renderer in renderers) { - // skip disabled renderers - if (renderer.gameObject.activeInHierarchy == false) continue; - - // skip blacklisted shaders - if (ConformalDecalConfig.IsBlacklisted(renderer.material.shader)) { - this.Log($"Skipping blacklisted shader '{renderer.material.shader.name}' in '{renderer.gameObject.name}'"); - continue; - } - - var meshFilter = renderer.GetComponent(); - if (meshFilter == null) continue; // object has a meshRenderer with no filter, invalid - var mesh = meshFilter.mesh; - if (mesh == null) continue; // object has a null mesh, invalid - - this.Log($"Adding target for object {meshFilter.gameObject.name} with the mesh {mesh.name}"); - // create new ProjectionTarget to represent the renderer - var target = new ProjectionTarget(renderer, mesh, useBaseNormal); - - this.Log("done."); - - // add the target to the list - _targets.Add(target); - } + UpdateTargets(); // hide preview model decalFrontTransform.gameObject.SetActive(false); @@ -411,6 +333,92 @@ namespace ConformalDecals { } } + private void UpdateTargets() { + if (_targets == null) { + _targets = new List(); + } + else { + _targets.Clear(); + } + + // find all valid renderers + var renderers = part.parent.FindModelComponents(); + foreach (var renderer in renderers) { + // skip disabled renderers + if (renderer.gameObject.activeInHierarchy == false) continue; + + // skip blacklisted shaders + if (ConformalDecalConfig.IsBlacklisted(renderer.material.shader)) { + this.Log($"Skipping blacklisted shader '{renderer.material.shader.name}' in '{renderer.gameObject.name}'"); + continue; + } + + var meshFilter = renderer.GetComponent(); + if (meshFilter == null) continue; // object has a meshRenderer with no filter, invalid + var mesh = meshFilter.mesh; + if (mesh == null) continue; // object has a null mesh, invalid + + this.Log($"Adding target for object {meshFilter.gameObject.name} with the mesh {mesh.name}"); + // create new ProjectionTarget to represent the renderer + var target = new ProjectionTarget(renderer, mesh, useBaseNormal); + + this.Log("done."); + + // add the target to the list + _targets.Add(target); + } + } + + private void UpdateTweakables() { + // setup tweakable fields + var scaleField = Fields[nameof(scale)]; + var depthField = Fields[nameof(depth)]; + var opacityField = Fields[nameof(opacity)]; + var cutoffField = Fields[nameof(cutoff)]; + + scaleField.guiActiveEditor = scaleAdjustable; + depthField.guiActiveEditor = depthAdjustable; + opacityField.guiActiveEditor = opacityAdjustable; + cutoffField.guiActiveEditor = cutoffAdjustable; + + if (scaleAdjustable) { + var minValue = Mathf.Max(Mathf.Epsilon, scaleRange.x); + var maxValue = Mathf.Max(minValue, scaleRange.y); + + ((UI_FloatRange) scaleField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) scaleField.uiControlEditor).maxValue = maxValue; + scaleField.uiControlEditor.onFieldChanged = OnSizeTweakEvent; + } + + if (depthAdjustable) { + var minValue = Mathf.Max(Mathf.Epsilon, depthRange.x); + var maxValue = Mathf.Max(minValue, depthRange.y); + ((UI_FloatRange) depthField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) depthField.uiControlEditor).maxValue = maxValue; + depthField.uiControlEditor.onFieldChanged = OnSizeTweakEvent; + } + + if (opacityAdjustable) { + var minValue = Mathf.Max(0, opacityRange.x); + var maxValue = Mathf.Max(minValue, opacityRange.y); + maxValue = Mathf.Min(1, maxValue); + + ((UI_FloatRange) opacityField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) opacityField.uiControlEditor).maxValue = maxValue; + opacityField.uiControlEditor.onFieldChanged = OnMaterialTweakEvent; + } + + if (cutoffAdjustable) { + var minValue = Mathf.Max(0, cutoffRange.x); + var maxValue = Mathf.Max(minValue, cutoffRange.y); + maxValue = Mathf.Min(1, maxValue); + + ((UI_FloatRange) cutoffField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) cutoffField.uiControlEditor).maxValue = maxValue; + cutoffField.uiControlEditor.onFieldChanged = OnMaterialTweakEvent; + } + } + private void Render(Camera camera) { if (!_isAttached) return; @@ -419,5 +427,6 @@ namespace ConformalDecals { target.Render(decalMaterial, part.mpb, camera); } } + } } \ No newline at end of file