示例#1
0
        public bool TryHandleInputEvent(IInputEvent eventArgs)
        {
            if (!(eventArgs is MouseEvent args))
            {
                return(false);
            }
            if (!args.IsLeftClickEvent())
            {
                return(false);
            }
            var clickInfo = new RayCastInfo(args.Viewport, args.Viewport.View.Layers.Single(), args.State.Position);
            var hitResult = rayHitIndex.CastRay(clickInfo).FirstOrNull() ?? RayHitResult.Failure();

            if (hitResult.Successful)
            {
                int?to = null;
                var gizmoComponentTo = hitResult.Node.GetComponent <StoryFlowchartNodeGizmoComponent>();
                if (gizmoComponentTo != null && gizmoComponentTo.ReferencedNode.Id != from)
                {
                    to = gizmoComponentTo.ReferencedNode.Id;
                }

                if (storyService.GlobalGraph.NodeIds.Contains(hitResult.Node.Id))
                {
                    to = hitResult.Node.Id;
                }

                if (to.HasValue)
                {
                    var child = StoryOperations.AddChild(storyService, commonNodeFactory, to.Value, this);
                    storyService.AddEdge(from, child.Id);
                    toolService.CurrentTool = null;
                    return(true);
                }
            }
            toolService.CurrentTool = null;
            return(false);
        }
示例#2
0
        private void OnEvent(IInteractionEvent interactionEvent)
        {
            if (!(interactionEvent is IInputEvent inputEvent))
            {
                return;
            }
            locksToRelease.Clear();
            foreach (var inputLock in inputLocks)
            {
                var result = inputLock.ProcessEvent(inputEvent);
                if ((result & InputEventProcessResult.StopPropagating) != 0)
                {
                    return;
                }
                if ((result & InputEventProcessResult.ReleaseLock) != 0)
                {
                    locksToRelease.Add(inputLock);
                }
            }
            foreach (var inputLock in locksToRelease)
            {
                inputLocks.Remove(inputLock);
            }

            if (toolService.CurrentTool != null)
            {
                var tool = toolService.CurrentTool;
                if (tool.TryHandleInputEvent(inputEvent))
                {
                    return;
                }
            }

            if (dirtyHackServiceLazy.Value.TryHandleInput(inputEvent))
            {
                return;
            }

            //if (abstractArgs is IMouseEventArgs mouseArgs)
            //    OnMouseEvent(mouseArgs);
            //else if (abstractArgs is IKeyEventArgs keyboardArgs)
            //    OnKeyEvent(keyboardArgs);
            // todo: return if handled

            if (inputEvent.Viewport?.View.TryHandleInput(inputEvent) ?? false)
            {
                return;
            }

            if (inputEvent.Viewport != null && inputEvent is IMouseEvent margs)
            {
                var hitSomething = false;
                foreach (var layer in inputEvent.Viewport.View.Layers)
                {
                    var clickInfo  = new RayCastInfo(margs.Viewport, layer, margs.State.Position);
                    var hitResults = rayHitIndex.CastRay(clickInfo);
                    // todo: introduce different levels of stopping propagation and remove '.Take(1)'
                    foreach (var hitResult in hitResults.Take(1))
                    {
                        hitSomething       = true;
                        margs.RayHitResult = hitResult;
                        foreach (var interactionElement in hitResult.Node.SearchComponents <IInteractionComponent>())
                        {
                            if (interactionElement.TryHandleInteractionEvent(margs))
                            {
                                return;
                            }
                        }
                    }
                    margs.RayHitResult = null;
                    if (layer.Camera is IControlledCamera controlledCamera && controlledCamera.TryHandleInput(inputEvent))
                    {
                        return;
                    }
                }
                if (margs.IsLeftClickEvent() && margs.KeyModifiers == KeyModifiers.None && !hitSomething)
                {
                    viewService.SelectedNode = null;
                }
            }

            if (inputEvent is IKeyEvent kargs && viewService.SelectedNode != null)
            {
                foreach (var interactionElement in viewService.SelectedNode.Node.SearchComponents <IInteractionComponent>())
                {
                    if (interactionElement.TryHandleInteractionEvent(kargs))
                    {
                        return;
                    }
                }
            }

            navigationService.TryHandleInput(inputEvent);
        }
        private void HandleLaser()
        {
            var laserLocalPos = SteamVR_Actions.default_LaserPose.GetLocalPosition(SteamVR_Input_Sources.RightHand); // Relative to player
            var laserLocalRot = SteamVR_Actions.default_LaserPose.GetLocalRotation(SteamVR_Input_Sources.RightHand); // Relative to player
            var laserPos      = globalObjectService.VrPlayer.transform.TransformPoint(laserLocalPos);
            var laserRot      = globalObjectService.VrPlayer.transform.rotation * laserLocalRot;

            var laserDirection = laserRot * Vector3.forward;

            textAbove.text = "";

            var ray = new Ray(laserPos, laserDirection);

            if (!Physics.Raycast(ray, out var hitInfo))
            {
                var farMidPoint = laserPos + laserDirection * 50;
                laser.transform.position   = farMidPoint;
                laser.transform.rotation   = laserRot * Quaternion.Euler(90, 0, 0);
                laser.transform.localScale = new Vector3(0.005f, 50, 0.0005f);
                return;
            }

            var midPoint = (laserPos + hitInfo.point) / 2;

            laser.transform.position   = midPoint;
            laser.transform.rotation   = laserRot * Quaternion.Euler(90, 0, 0);
            laser.transform.localScale = new Vector3(0.005f, hitInfo.distance / 2, 0.005f);
            if (hitInfo.collider.gameObject != minimap)
            {
                return;
            }

            var hitTexCoord = hitInfo.textureCoord;
            var pixelPos    = new IntVector2(Mathf.RoundToInt(hitTexCoord.x * MinimapImageSize.Width),
                                             Mathf.RoundToInt(hitTexCoord.y * MinimapImageSize.Height));
            var hits     = rayHitIndex.CastRay(new RayHitInfo(viewports[0], viewports[0].View.Layers[0], pixelPos));
            var firstHit = hits.FirstOrNull();
            var cGizmo   = firstHit?.Node.SearchComponent <StoryFlowchartNodeGizmoComponent>();

            if (cGizmo == null)
            {
                return;
            }

            var storyNode = cGizmo.ReferencedNode;

            if (!storyService.GlobalGraph.Children[storyNode.Id].IsEmpty())
            {
                return;
            }

            textAbove.text = storyNode.Name;
            if (!SteamVR_Actions.default_InteractUI.GetStateDown(SteamVR_Input_Sources.RightHand))
            {
                return;
            }

            inputService.OnInputEvent(new MouseEventArgs
            {
                ComplexEventType = MouseEventType.DoubleClick,
                EventButtons     = MouseButtons.Left,
                Viewport         = viewports[0],
                State            = new MouseState
                {
                    Buttons            = MouseButtons.Left,
                    Position           = pixelPos,
                    HmgnPosition       = Hmgnize(pixelPos.ToVector()),
                    NormalizedPosition = Normalize(pixelPos.ToVector()),
                }
            });

            headPositionService.ResetHeadPosition();
        }