diff --git a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll index bb2c9bb3..c072608e 100644 Binary files a/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll and b/Distribution/Restock/GameData/ReStock/Plugins/Restock.dll differ diff --git a/Source/Restock/ModuleRestockDepthMask.cs b/Source/Restock/ModuleRestockDepthMask.cs index 6051a324..fe5f4303 100644 --- a/Source/Restock/ModuleRestockDepthMask.cs +++ b/Source/Restock/ModuleRestockDepthMask.cs @@ -3,11 +3,11 @@ using UnityEngine.Serialization; namespace Restock { - public class ModuleRestockDepthMask: PartModule + public class ModuleRestockDepthMask : PartModule { // The name of the transform that has your mask mesh. The only strictly required property [KSPField] - public string maskTransform= ""; + public string maskTransform = ""; [KSPField] public string bodyTransform = ""; @@ -19,40 +19,47 @@ namespace Restock // The render queue value for the mesh, should be less than maskRenderQueue [KSPField] public int meshRenderQueue = 1000; - + // the render queue value for the mask, should be less than 2000 [KSPField] public int maskRenderQueue = 1999; + // depth mask object transform - public Transform depthMask; + public Transform maskTransformObject; + + // body object transform + public Transform bodyTransformObject; - public Transform bodyRoot; - // depth mask shader object public Shader depthShader; + public override void OnStart(StartState state) { base.OnStart(state); - + UpdatematerialQueue(); + + // the part variant system is implemented extremely stupidly + // so we have to make this whole module more complicated as a result GameEvents.onVariantApplied.Add(OnVariantApplied); } + private void OnDestroy() { GameEvents.onVariantApplied.Remove(OnVariantApplied); } + public override void OnLoad(ConfigNode node) { - base.OnLoad(node); - + if (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight) return; - this.depthMask = base.part.FindModelTransform(maskTransform); - if (!(this.depthMask is Transform)) + this.maskTransformObject = base.part.FindModelTransform(maskTransform); + if (this.maskTransformObject == null) { this.LogError($"Can't find transform {maskTransform}"); return; @@ -60,47 +67,43 @@ namespace Restock if (bodyTransform == "") { - bodyRoot = base.part.partTransform; + this.bodyTransformObject = base.part.partTransform; } else { - this.bodyRoot = base.part.partTransform.Find(bodyTransform); - if (!(this.bodyRoot is Transform)) + this.bodyTransformObject = base.part.FindModelTransform(bodyTransform); + if (this.bodyTransformObject == null) { this.LogError($"Can't find transform {bodyTransform}"); - return; + this.bodyTransformObject = base.part.partTransform; } } - this.depthShader = Shader.Find(shaderName); - if (!(this.depthShader is Shader)) + if (this.depthShader == null) { this.LogError($"Can't find shader {shaderName}"); return; } - - UpdatematerialQueue(); } - + + public void OnVariantApplied(Part appliedPart, PartVariant variant) { + // I dont know why changing part variants resets all the materials to their as-loaded state, but it does if (appliedPart == this.part) UpdatematerialQueue(); } - + + private void UpdatematerialQueue() { - var windowRenderer = depthMask.GetComponent(); - + var windowRenderer = maskTransformObject.GetComponent(); windowRenderer.material.shader = depthShader; windowRenderer.material.renderQueue = maskRenderQueue; - this.Log(depthShader.name); - this.Log(windowRenderer.material.shader.name); - - var meshRenderers = bodyRoot.GetComponentsInChildren(true); - var skinnedMeshRenderers = bodyRoot.GetComponentsInChildren(true); + var meshRenderers = bodyTransformObject.GetComponentsInChildren(true); + var skinnedMeshRenderers = bodyTransformObject.GetComponentsInChildren(true); foreach (var renderer in meshRenderers) { @@ -109,7 +112,7 @@ namespace Restock queue = meshRenderQueue + ((queue - 2000) / 2); renderer.material.renderQueue = queue; } - + foreach (var renderer in skinnedMeshRenderers) { if (renderer == windowRenderer) continue;