unsafe void RetrieveGestureEvents() { if (NativeApi.IsHandGesturesEnabled()) { GetGestureEvents <MagicLeapKeyPoseGestureEvent>(ref m_KeyPoseGestureEvents, NativeApi.GetKeyPoseGestureEventsPtr); } if (NativeApi.IsControllerGesturesEnabled()) { GetGestureEvents <MagicLeapTouchpadGestureEvent>(ref m_TouchpadGestureEvents, NativeApi.GetTouchpadGestureEventsPtr); } // Count up valid activate gestures (Have to do this as we cannot dynamically grow NativeArray). // This should be possible to fix with NativeList (when out of preview package). int activateGestureEventCount = 0; foreach (var gestureEvent in m_KeyPoseGestureEvents) { if (gestureEvent.state == GestureState.Started && gestureEvent.keyPose == MagicLeapKeyPose.Finger) { activateGestureEventCount++; } } if (m_ActivateGestureEvents.IsCreated) { m_ActivateGestureEvents.Dispose(); } m_ActivateGestureEvents = new NativeArray <ActivateGestureEvent>(activateGestureEventCount, Allocator.Persistent); int iActivateGestureEvent = 0; foreach (var gestureEvent in m_KeyPoseGestureEvents) { if (gestureEvent.state == GestureState.Started && gestureEvent.keyPose == MagicLeapKeyPose.Finger) { m_ActivateGestureEvents[iActivateGestureEvent++] = new ActivateGestureEvent(GetNextGUID(), gestureEvent.state, Vector3.zero, Vector3.one); } } }
unsafe void RetrieveAllGestureEvents() { RetrieveGestureEvents(NativeApi.UnityWindowsMR_GesturesGetHoldGestureEventsPtr, ref m_HoldGestureEvents); RetrieveGestureEvents(NativeApi.UnityWindowsMR_GesturesGetManipulationGestureEventsPtr, ref m_ManipulationGestureEvents); RetrieveGestureEvents(NativeApi.UnityWindowsMR_GesturesGetNavigationGestureEventsPtr, ref m_NavigationGestureEvents); RetrieveGestureEvents(NativeApi.UnityWindowsMR_GesturesGetTappedGestureEventsPtr, ref m_TappedGestureEvents); // Avoid re-allocation of NativeArray if our current NativeArray is empty and we don't have new events. if (m_TappedGestureEvents.Length == 0) { if (m_ActivateGestureEvents.Length > 0) { if (m_ActivateGestureEvents.IsCreated) { m_ActivateGestureEvents.Dispose(); } m_ActivateGestureEvents = new NativeArray <ActivateGestureEvent>(0, Allocator.Persistent); } } else { if (m_ActivateGestureEvents.IsCreated) { m_ActivateGestureEvents.Dispose(); } m_ActivateGestureEvents = new NativeArray <ActivateGestureEvent>(m_TappedGestureEvents.Length, Allocator.Persistent); int iActivateGestureEvent = 0; foreach (var gestureEvent in m_TappedGestureEvents) { if (gestureEvent.state == GestureState.Started) { m_ActivateGestureEvents[iActivateGestureEvent++] = new ActivateGestureEvent(GetNextGUID(), gestureEvent.state); } } } }