@@ -88,6 +88,16 @@ private struct XRInputSubsystemProfile
8888 new WaveTrackerSubmodule ( )
8989 ) ;
9090
91+ private bool [ ] prevDeviceConnected = new bool [ VRModule . MAX_DEVICE_COUNT ] ;
92+ private bool [ ] currDeviceConnected = new bool [ VRModule . MAX_DEVICE_COUNT ] ;
93+ private void FlushDeviceConnectedState ( )
94+ {
95+ var temp = prevDeviceConnected ;
96+ prevDeviceConnected = currDeviceConnected ;
97+ currDeviceConnected = temp ;
98+ Array . Clear ( currDeviceConnected , 0 , ( int ) VRModule . MAX_DEVICE_COUNT ) ;
99+ }
100+
91101 protected VRModuleKnownXRLoader KnownActiveLoader { get { return knownActiveLoader ; } }
92102 protected VRModuleKnownXRInputSubsystem KnownActiveInputSubsystem { get { return knownActiveInputSubsystem ; } }
93103
@@ -219,26 +229,40 @@ public sealed override void BeforeRenderUpdate()
219229 currState . angularVelocity = GetDeviceFeatureValueOrDefault ( device , CommonUsages . deviceAngularVelocity ) ;
220230 }
221231
232+ currDeviceConnected [ deviceIndex ] = true ;
233+
222234 // TODO: update hand skeleton pose
223235 }
224236
225237 // unmap index for disconnected device state
226- deviceIndex = 0u ;
227- for ( var len = GetDeviceStateLength ( ) ; deviceIndex < len ; ++ deviceIndex )
238+ for ( uint i = 0u , imax = VRModule . MAX_DEVICE_COUNT ; i < imax ; ++ i )
228239 {
229- if ( indexMap . IsMapped ( deviceIndex ) )
240+ if ( prevDeviceConnected [ i ] && ! currDeviceConnected [ i ] )
230241 {
231- EnsureValidDeviceState ( deviceIndex , out prevState , out currState ) ;
232- if ( prevState . isConnected && ! currState . isConnected )
242+ if ( indexMap . IsMapped ( deviceIndex ) )
233243 {
234244 indexMap . UnmapByIndex ( deviceIndex ) ;
245+ }
246+ else
247+ {
248+ Debug . LogWarning ( "[UnityXRModule] Disconnected device[" + deviceIndex + "] already unmapped" ) ;
249+ }
250+
251+ if ( TryGetValidDeviceState ( deviceIndex , out prevState , out currState ) && currState . isConnected )
252+ {
235253 currState . Reset ( ) ;
236254 if ( uxrRightIndex == deviceIndex ) { uxrRightIndex = INVALID_DEVICE_INDEX ; }
237255 if ( uxrLeftIndex == deviceIndex ) { uxrLeftIndex = INVALID_DEVICE_INDEX ; }
238256 }
257+ else
258+ {
259+ Debug . LogWarning ( "[UnityXRModule] Disconnected device[" + deviceIndex + "] already been reset" ) ;
260+ }
239261 }
240262 }
241263
264+ FlushDeviceConnectedState ( ) ;
265+
242266 submodules . UpdateModulesDeviceConnectionAndPoses ( ) ;
243267
244268 // process hand role
0 commit comments