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); }
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(); }