public override void OnValidatedDrag(PointerEventData eventData)
        {
            if (uvDragPlane != null &&
                ModeManager.Instance.PrimaryMode == ModeManager.PrimaryModes.Textures &&
                ModeManager.Instance.SecondaryMode == ModeManager.SecondaryModes.Editing)
            {
                var screenPosition = new Vector3(eventData.pointerCurrentRaycast.screenPosition.x,
                                                 eventData.pointerCurrentRaycast.screenPosition.y,
                                                 0f);

                var pointerRay = Camera.main.ScreenPointToRay(screenPosition);

                var newUVOffset = uvDragPlane.UVDraggedPosition(pointerRay);

                ParentSide.SetOffset(DataSource,
                                     (short)newUVOffset.x,
                                     (short)newUVOffset.y,
                                     rebatch: false);

                foreach (var alignmentGroupee in alignmentGroup)
                {
                    AlignDestinationToSource(alignmentGroupee.SourceSide,
                                             alignmentGroupee.SourceDataSource,
                                             alignmentGroupee.DestinationSide,
                                             alignmentGroupee.DestinationDataSource,
                                             alignmentGroupee.DestinationFlowsOutward,
                                             alignmentGroupee.DestinationIsLeftOfSource,
                                             rebatch: false);
                }
            }
            else
            {
                return;
            }

            InspectorPanel.Instance.RefreshAllInspectors();
        }
        private void AlignDestinationToSource(LevelEntity_Side sourceSide, LevelEntity_Side.DataSources sourceDataSource, LevelEntity_Side destinationSide, LevelEntity_Side.DataSources destinationDataSource, bool destinationFlowsOutward, bool destinationIsLeftOfSource, bool rebatch)
        {
            short sourceX;
            short sourceY;
            short destinationHeight;
            short sourceHeight;

            switch (destinationDataSource)
            {
            case LevelEntity_Side.DataSources.Primary:
                destinationHeight = destinationSide.PrimaryHighElevation;
                break;

            case LevelEntity_Side.DataSources.Secondary:
                destinationHeight = destinationSide.SecondaryHighElevation;
                break;

            case LevelEntity_Side.DataSources.Transparent:
                destinationHeight = destinationSide.TransparentHighElevation;
                break;

            default:
                return;
            }

            switch (sourceDataSource)
            {
            case LevelEntity_Side.DataSources.Primary:
                sourceX = sourceSide.NativeObject.Primary.X;
                sourceY = sourceSide.NativeObject.Primary.Y;

                sourceHeight = sourceSide.PrimaryHighElevation;

                break;

            case LevelEntity_Side.DataSources.Secondary:
                sourceX = sourceSide.NativeObject.Secondary.X;
                sourceY = sourceSide.NativeObject.Secondary.Y;

                sourceHeight = sourceSide.SecondaryHighElevation;

                break;

            case LevelEntity_Side.DataSources.Transparent:
                sourceX = sourceSide.NativeObject.Transparent.X;
                sourceY = sourceSide.NativeObject.Transparent.Y;

                sourceHeight = sourceSide.TransparentHighElevation;

                break;

            default:
                return;
            }

            short horizontalOffset = destinationIsLeftOfSource ?
                                     (short)-LevelEntity_Level.Instance.Lines[destinationSide.NativeObject.LineIndex].NativeObject.Length :
                                     LevelEntity_Level.Instance.Lines[sourceSide.NativeObject.LineIndex].NativeObject.Length;

            short newX = (short)(sourceX + horizontalOffset);
            short newY = (short)(sourceHeight - destinationHeight + sourceY);

            destinationSide.SetOffset(destinationDataSource,
                                      newX,
                                      newY,
                                      rebatch);
        }