void Select(ScreenCoordinateSelectEvent selectEvent) { var window = Resolve <IWindowManager>(); var normPosition = window.PixelToNorm(selectEvent.Position); var uiPosition = window.NormToUi(normPosition); var newSelection = new List <IUiElement>(); DoLayout((extents, dialogOrder, element) => element.Select(uiPosition, extents, dialogOrder, (order, target) => { float z = 1.0f - order / (float)DrawLayer.MaxLayer; var intersectionPoint = new Vector3(normPosition, z); selectEvent.RegisterHit(z, new Selection(intersectionPoint, target)); if (target is IUiElement subElement) { newSelection.Add(subElement); } })); var focused = newSelection.Except(_lastSelection); var blurred = _lastSelection.Except(newSelection); _lastSelection = newSelection; Raise(new UiSelectedEvent(newSelection, focused, blurred)); }
void TransformSelect(ScreenCoordinateSelectEvent e) { var totalMatrix = ViewMatrix * ProjectionMatrix; var inverse = totalMatrix.Inverse(); var normalisedScreenPosition = new Vector3(2 * e.Position.X / _windowSize.X - 1.0f, -2 * e.Position.Y / _windowSize.Y + 1.0f, 0.0f); var rayOrigin = Vector3.Transform(normalisedScreenPosition + Vector3.UnitZ, inverse); var rayDirection = Vector3.Transform(normalisedScreenPosition, inverse) - rayOrigin; rayOrigin = new Vector3(rayOrigin.X, rayOrigin.Y, rayOrigin.Z); Raise(new WorldCoordinateSelectEvent(rayOrigin, rayDirection, e.RegisterHit)); }
bool Select(ScreenCoordinateSelectEvent selectEvent, Action <Selection> continuation) { var window = Resolve <IWindowManager>(); var normPosition = window.PixelToNorm(selectEvent.Position); var uiPosition = window.NormToUi(normPosition); DoLayout((extents, dialogOrder, element) => element.Select(uiPosition, extents, dialogOrder, (order, target) => { float z = 1.0f - order / (float)DrawLayer.MaxLayer; var intersectionPoint = new Vector3(normPosition, z); continuation(new Selection(intersectionPoint, z, target)); })); return(true); }