{"version":3,"file":"Viewshed.mjs","sources":["../../../../../packages/shared/analyses/Viewshed.ts"],"sourcesContent":["/*\n * @Author: zouyaoji@https://github.com/zouyaoji\n * @Date: 2022-04-16 18:52:39\n * @LastEditTime: 2022-05-14 22:42:17\n * @LastEditors: zouyaoji\n * @Description:\n * @FilePath: \\vue-cesium@next\\packages\\shared\\analyses\\Viewshed.ts\n */\n\nimport { VcViewshedOpts } from 'casc-cesium-utils/drawing-types'\nimport { DebugCameraPrimitive } from '../src'\n\nclass Viewshed {\n  _scene: Cesium.Scene\n  _frustum: Cesium.PerspectiveFrustum\n  _spotLightCamera: Cesium.Camera\n  _viewshedShadowMap: Cesium.ShadowMap\n  _debugCameraPrimitive: DebugCameraPrimitive\n  _enabledChangedEvent: Cesium.Event\n  _position: Cesium.Cartesian3\n  _offsetHeight: number\n  _visibleColor: Cesium.Color\n  _invisibleColor: Cesium.Color\n  _showGridLine: boolean\n  _fovH: number\n  _fovV: number\n  constructor(scene: Cesium.Scene, options?: VcViewshedOpts) {\n    const {\n      defined,\n      DeveloperError,\n      PerspectiveFrustum,\n      Math: CesiumMath,\n      Camera,\n      ShadowMap,\n      ShadowMode,\n      Event,\n      Cartesian3,\n      defaultValue,\n      Color\n    } = Cesium\n    if (!defined(scene)) {\n      throw new DeveloperError('scene is required.')\n    }\n    this._scene = scene\n    this._frustum = new PerspectiveFrustum()\n    this._frustum.fov = CesiumMath.PI / 3\n    this._frustum.aspectRatio = 3\n    this._frustum.near = 1\n    this._frustum.far = 400\n    this._spotLightCamera = new Camera(this._scene)\n    this._frustum.clone(this._spotLightCamera.frustum as Cesium.PerspectiveFrustum)\n    this._viewshedShadowMap = new ShadowMap({\n      context: (this._scene as any).context,\n      lightCamera: this._spotLightCamera,\n      cascadesEnabled: !1\n    } as any)\n    options = options || {}\n    this._scene.globe.shadows = ShadowMode.ENABLED\n    ;(this._viewshedShadowMap as any)._terrainBias.depthBias = 0\n    this._debugCameraPrimitive = new DebugCameraPrimitive({})\n    this._enabledChangedEvent = new Event()\n    this._position = new Cartesian3()\n    this._offsetHeight = defaultValue(options.offsetHeight, 1.8)\n    this._visibleColor = defaultValue(options.visibleColor, new Color(0, 1, 0, 1))\n    this._invisibleColor = defaultValue(options.invisibleColor, new Color(1, 0, 0, 1))\n    ;(this._viewshedShadowMap as any)._viewshedColors = {\n      visible: this._visibleColor,\n      invisible: this._invisibleColor\n    }\n    this._showGridLine = options.showGridLine\n    this._debugCameraPrimitive.show = this._showGridLine\n    this._debugCameraPrimitive.lineColor = defaultValue(options.lineColor, new Color(1, 1, 1, 0.4))\n    this._debugCameraPrimitive.faceColor = defaultValue(options.faceColor, new Color(1, 1, 1, 0.1))\n  }\n\n  get frustum() {\n    return this._frustum\n  }\n\n  get fovH() {\n    return this._fovH\n  }\n  set fovH(e) {\n    if (isNaN(e) || void 0 === e || null == e || e < 0 || e >= Math.PI) {\n      throw new Error('fovH must be in the range [0, PI).')\n    }\n    this._fovH = Number(e)\n    this.frustum.aspectRatio = Math.tan(0.5 * this._fovH) / Math.tan(0.5 * this._fovV)\n    this.frustum.fov = this._fovH > this._fovV ? this._fovH : this._fovV\n  }\n\n  get fovV() {\n    return this._fovV\n  }\n  set fovV(e) {\n    if (isNaN(e) || void 0 === e || null == e || e < 0 || e >= Math.PI) {\n      throw new Error('fovV must be in the range [0, PI).')\n    }\n\n    this._fovV = Number(e)\n    this.frustum.aspectRatio = Math.tan(0.5 * this._fovH) / Math.tan(0.5 * this._fovV)\n    this.frustum.fov = this._fovH > this._fovV ? this._fovH : this._fovV\n  }\n\n  get near() {\n    return this.frustum.near\n  }\n  set near(e) {\n    this.frustum.near !== e && (this.frustum.near = e)\n  }\n\n  get far() {\n    return this.far.near\n  }\n  set far(e) {\n    this.frustum.far !== e && (this.frustum.far = e)\n  }\n\n  get position() {\n    return this._position\n  }\n  set position(e) {\n    if (e instanceof Cesium.Cartesian3) {\n      this.setView({\n        destination: e.clone(),\n        orientation: {\n          heading: this._spotLightCamera.heading,\n          pitch: this._spotLightCamera.pitch,\n          roll: this._spotLightCamera.roll\n        }\n      })\n    }\n  }\n\n  get offsetHeight() {\n    return this._offsetHeight\n  }\n  set offsetHeight(e) {\n    if (isNaN(e) || null == e || null == e) {\n      throw new Error('Unacceptable offset.')\n    }\n\n    this._offsetHeight = Number(e)\n    this.setView({\n      destination: this._position,\n      orientation: {\n        heading: this._spotLightCamera.heading,\n        pitch: this._spotLightCamera.pitch,\n        roll: this._spotLightCamera.roll\n      }\n    })\n  }\n\n  get heading() {\n    return this._spotLightCamera.heading\n  }\n  set heading(e) {\n    this._spotLightCamera.heading !== e &&\n      this._spotLightCamera.setView({\n        destination: this._spotLightCamera.positionWC,\n        orientation: {\n          heading: e,\n          pitch: this._spotLightCamera.pitch,\n          roll: this._spotLightCamera.roll\n        }\n      })\n  }\n\n  get pitch() {\n    return this._spotLightCamera.pitch\n  }\n  set pitch(e) {\n    this._spotLightCamera.pitch !== e &&\n      this._spotLightCamera.setView({\n        destination: this._spotLightCamera.positionWC,\n        orientation: {\n          heading: this._spotLightCamera.heading,\n          pitch: e,\n          roll: this._spotLightCamera.roll\n        }\n      })\n  }\n\n  get roll() {\n    return this._spotLightCamera.roll\n  }\n  set roll(e) {\n    this._spotLightCamera.roll !== e &&\n      this._spotLightCamera.setView({\n        destination: this._spotLightCamera.positionWC,\n        orientation: {\n          heading: this._spotLightCamera.heading,\n          pitch: this._spotLightCamera.pitch,\n          roll: e\n        }\n      })\n  }\n\n  get shadowMap() {\n    return this._viewshedShadowMap\n  }\n\n  get lightCamera() {\n    return this._spotLightCamera\n  }\n\n  get enabled() {\n    return this._viewshedShadowMap.enabled\n  }\n  set enabled(e) {\n    if (this._viewshedShadowMap.enabled !== e) {\n      if (e) {\n        // this._debugCameraPrimitive.show = true\n        this._viewshedShadowMap.enabled = true\n        this._viewshedShadowMap._pointLightRadius = this._spotLightCamera.frustum.far\n      } else {\n        // this._debugCameraPrimitive.show = false\n        this._viewshedShadowMap.enabled = false\n      }\n      this._enabledChangedEvent.raiseEvent(e)\n    }\n  }\n\n  get enabledChangedEvent() {\n    return this._enabledChangedEvent\n  }\n\n  get visibleColor() {\n    return this._visibleColor\n  }\n  set visibleColor(e: Cesium.Color) {\n    this._visibleColor = e\n    ;(this._viewshedShadowMap as any)._viewshedColors.visible = e\n  }\n\n  get invisibleColor() {\n    return this._invisibleColor\n  }\n  set invisibleColor(e: Cesium.Color) {\n    this._invisibleColor = e\n    ;(this._viewshedShadowMap as any)._viewshedColors.invisible = e\n  }\n\n  get showGridLine() {\n    return this._showGridLine\n  }\n  set showGridLine(e) {\n    this._showGridLine = e\n    this._debugCameraPrimitive.show = e\n  }\n\n  get faceColor() {\n    return this._debugCameraPrimitive.faceColor\n  }\n  set faceColor(e) {\n    this._debugCameraPrimitive.faceColor = e\n  }\n\n  get lineColor() {\n    return this._debugCameraPrimitive.lineColor\n  }\n  set lineColor(e) {\n    this._debugCameraPrimitive.lineColor = e\n  }\n\n  update(frameState) {\n    if (this._viewshedShadowMap.enabled) {\n      const { ShadowMode, Matrix3, Matrix4, Math: CesiumMath } = Cesium\n      this._scene.globe.shadows !== ShadowMode.ENABLED && (this._scene.globe.shadows = ShadowMode.ENABLED)\n      frameState.shadowMaps.unshift(this._viewshedShadowMap)\n      if (!this._frustum.equals(this._spotLightCamera.frustum as Cesium.PerspectiveFrustum)) {\n        this._frustum.clone(this._spotLightCamera.frustum as Cesium.PerspectiveFrustum)\n        this._viewshedShadowMap._pointLightRadius = this._frustum.far\n        ;(this.shadowMap as any)._boundingSphere.radius = Math.random()\n      }\n\n      if (this._debugCameraPrimitive.show) {\n        const modelMatrix = this._debugCameraPrimitive.modelMatrix\n        Matrix4.clone(this._spotLightCamera.inverseViewMatrix, modelMatrix)\n        const r0 = Matrix3.fromRotationZ(0.5 * CesiumMath.PI)\n        const r1 = Matrix3.fromRotationY(0.5 * CesiumMath.PI)\n        const rotation = new Matrix3()\n        Matrix3.multiply(r0, r1, rotation)\n        Matrix4.multiplyByMatrix3(modelMatrix, rotation, modelMatrix)\n        Matrix4.multiplyByUniformScale(modelMatrix, this._spotLightCamera.frustum.far, modelMatrix)\n        const frustum = this._spotLightCamera.frustum as Cesium.PerspectiveFrustum\n        this._debugCameraPrimitive.fovV = frustum.aspectRatio <= 1 ? frustum.fov : 2 * Math.atan(Math.tan(0.5 * frustum.fov) / frustum.aspectRatio)\n        this._debugCameraPrimitive.fovH = 1 < frustum.aspectRatio ? frustum.fov : 2 * Math.atan(Math.tan(0.5 * frustum.fov) * frustum.aspectRatio)\n        this._debugCameraPrimitive.segmentH = parseInt(String(this._debugCameraPrimitive.fovH / (Math.PI / 30))) || 1\n        this._debugCameraPrimitive.segmentV = parseInt(String(this._debugCameraPrimitive.fovV / (Math.PI / 30))) || 1\n        this._debugCameraPrimitive.update(frameState)\n      }\n    }\n  }\n\n  setView(options) {\n    options = options || {}\n    const destination = options.destination\n    if (destination instanceof Cesium.Cartesian3) {\n      this._position = destination.clone()\n      const offsetHeight = this._offsetHeight\n      const cartographic = Cesium.Cartographic.fromCartesian(destination, this._scene.globe.ellipsoid)\n      if (cartographic) {\n        cartographic.height = cartographic.height + offsetHeight\n        const cartesian = Cesium.Cartesian3.fromRadians(\n          cartographic.longitude,\n          cartographic.latitude,\n          cartographic.height,\n          this._scene.globe.ellipsoid\n        )\n        options.destination = cartesian\n      }\n    }\n\n    this._spotLightCamera.setView(options)\n  }\n\n  isDestroyed() {\n    return false\n  }\n\n  destroy() {\n    this._debugCameraPrimitive && this._debugCameraPrimitive.destroy()\n    this._viewshedShadowMap && this._viewshedShadowMap.destroy()\n    Cesium.destroyObject(this)\n  }\n}\n\nexport default Viewshed\n"],"names":[],"mappings":"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"}