11using BrainAtlas ;
22using System ;
3+ using System . Collections . Generic ;
4+ using System . Reflection ;
35using UnityEngine ;
46using UnityEngine . EventSystems ;
7+ using UnityEngine . InputSystem ;
58using UnityEngine . Serialization ;
69
710public class CartesianProbeController : ProbeController
@@ -99,6 +102,7 @@ public override bool Locked
99102 private Vector3 _initialPosition ;
100103 private Quaternion _initialRotation ;
101104 private float _depth ;
105+ private Dictionary < int , bool > _clickDict ;
102106
103107 private bool _dirty ;
104108
@@ -145,6 +149,7 @@ public override string ZAxisStr
145149 #region Unity
146150 private void Awake ( )
147151 {
152+ Debug . Log ( "AWAKE RUNNING" ) ;
148153 _depth = _defaultDepth ;
149154
150155 _initialPosition = transform . position ;
@@ -160,47 +165,92 @@ private void Awake()
160165 var probeControlClick = inputActions . ProbeControl ;
161166 probeControlClick . Enable ( ) ;
162167
168+ // There's something really broken about analog stick "pressing", where the performed event can be fired multiple times
169+ // by pulling the stick back and forward again without going all the way to zero (and triggering "canceled")
170+ //
171+ // Until we can find a fix for this or figure out if this is a bug, we'll fix it here by ensuring that the "Click" call
172+ // for each action type can only ever get called once
173+ _clickDict = new ( ) ;
174+ for ( int i = 0 ; i <= 13 ; i ++ )
175+ _clickDict . Add ( i , false ) ;
176+
163177 // Click actions
164- probeControlClick . Forward . performed += x => Click ( ForwardVecWorld ) ;
165- probeControlClick . Forward . canceled += x => CancelClick ( ForwardVecWorld ) ;
166- probeControlClick . Right . performed += x => Click ( RightVecWorld ) ;
167- probeControlClick . Right . canceled += x => CancelClick ( RightVecWorld ) ;
168- probeControlClick . Back . performed += x => Click ( - ForwardVecWorld ) ;
169- probeControlClick . Back . canceled += x => CancelClick ( - ForwardVecWorld ) ;
170- probeControlClick . Left . performed += x => Click ( - RightVecWorld ) ;
171- probeControlClick . Left . canceled += x => CancelClick ( - RightVecWorld ) ;
172-
173- probeControlClick . Up . performed += x => Click ( UpVecWorld ) ;
174- probeControlClick . Up . canceled += x => CancelClick ( UpVecWorld ) ;
175- probeControlClick . Down . performed += x => Click ( - UpVecWorld ) ;
176- probeControlClick . Down . canceled += x => CancelClick ( - UpVecWorld ) ;
177-
178- probeControlClick . DepthDown . performed += x => Click ( DepthVecWorld ) ;
179- probeControlClick . DepthDown . canceled += x => CancelClick ( DepthVecWorld ) ;
180- probeControlClick . DepthUp . performed += x => Click ( - DepthVecWorld ) ;
181- probeControlClick . DepthUp . canceled += x => CancelClick ( - DepthVecWorld ) ;
178+ probeControlClick . Forward . performed += x => ActionHandler ( 0 , ForwardVecWorld , Click ) ;
179+ probeControlClick . Forward . canceled += x => CancelHandler ( 0 , ForwardVecWorld , CancelClick ) ;
180+ probeControlClick . Right . performed += x => ActionHandler ( 1 , RightVecWorld , Click ) ;
181+ probeControlClick . Right . canceled += x => CancelHandler ( 1 , RightVecWorld , CancelClick ) ;
182+ probeControlClick . Back . performed += x => ActionHandler ( 2 , - ForwardVecWorld , Click ) ;
183+ probeControlClick . Back . canceled += x => CancelHandler ( 2 , - ForwardVecWorld , CancelClick ) ;
184+ probeControlClick . Left . performed += x => ActionHandler ( 3 , - RightVecWorld , Click ) ;
185+ probeControlClick . Left . canceled += x => CancelHandler ( 3 , - RightVecWorld , CancelClick ) ;
186+
187+ probeControlClick . Up . performed += x => ActionHandler ( 4 , UpVecWorld , Click ) ;
188+ probeControlClick . Up . canceled += x => CancelHandler ( 4 , UpVecWorld , CancelClick ) ;
189+ probeControlClick . Down . performed += x => ActionHandler ( 5 , - UpVecWorld , Click ) ;
190+ probeControlClick . Down . canceled += x => CancelHandler ( 5 , - UpVecWorld , CancelClick ) ;
191+
192+ probeControlClick . DepthDown . performed += x => ActionHandler ( 6 , DepthVecWorld , Click ) ;
193+ probeControlClick . DepthDown . canceled += x => CancelHandler ( 6 , DepthVecWorld , CancelClick ) ;
194+ probeControlClick . DepthUp . performed += x => ActionHandler ( 7 , - DepthVecWorld , Click ) ;
195+ probeControlClick . DepthUp . canceled += x => CancelHandler ( 7 , - DepthVecWorld , CancelClick ) ;
182196
183197 // Rotate actions
184- probeControlClick . YawClockwise . performed += x => Rotate ( _yawDir ) ;
185- probeControlClick . YawClockwise . canceled += x => CancelRotate ( _yawDir ) ;
186- probeControlClick . YawCounter . performed += x => Rotate ( - _yawDir ) ;
187- probeControlClick . YawCounter . canceled += x => CancelRotate ( - _yawDir ) ;
198+ probeControlClick . YawClockwise . performed += x => ActionHandler ( 8 , _yawDir , Rotate ) ;
199+ probeControlClick . YawClockwise . canceled += x => CancelHandler ( 8 , _yawDir , CancelRotate ) ;
200+ probeControlClick . YawCounter . performed += x => ActionHandler ( 9 , - _yawDir , Rotate ) ;
201+ probeControlClick . YawCounter . canceled += x => CancelHandler ( 9 , - _yawDir , CancelRotate ) ;
188202
189- probeControlClick . PitchDown . performed += x => Rotate ( _pitchDir ) ;
190- probeControlClick . PitchDown . canceled += x => CancelRotate ( _pitchDir ) ;
191- probeControlClick . PitchUp . performed += x => Rotate ( - _pitchDir ) ;
192- probeControlClick . PitchUp . canceled += x => CancelRotate ( - _pitchDir ) ;
203+ probeControlClick . PitchDown . performed += x => ActionHandler ( 10 , _pitchDir , Rotate ) ;
204+ probeControlClick . PitchDown . canceled += x => CancelHandler ( 10 , _pitchDir , CancelRotate ) ;
205+ probeControlClick . PitchUp . performed += x => ActionHandler ( 11 , - _pitchDir , Rotate ) ;
206+ probeControlClick . PitchUp . canceled += x => CancelHandler ( 11 , - _pitchDir , CancelRotate ) ;
193207
194- probeControlClick . RollClock . performed += x => Rotate ( _rollDir ) ;
195- probeControlClick . RollClock . canceled += x => CancelRotate ( _rollDir ) ;
196- probeControlClick . RollCounter . performed += x => Rotate ( - _rollDir ) ;
197- probeControlClick . RollCounter . canceled += x => CancelRotate ( - _rollDir ) ;
208+ probeControlClick . RollClock . performed += x => ActionHandler ( 12 , _rollDir , Rotate ) ;
209+ probeControlClick . RollClock . canceled += x => CancelHandler ( 12 , _rollDir , CancelRotate ) ;
210+ probeControlClick . RollCounter . performed += x => ActionHandler ( 13 , - _rollDir , Rotate ) ;
211+ probeControlClick . RollCounter . canceled += x => CancelHandler ( 13 , - _rollDir , CancelRotate ) ;
198212
199213 probeControlClick . InputControl . performed += x => ToggleControllerLock ( ) ;
200214
201215 Insertion = new ProbeInsertion ( _defaultStart , _defaultAngles , BrainAtlasManager . ActiveReferenceAtlas . AtlasSpace . Name , BrainAtlasManager . ActiveAtlasTransform . Name ) ;
202216 }
203217
218+ #region Awake helpers
219+ private void ActionHandler ( int idx , Vector4 dir , Action < Vector4 > callback )
220+ {
221+ if ( ! _clickDict [ idx ] )
222+ {
223+ _clickDict [ idx ] = true ;
224+ callback ( dir ) ;
225+ }
226+ }
227+ private void ActionHandler ( int idx , Vector3 dir , Action < Vector3 > callback )
228+ {
229+ if ( ! _clickDict [ idx ] )
230+ {
231+ _clickDict [ idx ] = true ;
232+ callback ( dir ) ;
233+ }
234+ }
235+
236+ private void CancelHandler ( int idx , Vector4 dir , Action < Vector4 > callback )
237+ {
238+ if ( _clickDict [ idx ] )
239+ {
240+ _clickDict [ idx ] = false ;
241+ callback ( dir ) ;
242+ }
243+ }
244+ private void CancelHandler ( int idx , Vector3 dir , Action < Vector3 > callback )
245+ {
246+ if ( _clickDict [ idx ] )
247+ {
248+ _clickDict [ idx ] = false ;
249+ callback ( dir ) ;
250+ }
251+ }
252+ #endregion
253+
204254 private void Start ( )
205255 {
206256 SetProbePosition ( ) ;
0 commit comments