@@ -33,6 +33,7 @@ public class LockControllerVisualizerBehaviour : BaseInteractionBehaviour
33
33
private float syncDuration = 1f ;
34
34
35
35
private readonly Dictionary < IControllerVisualizer , bool > lockedVisualizers = new ( ) ;
36
+ private readonly Dictionary < IControllerVisualizer , bool > pendingUnlockVisualizers = new ( ) ;
36
37
private readonly Dictionary < IControllerVisualizer , Pose > smoothingStartPose = new ( ) ;
37
38
private readonly Dictionary < IControllerVisualizer , float > smoothingStartTime = new ( ) ;
38
39
private readonly Dictionary < IControllerVisualizer , float > smoothingProgress = new ( ) ;
@@ -50,15 +51,32 @@ protected override void Update()
50
51
51
52
foreach ( var visualizer in visualizers )
52
53
{
53
- var shouldLock = HasFinishedSmoothTransition ( visualizer , lockPose ) ;
54
-
55
- if ( ! shouldLock )
54
+ if ( pendingUnlockVisualizers . TryGetValue ( visualizer , out _ ) )
56
55
{
57
- lockPose . position = Vector3 . Slerp ( smoothingStartPose [ visualizer ] . position , lockPose . position , smoothingProgress [ visualizer ] ) ;
58
- lockPose . rotation = Quaternion . Slerp ( smoothingStartPose [ visualizer ] . rotation , lockPose . rotation , smoothingProgress [ visualizer ] ) ;
56
+ var finishedUnlock = HasFinishedSmoothTransition ( pendingUnlockVisualizers , visualizer ) ;
57
+ if ( finishedUnlock )
58
+ {
59
+ CleanUpVisualizer ( visualizer ) ;
60
+ continue ;
61
+ }
62
+
63
+ var unlockPose = visualizer . SourcePose ;
64
+ unlockPose . position = Vector3 . Slerp ( smoothingStartPose [ visualizer ] . position , unlockPose . position , smoothingProgress [ visualizer ] ) ;
65
+ unlockPose . rotation = Quaternion . Slerp ( smoothingStartPose [ visualizer ] . rotation , unlockPose . rotation , smoothingProgress [ visualizer ] ) ;
66
+ visualizer . PoseDriver . SetPositionAndRotation ( unlockPose . position , unlockPose . rotation ) ;
59
67
}
68
+ else
69
+ {
70
+ var shouldLock = HasFinishedSmoothTransition ( lockedVisualizers , visualizer ) ;
60
71
61
- visualizer . PoseDriver . SetPositionAndRotation ( lockPose . position , lockPose . rotation ) ;
72
+ if ( ! shouldLock )
73
+ {
74
+ lockPose . position = Vector3 . Slerp ( smoothingStartPose [ visualizer ] . position , lockPose . position , smoothingProgress [ visualizer ] ) ;
75
+ lockPose . rotation = Quaternion . Slerp ( smoothingStartPose [ visualizer ] . rotation , lockPose . rotation , smoothingProgress [ visualizer ] ) ;
76
+ }
77
+
78
+ visualizer . PoseDriver . SetPositionAndRotation ( lockPose . position , lockPose . rotation ) ;
79
+ }
62
80
}
63
81
}
64
82
@@ -120,19 +138,34 @@ private void LockVisualizer(IControllerVisualizer visualizer)
120
138
}
121
139
122
140
private void UnlockVisualizer ( IControllerVisualizer visualizer )
141
+ {
142
+ if ( ! smoothSyncPose )
143
+ {
144
+ CleanUpVisualizer ( visualizer ) ;
145
+ return ;
146
+ }
147
+
148
+ pendingUnlockVisualizers . EnsureDictionaryItem ( visualizer , false , true ) ;
149
+ smoothingStartPose . EnsureDictionaryItem ( visualizer , GetLockPose ( ) , true ) ;
150
+ smoothingStartTime . EnsureDictionaryItem ( visualizer , Time . time , true ) ;
151
+ smoothingProgress . EnsureDictionaryItem ( visualizer , 0f , true ) ;
152
+ }
153
+
154
+ private void CleanUpVisualizer ( IControllerVisualizer visualizer )
123
155
{
124
156
lockedVisualizers . SafeRemoveDictionaryItem ( visualizer ) ;
125
157
smoothingStartPose . SafeRemoveDictionaryItem ( visualizer ) ;
126
158
smoothingStartTime . SafeRemoveDictionaryItem ( visualizer ) ;
127
159
smoothingProgress . SafeRemoveDictionaryItem ( visualizer ) ;
160
+ pendingUnlockVisualizers . SafeRemoveDictionaryItem ( visualizer ) ;
128
161
visualizer . OverrideSourcePose = false ;
129
162
}
130
163
131
164
private Pose GetLockPose ( ) => new Pose ( transform . TransformPoint ( localOffsetPose . position ) , transform . rotation * Quaternion . Euler ( localOffsetPose . rotation . eulerAngles ) ) ;
132
165
133
- private bool HasFinishedSmoothTransition ( IControllerVisualizer visualizer , Pose snapPose )
166
+ private bool HasFinishedSmoothTransition ( Dictionary < IControllerVisualizer , bool > smoothingStateDictionary , IControllerVisualizer visualizer )
134
167
{
135
- if ( lockedVisualizers [ visualizer ] )
168
+ if ( smoothingStateDictionary [ visualizer ] )
136
169
{
137
170
return true ;
138
171
}
@@ -145,7 +178,7 @@ private bool HasFinishedSmoothTransition(IControllerVisualizer visualizer, Pose
145
178
return false ;
146
179
}
147
180
148
- lockedVisualizers [ visualizer ] = true ;
181
+ smoothingStateDictionary [ visualizer ] = true ;
149
182
return true ;
150
183
}
151
184
}
0 commit comments