private void OnNavigationEvent(INavigationEvent args) { if (hasFreeCamera || args.CausedByFocusing) { return; } var aFocusNode = navigationService.Current.GetComponent <IFocusNodeComponent>(); var newNode = aFocusNode.Node; var newCamera = aFocusNode.DefaultViewpointMechanism.CreateControlledViewpoint(); if (mainLayer.Camera == null || newNode.Scene != FocusNode.Scene) { mainLayer.Camera = newCamera; } // todo: find real one var layoutInstance = storyService.RootLayoutInstance; var initialCameraProps = mainLayer.Camera.GetProps(); var interLevel = navigationService.InterLevelTransition; var path = layoutInstance.GetPath(initialCameraProps, navigationService.Current.Id, navigationService.State, interLevel); switch (args.Type) { case NavigationEventType.Reset: if (mainLayer.Camera == null) { mainLayer.Camera = newCamera; } else { mainLayer.Camera = new SceneTransitionCamera(mainLayer.Camera, newCamera, TransitionDuration, () => mainLayer.VisibleScene = newNode.Scene, () => mainLayer.Camera = newCamera); } break; case NavigationEventType.MoveToNextFork: mainLayer.Camera = args.MoveInstantly ? newCamera : new StoryPathCamera(path, initialCameraProps, null, OnReachedFork); break; case NavigationEventType.MoveToPrevFork: mainLayer.Camera = args.MoveInstantly ? newCamera : new StoryPathCamera(path, initialCameraProps, null, OnReachedFork); break; case NavigationEventType.MoveToSpecific: mainLayer.Camera = args.MoveInstantly ? newCamera : new StoryPathCamera(path, initialCameraProps, newCamera.GetProps(), () => { mainLayer.Camera = newCamera; }); break; default: throw new ArgumentOutOfRangeException(nameof(args.Type), args.Type, null); } FocusNode = navigationService.Current; }
private void OnNavigationEvent(INavigationEvent evnt) { var cFocusNode = navigationService.Current.GetComponent <IFocusNodeComponent>(); var newCamera = cFocusNode.DefaultViewpointMechanism.CreateControlledViewpoint(); //todo: refactor this mess var initialFloorHeight = (float?)null; var targetFloorHeight = (float?)null; var cameraPosition = camera.GetEye(); // todo: find real one var layoutInstance = storyService.RootLayoutInstance; if (layoutInstance.AllowsFreeCamera) { var collisionMesh = layoutInstance.GetCollisionMesh(); var currentWalkableArea = collisionMesh.GetWalkableAreas().Where(x => x.Contains(cameraPosition)).FirstOrNull(); if (currentWalkableArea.HasValue) { // todo: fix when walkable areas are fixed initialFloorHeight = currentWalkableArea.Value.Center.Y; } var targetWalkableArea = collisionMesh.GetWalkableAreas().Where(x => x.Contains(newCamera.GetEye())).FirstOrNull(); if (targetWalkableArea.HasValue) { // todo: fix when walkable areas are fixed targetFloorHeight = targetWalkableArea.Value.Center.Y; } } var initialCameraProps = camera.GetProps(); initialCameraProps.Frame.Eye.X = globalObjectService.VrPlayerCarrier.transform.position.x; initialCameraProps.Frame.Eye.Z = -globalObjectService.VrPlayerCarrier.transform.position.z; var interLevel = navigationService.InterLevelTransition; var path = layoutInstance.GetPath(initialCameraProps, navigationService.Current.Id, navigationService.State, interLevel); switch (evnt.Type) { case NavigationEventType.Reset: case NavigationEventType.MoveToSpecific: vrInputDispatcher.NavigateTo(navigationService.Current, path, initialCameraProps, initialFloorHeight, targetFloorHeight); break; case NavigationEventType.MoveToNextFork: case NavigationEventType.MoveToPrevFork: OnReachedFork(); break; default: throw new ArgumentOutOfRangeException(); } }
void Init(EventBase evt) { var type = evt.GetType(); eventBaseName = EventDebugger.GetTypeDisplayName(type); eventTypeId = evt.eventTypeId; eventId = evt.eventId; triggerEventId = evt.triggerEventId; timestamp = evt.timestamp; target = evt.target; skipElements = evt.skipElements; isPropagationStopped = evt.isPropagationStopped; isImmediatePropagationStopped = evt.isImmediatePropagationStopped; isDefaultPrevented = evt.isDefaultPrevented; var mouseEvent = evt as IMouseEvent; var mouseEventInternal = evt as IMouseEventInternal; hasUnderlyingPhysicalEvent = mouseEvent != null && mouseEventInternal != null && mouseEventInternal.triggeredByOS; propagationPhase = evt.propagationPhase; originalMousePosition = evt.originalMousePosition; currentTarget = evt.currentTarget; dispatch = evt.dispatch; if (mouseEvent != null) { modifiers = mouseEvent.modifiers; mousePosition = mouseEvent.mousePosition; button = mouseEvent.button; pressedButtons = mouseEvent.pressedButtons; clickCount = mouseEvent.clickCount; var wheelEvent = mouseEvent as WheelEvent; if (wheelEvent != null) { delta = wheelEvent.delta; } } var pointerEvent = evt as IPointerEvent; if (pointerEvent != null) { var pointerEventInternal = evt as IPointerEventInternal; hasUnderlyingPhysicalEvent = pointerEvent != null && pointerEventInternal != null && pointerEventInternal.triggeredByOS; modifiers = pointerEvent.modifiers; mousePosition = pointerEvent.position; button = pointerEvent.button; pressedButtons = pointerEvent.pressedButtons; clickCount = pointerEvent.clickCount; } IKeyboardEvent keyboardEvent = evt as IKeyboardEvent; if (keyboardEvent != null) { character = keyboardEvent.character; keyCode = keyboardEvent.keyCode; } ICommandEvent commandEvent = evt as ICommandEvent; if (commandEvent != null) { commandName = commandEvent.commandName; } INavigationEvent navigationEvent = evt as INavigationEvent; if (navigationEvent != null) { deviceType = navigationEvent.deviceType; if (evt is NavigationMoveEvent nme) { navigationDirection = nme.direction; } } }