{"version":3,"file":"use-zoom-control.mjs","sources":["../../../../../../packages/components/controls/zoom-control/use-zoom-control.ts"],"sourcesContent":["import type { VcCamera, VcComponentInternalInstance, VcViewerProvider } from 'casc-cesium-utils/types'\nimport { flyToCamera, heightToLevel } from 'casc-cesium-utils/cesium-helpers'\nimport { $, getInstanceListener } from 'casc-cesium-utils/private/vm'\nimport { ref } from 'vue'\nimport type { VcTooltipRef } from 'casc-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":";;;;AAGe,uBAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;AAChE,EAAE,MAAM,gBAAgB,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,EAAE,MAAM,iBAAiB,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,EAAE,MAAM,eAAe,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK;AACxB,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAClC,GAAG,CAAC;AACJ,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK;AACzB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC9B,GAAG,CAAC;AACJ,EAAE,MAAM,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC,KAAK;AACtC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC;AACf,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;AAC5D,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7D,IAAI,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;AAC9E,IAAI,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AACjC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACjC,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC,2BAA2B,CAAC;AACrD,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAClD,QAAQ,OAAO;AACf,OAAO;AACP,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AAC3E,QAAQ,OAAO;AACf,OAAO;AACP,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AAClC,MAAM,IAAI,WAAW,CAAC;AACtB,MAAM,QAAQ,KAAK,CAAC,IAAI;AACxB,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE;AACjC,UAAU,MAAM;AAChB,SAAS;AACT,QAAQ,KAAK,SAAS,CAAC,OAAO,EAAE;AAChC,UAAU,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;AACnF,UAAU,MAAM;AAChB,SAAS;AACT,QAAQ,SAAS;AACjB,UAAU,IAAI,KAAK,CAAC;AACpB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AAC7C,YAAY,KAAK,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;AAC5C,WAAW,MAAM;AACjB,YAAY,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjD,WAAW;AACX,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACtC,YAAY,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;AACtK,YAAY,KAAK,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1F,YAAY,WAAW,GAAG;AAC1B,cAAc,OAAO,EAAE,MAAM,CAAC,OAAO;AACrC,cAAc,KAAK,EAAE,MAAM,CAAC,KAAK;AACjC,cAAc,IAAI,EAAE,MAAM,CAAC,IAAI;AAC/B,aAAa,CAAC;AACd,WAAW,MAAM;AACjB,YAAY,WAAW,GAAG;AAC1B,cAAc,SAAS,EAAE,MAAM,CAAC,SAAS;AACzC,cAAc,EAAE,EAAE,MAAM,CAAC,EAAE;AAC3B,aAAa,CAAC;AACd,WAAW;AACX,UAAU,MAAM,iBAAiB,GAAG,IAAI,UAAU,EAAE,CAAC;AACrD,UAAU,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;AAC3F,UAAU,MAAM,cAAc,GAAG,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;AACnG,UAAU,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AAC3E,UAAU,MAAM,IAAI,GAAG,cAAc,GAAG,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;AACjE,UAAU,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,CAAC;AACzC,UAAU,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACrF,UAAU,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACtE,UAAU,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AACtC,YAAY,IAAI;AAChB,YAAY,MAAM,EAAE,MAAM,CAAC,MAAM;AACjC,YAAY,MAAM,EAAE,OAAO;AAC3B,YAAY,MAAM;AAClB,YAAY,KAAK;AACjB,WAAW,CAAC,CAAC;AACb,UAAU,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,aAAa,EAAE;AAC9F,YAAY,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;AAC1C,WAAW,MAAM;AACjB,YAAY,MAAM,CAAC,KAAK,CAAC;AACzB,cAAc,WAAW,EAAE,WAAW;AACtC,cAAc,WAAW;AACzB,cAAc,QAAQ,EAAE,KAAK,CAAC,QAAQ;AACtC,cAAc,OAAO,EAAE,KAAK;AAC5B,cAAc,QAAQ,EAAE,MAAM;AAC9B,gBAAgB,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAC5C,kBAAkB,IAAI;AACtB,kBAAkB,MAAM,EAAE,MAAM,CAAC,MAAM;AACvC,kBAAkB,MAAM,EAAE,KAAK;AAC/B,kBAAkB,MAAM;AACxB,kBAAkB,KAAK;AACvB,iBAAiB,CAAC,CAAC;AACnB,eAAe;AACf,cAAc,MAAM,EAAE,MAAM;AAC5B,gBAAgB,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAC5C,kBAAkB,IAAI;AACtB,kBAAkB,MAAM,EAAE,MAAM,CAAC,MAAM;AACvC,kBAAkB,MAAM,EAAE,QAAQ;AAClC,kBAAkB,MAAM;AACxB,kBAAkB,KAAK;AACvB,iBAAiB,CAAC,CAAC;AACnB,eAAe;AACf,aAAa,CAAC,CAAC;AACf,WAAW;AACX,SAAS;AACT,OAAO;AACP,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK;AAC3B,IAAI,IAAI,EAAE,CAAC;AACX,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;AAC3D,IAAI,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;AACjC,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/B,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,2BAA2B,CAAC;AACnD,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAC5B,MAAM,OAAO;AACb,KAAK;AACL,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;AAC9C,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACjD,MAAM,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC;AACpC,MAAM,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;AAC3C,KAAK,MAAM;AACX,MAAM,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,CAAC;AACrC,MAAM,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxF,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAClC,QAAQ,IAAI,EAAE,WAAW;AACzB,QAAQ,MAAM,EAAE,MAAM,CAAC,MAAM;AAC7B,QAAQ,MAAM,EAAE,OAAO;AACvB,QAAQ,MAAM;AACd,QAAQ,KAAK;AACb,OAAO,CAAC,CAAC;AACT,MAAM,MAAM,QAAQ,GAAG,MAAM;AAC7B,QAAQ,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AACpC,UAAU,IAAI,EAAE,WAAW;AAC3B,UAAU,MAAM,EAAE,MAAM,CAAC,MAAM;AAC/B,UAAU,MAAM,EAAE,KAAK;AACvB,UAAU,MAAM;AAChB,UAAU,KAAK;AACf,SAAS,CAAC,CAAC;AACX,OAAO,CAAC;AACR,MAAM,MAAM,MAAM,GAAG,MAAM;AAC3B,QAAQ,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AACpC,UAAU,IAAI,EAAE,WAAW;AAC3B,UAAU,MAAM,EAAE,MAAM,CAAC,MAAM;AAC/B,UAAU,MAAM,EAAE,QAAQ;AAC1B,UAAU,MAAM;AAChB,UAAU,KAAK;AACf,SAAS,CAAC,CAAC;AACX,OAAO,CAAC;AACR,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC;AAC/C,MAAM,MAAM,OAAO,GAAG;AACtB,QAAQ,QAAQ,EAAE,KAAK,CAAC,aAAa;AACrC,QAAQ,QAAQ;AAChB,QAAQ,MAAM;AACd,OAAO,CAAC;AACR,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAC9C,KAAK;AACL,GAAG,CAAC;AACJ,EAAE,MAAM,cAAc,GAAG,CAAC,KAAK,KAAK;AACpC,IAAI,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AACvD,IAAI,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3E,IAAI,MAAM,aAAa,GAAG,iBAAiB,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACrF,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE;AAChC,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AACpD,KAAK;AACL,IAAI,OAAO,iBAAiB,CAAC,uBAAuB,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACjF,GAAG,CAAC;AACJ,EAAE,OAAO;AACT,IAAI,MAAM;AACV,IAAI,OAAO;AACX,IAAI,SAAS;AACb,IAAI,gBAAgB;AACpB,IAAI,iBAAiB;AACrB,IAAI,eAAe;AACnB,GAAG,CAAC;AACJ;;;;"}