1
+ #nullable enable
2
+
1
3
using System . Collections . Generic ;
2
4
using KSPBuildTools ;
3
5
using UnityEngine ;
@@ -9,7 +11,7 @@ public sealed class MaterialPropertyManager : MonoBehaviour
9
11
{
10
12
#region Fields
11
13
12
- public static MaterialPropertyManager Instance { get ; private set ; }
14
+ public static MaterialPropertyManager ? Instance { get ; private set ; }
13
15
14
16
private readonly Dictionary < Renderer , PropsCascade > rendererCascades = [ ] ;
15
17
@@ -75,9 +77,9 @@ public bool Unset(Renderer renderer, Props props)
75
77
76
78
public bool Unregister ( Renderer renderer )
77
79
{
78
- if ( ( object ) renderer == null ) return false ;
80
+ if ( renderer . IsNullref ( ) ) return false ;
79
81
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 ( ) } ") ;
81
83
cascade . Dispose ( ) ;
82
84
return true ;
83
85
}
@@ -91,35 +93,43 @@ public static void RegisterPropertyNamesForDebugLogging(params string[] properti
91
93
92
94
private bool CheckRendererAlive ( Renderer renderer )
93
95
{
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 ;
98
108
}
99
109
100
- private readonly List < Renderer > _deadRenderers = [ ] ;
110
+ private readonly List < Renderer > _destroyedRenderers = [ ] ;
101
111
102
- internal void CheckRemoveDeadRenderers ( )
112
+ internal void CheckRemoveDestroyedRenderers ( )
103
113
{
104
114
foreach ( var renderer in rendererCascades . Keys ) {
105
- if ( renderer == null ) _deadRenderers . Add ( renderer ) ;
115
+ if ( renderer . IsDestroyed ( ) ) _destroyedRenderers . Add ( renderer ) ;
106
116
}
107
117
108
- foreach ( var deadRenderer in _deadRenderers ) Unregister ( deadRenderer ) ;
109
- _deadRenderers . Clear ( ) ;
118
+ foreach ( var destroyed in _destroyedRenderers ) Unregister ( destroyed ) ;
119
+ _destroyedRenderers . Clear ( ) ;
110
120
}
111
121
112
122
/// Public API equivalent is calling `Props.Dispose`.
113
123
internal void Unregister ( Props props )
114
124
{
115
125
foreach ( var ( renderer , cascade ) in rendererCascades ) {
116
- if ( renderer != null ) cascade . Remove ( props ) ;
126
+ if ( ! renderer . IsDestroyed ( ) ) cascade . Remove ( props ) ;
117
127
}
118
128
119
- CheckRemoveDeadRenderers ( ) ;
129
+ CheckRemoveDestroyedRenderers ( ) ;
120
130
}
121
131
122
- private bool _propRefreshScheduled = false ;
132
+ private bool _propsUpdateScheduled = false ;
123
133
private static readonly WaitForEndOfFrame WfEoF = new ( ) ;
124
134
125
135
private IEnumerator < YieldInstruction > Co_propsLateUpdate ( )
@@ -138,14 +148,14 @@ private IEnumerator<YieldInstruction> Co_propsLateUpdate()
138
148
}
139
149
140
150
propsLateUpdateQueue . Clear ( ) ;
141
- _propRefreshScheduled = false ;
151
+ _propsUpdateScheduled = false ;
142
152
}
143
153
144
154
internal void ScheduleLateUpdate ( Props props )
145
155
{
146
156
propsLateUpdateQueue . Add ( props ) ;
147
- if ( _propRefreshScheduled ) return ;
157
+ if ( _propsUpdateScheduled ) return ;
148
158
StartCoroutine ( Co_propsLateUpdate ( ) ) ;
149
- _propRefreshScheduled = true ;
159
+ _propsUpdateScheduled = true ;
150
160
}
151
161
}
0 commit comments