{"version":3,"file":"CustomThreeLayer.mjs","sources":["../../../../packages/ThreeLayer/CustomThreeLayer.ts"],"sourcesContent":["import {\r\n  AmbientLight,\r\n  DirectionalLight,\r\n  HemisphereLight,\r\n  PointLight,\r\n  RectAreaLight,\r\n  SpotLight,\r\n  PMREMGenerator,\r\n  sRGBEncoding,\r\n  LinearFilter,\r\n  Vector2,\r\n  AxesHelper,\r\n  Raycaster,\r\n  Clock\r\n} from \"three\";\r\nimport { merge, bind } from \"lodash-es\";\r\nimport { HDRCubeTextureLoader } from \"three/examples/jsm/loaders/HDRCubeTextureLoader.js\";\r\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer.js\";\r\nimport { ThreeLayer } from \"@vuemap/three-layer\";\r\nimport { CSS2DRenderer } from \"./CSS2DRenderer\";\r\nimport { CSS3DRenderer } from \"./CSS3DRenderer\";\r\nimport type { Texture, Camera, WebGLRenderer, Scene, Object3D , PerspectiveCamera} from \"three\";\r\nimport type { HDROptions, LightOption } from \"./Type\";\r\nimport type { ThreeLayerOptions } from \"@vuemap/three-layer\";\r\n\r\ninterface Options extends ThreeLayerOptions {\r\n  lights?: LightOption[]; // 灯光数组\r\n  hdr?: HDROptions; // 开启HDR配置\r\n  axesHelper: boolean; // 是否开启箭头，用于debug，默认不开启\r\n  createCssRender: boolean; //是否创建CSSRender\r\n}\r\n\r\nclass CustomThreeLayer extends ThreeLayer {\r\n  lightTypes = {\r\n    AmbientLight, // 环境光  环境光会均匀的照亮场景中的所有物体\r\n    DirectionalLight, // 平行光  平行光是沿着特定方向发射的光\r\n    HemisphereLight, // 半球光  光源直接放置于场景之上，光照颜色从天空光线颜色渐变到地面光线颜色。\r\n    PointLight, // 点光源  从一个点向各个方向发射的光源。一个常见的例子是模拟一个灯泡发出的光\r\n    RectAreaLight, // 平面光光源  平面光光源从一个矩形平面上均匀地发射光线。这种光源可以用来模拟像明亮的窗户或者条状灯光光源\r\n    SpotLight, // 聚光灯  光线从一个点沿一个方向射出，随着光线照射的变远，光线圆锥体的尺寸也逐渐增大\r\n  };\r\n  raycaster: Raycaster | undefined; // 射线，用于判断点击或者鼠标移动是否碰到物体\r\n  mouse: Vector2;\r\n  envMap: any; // HDR的环境贴图\r\n  clickFun: any;\r\n  hoverFun: any;\r\n  resizeFun: any;\r\n  effectComposer?: EffectComposer;\r\n  renderPass: any;\r\n  passNum = 0;\r\n  passList = [] as any[];\r\n  clock = new Clock();\r\n  preHoverGroup = null as Object3D | null;\r\n  css2DRenderer = null as CSS2DRenderer | null;\r\n  css3DRenderer = null as CSS3DRenderer | null;\r\n\r\n  constructor (map: any, options: Options, callback: () => void) {\r\n    options.onInit = (render, scene) => {\r\n      this.raycaster = new Raycaster();\r\n      if (options.axesHelper) {\r\n        const axesHelper = new AxesHelper(10000);\r\n        scene.add(axesHelper);\r\n      }\r\n      this.renderer?.setPixelRatio(window.devicePixelRatio);\r\n      if (options.createCssRender) this.creatCssRenders(map);\r\n      this.createEffect();\r\n      this.createLights(options.lights || []);\r\n      this.createHDR(options.hdr);\r\n      this.bindEvents();\r\n      if (callback) {\r\n        callback();\r\n      }\r\n    };\r\n    options.onRender = (render, scene, camera) => {\r\n      if (this.passNum > 0) {\r\n        this.effectComposer?.render(this.clock.getDelta());\r\n      } else {\r\n        this.renderer?.render(this.scene as Scene, camera as Camera);\r\n        this.css2DRenderer?.render(this.scene as Scene, camera as Camera);\r\n        this.css3DRenderer?.render(this.scene as Scene, camera as Camera);\r\n      }\r\n    };\r\n    super(map, options);\r\n    this.mouse = new Vector2();\r\n  }\r\n\r\n  updateRendererSize (){\r\n    const container = this.map.getContainer();\r\n    const width = container.offsetWidth;\r\n    const height = container.offsetHeight;\r\n    this.renderer?.setSize(width, height);\r\n    this.css2DRenderer?.setSize(width, height);\r\n    this.css3DRenderer?.setSize(width, height);\r\n    if(this.map.getView().type === '3D'){\r\n      (this.camera as PerspectiveCamera).aspect = width / height;\r\n    }\r\n  }\r\n  \r\n  updateEffectComposerSize () {\r\n    if (this.effectComposer && this.renderer) {\r\n      const size = this.renderer.getSize(new Vector2());\r\n      this.effectComposer.setSize(size.x, size.y);\r\n      this.css2DRenderer?.setSize(size.x, size.y);\r\n      this.css3DRenderer?.setSize(size.x, size.y);\r\n    }\r\n  }\r\n\r\n  createEffect () {\r\n    const size = this.renderer?.getSize(new Vector2());\r\n    this.effectComposer = new EffectComposer(this.renderer as WebGLRenderer);\r\n    this.effectComposer.setSize(size?.x as number, size?.y as number);\r\n    this.css2DRenderer?.setSize(size?.x as number, size?.y as number);\r\n    this.css3DRenderer?.setSize(size?.x as number, size?.y as number);\r\n    // const renderPass = new ThreeRenderPass( this.scene, this.camera );\r\n    // this.renderPass = renderPass;\r\n    // this.effectComposer.addPass(renderPass);\r\n  }\r\n\r\n  creatCssRenders (map: any) {\r\n    this.css2DRenderer = new CSS2DRenderer();\r\n    this.css2DRenderer.domElement.style.position = \"absolute\";\r\n    this.css2DRenderer.domElement.style.left = \"0\";\r\n    this.css2DRenderer.domElement.style.top = \"0\";\r\n\r\n    this.css3DRenderer = new CSS3DRenderer();\r\n    this.css3DRenderer.domElement.style.position = \"absolute\";\r\n    this.css3DRenderer.domElement.style.left = \"0\";\r\n    this.css3DRenderer.domElement.style.top = \"0\";\r\n    const element = map.getContainer().querySelector(\".amap-markers\");\r\n    element.appendChild(this.css2DRenderer.domElement);\r\n    element.appendChild(this.css3DRenderer.domElement);\r\n  }\r\n\r\n  addPass (pass: any) {\r\n    this.effectComposer?.addPass(pass);\r\n    this.passNum++;\r\n    this.passList.push(pass);\r\n  }\r\n\r\n  removePass (pass: any) {\r\n    const index = this.passList.indexOf(pass);\r\n    if (index !== -1) {\r\n      this.passList.splice(index, 1);\r\n    }\r\n    this.effectComposer?.removePass(pass);\r\n    this.passNum--;\r\n  }\r\n\r\n  createLights (lights: LightOption[] | undefined) {\r\n    const defaultLightOptions = {\r\n      type: \"DirectionalLight\", // 灯光类型， 可选值见下面的字典\r\n      args: [], // 灯光初始化时需要的参数，具体参数顺序可以查看threejs官网灯光的说明。 采用 ...args 的方式进行初始化\r\n    };\r\n    if (lights && lights.length > 0) {\r\n      lights.forEach((lightOptions) => {\r\n        lightOptions = merge(\r\n          {},\r\n          defaultLightOptions,\r\n          lightOptions\r\n        ) as LightOption;\r\n        if (this.lightTypes[lightOptions.type]) {\r\n          const light = new this.lightTypes[lightOptions.type](\r\n            ...lightOptions.args\r\n          );\r\n          const position = lightOptions.position;\r\n          const lookAt = lightOptions.lookAt;\r\n          if (position) {\r\n            light.position.set(position.x, position.y, position.z);\r\n          }\r\n          if (lookAt) {\r\n            light.lookAt(lookAt.x, lookAt.y, lookAt.z);\r\n          }\r\n          this.add(light);\r\n        } else {\r\n          console.warn(\"当前设置的灯光类型不存在\");\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  createHDR (hdr: HDROptions | undefined) {\r\n    if (!hdr) {\r\n      return;\r\n    }\r\n    const options = merge(\r\n      {},\r\n      {\r\n        urls: [], // HDR贴图下载地址，需要6个文件，代表6个方向\r\n        path: \"/\", // HDR下载地址的路径前缀\r\n        // roughness: 0.0,\r\n        exposure: 1.0, // 光亮程度\r\n      },\r\n      hdr\r\n    );\r\n    const render = this.renderer as WebGLRenderer;\r\n    render.physicallyCorrectLights = true;\r\n    render.outputEncoding = sRGBEncoding;\r\n    render.toneMappingExposure = options.exposure;\r\n    const hdrUrls = options.urls;\r\n    let pmremGenerator: PMREMGenerator = new PMREMGenerator(render);\r\n    pmremGenerator.compileCubemapShader();\r\n    const hdrCubeMap = new HDRCubeTextureLoader()\r\n      .setPath(options.path)\r\n      .load(hdrUrls, () => {\r\n        const hdrCubeRenderTarget = pmremGenerator.fromCubemap(hdrCubeMap);\r\n        hdrCubeMap.magFilter = LinearFilter;\r\n        hdrCubeMap.needsUpdate = true;\r\n        this.envMap = hdrCubeRenderTarget ? hdrCubeRenderTarget.texture : null;\r\n        this.addEnvMap(this.scene);\r\n        pmremGenerator.dispose();\r\n        pmremGenerator = null as any;\r\n        this.refreshMap();\r\n      }) as any;\r\n  }\r\n\r\n  addEnvMap (object) {\r\n    this.scene!.environment = this.envMap as Texture;\r\n    /*const envMap = this.envMap;\r\n    if (!envMap || !object) {\r\n      return;\r\n    }\r\n    if (object.material && envMap) {\r\n      object.material.envMap = envMap;\r\n      // object.material.roughness = 0;\r\n      object.material.needsUpdate = true;\r\n    }\r\n    if (object.children && object.children.length > 0) {\r\n      object.children.forEach(o => {\r\n        this.addEnvMap(o);\r\n      });\r\n    }*/\r\n  }\r\n\r\n  bindEvents () {\r\n    this.clickFun = bind(this._clickEvent, this);\r\n    this.hoverFun = bind(this._hoverEvent, this);\r\n    this.resizeFun = bind(this.updateEffectComposerSize, this);\r\n    if (this.canvas) {\r\n      this.canvas.addEventListener(\"click\", this.clickFun, false);\r\n      this.canvas.addEventListener(\"mousemove\", this.hoverFun, false);\r\n    } else {\r\n      this.map.on(\"click\", this.clickFun);\r\n      this.map.on(\"mousemove\", this.hoverFun);\r\n    }\r\n    this.map.on(\"resize\", this.resizeFun);\r\n  }\r\n\r\n  ubBindEvents () {\r\n    this.map.off(\"click\", this.clickFun);\r\n    this.map.off(\"mousemove\", this.hoverFun);\r\n    this.map.on(\"off\", this.resizeFun);\r\n  }\r\n\r\n  _getOriginEvent (e: any) {\r\n    if (e.originEvent) {\r\n      return e.originEvent;\r\n    }\r\n    return e;\r\n  }\r\n\r\n  _clickEvent (e: any) {\r\n    e = this._getOriginEvent(e);\r\n    const group = this._intersectGltf(e);\r\n    if (group) {\r\n      if (group.userData.$vue) {\r\n        group.userData.$vue.$emit(\"click\", group);\r\n      }\r\n      this.emit(\"click\", group);\r\n    }\r\n  }\r\n\r\n  _hoverEvent (e: any) {\r\n    e = this._getOriginEvent(e);\r\n    const group = this._intersectGltf(e);\r\n    if (group) {\r\n      if (!group.userData.isHover) {\r\n        group.userData.isHover = true;\r\n        if (group.userData.$vue) {\r\n          group.userData.$vue.$emit(\"mouseover\", group);\r\n        } else {\r\n          this.emit(\"mouseover\", group);\r\n        }\r\n      }\r\n    }\r\n    if (this.preHoverGroup) {\r\n      if (!group || this.preHoverGroup.uuid !== group.uuid) {\r\n        if (this.preHoverGroup.userData.$vue) {\r\n          this.preHoverGroup.userData.$vue.$emit(\r\n            \"mouseout\",\r\n            this.preHoverGroup\r\n          );\r\n        } else {\r\n          this.emit(\"mouseout\", this.preHoverGroup);\r\n        }\r\n        this.preHoverGroup.userData.isHover = false;\r\n      }\r\n    }\r\n    this.preHoverGroup = group;\r\n  }\r\n\r\n  _intersectGltf (e: MouseEvent): Object3D | null {\r\n    const client = this.map.getContainer();\r\n    // 通过鼠标点击位置,计算出 raycaster 所需点的位置,以屏幕为中心点,范围 -1 到 1\r\n    const getBoundingClientRect = client.getBoundingClientRect();\r\n\r\n    // window.pageYOffset 鼠标滚动的距离\r\n    // clientTop 一个元素顶部边框的宽度\r\n    const offsetTop =\r\n      getBoundingClientRect.top + window.pageYOffset - client.clientTop;\r\n    const offsetLeft =\r\n      getBoundingClientRect.left + window.pageXOffset - client.clientLeft;\r\n    this.mouse.x =\r\n      ((e.x + window.pageXOffset - offsetLeft) / getBoundingClientRect.width) *\r\n        2 -\r\n      1;\r\n    this.mouse.y =\r\n      -((e.y + window.pageYOffset - offsetTop) / getBoundingClientRect.height) *\r\n        2 +\r\n      1;\r\n    const camera = this.camera;\r\n    this.raycaster?.setFromCamera(this.mouse, camera as Camera);\r\n    const intersects = this.raycaster?.intersectObjects(\r\n      [this.scene as Scene],\r\n      true\r\n    );\r\n    const length = intersects?.length;\r\n    if (length && length > 0) {\r\n      let group: Object3D | null = null;\r\n      for (let i = 0; i < length; i++) {\r\n        const object = intersects[i];\r\n        group = this._getGroup(object.object);\r\n        if (group !== null) {\r\n          break;\r\n        }\r\n      }\r\n      return group;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  _getGroup (object: Object3D): Object3D | null {\r\n    if (!object) {\r\n      return null;\r\n    }\r\n    if (object.userData.acceptEvent) {\r\n      return object;\r\n    }\r\n    return this._getGroup(object.parent as Object3D);\r\n  }\r\n\r\n  destroy () {\r\n    this.ubBindEvents();\r\n    if (this.envMap) {\r\n      this.envMap.dispose();\r\n      this.envMap = null;\r\n    }\r\n    this.css2DRenderer?.domElement?.remove();\r\n    this.css3DRenderer?.domElement?.remove();\r\n    super.destroy();\r\n    this.lightTypes = null as any;\r\n    this.raycaster = undefined;\r\n    // this.mouse = undefined;\r\n  }\r\n}\r\n\r\nexport default CustomThreeLayer;\r\n"],"names":[],"mappings":"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"}