Skip to content

Commit 3732858

Browse files
committed
Helper methods for checking if Unity object is destroyed
1 parent 79cbd89 commit 3732858

File tree

4 files changed

+43
-36
lines changed

4 files changed

+43
-36
lines changed

Source/DynamicProperties/MaterialPropertyManager.cs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#nullable enable
2+
13
using System.Collections.Generic;
24
using KSPBuildTools;
35
using UnityEngine;
@@ -9,7 +11,7 @@ public sealed class MaterialPropertyManager : MonoBehaviour
911
{
1012
#region Fields
1113

12-
public static MaterialPropertyManager Instance { get; private set; }
14+
public static MaterialPropertyManager? Instance { get; private set; }
1315

1416
private readonly Dictionary<Renderer, PropsCascade> rendererCascades = [];
1517

@@ -75,9 +77,9 @@ public bool Unset(Renderer renderer, Props props)
7577

7678
public bool Unregister(Renderer renderer)
7779
{
78-
if ((object)renderer == null) return false;
80+
if (renderer.IsNullref()) return false;
7981
if (!rendererCascades.Remove(renderer, out var cascade)) return false;
80-
if (renderer == null) this.LogDebug($"dead renderer {renderer.GetHashCode()}");
82+
if (renderer.IsDestroyed()) this.LogDebug($"destroyed renderer {renderer.GetHashCode()}");
8183
cascade.Dispose();
8284
return true;
8385
}
@@ -91,35 +93,43 @@ public static void RegisterPropertyNamesForDebugLogging(params string[] properti
9193

9294
private bool CheckRendererAlive(Renderer renderer)
9395
{
94-
if (renderer != null) return true;
95-
this.LogWarning($"cannot modify null renderer {renderer?.GetHashCode()}");
96-
if ((object)renderer != null) Unregister(renderer);
97-
return false;
96+
if (renderer.IsNullref()) {
97+
Log.LogError(this, "renderer reference is null");
98+
return false;
99+
}
100+
101+
if (renderer.IsDestroyed()) {
102+
this.LogWarning($"cannot modify destroyed renderer {renderer.GetHashCode()}");
103+
Unregister(renderer);
104+
return false;
105+
}
106+
107+
return true;
98108
}
99109

100-
private readonly List<Renderer> _deadRenderers = [];
110+
private readonly List<Renderer> _destroyedRenderers = [];
101111

102-
internal void CheckRemoveDeadRenderers()
112+
internal void CheckRemoveDestroyedRenderers()
103113
{
104114
foreach (var renderer in rendererCascades.Keys) {
105-
if (renderer == null) _deadRenderers.Add(renderer);
115+
if (renderer.IsDestroyed()) _destroyedRenderers.Add(renderer);
106116
}
107117

108-
foreach (var deadRenderer in _deadRenderers) Unregister(deadRenderer);
109-
_deadRenderers.Clear();
118+
foreach (var destroyed in _destroyedRenderers) Unregister(destroyed);
119+
_destroyedRenderers.Clear();
110120
}
111121

112122
/// Public API equivalent is calling `Props.Dispose`.
113123
internal void Unregister(Props props)
114124
{
115125
foreach (var (renderer, cascade) in rendererCascades) {
116-
if (renderer != null) cascade.Remove(props);
126+
if (!renderer.IsDestroyed()) cascade.Remove(props);
117127
}
118128

119-
CheckRemoveDeadRenderers();
129+
CheckRemoveDestroyedRenderers();
120130
}
121131

122-
private bool _propRefreshScheduled = false;
132+
private bool _propsUpdateScheduled = false;
123133
private static readonly WaitForEndOfFrame WfEoF = new();
124134

125135
private IEnumerator<YieldInstruction> Co_propsLateUpdate()
@@ -138,14 +148,14 @@ private IEnumerator<YieldInstruction> Co_propsLateUpdate()
138148
}
139149

140150
propsLateUpdateQueue.Clear();
141-
_propRefreshScheduled = false;
151+
_propsUpdateScheduled = false;
142152
}
143153

144154
internal void ScheduleLateUpdate(Props props)
145155
{
146156
propsLateUpdateQueue.Add(props);
147-
if (_propRefreshScheduled) return;
157+
if (_propsUpdateScheduled) return;
148158
StartCoroutine(Co_propsLateUpdate());
149-
_propRefreshScheduled = true;
159+
_propsUpdateScheduled = true;
150160
}
151161
}

Source/DynamicProperties/MpbCompiler.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ internal void Register(Renderer renderer)
4747
internal void Unregister(Renderer renderer)
4848
{
4949
linkedRenderers.Remove(renderer);
50-
if (renderer != null) renderer.SetPropertyBlock(EmptyMpb);
50+
if (!renderer.IsDestroyed()) renderer.SetPropertyBlock(EmptyMpb);
5151

5252
if (linkedRenderers.Count > 0) return;
5353
Log.Debug(
@@ -113,17 +113,17 @@ private void RewriteMpb()
113113

114114
private void ApplyAll()
115115
{
116-
var hasDeadRenderer = false;
116+
var hasDestroyedRenderer = false;
117117

118118
foreach (var renderer in linkedRenderers) {
119-
if (renderer != null) {
120-
Apply(renderer);
119+
if (renderer.IsDestroyed()) {
120+
hasDestroyedRenderer = true;
121121
} else {
122-
hasDeadRenderer = true;
122+
Apply(renderer);
123123
}
124124
}
125125

126-
if (hasDeadRenderer) MaterialPropertyManager.Instance?.CheckRemoveDeadRenderers();
126+
if (hasDestroyedRenderer) MaterialPropertyManager.Instance?.CheckRemoveDestroyedRenderers();
127127
}
128128

129129
#endregion

Source/DynamicProperties/Utils.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ namespace Shabby.DynamicProperties;
66

77
public static class Utils
88
{
9+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
10+
public static bool IsDestroyed(this UnityEngine.Object obj) => obj.m_CachedPtr != IntPtr.Zero;
11+
12+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
13+
public static bool IsNullref(this UnityEngine.Object obj) => ReferenceEquals(obj, null);
14+
915
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1016
public static bool ApproxEqualsAbs(float a, float b, float eps) =>
1117
Math.Abs(b - a) <= eps;

Source/Shabby.csproj

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<PrivateAssets>all</PrivateAssets>
88
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
99
</PackageReference>
10-
<PackageReference Include="KSPBuildTools" Version="0.0.4" />
10+
<PackageReference Include="KSPBuildTools" Version="0.0.4"/>
1111
<PackageReference Include="MinVer" Version="5.0.0">
1212
<PrivateAssets>all</PrivateAssets>
1313
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
@@ -43,17 +43,8 @@
4343

4444
<!-- Publicizer -->
4545
<ItemGroup>
46-
<Publicize Include="Assembly-CSharp:MaterialColorUpdater.setColor"/>
47-
<Publicize Include="Assembly-CSharp:ModuleColorChanger.color"/>
48-
<Publicize Include="Assembly-CSharp:ModuleColorChanger.renderers"/>
49-
<Publicize Include="Assembly-CSharp:ModuleJettison.jettisonTemperatureRenderer"/>
50-
<Publicize Include="Assembly-CSharp:Part.CreateRendererLists"/>
51-
<Publicize Include="Assembly-CSharp:Part.highlightRenderer"/>
52-
<Publicize Include="Assembly-CSharp:Part.modelRenderersCache"/>
53-
<Publicize Include="Assembly-CSharp:Part.temperatureRenderer"/>
54-
<Publicize Include="Assembly-CSharp:ProceduralFairings.FairingPanel.mpb"/>
55-
<Publicize Include="Assembly-CSharp:ProceduralFairings.FairingPanel.mr"/>
56-
<Publicize Include="Assembly-CSharp:ProceduralFairings.FairingPanel.opacity"/>
46+
<Publicize Include="Assembly-CSharp"/>
47+
<Publicize Include="UnityEngine.CoreModule:UnityEngine.Object.m_CachedPtr"/>
5748
</ItemGroup>
5849

5950
<!-- Version Files -->

0 commit comments

Comments
 (0)