public void GrabUsingMouseRect(
            Rect screenSpaceGrabRect,
            bool allowMultigrab
            )
        {
            var selectables = GetSceneSelectables();

            if (selectables.Count == 0)
            {
                return;
            }

            foreach (var selectable in selectables)
            {
                var screenSpacePosition =
                    ActiveRenderer.GetStandardScreenSpacePosition(
                        selectable.WorldPosition
                        );
                if (!screenSpacePosition.HasValue)
                {
                    continue;
                }
                if (screenSpaceGrabRect.Contains(screenSpacePosition.Value))
                {
                    _scene.GrabObject(selectable);
                }
            }
        }
        private void UpdateManipulatorInfo()
        {
            var cursorScreenPos   = ActiveRenderer.GetStandardScreenSpacePosition(_scene.Manipulator.Position);
            var cursorViewPosInfo = cursorScreenPos.HasValue
                ? String.Format("Cursor screen position: ({0:0.##} ; {1:0.##})", cursorScreenPos.Value.X,
                                cursorScreenPos.Value.Y)
                : "Cursor screen position: <Clipped>";

            CursorReadableInfo = String.Format("Cursor world position: ({0:0.##} ; {1:0.##} ; {2:0.##}) {3}",
                                               _scene.Manipulator.Position.X, _scene.Manipulator.Position.Y, _scene.Manipulator.Position.Z,
                                               cursorViewPosInfo);
        }
        public void GrabUsingMouse(
            Point screenSpaceClick,
            bool allowMultigrab,
            double limit = 0.2
            )
        {
            var selectables = GetSceneSelectables();

            if (selectables.Count == 0)
            {
                return;
            }

            ISceneSelectable closestObject = null;
            var closestDistance            = double.MaxValue;

            foreach (var selectable in selectables)
            {
                var screenSpacePosition = ActiveRenderer
                                          .GetStandardScreenSpacePosition(selectable.WorldPosition);
                if (!screenSpacePosition.HasValue)
                {
                    continue;
                }
                var candidateLength =
                    (screenSpacePosition.Value - screenSpaceClick).Length;
                if (candidateLength >= closestDistance)
                {
                    continue;
                }
                closestObject   = selectable;
                closestDistance = candidateLength;
            }

            if (closestObject == null || closestDistance > limit)
            {
                return;
            }

            if (allowMultigrab)
            {
                _scene.ToggleObjectGrab(closestObject);
            }
            else
            {
                _scene.SetObjectGrab(closestObject);
            }
        }