protected override void DragBegin(InteractiveHandle target, DragBeginInfo info)
        {
            if (target != ownerHandle)
            {
                return;
            }

            m_InitialPosWorld  = info.translation.initialPosition;
            m_InitialPosLocal  = Quaternion.Inverse(transform.localRotation) * transform.localPosition;
            m_TotalTranslation = Vector3.zero;
            if (translationBegun != null)
            {
                translationBegun.Invoke(new TranslationBeginInfo(
                                            //World
                                            new TranslationInfo(
                                                m_InitialPosWorld,
                                                Vector3.zero,
                                                Vector3.zero,
                                                transform.forward),

                                            //Local
                                            new TranslationInfo(
                                                m_InitialPosLocal,
                                                Vector3.zero,
                                                Vector3.zero,
                                                transform.localRotation * Vector3.forward)));
            }

            OnTranslationBegin(info.translation);
        }
        protected override void DragBegin(InteractiveHandle target, DragBeginInfo info)
        {
            if (target != ownerHandle)
            {
                return;
            }

            m_LastDirection = info.translation.initialPosition - transform.position;
            m_TotalAngle    = 0f;
            m_Normal        = planeNormal;

            if (rotationBegun != null)
            {
                rotationBegun.Invoke(new RotationBeginInfo(
                                         new RotationInfo( // World
                                             0,
                                             0,
                                             m_Normal),

                                         new RotationInfo( // Local
                                             0,
                                             0,
                                             transform.worldToLocalMatrix.rotation * m_Normal)));
            }
        }
            public bool StartDrag(Vector3 hitPos)
            {
                if (m_State != State.Hovering)
                {
                    return(false);
                }

                m_StartDragPosition = hitPos;
                m_LastFramePosition = hitPos;
                m_State             = State.Dragging;

                var eventData = new DragBeginInfo(new DragTranslation(
                                                      m_StartDragPosition,
                                                      m_StartDragPosition,
                                                      Vector3.zero));

                foreach (var behaviour in TakeSnapshot(m_Context.GetHandleBehaviours()))
                {
                    if (behaviour == null)
                    {
                        continue;
                    }

                    behaviour.DoDragBegin(m_ActiveHandle, eventData);
                }

                return(true);
            }