private void UpdatePicking() { if (Input.GetKeyDown(KeyCode.P)) { enablePicking = !enablePicking; } if (enablePicking && hasFocus && !MouseNavBase.MouseOnUI()) { if (Input.GetMouseButtonDown(0)) { lastMouse = Input.mousePosition; mouseIntegral = Vector3.zero; } else if (Input.GetMouseButton(0) && lastMouse.HasValue) { var mouseDiff = Input.mousePosition - lastMouse.Value; mouseIntegral.x += Mathf.Abs(mouseDiff.x); mouseIntegral.y += Mathf.Abs(mouseDiff.y); lastMouse = Input.mousePosition; } else if (lastMouse.HasValue && mouseIntegral == Vector2.zero) { OnClick(Input.mousePosition); lastMouse = null; } } else { lastMouse = null; } //scale pointer to pointerRadiusPixels if (pointerActive) { var cam = Camera.main.transform; var w2cScale = cam.worldToLocalMatrix.lossyScale; var minScale = Mathf.Min(w2cScale.x, w2cScale.y, w2cScale.z); var vfov = Camera.main.fieldOfView * Mathf.Deg2Rad; var hfov = vfov * Camera.main.aspect; var maxRadPerPixel = Mathf.Max(vfov / Screen.height, hfov / Screen.width); pointer.transform.localScale = (1.0f / minScale) * Vector3.one * Vector3.Distance(pointer.transform.position, cam.position) * Mathf.Tan(pointerRadiusPixels * maxRadPerPixel); } }
private void UpdateNav() { MouseNavBase activeNav = null; if (mouseFly != null && mouseFly.enabled) { activeNav = mouseFly; builder.Append("\nfly navigation"); if (mouseOrbit != null) { builder.Append(", press n to switch to orbit"); } builder.Append("\nw/s/a/d/q/e to translate fwd/back/left/right/up/down"); } else if (mouseOrbit != null && mouseOrbit.enabled) { activeNav = mouseOrbit; builder.Append("\norbit navigation"); if (mouseFly != null) { builder.Append(", press n to switch to fly"); } builder.Append("\npress c to rotate about "); builder.Append(pointerActive ? "pick point" : "centroid"); } if (activeNav != null) { builder.Append("\ndrag mouse to rotate"); builder.Append("\nmouse wheel to scale"); if (activeNav.scaleModifier != MouseNavBase.Modifier.None) { builder.Append(" (or " + activeNav.scaleModifier + "-drag)"); } builder.Append("\nright mouse to roll"); if (activeNav.rollModifier != MouseNavBase.Modifier.None) { builder.Append(" (or " + activeNav.rollModifier + "-drag)"); } if (activeNav.accelModifier != MouseNavBase.Modifier.None) { builder.Append("\npress " + activeNav.accelModifier + " to move faster"); } } //toggle nav mode if (mouseFly != null && mouseOrbit != null && Input.GetKeyDown(KeyCode.N)) { mouseFly.enabled = !mouseFly.enabled; mouseOrbit.enabled = !mouseOrbit.enabled; if (mouseOrbit.enabled && resetOrbitPivotOnNavChange) { if (Physics.Raycast(Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2)), out RaycastHit hit)) { mouseOrbit.pivot = hit.point; } else if (tileset && tileset.Ready()) { mouseOrbit.pivot = tileset.transform.TransformPoint(tileset.BoundingSphere().position); } } } //set orbit nav pivot if (activeNav != null && activeNav == mouseOrbit && Input.GetKeyDown(KeyCode.C)) { if (pointerActive) { mouseOrbit.pivot = pointer.transform.position; } else if (tileset && tileset.Ready()) { mouseOrbit.pivot = tileset.transform.TransformPoint(tileset.BoundingSphere().position); } } }
private void UpdateNav() { MouseNavBase activeNav = null; if (mouseFly != null && mouseFly.enabled) { activeNav = mouseFly; builder.Append("\nfly navigation"); if (mouseOrbit != null) { builder.Append(", press n to switch to orbit"); } builder.Append("\nw/s/a/d/q/e to translate fwd/back/left/right/up/down"); } else if (mouseOrbit != null && mouseOrbit.enabled) { activeNav = mouseOrbit; builder.Append("\norbit navigation"); if (mouseFly != null) { builder.Append(", press n to switch to fly"); } builder.Append("\npress c to rotate about "); builder.Append(pointerActive ? "pick point" : "centroid"); } if (activeNav != null) { builder.Append("\ndrag mouse to rotate"); builder.Append("\nmouse wheel to scale"); if (activeNav.scaleModifier != MouseNavBase.Modifier.None) { builder.Append(" (or " + activeNav.scaleModifier + "-drag)"); } if (!activeNav.lockRoll) { builder.Append("\nright mouse to roll"); if (activeNav.rollModifier != MouseNavBase.Modifier.None) { builder.Append(" (or " + activeNav.rollModifier + "-drag)"); } builder.Append(", press l to lock"); } else { builder.Append("\nroll locked, press l to unlock"); } if (activeNav.accelModifier != MouseNavBase.Modifier.None) { builder.Append("\npress " + activeNav.accelModifier + " to move faster"); } if (Input.GetKeyDown(KeyCode.L)) { activeNav.lockRoll = !activeNav.lockRoll; } } //toggle nav mode if (mouseFly != null && mouseOrbit != null && Input.GetKeyDown(KeyCode.N)) { mouseFly.enabled = !mouseFly.enabled; mouseOrbit.enabled = !mouseOrbit.enabled; if (mouseOrbit.enabled && resetOrbitPivotOnNavChange) { if (Physics.Raycast(Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2)), out RaycastHit hit)) { mouseOrbit.pivot = hit.point; } else if (tileset && tileset.Ready()) { mouseOrbit.pivot = tileset.transform.TransformPoint(NonSkyBounds().position); } } } //set orbit nav pivot if (activeNav != null && activeNav == mouseOrbit && Input.GetKeyDown(KeyCode.C)) { if (pointerActive) { mouseOrbit.pivot = pointer.transform.position; } else if (tileset && tileset.Ready()) { mouseOrbit.pivot = tileset.transform.TransformPoint(NonSkyBounds().position); } } //tweak trans speed float ts = mouseFly != null ? mouseFly.transSpeed : mouseOrbit != null ? mouseOrbit.transSpeed : -1; if (ts >= 0) { builder.Append($"\ntrans speed {ts:f5} press [ slower, ] faster"); float transAdj = 0.0001f; if (Input.GetKey(KeyCode.LeftBracket)) { if (mouseOrbit != null) { mouseOrbit.transSpeed = (float)Math.Max(0.001, mouseOrbit.transSpeed - transAdj); } if (mouseFly != null) { mouseFly.transSpeed = (float)Math.Max(0.001, mouseFly.transSpeed - transAdj); } } if (Input.GetKey(KeyCode.RightBracket)) { if (mouseOrbit != null) { mouseOrbit.transSpeed = mouseOrbit.transSpeed + transAdj; } if (mouseFly != null) { mouseFly.transSpeed = mouseFly.transSpeed + transAdj; } } } }