From d2f81058f8e13739e4303472ef4b00b4cf2bc437 Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sat, 6 Jun 2020 13:20:50 -0700 Subject: [PATCH] Refactor yet again and add autotiling --- .../ConformalDecals/Parts/decal-blank.cfg | 8 +- .../ConformalDecals/Parts/decal-flag.cfg | 2 +- .../Plugins/ConformalDecals.dll | Bin 34816 -> 35328 bytes Source/ConformalDecals/ConformalDecals.csproj | 5 +- Source/ConformalDecals/DecalIconFixer.cs | 2 +- .../MaterialModifiers/MaterialProperty.cs | 3 +- .../MaterialPropertyCollection.cs | 25 +++++- .../MaterialTextureProperty.cs | 28 ++++--- ...alDecalBase.cs => ModuleConformalDecal.cs} | 71 +++++++++++++----- .../ModuleConformalDecalGeneric.cs | 34 --------- ...malDecalFlag.cs => ModuleConformalFlag.cs} | 7 +- 11 files changed, 101 insertions(+), 84 deletions(-) rename Source/ConformalDecals/{ModuleConformalDecalBase.cs => ModuleConformalDecal.cs} (92%) delete mode 100644 Source/ConformalDecals/ModuleConformalDecalGeneric.cs rename Source/ConformalDecals/{ModuleConformalDecalFlag.cs => ModuleConformalFlag.cs} (87%) diff --git a/Distribution/GameData/ConformalDecals/Parts/decal-blank.cfg b/Distribution/GameData/ConformalDecals/Parts/decal-blank.cfg index 3f2e4a0..11d5087 100644 --- a/Distribution/GameData/ConformalDecals/Parts/decal-blank.cfg +++ b/Distribution/GameData/ConformalDecals/Parts/decal-blank.cfg @@ -43,15 +43,13 @@ PART MODULE { - name = ModuleConformalDecalGeneric + name = ModuleConformalDecal decalFront = Decal-Front decalBack = Decal-Back decalModel = Decal-Model useBaseNormal = false - - } MODULE { @@ -62,7 +60,7 @@ PART MODULE { IDENTIFIER { - name = ModuleConformalDecalGeneric + name = ModuleConformalDecal } DATA { shader = ConformalDecals/Feature/Bumped @@ -88,7 +86,7 @@ PART MODULE { IDENTIFIER { - name = ModuleConformalDecalGeneric + name = ModuleConformalDecal } DATA { shader = ConformalDecals/Paint/Diffuse diff --git a/Distribution/GameData/ConformalDecals/Parts/decal-flag.cfg b/Distribution/GameData/ConformalDecals/Parts/decal-flag.cfg index 7b1a828..a62e727 100644 --- a/Distribution/GameData/ConformalDecals/Parts/decal-flag.cfg +++ b/Distribution/GameData/ConformalDecals/Parts/decal-flag.cfg @@ -44,7 +44,7 @@ PART MODULE { - name = ModuleConformalDecalFlag + name = ModuleConformalFlag decalFront = Decal-Front decalBack = Decal-Back diff --git a/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/Distribution/GameData/ConformalDecals/Plugins/ConformalDecals.dll index 9c94dcce06d9155c7d5a859186bcc905270aff7c..5e4bdd4706347b346fbb89a90d442133a5f5fc82 100644 GIT binary patch literal 35328 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 N7XSYe|Fb;szX28C)~^5n literal 34816 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 Bb - - + - + diff --git a/Source/ConformalDecals/DecalIconFixer.cs b/Source/ConformalDecals/DecalIconFixer.cs index 9255f85..d0f9b8a 100644 --- a/Source/ConformalDecals/DecalIconFixer.cs +++ b/Source/ConformalDecals/DecalIconFixer.cs @@ -22,7 +22,7 @@ namespace ConformalDecals { var icon = partInfo.iconPrefab; - var decalModule = partInfo.partPrefab.FindModuleImplementing(); + var decalModule = partInfo.partPrefab.FindModuleImplementing(); var frontTransform = Part.FindHeirarchyTransform(icon.transform, decalModule.decalFront); var backTransform = Part.FindHeirarchyTransform(icon.transform, decalModule.decalBack); diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs b/Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs index 61ac6ef..8f6e9de 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs +++ b/Source/ConformalDecals/MaterialModifiers/MaterialProperty.cs @@ -1,6 +1,5 @@ using System; using UnityEngine; -using Object = UnityEngine.Object; namespace ConformalDecals.MaterialModifiers { public abstract class MaterialProperty : ScriptableObject { @@ -16,7 +15,7 @@ namespace ConformalDecals.MaterialModifiers { [SerializeField] protected string _propertyName; public virtual void ParseNode(ConfigNode node) { - if (node == null) throw new ArgumentNullException("node cannot be null"); + if (node == null) throw new ArgumentNullException(nameof(node)); PropertyName = node.GetValue("name"); } diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs b/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs index 764b0f9..f0b7e14 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs +++ b/Source/ConformalDecals/MaterialModifiers/MaterialPropertyCollection.cs @@ -210,12 +210,33 @@ namespace ConformalDecals.MaterialModifiers { public void UpdateScale(Vector2 scale) { foreach (var entry in _materialProperties) { if (entry.Value is MaterialTextureProperty textureProperty) { - textureProperty.UpdateScale(DecalMaterial, scale); - textureProperty.UpdateScale(PreviewMaterial, scale); + textureProperty.UpdateScale(scale); + textureProperty.Modify(_decalMaterial); + textureProperty.Modify(_previewMaterial); } } } + public void UpdateTile(Rect tile) { + if (_mainTexture == null) throw new InvalidOperationException("UpdateTile called but no main texture is specified!"); + Vector2 scale; + Vector2 offset; + + scale.x = tile.width / _mainTexture.texture.width; + scale.y = tile.height / _mainTexture.texture.height; + + offset.x = tile.x / _mainTexture.texture.width; + offset.y = tile.y / _mainTexture.texture.height; + + foreach (var entry in _materialProperties) { + if (entry.Value is MaterialTextureProperty textureProperty) { + textureProperty.UpdateTiling(scale, offset); + textureProperty.Modify(_decalMaterial); + textureProperty.Modify(_previewMaterial); + } + } + } + public void SetOpacity(float opacity) { DecalMaterial.SetFloat(DecalPropertyIDs._DecalOpacity, opacity); PreviewMaterial.SetFloat(DecalPropertyIDs._DecalOpacity, opacity); diff --git a/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs b/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs index 8f6ad4e..d5c7681 100644 --- a/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs +++ b/Source/ConformalDecals/MaterialModifiers/MaterialTextureProperty.cs @@ -8,9 +8,12 @@ namespace ConformalDecals.MaterialModifiers { [SerializeField] public bool isNormal; [SerializeField] public bool isMain; [SerializeField] public bool autoScale; + [SerializeField] public bool autoTile; [SerializeField] private bool _hasTile; [SerializeField] private Rect _tileRect; + [SerializeField] private Vector2 _baseTextureScale = Vector2.one; + [SerializeField] private Vector2 _textureOffset = Vector2.zero; [SerializeField] private Vector2 _textureScale = Vector2.one; @@ -27,6 +30,7 @@ namespace ConformalDecals.MaterialModifiers { public Rect TileRect { get => _tileRect; set { + if (autoTile) return; _hasTile = !(Mathf.Abs(value.width) < 0.1) || !(Mathf.Abs(value.height) < 0.1); _tileRect = value; @@ -40,10 +44,11 @@ namespace ConformalDecals.MaterialModifiers { isNormal = ParsePropertyBool(node, "isNormalMap", true, (PropertyName == "_BumpMap") || (PropertyName == "_DecalBumpMap") || isNormal); isMain = ParsePropertyBool(node, "isMain", true, isMain); autoScale = ParsePropertyBool(node, "autoScale", true, autoScale); + autoTile = ParsePropertyBool(node, "autoTile", true, autoTile); SetTexture(node.GetValue("textureUrl")); - if (node.HasValue("tileRect")) { + if (node.HasValue("tileRect") && !autoTile) { TileRect = ParsePropertyRect(node, "tileRect", true, _tileRect); } } @@ -82,23 +87,26 @@ namespace ConformalDecals.MaterialModifiers { material.SetTextureScale(_propertyID, _textureScale); } - public void UpdateScale(Material material, Vector2 scale) { + public void UpdateScale(Vector2 scale) { if (autoScale) { - material.SetTextureScale(_propertyID, new Vector2(_textureScale.x * scale.x, _textureScale.y * scale.y)); + _textureScale = _baseTextureScale * scale; + } + } + + public void UpdateTiling(Vector2 textureScale, Vector2 textureOffset) { + if (autoTile) { + _textureScale = textureScale; + _textureOffset = textureOffset; } } private void UpdateTiling() { if (_hasTile) { - _textureScale.x = Mathf.Approximately(0, _tileRect.width) ? 1 : _tileRect.width / texture.width; - _textureScale.y = Mathf.Approximately(0, _tileRect.height) ? 1 : _tileRect.height / texture.height; - - _textureOffset.x = _tileRect.x / texture.width; - _textureOffset.y = _tileRect.y / texture.height; + _baseTextureScale.x = Mathf.Approximately(0, _tileRect.width) ? 1 : _tileRect.width / texture.width; + _baseTextureScale.y = Mathf.Approximately(0, _tileRect.height) ? 1 : _tileRect.height / texture.height; } else { - _textureScale = Vector2.one; - _textureOffset = Vector2.zero; + _baseTextureScale = Vector2.one; } } } diff --git a/Source/ConformalDecals/ModuleConformalDecalBase.cs b/Source/ConformalDecals/ModuleConformalDecal.cs similarity index 92% rename from Source/ConformalDecals/ModuleConformalDecalBase.cs rename to Source/ConformalDecals/ModuleConformalDecal.cs index da7445c..9c6e425 100644 --- a/Source/ConformalDecals/ModuleConformalDecalBase.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -5,7 +5,7 @@ using ConformalDecals.Util; using UnityEngine; namespace ConformalDecals { - public abstract class ModuleConformalDecalBase : PartModule { + public class ModuleConformalDecal : PartModule { [KSPField(guiName = "#LOC_ConformalDecals_gui-scale", guiActive = false, guiActiveEditor = true, isPersistant = true, guiFormat = "F2", guiUnits = "m"), UI_FloatRange(stepIncrement = 0.05f)] public float scale = 1.0f; @@ -76,10 +76,23 @@ namespace ConformalDecals { return _decalQueueCounter; } } + + public override void OnAwake() { + base.OnAwake(); + if (materialProperties == null) { + materialProperties = ScriptableObject.CreateInstance(); + } + else { + materialProperties = ScriptableObject.Instantiate(materialProperties); + } + } + public override void OnLoad(ConfigNode node) { this.Log("Loading module"); try { + // SETUP TRANSFORMS + // find front transform decalFrontTransform = part.FindModelTransform(decalFront); if (decalFrontTransform == null) throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); @@ -135,34 +148,52 @@ namespace ConformalDecals { } } - DecalIconFixer.QueuePart(part.name); - + // PARSE MATERIAL PROPERTIES + // set shader materialProperties.SetShader(shader); + + // 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); + } + + var tileString = node.GetValue("tile"); + if (!string.IsNullOrEmpty(tileString)) { + var tileValid = ParseExtensions.TryParseRect(tileString, out var tile); + + if (!tileValid) throw new FormatException($"Improperly formatted value for tile '{tileString}"); + else { + materialProperties.UpdateTile(tile); + } + } + + // QUEUE PART FOR ICON FIXING IN VAB + DecalIconFixer.QueuePart(part.name); } catch (Exception e) { this.LogException("Exception parsing partmodule", e); } - + if (HighLogic.LoadedSceneIsGame) { UpdateMaterials(); UpdateScale(); UpdateProjection(); } - else { - UpdateScale(); - } } - - public override void OnAwake() { - base.OnAwake(); - - if (materialProperties == null) { - materialProperties = ScriptableObject.CreateInstance(); - } - else { - materialProperties = ScriptableObject.Instantiate(materialProperties); - } + + public override void OnIconCreate() { + UpdateScale(); } public override void OnStart(StartState state) { @@ -175,11 +206,11 @@ namespace ConformalDecals { UpdateTweakables(); } - + materialProperties.SetRenderQueue(DecalQueue); UpdateMaterials(); - + if (HighLogic.LoadedSceneIsGame) { // set initial attachment state if (part.parent == null) { @@ -312,7 +343,7 @@ namespace ConformalDecals { materialProperties.UpdateMaterials(); materialProperties.SetOpacity(opacity); materialProperties.SetCutoff(cutoff); - + _decalMaterial = materialProperties.DecalMaterial; _previewMaterial = materialProperties.PreviewMaterial; diff --git a/Source/ConformalDecals/ModuleConformalDecalGeneric.cs b/Source/ConformalDecals/ModuleConformalDecalGeneric.cs deleted file mode 100644 index 5960578..0000000 --- a/Source/ConformalDecals/ModuleConformalDecalGeneric.cs +++ /dev/null @@ -1,34 +0,0 @@ -using ConformalDecals.MaterialModifiers; -using ConformalDecals.Util; -using UnityEngine; - -namespace ConformalDecals { - public class ModuleConformalDecalGeneric : ModuleConformalDecalBase { - public override void OnLoad(ConfigNode node) { - - // set shader - materialProperties.SetShader(shader); - // 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); - } - - base.OnLoad(node); - } - - public override void OnIconCreate() { - this.Log("called OnIconCreate"); - UpdateScale(); - } - } -} \ No newline at end of file diff --git a/Source/ConformalDecals/ModuleConformalDecalFlag.cs b/Source/ConformalDecals/ModuleConformalFlag.cs similarity index 87% rename from Source/ConformalDecals/ModuleConformalDecalFlag.cs rename to Source/ConformalDecals/ModuleConformalFlag.cs index 8aa5bea..0e12811 100644 --- a/Source/ConformalDecals/ModuleConformalDecalFlag.cs +++ b/Source/ConformalDecals/ModuleConformalFlag.cs @@ -1,7 +1,7 @@ using ConformalDecals.Util; namespace ConformalDecals { - public class ModuleConformalDecalFlag : ModuleConformalDecalBase { + public class ModuleConformalFlag : ModuleConformalDecal { private const string DefaultFlag = "Squad/Flags/default"; public override void OnLoad(ConfigNode node) { @@ -20,11 +20,6 @@ namespace ConformalDecals { UpdateFlag(GetDefaultFlag()); } - public override void OnIconCreate() { - this.Log("called OnIconCreate"); - UpdateScale(); - } - public override void OnDestroy() { GameEvents.onMissionFlagSelect.Remove(UpdateFlag); base.OnDestroy();