Skip to content

Commit 7e94a90

Browse files
committed
Add ModuleDepthMask
- Added ModuleDepthMask
1 parent c6bb469 commit 7e94a90

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

Source/KSPCommunityPartModules.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
<Compile Include="Modules\ModuleAutoCutDrogue.cs" />
3939
<Compile Include="Modules\ModuleCenterFollowTransform.cs" />
4040
<Compile Include="Modules\ModuleCoPFollowTransform.cs" />
41+
<Compile Include="Modules\ModuleDepthMask.cs" />
4142
<Compile Include="Properties\AssemblyInfo.cs" />
4243
</ItemGroup>
4344
<ItemGroup>

Source/Modules/ModuleDepthMask.cs

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
/*
2+
Usecase: This model allows for parts to have hollow insets that dont clip into other parts.
3+
Example: Restock parts such as air intakes and deployable ladders
4+
Originally By: Drew Cassidy
5+
Originally For: Restock / KSP-DepthMask
6+
*/
7+
using UnityEngine;
8+
using System.Collections.Generic;
9+
10+
namespace KSPCommunityPartModules
11+
{
12+
public class ModuleDepthMask : PartModule
13+
{
14+
public const string MODULENAME = nameof(ModuleDepthMask);
15+
// The name of the transform that has your mask mesh. The only strictly required property
16+
[KSPField] public string maskTransform = "";
17+
18+
[KSPField] public string bodyTransform = "";
19+
20+
// The name of the depth mask shader
21+
[KSPField] public string shaderName = "DepthMask";
22+
23+
// The render queue value for the mesh, should be less than maskRenderQueue
24+
[KSPField] public int meshRenderQueue = 1000;
25+
26+
// the render queue value for the mask, should be less than 2000
27+
[KSPField] public int maskRenderQueue = 1999;
28+
29+
30+
// depth mask object transforms
31+
public List<Transform> maskTransformObjects;
32+
33+
// body object transform
34+
public List<Transform> bodyTransformObjects;
35+
36+
// depth mask shader object
37+
public Shader depthShader;
38+
39+
40+
public override void OnStart(StartState state)
41+
{
42+
base.OnStart(state);
43+
UpdateAllMaterials();
44+
45+
// the part variant system is implemented extremely stupidly
46+
// so we have to make this whole module more complicated as a result
47+
GameEvents.onVariantApplied.Add(OnVariantApplied);
48+
GameEvents.onPartRepaired.Add(OnPartRepaired);
49+
}
50+
51+
52+
private void OnDestroy()
53+
{
54+
GameEvents.onVariantApplied.Remove(OnVariantApplied);
55+
GameEvents.onPartRepaired.Remove(OnPartRepaired);
56+
}
57+
58+
59+
public override void OnLoad(ConfigNode node)
60+
{
61+
base.OnLoad(node);
62+
63+
if (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight) return;
64+
65+
this.maskTransformObjects = new List<Transform>();
66+
this.bodyTransformObjects = new List<Transform>();
67+
68+
foreach (string name in maskTransform.Split(','))
69+
{
70+
var trimmed = name.Trim();
71+
var transforms = base.part.FindModelTransforms(trimmed);
72+
if (transforms.Length == 0)
73+
{
74+
this.LogError($"Can't find any mask transforms named {trimmed}");
75+
}
76+
77+
this.maskTransformObjects.AddRange(transforms);
78+
}
79+
80+
if (this.maskTransformObjects.Count == 0)
81+
{
82+
this.LogError($"Can't find any mask transforms");
83+
return;
84+
}
85+
86+
if (bodyTransform.Length == 0)
87+
{
88+
this.bodyTransformObjects.Add(base.part.partTransform);
89+
}
90+
else
91+
{
92+
foreach (string name in bodyTransform.Split(','))
93+
{
94+
var trimmed = name.Trim();
95+
var transforms = base.part.FindModelTransforms(trimmed);
96+
if (transforms.Length == 0)
97+
{
98+
this.LogError($"Can't find any body transforms named {trimmed}");
99+
}
100+
101+
this.bodyTransformObjects.AddRange(transforms);
102+
}
103+
}
104+
105+
if (this.bodyTransformObjects.Count == 0)
106+
{
107+
this.LogError($"Can't find any body transforms");
108+
return;
109+
}
110+
111+
this.depthShader = Shader.Find(shaderName);
112+
if (this.depthShader == null)
113+
{
114+
this.LogError($"Can't find shader {shaderName}");
115+
return;
116+
}
117+
}
118+
119+
120+
public void OnVariantApplied(Part appliedPart, PartVariant variant)
121+
{
122+
// I dont know why changing part variants resets all the materials to their as-loaded state, but it does
123+
if (appliedPart == this.part) UpdateAllMaterials();
124+
}
125+
126+
public void OnPartRepaired(Part repairedPart)
127+
{
128+
// Part repair resets part of the mesh from the prefab, so it needs to be reapplied
129+
if (repairedPart == this.part) UpdateAllMaterials();
130+
}
131+
132+
private void UpdateAllMaterials()
133+
{
134+
var renderers = new List<Renderer>();
135+
foreach (var body in bodyTransformObjects)
136+
{
137+
renderers.AddRange(body.GetComponentsInChildren<Renderer>(true));
138+
}
139+
140+
foreach (var renderer in renderers)
141+
{
142+
var queue = renderer.material.renderQueue;
143+
if (queue <= maskRenderQueue) continue;
144+
queue = meshRenderQueue + ((queue - 2000) / 2);
145+
renderer.material.renderQueue = queue;
146+
}
147+
148+
foreach (var maskObject in maskTransformObjects)
149+
{
150+
var renderer = maskObject.GetComponent<Renderer>();
151+
renderer.material.shader = depthShader;
152+
renderer.material.renderQueue = maskRenderQueue;
153+
}
154+
}
155+
156+
private void LogError(string message)
157+
{
158+
Debug.LogError($"[{MODULENAME}] : [{part.partInfo?.name ?? part.name}] {message}");
159+
}
160+
}
161+
}

0 commit comments

Comments
 (0)