示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        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);
        }