private void OnEndDrag(BaseHandle handle)
        {
            handle.EnableUndo = m_wasUndoEnabled;

            SetFaceSelectionVisibility(true);
            EditableMesh editableMesh = m_editableMeshes.Where(m => m != null).LastOrDefault();

            if (editableMesh != null)
            {
                m_pivotPoint.transform.position   = editableMesh.transform.TransformPoint((m_lastFace.Position));
                m_pivotPoint.transform.localScale = Vector3.one;

                GetTNBBasis();
                m_initialRotation = Quaternion.LookRotation(
                    editableMesh.transform.TransformDirection(m_tbn.Normal),
                    editableMesh.transform.TransformDirection(m_tbn.Tangent));
                m_pivotPoint.transform.rotation = m_initialRotation;

                MeshesState prevState = m_prevState;
                MeshesState newState  = new MeshesState(m_pivotPoint.transform, m_editableMeshes.ToArray());

                m_editor.Undo.CreateRecord(redoRecord =>
                {
                    newState.Apply();
                    return(true);
                },
                                           undoRecord =>
                {
                    prevState.Apply();
                    return(true);
                });
            }

            m_faces = null;
        }
        private void OnBeginDrag(BaseHandle handle)
        {
            m_wasUndoEnabled  = handle.EnableUndo;
            handle.EnableUndo = false;

            m_prevState = new MeshesState(m_pivotPoint.transform, m_editableMeshes.ToArray());

            SetFaceSelectionVisibility(false);
            if (m_lastFace != null)
            {
                GetTNBBasis();
                m_uvPosition = m_objToTBN.MultiplyPoint3x4(m_lastFace.Position);

                EditableMesh lastMesh = LastMesh;
                if (lastMesh != null)
                {
                    Vector3 s = lastMesh.transform.InverseTransformVector(m_pivotPoint.transform.TransformVector(m_pivotPoint.transform.localScale));
                    m_uvScale = m_objToTBN.MultiplyVector(s);
                }

                for (int i = 0; i < m_editableMeshes.Count; ++i)
                {
                    EditableMesh editableMesh = m_editableMeshes[i];
                    editableMesh.Separate(editableMesh.SelectedFaces);
                }

                m_faces = m_editableMeshes.ToDictionary(k => k, v => v.SelectedFaces.Select(f => new Tuple <Face, Face>(f, new Face(f))).ToArray());
            }
        }