{"version":3,"file":"use-zoom-control.mjs","sources":["../../../../../../packages/components/controls/zoom-control/use-zoom-control.ts"],"sourcesContent":["import type { VcCamera, VcComponentInternalInstance, VcViewerProvider } from '@vue-cesium/utils/types'\nimport { flyToCamera, heightToLevel } from '@vue-cesium/utils/cesium-helpers'\nimport { $, getInstanceListener } from '@vue-cesium/utils/private/vm'\nimport { ref } from 'vue'\nimport type { VcTooltipRef } from '@vue-cesium/components/ui'\n\nexport default function (props, { emit }, vcInstance: VcComponentInternalInstance, $services: VcViewerProvider) {\n  // state\n  const zoomInTooltipRef = ref<VcTooltipRef>(null)\n  const zoomOutTooltipRef = ref<VcTooltipRef>(null)\n  const resetTooltipRef = ref<VcTooltipRef>(null)\n\n  const zoomIn = e => {\n    zoom(1 / props.zoomAmount, e)\n  }\n\n  const zoomOut = e => {\n    zoom(props.zoomAmount, e)\n  }\n\n  const zoom = (relativeAmount, e) => {\n    $(zoomInTooltipRef)?.hide()\n    $(zoomOutTooltipRef)?.hide()\n\n    const { Cartesian3, defined, IntersectionTests, Ray, SceneMode } = Cesium\n    const { viewer } = $services\n    if (defined(viewer)) {\n      const scene = viewer.scene\n      const sscc = scene.screenSpaceCameraController\n      // do not zoom if it is disabled\n      if (!sscc.enableInputs || !sscc.enableZoom) {\n        return\n      }\n      // TODO\n      if (scene.mode === SceneMode.COLUMBUS_VIEW && !sscc.enableTranslate) {\n        return\n      }\n\n      const camera = scene.camera\n      let orientation\n\n      switch (scene.mode) {\n        case SceneMode.MORPHING: {\n          break\n        }\n        case SceneMode.SCENE2D: {\n          camera.zoomIn(camera.positionCartographic.height * (1 - relativeAmount))\n          break\n        }\n        default: {\n          let focus\n\n          if (defined(viewer.trackedEntity)) {\n            focus = new Cesium.Cartesian3()\n          } else {\n            focus = getCameraFocus(viewer.scene)\n          }\n\n          if (!Cesium.defined(focus)) {\n            // Camera direction is not pointing at the globe, so use the ellipsoid horizon point as\n            // the focal point.\n            const ray = new Ray(\n              camera.worldToCameraCoordinatesPoint(scene.globe.ellipsoid.cartographicToCartesian(camera.positionCartographic)),\n              camera.directionWC\n            )\n            focus = IntersectionTests.grazingAltitudeLocation(ray, scene.globe.ellipsoid)\n\n            orientation = {\n              heading: camera.heading,\n              pitch: camera.pitch,\n              roll: camera.roll\n            }\n          } else {\n            orientation = {\n              direction: camera.direction,\n              up: camera.up\n            }\n          }\n          const cartesian3Scratch = new Cartesian3()\n          const direction = Cartesian3.subtract(camera.position, focus, cartesian3Scratch)\n          const movementVector = Cartesian3.multiplyByScalar(direction, relativeAmount, direction)\n          const endPosition = Cartesian3.add(focus, movementVector, focus)\n          const type = relativeAmount < 1 ? 'zoomIn' : 'zoomOut'\n          const target = e.currentTarget\n          const level = heightToLevel(camera.positionCartographic.height).toFixed(0)\n          const listener = getInstanceListener(vcInstance, 'zoomEvt')\n          listener &&\n            emit('zoomEvt', {\n              type: type,\n              camera: viewer.camera,\n              status: 'start',\n              target: target,\n              level\n            })\n          if (Cesium.defined(viewer.trackedEntity) || scene.mode === SceneMode.COLUMBUS_VIEW) {\n            // sometimes flyTo does not work (jumps to wrong position) so just set the position without any animation\n            // do not use flyTo when tracking an entity because during animatiuon the position of the entity may change\n            camera.position = endPosition\n          } else {\n            camera.flyTo({\n              destination: endPosition,\n              orientation: orientation,\n              duration: props.duration,\n              convert: false,\n              complete: () => {\n                listener &&\n                  emit('zoomEvt', {\n                    type: type,\n                    camera: viewer.camera,\n                    status: 'end',\n                    target,\n                    level\n                  })\n              },\n              cancel: () => {\n                listener &&\n                  emit('zoomEvt', {\n                    type: type,\n                    camera: viewer.camera,\n                    status: 'cancel',\n                    target,\n                    level\n                  })\n              }\n            })\n          }\n        }\n      }\n    }\n  }\n\n  const zoomReset = e => {\n    $(resetTooltipRef)?.hide()\n    const { viewer } = $services\n    const scene = viewer.scene\n    const sscc = scene.screenSpaceCameraController\n    if (!sscc.enableInputs) {\n      return\n    }\n\n    if (Cesium.defined(viewer.trackedEntity)) {\n      // when tracking do not reset to default view but to default view of tracked entity\n      const trackedEntity = viewer.trackedEntity\n      viewer.trackedEntity = undefined\n      viewer.trackedEntity = trackedEntity\n    } else {\n      const listener = getInstanceListener(vcInstance, 'zoomEvt')\n      const target = e.currentTarget\n      const level = heightToLevel(viewer.camera.positionCartographic.height).toFixed(0)\n      // reset to a default position or view defined in the options\n      listener &&\n        emit('zoomEvt', {\n          type: 'zoomReset',\n          camera: viewer.camera,\n          status: 'start',\n          target,\n          level\n        })\n\n      const complete = () => {\n        listener &&\n          emit('zoomEvt', {\n            type: 'zoomReset',\n            camera: viewer.camera,\n            status: 'end',\n            target,\n            level\n          })\n      }\n      const cancel = () => {\n        listener &&\n          emit('zoomEvt', {\n            type: 'zoomReset',\n            camera: viewer.camera,\n            status: 'cancel',\n            target,\n            level\n          })\n      }\n\n      const resetView: VcCamera = props.defaultResetView\n      const options = {\n        duration: props.durationReset,\n        complete: complete,\n        cancel: cancel\n      }\n      flyToCamera(viewer, resetView, options)\n    }\n  }\n\n  const getCameraFocus = (scene: Cesium.Scene) => {\n    const { defined, IntersectionTests, Ray } = Cesium\n    const ray = new Ray(scene.camera.positionWC, scene.camera.directionWC)\n    const intersections = IntersectionTests.rayEllipsoid(ray, scene.globe.ellipsoid)\n    if (defined(intersections)) {\n      return Ray.getPoint(ray, intersections.start)\n    }\n    // Camera direction is not pointing at the globe, so use the ellipsoid horizon point as\n    // the focal point.\n    return IntersectionTests.grazingAltitudeLocation(ray, scene.globe.ellipsoid)\n  }\n\n  return {\n    zoomIn,\n    zoomOut,\n    zoomReset,\n    zoomInTooltipRef,\n    zoomOutTooltipRef,\n    resetTooltipRef\n  }\n}\n"],"names":[],"mappings":"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"}