From 6ae598d9f5dfc36bf8da7773f21a2f67acd87e99 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Mon, 1 Jun 2020 21:09:14 -0700 Subject: [PATCH] Make material handling more intelligent and add incrementing queue --- .../Plugins/ConformalDecals.dll | Bin 27648 -> 28160 bytes .../MaterialPropertyCollection.cs | 48 ++++++++---- .../ConformalDecals/ModuleConformalDecal.cs | 74 ++++++++++++------ 3 files changed, 84 insertions(+), 38 deletions(-) diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 3ad9cd99447a6070c2603813dfa3595220815828..0da29e539df26748b4d88c36be9ace02794d4d7a 100644 GIT binary patch literal 28160 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 L|9}49^T7WAq`!-& literal 27648 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 diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs b/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs index 09691e2..360262a 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs +++ b/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Smooth.Delegates; using UnityEngine; namespace ConformalDecals.MaterialModifiers { @@ -9,8 +10,6 @@ namespace ConformalDecals.MaterialModifiers { public TextureMaterialProperty MainTextureProperty { get; set; } - public Material parsedMaterial; - public bool UseBaseNormal { get; private set; } private List _materialProperties; @@ -19,6 +18,19 @@ namespace ConformalDecals.MaterialModifiers { public String BaseNormalSrc { get; private set; } public String BaseNormalDest { get; private set; } + public Material DecalMaterial { + get { + if (_protoDecalMaterial == null) { + _protoDecalMaterial = MakeMaterial(_decalShader); + } + + return _protoDecalMaterial; + } + } + + private Shader _decalShader; + private Material _protoDecalMaterial; + private const string _normalTextureName = "_BumpMap"; public void Initialize(ConfigNode node, PartModule module) { @@ -30,15 +42,13 @@ namespace ConformalDecals.MaterialModifiers { // Get shader var shaderString = node.GetValue("shader") ?? throw new FormatException("Missing shader name in material"); - var shaderRef = Shabby.Shabby.FindShader(shaderString); + _decalShader = Shabby.Shabby.FindShader(shaderString); // note to self: null coalescing does not work on UnityEngine classes - if (shaderRef == null) { + if (_decalShader == null) { throw new FormatException($"Shader not found: '{shaderString}'"); } - parsedMaterial = new Material(shaderRef); - // Get useBaseNormal value var useBaseNormalString = node.GetValue("useBaseNormal"); @@ -95,7 +105,6 @@ namespace ConformalDecals.MaterialModifiers { } _materialProperties.Add(property); - property.Modify(parsedMaterial); } catch (Exception e) { @@ -107,19 +116,28 @@ namespace ConformalDecals.MaterialModifiers { module.Log($"Parsed {_materialProperties.Count} properties"); } - - public void SetScale(Vector2 scale) { + + public void SetScale(Material material, Vector2 scale) { foreach (var textureProperty in _textureMaterialProperties) { - textureProperty.UpdateScale(parsedMaterial, scale); + textureProperty.UpdateScale(material, scale); } } - - public void SetOpacity(float opacity) { - parsedMaterial.SetFloat(_opacityID, opacity); + + public void SetOpacity(Material material, float opacity) { + material.SetFloat(_opacityID, opacity); } - public void SetCutoff(float cutoff) { - parsedMaterial.SetFloat(_cutoffID, cutoff); + public void SetCutoff(Material material, float cutoff) { + material.SetFloat(_cutoffID, cutoff); + } + + private Material MakeMaterial(Shader shader) { + var material = new Material(shader); + foreach (MaterialProperty property in _materialProperties) { + property.Modify(material); + } + + return material; } } } \ No newline at end of file diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index d61ca8f..6c48831 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -39,24 +39,39 @@ namespace ConformalDecals { [KSPField] public bool opacityAdjustable = true; [KSPField] public bool cutoffAdjustable = true; - [KSPField] public Vector2 scaleRange = new Vector2(0, 4); - [KSPField] public Vector2 depthRange = new Vector2(0, 4); - [KSPField] public Vector2 opacityRange = new Vector2(0, 1); - [KSPField] public Vector2 cutoffRange = new Vector2(0, 1); + [KSPField] public Vector2 scaleRange = new Vector2(0, 4); + [KSPField] public Vector2 depthRange = new Vector2(0, 4); + [KSPField] public Vector2 opacityRange = new Vector2(0, 1); + [KSPField] public Vector2 cutoffRange = new Vector2(0, 1); + [KSPField] public Vector2 decalQueueRange = new Vector2(2100, 2400); [KSPField] public bool updateBackScale = true; [KSPField] public MaterialPropertyCollection materialProperties; + [KSPField] public Material decalMaterial; + + private static int _decalQueueCounter = -1; private List _targets; - private bool _isAttached; - + private bool _isAttached; private Matrix4x4 _orthoMatrix; private Bounds _decalBounds; private Vector2 _backTextureBaseScale; - private Material _backMaterial; + private Material _backMaterial; + + private int DecalQueue { + get { + _decalQueueCounter++; + if (_decalQueueCounter > decalQueueRange.y || _decalQueueCounter < decalQueueRange.x) { + _decalQueueCounter = (int) decalQueueRange.x; + } + + this.Log($"returning decal queue value {_decalQueueCounter}"); + return _decalQueueCounter; + } + } public override void OnLoad(ConfigNode node) { this.Log("Loading module"); @@ -66,6 +81,9 @@ namespace ConformalDecals { materialProperties = ScriptableObject.CreateInstance(); materialProperties.Initialize(materialNode, this); + // get decal material + decalMaterial = materialProperties.DecalMaterial; + // get aspect ratio from main texture, if it exists var mainTexture = materialProperties.MainTextureProperty; if (mainTexture != null) { @@ -134,44 +152,53 @@ namespace ConformalDecals { var opacityField = Fields[nameof(opacity)]; var cutoffField = Fields[nameof(cutoff)]; - if (scaleField.guiActiveEditor = scaleAdjustable) { + 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); - (scaleField.uiControlEditor as UI_FloatRange).minValue = minValue; - (scaleField.uiControlEditor as UI_FloatRange).maxValue = maxValue; + ((UI_FloatRange) scaleField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) scaleField.uiControlEditor).maxValue = maxValue; scaleField.uiControlEditor.onFieldChanged = OnSizeTweakEvent; } - if (depthField.guiActiveEditor = depthAdjustable) { + if (depthAdjustable) { var minValue = Mathf.Max(Mathf.Epsilon, depthRange.x); var maxValue = Mathf.Max(minValue, depthRange.y); - (depthField.uiControlEditor as UI_FloatRange).minValue = minValue; - (depthField.uiControlEditor as UI_FloatRange).maxValue = maxValue; + ((UI_FloatRange) depthField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) depthField.uiControlEditor).maxValue = maxValue; depthField.uiControlEditor.onFieldChanged = OnSizeTweakEvent; } - if (opacityField.guiActiveEditor = opacityAdjustable) { + if (opacityAdjustable) { var minValue = Mathf.Max(0, opacityRange.x); var maxValue = Mathf.Max(minValue, opacityRange.y); maxValue = Mathf.Min(1, maxValue); - (opacityField.uiControlEditor as UI_FloatRange).minValue = minValue; - (opacityField.uiControlEditor as UI_FloatRange).maxValue = maxValue; + ((UI_FloatRange) opacityField.uiControlEditor).minValue = minValue; + ((UI_FloatRange) opacityField.uiControlEditor).maxValue = maxValue; opacityField.uiControlEditor.onFieldChanged = OnMaterialTweakEvent; } - if (cutoffField.guiActiveEditor = cutoffAdjustable) { + if (cutoffAdjustable) { var minValue = Mathf.Max(0, cutoffRange.x); var maxValue = Mathf.Max(minValue, cutoffRange.y); maxValue = Mathf.Min(1, maxValue); - (cutoffField.uiControlEditor as UI_FloatRange).minValue = minValue; - (cutoffField.uiControlEditor as UI_FloatRange).maxValue = 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; + // get back material if necessary if (updateBackScale) { this.Log("Getting material and base scale for back material"); @@ -214,8 +241,8 @@ namespace ConformalDecals { } private void OnMaterialTweakEvent(BaseField field, object obj) { - materialProperties.SetOpacity(opacity); - materialProperties.SetCutoff(cutoff); + materialProperties.SetOpacity(decalMaterial, opacity); + materialProperties.SetCutoff(decalMaterial, cutoff); } private void OnVariantApplied(Part eventPart, PartVariant variant) { @@ -326,11 +353,12 @@ namespace ConformalDecals { } // update material scale - materialProperties.SetScale(size); + materialProperties.SetScale(decalMaterial, size); } private void UpdateProjection() { if (!_isAttached) return; + // project to each target object foreach (var target in _targets) { target.Project(_orthoMatrix, new OrientedBounds(decalProjectorTransform.localToWorldMatrix, _decalBounds), decalProjectorTransform); @@ -342,7 +370,7 @@ namespace ConformalDecals { // render on each target object foreach (var target in _targets) { - target.Render(materialProperties.parsedMaterial, part.mpb, camera); + target.Render(decalMaterial, part.mpb, camera); } } }