Allow for multiple body and mask transforms

using a comma-seperated list
master
Andrew Cassidy 2 years ago
parent 97c5ef53de
commit 30f898f714

@ -14,4 +14,28 @@ Global
{AF7B4795-7A4F-4238-BF1D-F0AC763C15C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF7B4795-7A4F-4238-BF1D-F0AC763C15C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF7B4795-7A4F-4238-BF1D-F0AC763C15C8}.Release|Any CPU.Build.0 = Release|Any CPU {AF7B4795-7A4F-4238-BF1D-F0AC763C15C8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.DotNetNamingPolicy = $1
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
$0.TextStylePolicy = $2
$2.FileWidth = 80
$2.TabsToSpaces = True
$2.scope = text/x-csharp
$2.NoTabsAfterNonTabs = True
$2.EolMarker = Unix
$0.CSharpFormattingPolicy = $3
$3.NewLinesForBracesInTypes = False
$3.NewLinesForBracesInMethods = False
$3.NewLinesForBracesInProperties = False
$3.NewLinesForBracesInAccessors = False
$3.NewLinesForBracesInAnonymousMethods = False
$3.NewLinesForBracesInControlBlocks = False
$3.NewLinesForBracesInAnonymousTypes = False
$3.NewLinesForBracesInObjectCollectionArrayInitializers = False
$3.NewLinesForBracesInLambdaExpressionBody = False
$3.scope = text/x-csharp
$3.SpaceAfterCast = True
$0.StandardHeader = $4
EndGlobalSection
EndGlobal EndGlobal

@ -1,42 +1,36 @@
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization; using UnityEngine.Serialization;
using System.Collections.Generic;
using System.Linq;
namespace DepthMask namespace DepthMask {
{ public class ModuleDepthMask : PartModule {
public class ModuleDepthMask : PartModule
{
// The name of the transform that has your mask mesh. The only strictly required property // The name of the transform that has your mask mesh. The only strictly required property
[KSPField] [KSPField] public string maskTransform = "";
public string maskTransform = "";
[KSPField] [KSPField] public string bodyTransform = "";
public string bodyTransform = "";
// The name of the depth mask shader // The name of the depth mask shader
[KSPField] [KSPField] public string shaderName = "DepthMask";
public string shaderName = "DepthMask";
// The render queue value for the mesh, should be less than maskRenderQueue // The render queue value for the mesh, should be less than maskRenderQueue
[KSPField] [KSPField] public int meshRenderQueue = 1000;
public int meshRenderQueue = 1000;
// the render queue value for the mask, should be less than 2000 // the render queue value for the mask, should be less than 2000
[KSPField] [KSPField] public int maskRenderQueue = 1999;
public int maskRenderQueue = 1999;
// depth mask object transforms // depth mask object transforms
public Transform[] maskTransformObjects; public List<Transform> maskTransformObjects;
// body object transform // body object transform
public Transform bodyTransformObject; public List<Transform> bodyTransformObjects;
// depth mask shader object // depth mask shader object
public Shader depthShader; public Shader depthShader;
public override void OnStart(StartState state) public override void OnStart(StartState state) {
{
base.OnStart(state); base.OnStart(state);
UpdateAllMaterials(); UpdateAllMaterials();
@ -47,83 +41,93 @@ namespace DepthMask
} }
private void OnDestroy() private void OnDestroy() {
{
GameEvents.onVariantApplied.Remove(OnVariantApplied); GameEvents.onVariantApplied.Remove(OnVariantApplied);
GameEvents.onPartRepaired.Remove(OnPartRepaired); GameEvents.onPartRepaired.Remove(OnPartRepaired);
} }
public override void OnLoad(ConfigNode node) public override void OnLoad(ConfigNode node) {
{
base.OnLoad(node); base.OnLoad(node);
if (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight) return; if (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight) return;
this.maskTransformObjects = base.part.FindModelTransforms(maskTransform); this.maskTransformObjects = new List<Transform>();
if (this.maskTransformObjects.Length == 0 || this.maskTransformObjects == null) this.bodyTransformObjects = new List<Transform>();
{
this.LogError($"Can't find transform {maskTransform}"); foreach (string name in maskTransform.Split(',')) {
return; var trimmed = name.Trim();
var transforms = base.part.FindModelTransforms(trimmed);
if (transforms.Length == 0) {
this.LogError($"Can't find any mask transforms named {trimmed}");
}
this.maskTransformObjects.AddRange(transforms);
} }
if (bodyTransform.Length == 0) if (this.maskTransformObjects.Count == 0) {
{ this.LogError($"Can't find any mask transforms");
this.bodyTransformObject = base.part.partTransform; return;
} }
else
{ if (bodyTransform.Length == 0) {
this.bodyTransformObject = base.part.FindModelTransform(bodyTransform); this.bodyTransformObjects.Add(base.part.partTransform);
if (this.bodyTransformObject == null) } else {
{ foreach (string name in bodyTransform.Split(',')) {
this.LogError($"Can't find transform {bodyTransform}"); var trimmed = name.Trim();
this.bodyTransformObject = base.part.partTransform; var transforms = base.part.FindModelTransforms(trimmed);
if (transforms.Length == 0) {
this.LogError($"Can't find any body transforms named {trimmed}");
}
this.bodyTransformObjects.AddRange(transforms);
} }
} }
if (this.bodyTransformObjects.Count == 0) {
this.LogError($"Can't find any body transforms");
return;
}
this.depthShader = Shader.Find(shaderName); this.depthShader = Shader.Find(shaderName);
if (this.depthShader == null) if (this.depthShader == null) {
{
this.LogError($"Can't find shader {shaderName}"); this.LogError($"Can't find shader {shaderName}");
return; return;
} }
} }
public void OnVariantApplied(Part appliedPart, PartVariant variant) 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 // I dont know why changing part variants resets all the materials to their as-loaded state, but it does
if (appliedPart == this.part) UpdateAllMaterials(); if (appliedPart == this.part) UpdateAllMaterials();
} }
public void OnPartRepaired(Part repairedPart) public void OnPartRepaired(Part repairedPart) {
{
// Part repair resets part of the mesh from the prefab, so it needs to be reapplied // Part repair resets part of the mesh from the prefab, so it needs to be reapplied
if (repairedPart == this.part) UpdateAllMaterials(); if (repairedPart == this.part) UpdateAllMaterials();
} }
private void UpdateAllMaterials() private void UpdateAllMaterials() {
{ var renderers = new List<Renderer>();
var renderers = bodyTransformObject.GetComponentsInChildren<Renderer>(true); foreach (var body in bodyTransformObjects) {
renderers.AddRange(body.GetComponentsInChildren<Renderer>(true));
}
foreach (var renderer in renderers) foreach (var renderer in renderers) {
{
var queue = renderer.material.renderQueue; var queue = renderer.material.renderQueue;
if (queue <= maskRenderQueue) continue; if (queue <= maskRenderQueue) continue;
queue = meshRenderQueue + ((queue - 2000) / 2); queue = meshRenderQueue + ((queue - 2000) / 2);
renderer.material.renderQueue = queue; renderer.material.renderQueue = queue;
} }
foreach (var maskObject in maskTransformObjects) foreach (var maskObject in maskTransformObjects) {
{
var renderer = maskObject.GetComponent<Renderer>(); var renderer = maskObject.GetComponent<Renderer>();
renderer.material.shader = depthShader; renderer.material.shader = depthShader;
renderer.material.renderQueue = maskRenderQueue; renderer.material.renderQueue = maskRenderQueue;
} }
} }
private void LogError(string message) private void LogError(string message) {
{
Debug.LogError($"[{part.partInfo?.name ?? part.name} {this.GetType()}] {message}"); Debug.LogError($"[{part.partInfo?.name ?? part.name} {this.GetType()}] {message}");
} }
} }

Loading…
Cancel
Save