public override void OnValidatedEndDrag(PointerEventData eventData)
        {
            if (uvDragPlane != null &&
                ModeManager.Instance.PrimaryMode == ModeManager.PrimaryModes.Textures &&
                ModeManager.Instance.SecondaryMode == ModeManager.SecondaryModes.Editing)
            {
                uvDragPlane = null;

                if (SurfaceBatchingManager.BatchingEnabled)
                {
                    SurfaceBatchingManager.Instance.MergeAllBatches();
                }

                alignmentGroup.Clear();
            }
            else
            {
                return;
            }

            InspectorPanel.Instance.RefreshAllInspectors();
        }
        public override void OnValidatedBeginDrag(PointerEventData eventData)
        {
            if (ModeManager.Instance.PrimaryMode == ModeManager.PrimaryModes.Textures &&
                ModeManager.Instance.SecondaryMode == ModeManager.SecondaryModes.Editing)
            {
                Vector2 startingUVs;

                var destinationIsLayered  = ParentSide.NativeObject.HasLayeredTransparentSide(LevelEntity_Level.Instance.Level);
                var destinationDataSource = DataSource;

                if (destinationIsLayered &&
                    (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)))
                {
                    destinationDataSource = LevelEntity_Side.DataSources.Transparent;

                    startingUVs = new Vector2(ParentSide.NativeObject.Transparent.X, ParentSide.NativeObject.Transparent.Y);
                }
                else
                {
                    switch (destinationDataSource)
                    {
                    case LevelEntity_Side.DataSources.Primary:
                        startingUVs = new Vector2(ParentSide.NativeObject.Primary.X, ParentSide.NativeObject.Primary.Y);
                        break;

                    case LevelEntity_Side.DataSources.Secondary:
                        startingUVs = new Vector2(ParentSide.NativeObject.Secondary.X, ParentSide.NativeObject.Secondary.Y);
                        break;

                    case LevelEntity_Side.DataSources.Transparent:
                        startingUVs = new Vector2(ParentSide.NativeObject.Transparent.X, ParentSide.NativeObject.Transparent.Y);
                        break;

                    default:
                        return;
                    }
                }

                var startingPosition = eventData.pointerPressRaycast.worldPosition;

                var surfaceWorldNormal = eventData.pointerCurrentRaycast.worldNormal;
                var textureWorldUp     = Vector3.up;

                uvDragPlane = new UVPlanarDrag(startingUVs,
                                               startingPosition,
                                               surfaceWorldNormal,
                                               textureWorldUp);

                if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))
                {
                    alignmentGroup.Clear();

                    CollectSimilarContiguousAdjacentSurfaces(ParentSide, destinationDataSource);

                    for (var i = 0; i < alignmentGroup.Count; i++)
                    {
                        CollectSimilarContiguousAdjacentSurfaces(alignmentGroup[i].DestinationSide, alignmentGroup[i].DestinationDataSource);
                    }
                }
            }
            else
            {
                return;
            }

            InspectorPanel.Instance.RefreshAllInspectors();
        }