From ddb79541f5a3ca1779a163c62fed0edc5855ceef Mon Sep 17 00:00:00 2001 From: blowfish Date: Thu, 28 Feb 2019 23:54:33 -0800 Subject: [PATCH] Material modifers can be scoped by transform Each MATERIAL node can take transform or baseTransform values which look for renderers on that transform or that transform and children respectively. If none are specified it will use every renderer in the model. --- .../GameData/ReStock/Plugins/Restock.dll | Bin 15872 -> 16896 bytes .../Restock/ModuleRestockModifyMaterials.cs | 82 +++++++++++++++--- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll index 05e139eda039263c5aefaec2b920c224030399f6..e8b766fc941358d9d02108dedd550bfe3cfd0a56 100644 GIT binary patch delta 7573 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 I>m6?VH`UfHF#rGn delta 6365 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 DK__aq diff --git a/Source/Restock/ModuleRestockModifyMaterials.cs b/Source/Restock/ModuleRestockModifyMaterials.cs index dffdf3d0..c10c5163 100644 --- a/Source/Restock/ModuleRestockModifyMaterials.cs +++ b/Source/Restock/ModuleRestockModifyMaterials.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using UnityEngine; using Restock.MaterialModifiers; @@ -12,18 +14,10 @@ namespace Restock if (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight) return; - Transform modelTransform = part.partTransform.Find("model"); - - Renderer[] renderers = modelTransform.GetComponentsInChildren(); - - if (modelTransform == null) - { - Debug.LogError("Couldn't find model transform"); - return; - } - foreach (ConfigNode node2 in node.GetNodes("MATERIAL")) { + IEnumerable renderers = GetRenderers(node2); + if (node2.GetValue("shader") is string newShaderName) { if (Shader.Find(newShaderName) is Shader newShader) @@ -66,5 +60,73 @@ namespace Restock isEnabled = false; moduleIsEnabled = false; } + + private IEnumerable GetRenderers(ConfigNode node) + { + IEnumerable renderers = Enumerable.Empty(); + bool useAllRenderers = true; + + foreach (ConfigNode.Value value in node.values) + { + if (value.name == "transform") + { + Transform[] modelTransforms = part.FindModelTransforms(value.name); + + if (modelTransforms.Length == 0) + { + Debug.LogError($"Couldn't find transform named '{value.name}' on part"); + continue; + } + + List transformRenderers = new List(modelTransforms.Length); + foreach (Transform transform in modelTransforms) + { + Renderer renderer = transform.GetComponent(); + + if (renderer == null) + Debug.LogError($"No renderer found on transform '{transform.name}'"); + else + transformRenderers.Add(renderer); + } + + renderers.Concat(transformRenderers); + useAllRenderers = false; + } + else if (value.name == "baseTransform") + { + Transform[] modelTransforms = part.FindModelTransforms(value.name); + + if (modelTransforms.Length == 0) + { + Debug.LogError($"Couldn't find transform named '{value.name}' on part"); + continue; + } + + foreach (Transform transform in modelTransforms) + { + Renderer[] transformRenderers = transform.GetComponentsInChildren(); + + if (transformRenderers.Length == 0) + Debug.LogError($"No renderers found on transform '{transform.name}' or its children"); + else + renderers.Concat(transform.GetComponentsInChildren()); + } + + useAllRenderers = false; + } + } + + if (useAllRenderers) + { + Transform modelTransform = part.partTransform.Find("model"); + + if (modelTransform == null) + Debug.LogError("Couldn't find model transform"); + else + renderers = modelTransform.GetComponentsInChildren(); + } + + return renderers; + } } }