Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

useZoomEvents.ts 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React, { useEffect, useRef } from 'react'
  2. import state from 'state'
  3. import inputs from 'state/inputs'
  4. import * as vec from 'utils/vec'
  5. import { useGesture } from 'react-use-gesture'
  6. import {
  7. fastBrushSelect,
  8. fastPanUpdate,
  9. fastPinchCamera,
  10. fastZoomUpdate,
  11. } from 'state/hacks'
  12. /**
  13. * Capture zoom gestures (pinches, wheels and pans) and send to the state.
  14. * @param ref
  15. * @returns
  16. */
  17. export default function useZoomEvents() {
  18. const rPinchDa = useRef<number[] | undefined>(undefined)
  19. const rPinchPoint = useRef<number[] | undefined>(undefined)
  20. useGesture(
  21. {
  22. onWheel: ({ event, delta }) => {
  23. if (event.ctrlKey) {
  24. const { point } = inputs.wheel(event as WheelEvent)
  25. fastZoomUpdate(point, delta[1])
  26. // state.send('ZOOMED_CAMERA', {
  27. // delta: delta[1],
  28. // ...inputs.wheel(event as WheelEvent),
  29. // })
  30. return
  31. }
  32. if (state.isIn('pointing')) {
  33. fastPanUpdate(delta)
  34. return
  35. }
  36. state.send('PANNED_CAMERA', {
  37. delta,
  38. ...inputs.wheel(event as WheelEvent),
  39. })
  40. },
  41. onPinch: ({ pinching, da, origin }) => {
  42. if (!pinching) {
  43. state.send('STOPPED_PINCHING')
  44. rPinchDa.current = undefined
  45. rPinchPoint.current = undefined
  46. return
  47. }
  48. if (rPinchPoint.current === undefined) {
  49. state.send('STARTED_PINCHING')
  50. rPinchDa.current = da
  51. rPinchPoint.current = origin
  52. }
  53. const [distanceDelta, angleDelta] = vec.sub(rPinchDa.current, da)
  54. fastPinchCamera(
  55. origin,
  56. vec.sub(rPinchPoint.current, origin),
  57. distanceDelta,
  58. angleDelta
  59. )
  60. // state.send('PINCHED', {
  61. // delta: vec.sub(rPinchPoint.current, origin),
  62. // point: origin,
  63. // distanceDelta,
  64. // angleDelta,
  65. // })
  66. rPinchDa.current = da
  67. rPinchPoint.current = origin
  68. },
  69. },
  70. {
  71. domTarget: document.body,
  72. eventOptions: { passive: false },
  73. }
  74. )
  75. }