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); } }
public void GrabNearestPoint(bool allowMultigrab, double limit = 1.0) { var selectables = GetSceneSelectables(); ISceneSelectable closestSelectable = null; var closestDistance = double.MaxValue; foreach (var t in selectables) { if (t.IsGrabbed && allowMultigrab) { continue; } var candidateDistance = (t.Position - _scene.Manipulator.Position).Length; if (candidateDistance >= closestDistance) { continue; } closestSelectable = t; closestDistance = candidateDistance; } if (closestSelectable == null || closestDistance > limit) { return; } if (allowMultigrab) { _scene.ToggleObjectGrab(closestSelectable); } else { _scene.SetObjectGrab(closestSelectable); } }