@realsee/five-webgpu 1.0.0-alpha.14 → 1.0.0-alpha.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_virtual/_rolldown/runtime.js +2 -2
- package/docs/assets/hierarchy.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/index.AdaptiveLuminancePass.html +1 -1
- package/docs/classes/index.EyeDomeLightingPass.html +1 -1
- package/docs/classes/index.Five.html +1 -1
- package/docs/classes/index.FivePass.html +1 -1
- package/docs/classes/index.FlowingFireworks3DPass.html +1 -1
- package/docs/classes/index.FlowingLight2DPass.html +1 -1
- package/docs/classes/index.FlowingLight3DPass.html +1 -1
- package/docs/classes/index.GaussianBlurPass.html +1 -1
- package/docs/classes/index.Model.html +1 -1
- package/docs/classes/index.ModelScene.html +1 -1
- package/docs/classes/index.PBMCustomNode.html +1 -1
- package/docs/classes/index.PBMGaussianSplattingNodeMaterial.html +1 -1
- package/docs/classes/index.PBMGaussianSplattingObject.html +1 -1
- package/docs/classes/index.PBMGaussianSplattingRenderMesh.html +1 -1
- package/docs/classes/index.PBMGroup.html +1 -1
- package/docs/classes/index.PBMMesh.html +1 -1
- package/docs/classes/index.PBMMeshBasicMaterial.html +1 -1
- package/docs/classes/index.PBMMeshBasicNodeMaterial.html +1 -1
- package/docs/classes/index.PBMMeshPanoOnlyMaterial.html +1 -1
- package/docs/classes/index.PBMMeshPanoOnlyNodeMaterial.html +1 -1
- package/docs/classes/index.PBMMeshPhongMaterial.html +1 -1
- package/docs/classes/index.PBMMeshPhongNodeMaterial.html +1 -1
- package/docs/classes/index.PBMMeshPhysicalMaterial.html +1 -1
- package/docs/classes/index.PBMMeshPhysicalNodeMaterial.html +1 -1
- package/docs/classes/index.PBMPanoFilter.html +1 -1
- package/docs/classes/index.PBMPointCloud.html +1 -1
- package/docs/classes/index.PBMPointCloudMaterial.html +1 -1
- package/docs/classes/index.PBMSkinnedMesh.html +1 -1
- package/docs/classes/index.PBMUpdateable.html +1 -1
- package/docs/classes/index.PanoCircleMesh.html +9 -5
- package/docs/classes/index.PanoCircleMeshCustom.html +9 -5
- package/docs/classes/index.PanoCircleMeshSolid.html +9 -5
- package/docs/classes/index.Parameter.html +1 -1
- package/docs/classes/index.Tile3D.html +1 -1
- package/docs/classes/index.TileNode.html +1 -1
- package/docs/classes/index.TrajectoryNode.html +1 -1
- package/docs/classes/index.WorkResolvedObserver.html +2 -2
- package/docs/hierarchy.html +1 -1
- package/docs/interfaces/index.AddableObject.html +1 -1
- package/docs/interfaces/index.EventCallback.html +1 -1
- package/docs/interfaces/index.IPBMMaterial.html +1 -1
- package/docs/interfaces/index.ImageOptions.html +1 -1
- package/docs/interfaces/index.IntersectMesh.html +1 -1
- package/docs/interfaces/index.IntersectMeshInterface.html +1 -1
- package/docs/interfaces/index.Intersection.html +1 -1
- package/docs/interfaces/index.LooseWorkObserver.html +2 -2
- package/docs/interfaces/index.LooseWorkPanorama.html +2 -2
- package/docs/interfaces/index.LooseWorkWithExtrinsics.html +1 -1
- package/docs/interfaces/index.ModelControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/index.MovePanoOptions.html +1 -1
- package/docs/interfaces/index.PanoCircleMeshInterface.html +8 -4
- package/docs/interfaces/index.PanoCircleMeshOptions.html +2 -2
- package/docs/interfaces/index.PanoCircleMeshSolidOptions.html +2 -2
- package/docs/interfaces/index.PanoramaControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/index.PanoramaLikeControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/index.ParameterMaterialValue.html +1 -1
- package/docs/interfaces/index.ParameterTilesetValue.html +1 -1
- package/docs/interfaces/index.ParameterValue.html +1 -1
- package/docs/interfaces/index.Pose.html +1 -1
- package/docs/interfaces/index.ResolvedParameterValue.html +1 -1
- package/docs/interfaces/index.State.html +1 -1
- package/docs/interfaces/index.TextureOptions.html +1 -1
- package/docs/interfaces/index.TopviewControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/index.VRPanoramaControllerCustomInitArgs.html +1 -1
- package/docs/interfaces/index.ViewLayer.html +1 -1
- package/docs/interfaces/index.WorkCubeHdrGainmapImage.html +1 -1
- package/docs/interfaces/index.WorkCubeImage.html +1 -1
- package/docs/interfaces/index.WorkImage.html +1 -1
- package/docs/interfaces/index.WorkObserver.html +2 -2
- package/docs/interfaces/index.WorkObserverJson.html +2 -2
- package/docs/interfaces/index.WorkPanoramaJson.html +2 -2
- package/docs/interfaces/index.WorkTile.html +1 -1
- package/docs/interfaces/index.XRPanoramaControllerCustomInitArgs.html +1 -1
- package/docs/types/index.ParseOptions.html +1 -1
- package/five/chunks/at3d.js +2 -2
- package/five/chunks/at3d.mjs +2 -2
- package/five/chunks/dome.js +2 -2
- package/five/chunks/dome.mjs +2 -2
- package/five/chunks/domez.js +2 -2
- package/five/chunks/domez.mjs +2 -2
- package/five/chunks/fbx.js +2 -2
- package/five/chunks/fbx.mjs +2 -2
- package/five/chunks/fflate.js +2 -2
- package/five/chunks/fflate.mjs +2 -2
- package/five/chunks/glTF-helpers.js +2 -2
- package/five/chunks/glTF-helpers.mjs +2 -2
- package/five/chunks/gltf.js +2 -2
- package/five/chunks/gltf.mjs +2 -2
- package/five/chunks/imageBitmap.js +2 -2
- package/five/chunks/imageBitmap.mjs +2 -2
- package/five/chunks/imageSupport.js +2 -2
- package/five/chunks/imageSupport.mjs +2 -2
- package/five/chunks/lzma.js +2 -2
- package/five/chunks/lzma.mjs +2 -2
- package/five/chunks/memoryUsage.js +2 -2
- package/five/chunks/memoryUsage.mjs +2 -2
- package/five/chunks/minimal.js +2 -2
- package/five/chunks/minimal.mjs +2 -2
- package/five/chunks/pbm.js +2 -2
- package/five/chunks/pbm.mjs +2 -2
- package/five/chunks/pbmGaussianSplattingObject.js +2 -2
- package/five/chunks/pbmGaussianSplattingObject.mjs +2 -2
- package/five/chunks/pbmMeshMaterial.js +2 -2
- package/five/chunks/pbmMeshMaterial.mjs +2 -2
- package/five/chunks/pick.js +2 -2
- package/five/chunks/pick.mjs +2 -2
- package/five/chunks/ply.js +2 -2
- package/five/chunks/ply.mjs +2 -2
- package/five/chunks/spz.js +2 -2
- package/five/chunks/spz.mjs +2 -2
- package/five/controllers/panorama.d.ts +6 -0
- package/five/index.js +6 -6
- package/five/index.mjs +6 -6
- package/five/meshes/panoCircleMesh.d.ts +1 -0
- package/five/meshes/panoCircleMeshCustom.d.ts +1 -0
- package/five/meshes/panoCircleMeshSolid.d.ts +1 -0
- package/five/meshes/panoSphereMesh.d.ts +1 -0
- package/five/renderer/postprocessing/passes/pass.js +2 -2
- package/five/renderer/postprocessing/passes/pass.mjs +2 -2
- package/five/renderer/tools/full-screen-quad.js +2 -2
- package/five/renderer/tools/full-screen-quad.mjs +2 -2
- package/five/texture/initTexture.d.ts +8 -0
- package/five/types/panoCircleMeshInterface.d.ts +6 -0
- package/five/utils/calculateThreeMouse.js +2 -2
- package/five/utils/calculateThreeMouse.mjs +2 -2
- package/five/utils/distance.js +2 -2
- package/five/utils/distance.mjs +2 -2
- package/five/utils/isNil.js +2 -2
- package/five/utils/isNil.mjs +2 -2
- package/five/utils/uuid.js +2 -2
- package/five/utils/uuid.mjs +2 -2
- package/five/work/looseWorkType.d.ts +2 -2
- package/five/work/work.d.ts +1 -1
- package/five/work/workJsonType.d.ts +2 -2
- package/gltf-loader/index.js +3 -3
- package/gltf-loader/index.mjs +3 -3
- package/line/index.js +3 -3
- package/line/index.mjs +3 -3
- package/package.json +1 -1
- package/plugins/BackgroundPlugin/Controller.js +2 -2
- package/plugins/BackgroundPlugin/Controller.mjs +2 -2
- package/plugins/BackgroundPlugin/index.js +2 -2
- package/plugins/BackgroundPlugin/index.mjs +2 -2
- package/plugins/BasePlugin/index.js +2 -2
- package/plugins/BasePlugin/index.mjs +2 -2
- package/plugins/CSS2DPlugin/Controller.js +2 -2
- package/plugins/CSS2DPlugin/Controller.mjs +2 -2
- package/plugins/CSS2DPlugin/index.js +2 -2
- package/plugins/CSS2DPlugin/index.mjs +2 -2
- package/plugins/CSS2DPlugin/style.css_raw.js +2 -2
- package/plugins/CSS2DPlugin/style.css_raw.mjs +2 -2
- package/plugins/CSS3DPlugin/Controller.js +2 -2
- package/plugins/CSS3DPlugin/Controller.mjs +2 -2
- package/plugins/CSS3DPlugin/index.js +2 -2
- package/plugins/CSS3DPlugin/index.mjs +2 -2
- package/plugins/CSS3DPlugin/style.css_raw.js +2 -2
- package/plugins/CSS3DPlugin/style.css_raw.mjs +2 -2
- package/plugins/FloorplanPlugin/Controller.js +2 -2
- package/plugins/FloorplanPlugin/Controller.mjs +2 -2
- package/plugins/FloorplanPlugin/index.js +2 -2
- package/plugins/FloorplanPlugin/index.mjs +2 -2
- package/plugins/FloorplanPlugin/render/assets.js +2 -2
- package/plugins/FloorplanPlugin/render/assets.mjs +2 -2
- package/plugins/FloorplanPlugin/render/index.js +2 -2
- package/plugins/FloorplanPlugin/render/index.mjs +2 -2
- package/plugins/FloorplanPlugin/render/isPointInPolygon.js +2 -2
- package/plugins/FloorplanPlugin/render/isPointInPolygon.mjs +2 -2
- package/plugins/FloorplanPlugin/render/renderFloor.js +2 -2
- package/plugins/FloorplanPlugin/render/renderFloor.mjs +2 -2
- package/plugins/FloorplanPlugin/render/roomLabelVisibility.js +2 -2
- package/plugins/FloorplanPlugin/render/roomLabelVisibility.mjs +2 -2
- package/plugins/FloorplanPlugin/render/style.css_raw.js +2 -2
- package/plugins/FloorplanPlugin/render/style.css_raw.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/changeMode.js +2 -2
- package/plugins/FloorplanPlugin/utils/changeMode.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/changeModelCanvasOpacity.js +2 -2
- package/plugins/FloorplanPlugin/utils/changeModelCanvasOpacity.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/correctFiveState.js +2 -2
- package/plugins/FloorplanPlugin/utils/correctFiveState.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/equal.js +2 -2
- package/plugins/FloorplanPlugin/utils/equal.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/filter.js +2 -2
- package/plugins/FloorplanPlugin/utils/filter.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/fiveModelLoad.js +2 -2
- package/plugins/FloorplanPlugin/utils/fiveModelLoad.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/formatData.js +2 -2
- package/plugins/FloorplanPlugin/utils/formatData.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/formatFloorplanJson.js +2 -2
- package/plugins/FloorplanPlugin/utils/formatFloorplanJson.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/formatPosition.js +2 -2
- package/plugins/FloorplanPlugin/utils/formatPosition.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/getDistanceFromModel.js +2 -2
- package/plugins/FloorplanPlugin/utils/getDistanceFromModel.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/getPxmm.js +2 -2
- package/plugins/FloorplanPlugin/utils/getPxmm.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/isTruelyObject.js +2 -2
- package/plugins/FloorplanPlugin/utils/isTruelyObject.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/nearlyEqual.js +2 -2
- package/plugins/FloorplanPlugin/utils/nearlyEqual.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/polylabel.js +2 -2
- package/plugins/FloorplanPlugin/utils/polylabel.mjs +2 -2
- package/plugins/FloorplanPlugin/utils/to.js +2 -2
- package/plugins/FloorplanPlugin/utils/to.mjs +2 -2
- package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.js +2 -2
- package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.mjs +2 -2
- package/plugins/GaussianSplattingEntranceAnimationPlugin/index.js +2 -2
- package/plugins/GaussianSplattingEntranceAnimationPlugin/index.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Controller.js +2 -2
- package/plugins/Object3DHelperPlugin/Controller.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/BaseController.js +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/BaseController.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/BoundingBoxController.js +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/BoundingBoxController.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/MoveController.js +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/MoveController.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/RotateController.js +2 -2
- package/plugins/Object3DHelperPlugin/Controllers/RotateController.mjs +2 -2
- package/plugins/Object3DHelperPlugin/FiveControllerWrapper.js +2 -2
- package/plugins/Object3DHelperPlugin/FiveControllerWrapper.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Helper/BaseHelper.js +2 -2
- package/plugins/Object3DHelperPlugin/Helper/BaseHelper.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Helper/BoundingBoxHelper.js +2 -2
- package/plugins/Object3DHelperPlugin/Helper/BoundingBoxHelper.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Helper/MoveHelper.js +2 -2
- package/plugins/Object3DHelperPlugin/Helper/MoveHelper.mjs +2 -2
- package/plugins/Object3DHelperPlugin/Helper/RotateHelper.js +2 -2
- package/plugins/Object3DHelperPlugin/Helper/RotateHelper.mjs +2 -2
- package/plugins/Object3DHelperPlugin/constant.js +2 -2
- package/plugins/Object3DHelperPlugin/constant.mjs +2 -2
- package/plugins/Object3DHelperPlugin/index.js +2 -2
- package/plugins/Object3DHelperPlugin/index.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/ArrowGroup.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/ArrowGroup.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/CenterHandle.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/CenterHandle.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/PlaneHandle.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/PlaneHandle.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/calculateScaleByCamera.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/calculateScaleByCamera.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/cameraHooks.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/cameraHooks.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/direction.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/direction.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/getMouseRaycaster.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/getMouseRaycaster.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/getOrthographicCameraDirection.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/getOrthographicCameraDirection.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/setObjectQuaternion.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/setObjectQuaternion.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/solidGuide.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/solidGuide.mjs +2 -2
- package/plugins/Object3DHelperPlugin/utils/tipsDom.js +2 -2
- package/plugins/Object3DHelperPlugin/utils/tipsDom.mjs +2 -2
- package/plugins/PanoAnimePlugin/Controller.js +2 -2
- package/plugins/PanoAnimePlugin/Controller.mjs +2 -2
- package/plugins/PanoAnimePlugin/index.js +2 -2
- package/plugins/PanoAnimePlugin/index.mjs +2 -2
- package/plugins/WordPassPlugin/Controller.js +2 -2
- package/plugins/WordPassPlugin/Controller.mjs +2 -2
- package/plugins/WordPassPlugin/hersheyFont.js +2 -2
- package/plugins/WordPassPlugin/hersheyFont.mjs +2 -2
- package/plugins/WordPassPlugin/index.js +2 -2
- package/plugins/WordPassPlugin/index.mjs +2 -2
- package/plugins/WordPassPlugin/textToStrokeOrderStrokes.js +2 -2
- package/plugins/WordPassPlugin/textToStrokeOrderStrokes.mjs +2 -2
- package/plugins/WordPassPlugin/word-pass.js +3 -3
- package/plugins/WordPassPlugin/word-pass.mjs +3 -3
- package/plugins/index.js +2 -2
- package/plugins/index.mjs +2 -2
- package/plugins/thirdParty/CSS2DRenderer.js +2 -2
- package/plugins/thirdParty/CSS2DRenderer.mjs +2 -2
- package/plugins/thirdParty/CSS3DRenderer.js +2 -2
- package/plugins/thirdParty/CSS3DRenderer.mjs +2 -2
- package/plugins/thirdParty/doctorstrange-model.js +2 -2
- package/plugins/thirdParty/doctorstrange-model.mjs +2 -2
- package/plugins/thirdParty/domevents.js +2 -2
- package/plugins/thirdParty/domevents.mjs +2 -2
- package/plugins/utils/absoluteUrl.js +2 -2
- package/plugins/utils/absoluteUrl.mjs +2 -2
- package/plugins/utils/calculatePath.js +2 -2
- package/plugins/utils/calculatePath.mjs +2 -2
- package/plugins/utils/clamp.js +2 -2
- package/plugins/utils/clamp.mjs +2 -2
- package/plugins/utils/uuid.js +2 -2
- package/plugins/utils/uuid.mjs +2 -2
- package/react/index.js +2 -2
- package/react/index.mjs +2 -2
- package/sticker/index.js +3 -3
- package/sticker/index.mjs +3 -3
- package/umd/five-gltf-loader.js +3 -3
- package/umd/five-line.js +3 -3
- package/umd/five-plugins.js +4 -4
- package/umd/five-react.js +2 -2
- package/umd/five-sticker.js +3 -3
- package/umd/five-vfx.js +2 -2
- package/umd/five.js +47 -47
- package/vfx/index.js +2 -2
- package/vfx/index.mjs +2 -2
- package/work-downloader/index.js +2 -2
- package/work-downloader/index.mjs +2 -2
package/five/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license
|
|
3
3
|
* @realsee/five-webgpu
|
|
4
|
-
* Generated: 2026/11/
|
|
5
|
-
* Version: 1.0.0-alpha.
|
|
4
|
+
* Generated: 2026/11/4
|
|
5
|
+
* Version: 1.0.0-alpha.15
|
|
6
6
|
* License:
|
|
7
7
|
* Realsee SDK License Agreement
|
|
8
8
|
|
|
@@ -380,7 +380,7 @@ Aj$\\0 \\0\\v
|
|
|
380
380
|
* ! \\v!
|
|
381
381
|
\\v j ¼"\\v \\vAsAÿÿÿÿ\\x07q \\vA\\0H\\x1B"\\v6\\0 \\b \\vAÿÿqAtj" (\\0Aj6\\0 \\vAvAüÿqj"\\v \\v(\\0Aj6\\0 \\fAj!\\f\\f\\v\\v\\v\\0\\v\\v \\0A\\b\\v\`)}function v(e){return e}function y(e,t){var n,r=v(e);return n=new WebAssembly.Module(r),[new WebAssembly.Instance(n,t),n]}function b(){return{a:F}}function x(){function e(e,t){return L=e.exports,P(L),f(),L}var t=b();return r.instantiateWasm?new Promise((n,i)=>{r.instantiateWasm(t,(t,r)=>{n(e(t,r))})}):(g!=null||(g=_()),e(y(g,t)[0]))}for(var S=e=>{for(;e.length>0;)e.shift()(r)},C=[],w=e=>C.push(e),T=[],E=e=>T.push(e),D=()=>2147483648,O=(e,t)=>Math.ceil(e/t)*t,k=e=>{var t=(e-N.buffer.byteLength+65535)/65536|0;try{return N.grow(t),f(),1}catch(e){}},A=e=>{var t=u.length;e>>>=0;var n=D();if(e>n)return!1;for(var r=1;r<=4;r*=2){var i=t*(1+.2/r);if(i=Math.min(i,e+100663296),k(Math.min(n,O(Math.max(e,i),65536))))return!0}return!1},j=new Uint8Array(123),M=25;M>=0;--M)j[48+M]=52+M,j[65+M]=M,j[97+M]=26+M;if(j[43]=62,j[47]=63,r.noExitRuntime&&r.noExitRuntime,r.print&&r.print,r.printErr&&r.printErr,r.wasmBinary&&r.wasmBinary,r.arguments&&r.arguments,r.thisProgram&&r.thisProgram,r.preInit)for(typeof r.preInit==\`function\`&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.shift()();var N;function P(e){r._sort=e.d,r._malloc=e.e,r._free=e.f,N=e.b,e.__indirect_function_table}var F={a:A};function I(){p();function e(){var e;r.calledRun=!0,!s&&(m(),l==null||l(r),(e=r.onRuntimeInitialized)==null||e.call(r),h())}r.setStatus?(r.setStatus(\`Running...\`),setTimeout(()=>{setTimeout(()=>r.setStatus(\`\`),1),e()},1)):e()}var L=x();return I(),t=d?r:new Promise((e,t)=>{l=e}),t}),i.apply(this,arguments)}let a,o=!1;function s(){return e(this,void 0,void 0,function*(){if(!(a||o))try{a=yield r()}catch(e){o=!0,self.postMessage({error:e instanceof Error?e.message:String(e)})}})}let c,l,u,d,f,p,m,h,g,_,v=0,y=0,b=!1,x=[],S=!0,C=!0,w=!1,T=!1,E=!1;function D(e,t){if(t.length!==16)return!0;for(let n=0;n<16;n++)if(Math.abs(e[n]-t[n])>1e-7)return!0;return!1}let O=[],k=65536,A=()=>e(void 0,void 0,void 0,function*(){if(w){T=!0;return}if(w=!0,T=!1,a||(yield s()),!a){w=!1;return}let e=Math.pow(2,Math.ceil(Math.log2(c.vertexCount)));v<e&&(v>0&&(a._free(l),a._free(d),a._free(f),a._free(p),a._free(m),a._free(h)),v=e,l=a._malloc(64),d=a._malloc(v*4),f=a._malloc(3*v*4),p=a._malloc(v*4),m=a._malloc(v*4),h=a._malloc(v*4)),b||(g=a._malloc(k*4),_=a._malloc(k*4),b=!0),y<c.transforms.length&&(y>0&&a._free(u),y=c.transforms.length,u=a._malloc(y*4)),w=!1,T&&(T=!1,yield A())}),j=()=>{if(w||T||!a)return;w=!0,C&&(a.HEAPF32.set(c.positions,f/4),a.HEAPF32.set(c.transforms,u/4),a.HEAPU32.set(c.transformIndices,d/4),C=!1),a.HEAPF32.set(new Float32Array(x),l/4),a._sort(l,u,d,c.vertexCount,f,p,m,h,g,_);let e=c.vertexCount,t=new Uint32Array(a.HEAPU32.buffer,m,e),n=e*4,r=O.pop();(!r||r.byteLength<n)&&(r=new ArrayBuffer(n));let i=new Uint32Array(r,0,e);i.set(t),self.postMessage({depthIndex:i,generation:c.generation},[r]),w=!1,S=!1},M=()=>{E||(E=!0,S&&j(),setTimeout(()=>{E=!1,M()}))};self.onmessage=t=>new Promise(n=>{e(void 0,void 0,void 0,function*(){var e;if(t.data.warmup){yield s(),n(!0);return}if(t.data.returnBuffer){O.length<3&&O.push(t.data.returnBuffer),n(!0);return}if(o){n(!0);return}let r=!1,i=!!t.data.sortData;if(t.data.sortData&&(c={positions:t.data.sortData.positions,transforms:t.data.sortData.transforms,transformIndices:t.data.sortData.transformIndices,vertexCount:t.data.sortData.vertexCount,generation:(e=t.data.sortData.generation)==null?0:e},S=!0,C=!0,yield A(),r=!0),t.data.viewProj){let e=t.data.viewProj;(D(e,x)||i)&&(x=e,S=!0,r=!0)}r&&S&&M(),n(!0)})})})();`,blob$2=typeof self<`u`&&self.Blob&&new Blob([`(self.URL || self.webkitURL).revokeObjectURL(self.location.href);`,jsContent$2],{type:`text/javascript;charset=utf-8`});function WorkerWrapper$2(options){let objURL;try{if(objURL=blob$2&&(self.URL||self.webkitURL).createObjectURL(blob$2),!objURL)throw``;let worker=new Worker(objURL,{name:options==null?void 0:options.name});return worker.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(objURL)}),worker}catch(e){return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(jsContent$2),{name:options==null?void 0:options.name})}}var GSplatPipeline=class{constructor(renderer){this.inputsDirty=!0,this.renderer=renderer}get usesGpuSort(){return!1}get requiresOrderTexture(){return this.usesGpuSort}markInputsDirty(){this.inputsDirty=!0}requestSort(_ctx){}frameUpdate(_ctx){}dispose(){}},CpuSortPipeline=class extends GSplatPipeline{constructor(renderer,onNeedsRender){super(renderer),this.sortWorker=null,this.splatIndexCapacity=0,this.sortGeneration=0,this.sortDataUploaded=!1,this.sortWorkerFailed=!1,this.orderCount=0,this.orderData=null,this.orderDirty=!1,this.layoutDirty=!1,this.aliveCount=0,this.orderBaseSnapshot=[],this.snapshotByGen=new Map,this.scratchViewProj=new three_webgpu.Matrix4,this.onNeedsRender=onNeedsRender,this.splatIndexCapacity=1;let splatIndices=new Float32Array(this.splatIndexCapacity);this.splatIndex=new three_webgpu.InstancedBufferAttribute(splatIndices,1,!1,1),this.splatIndex.setUsage(three_webgpu.DynamicDrawUsage),this.sortWorker=new WorkerWrapper$2,this.sortWorker.postMessage({warmup:!0}),this.sortWorker.onmessage=e=>{var _a;if(e.data.error){this.sortWorkerFailed=!0;return}if(e.data.depthIndex){let depthIndex=e.data.depthIndex,generation=e.data.generation;this.applyDepthIndex(depthIndex,generation);let buffer=depthIndex.buffer;buffer.byteLength>0&&((_a=this.sortWorker)==null||_a.postMessage({returnBuffer:buffer},[buffer]))}}}get instanceCount(){return this.sortWorkerFailed||this.orderCount<=0?0:this.aliveCount}get indexSource(){return{kind:`attribute`,attribute:this.splatIndex}}markInputsDirty(){super.markInputsDirty(),this.sortDataUploaded=!1,this.layoutDirty=!0}requestSort(ctx){var _a;if(ctx.totalPoints<=0)return;(this.inputsDirty||!this.sortDataUploaded)&&this.postSortData(ctx);let viewProj=this.scratchViewProj.multiplyMatrices(ctx.camera.perspectiveProjectionMatrix,ctx.camera.matrixWorldInverse);(_a=this.sortWorker)==null||_a.postMessage({viewProj:viewProj.elements})}frameUpdate(ctx){(this.orderDirty||this.layoutDirty)&&(this.applyReorderCPU(this.snapshotLayout(ctx.assembler)),this.orderDirty=!1,this.layoutDirty=!1)}dispose(){this.sortWorker&&(this.sortWorker.onmessage=null,this.sortWorker.terminate(),this.sortWorker=null),this.orderData=null,this.orderCount=0,this.aliveCount=0,this.orderBaseSnapshot=[],this.snapshotByGen.clear()}ensureSplatIndexCapacity(requiredCount){let currentAttr=this.splatIndex;if(requiredCount<=this.splatIndexCapacity)return currentAttr;let capacity=Math.max(this.splatIndexCapacity,1);for(;capacity<requiredCount;)capacity*=2;let expanded=new Float32Array(capacity);expanded.set(currentAttr.array.subarray(0,Math.min(currentAttr.array.length,capacity)));let nextAttr=new three_webgpu.InstancedBufferAttribute(expanded,1,!1,1);return nextAttr.setUsage(three_webgpu.DynamicDrawUsage),this.splatIndex=nextAttr,this.splatIndexCapacity=capacity,nextAttr}postSortData(ctx){var _a;let{positions,transformIndices,count}=ctx.assembler.extractSortInputs();if(count<=0){this.sortDataUploaded=!1;return}let generation=++this.sortGeneration;this.snapshotByGen.set(generation,this.snapshotLayout(ctx.assembler));let usedLen=ctx.transformStore.objectCount*20,transforms=ctx.transformStore.transforms.slice(0,usedLen);(_a=this.sortWorker)==null||_a.postMessage({sortData:{positions,transforms,transformIndices,vertexCount:count,generation}},[positions.buffer,transforms.buffer,transformIndices.buffer]),this.sortDataUploaded=!0,this.inputsDirty=!1}applyDepthIndex(depthIndex,generation){var _a;this.orderData=depthIndex.slice(),this.orderCount=this.orderData.length,this.orderDirty=!0;let snap=this.snapshotByGen.get(generation);if(snap){this.orderBaseSnapshot=snap;for(let g of Array.from(this.snapshotByGen.keys()))g<generation&&this.snapshotByGen.delete(g)}(_a=this.onNeedsRender)==null||_a.call(this)}snapshotLayout(assembler){return assembler.regions.map(r=>({object:r.object,start:r.start,count:r.count}))}buildSegments(base,current){let curStart=new Map;for(let r of current)curStart.set(r.object,r.start);let segments=[];for(let b of base){let cur=curStart.get(b.object),removed=cur===void 0,delta=removed?0:cur-b.start,last=segments[segments.length-1];last&&last.removed===removed&&(removed||last.delta===delta)&&last.oldEnd===b.start?last.oldEnd=b.start+b.count:segments.push({oldStart:b.start,oldEnd:b.start+b.count,delta,removed})}return segments}findSegment(segments,P){let lo=0,hi=segments.length-1;for(;lo<=hi;){let mid=lo+hi>>1,s=segments[mid];if(P<s.oldStart)hi=mid-1;else if(P>=s.oldEnd)lo=mid+1;else return s}return null}applyReorderCPU(current){if(this.orderCount<=0||!this.orderData){this.aliveCount=0;return}let segments=this.buildSegments(this.orderBaseSnapshot,current),attr=this.ensureSplatIndexCapacity(this.orderCount),out=attr.array,order=this.orderData,n=0;for(let k=0;k<this.orderCount;k++){let P=order[k],seg=this.findSegment(segments,P);!seg||seg.removed||(out[n++]=P+seg.delta)}attr.needsUpdate=!0,this.aliveCount=n}},prefixSum_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-并行前缀和(Oyryy|pu-r\x07pyvr-pn{)<<-移植自-]yn\bPn{n-munqr:yvo<ty<pu{x<nqv\x07:|<p|z}r:}rsv\x07:z;wm<<-(其上游为-ZVa-许可的-rot}:nqv\x07:|),算法与-ossr-布局保持一致。<<<<-与-]yn\bPn{n-版本的差别:常量在此处直接写成字面量(]yn\bPn{n-用-pqrsv{r-字符串替换注入),<<-元素数仍走-{vs|z,因此排序规模缩小时无需重编译-unqr。Mt|}5=6-Mov{qv{t5=6-nI|ntr9-rnqlvrK-vrzG-nn\bI@?KHMt|}5=6-Mov{qv{t5>6-nI|ntr9-rnqlvrK-oy|px`zG-nn\bI@?KH<<-当前层参与-pn{-的元素数。放在-{vs|z-里,规模变化时只需重写-{vs|z。p-]rsv\x07`zb{vs|z-\n--ryrzr{P|{G-@?9\fHMt|}5=6-Mov{qv{t5?6-nI{vs|zK-{vs|zG-]rsv\x07`zb{vs|zH<<->C-×->C-J-?BC-线程-<-|xt|},每线程处理-?-个元素-→-B>?-元素-<-|xt|}。p|{-d\\_XT_\\b]l`VgRleG-@?-J->CHp|{-d\\_XT_\\b]l`VgRlfG-@?-J->CHp|{-aU_RNQ`l]R_ld\\_XT_\\b]G-@?-J-?BCHp|{-VaRZ`l]R_ld\\_XT_\\b]G-@?-J-B>?H<<-单-|xt|}-内的-pn{-工作区,索引范围-h=9-B>>j。nI|xt|}K-rz}G-nn\bI@?9-VaRZ`l]R_ld\\_XT_\\b]KHMp|z}r-M|xt|}lv r5d\\_XT_\\b]l`VgRle9-d\\_XT_\\b]l`VgRlf9->6s{-rqprlq|{rr}5--Movyv{5|xt|}lvq6-lvqG-rp@I@?K9--Movyv{5{zl|xt|}6-lqvzG-rp@I@?K9--Movyv{5y|pnylv{|pnv|{lv{qr\x076-aVQG-@?96-\n--<<-|xt|}-数超过-zn\x07P|z}rd|xt|}]rQvzr{v|{-时上层会退化为-?Q-qv}npu,--<<-这里把二维-|xt|}-vq-扁平化成一维编号,多余的-|xt|}-靠下面的-ryrzr{P|{-边界检查丢弃。--yr-d\\_XT_\\b]lVQ-J-lvq;\x07-8-lvq;\b-7-lqvz;\x07H--yr-dVQ-J-d\\_XT_\\b]lVQ-7-aU_RNQ`l]R_ld\\_XT_\\b]H--yr-TVQ-J-dVQ-8-aVQH--yr-RYZlaVQ-J-aVQ-7-?H--yr-RYZlTVQ-J-TVQ-7-?H--<<-载入到-unrq-zrz|\b,越界元素补-=(不影响-r\x07pyvr-pn{-的有效前缀)--rz}hRYZlaVQj-J-ryrp5vrzhRYZlTVQj9-=9-RYZlTVQ-KJ-{vs|z;ryrzr{P|{6H--rz}hRYZlaVQ-8->j-J-ryrp5vrzhRYZlTVQ-8->j9-=9-RYZlTVQ-8->-KJ-{vs|z;ryrzr{P|{6H--n-|ssrG-@?-J->H--<<-}:rr}(rqpr):|ssr-倍增,rz}hovj-8J-rz}hnvj--s|-5n-qG-@?-J-VaRZ`l]R_ld\\_XT_\\b]-KK->H-q-K-=H-q-KKJ->6-\n----|xt|}Onvr56H----vs-5aVQ-I-q6-\n------yr-nvG-@?-J-|ssr-7-5RYZlaVQ-8->6-:->H------yr-ovG-@?-J-|ssr-7-5RYZlaVQ-8-?6-:->H------rz}hovj-8J-rz}hnvjH----\f----|ssr-7J-?H--\f--<<-保存本-|xt|}-的总和(供上一层-pn{-使用),并清零末元素以启动-q|{:rr}--vs-5aVQ-JJ-=6-\n----yr-ynl|ssr-J-VaRZ`l]R_ld\\_XT_\\b]-:->H----oy|px`zhd\\_XT_\\b]lVQj-J-rz}hynl|ssrjH----rz}hynl|ssrj-J-=H--\f--<<-q|{:rr}:|ssr-折半,交换并累加--s|-5n-qG-@?-J->H-q-I-VaRZ`l]R_ld\\_XT_\\b]H-q-7J-?6-\n----|ssr-KKJ->H----|xt|}Onvr56H----vs-5aVQ-I-q6-\n------yr-nvG-@?-J-|ssr-7-5RYZlaVQ-8->6-:->H------yr-ovG-@?-J-|ssr-7-5RYZlaVQ-8-?6-:->H------yr-G-@?-J-rz}hnvjH------rz}hnvj-J-rz}hovjH------rz}hovj-8J-H----\f--\f--|xt|}Onvr56H--<<-写回全局内存(原地-pn{),越界不写--vs-5RYZlTVQ-I-{vs|z;ryrzr{P|{6-\n----vrzhRYZlTVQj-J-rz}hRYZlaVQjH--\f--vs-5RYZlTVQ-8->-I-{vs|z;ryrzr{P|{6-\n----vrzhRYZlTVQ-8->j-J-rz}hRYZlaVQ-8->jH--\f\f<<-把上一层的-pn{-结果加回本层:vrzhRYZlVQj-8J-oy|px`zhd\\_XT_\\b]lVQjMp|z}r-M|xt|}lv r5d\\_XT_\\b]l`VgRle9-d\\_XT_\\b]l`VgRlf9->6s{-nqqloy|pxlz5--Movyv{5|xt|}lvq6-lvqG-rp@I@?K9--Movyv{5{zl|xt|}6-lqvzG-rp@I@?K9--Movyv{5y|pnylv{|pnv|{lv{qr\x076-aVQG-@?96-\n--<<-与-rqprlq|{rr}-相同的-?Q-→->Q-扁平化,保证两个入口的-|xt|}-编号一致--yr-d\\_XT_\\b]lVQ-J-lvq;\x07-8-lvq;\b-7-lqvz;\x07H--yr-dVQ-J-d\\_XT_\\b]lVQ-7-aU_RNQ`l]R_ld\\_XT_\\b]H--yr-TVQ-J-dVQ-8-aVQH--yr-RYZlVQ-J-TVQ-7-?H--vs-5RYZlVQ-KJ-{vs|z;ryrzr{P|{6-\n----r{H--\f--yr-oy|px`z-J-oy|px`zhd\\_XT_\\b]lVQjH--vrzhRYZlVQj-8J-oy|px`zH--vs-5RYZlVQ-8->-KJ-{vs|z;ryrzr{P|{6-\n----r{H--\f--vrzhRYZlVQ-8->j-8J-oy|px`zH\f"),ITEMS_PER_WORKGROUP=2*256,UNIFORM_BUFFER_SIZE$1=16,DEFAULT_MAX_WORKGROUPS_PER_DIMENSION$2=65535,PrefixSumKernel=class{constructor(device){this.passes=[],this.activeLevels=0,this.dataBuffer=null,this.uniformScratch=new Uint32Array(1),this.device=device,this.maxWorkgroupsPerDimension=device.limits.maxComputeWorkgroupsPerDimension||DEFAULT_MAX_WORKGROUPS_PER_DIMENSION$2,this.bindGroupLayout=device.createBindGroupLayout({label:`gsplat-prefix-sum-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]});let layout=device.createPipelineLayout({label:`gsplat-prefix-sum-layout`,bindGroupLayouts:[this.bindGroupLayout]}),module=device.createShaderModule({label:`gsplat-prefix-sum`,code:prefixSum_default});this.scanPipeline=device.createComputePipeline({label:`gsplat-prefix-sum-scan`,layout,compute:{module,entryPoint:`reduce_downsweep`}}),this.addBlockPipeline=device.createComputePipeline({label:`gsplat-prefix-sum-add-block`,layout,compute:{module,entryPoint:`add_block_sums`}})}encode(encoder,dataBuffer,count){if(count<=0)return;this.resize(dataBuffer,count);for(let i=0;i<this.activeLevels;i++){let pass=this.passes[i];pass.writtenCount!==pass.count&&(this.uniformScratch[0]=pass.count,this.device.queue.writeBuffer(pass.uniformBuffer,0,this.uniformScratch),pass.writtenCount=pass.count)}let computePass=encoder.beginComputePass({label:`gsplat-prefix-sum`});computePass.setPipeline(this.scanPipeline);for(let i=0;i<this.activeLevels;i++){let pass=this.passes[i];computePass.setBindGroup(0,pass.bindGroup),computePass.dispatchWorkgroups(pass.dispatchX,pass.dispatchY,1)}computePass.setPipeline(this.addBlockPipeline);for(let i=this.activeLevels-1;i>=0;i--){let pass=this.passes[i];pass.hasDeeperLevel&&(computePass.setBindGroup(0,pass.bindGroup),computePass.dispatchWorkgroups(pass.dispatchX,pass.dispatchY,1))}computePass.end()}resize(dataBuffer,count){if(this.passes.length===0||this.dataBuffer!==dataBuffer||count>this.passes[0].allocatedCount){this.destroyPasses(),this.createPassesRecursive(dataBuffer,count),this.dataBuffer=dataBuffer,this.activeLevels=this.passes.length;return}let levelCount=count,levels=0;for(;levels<this.passes.length;){let workgroupCount=Math.max(1,Math.ceil(levelCount/ITEMS_PER_WORKGROUP)),{x,y}=this.findOptimalDispatchSize(workgroupCount),pass=this.passes[levels];if(pass.count=levelCount,pass.dispatchX=x,pass.dispatchY=y,pass.hasDeeperLevel=workgroupCount>1,levels++,workgroupCount<=1)break;levelCount=workgroupCount}this.activeLevels=levels}createPassesRecursive(dataBuffer,count){let workgroupCount=Math.max(1,Math.ceil(count/ITEMS_PER_WORKGROUP)),{x,y}=this.findOptimalDispatchSize(workgroupCount),blockSumBuffer=this.device.createBuffer({label:`gsplat-prefix-sum-block-sum-${this.passes.length}`,size:workgroupCount*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),uniformBuffer=this.device.createBuffer({label:`gsplat-prefix-sum-uniforms-${this.passes.length}`,size:UNIFORM_BUFFER_SIZE$1,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),pass={blockSumBuffer,uniformBuffer,bindGroup:this.device.createBindGroup({label:`gsplat-prefix-sum-bg-${this.passes.length}`,layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:dataBuffer}},{binding:1,resource:{buffer:blockSumBuffer}},{binding:2,resource:{buffer:uniformBuffer}}]}),hasDeeperLevel:workgroupCount>1,count,allocatedCount:count,dispatchX:x,dispatchY:y,writtenCount:-1};this.passes.push(pass),workgroupCount>1&&this.createPassesRecursive(blockSumBuffer,workgroupCount)}findOptimalDispatchSize(workgroupCount){if(workgroupCount<=this.maxWorkgroupsPerDimension)return{x:workgroupCount,y:1};let x=Math.floor(Math.sqrt(workgroupCount));return{x,y:Math.ceil(workgroupCount/x)}}destroyPasses(){for(let pass of this.passes)pass.blockSumBuffer.destroy(),pass.uniformBuffer.destroy();this.passes.length=0,this.activeLevels=0,this.dataBuffer=null}destroy(){this.destroyPasses()}},radixHistogram_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-A:ov-nqv\x07-|-——-uv|tnz-}n<<-移植自-]yn\bPn{n-mp|z}r:nqv\x07:|:Aovm(原实现参考-xvuvzv<droT]b:_nqv\x07:`|9-ZVa)。<<-每个-|xt|}-?BC-线程-×-E-元素-J-?=AE-元素,统计本-|xt|}-内->C-个-qvtv-的出现次数,<<-并按-qvtv:znw|-写入-oy|px`z,供后续-r\x07pyvr-pn{-与-r|qr-使用。<<-不使用-ot|}-特性,也不支持-v{qvrp-qv}npu(元素数恒为-P]b-已知值)。Mt|}5=6-Mov{qv{t5=6-nI|ntr9-rnqK-v{}G-nn\bI@?KHMt|}5=6-Mov{qv{t5>6-nI|ntr9-rnqlvrK-oy|pxlzG-nn\bI@?KHp-_nqv\x07`|b{vs|z-\n--<<-本次排序实际-qv}npu-的-|xt|}-数(按当前元素数算,非分配高水位)--|xt|}P|{G-@?9--<<-本次排序实际参与的元素数,用于尾部-o|{q-检查--ryrzr{P|{G-@?9\fHMt|}5=6-Mov{qv{t5?6-nI{vs|zK-{vs|zG-_nqv\x07`|b{vs|zH<<-本-}n-取的-A:ov-位偏移,由-}v}ryv{r-的-p|{n{-注入(=<A<E<;;;-),不做字符串替换|rvqr-Pb__R[alOVaG-@?-J-=Hp|{-d\\_XT_\\b]l`VgRleG-@?-J->CHp|{-d\\_XT_\\b]l`VgRlfG-@?-J->CHp|{-aU_RNQ`l]R_ld\\_XT_\\b]G-@?-J-d\\_XT_\\b]l`VgRle-7-d\\_XT_\\b]l`VgRlfH-<<-?BCp|{-RYRZR[a`l]R_laU_RNQG-@?-J-EHp|{-RYRZR[a`l]R_ld\\_XT_\\b]G-@?-J-aU_RNQ`l]R_ld\\_XT_\\b]-7-RYRZR[a`l]R_laU_RNQH-<<-?=AE<<->C-个桶(A:ov-nqv\x07)的-|xt|}-内直方图nI|xt|}K-uv|tnzG-nn\bIn|zvpI@?K9->CKHMp|z}r-M|xt|}lv r5>C9->C9->6s{-znv{5--Movyv{5|xt|}lvq6-lvqG-rp@I@?K9--Movyv{5{zl|xt|}6-lqvzG-rp@I@?K9--Movyv{5y|pnylv{|pnv|{lv{qr\x076-aVQG-@?96-\n--<<-扁平化-|xt|}-索引,使-?Q-qv}npu(|xt|}-数超过-zn\x07P|z}rd|xt|}]rQvzr{v|{-时)也成立--yr-d\\_XT_\\b]lVQ-J-lvq;\x07-8-lvq;\b-7-lqvz;\x07H--yr-dVQ-J-d\\_XT_\\b]lVQ-7-RYRZR[a`l]R_ld\\_XT_\\b]H--<<-直方图清零:unrq-变量不保证初值--vs-5aVQ-I->C6-\n----n|zvp`|r53uv|tnzhaVQj9-=6H--\f--|xt|}Onvr56H--yr-ryrzr{P|{-J-{vs|z;ryrzr{P|{H--<<-每线程处理-E-个元素,跨-|xt|}-内以-aU_RNQ`l]R_ld\\_XT_\\b]-为步长保证合并访问--s|-5n--J-=H--I-RYRZR[a`l]R_laU_RNQH-886-\n----yr-TVQ-J-dVQ-8--7-aU_RNQ`l]R_ld\\_XT_\\b]-8-aVQH----<<-?Q-qv}npu-会多出补齐的-|xt|},需要连-d\\_XT_\\b]lVQ-一起做-o|{q-检查----yr-vlnyvq-J-TVQ-I-ryrzr{P|{-33-d\\_XT_\\b]lVQ-I-{vs|z;|xt|}P|{H----vs-5vlnyvq6-\n------yr-ryz-J-v{}hTVQjH------yr-qvtv-J-5ryz-KK-Pb__R[alOVa6-3-=\x07SH------n|zvpNqq53uv|tnzhqvtvj9->6H----\f--\f--|xt|}Onvr56H--<<-qvtv:znw|-写出:oy|px`zhqvtv-7-|xt|}P|{-8-|xt|}Vqj--<<-这样-r\x07pyvr-pn{-的结果才是「同一-qvtv-跨-|xt|}-的累积」,r|qr-才能一次读到本--<<-|xt|}-本-qvtv-的全局起始偏移。改成-|xt|}:znw|-会算出错误的-pnr-位置。--vs-5aVQ-I->C-33-d\\_XT_\\b]lVQ-I-{vs|z;|xt|}P|{6-\n----oy|pxlzhaVQ-7-{vs|z;|xt|}P|{-8-d\\_XT_\\b]lVQj-J-n|zvpY|nq53uv|tnzhaVQj6H--\f\f"),radixReorder_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-A:ov-nqv\x07-|-——-n{xrq-pnr(r|qr)}n<<-移植自-]yn\bPn{n-mp|z}r:nqv\x07:|:r|qrm(原实现参考-xvuvzv<droT]b:_nqv\x07:`|9-ZVa)。<<-每个-|xt|}-?BC-线程-×-E-元素-J-?=AE-元素,分-E-轮处理:<<-每轮先在「每-qvtv-一份的-?BC:ov-位图」上打标记,再用硬件-}|}p|{-求出线程在本轮本-qvtv<<-内的局部秩,最后用「oy|px`z-里的全局起始偏移-8-跨轮累积偏移-8-局部秩」散射到目标位置。<<-相比-]yn\bPn{n-的旧实现,这种做法省掉了-y|pnyl}rsv\x07lz-缓冲。<<-不使用-ot|}-特性,也不支持-v{qvrp-qv}npu(元素数恒为-P]b-已知值)。Mt|}5=6-Mov{qv{t5=6-nI|ntr9-rnqK-v{}Xr\bG-nn\bI@?KHMt|}5=6-Mov{qv{t5>6-nI|ntr9-rnqlvrK-|}Xr\bG-nn\bI@?KH<<-已被-r\x07pyvr-pn{-处理过的-oy|px`z,qvtv:znw|:hqvtv-7-|xt|}P|{-8-|xt|}VqjMt|}5=6-Mov{qv{t5?6-nI|ntr9-rnqK-}rsv\x07loy|pxlzG-nn\bI@?KHMt|}5=6-Mov{qv{t5@6-nI|ntr9-rnqK-v{}cnyrG-nn\bI@?KHMt|}5=6-Mov{qv{t5A6-nI|ntr9-rnqlvrK-|}cnyrG-nn\bI@?KHp-_nqv\x07`|b{vs|z-\n--<<-本次排序实际-qv}npu-的-|xt|}-数(按当前元素数算,非分配高水位)--|xt|}P|{G-@?9--<<-本次排序实际参与的元素数,用于尾部-o|{q-检查--ryrzr{P|{G-@?9\fHMt|}5=6-Mov{qv{t5B6-nI{vs|zK-{vs|zG-_nqv\x07`|b{vs|zH<<-三个编译期量由-}v}ryv{r-的-p|{n{-注入,不做字符串替换:<<-Pb__R[alOVa---本-}n-取的-A:ov-位偏移(=<A<E<;;;)<<-V`lSV_`al]N``-首个-}n-的-nyr-由-TVQ-合成,不读-v{}cnyr(其内容无需初始化)<<-V`lYN`al]N``--最后一个-}n-不必再写-xr\b,只写-nyr|rvqr-Pb__R[alOVaG-@?-J-=H|rvqr-V`lSV_`al]N``G-@?-J-=H|rvqr-V`lYN`al]N``G-@?-J-=Hp|{-d\\_XT_\\b]l`VgRleG-@?-J->CHp|{-d\\_XT_\\b]l`VgRlfG-@?-J->CHp|{-aU_RNQ`l]R_ld\\_XT_\\b]G-@?-J-d\\_XT_\\b]l`VgRle-7-d\\_XT_\\b]l`VgRlfH-<<-?BCp|{-RYRZR[a`l]R_laU_RNQG-@?-J-EHp|{-RYRZR[a`l]R_ld\\_XT_\\b]G-@?-J-aU_RNQ`l]R_ld\\_XT_\\b]-7-RYRZR[a`l]R_laU_RNQH-<<-?=AE<<->C-个-qvtv-×-E-个-|q,每-|q-@?-ov,正好覆盖-?BC-个线程nI|xt|}K-qvtvlznxG-nn\bIn|zvpI@?K9->?EKH<<-各-qvtv-在本-|xt|}-内已处理轮次的累积计数,跨轮累积nI|xt|}K-qvtvl|ssrG-nn\bI@?9->CKHMp|z}r-M|xt|}lv r5>C9->C9->6s{-znv{5--Movyv{5|xt|}lvq6-lvqG-rp@I@?K9--Movyv{5{zl|xt|}6-lqvzG-rp@I@?K9--Movyv{5y|pnylv{|pnv|{lv{qr\x076-aVQG-@?96-\n--<<-扁平化-|xt|}-索引,使-?Q-qv}npu(|xt|}-数超过-zn\x07P|z}rd|xt|}]rQvzr{v|{-时)也成立。--<<-?Q-qv}npu-补齐出的多余-|xt|}-其-dVQ-必然超出-ryrzr{P|{,被下面的-vlnyvq-丢弃。--yr-d\\_XT_\\b]lVQ-J-lvq;\x07-8-lvq;\b-7-lqvz;\x07H--yr-dVQ-J-d\\_XT_\\b]lVQ-7-RYRZR[a`l]R_ld\\_XT_\\b]H--<<-线程在-?BC:ov-位图中的落点--yr-|qlvq\x07-J-aVQ-KK-BH--yr-ovlvq\x07-J-aVQ-3-@>H--<<-累积偏移置零并清空位图:unrq-变量不保证初值--vs-5aVQ-I->C6-\n----qvtvl|ssrhaVQj-J-=H--\f--vs-5aVQ-I->?E6-\n----n|zvp`|r53qvtvlznxhaVQj9-=6H--\f--|xt|}Onvr56H--yr-ryrzr{P|{-J-{vs|z;ryrzr{P|{H--s|-5n-|{q-J-=H-|{q-I-RYRZR[a`l]R_laU_RNQH-|{q886-\n----yr-TVQ-J-dVQ-8-|{q-7-aU_RNQ`l]R_ld\\_XT_\\b]-8-aVQH----yr-vlnyvq-J-TVQ-I-ryrzr{P|{H----yr-x-J-ryrp5=9-v{}Xr\bhTVQj9-vlnyvq6H----<<-无效线程给一个不会被使用的-qvtv(>C-越出位图范围,但-vlnyvq-保证不写入)----yr-qvtv-J-ryrp5>C9-5x-KK-Pb__R[alOVa6-3-=\x07S9-vlnyvq6H----<<-在-onvr-之前预取-nyr,让取数与下面的求秩重叠。----<<-V`lSV_`al]N``-是-|rvqr-常量,分支会被编译期折叠,首个-}n-不会真正读-v{}cnyr。----n--J-=H----vs-5vlnyvq6-\n------vs-5V`lSV_`al]N``-JJ->6-\n---------J-TVQH------\f-ryr-\n---------J-v{}cnyrhTVQjH------\f----\f----vs-5vlnyvq6-\n------n|zvp\\53qvtvlznxhqvtv-7-E-8-|qlvq\x07j9->-II-ovlvq\x076H----\f----|xt|}Onvr56H----vs-5vlnyvq6-\n------yr-onr-J-qvtv-7-EH------<<-局部秩-J-前面轮次的累积计数-8-本轮同-qvtv-中排在本线程之前的线程数------n-y|pnyl}rsv\x07-J-qvtvl|ssrhqvtvjH------s|-5n--J-=H--I-|qlvq\x07H-886-\n--------y|pnyl}rsv\x07-8J-p|{\\{rOv5n|zvpY|nq53qvtvlznxhonr-8-j66H------\f------y|pnyl}rsv\x07-8J-p|{\\{rOv5n|zvpY|nq53qvtvlznxhonr-8-|qlvq\x07j6-3-55>-II-ovlvq\x076-:->66H------<<-qvtv:znw|-取本-|xt|}-本-qvtv-的全局起始偏移------yr-}vq-J-qvtv-7-{vs|z;|xt|}P|{-8-d\\_XT_\\b]lVQH------yr-|rql}|vv|{-J-}rsv\x07loy|pxlzh}vqj-8-y|pnyl}rsv\x07H------vs-5V`lYN`al]N``-JJ-=6-\n--------|}Xr\bh|rql}|vv|{j-J-xH------\f------|}cnyrh|rql}|vv|{j-J-H----\f----<<-为下一轮准备:把本轮各-qvtv-的计数累加进-qvtvl|ssr,并清空位图----vs-5|{q-I-RYRZR[a`l]R_laU_RNQ-:->6-\n------|xt|}Onvr56H------vs-5aVQ-I->C6-\n--------n-p|{-J-=H--------s|-5n--J-=H--I-EH-886-\n----------yr-vq\x07-J-aVQ-7-E-8-H----------p|{-8J-p|{\\{rOv5n|zvpY|nq53qvtvlznxhvq\x07j66H----------n|zvp`|r53qvtvlznxhvq\x07j9-=6H--------\f--------qvtvl|ssrhaVQj-8J-p|{H------\f------|xt|}Onvr56H----\f--\f\f"),ELEMENTS_PER_WORKGROUP$1=256*8,UNIFORM_BUFFER_SIZE=16,DEFAULT_MAX_WORKGROUPS_PER_DIMENSION$1=65535,RadixSortPipelineError=class extends Error{constructor(message,cause){super(cause===void 0?message:`${message}: ${String(cause)}`),this.name=`RadixSortPipelineError`}},RadixSortModule=class{constructor(device){this.histogramPipelines=[],this.reorderPipelines=[],this.reorderLastPipelines=[],this.keys0=null,this.ownKeys1=null,this.values0=null,this.values1=null,this.blockSums=null,this.capacity=0,this.destructiveKeys=!1,this.callerKeys=null,this.uniformScratch=new Uint32Array(2),this.writtenWorkgroupCount=-1,this.writtenElementCount=-1,this.histogramBindGroups=new Map,this.reorderBindGroups=new Map,this.device=device,this.maxWorkgroupsPerDimension=device.limits.maxComputeWorkgroupsPerDimension||DEFAULT_MAX_WORKGROUPS_PER_DIMENSION$1;try{this.prefixSum=new PrefixSumKernel(device),this.histogramBindGroupLayout=device.createBindGroupLayout({label:`gsplat-radix-histogram-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),this.reorderBindGroupLayout=device.createBindGroupLayout({label:`gsplat-radix-reorder-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),this.histogramPipelineLayout=device.createPipelineLayout({label:`gsplat-radix-histogram-layout`,bindGroupLayouts:[this.histogramBindGroupLayout]}),this.reorderPipelineLayout=device.createPipelineLayout({label:`gsplat-radix-reorder-layout`,bindGroupLayouts:[this.reorderBindGroupLayout]}),this.histogramModule=device.createShaderModule({label:`gsplat-radix-histogram`,code:radixHistogram_default}),this.reorderModule=device.createShaderModule({label:`gsplat-radix-reorder`,code:radixReorder_default}),this.uniformBuffer=device.createBuffer({label:`gsplat-radix-uniforms`,size:UNIFORM_BUFFER_SIZE,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}catch(error){throw new RadixSortPipelineError(`radix sort 资源创建失败`,error)}}encode(encoder,keys,elementCount,numBits,opts){var _a;let destructiveKeys=(opts==null?void 0:opts.destructiveKeys)===!0;this.ensureCapacity(keys,elementCount,(_a=opts==null?void 0:opts.minCapacity)==null?0:_a,destructiveKeys);let numPasses=Math.max(1,Math.ceil(numBits/4));if(elementCount<=0)return{sortedIndices:this.values0};let currentWorkgroupCount=Math.max(1,Math.ceil(elementCount/ELEMENTS_PER_WORKGROUP$1)),blockSumCount=16*currentWorkgroupCount,dispatch=this.findOptimalDispatchSize(currentWorkgroupCount);this.writeUniforms(currentWorkgroupCount,elementCount);let blockSums=this.blockSums,keys0=this.keys0,keys1=this.resolveKeys1(),currentKeys=keys,currentValues=this.values0,nextKeys=keys0,nextValues=this.values1;for(let pass=0;pass<numPasses;pass++){let isLastPass=pass===numPasses-1;encoder.clearBuffer(blockSums,0,blockSumCount*4);let histogramPass=encoder.beginComputePass({label:`gsplat-radix-histogram-${pass}`});histogramPass.setPipeline(this.getHistogramPipeline(pass)),histogramPass.setBindGroup(0,this.getHistogramBindGroup(currentKeys,blockSums)),histogramPass.dispatchWorkgroups(dispatch.x,dispatch.y,1),histogramPass.end(),this.prefixSum.encode(encoder,blockSums,blockSumCount);let reorderPass=encoder.beginComputePass({label:`gsplat-radix-reorder-${pass}`});if(reorderPass.setPipeline(this.getReorderPipeline(pass,isLastPass)),reorderPass.setBindGroup(0,this.getReorderBindGroup(currentKeys,nextKeys,blockSums,currentValues,nextValues)),reorderPass.dispatchWorkgroups(dispatch.x,dispatch.y,1),reorderPass.end(),!isLastPass){currentKeys=nextKeys,nextKeys=currentKeys===keys0?keys1:keys0;let swap=currentValues;currentValues=nextValues,nextValues=swap}}return{sortedIndices:numPasses%2==1?this.values1:this.values0}}destroy(){this.prefixSum.destroy(),this.destroyOwnBuffers(),this.uniformBuffer.destroy(),this.histogramPipelines.length=0,this.reorderPipelines.length=0,this.reorderLastPipelines.length=0}resolveKeys1(){return this.destructiveKeys?this.callerKeys:this.ownKeys1}ensureCapacity(keys,elementCount,minCapacity,destructiveKeys){let effectiveCount=Math.max(Math.max(elementCount,minCapacity),this.capacity),allocWorkgroupCount=Math.max(1,Math.ceil(effectiveCount/ELEMENTS_PER_WORKGROUP$1)),allocElements=allocWorkgroupCount*ELEMENTS_PER_WORKGROUP$1;if(!(this.values0===null||allocElements>this.capacity||destructiveKeys!==this.destructiveKeys)){this.callerKeys!==keys&&(this.callerKeys=keys,this.clearBindGroupCache());return}this.destroyOwnBuffers();let device=this.device,byteLength=allocElements*4,pingPongUsage=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST;this.keys0=device.createBuffer({label:`gsplat-radix-keys0`,size:byteLength,usage:pingPongUsage}),this.ownKeys1=destructiveKeys?null:device.createBuffer({label:`gsplat-radix-keys1`,size:byteLength,usage:pingPongUsage}),this.values0=device.createBuffer({label:`gsplat-radix-values0`,size:byteLength,usage:pingPongUsage}),this.values1=device.createBuffer({label:`gsplat-radix-values1`,size:byteLength,usage:pingPongUsage}),this.blockSums=device.createBuffer({label:`gsplat-radix-block-sums`,size:16*allocWorkgroupCount*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.capacity=allocElements,this.destructiveKeys=destructiveKeys,this.callerKeys=keys,this.clearBindGroupCache()}destroyOwnBuffers(){var _a,_b,_c,_d,_e;(_a=this.keys0)==null||_a.destroy(),(_b=this.ownKeys1)==null||_b.destroy(),(_c=this.values0)==null||_c.destroy(),(_d=this.values1)==null||_d.destroy(),(_e=this.blockSums)==null||_e.destroy(),this.keys0=null,this.ownKeys1=null,this.values0=null,this.values1=null,this.blockSums=null,this.capacity=0,this.callerKeys=null,this.clearBindGroupCache()}writeUniforms(workgroupCount,elementCount){this.writtenWorkgroupCount===workgroupCount&&this.writtenElementCount===elementCount||(this.uniformScratch[0]=workgroupCount,this.uniformScratch[1]=elementCount,this.device.queue.writeBuffer(this.uniformBuffer,0,this.uniformScratch),this.writtenWorkgroupCount=workgroupCount,this.writtenElementCount=elementCount)}findOptimalDispatchSize(workgroupCount){if(workgroupCount<=this.maxWorkgroupsPerDimension)return{x:workgroupCount,y:1};let x=Math.floor(Math.sqrt(workgroupCount));return{x,y:Math.ceil(workgroupCount/x)}}getHistogramPipeline(pass){let cached=this.histogramPipelines[pass];if(cached)return cached;try{let pipeline=this.device.createComputePipeline({label:`gsplat-radix-histogram-pipeline-${pass}`,layout:this.histogramPipelineLayout,compute:{module:this.histogramModule,entryPoint:`main`,constants:{CURRENT_BIT:pass*4}}});return this.histogramPipelines[pass]=pipeline,pipeline}catch(error){throw new RadixSortPipelineError(`histogram pipeline 创建失败(pass ${pass})`,error)}}getReorderPipeline(pass,isLastPass){let cache=isLastPass?this.reorderLastPipelines:this.reorderPipelines,cached=cache[pass];if(cached)return cached;try{let pipeline=this.device.createComputePipeline({label:`gsplat-radix-reorder-pipeline-${pass}${isLastPass?`-last`:``}`,layout:this.reorderPipelineLayout,compute:{module:this.reorderModule,entryPoint:`main`,constants:{CURRENT_BIT:pass*4,IS_FIRST_PASS:+(pass===0),IS_LAST_PASS:+!!isLastPass}}});return cache[pass]=pipeline,pipeline}catch(error){throw new RadixSortPipelineError(`reorder pipeline 创建失败(pass ${pass})`,error)}}bufferTag(buffer){return buffer===this.keys0?`k0`:buffer===this.ownKeys1?`k1`:buffer===this.callerKeys?`kc`:buffer===this.values0?`v0`:buffer===this.values1?`v1`:`other`}getHistogramBindGroup(inputKeys,blockSums){let key=this.bufferTag(inputKeys),cached=this.histogramBindGroups.get(key);if(cached)return cached;let bindGroup=this.device.createBindGroup({label:`gsplat-radix-histogram-bg-${key}`,layout:this.histogramBindGroupLayout,entries:[{binding:0,resource:{buffer:inputKeys}},{binding:1,resource:{buffer:blockSums}},{binding:2,resource:{buffer:this.uniformBuffer}}]});return this.histogramBindGroups.set(key,bindGroup),bindGroup}getReorderBindGroup(inputKeys,outputKeys,blockSums,inputValues,outputValues){let key=`${this.bufferTag(inputKeys)}|${this.bufferTag(outputKeys)}|${this.bufferTag(inputValues)}|${this.bufferTag(outputValues)}`,cached=this.reorderBindGroups.get(key);if(cached)return cached;let bindGroup=this.device.createBindGroup({label:`gsplat-radix-reorder-bg-${key}`,layout:this.reorderBindGroupLayout,entries:[{binding:0,resource:{buffer:inputKeys}},{binding:1,resource:{buffer:outputKeys}},{binding:2,resource:{buffer:blockSums}},{binding:3,resource:{buffer:inputValues}},{binding:4,resource:{buffer:outputValues}},{binding:5,resource:{buffer:this.uniformBuffer}}]});return this.reorderBindGroups.set(key,bindGroup),bindGroup}clearBindGroupCache(){this.histogramBindGroups.clear(),this.reorderBindGroups.clear()}},sortKeygen_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-`|lXr\b-生成(svr-专属:Qr}ulZrvp-8-均匀量化)<<<<-一线程一-}yn,从-Qnnlar\x07r-与-an{s|zl`|r-直接读取,无需任何-P]b-侧中间数组:<<---Qnnlar\x07r------_TON@?bV,宽-?=AE,每-}yn-?-r\x07ry<<-----r\x07ry=G-h}|e<f<g-的-s@?-位模式9-_TON5v{E×A6-颜色j<<-----r\x07ry>G-h@-组-unys-协方差9-n{s|zV{qr\x07II>C-\v-yn\brV{qr\x07j<<---an{s|zl`|r---_TON@?S,宽-F,高-J-对象数<<-----p|y-=;;@-J-znv\x07d|yq(列主序),p|y-A-J-ryrprq,p|y-B;;E-J-v{rr5znv\x07d|yq6<<---本-}n-只读-p|y-=;;@(xr\btr{-只需正向变换)。<<<<-Qr}ulZrvp-取沿相机朝向的线性投影距离(对应-]yn\bPn{n-的-yv{rn-|-模式):<<-pnzrng-是-pnzrn;znv\x07d|yq-的-8g-列(urr-中指向相机背后),因此越远的-}yn<<-qr}uZrvp-越小、量化后的-xr\b-越小,nqv\x07-升序排序结果天然是「由远到近」的绘制顺序。<<<<-量化采用-pnzrn:rynvr-ov{-rvtu-的退化形式:各深度区间权重相同时分-ov{-完全消失,<<-退化为对归一化距离的直接均匀量化(详见-qrvt{;zq)。Mt|}5=6-Mov{qv{t5=6-n-qnnar\x07G-r\x07rl?qI@?KHMt|}5=6-Mov{qv{t5>6-n-n{s|zar\x07G-r\x07rl?qIs@?KHMt|}5=6-Mov{qv{t5?6-nI|ntr9-rnqlvrK-xr\bG-nn\bI@?KHp-Xr\btr{b{vs|z-\n--pnzrn]|vv|{G-rp@Is@?K9--<<-|ssr-=--zv{QvG-s@?9---------------<<-|ssr->?:Qvn{prl_n{tr-下界(最远处)--pnzrngG-rp@Is@?K9---------<<-|ssr->C:pnzrn;znv\x07d|yq-的-8g-列(已归一化)--v{_n{trG-s@?9--------------<<-|ssr-?E:>-<-5zn\x07Qv-:-zv{Qv6--{z]|v{G-@?9-------------<<-|ssr-@?:a|nyl]|v{--opxrP|{G-@?9-----------<<-|ssr-@C:>-II-Xr\blOvldvqu--l}nq=G-@?9-----------------<<-|ssr-A=--l}nq>G-@?9-----------------<<-|ssr-AA(结构体总长-AE-字节)\fHMt|}5=6-Mov{qv{t5@6-nI{vs|zK-{vG-Xr\btr{b{vs|zH<77-Qnnlar\x07r-宽度,须与-`}ynNrzoyr-<-主材质硬编码的-?=AE-一致。-7<p|{-QNaNlaReldVQaUG-@?-J-?=AEHMp|z}r-M|xt|}lv r5?BC6s{-znv{5Movyv{5ty|onylv{|pnv|{lvq6-tvqG-rp@I@?K6-\n--yr-]-J-tvq;\x07H--<<-尾部-}nqqv{t(]-在-h{z]|v{9-pn}npv\b6)不写入,其-xr\b-为上一帧残留;--<<-_nqv\x07l`|lZ|qyr-的-ryrzr{P|{-J-{z]|v{,}nqqv{t-区间不参与排序。--vs-5]-KJ-{v;{z]|v{6-\n----r{H--\f--yr-onrar\x07ry-J-]-7-?H--yr->ar\x07ry-J-onrar\x07ry-8->H--yr-=-J-r\x07rY|nq5qnnar\x079-rp?I@?K5onrar\x07ry-2-QNaNlaReldVQaU9-onrar\x07ry-<-QNaNlaReldVQaU69-=6H--yr->-J-r\x07rY|nq5qnnar\x079-rp?I@?K5>ar\x07ry-2-QNaNlaReldVQaU9->ar\x07ry-<-QNaNlaReldVQaU69-=6H--<<-r\x07ry=;\x07\b -是位置的-s@?-位模式;r\x07ry>;-高->C-位是-n{s|zV{qr\x07。--yr-y|pnyPr{r-J-rp@Is@?K5ovpnIs@?K5=;\x0769-ovpnIs@?K5=;\b69-ovpnIs@?K5=; 66H--yr-n{s|zV{qr\x07-J-v@?5>;-KK->C6H--yr-p=-J-r\x07rY|nq5n{s|zar\x079-rp?Iv@?K5=9-n{s|zV{qr\x0769-=6H--yr-p>-J-r\x07rY|nq5n{s|zar\x079-rp?Iv@?K5>9-n{s|zV{qr\x0769-=6H--yr-p?-J-r\x07rY|nq5n{s|zar\x079-rp?Iv@?K5?9-n{s|zV{qr\x0769-=6H--yr-p@-J-r\x07rY|nq5n{s|zar\x079-rp?Iv@?K5@9-n{s|zV{qr\x0769-=6H--yr-z-J-znA\x07AIs@?K5p=9-p>9-p?9-p@6H--yr-|yqPr{r-J-5z-7-rpAIs@?K5y|pnyPr{r9->;=66;\x07\b H--yr-qr}uZrvp-J-q|5|yqPr{r-:-{v;pnzrn]|vv|{9-{v;pnzrng6H--<<-Qvn{prl_n{tr-之外的-}yn-被-pynz}-到端点,不产生越界-xr\b。--yr--J-pynz}55qr}uZrvp-:-{v;zv{Qv6-7-{v;v{_n{tr9-=;=9->;=6H--<<-zv{5;;;9-opxrP|{-:->6-处理--JJ->;=-时-@?5>;=-7-opxrP|{6-JJ-opxrP|{-的越界。--xr\bh]j-J-zv{5@?5-7-s@?5{v;opxrP|{669-{v;opxrP|{-:->6H\f"),KEYGEN_WORKGROUP_SIZE=256,KEYGEN_UNIFORM_SIZE=48,MIN_KEY_BITS=10,MAX_KEY_BITS=20,DEFAULT_MAX_WORKGROUPS_PER_DIMENSION=65535,ORDER_TEXTURE_WIDTH$1=2048,ORDER_TEXTURE_BYTES_PER_ROW=ORDER_TEXTURE_WIDTH$1*4,_orderTextureVersionSeed=0;function createOrderThreeTexture(gpuTexture){let texture=new three_webgpu.ExternalTexture(gpuTexture);return texture.name=`gsplat-order-texture`,texture.isDataTexture=!0,texture.format=three_webgpu.RedIntegerFormat,texture.type=three_webgpu.UnsignedIntType,texture.minFilter=three_webgpu.NearestFilter,texture.magFilter=three_webgpu.NearestFilter,texture.generateMipmaps=!1,texture.flipY=!1,texture.version=++_orderTextureVersionSeed,texture}function computeKeyBitConfig(totalPoints){let raw=totalPoints>0?Math.round(Math.log2(totalPoints/4)):MIN_KEY_BITS,numBits=Math.max(MIN_KEY_BITS,Math.min(MAX_KEY_BITS,Number.isFinite(raw)?raw:MIN_KEY_BITS)),keyBitWidth=Math.ceil(numBits/4)*4;return{numBits,keyBitWidth,bucketCount:1<<keyBitWidth}}var _camPos=new three_webgpu.Vector3,_camZ=new three_webgpu.Vector3,_corner=new three_webgpu.Vector3,SortAdapter=class{constructor(renderer,device){this.uniformScratch=new ArrayBuffer(KEYGEN_UNIFORM_SIZE),this.uniformF32=new Float32Array(this.uniformScratch),this.uniformU32=new Uint32Array(this.uniformScratch),this.keyBuffer=null,this.keyCapacity=0,this.orderGpuTexture=null,this.orderThreeTexture=null,this.orderTextureHeight=0,this.textureViewCache=new WeakMap,this.keygenBindGroup=null,this.boundDataTexture=null,this.boundTransformTexture=null,this.boundKeyBuffer=null,this.validateOrderEnabled=!1,this.stagingBuffer=null,this.stagingCapacity=0,this.validationInFlight=!1,this.keygenDispatchUnsupported=!1,this.renderer=renderer,this.device=device,this.maxWorkgroupsPerDimension=device.limits.maxComputeWorkgroupsPerDimension||DEFAULT_MAX_WORKGROUPS_PER_DIMENSION,this.radixSort=new RadixSortModule(device);try{this.keygenBindGroupLayout=device.createBindGroupLayout({label:`gsplat-keygen-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:`uint`,viewDimension:`2d`}},{binding:1,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:`unfilterable-float`,viewDimension:`2d`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),this.keygenPipeline=device.createComputePipeline({label:`gsplat-keygen-pipeline`,layout:device.createPipelineLayout({label:`gsplat-keygen-layout`,bindGroupLayouts:[this.keygenBindGroupLayout]}),compute:{module:device.createShaderModule({label:`gsplat-keygen`,code:sortKeygen_default}),entryPoint:`main`}}),this.uniformBuffer=device.createBuffer({label:`gsplat-keygen-uniforms`,size:KEYGEN_UNIFORM_SIZE,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}catch(error){throw this.radixSort.destroy(),new RadixSortPipelineError(`keygen pipeline 创建失败`,error)}}get unusable(){return this.keygenDispatchUnsupported}get debugValidateOrder(){return this.validateOrderEnabled}set debugValidateOrder(value){this.validateOrderEnabled!==value&&(this.validateOrderEnabled=value,!value&&!this.validationInFlight&&this.destroyStagingBuffer())}get orderTexture(){return this.orderThreeTexture}encode(encoder,objects,camera,dataTexture,transformTexture,totalPoints){if(totalPoints<=0)return!1;let{keyBitWidth,bucketCount}=computeKeyBitConfig(totalPoints),keys=this.encodeKeygen(encoder,objects,camera,dataTexture,transformTexture,totalPoints,bucketCount);if(!keys)return!1;let orderTexture=this.ensureOrderTexture(totalPoints),{sortedIndices}=this.radixSort.encode(encoder,keys,totalPoints,keyBitWidth,{destructiveKeys:!0,minCapacity:this.keyBufferCapacity});return encoder.copyBufferToTexture({buffer:sortedIndices,offset:0,bytesPerRow:ORDER_TEXTURE_BYTES_PER_ROW,rowsPerImage:this.orderTextureHeight},{texture:orderTexture},{width:ORDER_TEXTURE_WIDTH$1,height:this.orderTextureHeight,depthOrArrayLayers:1}),this.validateOrderEnabled&&this.encodeOrderValidation(encoder,sortedIndices,totalPoints),!0}computeDistanceRange(objects,camera){_camPos.setFromMatrixPosition(camera.matrixWorld),_camZ.setFromMatrixColumn(camera.matrixWorld,2).normalize();let minDist=1/0,maxDist=-1/0;for(let object of objects){let box=object.objectSpaceBoundingBox;if(!box.isEmpty())for(let i=0;i<8;i++){_corner.set(i&1?box.max.x:box.min.x,i&2?box.max.y:box.min.y,i&4?box.max.z:box.min.z).applyMatrix4(object.matrixWorld);let d=_corner.sub(_camPos).dot(_camZ);d<minDist&&(minDist=d),d>maxDist&&(maxDist=d)}}return!Number.isFinite(minDist)||!Number.isFinite(maxDist)||maxDist<=minDist?{minDist:0,maxDist:1}:{minDist,maxDist}}encodeKeygen(encoder,objects,camera,dataTexture,transformTexture,totalPoints,bucketCount){if(totalPoints<=0)return null;let workgroupCount=Math.ceil(totalPoints/KEYGEN_WORKGROUP_SIZE);if(workgroupCount>this.maxWorkgroupsPerDimension)return this.keygenDispatchUnsupported||(this.keygenDispatchUnsupported=!0,console.error(`[GS] keygen 需 ${workgroupCount} 个 workgroup,超出单维上限 ${this.maxWorkgroupsPerDimension},GPU 排序不可用`)),null;let dataTex=this.resolveGpuTexture(dataTexture),transformTex=this.resolveGpuTexture(transformTexture);if(!dataTex||!transformTex)return null;let keys=this.ensureKeyBuffer(totalPoints);this.writeKeygenUniforms(objects,camera,totalPoints,bucketCount);let pass=encoder.beginComputePass({label:`gsplat-keygen`});return pass.setPipeline(this.keygenPipeline),pass.setBindGroup(0,this.getKeygenBindGroup(dataTex,transformTex,keys)),pass.dispatchWorkgroups(workgroupCount,1,1),pass.end(),keys}dispose(){var _a;this.radixSort.destroy(),(_a=this.keyBuffer)==null||_a.destroy(),this.keyBuffer=null,this.keyCapacity=0,this.uniformBuffer.destroy(),this.destroyOrderTexture(),this.invalidateKeygenBindGroup(),this.validateOrderEnabled=!1,this.validationInFlight||this.destroyStagingBuffer()}encodeOrderValidation(encoder,sortedIndices,totalPoints){if(this.validationInFlight)return;let byteLength=totalPoints*4,staging=this.ensureStagingBuffer(totalPoints);encoder.copyBufferToBuffer(sortedIndices,0,staging,0,byteLength),this.validationInFlight=!0,this.readbackAndValidate(staging,byteLength,totalPoints)}ensureStagingBuffer(totalPoints){var _a;let alignedElements=Math.max(1,Math.ceil(Math.max(totalPoints,this.stagingCapacity)/ELEMENTS_PER_WORKGROUP$1))*ELEMENTS_PER_WORKGROUP$1;return this.stagingBuffer&&alignedElements<=this.stagingCapacity?this.stagingBuffer:((_a=this.stagingBuffer)==null||_a.destroy(),this.stagingBuffer=this.device.createBuffer({label:`gsplat-order-validate-staging`,size:alignedElements*4,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.stagingCapacity=alignedElements,this.stagingBuffer)}destroyStagingBuffer(){var _a;(_a=this.stagingBuffer)==null||_a.destroy(),this.stagingBuffer=null,this.stagingCapacity=0}readbackAndValidate(staging,byteLength,totalPoints){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){try{yield this.device.queue.onSubmittedWorkDone(),yield staging.mapAsync(GPUMapMode.READ,0,byteLength);let copied=staging.getMappedRange(0,byteLength).slice(0);staging.unmap(),this.validatePermutation(new Uint32Array(copied),totalPoints)}catch(error){console.error(`[GS] 排列校验回读失败`,error)}finally{this.validationInFlight=!1,this.validateOrderEnabled||this.destroyStagingBuffer()}})}validatePermutation(indices,totalPoints){let seen=new Uint8Array(totalPoints);for(let i=0;i<totalPoints;i++){let p=indices[i];if(p>=totalPoints){console.error(`[GS] 排列校验失败:位置 ${i} 的值 ${p} 越界(totalPoints = ${totalPoints})`);return}if(seen[p]){console.error(`[GS] 排列校验失败:索引 ${p} 重复出现于位置 ${i}`);return}seen[p]=1}}ensureOrderTexture(totalPoints){let height=Math.max(1,Math.ceil(totalPoints/ORDER_TEXTURE_WIDTH$1));if(this.orderGpuTexture&&this.orderTextureHeight===height)return this.orderGpuTexture;this.destroyOrderTexture();let gpuTexture=this.device.createTexture({label:`gsplat-order-texture`,size:{width:ORDER_TEXTURE_WIDTH$1,height,depthOrArrayLayers:1},format:`r32uint`,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});return this.orderGpuTexture=gpuTexture,this.orderTextureHeight=height,this.orderThreeTexture=createOrderThreeTexture(gpuTexture),gpuTexture}destroyOrderTexture(){var _a,_b;(_a=this.orderThreeTexture)==null||_a.dispose(),this.orderThreeTexture=null,(_b=this.orderGpuTexture)==null||_b.destroy(),this.orderGpuTexture=null,this.orderTextureHeight=0}ensureKeyBuffer(totalPoints){var _a;let alignedElements=Math.max(1,Math.ceil(Math.max(totalPoints,this.keyCapacity)/ELEMENTS_PER_WORKGROUP$1))*ELEMENTS_PER_WORKGROUP$1;return this.keyBuffer&&alignedElements<=this.keyCapacity?this.keyBuffer:((_a=this.keyBuffer)==null||_a.destroy(),this.keyBuffer=this.device.createBuffer({label:`gsplat-sort-keys`,size:alignedElements*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.keyCapacity=alignedElements,this.invalidateKeygenBindGroup(),this.keyBuffer)}get keyBufferCapacity(){return this.keyCapacity}writeKeygenUniforms(objects,camera,totalPoints,bucketCount){let range=this.computeDistanceRange(objects,camera),invRange=1/(range.maxDist-range.minDist);return this.uniformF32[0]=_camPos.x,this.uniformF32[1]=_camPos.y,this.uniformF32[2]=_camPos.z,this.uniformF32[3]=range.minDist,this.uniformF32[4]=_camZ.x,this.uniformF32[5]=_camZ.y,this.uniformF32[6]=_camZ.z,this.uniformF32[7]=invRange,this.uniformU32[8]=totalPoints,this.uniformU32[9]=bucketCount,this.uniformU32[10]=0,this.uniformU32[11]=0,this.device.queue.writeBuffer(this.uniformBuffer,0,this.uniformScratch),range}resolveGpuTexture(texture){var _a,_b,_c,_d;if(!texture)return null;try{let backend=this.renderer.backend,gpuTexture=(_b=(_a=backend==null?void 0:backend.get)==null?void 0:_a.call(backend,texture))==null?void 0:_b.texture;return gpuTexture||(this.renderer.initTexture(texture),gpuTexture=(_d=(_c=backend==null?void 0:backend.get)==null?void 0:_c.call(backend,texture))==null?void 0:_d.texture),gpuTexture==null?null:gpuTexture}catch(_e){return null}}getTextureView(texture){let view=this.textureViewCache.get(texture);return view||(view=texture.createView(),this.textureViewCache.set(texture,view)),view}getKeygenBindGroup(dataTexture,transformTexture,keys){return this.keygenBindGroup&&this.boundDataTexture===dataTexture&&this.boundTransformTexture===transformTexture&&this.boundKeyBuffer===keys?this.keygenBindGroup:(this.keygenBindGroup=this.device.createBindGroup({label:`gsplat-keygen-bg`,layout:this.keygenBindGroupLayout,entries:[{binding:0,resource:this.getTextureView(dataTexture)},{binding:1,resource:this.getTextureView(transformTexture)},{binding:2,resource:{buffer:keys}},{binding:3,resource:{buffer:this.uniformBuffer}}]}),this.boundDataTexture=dataTexture,this.boundTransformTexture=transformTexture,this.boundKeyBuffer=keys,this.keygenBindGroup)}invalidateKeygenBindGroup(){this.keygenBindGroup=null,this.boundDataTexture=null,this.boundTransformTexture=null,this.boundKeyBuffer=null}};function createPlaceholderOrderTexture(){let tex=new three_webgpu.DataTexture(new Uint32Array(1),1,1,three_webgpu.RedIntegerFormat,three_webgpu.UnsignedIntType);return tex.name=`gsplat-order-placeholder`,tex.minFilter=three_webgpu.NearestFilter,tex.magFilter=three_webgpu.NearestFilter,tex.generateMipmaps=!1,tex.flipY=!1,tex.needsUpdate=!0,tex}var GpuSortPipeline=class extends GSplatPipeline{constructor(renderer){super(renderer),this.device=null,this.sortAdapter=null,this._pipelineCreateFailed=!1,this._hasSorted=!1,this._sortedPoints=0,this._frameTotalPoints=0,this.placeholderTexture=null;let backend=renderer.backend,device=backend==null?void 0:backend.device;if(!device){this._pipelineCreateFailed=!0,console.error(`[GS] GPU 排序管线创建失败:GPUDevice 未就绪`);return}this.device=device;try{this.sortAdapter=new SortAdapter(renderer,device)}catch(error){this._pipelineCreateFailed=!0,console.error(`[GS] GPU 排序管线创建失败,将降级为 CPU 排序`,error);return}}get usesGpuSort(){return!0}get unusable(){var _a;return this._pipelineCreateFailed||((_a=this.sortAdapter)==null?void 0:_a.unusable)===!0}get instanceCount(){return this.unusable||!this._hasSorted?0:Math.min(this._sortedPoints,this._frameTotalPoints)}get indexSource(){var _a,_b;return{kind:`orderTexture`,texture:(_b=(_a=this.sortAdapter)==null?void 0:_a.orderTexture)==null?this.ensurePlaceholderTexture():_b}}requestSort(ctx){let{device,sortAdapter}=this;if(this.unusable||!device||!sortAdapter||ctx.totalPoints<=0)return;let encoder=device.createCommandEncoder({label:`gsplat-sort`});sortAdapter.encode(encoder,ctx.objects,ctx.camera,ctx.assembler.dataTexture,ctx.transformStore.texture,ctx.totalPoints)&&(device.queue.submit([encoder.finish()]),this._hasSorted=!0,this._sortedPoints=ctx.totalPoints,this.inputsDirty=!1)}frameUpdate(ctx){this._frameTotalPoints=ctx.totalPoints}dispose(){var _a,_b;(_a=this.sortAdapter)==null||_a.dispose(),this.sortAdapter=null,this._hasSorted=!1,this._sortedPoints=0,(_b=this.placeholderTexture)==null||_b.dispose(),this.placeholderTexture=null}ensurePlaceholderTexture(){return this.placeholderTexture||(this.placeholderTexture=createPlaceholderOrderTexture()),this.placeholderTexture}},GSPLAT_PIPELINE_AUTO=0,GSPLAT_PIPELINE_RASTER_CPU_SORT=1,GSPLAT_PIPELINE_RASTER_GPU_SORT=2,ELEMENTS_PER_WORKGROUP=2048,ORDER_TEXTURE_WIDTH=2048,BYTES_PER_ELEMENT=4;function checkLimits(device,totalPoints,activePipeline){if((activePipeline==null?void 0:activePipeline.unusable)===!0)return`GPU 管线已失效`;if(!(totalPoints>0))return null;let limits=device.limits,maxStorageBufferBindingSize=Number(limits.maxStorageBufferBindingSize),maxTextureDimension2D=limits.maxTextureDimension2D,maxComputeWorkgroupsPerDimension=limits.maxComputeWorkgroupsPerDimension,workgroupCount=Math.ceil(totalPoints/ELEMENTS_PER_WORKGROUP),sortBufferBytes=workgroupCount*ELEMENTS_PER_WORKGROUP*BYTES_PER_ELEMENT;if(sortBufferBytes>maxStorageBufferBindingSize)return`排序缓冲需 ${sortBufferBytes} 字节,超出 maxStorageBufferBindingSize=${maxStorageBufferBindingSize}`;let orderTextureHeight=Math.ceil(totalPoints/ORDER_TEXTURE_WIDTH);if(orderTextureHeight>maxTextureDimension2D||ORDER_TEXTURE_WIDTH>maxTextureDimension2D)return`Order_Texture 需 ${ORDER_TEXTURE_WIDTH}×${orderTextureHeight},超出 maxTextureDimension2D=${maxTextureDimension2D}`;let maxWorkgroups=maxComputeWorkgroupsPerDimension*maxComputeWorkgroupsPerDimension;return workgroupCount>maxWorkgroups?`排序需 ${workgroupCount} 个 workgroup,超出 2D dispatch 上限 ${maxWorkgroups}`:null}function resolvePipelineMode(requested,renderer,totalPoints,activePipeline){try{let backend=renderer.backend,gpuOk=(backend==null?void 0:backend.isWebGPUBackend)===!0&&!!backend.device;if(requested===0){if(!gpuOk)return 1;let reason=checkLimits(backend.device,totalPoints,activePipeline);return reason?(console.warn(`[GS] GPU 排序不可用(${reason}),使用 CPU 排序`),1):2}if(requested===2){if(!gpuOk)return 1;let reason=checkLimits(backend.device,totalPoints,activePipeline);return reason?(console.warn(`[GS] GPU 排序不可用(${reason}),降级为 CPU 排序`),1):2}return requested}catch(e){return console.warn(`[GS] 管线模式解析失败,使用 CPU 排序`,e),1}}function resolveInstanceSize(requested,currentPipelineMode,pipelineResolved){if(typeof requested!=`number`||!Number.isFinite(requested))return{value:1,reason:`not-finite`};let floored=Math.floor(requested),clamped=floored,reason=null;return floored<1?(clamped=1,reason=`out-of-range`):floored>256&&(clamped=256,reason=`out-of-range`),pipelineResolved?currentPipelineMode===2?{value:clamped,reason}:{value:1,reason:clamped>1?`cpu-path`:reason}:{value:1,reason}}function buildPackedQuadGeometryData(quadCount){let positions=new Float32Array(12*quadCount),indices=new Uint16Array(6*quadCount);for(let i=0;i<quadCount;i++){positions.set([-1,-1,i,1,-1,i,1,1,i,-1,1,i],i*12);let b=i*4;indices.set([b,b+1,b+2,b,b+2,b+3],i*6)}return{positions,indices}}var UINT32_PER_SPLAT=8,BYTES_PER_SPLAT=UINT32_PER_SPLAT*4,POINTS_PER_CAPACITY_GRANULE=2048,DEFAULT_MAX_STORAGE_BUFFER_BINDING_SIZE=134217728,DEFAULT_MAX_COMPUTE_POINTS=16e6,EMPTY_LAYOUT=Object.freeze([]),SplatArena=class{constructor(device){this.tileBuffers=new Map,this.disposeListeners=new Map,this.arena=null,this.highWaterBytes=0,this.layoutTable=[],this.totalPointsValue=0,this.revisionValue=0,this.assemblyPending=!1,this.lastSignature=``,this.pendingDestroy=null,this._disposed=!1,this.maxPoints=DEFAULT_MAX_COMPUTE_POINTS,this.device=device}get buffer(){return this.unusable?null:this.arena}get totalPoints(){return this.unusable?0:this.totalPointsValue}get layout(){return this.unusable?EMPTY_LAYOUT:this.layoutTable}get revision(){return this.revisionValue}get unusable(){return this._disposed}sync(objects,resolveIndices){if(this._disposed)return;let live=new Set(objects);for(let obj of Array.from(this.tileBuffers.keys()))live.has(obj)||this.releaseTile(obj);if(this.unusable)return;for(let obj of objects)this.tileBuffers.has(obj)||this.createTileBuffer(obj);if(this.tryReuseLayout(objects,resolveIndices)<0){let candidate=[],start=0;for(let obj of objects){if(!this.tileBuffers.has(obj))continue;let count=obj.numPoints;if(count<=0)continue;let{transformIndex,layerIndex}=resolveIndices(obj);candidate.push({object:obj,startPoint:start,count,transformIndex,layerIndex}),start+=count}this.layoutTable=candidate,this.totalPointsValue=start}let signature=this.computeLayoutSignature(objects);signature!==this.lastSignature&&(this.lastSignature=signature,this.assemblyPending=!0,this.revisionValue++)}tryReuseLayout(objects,resolveIndices){let existing=this.layoutTable,start=0,index=0;for(let obj of objects){if(!this.tileBuffers.has(obj))continue;let count=obj.numPoints;if(count<=0)continue;let entry=existing[index];if(!entry||entry.object!==obj||entry.startPoint!==start||entry.count!==count)return-1;let{transformIndex,layerIndex}=resolveIndices(obj);if(entry.transformIndex!==transformIndex||entry.layerIndex!==layerIndex)return-1;start+=count,index++}return index!==existing.length||start!==this.totalPointsValue?-1:start}computeLayoutSignature(objects){return objects.map(o=>`${o.uuid}:${this.tileBuffers.has(o)?o.numPoints:-1}`).join(`|`)}createTileBuffer(obj){let numPoints=obj.numPoints;if(numPoints<=0)return!0;let packed=obj.packedData;if(!packed||packed.length<numPoints*UINT32_PER_SPLAT)return!1;let capacityBytes=this.effectiveCapacityBytes,pointCeiling=Math.floor(capacityBytes/BYTES_PER_SPLAT);if(numPoints>pointCeiling)throw Error(`[GS][Arena] 对象 ${obj.uuid} 的点数 ${numPoints} 超过单个 Tile_Buffer 上限 ${pointCeiling} 点(${capacityBytes} 字节,取设备绑定上限与 maxPoints=${this.maxPoints} 的较小者)`);let byteLength=numPoints*BYTES_PER_SPLAT,buffer=this.device.createBuffer({label:`gsplat-arena-tile-${obj.uuid}`,size:byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});return this.device.queue.writeBuffer(buffer,0,packed.buffer,packed.byteOffset,byteLength),this.tileBuffers.set(obj,buffer),this.registerTileDisposer(obj),!0}registerTileDisposer(obj){if(this.disposeListeners.has(obj)||typeof obj.addEventListener!=`function`)return;let listener=()=>{this.releaseTile(obj)};this.disposeListeners.set(obj,listener),obj.addEventListener(`dispose`,listener)}releaseTile(obj){let buffer=this.tileBuffers.get(obj),listener=this.disposeListeners.get(obj);if(!(!buffer&&!listener)){if(buffer){this.tileBuffers.delete(obj);try{buffer.destroy()}catch(_a){}}if(listener){this.disposeListeners.delete(obj);try{obj.removeEventListener(`dispose`,listener)}catch(_b){}}}}encodeAssembly(encoder){if(this.unusable||!this.assemblyPending)return;let totalPoints=this.totalPointsValue;if(totalPoints<=0){this.assemblyPending=!1;return}this.ensureCapacity(totalPoints);let arena=this.arena;if(arena){for(let entry of this.layoutTable){if(entry.count<=0)continue;let tileBuffer=this.tileBuffers.get(entry.object);tileBuffer&&encoder.copyBufferToBuffer(tileBuffer,0,arena,entry.startPoint*BYTES_PER_SPLAT,entry.count*BYTES_PER_SPLAT)}this.assemblyPending=!1}}flushPendingDestroy(){let old=this.pendingDestroy;if(old){this.pendingDestroy=null;try{old.destroy()}catch(_a){}}}ensureCapacity(totalPoints){let needed=totalPoints*BYTES_PER_SPLAT;if(this.arena&&needed<=this.highWaterBytes)return`ok`;let newCapacity=Math.max(1,Math.ceil(totalPoints/POINTS_PER_CAPACITY_GRANULE))*POINTS_PER_CAPACITY_GRANULE*BYTES_PER_SPLAT,limit=this.effectiveCapacityBytes;if(newCapacity>limit){let budgetHit=this.maxPointsBytes<this.maxStorageBufferBindingSize;throw Error(`[GS][Arena] 装配 ${totalPoints} 点需要 ${newCapacity} 字节,超过`+(budgetHit?`点数门控 maxPoints=${this.maxPoints}(${limit} 字节)`:`设备上限 ${limit} 字节`))}let created=this.device.createBuffer({label:`gsplat-arena`,size:newCapacity,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});return this.arena&&(this.pendingDestroy=this.arena),this.arena=created,this.highWaterBytes=newCapacity,this.revisionValue++,`grew`}get maxStorageBufferBindingSize(){var _a;let reported=(_a=this.device.limits)==null?void 0:_a.maxStorageBufferBindingSize;return reported&&reported>0?reported:DEFAULT_MAX_STORAGE_BUFFER_BINDING_SIZE}get maxPointsBytes(){let points=Math.floor(this.maxPoints);return Number.isFinite(points)&&points>0?points*BYTES_PER_SPLAT:0}get effectiveCapacityBytes(){return Math.min(this.maxStorageBufferBindingSize,this.maxPointsBytes)}dispose(){if(!this._disposed){this._disposed=!0;for(let obj of Array.from(this.tileBuffers.keys()))this.releaseTile(obj);for(let[obj,listener]of Array.from(this.disposeListeners.entries())){this.disposeListeners.delete(obj);try{obj.removeEventListener(`dispose`,listener)}catch(_a){}}this.tileBuffers.clear(),this.disposeListeners.clear(),this.destroyArenaBuffer(),this.flushPendingDestroy(),this.layoutTable=[],this.totalPointsValue=0,this.highWaterBytes=0,this.assemblyPending=!1,this.lastSignature=``}}destroyArenaBuffer(){let arena=this.arena;if(arena){this.arena=null;try{arena.destroy()}catch(_a){}}}},gsplatProjector_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-@QT`-预投影通道(U\bovql]nu-的-]|wrp|l]n)。<<<<-一线程一点:执行六道剔除门、协方差变换、雅可比投影、低通补偿、特征值分解与颜色取值,<<-为存活点写一条-?=-字节的紧凑记录并顺手写排序键(`|Xr\bl]n-已合并进来——写记录时正手握<<-深度值,省掉一整趟对-a|nyl]|v{-的遍历)。<<<<-剔除方案以-`}r`}yn-为基准,三处刻意偏离:<<<<--->;-协方差输入形态:`}r`}yn-从四元数-8-缩放现算,svr-的-|qA;;C-已是-@Q-协方差,<<------故改写为-mΣlvr-J-Y-·-Σly|pny-·-Yᵀm。两者数学恒等,不是近似(推导见第-⑥-步)。<<---?;-低通补偿:`}r`}yn-与-svr-都无条件-8=;@、不补偿不透明度(V{vn-原版的-qvynv|{),<<------本通道按数据的-mn{vNyvnrqm-标志分两条路径。77svr-没有这两条路径77,它解析了-`]g-的<<------msyntN{vNyvnm-却无任何消费方,故对抗锯齿训练的数据偏亮偏锐。取值依据是-t}yn-的<<------mnrv rlz|qrm,不是-svr-的行为。<<---@;-特征值分解的下限位置:见第-⑩-步,那里照的是-svr-而非-`}r`}yn。<<<<-──-量纲:最容易写错的一处-──<<<<-本项目的协方差在-}npx-阶段整体-×A(mnz<qnn;p}}m,svr-没有这一步),故<<-mλl}npxrq-J-A-·-λlrnym,于是<<-m`}r`}yn-的-?-·-\05?-·-λlrny6m-等于-m本通道的-\05?-·-λl}npxrq6m。o:}v\x07ry-判据因此写<<-m\05?-7-ynzoqn>6-I-zv{]v\x07ry`v rm,77不带那个-m?-7m77。照抄会让阈值翻倍,症状是远景过度剔除。<<<<-──-]|wrprql_rp|q:?=-字节-<-存活点-──<<<<-77mt}yn^nq;tym-的解包代码必须与此表一致77,两处都有这张表,改一处必须改另一处。失配的<<-症状不是崩溃而是画面错乱(位置、形状或颜色整体偏移),极难由症状反推成因。<<<<-\v-字-\v-字段-\v-编码-\v<<-\v-:::-\v-:::-\v-:::-\v<<-\v-=-\v-屏幕中心-\v-m}npx?\x07>C{|z5{qp-<-[QPl_N[TR6m-\v<<-\v->-\v-线性视深度-\v-movpnI@?K5qr}u6m-\v<<-\v-?-\v-_TO-\v-ov=:F-_、ov>=:>F-T、ov?=:?F-O(>=-ov-{|z)、ov@=:@>-共享指数-\v<<-\v-@-\v-椭圆长轴向量-\v-m}npx?\x07>Csy|n5n\x07v>6m,单位77像素77-\v<<-\v-A-\v-短轴长度-8-ny}un-\v-ov=:>B-myr{?m(s>C,像素)、ov>C:?@-ny}un(E)、ov?A:@>-保留-\v<<<<-77短轴只存长度77,方向由长轴旋转-F=°-重建:依据是-?×?-对称矩阵的两个特征向量必定正交,<<-故短轴方向由长轴唯一确定(差一个符号,而椭圆对称、符号无关)。省下-?-字节。<<<<-两个坐标系约定:m{qpm-是标准-[QP(\b-向上,77不翻转77,下游是-pyv}-空间);mn\x07v>m-<-myr{?m<<-的单位是77像素77,顶点着色器施加偏移时须换算-m×-?-<-vr}|m。<<<<-──-排序键:方向是-onpx:|:s|{-──<<<<-正确性基准是-Snyyonpxl]nu-的-m|Xr\btr{;tym:它取<<-mqr}uZrvp-J-q|5|yqPr{r-:-pnzrn]|vv|{9-pnzrng6m(mpnzrngm-是-mznv\x07d|yqm-的<<-778g77-列,urr-约定相机看向-−g,故-8g-指向相机背后),越远的点键越小,升序排序即由远到近。<<<<-恒等关系:mvrPr{r; -JJ-qr}uZrvpm,而本通道的-mqr}u-JJ-:vrPr{r; m。故键必须是<<-mqr}um-的77单调递减77函数,取按位取反的深度位模式:<<<<-----|Xr\b-J-5ovpnI@?K5qr}u6-k-=\x07SSSSSSSS6-KK-`\\_alXRfl`UVSa<<<<-保序性:VRRR-DBA-下非负单精度浮点的位模式按无符号整数比较与数值同序(mqr}u-K-=m-由第一道门<<-保证),取反变递减,右移只丢低位。于是升序-J-深度从大到小-J-onpx:|:s|{,正是硬件-ny}un<<-混合所需的顺序。77软光栅那条路径是相反的-s|{:|:onpx77(自己混合、可提前终止),照抄它<<-会让半透明叠加整体反过来,而不透明区域几乎看不出差别——最难定位的那一类症状。<<<<-本文件77不使用按位取反运算符77(码位->?C,转码脚本的混淆-m5p-8->@6-2->?Cm-对它不可逆),<<-一律写作-m\x07-k-=\x07SSSSSSSSm;注释里也不出现该字符。<<<<-──-无效槽位的哨兵-──<<<<-mznv{m-只写-mh=9-_r{qrlP|{6m-区间的键,mh_r{qrlP|{9-a|nyl]|v{6m-由本文件的第二个<<-入口-msvyyl|lxr\bm-预填-m`\\_alXRflV[cNYVQm。77mpyrnOssrm-填-=-是错的77:升序排序里-=-恒为<<-最小键,无效槽位会排到最前被优先绘制、读到未初始化的记录,症状是画面出现离谱的斑点。<<-「取反让-=-成为最大键」这个说法不成立——取反改的是键与深度的对应关系,改不了「无符号升序里<<-=-最小」。取反后有效键的下界实为-m=\x07E=DSSm,=-严格小于所有有效键。<<<<-──-两级紧凑写入-──<<<<-工作组内先用共享原子取号,再由-=-号线程为整组向全局计数器预留一段连续区间。77为什么不直接<<-对全局计数器-n|zvpNqq77:那样每个存活点一次全局原子操作(>>B-万点约-@>-万次),两级把它降到<<-工作组数(约-AB==-次),百万点量级下原子单元本会成为瓶颈。<<<<-77三处-m|xt|}Onvr56m-全部在无条件路径上77,这是本文件最关键的约束:<<<<---:-剔除判定收进-m}|wrpl}|v{56m-辅助函数(函数内的-mr{m-不影响-mznv{m-的控制流),<<-----mznv{m-拿到的是带-mvrqm-标志的结构体。<<---:-mvs-5vrq6m-与-mvs-5yn{r-JJ-=6m-只包住77原子操作本身77,屏障写在-mvsm-之外。<<---:-mznv{m-里77没有任何提前-mr{m77:越界线程也要走完三处屏障,只是-mvrqm-恒为-snyr。<<<<-写成「不存活就-r{」会让屏障落进非-{vs|z-p|{|y-sy|,是未定义行为。软光栅的<<-_nrl]n-踩过同源的坑,症状是画面局部错乱且随窗口尺寸变化。m{ntnm-抓不到这一条——刻意注入<<-提前-r{-后它仍报-cnyvqnv|{-pprsy。<<<<-mt`v|m-77必须显式清零77:dT`Y-不保证-|xt|}-变量有初值,且共享内存跨工作组复用。<<<<-──-颜色:烘焙纹理(ONXRQ-变体)或-`]g-解码(非-ONXRQ-变体)──<<<<-本通道77不求值-`U77。方向相关的-`U-颜色由-m`UOnxrm-按-vyr-预先烘焙进一张-_TON>CS-纹理<<-(宽-?=AE、>-r\x07ry<}yn、按-P|z}rl]nu-的全局点索引-}-寻址,即-Nr{n-的点索引),<<-本通道只在-m<<0VSlONXRQm-变体里做一次-mr\x07rY|nqm。非-ONXRQ-变体(`U-关闭-<-烘焙纹理未就绪)<<-沿用-`]g-编码的-QP-颜色解码,且77不声明-ov{qv{t-F77——两套-ov{q-t|}-yn\b|-由-P]b-侧<<-mryrpcnvn{5;;;9-4ONXRQ49-;;;6m-生成,与-mQVNTm-变体机制相同。<<<<-77颜色取值之后-pynz}-到-h=9->j77-对齐-Snyyonpx(两条变体都执行)。于是-mr{p|qrltom-的-?-ov<<-共享指数实际恒为-=,暂时是死码;保留它是为了将来两侧同时改走-UQ_-时无需改布局。<<<<-──-绑定命名-──<<<<-全部绑定名与两个-|xt|}-变量名都对着-77dT`Y-保留字表77核过。特别地:布局表叫<<-myn\b|anoyrm-而77不是77-myn\b|m——后者是保留字,用它做标识符会在-mprnr`unqrZ|qyrm-阶段<<-报错,本项目真的这么崩过,而-mpm-与-\b}rq|p-都发现不了(dT`Y-是运行时才编译的字符串)。<<-新增绑定时务必核表:msvyrm-<-mrm-<-m\b}rm-<-mtrm-<-munrqm-<-mnz}yrm-<-mov{qv{tm-<<<-mr\x07rm-<-m{|zm-<-m{|zm-<-mrsm-<-mz|qm-这些看着无害的名字同样不能用。<<-──-结构性常量-──────────────────────────────────────────────────────────────<<<<-77逐帧可变的量走-{vs|z,结构性常量写成-dT`Y-mp|{m。77-dT`Y-无法-vz}|-a`-常量,故以下<<-常量必须与-a`-侧手工保持一致;改一侧忘了另一侧,症状是画面整体错乱而两边代码看着都对。<77-Nr{n-内每点-E-个-@?-J-@?-字节。-7<p|{-b@?l]R_l`]YNaG-@?-J-EH<77-7-]|wrprql_rp|q-每条-B-个-@?-J-?=-字节。-7-77须与-mu\bovqP|{n{;m-的-mb@?l]R_l]_\\WRPaRQl_RP\\_Qm-一致。77-7<p|{-b@?l]R_l]_\\WRPaRQl_RP\\_QG-@?-J-BH<77-记录内各字段的字下标,与上方布局表一一对应。-7<p|{-_RPlPR[aR_G-@?-J-=Hp|{-_RPlQR]aUG-@?-J->Hp|{-_RPlP\\Y\\_G-@?-J-?Hp|{-_RPlNeV`>G-@?-J-@Hp|{-_RPlZV[\\_G-@?-J-AH<77-7-屏幕中心的-{|z>C-编码量程:存-m{qp-<-[QPl_N[TRm,解包时乘回。-7-7-77取-B;=-是存活中心-[QP-绝对值的理论上界77,即「永不-pynz}」。推导:|ss:prr{-门只要求-7-包围盒与画面相交,中心可以在画面外很远,判据给出-m\v{qp;\x07\v-IJ->-8-A-·-zn\x07_nqv-<-vr}|;\x07m,-7-而-mzn\x07_nqv-IJ-vr}|m,故右侧-IJ-B。-7-7-代价是量化步长-m?-·-B-<-CBB@B-J->;B?Cr:Am([QP),>=E=}-下折合-=;=E-到-=;>B-像素,不可见。-7-改小它(例如-?;=)会让靠近画面边缘的巨大-}yn-中心被-pynz}、位置明显跑偏。-7<p|{-[QPl_N[TRG-s@?-J-B;=H<77-排序键右移位数。77须与-mu\bovqP|{n{;m-的-m`\\_alXRfl`UVSam-一致。77-7<p|{-`\\_alXRfl`UVSaG-@?-J->?H<77-7-无效槽位的排序键哨兵(?=-位全->)。77须与-mu\bovqP|{n{;m-的同名常量一致。77-7-7-由本文件的-msvyyl|lxr\bm-入口在-mznv{m-之前整块预填,理由见文件头「无效槽位的哨兵约定」。-7<p|{-`\\_alXRflV[cNYVQG-@?-J-=\x07SSSSSH<77-7-工作组线程数。77须与-mu\bovqP|{n{;m-的-m]_\\WRPa\\_ld\\_XT_\\b]l`VgRm-一致77,-7-它同时是两级紧凑写入的粒度(全局原子次数-J-mprvy5a|nyl]|v{-<-本值6m)。-7<p|{-d\\_XT_\\b]lYN[R`G-@?-J-?BCH<77-_TO-各通道的->=-ov-{|z-满量程。-7<p|{-_TOlb[\\_ZlZNeG-s@?-J->=?@;=H<77-}npxrqQnn-中-to-的-`]g-编码比例-m`UlP=-<-=;>Bm,须与-qrp|qrd|xr;-及-Snyyonpx-一致。-7<p|{-`]glP\\Y\\_l`PNYRG-s@?-J->;EE=C@>FAB>BF>EDDH<77-烘焙纹理宽度(r\x07ry)。77须与-muOnxr;m-的-mONXRldVQaUm-一致。77-7<p|{-ONXRQlaReldVQaUG-@?-J-?=AEH<77-7-逐帧-{vs|z。77与-mt}ynPyy;tym-的-mSnzrb{vs|zm-逐字段相同77,故-P]b-侧的写入-7-代码可以原样复用(_r\0vrzr{->;B-的「常量唯一来源」在-a`-侧,本结构体只是它的镜像)。-7-7-77`U-<-pyv}}r-<-入场动画的参数一律不加进这里77,而是另开-mRssrpb{vs|zm(ov{qv{t->>)。-7-理由就是上面那句「逐字段相同」:一旦往这里塞字段,与-mt}ynPyy;tym-共用的那段-P]b-写入-7-代码就得分叉,而两个结构体一旦分叉又极容易只改一边——那种失配-mpm-抓不到(两边都是-7-手写的字节偏移),只会表现为画面整体错乱。分成两块-{vs|z-的代价是多一个绑定槽位。-7<p-Snzrb{vs|z-\n--vrG-znA\x07AIs@?K9----------<<-视图矩阵--vr]|wG-znA\x07AIs@?K9------<<-vr:}|wrpv|{--s|pnyG-rp?Is@?K9-----------<<-5]h=jh=j-·-宽-·-=;B9-]h>jh>j-·-高-·-=;B6--vr}|G-rp?Is@?K9--------<<-画面像素宽高--|ny]|v{G-@?9-----------<<-Nr{n-内有效点数--r{\bP|{G-@?9------------<<-布局表项数(二分查找上界,不可用-nn\bYr{tu-代替)--zv{]v\x07ry`v rG-s@?9----------<<-最小屏幕尺寸阈值(椭圆长轴像素长度)--zn\x07_nqvPn}G-s@?9----------<<-半径上限的绝对上界(实际上限再与画面短边取小)--p|]npx`pnyrG-s@?9----------<<-协方差-}npx-量纲换算系数(J-A;=)--rz?`\0Sy||G-s@?9----------<<-特征值分解中-rz?-平方的下限--qr}uR}vy|{G-s@?9----------<<-雅可比除零保护--qrR}vy|{G-s@?9------------<<-不透明度补偿的除零保护\fHp-Yn\b|R{\b-\n--nl}|v{G-@?9--p|{G-@?9--n{s|zlv{qr\x07G-@?9--yn\brlv{qr\x07G-@?9\fH<77-7-`U-<-pyv}}r-<-入场动画的逐帧参数,共-CA-字节。-7-7-77字段顺序不能随手调换77:mrp@Is@?Km-对齐->C-字节,故每个-rp@-后面必须紧跟一个-A-字节标量-7-把空洞填掉,否则编译器插入隐式-}nqqv{t-而-P]b-侧按「字段依次排列」写入就整体错位。错位的-7-症状是包围盒或相机位置变成垃圾值、}yn-整体飞散,看不出是布局问题。-7-7-偏移表在-mt}yn:u\bovq:r{qrr;m-的那组-m\\SSl7m-常量里,两处必须一致。-7<p-Rssrpb{vs|z-\n--<77-入场动画包围盒下界(世界空间)。对应材质的-mnttrtnv|{O|{qZv{m。-7<--nttrtnv|{O|{qZv{G-rp@Is@?K9--<77-入场动画总进度-mh=9->jm。对应材质的-mnttrtnv|{]|trm。-7<--nttrtnv|{]|trG-s@?9--<77-入场动画包围盒上界(世界空间)。对应材质的-mnttrtnv|{O|{qZn\x07m。-7<--nttrtnv|{O|{qZn\x07G-rp@Is@?K9--<77-单点动画时长占总时长的比例。对应材质的-mnttrtnv|{]|v{Qnv|{m。-7<--nttrtnv|{]|v{Qnv|{G-s@?9--<77---7-相机世界位置。77Snyyonpx-用的是-a`Y-的-mpnzrn]|vv|{m-内建77,p|z}r-里没有对应内建,---7-故显式传入。不从-msnzr;vrm-反推:dT`Y-没有-mv{rr56m,而视图矩阵的逆需要求逆---7-(只取平移列是错的——那是-m:_·m,不是相机位置)。---7<--pnzrnd|yq]|G-rp@Is@?K9--<77-入场动画开关。对应材质-mnttrtnv|{R{noyrq-L->-G-=m,判据也逐字用-mJJ->m。-7<--nttrtnv|{R{noyrqG-@?9--<77---7-本帧是否使用烘焙颜色(>-<-=)。与所选变体一致(ONXRQ-变体恒写->),仅作状态镜像;---7-颜色来源由编译期变体决定,不由本字段分支。---7<--uOnxrqG-@?9--<77-占位,保持-m{zTYn\brm-<-m{zTPyv}}rm-的偏移不变。-7<--l}nq=G-@?9--<77-vryn\br-层数。对应材质的-m{zTYn\brm(a`Y-里是编译期字面量,这里是运行时上界)。-7<--{zTYn\brG-@?9--<77-pyv}}r-个数。对应材质的-m{zTPyv}}rm(同上)。-7<--{zTPyv}}rG-@?9\fH<77-7-m}|wrpl}|v{56m-的返回值:一条已编码完的记录加一个存活标志。-7-7-77编码放在辅助函数里而不是-znv{-里77,是为了让-znv{-只剩「取号-<-预留-<-写入」三段,-7-三处屏障之间没有任何可能被条件包住的逻辑,屏障的无条件性一眼可验。-7<p-]|wrprq-\n--vrqG-o||y9--|qG-nn\bI@?9-BK9--|Xr\bG-@?9\fH<<-=:@-是输入(Nr{n-与三块镜像),A:C-是输出(紧凑记录、排序键、全局计数器)。Mt|}5=6-Mov{qv{t5=6-nI|ntr9-rnqK-nr{nG-nn\bI@?KHMt|}5=6-Mov{qv{t5>6-nI|ntr9-rnqK-yn\b|anoyrG-nn\bIYn\b|R{\bKHMt|}5=6-Mov{qv{t5?6-nI|ntr9-rnqK-n{s|zG-nn\bIznA\x07AIs@?KKHMt|}5=6-Mov{qv{t5@6-nI|ntr9-rnqK-|owrp]nnzG-nn\bIrpAIs@?KKHMt|}5=6-Mov{qv{t5A6-nI|ntr9-rnqlvrK-}|wrprqPnpurG-nn\bI@?KHMt|}5=6-Mov{qv{t5B6-nI|ntr9-rnqlvrK-|Xr\bG-nn\bI@?KHMt|}5=6-Mov{qv{t5C6-nI|ntr9-rnqlvrK-r{qrP|{G-n|zvpI@?KHMt|}5=6-Mov{qv{t5D6-nI{vs|zK-snzrG-Snzrb{vs|zH<<-──-诊断变体的切换机制-──────────────────────────────────────────────────────<<<<-77dT`Y-没有预处理指令77(本仓库的-dT`Y-是解码后原样送-prnr`unqrZ|qyr-的),所以变体<<-切换靠-P]b-侧的字符串剥离:加载后按-m<<0VSlQVNTm-<-m<<0RY`RlQVNTm-<-m<<0R[QlQVNTm-三个<<-标记取其中一段(mryrpQvntcnvn{m,按整行-vz-后精确匹配)。<<<<-只替换-mp|{ltnrm-的77函数体77与-tnrP|{r-的声明,因此六处调用点在两个变体里都合法、<<-无需各自加标记。非诊断变体里它是空函数,编译器-v{yv{r-后为空、零开销。<<<<-用「空函数」而不是「运行时-{vs|z-分支」,是为了满足「关闭时不创建对象、不做统计累加」<<-——{vs|z-分支会让-tnrP|{r-缓冲必须始终绑定。<<0VSlQVNTMt|}5=6-Mov{qv{t5E6-nI|ntr9-rnqlvrK-tnrP|{rG-nn\bIn|zvpI@?KKHs{-p|{ltnr5tnrG-@?6-\n--n|zvpNqq53tnrP|{rhtnrj9->6H\f<<0RY`RlQVNTs{-p|{ltnr5tnrG-@?6-\n--l-J-tnrH\f<<0R[QlQVNT<<-──-从-a`Y-迁入的三项功能所需的新增绑定(F-起,E-被诊断变体占用)────────────<<<<-编号从-F-开始而不是插在-D-之后,是为了让-mtnrP|{rm-保持在-E:那个绑定只存在于诊断变体,<<-若把新绑定插在它前面,两个变体的编号就会错开一位,而-ov{q-t|}-yn\b|-是按编号建的,<<-错开一位的症状是绑定张冠李戴(把烘焙纹理当成计数器缓冲),mprnrOv{qT|}m-阶段直接抛错。<<-编号不必连续,非诊断变体缺-E、非-ONXRQ-变体缺-F、两者都缺->=-都是合法的。<77-7-`U-烘焙颜色纹理(_TON>CS-_r{qrantr,宽-mONXRQlaReldVQaUm,>-r\x07ry<}yn)。-7-77只在-ONXRQ-变体里声明77,非-ONXRQ-变体的-ov{q-t|}-yn\b|-不含-ov{qv{t-F。-7-7-采样方式是-mr\x07rY|nqm(整数坐标、无过滤),77不是77-mr\x07r`nz}yrm:后者在非-{vs|z-7-p|{|y-sy|-里非法,而本通道的-m}|wrpl}|v{m-恰恰跑在-mvs-5}-I-|ny]|v{6m-之内。-7-7-ov{q-t|}-yn\b|-给-mnz}yra\b}rG-4{svyrnoyr:sy|n4m:ton>Csy|n-虽可过滤,但-7-mr\x07rY|nqm-不需要过滤,m{svyrnoyr:sy|nm-对可过滤格式同样合法,且这条77不能用-7-myn\b|G-4n|4m-推导77(本系列已在-_r|yrl]n-的-m@?sy|nm-上踩过坑-B)。-7<<<0VSlONXRQMt|}5=6-Mov{qv{t5F6-n-onxrqP|y|G-r\x07rl?qIs@?KH<<0R[QlONXRQ<77-`U-<-pyv}}r-<-入场动画的逐帧参数,布局见-mRssrpb{vs|zm-的偏移表。-7<Mt|}5=6-Mov{qv{t5>>6-nI{vs|zK-rssrp]nnzG-Rssrpb{vs|zH<<-──-两级紧凑写入用的工作组共享状态-──────────────────────────────────────────<<<<-mt`v|m:本工作组内的存活计数,兼作组内取号器。<<-mtOnrm:本工作组在-m}|wrprqPnpurm-<-m|Xr\bm-里被预留区间的起始下标。nI|xt|}K-t`v|G-n|zvpI@?KHnI|xt|}K-tOnrG-@?H<<-由点索引定位其所属布局表项。<<<<-上界用-{vs|z-的-r{\bP|{-而非-nn\bYr{tu53yn\b|anoyr6:后者返回按高水位分配的<<-容量,大于实际项数时会落进未初始化的记录。<<<<-77调用方必须保证-r{\bP|{-K-=77:本函数的-muv-J-r{\bP|{-:->m-在-=-时会绕回<<-=\x07SSSSSSSS-随后越界读。该前提由「项数为-=-时整个通道不派发」保证。s{-sv{qlr{\b5}G-@?9-r{\bP|{G-@?6-:K-@?-\n--n-y|G-@?-J-=H--n-uvG-@?-J-r{\bP|{-:->H--y||}-\n----vs-5y|-KJ-uv6-\n-ornxH-\f----yr-zvq-J-5y|-8-uv-8->6-KK->H----vs-5yn\b|anoyrhzvqj;nl}|v{-IJ-}6-\n-y|-J-zvqH-\f-ryr-\n-uv-J-zvq-:->H-\f--\f--r{-y|H\f<<-解-unys-精度浮点。协方差的-C-个分量以两个-unys-打包进一个-@?。s{-{}npxlunys?5}npxrqG-@?6-:K-rp?Is@?K-\n--r{-{}npx?\x07>Csy|n5}npxrq6H\f<77-7-_TO-编码为->=<>=<>=-{|z-8-?-ov-共享指数。-7-7-指数-mrm-取使-m}rnx-IJ-?krm-成立的最小值(夹在-mh=9-@jm),缩放因子-mpnyr-J-?krm-7-取->-<-?-<-A-<-E。77为什么要指数77:本任务的颜色来自-]npxrql`}yn-的-v{E,恒在-7-mh=9->jm-内、mrm-恒为-=;但任务-?;?-迁入-`U-求值后-monr-8-`Um-可以超过->(UQ_),-7-那时->=-ov-定点会硬-pynz}、亮部整块变平。留出-?-ov-指数使量程覆盖到-E,代价是每通道-7-从->=-ov-有效位降到->=-ov-相对精度。-7-7-77精度上界77:绝对误差-IJ-mpnyr-<-5?-·->=?@6m(含-m8=;Bm-的就近取整)。诊断容差按-7-qrvt{;zq-的口径取更宽的-mpnyr-<->=?@m:mr-J-=m-时-F;Er:A、mr-J-@m-时-D;Er:@。-7-7-77已知截断77:m}rnx-K-Em-的分量被-pynz}-到-E。`U-求值后的合理颜色远不到-E,-7-真到了那个量级说明数据有问题,pynz}-比让指数吃掉更多位更划算。-7<s{-r{p|qrlto5toG-rp@Is@?K6-:K-@?-\n--yr-}|vvr-J-zn\x075to9-rp@Is@?K5=;=66H--yr-}rnx-J-zn\x075}|vvr;\x079-zn\x075}|vvr;\b9-}|vvr; 66H--n-rG-@?-J-=H--vs-5}rnx-K-A;=6-\n----r-J-@H--\f-ryr-vs-5}rnx-K-?;=6-\n----r-J-?H--\f-ryr-vs-5}rnx-K->;=6-\n----r-J->H--\f--yr-pnyr-J-s@?5>-II-r6H--<<-先归一化到-h=9->j-再乘满量程,m8=;Bm-后截断即就近取整(rp@I@?K56-的转换是截断)。--yr-{|znyv rq-J-pynz}5}|vvr-<-pnyr9-rp@Is@?K5=;=69-rp@Is@?K5>;=66H--yr-\0-J-rp@I@?K5{|znyv rq-7-_TOlb[\\_ZlZNe-8-rp@Is@?K5=;B66H--r{-\0;\x07-\v-5\0;\b-II->=6-\v-5\0; -II-?=6-\v-5r-II-@=6H\f<77-7-单点的完整判定与编码。-7-7-这里的-mr{m-只退出本函数,不影响-mznv{m-的控制流——这正是把判定链收进函数的目的:-7-判定链保留「命中即-r{」的原形,而-mznv{m-里的三处-7-m|xt|}Onvr56m-依然在无条件路径上。-7-7-M}nnz-}-点索引,调用方保证-m}-I-snzr;|ny]|v{m-7<s{-}|wrpl}|v{5}G-@?6-:K-]|wrprq-\n--n-ryG-]|wrprqH--ry;vrq-J-snyrH--ry;|Xr\b-J-=H--<<-──-①-由点索引取布局表项,得到-n{s|zV{qr\x07-──--yr-r{\bV{qr\x07-J-sv{qlr{\b5}9-snzr;r{\bP|{6H--yr-r{\b-J-yn\b|anoyrhr{\bV{qr\x07jH--yr-v-J-r{\b;n{s|zlv{qr\x07H--<<-──-②-取世界矩阵与该对象的补偿参数-──--yr-z|qry-J-n{s|zhvjH--yr-}nnz-J-|owrp]nnzhvjH--yr-}rOyNz|{-J-}nnz;\x07H--yr-oyNz|{-J-}nnz;\bH--<<-──-③-从-Nr{n-解出该点的-]npxrql`}yn-──--yr-onr-J-}-7-b@?l]R_l`]YNaH--yr-y|pnyPr{r-J-rp@Is@?K5----ovpnIs@?K5nr{nhonr-8-=j69----ovpnIs@?K5nr{nhonr-8->j69----ovpnIs@?K5nr{nhonr-8-?j6--6H--yr-}npxrqP|y|-J-nr{nhonr-8-@jH--<<-|qA;;C:@Q-协方差-unys-上三角-C-分量(p|==\vp|=>-<-p|=?\vp|>>-<-p|>?\vp|??)。--yr-p=>p==-J-{}npxlunys?5nr{nhonr-8-Aj6H--yr-p>>p=?-J-{}npxlunys?5nr{nhonr-8-Bj6H--yr-p??p>?-J-{}npxlunys?5nr{nhonr-8-Cj6H--yr-==-J-p=>p==;\x07H--yr-=>-J-p=>p==;\bH--yr-=?-J-p>>p=?;\x07H--yr->>-J-p>>p=?;\bH--yr->?-J-p??p>?;\x07H--yr-??-J-p??p>?;\bH--n-ny}un-J-s@?55}npxrqP|y|-KK-?A6-3-=\x07SS6-<-?BB;=H--<<-颜色在第-⑬-步(全部剔除门之后)取值:ONXRQ-变体读烘焙纹理,被剔除的点完全不读纹理;--<<-非-ONXRQ-变体解码-]npxrql`}yn-的-`]g-颜色。--<<-──-④-世界与视空间位置,门->:相机背后-──--yr-|yqPr{r-J-z|qry-7-rpAIs@?K5y|pnyPr{r9->;=6H--yr-vrPr{r-J-snzr;vr-7-|yqPr{rH--yr-qr}u-J-:vrPr{r; H--vs-5qr}u-IJ-=;=6-\n----p|{ltnr5=6H----r{-ryH--\f--<<-──-⑤-裁剪空间,门-?:-退化-──--<<-这道门-]yn\bPn{n-引擎没有、`}r`}yn-有。它防的是-{qp-J-pyv};\x07\b-<-pyv};-除零--<<-产生非数,进而污染后续全部判定与缓存内容。代价是一次浮点比较。--yr-pyv}-J-snzr;vr]|w-7-|yqPr{rH--vs-5pyv};-JJ-=;=6-\n----p|{ltnr5>6H----r{-ryH--\f--yr-{qp-J-pyv};\x07\b-<-pyv};H--<<-──-⑥-视空间-@Q-协方差:Σlvr-J-Y-·-Σly|pny-·-Yᵀ-──--<<--<<-推导(说明为何与-`}r`}yn-恒等而非近似):--<<---`}r`}yn-算的是-T-·-Tᵀ,其中-T-J-Y-·-_-·-`(Y-为-vr×z|qry-的线性部分)。--<<---展开:T-·-Tᵀ-J-Y-·-5_·`6·5_·`6ᵀ-·-Yᵀ--<<---而-svr-的-Σly|pny-就是-5_·`6·5_·`6ᵀ(}npx-阶段由四元数与缩放算好后存的)。--<<---代入即得同一个-Σlvr。--yr-z|qrycvr-J-snzr;vr-7-z|qryH--yr-Y-J-zn@\x07@Is@?K5z|qrycvrh=j;\x07\b 9-z|qrycvrh>j;\x07\b 9-z|qrycvrh?j;\x07\b 6H--yr-vtznY|pny-J-zn@\x07@Is@?K5----rp@Is@?K5==9-=>9-=?69----rp@Is@?K5=>9->>9->?69----rp@Is@?K5=?9->?9-??6--6H--yr-vtzncvr-J-Y-7-vtznY|pny-7-n{}|r5Y6H--yr-p==-J-vtzncvrh=jh=jH--yr-p=>-J-vtzncvrh=jh>jH--yr-p=?-J-vtzncvrh=jh?jH--yr-p>>-J-vtzncvrh>jh>jH--yr-p>?-J-vtzncvrh>jh?jH--yr-p??-J-vtzncvrh?jh?jH--<<-──-⑦-雅可比投影到-?Q(与-`}r`}yn-逐字对应)──--yr-nsrQr}u-J-zn\x075qr}u9-snzr;qr}uR}vy|{6H--yr-v{Qr}u-J->;=-<-nsrQr}uH--yr-w\x07=-J-snzr;s|pny;\x07-7-v{Qr}uH--yr-w\x07?-J-snzr;s|pny;\x07-7-vrPr{r;\x07-7-v{Qr}u-7-v{Qr}uH--yr-w\b>-J-snzr;s|pny;\b-7-v{Qr}uH--yr-w\b?-J-snzr;s|pny;\b-7-vrPr{r;\b-7-v{Qr}u-7-v{Qr}uH--yr-==-J-w\x07=-7-p==-8-w\x07?-7-p=?H--yr-=>-J-w\x07=-7-p=>-8-w\x07?-7-p>?H--yr-=?-J-w\x07=-7-p=?-8-w\x07?-7-p??H--yr->>-J-w\b>-7-p>>-8-w\b?-7-p>?H--yr->?-J-w\b>-7-p>?-8-w\b?-7-p??H--n-p|==-J-==-7-w\x07=-8-=?-7-w\x07?H--n-p|=>-J-=>-7-w\b>-8-=?-7-w\b?H--n-p|>>-J->>-7-w\b>-8->?-7-w\b?H--<<-──-⑧-OylP|z}r{nv|{(替换-`}r`}yn-的无条件-8=;@)──--<<--<<-次序不得调换:qr\\vt-取在-]rlOy-77之后77、Oy-77之前77,因此不透明度补偿的--<<-基准包含了-]rlOy-的效果。两个参数默认互斥(一个为-=-时另一个非-=),--<<-但业务方可以同时设为非零,故次序必须固定。--<<--<<-×p|]npx`pnyr-不可漏:参数以真实-}\x07²-给出,而这里的协方差是真实值的-A-倍。--yr-}rOy-J-}rOyNz|{-7-snzr;p|]npx`pnyrH--p|==-J-p|==-8-}rOyH--p|>>-J-p|>>-8-}rOyH--vs-5oyNz|{-K-=;=6-\n----yr-qr\\vt-J-p|==-7-p|>>-:-p|=>-7-p|=>H----yr-oy-J-oyNz|{-7-snzr;p|]npx`pnyrH----p|==-J-p|==-8-oyH----p|>>-J-p|>>-8-oyH----yr-qrOy-J-p|==-7-p|>>-:-p|=>-7-p|=>H----<<-ρ-J-\05qr5Σ6-<-qr5Σ8εV66,使-}yn-积分能量守恒(面积变大、浓度变淡)。----<<-由行列式齐次性-qr5x·Σ6-J-x²·qr5Σ6,ε-与-Σ-同样-×A-时比值中的-x²-约掉,----<<-故-ρ-与-}npx-缩放无关。----ny}un-J-ny}un-7-\05pynz}5qr\\vt-<-zn\x075qrOy9-snzr;qrR}vy|{69-=;=9->;=66H--\f--<<-──-门-@:协方差退化-──--<<-放在补偿之后:补偿会让原本退化的协方差变为可逆,这正是它的作用之一--<<-(8=;@-在-`}r`}yn-与引擎里同样承担「保证可逆」的职责)。--yr-qr-J-p|==-7-p|>>-:-p|=>-7-p|=>H--vs-5qr-IJ-=;=6-\n----p|{ltnr5?6H----r{-ryH--\f--<<-──-⑨-半径上限截断(必须在特征值分解之前)──--yr-zn\x07_nqv-J-zv{5snzr;zn\x07_nqvPn}9-zv{5snzr;vr}|;\x079-snzr;vr}|;\b66H--yr-nqveb{pn}}rq-J-\05?;=-7-p|==6H--yr-nqvfb{pn}}rq-J-\05?;=-7-p|>>6H--yr-pn}`pnyr-J-zn\x075>;=9-zn\x075nqveb{pn}}rq9-nqvfb{pn}}rq6-<-zn\x07_nqv6H--yr-v{Pn}`pnyr?-J->;=-<-5pn}`pnyr-7-pn}`pnyr6H--p|==-J-p|==-7-v{Pn}`pnyr?H--p|=>-J-p|=>-7-v{Pn}`pnyr?H--p|>>-J-p|>>-7-v{Pn}`pnyr?H--<<-──-⑩-特征值分解,门-A:亚像素-──--<<--<<-77下限加在-mrz?m-的平方上,不是加在-λ₂-上。77-两个参考实现在这里不同,效果相反:--<<--<<---`}r`}yn:mynzoqn?-J-zn\x075zvq-:-nqv9-=;>6m--------←-抬高-λ₂-→-}yn-更圆--<<---svr(本通道的基准):mrz?-J-\05zn\x075=;>9-npr\\r?²-:-Q66m-←-抬高-λ₁、压低-λ₂-→-更扁--<<--<<-以-mnpr\\r?-J-=;@Bm、mnpr\\r?²-:-Q-J-=;=>m-的小-}yn-为例,前者得轴长-=;FB<=;D>}\x07--<<-(近圆),后者得->;>B<=;?C}\x07(细长条)。小-}yn-占画面绝大多数,用错位置的症状是整体形状--<<-与-Snyyonpx-完全不同。这一处写错过一次。--yr-npr\\r?-J-=;B-7-5p|==-8-p|>>6H--<<-重算行列式:门-@-用的是-pn}`pnyr-缩放77之前77的值,特征值必须用缩放之后的。--yr-qrPn}}rq-J-p|==-7-p|>>-:-p|=>-7-p|=>H--yr-rz?-J-\05zn\x075snzr;rz?`\0Sy||9-npr\\r?-7-npr\\r?-:-qrPn}}rq66H--yr-ynzoqn>-J-npr\\r?-8-rz?H--yr-ynzoqn?-J-npr\\r?-:-rz?H--<<-λ₂-IJ-=-的剔除,与-Snyyonpx-的-mVs5rvtr{cnyr?-K-=6m-对应。77mqr-K-=m-并不能保证它不发生77:--<<-rz?-被抬到-KJ-\05=;>6-之后,mnpr\\r?-IJ-=;@>C?m-的点会被压成-λ₂-IJ-=,这正是--<<-Snyyonpx-剔除它们的方式。计入门-?(协方差退化)而不新增门——门数须维持-C-个。--vs-5ynzoqn?-IJ-=;=6-\n----p|{ltnr5?6H----r{-ryH--\f--<<-77不带-?-×77,见文件头的量纲说明。--vs-5\05?;=-7-ynzoqn>6-I-snzr;zv{]v\x07ry`v r6-\n----p|{ltnr5@6H----r{-ryH--\f--<<-──-⑪-椭圆轴与门-B:出屏-──--<<-包围盒由椭圆77真实77长短轴构成,比按轴对齐半径构成的更紧,因此剔除更多。--<<--<<-myr{?m-要写进记录,方向由顶点着色器重建(见文件头的布局表)。--yr-qv-J-{|znyv r5rp?Is@?K5p|=>9-ynzoqn>-:-p|==66H--yr-yr{>-J-zv{5\05?;=-7-ynzoqn>69-zn\x07_nqv6H--yr-yr{?-J-zv{5\05?;=-7-ynzoqn?69-zn\x07_nqv6H--yr-n\x07v>-J-yr{>-7-qvH--yr-n\x07v?-J-yr{?-7-rp?Is@?K5qv;\b9-:qv;\x076H--yr-r\x07r{-J-no5n\x07v>6-8-no5n\x07v?6H--yr-pr{r-J-5{qp-7-=;B-8-rp?Is@?K5=;B66-7-snzr;vr}|H--vs-5pr{r;\x07-8-r\x07r{;\x07-I-=;=-\v\v-pr{r;\x07-:-r\x07r{;\x07-K-snzr;vr}|;\x07------\v\v-pr{r;\b-8-r\x07r{;\b-I-=;=-\v\v-pr{r;\b-:-r\x07r{;\b-K-snzr;vr}|;\b6-\n----p|{ltnr5A6H----r{-ryH--\f--<<-──-⑫-门-C:不透明度为-=-──--<<-放在最后与-`}r`}yn-同序。注意-ny}un-已被-OylP|z}r{nv|{-衰减过,--<<-因此这道门也会拦掉「补偿后归零」的点。--vs-5ny}un-IJ-=;=6-\n----p|{ltnr5B6H----r{-ryH--\f--<<-──-⑬-编码-?=-字节记录(布局表见文件头,与-t}yn^nq;ty-必须一致)──--<<--<<-注意-m{qpm-77不做-\b-翻转77:下游是-pyv}-空间的顶点着色器,\b-向上。--<<--<<-颜色取值后-pynz}-到-h=9->j,与-Snyyonpx-的-mpynz}5sv{nyP|y|;to9-=9->6m-逐字对应,--<<-两个变体都执行(`]g-解码后约-h:=;AA9->;AAj,烘焙值是-QP-8-`U-也可能越界)。--<<-pynz}-的后果:mr{p|qrltom-的-?-ov-共享指数恒取-=(见文件头)。<<0VSlONXRQ--<<-烘焙纹理按-P|z}rl]nu-全局点索引-}-寻址(即-Nr{n-的点索引),布局见-muOnxr;m。--yr-to-J-r\x07rY|nq5----onxrqP|y|9----rp?Iv@?K5v@?5}-2-ONXRQlaReldVQaU69-v@?5}-<-ONXRQlaReldVQaU669----=--6;toH<<0RY`RlONXRQ--<<-to-按-`]g-编码存储(未截断的-QP-颜色),解码与-Snyyonpx-逐字一致。--yr-to-J-5rp@Is@?K5----s@?55}npxrqP|y|-KK-=6-3-=\x07SS6-<-?BB;=9----s@?55}npxrqP|y|-KK-E6-3-=\x07SS6-<-?BB;=9----s@?55}npxrqP|y|-KK->C6-3-=\x07SS6-<-?BB;=--6-:-rp@Is@?K5=;B66-7-`]glP\\Y\\_l`PNYR-8-rp@Is@?K5=;B6H<<0R[QlONXRQ--yr-sv{ny_to-J-pynz}5to9-rp@Is@?K5=;=69-rp@Is@?K5>;=66H--yr-nE-J-@?5pynz}5ny}un9-=;=9->;=6-7-?BB;=-8-=;B6H--ry;|qh_RPlPR[aR_j-J-}npx?\x07>C{|z5{qp-<-[QPl_N[TR6H--<<-线性视深度(非归一化设备深度):既作排序键的来源,也供顶点着色器需要时取用。--<<-归一化深度在近处占掉绝大部分取值范围、远处大量并列,不适合作键。--ry;|qh_RPlQR]aUj-J-ovpnI@?K5qr}u6H--<<-77存的是-_TO-编码值77(]npxrql`}yn-的字节除以-?BB-就是-_TO),与-Snyyonpx-在顶点阶段--<<-叠加-`U-后的那个-msv{nyP|y|m-处于同一个色彩空间。Snyyonpx-紧接着做--<<-mp|y|`}npra|d|xv{t5sv{nyP|y|9-`_TOP|y|`}npr6m(_TO-→-yv{rn-|xv{t-}npr);--<<-77本路径把这一步留给-mt}yn^nq;tym-的片元阶段77(任务-A;>)。--<<--<<-这样安排不是随意的:>=-ov-{|z-存-_TO-值,量化步长在暗部对应的77线性77误差远小于--<<-直接存-yv{rn-值(_TO-的-R\\aS-本就是一条为感知均匀设计的曲线)。反过来在这里先转-yv{rn--<<-再存->=-ov,暗部会出现可见的色阶。任务-A;>-若忘了这一步转换,症状是画面整体偏白——--<<-与-Snyyonpx-当年漏掉-mp|y|`}npra|d|xv{tm-时一模一样。--ry;|qh_RPlP\\Y\\_j-J-r{p|qrlto5sv{ny_to6H--<<-长轴向量两个分量各一个-s>C:相对精度约-?⁻¹¹-J-A;Fr:A,长度上限-zn\x07_nqv-J-?=AE--<<-时绝对误差约->-像素的千分之一,远低于可见阈值。s>C-的量程-CBB=A-也远大于-?=AE。--ry;|qh_RPlNeV`>j-J-}npx?\x07>Csy|n5n\x07v>6H--<<-短轴只存长度,高半字填-=-后被-ny}un-覆盖:}npx?\x07>Csy|n5rp?5yr{?9-=66-的高->C-位--<<-恒为-=\x07====,故-m\vm-上-mnE-II->Cm-不会与之冲突。ov?A:@>-保留、恒-=。--ry;|qh_RPlZV[\\_j-J-}npx?\x07>Csy|n5rp?Is@?K5yr{?9-=;=66-\v-5nE-II->C6H--<<-排序键:按位取反的深度位模式,方向-onpx:|:s|{,推导见文件头。--<<-按位取反写作-mk-=\x07SSSSSSSSm(不得用波浪号运算符,转码脚本对码位->?C-不可逆)。--yr-qr}uOv-J-ovpnI@?K5qr}u6H--ry;|Xr\b-J-5qr}uOv-k-=\x07SSSSSSSS6-KK-`\\_alXRfl`UVSaH--ry;vrq-J-rH--r{-ryH\fMp|z}r-M|xt|}lv r5d\\_XT_\\b]lYN[R`6s{-znv{5--Movyv{5ty|onylv{|pnv|{lvq6-tvqG-rp@I@?K9--Movyv{5y|pnylv{|pnv|{lv{qr\x076-yn{rG-@?96-\n--yr-}-J-tvq;\x07H--<<-──-阶段-=:判定与编码,以及共享计数器清零-──--<<--<<-77znv{-里没有任何提前-r{。77-越界线程(尾部工作组的多余线程)同样要走完下面三处--<<-屏障,只是-mvrqm-为-snyr、不参与取号也不写入。把「越界即-r{」写进来会让屏障--<<-落进非-{vs|z-p|{|y-sy|,是未定义行为(软光栅-_nrl]n-踩过同源的坑)。--n-rp|qG-]|wrprqH--rp|q;vrq-J-snyrH--vs-5}-I-snzr;|ny]|v{6-\n----rp|q-J-}|wrpl}|v{5}6H--\f--<<-dT`Y-不保证-|xt|}-变量有初值,且共享内存跨工作组复用,故必须显式清零。--vs-5yn{r-JJ-=6-\n----n|zvp`|r53t`v|9-=6H--\f--|xt|}Onvr56H--<<-──-阶段->:存活者在工作组内取号-──--<<-mvsm-只包住原子操作本身,屏障在-mvsm-之外。--n-y|pnyV{qr\x07G-@?-J-=\x07SSSSSSSSH--vs-5rp|q;vrq6-\n----y|pnyV{qr\x07-J-n|zvpNqq53t`v|9->6H--\f--|xt|}Onvr56H--<<-──-阶段-?:=-号线程为整个工作组预留一段连续区间-──--<<-全局原子操作每工作组只做一次,这是两级压缩的全部意义(见文件头)。--vs-5yn{r-JJ-=6-\n----tOnr-J-n|zvpNqq53r{qrP|{9-n|zvpY|nq53t`v|66H--\f--|xt|}Onvr56H--<<-──-阶段-@:写入紧凑记录与排序键-──--<<--<<-无冲突性:组内-my|pnyV{qr\x07m-互不相同(同一个-mt`v|m-的-n|zvpNqq-返回值各异),--<<-组间区间互不重叠(mtOnrm-由全局-n|zvpNqq-按各组存活数依次划出),故全体-mqm--<<-构成-mh=9-_r{qrlP|{6m-的一个排列——无重复、无空洞。--<<--<<-但77顺序不保证与点索引一致77:它取决于工作组的调度次序。深度序由后续的排序通道给出,--<<-不依赖这里的写入顺序。--vs-5rp|q;vrq6-\n----yr-q-J-tOnr-8-y|pnyV{qr\x07H----yr-|qOnr-J-q-7-b@?l]R_l]_\\WRPaRQl_RP\\_QH----}|wrprqPnpurh|qOnr-8-_RPlPR[aR_j-J-rp|q;|qh_RPlPR[aR_jH----}|wrprqPnpurh|qOnr-8-_RPlQR]aUj-J-rp|q;|qh_RPlQR]aUjH----}|wrprqPnpurh|qOnr-8-_RPlP\\Y\\_j-J-rp|q;|qh_RPlP\\Y\\_jH----}|wrprqPnpurh|qOnr-8-_RPlNeV`>j-J-rp|q;|qh_RPlNeV`>jH----}|wrprqPnpurh|qOnr-8-_RPlZV[\\_j-J-rp|q;|qh_RPlZV[\\_jH----<<-只写-mh=9-_r{qrlP|{6m-区间的键;mh_r{qrlP|{9-a|nyl]|v{6m-的哨兵----<<-m`\\_alXRflV[cNYVQ-J-=\x07SSSSSm-由本文件的-msvyyl|lxr\bm-入口在本通道之前置好----<<-(mpyrnOssrm-填-=-不行,理由见文件头「无效槽位的哨兵约定」)。----|Xr\bhqj-J-rp|q;|Xr\bH--\f\f<77-7-第二个入口:把-m|Xr\bm-的前-m|ny]|v{m-项整块填成-m`\\_alXRflV[cNYVQm。-7-7-77调用方须在同一个-p|z}r-}n-内、mznv{m-之前派发77,规模与-mznv{m-相同。它只用到-7-mMov{qv{t5B6m-与-mMov{qv{t5D6m,都在-mznv{m-的-yn\b|-里,故不需要新的-ov{q-t|}-或模块。-7-7-77本入口可以提前-mr{m77(没有任何屏障),mznv{m-里则绝对不行——见文件头「两级紧凑写入」。-7-填的范围取-m|ny]|v{m-而非缓冲容量:排序只看前-ma|nyl]|v{m-项。-7<Mp|z}r-M|xt|}lv r5d\\_XT_\\b]lYN[R`6s{-svyyl|lxr\b5Movyv{5ty|onylv{|pnv|{lvq6-tvqG-rp@I@?K6-\n--yr-}-J-tvq;\x07H--vs-5}-KJ-snzr;|ny]|v{6-\n----r{H--\f--|Xr\bh}j-J-`\\_alXRflV[cNYVQH\f"),gsplatHybridIndirect_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-把-_r{qrlP|{-换算为间接绘制参数(U\bovql]nu-的-V{qvrpl]n)。<<<<-_r{qrlP|{-由-]|wrp|l]n-的原子计数器在-T]b-端产生,而-qn-pnyy-的-v{n{pr-数需要它。<<-为几次整数运算单开一个通道(一次管线切换-8-一次派发,微秒量级)是三条路里最好的:P]b-回读<<-后设-v{n{pr-数会滞后一帧、相机剧变时漏画;保守按-a|nyl]|v{-设则被剔除的点仍占-v{n{pr<<-槽位、靠顶点着色器输出-qrtr{rnr-位置空转(那正是-`}r`}yn-的做法,它拿不到间接绘制)。<<-实测存活率约-@A2,间接绘制把-v{n{pr-数降到约三分之一。<<<<-──-输出布局(@?-字节,mu\bovqP|{n{;m-的-mV[QV_RPalN_T`lOfaR`m)──<<<<-前-B-个字是-mqnV{qr\x07rqV{qvrpm-的参数,次序由-droT]b-规范固定:<<-mv{qr\x07P|{m-<-mv{n{prP|{m-<-msvV{qr\x07m-<-monrcrr\x07m-<-msvV{n{prm。<<-字-B:D-保留给排序间接派发化之后的-qv}npu-三元组,当前恒写-=——77显式写零而不是留着不管77,<<-否则将来启用时容易读到上一帧的残留值而不自知。<<<<-缓冲取-@?-字节而非实需的-?=:v{qvrp-ossr-的偏移需-A-字节对齐,取-@?-使将来追加那三个字<<-不必改容量。<<<<-m_r{qrlP|{m-为-=-时算出-mv{n{prP|{-J-=m,是合法的空操作绘制。P]b-侧更省的做法是整条<<-Qnl]n-都不编码,但那需要知道-_r{qrlP|{-而它在-T]b-端,故照常写-=。<<<<-本文件不使用按位取反运算符(码位->?C,转码脚本对它不可逆)。<77-7-一个-qn-v{n{pr-承载的-\0nq-数。77须与-mu\bovqP|{n{;m-与-mt}yn^nq;tym-的同名-7-常量一致。77-三处失配的症状不直观:本文件的值偏大-→-v{n{pr-数偏小-→-尾部-}yn-整批不画;-7-偏小-→-v{n{pr-数偏大-→-多出的-v{n{pr-靠-m|qr-KJ-r{qrP|{m-兜住(画面正确但白跑)。-7<p|{-^bNQl]R_lV[`aN[PRG-@?-J->?EH<77-一个-\0nq-的索引数(两个三角形)。77须与-mu\bovqP|{n{;m-的同名常量一致。77-7<p|{-V[QVPR`l]R_l^bNQG-@?-J-CHMt|}5=6-Mov{qv{t5=6-nI|ntr9-rnqK-r{qrP|{G-nn\bI@?KHMt|}5=6-Mov{qv{t5>6-nI|ntr9-rnqlvrK-v{qvrpNtG-nn\bI@?KHMp|z}r-M|xt|}lv r5>6s{-znv{56-\n--yr-v|-J-r{qrP|{h=jH--<<-向上取整:末个-v{n{pr-内的越界-\0nq-由-mt}yn^nq;tym-的-m|qr-KJ-r{qrP|{m--<<-判定输出-qrtr{rnr-位置,不产生片元。--yr-v{n{prP|{-J-5v|-8-^bNQl]R_lV[`aN[PR-:->6-<-^bNQl]R_lV[`aN[PRH--v{qvrpNth=j-J-V[QVPR`l]R_l^bNQ-7-^bNQl]R_lV[`aN[PRH--<<-v{qr\x07P|{--v{qvrpNth>j-J-v{n{prP|{H--------------------------<<-v{n{prP|{--v{qvrpNth?j-J-=H-------------------------------------<<-svV{qr\x07--v{qvrpNth@j-J-=H-------------------------------------<<-onrcrr\x07--v{qvrpNthAj-J-=H-------------------------------------<<-svV{n{pr--v{qvrpNthBj-J-=H--v{qvrpNthCj-J-=H--v{qvrpNthDj-J-=H\f"),gsplatQuad_default=function(...args){return args[0].split(``).map(char=>char.charCodeAt(0)>126?char:String.fromCharCode((char.charCodeAt(0)+113)%126)).join(``)}("<<-@QT`-硬件光栅化的-\0nq-绘制(U\bovql]nu-的-Qnl]n)。<<<<-自建-mT]b_r{qr]v}ryv{rm-的顶点与片元着色器,不经-urr-的-[|qrZnrvny-<-a`Y——77urr-的<<-droT]b_r{qrr-不支持间接绘制77,走-a`Y-就拿不到「v{n{pr-数由-T]b-决定」这项收益。<<<<-}r:}yn-的数学全部在-mt}yn]|wrp|;tym-里做完,本文件只做四件事:取索引、解包记录、<<-重建-pyv}-位置、施加-\0nq-偏移。<<<<-──-]|wrprql_rp|q-布局(77与-mt}yn]|wrp|;tym-的同一张表必须逐字一致77)──<<<<-\v-字-\v-字段-\v-编码-\v-本文件的解包-\v<<-\v-:::-\v-:::-\v-:::-\v-:::-\v<<-\v-=-\v-屏幕中心-\v-m}npx?\x07>C{|z5{qp-<-[QPl_N[TR6m-\v-m{}npx?\x07>C{|z5=6-7-[QPl_N[TRm-\v<<-\v->-\v-线性视深度-\v-movpnI@?K5qr}u6m-\v-movpnIs@?K5>6m-\v<<-\v-?-\v-_TO-\v->=-ov-{|z-×@-8-?-ov-共享指数-\v-mrp@5\x006-<->=?@-7-s@?5>-II-r6m-\v<<-\v-@-\v-椭圆长轴向量-\v-m}npx?\x07>Csy|n5n\x07v>6m,单位77像素77-\v-m{}npx?\x07>Csy|n5@6m-\v<<-\v-A-\v-短轴长度-8-ny}un-\v-ov=:>B-myr{?m(s>C,像素)、ov>C:?@-ny}un(E)-\v-见-m{}npxlrp|qm-\v<<<<-两个坐标系约定:记录里的-m{qpm-是标准-[QP(\b-向上,77不翻转77);mn\x07v>m-<-myr{?m-的单位是<<-77像素77,施加偏移前须换算到-[QP(m×-?-<-vr}|m)。<<<<-──-从记录重建-pyv}-位置-──<<<<---pyv};-J-qr}u--------(透视投影下-mpyv};-J-:vrgm,而-mqr}um-就是-m:vrgm)<<---pyv};\x07\b-J-{qp;\x07\b-7---(m{qp-J-pyv};\x07\b-<-pyv};m-的逆运算)<<---pyv}; -J-:]??-7-qr}u-8-]@?<<<<-m]??m-<-m]@?m-取投影矩阵的-mryrzr{h>=jm-<-mryrzr{h>Ajm。77用矩阵元素而不是<<-msn<5sn:{rn6m-闭式77,以自动适配正交与非对称投影。两者不一致的症状是-@QT`-相对不透明<<-几何体整体偏前或偏后。<<<<-──-切空间约定:与-Snyyonpx-逐字一致,三处成对,不得只改一处-──<<<<-Snyyonpx-写-m]|vv|{-J-\0nqef-7-?m、片元-mN-J-:q|5}9-}6m、mqvpnq-N-I-:Am、<<-mny}un-J-r\x07}5N6-7-nm。本文件的-mP\\_[R_`m-是-mh:>9->jm-的单位-\0nq,故同样乘-?-送进-n\bv{t。<<-mqvpnq-N-I-:Am-恰好等价于-mq|5p|{r9-p|{r6-K->m(单位-\0nq-的外接圆)。<<<<-──-坑:末个-v{n{pr-内部的越界-\0nq-──<<<<-mv{n{prP|{-J-prvy5r{qrP|{-<-^bNQl]R_lV[`aN[PR6m-向上取整,末个-v{n{pr-里有<<-若干-\0nq-没有对应的存活点。77必须判-m|qr-KJ-r{qrP|{m-输出-qrtr{rnr-位置77,<<-只靠-v{n{pr-数收缩不够——漏掉会读到未初始化的记录,症状是画面上出现稀疏的离谱斑点。<<<<-mr{qrP|{m-由-T]b-写入(]|wrp|-的原子计数器),因此77不能走-{vs|z77,绑为<<-mrnq:|{y\b:|ntrm。<<<<-本文件不使用按位取反运算符(码位->?C,转码脚本对它不可逆)。<77-一个-qn-v{n{pr-承载的-\0nq-数。77须与-mu\bovqP|{n{;m-的同名常量一致。77-7<p|{-^bNQl]R_lV[`aN[PRG-@?-J->?EH<77-一个-\0nq-的索引数(两个三角形)。77须与-mu\bovqP|{n{;m-的同名常量一致。77-7<p|{-V[QVPR`l]R_l^bNQG-@?-J-CH<77-]|wrprql_rp|q-每条-B-个-@?。77须与-mu\bovqP|{n{;m-的同名常量一致。77-7<p|{-b@?l]R_l]_\\WRPaRQl_RP\\_QG-@?-J-BH<77-记录内各字段的字下标,与上方布局表一一对应。-7<p|{-_RPlPR[aR_G-@?-J-=Hp|{-_RPlQR]aUG-@?-J->Hp|{-_RPlP\\Y\\_G-@?-J-?Hp|{-_RPlNeV`>G-@?-J-@Hp|{-_RPlZV[\\_G-@?-J-AH<77-7-屏幕中心的-{|z>C-编码量程。77须与-mt}yn]|wrp|;tym-的-m[QPl_N[TRm-一致77——-7-两侧不一致的症状是所有-}yn-的位置按同一比例偏移,画面整体拉伸或压缩。-7<p|{-[QPl_N[TRG-s@?-J-B;=H<77-_TO-各通道的->=-ov-{|z-满量程。-7<p|{-_TOlb[\\_ZlZNeG-s@?-J->=?@;=H<77-推出裁剪范围的顶点位置: -J-?-超出-[QP-的-h=9->j,整个-\0nq-被裁剪单元丢弃。-7<p|{-QRTR[R_NaRl]\\`VaV\\[G-rpAIs@?K-J-rpAIs@?K5=;=9-=;=9-?;=9->;=6H<77-\0nq-的六个角,两个三角形-5=9>9?6-与-5=9?9@6,取值-mh:>9->jm。-7<p|{-P\\_[R_`G-nn\bIrp?Is@?K9-CK-J-nn\bIrp?Is@?K9-CK5--rp?Is@?K5:>;=9-:>;=69--rp?Is@?K5->;=9-:>;=69--rp?Is@?K5->;=9-->;=69--rp?Is@?K5:>;=9-:>;=69--rp?Is@?K5->;=9-->;=69--rp?Is@?K5:>;=9-->;=696H<<-@?-字节。偏移写在行尾,改动字段次序必须同步改-P]b-侧的写入代码。p-Qnb{vs|z-\n--vr}|G-rp?Is@?K9---<<--=--画面像素宽高--}|w]??G-s@?9----------<<--E--}|wrpv|{Znv\x07;ryrzr{h>=j--}|w]@?G-s@?9----------<<->?--}|wrpv|{Znv\x07;ryrzr{h>Aj--l}nq=G-rpAIs@?K9------<<->C--补齐到-@?\fHMt|}5=6-Mov{qv{t5=6-nI|ntr9-rnqK-}|wrprqPnpurG-nn\bI@?KHMt|}5=6-Mov{qv{t5>6-nI|ntr9-rnqK-|rqV{qvprG-nn\bI@?KHMt|}5=6-Mov{qv{t5?6-nI|ntr9-rnqK-r{qrP|{G-nn\bI@?KHMt|}5=6-Mov{qv{t5@6-nI{vs|zK-qnPstG-Qnb{vs|zHp-c\\-\n--Movyv{5}|vv|{6-}|vv|{G-rpAIs@?K9--<77-\0nq-局部坐标,已乘-?-对齐-Snyyonpx-的-mh:?9-?jm-约定。-7<--My|pnv|{5=6-n{tr{G-rp?Is@?K9--<77-77yv{rn-|xv{t-}npr77-的-_TO-加不透明度。-7<--My|pnv|{5>6-p|y|G-rpAIs@?K9\fHp-_rp|q-\n--{qpG-rp?Is@?K9--qr}uG-s@?9--toG-rp@Is@?K9--ny}unG-s@?9--n\x07v>G-rp?Is@?K9--yr{?G-s@?9\fH<77-7-_TO-→-yv{rn-|xv{t-}npr(_TO-的-R\\aS)。-7-7-记录里的-_TO-是-77_TO-编码值77,而-urr-的-droT]b-架构下所有材质都写入-yv{rn-|xv{t-7-}npr-的中间-_a、最后由-\0nq-}n-统一做-yv{rn-→-_TO-编码。77不转换等于编码两次,画面-7-整体偏白发灰。77-Snyyonpx-在顶点阶段做的-mp|y|`}npra|d|xv{t5sv{nyP|y|9-`_TOP|y|`}npr6m-7-就是这一步。-7-7-三个魔数是标准-_TO-转换的等价改写(m><>?;F?m、m><>;=BBm、m=;=BB<>;=BBm),照抄-urr-展开-7-后的形式以求逐位一致。用-mryrpm-而非-mzv\x075;;9-r}5;;66m:两者数值恒等而前者更省。-7-7-放在顶点阶段(一个-\0nq-的-C-个顶点颜色相同,比片元阶段每像素-@-次-m}|m-便宜)。不在-7-]|wrp|-里做:记录的-_TO-只有->=-ov,存-_TO-值时暗部的77线性77量化误差远小于存-yv{rn-7-值,先转再存会让暗部出现可见色阶。-7<s{-tol|l|xv{t5pG-rp@Is@?K6-:K-rp@Is@?K-\n--yr-y|-J-p-7-=;=DD@FF@E=EH--yr-uv-J-}|5p-7-=;FADECD?FEC-8-rp@Is@?K5=;=B?>@?D=>A69-rp@Is@?K5?;A66H--r{-ryrp5y|9-uv9-p-K-rp@Is@?K5=;=A=AB66H\f<77-按布局表解包一条-]|wrprql_rp|q。-7<s{-{}npxlrp|q5y|G-@?6-:K-_rp|q-\n--yr-|qOnr-J-y|-7-b@?l]R_l]_\\WRPaRQl_RP\\_QH--yr-=-J-}|wrprqPnpurh|qOnr-8-_RPlPR[aR_jH--yr->-J-}|wrprqPnpurh|qOnr-8-_RPlQR]aUjH--yr-?-J-}|wrprqPnpurh|qOnr-8-_RPlP\\Y\\_jH--yr-@-J-}|wrprqPnpurh|qOnr-8-_RPlNeV`>jH--yr-A-J-}|wrprqPnpurh|qOnr-8-_RPlZV[\\_jH--n-rpG-_rp|qH--rp;{qp-J-{}npx?\x07>C{|z5=6-7-[QPl_N[TRH--rp;qr}u-J-ovpnIs@?K5>6H--<<-_TO:三个->=-ov-{|z-配-?-ov-共享指数(量程覆盖到-E,供-`U-后可能超过->-的颜色用)。--yr-r-J-?-KK-@=H--yr-\0-J-rp@I@?K5?-3-=\x07@SS9-5?-KK->=6-3-=\x07@SS9-5?-KK-?=6-3-=\x07@SS6H--rp;to-J-rp@Is@?K5\x006-<-_TOlb[\\_ZlZNe-7-s@?5>-II-r6H--rp;n\x07v>-J-{}npx?\x07>Csy|n5@6H--<<-短轴长度在低半字、ny}un-在-ov>C:?@。写入侧用-m}npx?\x07>Csy|n5rp?5yr{?9-=;=66m,--<<-故高半字恒为-=\x07====,m\v-5nE-II->C6m-与之不冲突。--rp;yr{?-J-{}npx?\x07>Csy|n5A6;\x07H--rp;ny}un-J-s@?55A-KK->C6-3-=\x07SS6-<-?BB;=H--r{-rpH\fMrr\x07s{-lznv{5--Movyv{5rr\x07lv{qr\x076-vG-@?9--Movyv{5v{n{prlv{qr\x076-vvG-@?96-:K-c\\-\n--n-|G-c\\H--|;n{tr{-J-rp?Is@?K5=;=6H--|;p|y|-J-rpAIs@?K5=;=6H--<<-索引缓冲是恒等序列,故-mvm-在一次-v{n{pr-内取遍-mh=9-C-7-^bNQl]R_lV[`aN[PR6m。--yr-\0nq`y|-J-v-<-V[QVPR`l]R_l^bNQH--yr-p|{r-J-P\\_[R_`hv-2-V[QVPR`l]R_l^bNQjH--yr-|qr-J-vv-7-^bNQl]R_lV[`aN[PR-8-\0nq`y|H--<<-越界-\0nq(见文件头的坑)。这里可以提前-r{:本文件没有任何屏障。--vs-5|qr-KJ-r{qrP|{h=j6-\n----|;}|vv|{-J-QRTR[R_NaRl]\\`VaV\\[H----r{-|H--\f--<<-深度序-→-紧凑数组下标。排序键是取反后的深度,升序即由远到近(onpx:|:s|{),--<<-正是硬件-ny}un-混合所需的顺序。--yr-y|-J-|rqV{qvprh|qrjH--yr-rp-J-{}npxlrp|q5y|6H--yr--J-rp;qr}uH--yr-pyv}ef-J-rp;{qp-7-H--yr-pyv}g-J-:qnPst;}|w]??-7-rp;qr}u-8-qnPst;}|w]@?H--<<-短轴方向由长轴旋转-F=°-重建。mn\x07v>m-的长度由-o:}v\x07ry-门保证-K-=,故-{|znyv r-安全。--yr-n\x07v?-J-rp;yr{?-7-{|znyv r5rp?Is@?K5rp;n\x07v>;\b9-:rp;n\x07v>;\x0766H--yr-|ssr]\x07-J-p|{r;\x07-7-rp;n\x07v>-8-p|{r;\b-7-n\x07v?H--<<-像素-→-[QP-是-m×-?-<-vr}|m,再乘--回到-pyv}-空间。--yr-|ssrPyv}-J-|ssr]\x07-7-?;=-<-qnPst;vr}|-7-H--|;}|vv|{-J-rpAIs@?K5pyv}ef-8-|ssrPyv}9-pyv}g9-6H--|;n{tr{-J-p|{r-7-?;=H--|;p|y|-J-rpAIs@?K5tol|l|xv{t5rp;to69-rp;ny}un6H--r{-|H\fMsntzr{s{-slznv{5v{G-c\\6-:K-My|pnv|{5=6-rpAIs@?K-\n--<<-与-Snyyonpx-逐字一致的高斯求值,三处成对(见文件头的切空间约定)。--yr-n-J-:q|5v{;n{tr{9-v{;n{tr{6H--vs-5n-I-:A;=6-\n----qvpnqH--\f--yr-ny}un-J-r\x07}5n6-7-v{;p|y|;nH--<<-输出77非预乘77-ny}un,由管线的混合状态完成合成。--r{-rpAIs@?K5v{;p|y|;to9-ny}un6H\f");function selectVariant(source,name,keep){let ifMark=`//#IF_${name}`,elseMark=`//#ELSE_${name}`,endMark=`//#END_${name}`,region=0,kept=[];for(let line of source.split(`
|
|
382
382
|
`)){let trimmed=line.trim();if(trimmed===ifMark){region=1;continue}if(trimmed===elseMark){region=2;continue}if(trimmed===endMark){region=0;continue}(region===0||region===1===keep)&&kept.push(line)}return kept.join(`
|
|
383
|
-
`)}var GSplatHybridRenderer=class GSplatHybridRenderer{get unusable(){return this.disposed}get renderCount(){return this.lastRenderCount}constructor(device,format,depthFormat,backend=null){this.radixSort=null,this.projectorUniformBuffer=null,this.drawUniformBuffer=null,this.effectUniformBuffer=null,this.bakedTexture=null,this.bakedEnabled=!1,this.bakedViewCache=new WeakMap,this.bakedContentRevision=0,this.projectedCacheBuffer=null,this.projectedCacheCapacityPoints=0,this.sortKeysBuffer=null,this.sortKeysCapacityElements=0,this.renderCountBuffer=null,this.indirectArgsBuffer=null,this.quadIndexBuffer=null,this.readbackBuffer=null,this.readbackInFlight=!1,this.lastRenderCount=null,this.projectorBindGroup=null,this.projectorSources=null,this.indirectBindGroup=null,this.indirectSources=null,this.drawBindGroup=null,this.drawSources=null,this.disposed=!1,this.width=0,this.height=0,this.lastCameraSnapshot=new Float32Array(32),this.lastArenaRevision=-1,this.lastTotalPoints=-1,this.lastViewportWidth=-1,this.lastViewportHeight=-1,this.lastBakedView=null,this.lastBakedRevision=-1,this.lastFrameComplete=!1,this.projectorUniformScratch=new ArrayBuffer(GSplatHybridRenderer.PROJECTOR_UNIFORM_SIZE),this.drawUniformScratch=new ArrayBuffer(GSplatHybridRenderer.DRAW_UNIFORM_SIZE),this.effectUniformScratch=new ArrayBuffer(GSplatHybridRenderer.EFFECT_UNIFORM_SIZE),this.u32Scratch=new Uint32Array(1),this.device=device,this.format=format,this.depthFormat=depthFormat,this.backend=backend,this.plainVariant=this.createProjectorVariant(!1),this.bakedVariant=this.createProjectorVariant(!0),this.indirectBindGroupLayout=device.createBindGroupLayout({label:`gsplat-hybrid-indirect-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),this.drawBindGroupLayout=device.createBindGroupLayout({label:`gsplat-hybrid-draw-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}}]});let indirectModule=device.createShaderModule({label:`gsplat-hybrid-indirect`,code:gsplatHybridIndirect_default}),quadModule=device.createShaderModule({label:`gsplat-hybrid-quad`,code:gsplatQuad_default});this.indirectPipeline=device.createComputePipeline({label:`gsplat-hybrid-indirect`,layout:device.createPipelineLayout({label:`gsplat-hybrid-indirect-layout`,bindGroupLayouts:[this.indirectBindGroupLayout]}),compute:{module:indirectModule,entryPoint:`main`}}),this.drawPipeline=device.createRenderPipeline({label:`gsplat-hybrid-draw`,layout:device.createPipelineLayout({label:`gsplat-hybrid-draw-layout`,bindGroupLayouts:[this.drawBindGroupLayout]}),vertex:{module:quadModule,entryPoint:`vs_main`,buffers:[]},fragment:{module:quadModule,entryPoint:`fs_main`,targets:[{format,blend:{color:{operation:`add`,srcFactor:`src-alpha`,dstFactor:`one-minus-src-alpha`},alpha:{operation:`add`,srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-list`,cullMode:`none`},depthStencil:{format:depthFormat,depthWriteEnabled:!1,depthCompare:`less-equal`}}),this.radixSort=new RadixSortModule(device),this.projectorUniformBuffer=this.createBuffer(`projector-uniform`,GSplatHybridRenderer.PROJECTOR_UNIFORM_SIZE,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.drawUniformBuffer=this.createBuffer(`draw-uniform`,GSplatHybridRenderer.DRAW_UNIFORM_SIZE,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.renderCountBuffer=this.createBuffer(`render-count`,4,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC),this.indirectArgsBuffer=this.createBuffer(`indirect-args`,32,GPUBufferUsage.STORAGE|GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_DST),this.effectUniformBuffer=this.createBuffer(`effect-uniform`,GSplatHybridRenderer.EFFECT_UNIFORM_SIZE,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.createQuadIndexBuffer(),this.writeProjectorUniformConstants()}createProjectorVariant(baked){let device=this.device,tag=baked?`baked`:`plain`,entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:6,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:7,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}];baked&&entries.push({binding:9,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:`unfilterable-float`,viewDimension:`2d`}}),entries.push({binding:11,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}});let bindGroupLayout=device.createBindGroupLayout({label:`gsplat-hybrid-projector-bgl-${tag}`,entries}),module=device.createShaderModule({label:`gsplat-hybrid-projector-${tag}`,code:selectVariant(selectVariant(gsplatProjector_default,`DIAG`,!1),`BAKED`,baked)}),pipelineLayout=device.createPipelineLayout({label:`gsplat-hybrid-projector-layout-${tag}`,bindGroupLayouts:[bindGroupLayout]});return{baked,bindGroupLayout,projectorPipeline:device.createComputePipeline({label:`gsplat-hybrid-projector-${tag}`,layout:pipelineLayout,compute:{module,entryPoint:`main`}}),fillSortKeysPipeline:device.createComputePipeline({label:`gsplat-hybrid-fill-sort-keys-${tag}`,layout:pipelineLayout,compute:{module,entryPoint:`fill_sort_keys`}})}}setBakedSource(texture,enabled){this.bakedTexture=texture,this.bakedEnabled=enabled}notifyBakedContentChanged(){this.bakedContentRevision++}resolveBakedView(){var _a;if(!this.bakedEnabled||!this.bakedTexture||!this.backend)return null;let gpuTexture=(_a=this.backend.get(this.bakedTexture))==null?void 0:_a.texture;if(!gpuTexture)return null;let view=this.bakedViewCache.get(gpuTexture);return view||(view=gpuTexture.createView({label:`gsplat-hybrid-baked-color-view`}),this.bakedViewCache.set(gpuTexture,view)),view}resize(width,height){this.width=Math.max(0,Math.floor(width)),this.height=Math.max(0,Math.floor(height))}createBuffer(kind,size,usage){return this.device.createBuffer({label:`gsplat-hybrid-${kind}`,size,usage})}destroyBufferSafely(buffer){if(buffer)try{buffer.destroy()}catch(_a){}}createQuadIndexBuffer(){let data=new Uint16Array(768);for(let i=0;i<768;i++)data[i]=i;let byteLength=data.byteLength+3&-4,buffer=this.createBuffer(`quad-index`,byteLength,GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST);buffer&&(this.device.queue.writeBuffer(buffer,0,data),this.quadIndexBuffer=buffer)}ensureProjectedCache(totalPoints){if(this.unusable||totalPoints<=0)return!1;if(this.projectedCacheBuffer&&totalPoints<=this.projectedCacheCapacityPoints)return!0;let created=this.createBuffer(`projected-cache`,totalPoints*20,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC),previous=this.projectedCacheBuffer;return this.projectedCacheBuffer=created,this.projectedCacheCapacityPoints=totalPoints,this.destroyBufferSafely(previous),!0}ensureSortKeys(totalPoints){if(this.unusable||totalPoints<=0)return!1;let aligned=Math.ceil(totalPoints/2048)*2048;if(this.sortKeysBuffer&&aligned<=this.sortKeysCapacityElements)return!0;let created=this.createBuffer(`sort-keys`,aligned*4,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST),previous=this.sortKeysBuffer;return this.sortKeysBuffer=created,this.sortKeysCapacityElements=aligned,this.destroyBufferSafely(previous),!0}writeProjectorUniformConstants(){let buffer=this.projectorUniformBuffer;if(!buffer)return;let dv=new DataView(this.projectorUniformScratch);dv.setFloat32(GSplatHybridRenderer.OFF_MIN_PIXEL_SIZE,2,!0),dv.setFloat32(GSplatHybridRenderer.OFF_MAX_RADIUS_CAP,require_pbmGaussianSplattingObject.m,!0),dv.setFloat32(GSplatHybridRenderer.OFF_COV_PACK_SCALE,4,!0),dv.setFloat32(GSplatHybridRenderer.OFF_TERM2_SQ_FLOOR,require_pbmGaussianSplattingObject.h,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DEPTH_EPSILON,require_pbmGaussianSplattingObject.f,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DET_EPSILON,require_pbmGaussianSplattingObject.p,!0),this.device.queue.writeBuffer(buffer,0,this.projectorUniformScratch)}writeProjectorFrameUniform(camera,viewportWidth,viewportHeight,totalPoints,entryCount){let buffer=this.projectorUniformBuffer;if(!buffer)return;let dv=new DataView(this.projectorUniformScratch),view=camera.matrixWorldInverse.elements;for(let i=0;i<16;i++)dv.setFloat32(GSplatHybridRenderer.OFF_VIEW+i*4,view[i],!0);let viewProj=new three_webgpu.Matrix4().multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse).elements;for(let i=0;i<16;i++)dv.setFloat32(GSplatHybridRenderer.OFF_VIEW_PROJ+i*4,viewProj[i],!0);let p=camera.projectionMatrix.elements;dv.setFloat32(GSplatHybridRenderer.OFF_FOCAL,p[0]*viewportWidth*.5,!0),dv.setFloat32(GSplatHybridRenderer.OFF_FOCAL+4,p[5]*viewportHeight*.5,!0),dv.setFloat32(GSplatHybridRenderer.OFF_VIEWPORT,viewportWidth,!0),dv.setFloat32(GSplatHybridRenderer.OFF_VIEWPORT+4,viewportHeight,!0),dv.setUint32(GSplatHybridRenderer.OFF_TOTAL_POINTS,totalPoints>>>0,!0),dv.setUint32(GSplatHybridRenderer.OFF_ENTRY_COUNT,entryCount>>>0,!0),this.device.queue.writeBuffer(buffer,0,this.projectorUniformScratch)}writeDrawUniform(camera,width,height){let buffer=this.drawUniformBuffer;if(!buffer)return;let dv=new DataView(this.drawUniformScratch),p=camera.projectionMatrix.elements;dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_VIEWPORT,width,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_VIEWPORT+4,height,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_P22,p[10],!0),dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_P32,p[14],!0),this.device.queue.writeBuffer(buffer,0,this.drawUniformScratch)}static sourcesEqual(a,b){if(!a||a.length!==b.length)return!1;for(let i=0;i<b.length;i++)if(a[i]!==b[i])return!1;return!0}ensureProjectorBindGroup(arena,layoutTable,transforms,objectParams,variant,bakedView){let cache=this.projectedCacheBuffer,keys=this.sortKeysBuffer,count=this.renderCountBuffer,uniform=this.projectorUniformBuffer,effect=this.effectUniformBuffer;if(!cache||!keys||!count||!uniform||!effect||variant.baked&&!bakedView)return null;let sources=[variant.bindGroupLayout,arena,layoutTable,transforms,objectParams,cache,keys,count,uniform,variant.baked?bakedView:null,effect];if(this.projectorBindGroup&&GSplatHybridRenderer.sourcesEqual(this.projectorSources,sources))return this.projectorBindGroup;{let entries=[{binding:0,resource:{buffer:arena}},{binding:1,resource:{buffer:layoutTable}},{binding:2,resource:{buffer:transforms}},{binding:3,resource:{buffer:objectParams}},{binding:4,resource:{buffer:cache}},{binding:5,resource:{buffer:keys}},{binding:6,resource:{buffer:count}},{binding:7,resource:{buffer:uniform}}];variant.baked&&bakedView&&entries.push({binding:9,resource:bakedView}),entries.push({binding:11,resource:{buffer:effect}});let created=this.device.createBindGroup({label:`gsplat-hybrid-projector-bindgroup-${variant.baked?`baked`:`plain`}`,layout:variant.bindGroupLayout,entries});return this.projectorBindGroup=created,this.projectorSources=sources,created}}ensureIndirectBindGroup(){let count=this.renderCountBuffer,args=this.indirectArgsBuffer;if(!count||!args)return null;let sources=[count,args];if(this.indirectBindGroup&&GSplatHybridRenderer.sourcesEqual(this.indirectSources,sources))return this.indirectBindGroup;{let created=this.device.createBindGroup({label:`gsplat-hybrid-indirect-bindgroup`,layout:this.indirectBindGroupLayout,entries:[{binding:0,resource:{buffer:count}},{binding:1,resource:{buffer:args}}]});return this.indirectBindGroup=created,this.indirectSources=sources,created}}ensureDrawBindGroup(sortedIndices){let cache=this.projectedCacheBuffer,count=this.renderCountBuffer,uniform=this.drawUniformBuffer;if(!cache||!count||!uniform)return null;let sources=[cache,sortedIndices,count,uniform];if(this.drawBindGroup&&GSplatHybridRenderer.sourcesEqual(this.drawSources,sources))return this.drawBindGroup;{let created=this.device.createBindGroup({label:`gsplat-hybrid-draw-bindgroup`,layout:this.drawBindGroupLayout,entries:[{binding:0,resource:{buffer:cache}},{binding:1,resource:{buffer:sortedIndices}},{binding:2,resource:{buffer:count}},{binding:3,resource:{buffer:uniform}}]});return this.drawBindGroup=created,this.drawSources=sources,created}}reportSkip(_reason){return this.lastFrameComplete=!1,null}writeEffectUniform(camera,shBaked){let buffer=this.effectUniformBuffer;if(!buffer)return;let dv=new DataView(this.effectUniformScratch),m=camera.matrixWorld.elements;dv.setFloat32(GSplatHybridRenderer.OFF_CAMERA_WORLD_POS,m[12],!0),dv.setFloat32(GSplatHybridRenderer.OFF_CAMERA_WORLD_POS+4,m[13],!0),dv.setFloat32(GSplatHybridRenderer.OFF_CAMERA_WORLD_POS+8,m[14],!0),dv.setUint32(GSplatHybridRenderer.OFF_SH_BAKED,+!!shBaked,!0),dv.setFloat32(GSplatHybridRenderer.OFF_AGG_PROGRESS,0,!0),dv.setFloat32(GSplatHybridRenderer.OFF_AGG_POINT_DURATION,0,!0),dv.setUint32(GSplatHybridRenderer.OFF_AGG_ENABLED,0,!0),dv.setUint32(GSplatHybridRenderer.OFF_NUM_GS_LAYERS,0,!0),dv.setUint32(GSplatHybridRenderer.OFF_NUM_GS_CLIPPERS,0,!0);for(let i=0;i<3;i++)dv.setFloat32(GSplatHybridRenderer.OFF_AGG_BOUNDS_MIN+i*4,0,!0),dv.setFloat32(GSplatHybridRenderer.OFF_AGG_BOUNDS_MAX+i*4,0,!0);this.device.queue.writeBuffer(buffer,0,this.effectUniformScratch)}canReplayLastFrame(arena,mirrors,camera){if(!this.lastFrameComplete||!this.drawBindGroup||!this.quadIndexBuffer||!this.indirectArgsBuffer||arena.revision!==this.lastArenaRevision||arena.totalPoints!==this.lastTotalPoints||this.width!==this.lastViewportWidth||this.height!==this.lastViewportHeight)return!1;let{layout,transform,objectParams}=mirrors;if(layout.isDirty||transform.isDirty||objectParams.isDirty||this.resolveBakedView()!==this.lastBakedView||this.bakedContentRevision!==this.lastBakedRevision)return!1;let snapshot=this.lastCameraSnapshot,world=camera.matrixWorld.elements,proj=camera.projectionMatrix.elements;for(let i=0;i<16;i++)if(snapshot[i]!==world[i]||snapshot[16+i]!==proj[i])return!1;return!0}captureFrameSnapshot(arena,camera,totalPoints,bakedView){let snapshot=this.lastCameraSnapshot,world=camera.matrixWorld.elements,proj=camera.projectionMatrix.elements;for(let i=0;i<16;i++)snapshot[i]=world[i],snapshot[16+i]=proj[i];this.lastArenaRevision=arena.revision,this.lastTotalPoints=totalPoints,this.lastViewportWidth=this.width,this.lastViewportHeight=this.height,this.lastBakedView=bakedView,this.lastBakedRevision=this.bakedContentRevision,this.lastFrameComplete=!0}encodeDrawInto(drawPass,drawBindGroup,quadIndex,args){drawPass.setPipeline(this.drawPipeline),drawPass.setBindGroup(0,drawBindGroup),drawPass.setIndexBuffer(quadIndex,`uint16`),drawPass.drawIndexedIndirect(args,0)}prepareFrame(arena,mirrors,camera){if(!arena||arena.unusable)return this.reportSkip(`no-arena`);if(!mirrors)return this.reportSkip(`no-mirrors`);let arenaBuffer=arena.buffer,totalPoints=arena.totalPoints;if(!arenaBuffer||totalPoints<=0)return this.reportSkip(`no-points`);let{layout,transform,objectParams}=mirrors;if(layout.unusable||transform.unusable||objectParams.unusable)return this.reportSkip(`no-mirrors`);layout.upload(),transform.upload(),objectParams.upload();let entryCount=layout.entryCount;if(entryCount===0)return this.reportSkip(`no-entries`);let layoutBuffer=layout.buffer,transformBuffer=transform.buffer,objectParamsBuffer=objectParams.buffer;if(!layoutBuffer||!transformBuffer||!objectParamsBuffer)return this.reportSkip(`no-mirrors`);if(!this.ensureProjectedCache(totalPoints)||!this.ensureSortKeys(totalPoints))return this.reportSkip(`resource`);let indirectBindGroup=this.ensureIndirectBindGroup();if(!indirectBindGroup)return this.reportSkip(`bind-group`);let bakedView=this.resolveBakedView(),variant=bakedView?this.bakedVariant:this.plainVariant,projectorBindGroup=this.ensureProjectorBindGroup(arenaBuffer,layoutBuffer,transformBuffer,objectParamsBuffer,variant,bakedView);return projectorBindGroup?(this.writeProjectorFrameUniform(camera,this.width,this.height,totalPoints,entryCount),this.writeDrawUniform(camera,this.width,this.height),this.writeEffectUniform(camera,variant.baked),{projectorBindGroup,indirectBindGroup,variant,bakedView,workgroups:Math.ceil(totalPoints/256),totalPoints}):this.reportSkip(`bind-group`)}submitFrame(drawPass,arena,camera,mirrors){if(this.unusable||this.width<=0||this.height<=0)return;let cheapStaging=null,pendingDraw=null,encoder=this.device.createCommandEncoder({label:`gsplat-hybrid-frame`});if(arena==null||arena.encodeAssembly(encoder),arena&&mirrors&&this.canReplayLastFrame(arena,mirrors,camera)){this.device.queue.submit([encoder.finish()]);let replayBindGroup=this.drawBindGroup,replayIndex=this.quadIndexBuffer,replayArgs=this.indirectArgsBuffer;replayBindGroup&&replayIndex&&replayArgs&&this.encodeDrawInto(drawPass,replayBindGroup,replayIndex,replayArgs),arena.flushPendingDestroy();return}let prepared=this.prepareFrame(arena,mirrors,camera),renderCount=this.renderCountBuffer;renderCount&&encoder.clearBuffer(renderCount,0,4);let indirectArgs=this.indirectArgsBuffer;if(indirectArgs&&encoder.clearBuffer(indirectArgs,0,32),prepared){let headPass=encoder.beginComputePass({label:`gsplat-hybrid-head`});headPass.setBindGroup(0,prepared.projectorBindGroup),headPass.setPipeline(prepared.variant.fillSortKeysPipeline),headPass.dispatchWorkgroups(prepared.workgroups),headPass.setPipeline(prepared.variant.projectorPipeline),headPass.dispatchWorkgroups(prepared.workgroups),headPass.setPipeline(this.indirectPipeline),headPass.setBindGroup(0,prepared.indirectBindGroup),headPass.dispatchWorkgroups(1),headPass.end();let sortKeys=this.sortKeysBuffer,radixSort=this.radixSort;if(!sortKeys||!radixSort){this.lastFrameComplete=!1,this.device.queue.submit([encoder.finish()]),arena==null||arena.flushPendingDestroy();return}let{sortedIndices}=radixSort.encode(encoder,sortKeys,prepared.totalPoints,20,{destructiveKeys:!0,minCapacity:this.sortKeysCapacityElements}),drawBindGroup=this.ensureDrawBindGroup(sortedIndices);if(!drawBindGroup){this.lastFrameComplete=!1,this.device.queue.submit([encoder.finish()]),arena==null||arena.flushPendingDestroy();return}cheapStaging=this.encodeCheapReadback(encoder),pendingDraw={bindGroup:drawBindGroup,totalPoints:prepared.totalPoints,bakedView:prepared.bakedView}}if(this.device.queue.submit([encoder.finish()]),pendingDraw){let quadIndex=this.quadIndexBuffer,args=this.indirectArgsBuffer;quadIndex&&args&&(this.encodeDrawInto(drawPass,pendingDraw.bindGroup,quadIndex,args),this.captureFrameSnapshot(arena,camera,pendingDraw.totalPoints,pendingDraw.bakedView))}arena==null||arena.flushPendingDestroy(),cheapStaging&&(this.readbackInFlight=!0,this.finishCheapReadback(cheapStaging))}encodeCheapReadback(encoder){if(this.readbackInFlight)return null;let source=this.renderCountBuffer;if(!source)return null;let staging=this.createBuffer(`readback`,GSplatHybridRenderer.CHEAP_READBACK_SIZE,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);return staging?(this.readbackBuffer=staging,encoder.copyBufferToBuffer(source,0,staging,0,GSplatHybridRenderer.CHEAP_READBACK_SIZE),staging):null}finishCheapReadback(staging){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let size=GSplatHybridRenderer.CHEAP_READBACK_SIZE;try{yield this.device.queue.onSubmittedWorkDone(),yield staging.mapAsync(GPUMapMode.READ,0,size);let copied=new Uint32Array(staging.getMappedRange(0,size).slice(0));staging.unmap(),this.lastRenderCount=copied[0]>>>0}catch(_a){}finally{this.readbackInFlight=!1,this.destroyBufferSafely(staging),this.readbackBuffer===staging&&(this.readbackBuffer=null)}})}dispose(){var _a;this.disposed||(this.disposed=!0,this.destroyBufferSafely(this.projectorUniformBuffer),this.destroyBufferSafely(this.drawUniformBuffer),this.destroyBufferSafely(this.effectUniformBuffer),this.destroyBufferSafely(this.projectedCacheBuffer),this.destroyBufferSafely(this.sortKeysBuffer),this.destroyBufferSafely(this.renderCountBuffer),this.destroyBufferSafely(this.indirectArgsBuffer),this.destroyBufferSafely(this.quadIndexBuffer),this.projectorUniformBuffer=null,this.drawUniformBuffer=null,this.effectUniformBuffer=null,this.projectedCacheBuffer=null,this.sortKeysBuffer=null,this.renderCountBuffer=null,this.indirectArgsBuffer=null,this.quadIndexBuffer=null,this.lastFrameComplete=!1,this.projectedCacheCapacityPoints=0,this.sortKeysCapacityElements=0,this.bakedTexture=null,this.bakedEnabled=!1,this.lastBakedView=null,(_a=this.radixSort)==null||_a.destroy(),this.radixSort=null,this.projectorBindGroup=null,this.projectorSources=null,this.indirectBindGroup=null,this.indirectSources=null,this.drawBindGroup=null,this.drawSources=null)}};GSplatHybridRenderer.PROJECTOR_UNIFORM_SIZE=176,GSplatHybridRenderer.OFF_VIEW=0,GSplatHybridRenderer.OFF_VIEW_PROJ=64,GSplatHybridRenderer.OFF_FOCAL=128,GSplatHybridRenderer.OFF_VIEWPORT=136,GSplatHybridRenderer.OFF_TOTAL_POINTS=144,GSplatHybridRenderer.OFF_ENTRY_COUNT=148,GSplatHybridRenderer.OFF_MIN_PIXEL_SIZE=152,GSplatHybridRenderer.OFF_MAX_RADIUS_CAP=156,GSplatHybridRenderer.OFF_COV_PACK_SCALE=160,GSplatHybridRenderer.OFF_TERM2_SQ_FLOOR=164,GSplatHybridRenderer.OFF_DEPTH_EPSILON=168,GSplatHybridRenderer.OFF_DET_EPSILON=172,GSplatHybridRenderer.DRAW_UNIFORM_SIZE=32,GSplatHybridRenderer.OFF_DRAW_VIEWPORT=0,GSplatHybridRenderer.OFF_DRAW_P22=8,GSplatHybridRenderer.OFF_DRAW_P32=12,GSplatHybridRenderer.EFFECT_UNIFORM_SIZE=64,GSplatHybridRenderer.OFF_AGG_BOUNDS_MIN=0,GSplatHybridRenderer.OFF_AGG_PROGRESS=12,GSplatHybridRenderer.OFF_AGG_BOUNDS_MAX=16,GSplatHybridRenderer.OFF_AGG_POINT_DURATION=28,GSplatHybridRenderer.OFF_CAMERA_WORLD_POS=32,GSplatHybridRenderer.OFF_AGG_ENABLED=44,GSplatHybridRenderer.OFF_SH_BAKED=48,GSplatHybridRenderer.OFF_NUM_GS_LAYERS=56,GSplatHybridRenderer.OFF_NUM_GS_CLIPPERS=60,GSplatHybridRenderer.CHEAP_READBACK_SIZE=4;var BYTE_ALIGNMENT=4,MirrorBuffer=class{constructor(device){this.data=new ArrayBuffer(0),this.buf=null,this.capacityRecords=0,this.records=0,this.dirty=!0,this.disposed=!1,this.device=device}get buffer(){return this.unusable?null:this.buf}get recordCount(){return this.unusable?0:this.records}get unusable(){return this.disposed}get isDirty(){return this.dirty}markDirty(){this.dirty=!0}upload(){if(this.disposed||!this.dirty)return;let count=this.fill();if(count<0)return;this.records=count;let bytes=count*this.bytesPerRecord;if(bytes===0){this.dirty=!1;return}let buffer=this.buf;buffer&&(this.device.queue.writeBuffer(buffer,0,this.data,0,bytes),this.dirty=!1)}ensureCapacity(needed){if(this.disposed)return!1;if(this.buf&&needed<=this.capacityRecords)return!0;let bytes=needed*this.bytesPerRecord,created=this.device.createBuffer({label:`gsplat-mirror-${this.label}`,size:bytes,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return this.destroyBuffer(),this.buf=created,this.capacityRecords=needed,this.data=new ArrayBuffer(bytes),!0}dispose(){this.disposed||(this.disposed=!0,this.destroyBuffer(),this.data=new ArrayBuffer(0),this.capacityRecords=0,this.records=0)}destroyBuffer(){let buffer=this.buf;if(buffer){this.buf=null;try{buffer.destroy()}catch(_a){}}}assertAlignment(){this.bytesPerRecord%BYTE_ALIGNMENT!==0&&console.error(`[GS][cull] 镜像缓冲 ${this.label} 的记录字节数 ${this.bytesPerRecord} 不是 ${BYTE_ALIGNMENT} 的整数倍,storage buffer 寻址会错位。`)}},U32_PER_RECORD=4,BYTES_PER_RECORD$2=U32_PER_RECORD*4,LayoutMirror=class extends MirrorBuffer{constructor(device,getLayout){super(device),this.bytesPerRecord=BYTES_PER_RECORD$2,this.label=`layout`,this.lastRevision=-1,this.getLayout=getLayout,this.assertAlignment()}checkRevision(revision){revision!==this.lastRevision&&(this.lastRevision=revision,this.markDirty())}get entryCount(){return this.recordCount}fill(){let layout=this.getLayout(),count=layout.length;if(count===0)return 0;if(!this.ensureCapacity(count))return-1;let view=new Uint32Array(this.data);for(let i=0;i<count;i++){let entry=layout[i],base=i*U32_PER_RECORD;view[base+0]=entry.startPoint>>>0,view[base+1]=entry.count>>>0,view[base+2]=entry.transformIndex>>>0,view[base+3]=entry.layerIndex>>>0}return count}},F32_PER_RECORD$1=16,BYTES_PER_RECORD$1=F32_PER_RECORD$1*4,SOURCE_FLOATS_PER_OBJECT=20,TransformMirror=class extends MirrorBuffer{constructor(device,getStore){super(device),this.bytesPerRecord=BYTES_PER_RECORD$1,this.label=`transform`,this.getStore=getStore,this.assertAlignment()}fill(){let store=this.getStore(),count=store.objectCount;if(count===0)return 0;if(!this.ensureCapacity(count))return-1;let source=store.transforms;if(source.length<count*SOURCE_FLOATS_PER_OBJECT)return-1;let view=new Float32Array(this.data);for(let i=0;i<count;i++){let src=i*SOURCE_FLOATS_PER_OBJECT,dst=i*F32_PER_RECORD$1;for(let k=0;k<F32_PER_RECORD$1;k++)view[dst+k]=source[src+k]}return count}},F32_PER_RECORD=4,BYTES_PER_RECORD=F32_PER_RECORD*4,ObjectParamsMirror=class extends MirrorBuffer{constructor(device,getObjects){super(device),this.bytesPerRecord=BYTES_PER_RECORD,this.label=`object-params`,this.getObjects=getObjects,this.assertAlignment()}checkDirty(){let objects=this.getObjects();for(let i=0;i<objects.length;i++)if(objects[i].renderParamsChanged){this.markDirty();return}}fill(){let objects=this.getObjects(),count=objects.length;if(count===0)return 0;if(!this.ensureCapacity(count))return-1;let view=new Float32Array(this.data);for(let i=0;i<count;i++){let obj=objects[i],base=i*F32_PER_RECORD;view[base+0]=obj.preBlurAmount,view[base+1]=obj.blurAmount,view[base+2]=0,view[base+3]=0}return count}},NO_LAYOUT_ENTRIES=[],NO_MIRROR_OBJECTS=[],_scratchSize=new three_webgpu.Vector2,_shCameraWorld=new three_webgpu.Vector3,PBMGaussianSplattingRenderMesh=class extends three_webgpu.Mesh{constructor(){super(),this.needsRender=!1,this.assembler=new SplatAssembler,this.transformStore=new TransformStore,this.layerRegistry=new LayerRegistry,this.shAssembler=new SHAssembler,this.shBaker=new SHBaker,this.shScheduler=new SHBakeScheduler,this.shJobs=[],this.shEntries=[],this.shCapacityWarned=!1,this.shBakedActive=!1,this.shLastComputePath=null,this.glMaxTextureSize=0,this.pipeline=null,this.throttle=new SortThrottle,this._requestedPipelineMode=0,this._activePipelineMode=1,this._pipelineRenderer=null,this.assemblePending=!1,this.forceClipperUniformRefresh=!1,this.appliedSHDegree=0,this._requestedInstanceSize=128,this._effectiveInstanceSize=1,this._geometryQuadCount=1,this._pipelineResolved=!1,this._disposed=!1,this.maxComputePoints=DEFAULT_MAX_COMPUTE_POINTS,this._arena=null,this._layoutMirror=null,this._transformMirror=null,this._objectParamsMirror=null,this._mirrorSet=null,this._mirrorObjects=NO_MIRROR_OBJECTS,this._survivorCount=null,this._computePathActive=!1,this._hybridRenderer=null,this._computeFailure=null,this.onBeforeRender=(renderer,scene,camera,..._rest)=>{var _a,_b,_c;let objects=this.collectObjects(scene);if(objects.length===0){this.geometry.instanceCount=0,this._computePathActive=!1,(_a=this._arena)==null||_a.sync([],()=>({transformIndex:0,layerIndex:0}));return}this.prepareComputePath(renderer);let usedSH=0,dataSH=0;for(let obj of objects)obj.usedSHDegree>usedSH&&(usedSH=obj.usedSHDegree),obj.maxSHDegree>dataSH&&(dataSH=obj.maxSHDegree);let appliedSH=Math.max(0,Math.min(usedSH,dataSH,2)),shDegreeChanged=appliedSH!==this.appliedSHDegree;this.appliedSHDegree=appliedSH,this._computePathActive&&this.resolveHybridUnsupportedReason(objects)!==null&&(this._computePathActive=!1);let inputsDirty=!1;this.isSceneNeedsRebuild(objects)?(this.rebuildScene(objects),this.gsSceneState.lastClipperHash=``,this.forceClipperUniformRefresh=!0,inputsDirty=!0):shDegreeChanged&&this.syncSH(objects),this._computePathActive&&(this._arena===null||this._arena.unusable)&&(this._computePathActive=!1);for(let obj of objects)obj.transformChanged&&(this.transformStore.updateOne(obj),(_b=this._transformMirror)==null||_b.markDirty(),obj.transformChanged=!1,obj.selectedChanged=!1,inputsDirty=!0);(_c=this._objectParamsMirror)==null||_c.checkDirty();for(let obj of objects)obj.renderParamsChanged&&(this.transformStore.updateOne(obj),obj.renderParamsChanged=!1);this.assemblePending&&!this._computePathActive&&(this.assembler.assemble(),this.assemblePending=!1),this.updateSHBake(renderer,camera),this.syncMaterialTextures();let totalPoints=this.assembler.totalPoints;this.syncPipelineMode(renderer,totalPoints),this._pipelineResolved=!0;let pipeline=this.pipeline,packingOk=this.syncInstancePacking(totalPoints);inputsDirty&&pipeline.markInputsDirty(),this._frameParams.camera=camera,this._frameParams.objects=objects,this._frameParams.totalPoints=totalPoints;let resourcesReady=totalPoints>0&&this.assembler.dataTexture!==null&&this.transformStore.texture!==null;resourcesReady&&this.throttle.shouldSort(camera,inputsDirty)&&(pipeline.requestSort(this._frameParams),this.throttle.markSorted(camera)),pipeline.frameUpdate(this._frameParams);let clipperHash=this.getClipperHash(objects);(this.forceClipperUniformRefresh||clipperHash!==this.gsSceneState.lastClipperHash)&&(this.updateClipperUniforms(objects),this.gsSceneState.lastClipperHash=clipperHash,this.forceClipperUniformRefresh=!1,this.needsRender=!0);let indexSource=pipeline.indexSource;if(indexSource.kind===`orderTexture`)this.material.orderTexture=indexSource.texture;else{let attr=indexSource.attribute;this.geometry.getAttribute(`splatIndex`)!==attr&&(this.geometry.setAttribute(`splatIndex`,attr),this.geometry._maxInstanceCount=attr.count)}this.material.syncDynamicUniforms(),this.geometry.instanceCount=this._computePathActive?0:packingOk?this.resolveInstanceCount(pipeline,resourcesReady):0,this._computePathActive&&this.drawHybrid(renderer,camera)};let geometry=this.createGeometry(),material=this.createMaterial();this.geometry=geometry,this.material=material,this.frustumCulled=!1,this.renderOrder=-99999999999,this.gsSceneState={lastObjectsHash:``,lastClipperHash:``},this._frameParams={camera:null,objects:[],assembler:this.assembler,transformStore:this.transformStore,totalPoints:0}}get pipelineMode(){return this._requestedPipelineMode}set pipelineMode(value){this._requestedPipelineMode=value}get currentPipelineMode(){return this._activePipelineMode}get computePathActive(){return this._computePathActive}get arena(){return this._arena}get mirrors(){return this._mirrorSet}get survivorCount(){return this._survivorCount}setSurvivorCount(value){this._survivorCount=value}get requestedInstanceSize(){return this._requestedInstanceSize}set requestedInstanceSize(value){if(this._requestedInstanceSize=value,this._disposed)return;let result=resolveInstanceSize(value,this._activePipelineMode,this._pipelineResolved);this._effectiveInstanceSize=result.value,result.reason===`not-finite`?console.warn(`[GS] requestedInstanceSize 取值无效(${String(value)}),已按 1 生效。`):result.reason===`out-of-range`&&console.warn(`[GS] requestedInstanceSize=${value} 越界,已 clamp 到 ${result.value}(有效范围 [1, 256])。`)}get effectiveInstanceSize(){return this._effectiveInstanceSize}get sortCameraDistance(){return this.throttle.sortCameraDistance}set sortCameraDistance(value){this.throttle.sortCameraDistance=value}get sortCameraCoorient(){return this.throttle.sortCameraCoorient}set sortCameraCoorient(value){this.throttle.sortCameraCoorient=value}get sortMinIntervalMs(){return this.throttle.sortMinIntervalMs}set sortMinIntervalMs(value){this.throttle.sortMinIntervalMs=value}get shRebakeAngle(){return this.shScheduler?this.shScheduler.rebakeAngle:0}set shRebakeAngle(value){let v=sanitizeRebakeAngle(value);if(v===null){console.warn(`[PBMGaussianSplattingRenderMesh] shRebakeAngle 取值非法:${value},合法区间为 [0, 90),已忽略`);return}this.shScheduler&&(this.shScheduler.rebakeAngle=v)}createGeometry(){let geometry=new three_webgpu.InstancedBufferGeometry,{positions,indices}=buildPackedQuadGeometryData(1);geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.setIndex(new three_webgpu.BufferAttribute(indices,1));let splatIndices=new Float32Array(1),indexAttr=new three_webgpu.InstancedBufferAttribute(splatIndices,1,!1,1);return indexAttr.setUsage(three_webgpu.DynamicDrawUsage),geometry.setAttribute(`splatIndex`,indexAttr),geometry._maxInstanceCount=1,geometry.instanceCount=0,geometry}createMaterial(){return new PBMGaussianSplattingNodeMaterial({numGsLayers:0,numGsClippers:0,shBaked:!1})}createDefaultLayerClipperRanges(count){return Array.from({length:count},()=>new three_webgpu.Vector2(-1,0))}createDefaultClipperMatrices(count){return Array.from({length:count},()=>new three_webgpu.Matrix4)}collectObjects(scene){let pbmGSObjects=[];return scene.traverse(object=>{object instanceof require_pbmGaussianSplattingObject.t&&object.visible&&pbmGSObjects.push(object)}),pbmGSObjects.sort((a,b)=>{let keyA=a.uuid+a.gsViewLayerKey,keyB=b.uuid+b.gsViewLayerKey;return keyA<keyB?-1:+(keyA>keyB)}),pbmGSObjects}isSceneNeedsRebuild(objects){let hash=objects.map(obj=>`${obj.uuid}:${obj.gsViewLayerKey}`).join(`|`),result=hash!==this.gsSceneState.lastObjectsHash;return this.gsSceneState.lastObjectsHash=hash,result}getClipperHash(objects){return objects.map(obj=>{let clipperHash=obj.gsClippers.map(clipper=>{var _a;return`${(_a=clipper.floorIndex)==null?-1:_a}:${clipper.clippingBoxMatrix.elements.join(`,`)}`}).join(`;`);return`${obj.gsViewLayerKey}:${clipperHash}`}).join(`|`)}updateClipperCounts(layerCount,clipperCount){let nextLayerCount=Math.max(0,layerCount|0),nextClipperCount=Math.max(0,clipperCount|0);(this.material.numGsLayers!==nextLayerCount||this.material.numGsClippers!==nextClipperCount)&&(this.material.numGsLayers=nextLayerCount,this.material.numGsClippers=nextClipperCount,this.material.needsUpdate=!0)}updateClipperUniforms(pbmGSObjects){var _a,_b;let layerCount=this.layerRegistry.layerCount;if(layerCount===0){this.material.layerClipperRanges=[],this.material.clipperMatricesInverse=[],this.updateClipperCounts(0,0);return}let clippersByLayer=new Map;for(let object of pbmGSObjects){let layerKey=object.gsViewLayerKey||object.uuid;clippersByLayer.has(layerKey)||clippersByLayer.set(layerKey,object.gsClippers)}let totalClipperCount=0;for(let layerKey of this.layerRegistry.layerKeys)totalClipperCount+=((_a=clippersByLayer.get(layerKey))==null?[]:_a).length;let layerRanges=this.createDefaultLayerClipperRanges(layerCount),clipperMatrices=this.createDefaultClipperMatrices(totalClipperCount),clipperCursor=0;for(let layerKey of this.layerRegistry.layerKeys){let layerIndex=this.layerRegistry.layerKeyToIndex.get(layerKey);if(layerIndex===void 0)continue;let clippers=(_b=clippersByLayer.get(layerKey))==null?[]:_b,start=clipperCursor,count=0;for(let clipper of clippers)clipperMatrices[clipperCursor].copy(clipper.clippingBoxMatrix).invert(),clipperCursor++,count++;count>0&&layerRanges[layerIndex].set(start,count)}this.material.layerClipperRanges=layerRanges,this.material.clipperMatricesInverse=clipperMatrices,this.updateClipperCounts(layerCount,clipperCursor)}rebuildScene(objects){var _a,_b,_c,_d;this.layerRegistry.sync(objects),this.transformStore.sync(objects);let resolveIndices=obj=>{let transformIndex=this.transformStore.indexOf(obj);return transformIndex===void 0?(console.error(`[GS] resolveIndices: 对象缺少 transformIndex(布局不一致)。`),{transformIndex:0,layerIndex:this.layerRegistry.layerIndexOf(obj)}):{transformIndex,layerIndex:this.layerRegistry.layerIndexOf(obj)}};this.assembler.sync(objects,resolveIndices),this.assemblePending=!0,(_a=this._arena)==null||_a.sync(objects,resolveIndices),this._mirrorObjects=objects;let arenaForMirrors=this._arena;arenaForMirrors&&((_b=this._layoutMirror)==null||_b.checkRevision(arenaForMirrors.revision)),(_c=this._transformMirror)==null||_c.markDirty(),(_d=this._objectParamsMirror)==null||_d.markDirty(),this.syncSH(objects),this.assertLayoutConsistency(objects)}syncSH(objects){this.shAssembler.sync(objects,this.appliedSHDegree),this.shScheduler.prune(new Set(objects))}getMaxTextureSize(renderer){var _a,_b;let backend=renderer.backend;if(backend.isWebGPUBackend)return(_b=(_a=backend.device)==null?void 0:_a.limits.maxTextureDimension2D)==null?8192:_b;if(this.glMaxTextureSize===0){let gl=backend.gl;this.glMaxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE)}return this.glMaxTextureSize}updateSHBake(renderer,camera){var _a;this.shBakedActive=!1;let baker=this.shBaker,scheduler=this.shScheduler;if(this.appliedSHDegree===0){baker.releaseTarget(),scheduler.clear(),this.shLastComputePath=null;return}let compute=this._computePathActive,arena=this._arena,totalPoints=compute?arena.totalPoints:this.assembler.totalPoints,{reallocated,ok}=baker.ensureCapacity(totalPoints,this.getMaxTextureSize(renderer));if(!ok){this.shCapacityWarned||(this.shCapacityWarned=!0,console.warn(`[PBMGaussianSplattingRenderMesh] SH 烘焙纹理超出最大纹理尺寸,本帧不使用 SH`));return}let entries=this.assembler.regions;if(compute){let layout=arena.layout,out=this.shEntries;for(let i=0;i<layout.length;i++){let l=layout[i],e=out[i];e?(e.object=l.object,e.start=l.startPoint,e.count=l.count):out[i]={object:l.object,start:l.startPoint,count:l.count}}out.length=layout.length,entries=out}let forceAll=reallocated||this.shLastComputePath!==compute;this.shLastComputePath=compute,_shCameraWorld.setFromMatrixPosition(camera.matrixWorld),scheduler.plan(entries,this.shAssembler,_shCameraWorld,this.appliedSHDegree,forceAll,this.shJobs),baker.bake(renderer,this.shJobs,this.appliedSHDegree),this.shJobs.length>0&&((_a=this._hybridRenderer)==null||_a.notifyBakedContentChanged()),this.shBakedActive=!0}assertLayoutConsistency(objects){var _a;let regions=this.assembler.regions;if(regions.length!==objects.length||this.transformStore.objectCount!==objects.length){console.error(`[GS] 布局不一致:objects=${objects.length} regions=${regions.length} transforms=${this.transformStore.objectCount}`);return}for(let i=0;i<objects.length;i++)if(regions[i].object!==objects[i]||this.transformStore.indexOf(objects[i])!==i){console.error(`[GS] 布局不一致:第 ${i} 个对象在 regionList / TransformStore 中错位。`);break}let layout=(_a=this._arena)==null?void 0:_a.layout;if(layout&&layout.length>0){let previous=-1;for(let i=0;i<layout.length;i++){let entry=layout[i],position=this.transformStore.indexOf(entry.object);if(position===void 0||position<=previous||position!==entry.transformIndex){console.error(`[GS] 布局不一致:Arena 布局表第 ${i} 项错位(对象在 TransformStore 中的序号为 ${position==null?`不存在`:position},表项记录的 transformIndex 为 ${entry.transformIndex},前一项序号 ${previous})。`);break}previous=position}}}syncMaterialTextures(){var _a,_b,_c;this.material.transformsTexture=this.transformStore.texture;let baked=this.shBakedActive;this.material.shBaked!==baked&&(this.material.shBaked=baked,this.material.needsUpdate=!0);let bakedTexture=(_b=(_a=this.shBaker)==null?void 0:_a.texture)==null?null:_b;this.material.bakedColorTexture=baked?bakedTexture:null,(_c=this._hybridRenderer)==null||_c.setBakedSource(bakedTexture,baked),this.material.dataTexture=this.assembler.dataTexture,this.material.numPoints=this.assembler.totalPoints,this.material.transformIndicesTexture=null,this.material.layerIndicesTexture=null}syncPipelineMode(renderer,totalPoints){var _a;let resolved=resolvePipelineMode(this._requestedPipelineMode,renderer,totalPoints,this.pipeline);if(resolved===this._activePipelineMode&&this.pipeline&&this._pipelineRenderer===renderer)return;(_a=this.pipeline)==null||_a.dispose(),this.pipeline=resolved===2?new GpuSortPipeline(renderer):new CpuSortPipeline(renderer,()=>{this.needsRender=!0}),this._activePipelineMode=resolved,this._pipelineRenderer=renderer,this.pipeline.markInputsDirty(),this.throttle.reset();let useOrderTexture=this.pipeline.requiresOrderTexture;this.material.useOrderTexture!==useOrderTexture&&(this.material.useOrderTexture=useOrderTexture,this.material.needsUpdate=!0),this.geometry.instanceCount=0}syncInstancePacking(totalPoints){let effective=resolveInstanceSize(this._requestedInstanceSize,this._activePipelineMode,this._pipelineResolved).value;return this._effectiveInstanceSize=effective,totalPoints<=0?!0:this._geometryQuadCount===effective?(this.syncMaterialInstanceSize(effective),!0):(this.rebuildPackedQuadGeometry(effective),this.syncMaterialInstanceSize(effective),!0)}syncMaterialInstanceSize(effective){this.material.instanceSize!==effective&&(this.material.instanceSize=effective,this.material.needsUpdate=!0)}rebuildPackedQuadGeometry(quadCount){let geometry=this.geometry,prevPosition=geometry.getAttribute(`position`),prevIndex=geometry.getIndex(),{positions,indices}=buildPackedQuadGeometryData(quadCount);geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),this._geometryQuadCount=quadCount,this.releaseAttributeGpuResource(prevPosition),this.releaseAttributeGpuResource(prevIndex)}releaseAttributeGpuResource(attribute){var _a,_b;if(!attribute)return;let renderer=this._pipelineRenderer;try{(_b=(_a=renderer==null?void 0:renderer._attributes)==null?void 0:_a.delete)==null||_b.call(_a,attribute)}catch(_c){}}resolveInstanceCount(pipeline,resourcesReady){if(!resourcesReady)return 0;let raw=pipeline.instanceCount;if(!(raw>0))return 0;let k=this._effectiveInstanceSize,count=pipeline.requiresOrderTexture?Math.ceil(raw/k):raw;return!Number.isFinite(count)||count<0?0:count}probeComputeBackend(renderer){let backend=renderer==null?void 0:renderer.backend;return(backend==null?void 0:backend.isWebGPUBackend)===!0&&!!backend.device}prepareComputePath(renderer){var _a,_b;let backendOk=this.probeComputeBackend(renderer),device=backendOk&&!this._arena&&!this._disposed&&this._computeFailure===null?(_a=renderer==null?void 0:renderer.backend)==null?void 0:_a.device:void 0;if(device)try{this.createComputeResources(renderer,device)}catch(error){this._arena=null,this._hybridRenderer=null,this.disposeMirrors(),this._computeFailure=String((_b=error==null?void 0:error.message)==null?error:_b),console.error(`[GS] Compute_Path 初始化失败,3DGS 改用 Fallback_Path。常见原因:设备的 maxStorageBuffersInVertexStage 为 0(Draw pipeline 的顶点阶段要读 3 个 storage buffer)。原始错误:`,error);return}this._arena&&(this._arena.maxPoints=this.maxComputePoints);let arena=this._arena;this._computePathActive=backendOk&&arena!==null&&!arena.unusable&&this._hybridRenderer!==null}createComputeResources(renderer,device){this._arena=new SplatArena(device),this._hybridRenderer=this.createHybridRenderer(renderer,device),this.gsSceneState.lastObjectsHash=``,this.createMirrors(device)}createHybridRenderer(renderer,device){var _a,_b,_c,_d;if(renderer!=null&&renderer.logarithmicDepthBuffer)return null;let created=new GSplatHybridRenderer(device,((_c=(_b=(_a=renderer==null?void 0:renderer.getRenderTarget)==null?void 0:_a.call(renderer))==null?void 0:_b.texture)==null?void 0:_c.type)===three_webgpu.HalfFloatType?`rgba16float`:`rgba8unorm`,`depth24plus`,(_d=renderer.backend)==null?null:_d),size=renderer.getDrawingBufferSize(_scratchSize);return created.resize(size.x,size.y),created}drawHybrid(renderer,camera){let hybrid=this._hybridRenderer;if(!hybrid)return;let size=renderer.getDrawingBufferSize(_scratchSize);hybrid.resize(size.x,size.y);let activePass=this.getActiveRenderPass(renderer);activePass&&(hybrid.submitFrame(activePass.pass,this._arena,camera,this.mirrors),activePass.invalidateStateCache(),this._survivorCount=hybrid.renderCount)}getActiveRenderPass(renderer){var _a,_b;try{let renderContext=renderer._currentRenderContext;if(!renderContext)return null;let data=(_b=(_a=renderer.backend)==null?void 0:_a.get)==null?void 0:_b.call(_a,renderContext),pass=data==null?void 0:data.currentPass;return pass?{pass,invalidateStateCache:()=>{let sets=data.currentSets;sets&&(sets.pipeline=null,sets.index=null,sets.attributes={},sets.bindingGroups=[])}}:null}catch(_c){return null}}createMirrors(device){this._layoutMirror=new LayoutMirror(device,()=>{var _a,_b;return(_b=(_a=this._arena)==null?void 0:_a.layout)==null?NO_LAYOUT_ENTRIES:_b}),this._transformMirror=new TransformMirror(device,()=>this.transformStore),this._objectParamsMirror=new ObjectParamsMirror(device,()=>this._mirrorObjects),this._mirrorSet={layout:this._layoutMirror,transform:this._transformMirror,objectParams:this._objectParamsMirror}}disposeMirrors(){var _a,_b,_c;(_a=this._layoutMirror)==null||_a.dispose(),(_b=this._transformMirror)==null||_b.dispose(),(_c=this._objectParamsMirror)==null||_c.dispose(),this._layoutMirror=null,this._transformMirror=null,this._objectParamsMirror=null,this._mirrorSet=null,this._mirrorObjects=NO_MIRROR_OBJECTS}resolveHybridUnsupportedReason(objects){for(let object of objects)if(object.gsClippers.length>0)return`clipper-not-migrated`;return this.material.aggregationEnabled?`aggregation-not-migrated`:null}dispose(){var _a,_b,_c;this._disposed=!0,(_a=this.pipeline)==null||_a.dispose(),this.pipeline=null,this._pipelineRenderer=null,this.assembler.dispose(),(_b=this._arena)==null||_b.dispose(),this._arena=null,(_c=this._hybridRenderer)==null||_c.dispose(),this._hybridRenderer=null,this.disposeMirrors(),this._survivorCount=null,this._computePathActive=!1,this.transformStore.dispose(),this.shAssembler&&(this.shAssembler.dispose(),this.shAssembler=null),this.shBaker&&(this.shBaker.dispose(),this.shBaker=null),this.shScheduler&&(this.shScheduler.clear(),this.shScheduler=null),this.shJobs.length=0,this.shEntries.length=0,this.shBakedActive=!1,this.geometry.dispose(),this.material.dispose()}};function safeFloatAttribute(name,defaultValue=0){let nodeType=`float`,node=(0,three_tsl.attribute)(name,nodeType),originalGenerate=node.generate.bind(node);return node.generate=function(builder){return builder.hasGeometryAttribute(name)?originalGenerate(builder):builder.generateConst(nodeType,defaultValue)},(0,three_tsl.float)(node)}function mrFloat(name){return(0,three_tsl.float)((0,three_tsl.materialReference)(name,`float`)).toVar(name)}function mrVec3(name){return(0,three_tsl.vec3)((0,three_tsl.materialReference)(name,`vec3`)).toVar(name)}function mrVec4(name){return(0,three_tsl.vec4)((0,three_tsl.materialReference)(name,`vec4`)).toVar(name)}function mrMat4(name){return(0,three_tsl.mat4)((0,three_tsl.materialReference)(name,`mat4`)).toVar(name)}function mrCubeTexture(name,uvNode){let refNode=(0,three_tsl.materialReference)(name,`cubeTexture`),originSetup=refNode.setup;return refNode.setup=function(builder){let cubeTextureNode=originSetup.call(this,builder);return cubeTextureNode&&(uvNode&&(cubeTextureNode.uvNode=uvNode),cubeTextureNode.getUniformHash=function(){return[name,this.value.uuid].join(`-`)}),cubeTextureNode},(0,three_tsl.vec4)(refNode).toVar(name)}function mrTexture(name,uvNode){let refNode=(0,three_tsl.materialReference)(name,`texture`),originSetup=refNode.setup;return refNode.setup=function(builder){let textureNode=originSetup.call(this,builder);return textureNode&&(uvNode&&(textureNode.uvNode=uvNode),textureNode.getUniformHash=function(){return[name,this.value.uuid].join(`-`)}),textureNode},(0,three_tsl.vec4)(refNode).toVar(name)}var rgb2hsv=(0,three_tsl.Fn)(([color])=>{let c=(0,three_tsl.vec3)(color).toVar(),K=(0,three_tsl.vec4)(0,-1/3,2/3,-1),p=(0,three_tsl.mix)((0,three_tsl.vec4)(c.b,c.g,K.w,K.z),(0,three_tsl.vec4)(c.g,c.b,K.x,K.y),(0,three_tsl.step)(c.b,c.g)).toVar(),q=(0,three_tsl.mix)((0,three_tsl.vec4)(p.x,p.y,p.w,c.r),(0,three_tsl.vec4)(c.r,p.y,p.z,p.x),(0,three_tsl.step)(p.x,c.r)).toVar(),d=q.x.sub((0,three_tsl.min)(q.w,q.y)),e=(0,three_tsl.float)(1e-10);return(0,three_tsl.vec3)((0,three_tsl.abs)(q.z.add(q.w.sub(q.y).div(d.mul(6).add(e)))),d.div(q.x.add(e)),q.x)}).setLayout({name:`FN_rgb2hsv`,type:`vec3`,inputs:[{name:`color`,type:`vec3`}]}),hsv2rgb=(0,three_tsl.Fn)(([color])=>{let c=(0,three_tsl.vec3)(color).toVar(),K=(0,three_tsl.vec4)(1,2/3,1/3,3),p=(0,three_tsl.abs)((0,three_tsl.fract)((0,three_tsl.vec3)(c.x,c.x,c.x).add((0,three_tsl.vec3)(K.x,K.y,K.z))).mul(6).sub((0,three_tsl.vec3)(K.w,K.w,K.w)));return c.z.mul((0,three_tsl.mix)((0,three_tsl.vec3)(K.x,K.x,K.x),(0,three_tsl.clamp)(p.sub((0,three_tsl.vec3)(K.x,K.x,K.x)),0,1),c.y))}).setLayout({name:`FN_hsv2rgb`,type:`vec3`,inputs:[{name:`color`,type:`vec3`}]}),unpackRGBAToDepth=(0,three_tsl.Fn)(([color])=>(0,three_tsl.dot)(color,(0,three_tsl.vec4)(1/(256*256*256),1/(256*256),1/256,1))).setLayout({name:`FN_hsv2rgb`,type:`float`,inputs:[{name:`color`,type:`vec4`}]}),hdrBoost=(0,three_tsl.Fn)(([gainRGB,maxDisplayBoost,maxContentBoost,minContentBoost,capacityMin,capacityMax,gamma])=>{let gain=(0,three_tsl.vec3)((0,three_tsl.clamp)(gainRGB.r,(0,three_tsl.float)(0),(0,three_tsl.float)(1)),(0,three_tsl.clamp)(gainRGB.g,(0,three_tsl.float)(0),(0,three_tsl.float)(1)),(0,three_tsl.clamp)(gainRGB.b,(0,three_tsl.float)(0),(0,three_tsl.float)(1))),invGamma=(0,three_tsl.float)(1).div((0,three_tsl.max)(gamma,(0,three_tsl.float)(1e-6))),gainLinear=(0,three_tsl.vec3)((0,three_tsl.pow)(gain.r,invGamma),(0,three_tsl.pow)(gain.g,invGamma),(0,three_tsl.pow)(gain.b,invGamma)),logCapacityMin=(0,three_tsl.log2)((0,three_tsl.max)(capacityMin,(0,three_tsl.float)(1e-6))),denom=(0,three_tsl.log2)((0,three_tsl.max)(capacityMax,(0,three_tsl.float)(1e-6))).sub(logCapacityMin),weight=(0,three_tsl.clamp)((0,three_tsl.log2)((0,three_tsl.max)(maxDisplayBoost,(0,three_tsl.float)(1))).sub(logCapacityMin).div((0,three_tsl.max)(denom,(0,three_tsl.float)(1e-6))),(0,three_tsl.float)(0),(0,three_tsl.float)(1)).mul((0,three_tsl.step)((0,three_tsl.float)(1e-6),denom)),logMinBoost=(0,three_tsl.log2)((0,three_tsl.max)(minContentBoost,(0,three_tsl.float)(1e-6))),logMaxBoost=(0,three_tsl.log2)((0,three_tsl.max)(maxContentBoost,(0,three_tsl.float)(1e-6))),logGainW=(0,three_tsl.vec3)(logMinBoost).add(gainLinear.mul((0,three_tsl.vec3)(logMaxBoost.sub(logMinBoost)))).mul(weight);return(0,three_tsl.vec3)((0,three_tsl.exp2)(logGainW.x),(0,three_tsl.exp2)(logGainW.y),(0,three_tsl.exp2)(logGainW.z))}).setLayout({name:`FN_hdrBoost`,type:`vec3`,inputs:[{name:`gainRGB`,type:`vec3`},{name:`maxDisplayBoost`,type:`float`},{name:`maxContentBoost`,type:`float`},{name:`minContentBoost`,type:`float`},{name:`capacityMin`,type:`float`},{name:`capacityMax`,type:`float`},{name:`gamma`,type:`float`}]}),hdrOffset=(0,three_tsl.Fn)(([sdrRGB,boost,offsetSdr,offsetHdr])=>(0,three_tsl.vec3)(sdrRGB).add(offsetSdr).mul(boost).sub(offsetHdr)).setLayout({name:`FN_hdrOffset`,type:`vec3`,inputs:[{name:`sdrRGB`,type:`vec3`},{name:`boost`,type:`vec3`},{name:`offsetSdr`,type:`float`},{name:`offsetHdr`,type:`float`}]}),zoomVector=(0,three_tsl.Fn)(([direction,vector,zoom])=>{let theta=(0,three_tsl.dot)(direction,vector),d=direction.mul(theta),q=vector.sub(d).div(zoom);return(0,three_tsl.normalize)(d.add(q))}).setLayout({name:`FN_zoomVector`,type:`vec3`,inputs:[{name:`direction`,type:`vec3`},{name:`vector`,type:`vec3`},{name:`zoom`,type:`float`}]}),sampleDirection=(0,three_tsl.Fn)(([matrix,zoom,cameraDirection,positionWorld])=>{let panoOrigin=matrix.mul((0,three_tsl.vec4)(0,0,0,1)).xyz,zoomed=zoomVector(cameraDirection,(0,three_tsl.normalize)(positionWorld.sub(panoOrigin)),zoom);return matrix.toMat3().transpose().mul(zoomed)}).setLayout({name:`FN_sampleDirection`,type:`vec3`,inputs:[{name:`direction`,type:`mat4`},{name:`vector`,type:`float`},{name:`zoom`,type:`vec3`},{name:`positionWorld`,type:`vec3`}]}),TAU$3=Math.PI*2;function formatRad$1(rad){return rad>=0&&rad<TAU$3?rad:(rad%TAU$3+TAU$3)%TAU$3}function coordinatesToVector(coordinates,target){let distance=Math.abs(Math.cos(coordinates.latitude)),x=-Math.sin(coordinates.longitude)*distance,y=-Math.sin(coordinates.latitude),z=-Math.cos(coordinates.longitude)*distance;return target?target.set(x,y,z):new three_webgpu.Vector3(x,y,z)}function vectorToCoordinates(vector){return{longitude:formatRad$1(-Math.atan2(vector.x,-vector.z)),latitude:-Math.asin(vector.y/1)}}function longitudeToHeading(longitude){return(-longitude/Math.PI*180-90)/360+.25}function headingToLongitude(heading){return-((heading-.25)*360+90)/180*Math.PI}var DEFAULT_ASPECT=1,DEFAULT_NEAR=.1,DEFAULT_FAR=2e3,TAU$2=Math.PI*2,PI_2=Math.PI/2;function formatRad(rad){return rad>0&&rad<=TAU$2?rad:(rad%TAU$2+TAU$2)%TAU$2}function matrixLerp(from,to,weight,target){weight=Math.pow(weight,4);for(var i=0;i<16;i++)target.elements[i]=from.elements[i]+(to.elements[i]-from.elements[i])*weight;return target}var Camera=class extends three_webgpu.Camera{constructor(fov,aspect=DEFAULT_ASPECT,near=DEFAULT_NEAR,far=DEFAULT_FAR,perspToOrtho=new three_webgpu.Vector2,resolution=new three_webgpu.Vector2(512,512),pixelRatio=1){super(),this.fov=fov,this.aspect=aspect,this.near=near,this.far=far,this.perspToOrtho=perspToOrtho,this.resolution=resolution,this.pixelRatio=pixelRatio,this.time=0,this.controllerMode=null,this.needsRender=!0,this.refineModel=!0,this.pose={longitude:0,latitude:0,fov,distance:0,offset:new three_webgpu.Vector3},this.computePose(),this.perspectiveCamera=new three_webgpu.PerspectiveCamera(this.fov,this.aspect,.001,this.far);let top=Math.max(this.orthoDistance,.01)*Math.tan(.5*this.fov/180*Math.PI),left=-.5*this.aspect*2*top;this.orthographicCamera=new three_webgpu.OrthographicCamera(left,-left,top,-top,.001,this.far),this.computeProjectionMatrix(),this.lastValues={position:this.position.clone(),quaternion:this.quaternion.clone(),scale:this.scale.clone(),fov:this.fov,aspect:this.aspect,near:this.near,far:this.far,orthoDistance:this.orthoDistance,perspToOrtho:this.perspToOrtho.clone()},this.type=this.perspToOrtho.x<1?`PerspectiveCamera`:`OrthographicCamera`,this.autoNearFar=!0}get orthoDistance(){return this.pose.distance>1?this.pose.distance:1+(this.pose.distance-1)*this.perspToOrtho.x}get zoom(){return this.type===`OrthographicCamera`?this.orthographicCamera.zoom:this.type===`PerspectiveCamera`?this.perspectiveCamera.zoom:1}get top(){return this.type===`OrthographicCamera`?this.orthographicCamera.top:0}get bottom(){return this.type===`OrthographicCamera`?this.orthographicCamera.bottom:0}get left(){return this.type===`OrthographicCamera`?this.orthographicCamera.left:0}get right(){return this.type===`OrthographicCamera`?this.orthographicCamera.right:0}getDirection(target){return coordinatesToVector(this.pose,target)}computePose(distance=0){this.updateMatrix();let e=this.matrix.elements;return this.pose.latitude=Math.asin(require_memoryUsage.M(e[9],-1,1)),Math.abs(e[9])<.9999999?this.pose.longitude=formatRad(Math.atan2(e[8],e[10])):this.pose.longitude=formatRad(Math.atan2(-e[2],e[0])),this.pose.fov=this.fov,this.pose.distance=distance,this.pose.offset=new three_webgpu.Vector3(-e[8],-e[9],-e[10]).setLength(this.pose.distance).add(this.position),this}setFromPose(pose){var _a,_b,_c,_d,_e;let longitude=formatRad((_a=pose.longitude)==null?this.pose.longitude:_a),latitude=Math.max(-PI_2+1e-4,Math.min(PI_2-1e-4,(_b=pose.latitude)==null?this.pose.latitude:_b)),fov=(_c=pose.fov)==null?this.pose.fov:_c,distance=(_d=pose.distance)==null?this.pose.distance:_d,offset=(_e=pose.offset)==null?this.pose.offset:_e,vector=coordinatesToVector({longitude,latitude}).normalize();return this.position.set(0,0,0),this.lookAt(vector),this.position.add(offset).sub(vector.clone().setLength(distance)),this.fov!==fov&&(this.fov=fov,this.perspectiveCamera.fov=fov,this.updateProjectionMatrix()),this.updateMatrixWorld(!0),this.pose.longitude=longitude,this.pose.latitude=latitude,this.pose.fov=fov,this.pose.distance=distance,this.pose.offset.copy(offset),this.needsRender=!0,this}copyPose(){return{longitude:this.pose.longitude,latitude:this.pose.latitude,fov:this.pose.fov,distance:this.pose.distance,offset:this.pose.offset.clone()}}computeProjectionMatrix(){matrixLerp(this.orthographicCamera.projectionMatrix,this.perspectiveCamera.projectionMatrix,1-this.perspToOrtho.x,this.projectionMatrix),this.projectionMatrixInverse.copy(this.projectionMatrix).invert(),this.needsRender=!0}setViewOffset(fullWidth,fullHeight,x,y,width,height){this.perspectiveCamera.setViewOffset(fullWidth,fullHeight,x,y,width,height),this.orthographicCamera.setViewOffset(fullWidth,fullHeight,x,y,width,height),this.computeProjectionMatrix()}get view(){return this.perspectiveCamera.view?Object.assign({},this.perspectiveCamera.view):null}clearViewOffset(){this.perspectiveCamera.clearViewOffset(),this.orthographicCamera.clearViewOffset(),this.computeProjectionMatrix()}updateProjectionMatrix(){this.perspectiveCamera.coordinateSystem=this.coordinateSystem,this.orthographicCamera.coordinateSystem=this.coordinateSystem,this.perspectiveCamera.updateProjectionMatrix(),this.orthographicCamera.updateProjectionMatrix(),this.computeProjectionMatrix()}get perspectiveProjectionMatrix(){return this.perspectiveCamera.projectionMatrix}get perspectiveProjectionMatrixInverse(){return this.perspectiveCamera.projectionMatrixInverse}get orthographicProjectionMatrix(){return this.orthographicCamera.projectionMatrix}get orthographicProjectionMatrixInverse(){return this.orthographicCamera.projectionMatrixInverse}updateTime(time){this.time=time;let needsComputeProjectionMatrix=!1;if((this.lastValues.fov!==this.fov||this.lastValues.near!==this.near||this.lastValues.far!==this.far||this.lastValues.aspect!==this.aspect)&&(this.perspectiveCamera.coordinateSystem=this.coordinateSystem,this.perspectiveCamera.fov=this.fov,this.perspectiveCamera.near=this.near,this.perspectiveCamera.far=this.far,this.perspectiveCamera.aspect=this.aspect,this.perspectiveCamera.updateProjectionMatrix(),needsComputeProjectionMatrix=!0),!this.lastValues.position.equals(this.position)||!this.lastValues.quaternion.equals(this.quaternion)||!this.lastValues.scale.equals(this.scale)||!this.lastValues.perspToOrtho.equals(this.perspToOrtho)||this.lastValues.fov!==this.fov||this.lastValues.near!==this.near||this.lastValues.far!==this.far||this.lastValues.orthoDistance!==this.orthoDistance||this.lastValues.aspect!==this.aspect){let top=Math.max(this.orthoDistance,.01)*Math.tan(.5*this.fov/180*Math.PI),left=-.5*this.aspect*2*top;this.orthographicCamera.coordinateSystem=this.coordinateSystem,this.orthographicCamera.left=left,this.orthographicCamera.right=-left,this.orthographicCamera.top=top,this.orthographicCamera.bottom=-top,this.orthographicCamera.near=this.near,this.orthographicCamera.far=this.far,this.orthographicCamera.updateProjectionMatrix(),needsComputeProjectionMatrix=!0}needsComputeProjectionMatrix&&this.computeProjectionMatrix(),this.lastValues.position.copy(this.position),this.lastValues.quaternion.copy(this.quaternion),this.lastValues.scale.copy(this.scale),this.lastValues.fov=this.fov,this.lastValues.aspect=this.aspect,this.lastValues.near=this.near,this.lastValues.far=this.far,this.lastValues.orthoDistance=this.orthoDistance,this.lastValues.perspToOrtho.copy(this.perspToOrtho),this.type=this.perspToOrtho.x<1?`PerspectiveCamera`:`OrthographicCamera`}get isPerspectiveCamera(){return this.perspToOrtho.x<1}get isOrthographicCamera(){return this.perspToOrtho.x>=1}copy(source,recursive){return super.copy(source,recursive),this.fov=source.fov,this.aspect=source.aspect,this.near=source.near,this.far=source.far,this.perspToOrtho.copy(source.perspToOrtho),this.updateTime(require_memoryUsage.p()),this}},TRANSPARENT=(0,three_tsl.vec4)(0,0,0,0),scratchViewport$1=new three_webgpu.Vector4,resolution=(0,three_tsl.uniform)(new three_webgpu.Vector2(512,512)).onFrameUpdate(function(frame){let camera=frame.camera;camera instanceof Camera?this.value.copy(camera.resolution):frame.renderer&&(frame.renderer.getViewport(scratchViewport$1),this.value.set(scratchViewport$1.width,scratchViewport$1.height))}),pixelRatio=(0,three_tsl.uniform)(1).onFrameUpdate(function(frame){let camera=frame.camera;camera instanceof Camera?this.value=camera.pixelRatio:frame.renderer&&(this.value=frame.renderer.getPixelRatio())}),vCameraDirection=(0,three_tsl.vec3)(three_tsl.cameraViewMatrix.element((0,three_tsl.int)(0)).element((0,three_tsl.int)(2)),three_tsl.cameraViewMatrix.element((0,three_tsl.int)(1)).element((0,three_tsl.int)(2)),three_tsl.cameraViewMatrix.element((0,three_tsl.int)(2)).element((0,three_tsl.int)(2))).negate().normalize().toVarying(`v_cameraDirection`),MARK_STEP=1,ROOF_MARK=MARK_STEP*1,HIDDEN_MARK=MARK_STEP*2,vertexMark=safeFloatAttribute(`_feature_id_rsmask`,0),markConfidence=(mark,levelMark)=>(0,three_tsl.smoothstep)((0,three_tsl.float)(levelMark-MARK_STEP),(0,three_tsl.float)(levelMark),mark).mul((0,three_tsl.step)(mark,(0,three_tsl.float)(levelMark))),vRoofMark=markConfidence(vertexMark,ROOF_MARK).toVarying(`v_roofMark`),vHiddenMark=markConfidence(vertexMark,HIDDEN_MARK).toVarying(`v_hiddenMark`),progress=mrFloat(`progress`),maxDisplayBoost=mrFloat(`maxDisplayBoost`),modelAlpha=mrFloat(`modelAlpha`),pano0Matrix=mrMat4(`pano0Matrix`),pano0Zoom=mrFloat(`pano0Zoom`),pano0Histogram=mrVec4(`pano0Histogram`),pano0HdrMaxContentBoost=mrFloat(`pano0HdrMaxContentBoost`),pano0HdrMinContentBoost=mrFloat(`pano0HdrMinContentBoost`),pano0HdrCapacityMin=mrFloat(`pano0HdrCapacityMin`),pano0HdrCapacityMax=mrFloat(`pano0HdrCapacityMax`),pano0HdrGamma=mrFloat(`pano0HdrGamma`),pano0HdrOffsetSdr=mrFloat(`pano0HdrOffsetSdr`),pano0HdrOffsetHdr=mrFloat(`pano0HdrOffsetHdr`),pano0DepthMaxDepth=mrFloat(`pano0DepthMaxDepth`),pano1Matrix=mrMat4(`pano1Matrix`),pano1Zoom=mrFloat(`pano1Zoom`),pano1Histogram=mrVec4(`pano1Histogram`),pano1HdrMaxContentBoost=mrFloat(`pano1HdrMaxContentBoost`),pano1HdrMinContentBoost=mrFloat(`pano1HdrMinContentBoost`),pano1HdrCapacityMin=mrFloat(`pano1HdrCapacityMin`),pano1HdrCapacityMax=mrFloat(`pano1HdrCapacityMax`),pano1HdrGamma=mrFloat(`pano1HdrGamma`),pano1HdrOffsetSdr=mrFloat(`pano1HdrOffsetSdr`),pano1HdrOffsetHdr=mrFloat(`pano1HdrOffsetHdr`),pano1DepthMaxDepth=mrFloat(`pano1DepthMaxDepth`),panoFilterSaturationBias=mrFloat(`panoFilterSaturationBias`),panoFilterContrastBias=mrFloat(`panoFilterContrastBias`),panoFilterTemperatureBias=mrFloat(`panoFilterTemperatureBias`),panoFilterTintBias=mrFloat(`panoFilterTintBias`),refinedScreenProjectionMatrix=mrMat4(`refinedScreenProjectionMatrix`),refinedScreenMatrixInverse=mrMat4(`refinedScreenMatrixInverse`),refinedScreenOpacity=mrFloat(`refinedScreenOpacity`),refinedScreenPano=mrFloat(`refinedScreenPano`),colorAlpha=mrFloat(`colorAlpha`),brightness=mrFloat(`brightness`),floorIndex=mrFloat(`floorIndex`),shownFloorIndex=mrFloat(`shownFloorIndex`),modelBoundingMin=mrVec3(`modelBoundingMin`),modelBoundingMax=mrVec3(`modelBoundingMax`),constantColor=mrVec3(`constantColor`),pointScale=mrFloat(`pointScale`),pointMinPixel=mrFloat(`pointMinPixel`),pointMaxPixel=mrFloat(`pointMaxPixel`),colorSaturation=mrFloat(`colorSaturation`),colorBrightness=mrFloat(`colorBrightness`),isCurrentFloor=shownFloorIndex.lessThan(-.01).or((0,three_tsl.abs)(floorIndex.sub(shownFloorIndex)).lessThan(.99)).toVar(`isCurrentFloor`),isRoof=vRoofMark.greaterThan(.001).toVar(`isRoof`),isRoofCameraCut=(0,three_tsl.Fn)(()=>{let isRoofCut=(0,three_tsl.bool)().toVar(`isRoofCut`),roofCutProgress=(0,three_tsl.pow)((0,three_tsl.clamp)(vCameraDirection.y.negate(),0,1),3),roofThreshold=modelBoundingMax.y.sub(roofCutProgress.mul(modelBoundingMax.y.sub(modelBoundingMin.y)));return isRoofCut.assign(isRoof.and(three_tsl.positionWorld.y.greaterThan(roofThreshold))),isRoofCut})(),isRoofModelAlphaCut=(0,three_tsl.Fn)(()=>{let isRoofCut=(0,three_tsl.bool)().toVar(`isRoofCut`),roofCutProgress=(0,three_tsl.mix)(0,1,(0,three_tsl.pow)(modelAlpha,5)),roofThreshold=modelBoundingMax.y.sub(roofCutProgress.mul(modelBoundingMax.y.sub(modelBoundingMin.y)));return isRoofCut.assign(isRoof.and(three_tsl.positionWorld.y.greaterThan(roofThreshold))),isRoofCut})(),isHidden=vHiddenMark.greaterThan(.001).toVar(`isHidden`),isHiddenCut=(0,three_tsl.Fn)(()=>{let isHiddenCut=(0,three_tsl.bool)().toVar(`isHiddenCut`),hiddenCutProgress=(0,three_tsl.mix)(0,1,(0,three_tsl.pow)(modelAlpha,5)),hiddenThreshold=modelBoundingMax.y.sub(hiddenCutProgress.mul(modelBoundingMax.y.sub(modelBoundingMin.y)));return isHiddenCut.assign(isHidden.and(three_tsl.positionWorld.y.greaterThan(hiddenThreshold))),isHiddenCut})(),pano0Origin=pano0Matrix.mul((0,three_tsl.vec4)(0,0,0,1)).xyz.toVar(`pano0Origin`),pano0SampleDirection=sampleDirection(pano0Matrix,pano0Zoom,vCameraDirection,three_tsl.positionWorld).toVar(`pano0SampleDirection`),pano1Origin=pano1Matrix.mul((0,three_tsl.vec4)(0,0,0,1)).xyz.toVar(`pano1Origin`),pano1SampleDirection=sampleDirection(pano1Matrix,pano1Zoom,vCameraDirection,three_tsl.positionWorld).toVar(`pano1SampleDirection`),pano0SdrColor=mrCubeTexture(`pano0Map`,pano0SampleDirection).rgb.toVar(`pano0SdrColor`),pano1SdrColor=mrCubeTexture(`pano1Map`,pano1SampleDirection).rgb.toVar(`pano1SdrColor`),pano0GainColor=mrCubeTexture(`pano0Gainmap`,pano0SampleDirection).rgb.toVar(`pano0GainColor`),pano1GainColor=mrCubeTexture(`pano1Gainmap`,pano1SampleDirection).rgb.toVar(`pano1GainColor`),pano0HdrColor=(0,three_tsl.Fn)(()=>{let pano0HdrColor=(0,three_tsl.vec3)().toVar(`pano0HdrColor`),pano0HdrBoost=hdrBoost(pano0GainColor,maxDisplayBoost,pano0HdrMaxContentBoost,pano0HdrMinContentBoost,pano0HdrCapacityMin,pano0HdrCapacityMax,pano0HdrGamma);return pano0HdrColor.assign(hdrOffset(pano0SdrColor,pano0HdrBoost,pano0HdrOffsetSdr,pano0HdrOffsetHdr)),pano0HdrColor})(),pano1HdrColor=(0,three_tsl.Fn)(()=>{let pano1HdrColor=(0,three_tsl.vec3)().toVar(`pano1HdrColor`),pano1HdrBoost=hdrBoost(pano1GainColor,maxDisplayBoost,pano1HdrMaxContentBoost,pano1HdrMinContentBoost,pano1HdrCapacityMin,pano1HdrCapacityMax,pano1HdrGamma);return pano1HdrColor.assign(hdrOffset(pano1SdrColor,pano1HdrBoost,pano1HdrOffsetSdr,pano1HdrOffsetHdr)),pano1HdrColor})(),refinedScreenColor=(0,three_tsl.Fn)(()=>{let refinedScreenColor=(0,three_tsl.vec4)().toVar(`refinedScreenColor`),cameraPosition=refinedScreenMatrixInverse.mul((0,three_tsl.vec4)(three_tsl.positionWorld,1)).toVar(),zoom=(0,three_tsl.mix)(pano0Zoom,pano1Zoom,refinedScreenPano),cameraVertex=zoomVector((0,three_tsl.vec3)(0,0,1),(0,three_tsl.normalize)(cameraPosition.xyz),zoom),position=refinedScreenProjectionMatrix.mul((0,three_tsl.vec4)(cameraVertex,1)).toVar();position.divAssign(position.w);let uv=(0,three_tsl.vec3)(position.x,position.y.negate(),0).add(1).div(2);refinedScreenColor.assign(mrTexture(`refinedScreenMap`,uv.xy)),refinedScreenColor.a.mulAssign(refinedScreenOpacity);let overflow=(0,three_tsl.step)((0,three_tsl.abs)(position.x),1).mul((0,three_tsl.step)((0,three_tsl.abs)(position.y),1)).mul((0,three_tsl.step)(cameraPosition.z,0));return refinedScreenColor.assign((0,three_tsl.mix)(TRANSPARENT,refinedScreenColor,overflow)),refinedScreenColor})(),refinedScreenPano0Color=(0,three_tsl.mix)(refinedScreenColor,TRANSPARENT,refinedScreenPano).toVar(`refinedScreenPano0Color`),refinedScreenPano1Color=(0,three_tsl.mix)(refinedScreenColor,TRANSPARENT,(0,three_tsl.float)(1).sub(refinedScreenPano)).toVar(`refinedScreenPano1Color`),panoDepthTrustRange=.03,pano0DepthTrust=(0,three_tsl.Fn)(()=>{let pano0DepthTrust=(0,three_tsl.float)().toVar(`pano0DepthTrust`),pano0VertexDepth=(0,three_tsl.clamp)((0,three_tsl.length)(three_tsl.positionWorld.sub(pano0Origin)),0,(0,three_tsl.float)(pano0DepthMaxDepth)).toVar(),pano0Delta=(0,three_tsl.abs)(unpackRGBAToDepth((0,three_tsl.vec4)(mrCubeTexture(`pano0DepthMap`,pano0SampleDirection))).mul(pano0DepthMaxDepth).sub(pano0VertexDepth)),pano0MaxDelta=(0,three_tsl.float)(panoDepthTrustRange).mul(pano0VertexDepth);return pano0DepthTrust.assign((0,three_tsl.step)(pano0MaxDelta,pano0Delta)),pano0DepthTrust})(),pano1DepthTrust=(0,three_tsl.Fn)(()=>{let pano1DepthTrust=(0,three_tsl.float)().toVar(`pano1DepthTrust`),pano1VertexDepth=(0,three_tsl.clamp)((0,three_tsl.length)(three_tsl.positionWorld.sub(pano1Origin)),0,(0,three_tsl.float)(pano1DepthMaxDepth)).toVar(),pano1Delta=(0,three_tsl.abs)(unpackRGBAToDepth((0,three_tsl.vec4)(mrCubeTexture(`pano1DepthMap`,pano1SampleDirection))).mul(pano1DepthMaxDepth).sub(pano1VertexDepth)),pano1MaxDelta=(0,three_tsl.float)(panoDepthTrustRange).mul(pano1VertexDepth);return pano1DepthTrust.assign((0,three_tsl.step)(pano1MaxDelta,pano1Delta)),pano1DepthTrust})(),gradientColor=(0,three_tsl.Fn)(()=>{let gradientColor=(0,three_tsl.vec3)().toVar(`gradientColor`),uv=(0,three_tsl.float)(three_tsl.positionWorld.y.sub(modelBoundingMin.y)).div(modelBoundingMax.y.sub(modelBoundingMin.y));return gradientColor.assign(mrTexture(`gradientTexture`,(0,three_tsl.vec2)(uv,.5)).rgb),gradientColor})(),floorOpacity$1=(0,three_tsl.mix)((0,three_tsl.clamp)((0,three_tsl.float)(.2).mul((0,three_tsl.min)((0,three_tsl.float)(1).add(vCameraDirection.y),1)),0,1),(0,three_tsl.float)(1),(0,three_tsl.float)(isCurrentFloor)).toVar(`floorOpacity`),pano0Color=(0,three_tsl.property)(`vec3`).toVar(`pano0Color`),pano1Color=(0,three_tsl.property)(`vec3`).toVar(`pano1Color`),filterColorTemperature=(0,three_tsl.Fn)(([color_immutable,temperatureBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),tb=(0,three_tsl.clamp)(temperatureBias,-100,100);return color.r.assign(color.r.mul((0,three_tsl.float)(1).add(tb.div(300)))),color.b.assign(color.b.mul((0,three_tsl.float)(1).sub(tb.div(300)))),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterColorTemperature`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`temperatureBias`,type:`float`}]}),filterColorTint=(0,three_tsl.Fn)(([color_immutable,tintBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),tb=(0,three_tsl.clamp)(tintBias,-100,100),scaleR=(0,three_tsl.float)(1).add(tb.mul(-.5).div(200).mul((0,three_tsl.step)(tb,0))),scaleG=(0,three_tsl.float)(1).sub((0,three_tsl.mix)(tb.mul(.5).div(200),tb.div(200),(0,three_tsl.step)((0,three_tsl.float)(0),tb))),scaleB=(0,three_tsl.float)(1).add(tb.mul(-.5).div(200).mul((0,three_tsl.step)(tb,0)));return color.r.assign(color.r.mul(scaleR)),color.g.assign(color.g.mul(scaleG)),color.b.assign(color.b.mul(scaleB)),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterColorTint`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`tintBias`,type:`float`}]}),filterContrast=(0,three_tsl.Fn)(([color_immutable,histogram,contrastBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),meanVal=histogram.y,minVal=histogram.z,maxVal=histogram.w,cb=(0,three_tsl.clamp)(contrastBias,-1,1).toVar(),usedBias=cb.add(1).toVar(),biasSquarehalf=cb.mul(cb).div(2).toVar(),slopelow=usedBias.sub(1).div(meanVal).toVar(),slopehigh=(0,three_tsl.float)(1).sub(usedBias).div((0,three_tsl.float)(1).sub(meanVal)).toVar(),bias=usedBias.sub(meanVal).div((0,three_tsl.float)(1).sub(meanVal)).toVar(),scaleFactor=(0,three_tsl.float)(1).div(maxVal.sub(minVal)).toVar(),val=color.toVar(),maxv=(0,three_tsl.max)((0,three_tsl.max)(color.r,color.g),color.b).toVar();val.assign((0,three_tsl.mix)(val,val.mul((0,three_tsl.float)(1).sub(biasSquarehalf)).add(maxv.mul(biasSquarehalf)),(0,three_tsl.step)(cb,0)));let remapR=(0,three_tsl.mix)(slopehigh.mul(val.r).add(bias),slopelow.mul(val.r).add(1),(0,three_tsl.step)(val.r,meanVal)),remapG=(0,three_tsl.mix)(slopehigh.mul(val.g).add(bias),slopelow.mul(val.g).add(1),(0,three_tsl.step)(val.g,meanVal)),remapB=(0,three_tsl.mix)(slopehigh.mul(val.b).add(bias),slopelow.mul(val.b).add(1),(0,three_tsl.step)(val.b,meanVal));return color.assign(val.sub(meanVal).mul((0,three_tsl.vec3)(remapR,remapG,remapB).mul(scaleFactor)).add(meanVal)),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterContrast`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`histogram`,type:`vec4`},{name:`contrastBias`,type:`float`}]}),filterSaturation=(0,three_tsl.Fn)(([color_immutable,saturationBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),satScale=(0,three_tsl.float)(1).add(saturationBias),luminance=(0,three_tsl.float)(.299).mul(color.r).add((0,three_tsl.float)(.587).mul(color.g)).add((0,three_tsl.float)(.114).mul(color.b));return color.assign(color.sub(luminance).mul(satScale).add(luminance)),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterSaturation`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`saturationBias`,type:`float`}]});function colorFilter(saturationBias,contrastBias,temperatureBias,tintBias,lutSampler){return(0,three_tsl.Fn)(([color_immutable,histogram])=>{let rgb=(0,three_tsl.vec3)(color_immutable).toVar(),hsv=rgb2hsv(rgb).toVar();return hsv.z.assign((0,three_tsl.vec4)(lutSampler((0,three_tsl.vec2)(hsv.z,0))).r),rgb.assign(hsv2rgb(hsv)),rgb.assign((0,three_tsl.clamp)(rgb,0,1)),rgb.assign(filterColorTemperature(rgb,temperatureBias)),rgb.assign(filterColorTint(rgb,tintBias)),rgb.assign(filterContrast(rgb,histogram,contrastBias)),rgb.assign(filterSaturation(rgb,saturationBias)),rgb})}function panoTransition(options){return(0,three_tsl.Fn)(([pano0Color,pano1Color,progress])=>{let panoColor=(0,three_tsl.vec3)().toVar();if(options.transition===`BLACK`){let BLACK=(0,three_tsl.vec4)(.086,.106,.149,1),bp=(0,three_tsl.acos)((0,three_tsl.float)(-2).mul(progress).add(1)).toVar();panoColor.assign((0,three_tsl.mix)(pano0Color,BLACK,(0,three_tsl.min)((0,three_tsl.float)(1),bp))),panoColor.assign((0,three_tsl.mix)(panoColor,pano1Color,(0,three_tsl.max)((0,three_tsl.float)(0),bp.sub(Math.PI).add(1))))}else if(options.transition===`SPREAD`){let center=resolution.mul(pixelRatio).div(2).toVar(),radius=(0,three_tsl.length)(center).mul(1.2),tp=(0,three_tsl.distance)(three_tsl.screenCoordinate.xy,center).div(radius);panoColor.assign((0,three_tsl.mix)(pano0Color,pano1Color,(0,three_tsl.smoothstep)(0,.2,progress.sub(tp))))}else panoColor.assign((0,three_tsl.mix)(pano0Color,pano1Color,progress));return panoColor})}function panoColor(options){return(0,three_tsl.Fn)(([standardOutput])=>{if(options.usePano0HDR?pano0Color.assign(pano0HdrColor):pano0Color.assign(pano0SdrColor),options.usePano1HDR?pano1Color.assign(pano1HdrColor):pano1Color.assign(pano1SdrColor),options.useRefinedScreen&&(pano0Color.assign((0,three_tsl.mix)(pano0Color,refinedScreenPano0Color.rgb,refinedScreenPano0Color.a)),pano1Color.assign((0,three_tsl.mix)(pano1Color,refinedScreenPano1Color.rgb,refinedScreenPano1Color.a))),options.usePanoFilter){let filterFn=colorFilter(panoFilterSaturationBias,panoFilterContrastBias,panoFilterTemperatureBias,panoFilterTintBias,uv=>mrTexture(`panoFilterLutMap`,uv));options.usePano0HDR||pano0Color.assign(filterFn(pano0Color,pano0Histogram)),options.usePano1HDR||pano1Color.assign(filterFn(pano1Color,pano1Histogram))}if(options.usePano0Depth||options.usePano1Depth){let depthFallback=(0,three_tsl.vec4)(standardOutput).toVar(`depthFallback`),pano0Visible=(0,three_tsl.clamp)(progress.mul(10),0,1),pano1Visible=(0,three_tsl.clamp)((0,three_tsl.float)(1).sub(progress).mul(10),0,1);options.usePano0Depth&&pano0Color.assign((0,three_tsl.mix)(pano0Color,(0,three_tsl.mix)(pano0Color,depthFallback,pano0Visible),pano0DepthTrust)),options.usePano1Depth&&pano1Color.assign((0,three_tsl.mix)(pano1Color,(0,three_tsl.mix)(pano1Color,depthFallback,pano1Visible),pano1DepthTrust))}let panoColor=(0,three_tsl.vec3)(0).toVar(`panoColor`),transitionFn=panoTransition(options);return panoColor.assign(transitionFn(pano0Color,pano1Color,progress)),panoColor})}function setupMeshOutput(material,builder,materialType){let usePano=material.pano0Map!=null&&material.pano1Map!=null,useVertexMarkRoof=material.useVertexMarkRoof,useVertexMarkHidden=material.useVertexMarkHidden,roofStyle=material.roofStyle,useFloorStyleVisibility=material.floorStyle===`VISIBILITY`,useGradientTexture=material.gradientTexture!=null,useRefinedScreen=material.refinedScreenMap!=null,usePanoFilter=material.panoFilterLutMap!=null,usePano0HDR=material.useHDR===!0&&material.pano0Gainmap!=null,usePano1HDR=material.useHDR===!0&&material.pano1Gainmap!=null,colorMode=material.colorStyle,transition=material.transition,customNodes=getActiveCustomNodes(material.customNodes,materialType),customContext=createCustomNodeContext({pano0HDR:usePano0HDR,pano1HDR:usePano1HDR,pano0Depth:!1,pano1Depth:!1});material.outputNode=(0,three_tsl.Fn)(()=>{useFloorStyleVisibility&&isCurrentFloor.not().discard(),useVertexMarkHidden&&isHiddenCut.discard(),useVertexMarkRoof&&(roofStyle===`HIDE`?isRoofModelAlphaCut.discard():isRoofCameraCut.discard());for(let cn of customNodes)cn.slots.discard&&cn.slots.discard(customContext).discard();let result=(0,three_tsl.vec4)(0).toVar(`result`);result.assign(three_tsl.output),colorMode===`ALTITUDE`&&useGradientTexture?result.rgb.assign(gradientColor):colorMode===`CONSTANT`&&result.rgb.assign(constantColor);for(let cn of customNodes)cn.slots.modelColor&&result.rgb.assign(cn.slots.modelColor(result.rgb,customContext));if(result.a.mulAssign(floorOpacity$1.mul(colorAlpha)),usePano){let panoResult=panoColor({transition,usePanoFilter,useRefinedScreen,usePano0HDR,usePano1HDR,usePano0Depth:!1,usePano1Depth:!1})(three_tsl.output);for(let cn of customNodes)cn.slots.panoColor&&(panoResult=cn.slots.panoColor(panoResult,customContext));result.assign((0,three_tsl.mix)((0,three_tsl.vec4)(panoResult,1),result,modelAlpha))}let finalResult=result;for(let cn of customNodes)cn.slots.outputColor&&(finalResult=cn.slots.outputColor(finalResult,customContext));return finalResult})()}function setupMeshVertex(material,materialType,baseVertex){let customNodes=getActiveCustomNodes(material.customNodes,materialType).filter(cn=>cn.slots.vertexPosition!=null);if(customNodes.length===0)return baseVertex;let customContext=createCustomNodeContext(),customPosition=three_tsl.positionWorld;for(let cn of customNodes)customPosition=cn.slots.vertexPosition(customPosition,customContext);return three_tsl.positionLocal.assign(three_tsl.modelWorldMatrixInverse.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))).xyz),three_tsl.cameraProjectionMatrix.mul(three_tsl.cameraViewMatrix.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))))}function setupMeshPanoOnlyOutput(material,builder,materialType){let usePano=material.pano0Map!=null&&material.pano1Map!=null,useRefinedScreen=material.refinedScreenMap!=null,usePanoFilter=material.panoFilterLutMap!=null,usePano0HDR=material.useHDR===!0&&material.pano0Gainmap!=null,usePano1HDR=material.useHDR===!0&&material.pano1Gainmap!=null,transition=material.transition,customNodes=getActiveCustomNodes(material.customNodes,materialType),customContext=createCustomNodeContext({pano0HDR:usePano0HDR,pano1HDR:usePano1HDR,pano0Depth:!1,pano1Depth:!1});material.outputNode=(0,three_tsl.Fn)(()=>{for(let cn of customNodes)cn.slots.discard&&cn.slots.discard(customContext).discard();let result=(0,three_tsl.vec4)(0).toVar(`result`);if(usePano){let panoResult=panoColor({transition,usePanoFilter,useRefinedScreen,usePano0HDR,usePano1HDR,usePano0Depth:!1,usePano1Depth:!1})(three_tsl.output);for(let cn of customNodes)cn.slots.panoColor&&(panoResult=cn.slots.panoColor(panoResult,customContext));result.rgb.assign(panoResult)}result.a.assign((0,three_tsl.float)(1).sub((0,three_tsl.clamp)(modelAlpha.mul(30),0,1)));let finalResult=result;for(let cn of customNodes)cn.slots.outputColor&&(finalResult=cn.slots.outputColor(finalResult,customContext));return finalResult})()}function setupPointCloudVertex(material,builder){material.positionNode=(0,three_tsl.attribute)(`instancePosition`,`vec3`);let b=builder;b.addStack(),material.setupPosition(builder),b.context.position=b.removeStack();let customNodes=getActiveCustomNodes(material.customNodes,`pointcloud`).filter(cn=>cn.slots.vertexPosition!=null),worldPosition=three_tsl.positionWorld,viewPos=three_tsl.positionView;if(customNodes.length>0){let customContext=createCustomNodeContext(),customPosition=worldPosition;for(let cn of customNodes)customPosition=cn.slots.vertexPosition(customPosition,customContext);worldPosition=customPosition,three_tsl.positionLocal.assign(three_tsl.modelWorldMatrixInverse.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))).xyz),viewPos=three_tsl.cameraViewMatrix.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))).xyz}let viewZ=viewPos.z.negate(),projY11=three_tsl.cameraProjectionMatrix.element((0,three_tsl.int)(1)).element((0,three_tsl.int)(1)),proj23=three_tsl.cameraProjectionMatrix.element((0,three_tsl.int)(2)).element((0,three_tsl.int)(3)),negProj23=(0,three_tsl.float)(0).sub(proj23),distFactor=(0,three_tsl.mix)((0,three_tsl.float)(1),viewZ,negProj23),pointPixelSize;if(material.pointSize===`ATTENUATION`){let height=(0,three_tsl.float)(1).div(projY11).mul(distFactor).mul(2);pointPixelSize=resolution.y.mul(pointScale).mul(pixelRatio).div(height)}else pointPixelSize=pointScale.mul(pixelRatio);pointPixelSize=(0,three_tsl.clamp)(pointPixelSize,pointMinPixel.mul(pixelRatio),pointMaxPixel.mul(pixelRatio));let maxPxRef=pointMaxPixel.mul(pixelRatio);if(pointPixelSize=(0,three_tsl.max)(pointPixelSize,(0,three_tsl.min)((0,three_tsl.float)(1),maxPxRef)),pointPixelSize=(0,three_tsl.min)(pointPixelSize,maxPxRef),material.pointBack===`HIDDEN`&&!material.flatShading){let instNormal=(0,three_tsl.attribute)(`instanceNormal`,`vec3`),worldNormal=(0,three_tsl.normalize)(three_tsl.modelWorldMatrix.mul((0,three_tsl.vec4)(instNormal,0)).xyz),facing=(0,three_tsl.dot)((0,three_tsl.normalize)(three_tsl.cameraPosition.sub(worldPosition)),worldNormal);pointPixelSize=(0,three_tsl.mix)((0,three_tsl.float)(0),pointPixelSize,(0,three_tsl.float)(facing.greaterThan(0)))}(0,three_tsl.varyingProperty)(`float`,`v_pointSize`).assign(pointPixelSize);let resDpr=resolution.y.mul(pixelRatio),pointViewSize=pointPixelSize.mul((0,three_tsl.float)(2)).mul(distFactor).div(projY11.mul(resDpr)),quadOffset=three_tsl.positionGeometry.xy,offsetView=(0,three_tsl.vec3)(quadOffset.x.mul(pointViewSize),quadOffset.y.mul(pointViewSize),(0,three_tsl.float)(0));return three_tsl.cameraProjectionMatrix.mul((0,three_tsl.vec4)(viewPos.add(offsetView),(0,three_tsl.float)(1)))}function setupPointCloudOutput(material,builder){let useGradientTexture=material.gradientTexture!=null,colorMode=material.colorStyle,pointBack=material.pointBack,pointShape=material.pointShape,flatShading=material.flatShading,customNodes=getActiveCustomNodes(material.customNodes,`pointcloud`),customContext=createCustomNodeContext();material.colorNode=(0,three_tsl.Fn)(()=>{let baseColor;baseColor=colorMode===`ALTITUDE`&&useGradientTexture?gradientColor:colorMode===`CONSTANT`?constantColor:(0,three_tsl.colorSpaceToWorking)((0,three_tsl.attribute)(`instanceColor`,`vec3`),three_webgpu.SRGBColorSpace),pointBack===`DARK`&&!flatShading&&(baseColor=(0,three_tsl.Fn)(([color_immutable])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),instNormal=(0,three_tsl.attribute)(`instanceNormal`,`vec3`),worldNormal=(0,three_tsl.normalize)(three_tsl.modelWorldMatrix.mul((0,three_tsl.vec4)(instNormal,0)).xyz),facing=(0,three_tsl.dot)((0,three_tsl.normalize)(three_tsl.cameraPosition.sub(three_tsl.positionWorld)),worldNormal);return color.assign((0,three_tsl.mix)(color.mul(.8),color,(0,three_tsl.float)(facing.greaterThan(0)))),color})(baseColor)),baseColor=(0,three_tsl.Fn)(([color_immutable])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),hsvColor=rgb2hsv(color).toVar();return hsvColor.y.assign(hsvColor.y.add(colorSaturation)),hsvColor.z.assign(hsvColor.z.add(colorBrightness)),color.assign((0,three_tsl.max)(hsv2rgb(hsvColor),(0,three_tsl.float)(0))),color})(baseColor);for(let cn of customNodes)cn.slots.modelColor&&(baseColor=cn.slots.modelColor(baseColor,customContext));return baseColor})(),material.outputNode=(0,three_tsl.Fn)(([standardOutput])=>{let vPointSize=(0,three_tsl.varyingProperty)(`float`,`v_pointSize`);if((0,three_tsl.Discard)(vPointSize.lessThan(.001)),pointShape===`CIRCLE`){let quadPos=three_tsl.positionGeometry.xy,dist=(0,three_tsl.length)(quadPos);(0,three_tsl.Discard)(vPointSize.greaterThan((0,three_tsl.float)(3)).and(dist.greaterThan(.5)))}for(let cn of customNodes)cn.slots.discard&&cn.slots.discard(customContext).discard();let result=(0,three_tsl.vec4)(standardOutput).toVar(`result`);result.a.assign(floorOpacity$1.mul(modelAlpha));let finalResult=result;for(let cn of customNodes)cn.slots.outputColor&&(finalResult=cn.slots.outputColor(finalResult,customContext));return finalResult})(three_tsl.output)}function getActiveCustomNodes(customNodes,materialType){return!customNodes||customNodes.length===0?[]:customNodes.filter(cn=>cn.appliesTo(materialType))}function createCustomNodeContext(panoState){return{positionWorld:three_tsl.positionWorld,positionView:three_tsl.positionView,cameraDirection:vCameraDirection,resolution,pixelRatio,progress,maxDisplayBoost,modelAlpha,colorAlpha,brightness,colorSaturation,colorBrightness,constantColor,floorIndex,shownFloorIndex,isCurrentFloor,floorOpacity:floorOpacity$1,isRoof,isRoofCameraCut,isRoofModelAlphaCut,isHidden,isHiddenCut,modelBoundingMin,modelBoundingMax,pano0:{origin:pano0Origin,sampleDirection:pano0SampleDirection,sdrColor:pano0SdrColor,hdrColor:(panoState==null?void 0:panoState.pano0HDR)===!0?pano0HdrColor:pano0SdrColor,depthTrust:(panoState==null?void 0:panoState.pano0Depth)===!0?pano0DepthTrust:(0,three_tsl.float)(0)},pano1:{origin:pano1Origin,sampleDirection:pano1SampleDirection,sdrColor:pano1SdrColor,hdrColor:(panoState==null?void 0:panoState.pano1HDR)===!0?pano1HdrColor:pano1SdrColor,depthTrust:(panoState==null?void 0:panoState.pano1Depth)===!0?pano1DepthTrust:(0,three_tsl.float)(0)},pointScale,pointMinPixel,pointMaxPixel}}var _defaultValues$4=new require_pbmMeshMaterial.t,PBMMeshBasicNodeMaterial=class extends three_webgpu.MeshBasicNodeMaterial{static get type(){return`PBMMeshBasicNodeMaterial`}constructor(parameters){super(parameters),this.isPBMMeshBasicNodeMaterial=!0,this.setDefaultValues(_defaultValues$4),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.colorStyle,this.floorStyle,this.roofStyle,this.useVertexMarkRoof,this.useVertexMarkHidden,this.transition,!!this.pano0Map,!!this.gradientTexture,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`basic`,baseVertex)}setup(builder){setupMeshOutput(this,builder,`basic`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues$3=new require_pbmMeshMaterial.r,PBMMeshPhongNodeMaterial=class extends three_webgpu.MeshPhongNodeMaterial{static get type(){return`PBMMeshPhongNodeMaterial`}constructor(parameters){super(parameters),this.isPBMMeshPhongNodeMaterial=!0,this.setDefaultValues(_defaultValues$3),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.colorStyle,this.floorStyle,this.roofStyle,this.useVertexMarkRoof,this.useVertexMarkHidden,this.transition,!!this.pano0Map,!!this.gradientTexture,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`phong`,baseVertex)}setup(builder){setupMeshOutput(this,builder,`phong`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues$2=new require_pbmMeshMaterial.i,PBMMeshPhysicalNodeMaterial=class extends three_webgpu.MeshPhysicalNodeMaterial{static get type(){return`PBMMeshPhysicalNodeMaterial`}constructor(parameters){super(parameters),this.isPBMMeshPhysicalNodeMaterial=!0,this.setDefaultValues(_defaultValues$2),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.colorStyle,this.floorStyle,this.roofStyle,this.useVertexMarkRoof,this.useVertexMarkHidden,this.transition,!!this.pano0Map,!!this.gradientTexture,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`standard`,baseVertex)}setup(builder){setupMeshOutput(this,builder,`standard`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues$1=new require_pbmMeshMaterial.n,PBMMeshPanoOnlyNodeMaterial=class extends three_webgpu.MeshBasicNodeMaterial{static get type(){return`PBMPanoOnlyNodeMaterial`}constructor(parameters){super(parameters),this.isPBMPanoOnlyNodeMaterial=!0,this.setDefaultValues(_defaultValues$1),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.transition,!!this.pano0Map,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`panoOnly`,baseVertex)}setup(builder){setupMeshPanoOnlyOutput(this,builder,`panoOnly`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues=new require_memoryUsage.v,PBMPointCloudNodeMaterial=class extends three_webgpu.NodeMaterial{static get type(){return`PBMPointCloudNodeMaterial`}constructor(){super(),this.isPBMPointCloudNodeMaterial=!0,this.setDefaultValues(_defaultValues),this.lights=!1,this.side=three_webgpu.DoubleSide}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.pointSize,this.pointShape,this.pointBack,this.colorStyle,this.floorStyle,this.flatShading,!!this.gradientTexture,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){return setupPointCloudVertex(this,builder)}setup(builder){setupPointCloudOutput(this,builder),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}};function registerPBMMaterials(renderer){renderer.library.addMaterial(PBMMeshBasicNodeMaterial,`PBMMeshBasicMaterial`),renderer.library.addMaterial(PBMMeshPhongNodeMaterial,`PBMMeshPhongMaterial`),renderer.library.addMaterial(PBMMeshPhysicalNodeMaterial,`PBMMeshPhysicalMaterial`),renderer.library.addMaterial(PBMMeshPanoOnlyNodeMaterial,`PBMPanoOnlyMaterial`),renderer.library.addMaterial(PBMPointCloudNodeMaterial,`PBMPointCloudMaterial`)}var VolumePlaneIntersect;(function(VolumePlaneIntersect){VolumePlaneIntersect[VolumePlaneIntersect.Outside=-1]=`Outside`,VolumePlaneIntersect[VolumePlaneIntersect.Intersecting=0]=`Intersecting`,VolumePlaneIntersect[VolumePlaneIntersect.Inside=1]=`Inside`})(VolumePlaneIntersect||(VolumePlaneIntersect={}));var EPSILON$2=1e-6,identityMatrix4$1=new three_webgpu.Matrix4().identity(),scratchVector=new three_webgpu.Vector3,scratchMatrix4$6=new three_webgpu.Matrix4,scratchXAxis=new three_webgpu.Vector3,scratchYAxis=new three_webgpu.Vector3,scratchZAxis=new three_webgpu.Vector3,scratchSize=new three_webgpu.Vector3,scratchBox3$2=new three_webgpu.Box3,scratchSphere$2=new three_webgpu.Sphere,scratchMatrix4Inverse$1=new three_webgpu.Matrix4,scratchRay$1=new three_webgpu.Ray,scratchObject3D=new three_webgpu.Object3D,scratchFrustum=new three_webgpu.Frustum;function quaternionFromMatrix3(matrix3,quaternion){let m=matrix3.elements;return quaternion.setFromRotationMatrix(scratchMatrix4$6.set(m[0],m[3],m[6],0,m[1],m[4],m[7],0,m[2],m[5],m[8],0,0,0,0,1)),quaternion}var CullingVolume=class CullingVolume{static get MASK_OUTSIDE(){return 4294967295}static get MASK_INSIDE(){return 0}static get MASK_INDETERMINATE(){return 2147483647}constructor(planes=[]){this.planes=planes}setFromFrustum(frustum){return this.planes=frustum.planes.map(plane=>plane.clone()),this}setFromCamera(camera){return scratchMatrix4$6.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),scratchFrustum.setFromProjectionMatrix(scratchMatrix4$6),this.setFromFrustum(scratchFrustum),this}applyMatrix4(matrix){for(let plane of this.planes)plane.applyMatrix4(matrix)}copy(cullingVolume){return this.planes=cullingVolume.planes.map(plane=>plane.clone()),this}clone(){return new CullingVolume().copy(this)}computeVisibility(boundingVolume){let intersect=VolumePlaneIntersect.Inside;for(let plane of this.planes)switch(boundingVolume.intersectPlane(plane)){case VolumePlaneIntersect.Outside:return VolumePlaneIntersect.Outside;case VolumePlaneIntersect.Intersecting:intersect=VolumePlaneIntersect.Intersecting;break;default:}return intersect}computeVisibilityWithPlaneMask(boundingVolume,parentPlaneMask){if(parentPlaneMask===CullingVolume.MASK_OUTSIDE||parentPlaneMask===CullingVolume.MASK_INSIDE)return parentPlaneMask;let mask=CullingVolume.MASK_INSIDE,length=Math.min(32,this.planes.length);for(let i=0;i<length;++i){let flag=1<<i;if((parentPlaneMask&flag)===0)continue;let plane=this.planes[i],result=boundingVolume.intersectPlane(plane);if(result===VolumePlaneIntersect.Outside)return CullingVolume.MASK_OUTSIDE;result===VolumePlaneIntersect.Intersecting&&(mask|=flag)}return mask}},BoxBoundingVolume=class BoxBoundingVolume{constructor(){this.type=`box`,this.center=new three_webgpu.Vector3,this.halfSize=new three_webgpu.Vector3,this.rotation=new three_webgpu.Matrix3}fromJson({box}){this.center.set(box[0],box[1],box[2]);let xAxisX=box[3],xAxisY=box[4],xAxisZ=box[5],yAxisX=box[6],yAxisY=box[7],yAxisZ=box[8],zAxisX=box[9],zAxisY=box[10],zAxisZ=box[11],xAxisSize=Math.max(Math.sqrt(xAxisX*xAxisX+xAxisY*xAxisY+xAxisZ*xAxisZ),.001),yAxisSize=Math.max(Math.sqrt(yAxisX*yAxisX+yAxisY*yAxisY+yAxisZ*yAxisZ),.001),zAxisSize=Math.max(Math.sqrt(zAxisX*zAxisX+zAxisY*zAxisY+zAxisZ*zAxisZ),.001);this.halfSize.set(xAxisSize,yAxisSize,zAxisSize);let sumSize=this.halfSize.toArray().reduce((sum,n)=>sum+n,0);return(isNaN(sumSize)||sumSize<=0)&&this.halfSize.setScalar(EPSILON$2),this.rotation.fromArray([xAxisX/xAxisSize,xAxisY/xAxisSize,xAxisZ/xAxisSize,yAxisX/yAxisSize,yAxisY/yAxisSize,yAxisZ/yAxisSize,zAxisX/zAxisSize,zAxisY/zAxisSize,zAxisZ/zAxisSize]),isNaN(this.rotation.toArray().reduce((sum,n)=>sum+n,0))&&this.rotation.identity(),this}toJson(){return this.rotation.extractBasis(scratchXAxis,scratchYAxis,scratchZAxis),{box:[...this.center.toArray(),...scratchXAxis.multiplyScalar(this.halfSize.x).toArray(),...scratchYAxis.multiplyScalar(this.halfSize.y).toArray(),...scratchZAxis.multiplyScalar(this.halfSize.z).toArray()]}}copy(boxBoundingVolume){return this.center.copy(boxBoundingVolume.center),this.halfSize.copy(boxBoundingVolume.halfSize),this.rotation.copy(boxBoundingVolume.rotation),this}clone(){return new BoxBoundingVolume().copy(this)}applyMatrix4(matrix){return matrix.equals(identityMatrix4$1)?this:(scratchObject3D.position.copy(this.center),quaternionFromMatrix3(this.rotation,scratchObject3D.quaternion),scratchObject3D.scale.copy(this.halfSize),scratchObject3D.matrix.compose(scratchObject3D.position,scratchObject3D.quaternion,scratchObject3D.scale),scratchObject3D.matrix.premultiply(matrix),scratchObject3D.matrix.decompose(scratchObject3D.position,scratchObject3D.quaternion,scratchObject3D.scale),this.center.copy(scratchObject3D.position),this.rotation.setFromMatrix4(scratchMatrix4$6.makeRotationFromQuaternion(scratchObject3D.quaternion)),this.halfSize.copy(scratchObject3D.scale),this)}getCenter(result){return result.copy(this.center)}distanceSquaredToPoint(point){let m=this.rotation.elements,offsetX=point.x-this.center.x,offsetY=point.y-this.center.y,offsetZ=point.z-this.center.z,distanceSquared=0,d;return d=offsetX*m[0]+offsetY*m[1]+offsetZ*m[2],d<0&&(d=-d),d-=this.halfSize.x,d>0&&(distanceSquared+=d*d),d=offsetX*m[3]+offsetY*m[4]+offsetZ*m[5],d<0&&(d=-d),d-=this.halfSize.y,d>0&&(distanceSquared+=d*d),d=offsetX*m[6]+offsetY*m[7]+offsetZ*m[8],d<0&&(d=-d),d-=this.halfSize.z,d>0&&(distanceSquared+=d*d),distanceSquared}distanceToPoint(point){return Math.sqrt(this.distanceSquaredToPoint(point))}distanceToPlane(plane){let point=plane.projectPoint(this.center,new three_webgpu.Vector3);return this.distanceToPoint(point)}getBoundingBox(target){return target.makeEmpty(),this.rotation.extractBasis(scratchXAxis,scratchYAxis,scratchZAxis),scratchXAxis.setLength(this.halfSize.x),scratchYAxis.setLength(this.halfSize.y),scratchZAxis.setLength(this.halfSize.z),target.expandByPoint(scratchVector.copy(this.center).add(scratchXAxis)),target.expandByPoint(scratchVector.copy(this.center).sub(scratchXAxis)),target.expandByPoint(scratchVector.copy(this.center).add(scratchYAxis)),target.expandByPoint(scratchVector.copy(this.center).sub(scratchYAxis)),target.expandByPoint(scratchVector.copy(this.center).add(scratchZAxis)),target.expandByPoint(scratchVector.copy(this.center).sub(scratchZAxis)),target}toGeometry(){let indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),positions=new Float32Array(24);scratchVector.set(this.halfSize.x,this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,0),scratchVector.set(-this.halfSize.x,this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,3),scratchVector.set(-this.halfSize.x,-this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,6),scratchVector.set(this.halfSize.x,-this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,9),scratchVector.set(this.halfSize.x,this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,12),scratchVector.set(-this.halfSize.x,this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,15),scratchVector.set(-this.halfSize.x,-this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,18),scratchVector.set(this.halfSize.x,-this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,21);let geometry=new three_webgpu.BufferGeometry;return geometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry}intersectPlane(plane){let center=this.center,normal=plane.normal,rotation=this.rotation.elements,halfSize=this.halfSize,normalX=normal.x,normalY=normal.y,normalZ=normal.z,radEffective=Math.abs(normalX*rotation[0]*halfSize.x+normalY*rotation[1]*halfSize.x+normalZ*rotation[2]*halfSize.x)+Math.abs(normalX*rotation[3]*halfSize.y+normalY*rotation[4]*halfSize.y+normalZ*rotation[5]*halfSize.y)+Math.abs(normalX*rotation[6]*halfSize.z+normalY*rotation[7]*halfSize.z+normalZ*rotation[8]*halfSize.z),distanceToPlane=normal.dot(center)+plane.constant;return distanceToPlane<=-radEffective?VolumePlaneIntersect.Outside:distanceToPlane>=radEffective?VolumePlaneIntersect.Inside:VolumePlaneIntersect.Intersecting}intersectRay(ray,threshold=0,far){if(scratchSize.copy(this.halfSize).multiplyScalar(2),scratchBox3$2.setFromCenterAndSize(scratchVector.set(0,0,0),scratchSize),scratchBox3$2.expandByScalar(threshold),this.rotation.extractBasis(scratchXAxis,scratchYAxis,scratchZAxis),scratchMatrix4$6.makeBasis(scratchXAxis,scratchYAxis,scratchZAxis),scratchMatrix4$6.setPosition(this.center),scratchMatrix4Inverse$1.copy(scratchMatrix4$6).invert(),scratchRay$1.copy(ray).applyMatrix4(scratchMatrix4Inverse$1),scratchBox3$2.containsPoint(scratchRay$1.origin))return!0;let target=scratchRay$1.intersectBox(scratchBox3$2,scratchVector);return target?far===void 0?!0:(far+=threshold,target.distanceToSquared(scratchRay$1.origin)<=far*far):!1}},SphereBoundingVolume=class SphereBoundingVolume{constructor(){this.type=`sphere`,this.center=new three_webgpu.Vector3,this.radius=-1}fromJson({sphere}){return this.center.set(sphere[0],sphere[1],sphere[2]),this.radius=Math.max(sphere[3],EPSILON$2),this}toJson(){return{sphere:[...this.center.toArray(),this.radius]}}copy(sphereBoundingVolume){return this.center.copy(sphereBoundingVolume.center),this.radius=sphereBoundingVolume.radius,this}clone(){return new SphereBoundingVolume().copy(this)}getBoundingBox(target){return target.setFromCenterAndSize(this.center,scratchSize.set(1,1,1).multiplyScalar(this.radius*2)),target}toGeometry(){let positions=new Float32Array(384);for(let i=0;i<=32;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+1]=this.center.y+Math.sin(theta)*this.radius,positions[i*6+2]=this.center.z+0,theta=(i+1)/32*Math.PI*2,positions[i*6+3]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+4]=this.center.y+Math.sin(theta)*this.radius,positions[i*6+5]=this.center.z+0}for(let i=32;i<=64;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+1]=this.center.y+0,positions[i*6+2]=this.center.z+Math.sin(theta)*this.radius,theta=(i+1)/32*Math.PI*2,positions[i*6+3]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+4]=this.center.y+0,positions[i*6+5]=this.center.z+Math.sin(theta)*this.radius}let geometry=new three_webgpu.BufferGeometry;return geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry}applyMatrix4(matrix){return matrix.equals(identityMatrix4$1)?this:(this.center.applyMatrix4(matrix),this.radius*=matrix.getMaxScaleOnAxis(),this)}getCenter(result){return result.copy(this.center)}distanceSquaredToPoint(point){let distance=this.distanceToPoint(point);return distance*distance}distanceToPoint(point){let distance=this.center.distanceTo(point)-this.radius;return distance<=0?0:distance}distanceToPlane(plane){let distance=Math.abs(plane.distanceToPoint(this.center));return Math.max(0,distance-this.radius)}intersectPlane(plane){let center=this.center,radius=this.radius,distanceToPlane=plane.normal.dot(center)+plane.constant;return distanceToPlane<-radius?VolumePlaneIntersect.Outside:distanceToPlane<radius?VolumePlaneIntersect.Intersecting:VolumePlaneIntersect.Inside}intersectRay(ray,threshold=0,far){if(scratchSphere$2.set(this.center,this.radius+threshold),scratchSphere$2.containsPoint(ray.origin))return!0;let target=ray.intersectSphere(scratchSphere$2,scratchVector);return target?far===void 0?!0:(far+=threshold,ray.origin.distanceToSquared(target)<=far*far):!1}},RegionBoundingVolume=class RegionBoundingVolume{constructor(){throw this.type=`regin`,this.west=0,this.south=0,this.east=0,this.north=0,this.minHeight=0,this.maxHeight=0,Error(`Region bounding volume not supported.`)}fromJson({region}){return this.west=region[0],this.south=region[1],this.east=region[2],this.north=region[3],this.minHeight=region[4],this.maxHeight=region[5],this}toJson(){return{region:[this.west,this.south,this.east,this.north,this.minHeight,this.maxHeight]}}copy(regionBoundingVolume){return this.west=regionBoundingVolume.west,this.south=regionBoundingVolume.south,this.east=regionBoundingVolume.east,this.north=regionBoundingVolume.north,this.minHeight=regionBoundingVolume.minHeight,this.maxHeight=regionBoundingVolume.maxHeight,this}clone(){return new RegionBoundingVolume().copy(this)}getBoundingBox(target){throw Error(`not implemented`)}toGeometry(){throw Error(`not implemented`)}applyMatrix4(matrix){throw Error(`not implemented`)}getCenter(result){throw Error(`not implemented`)}distanceToPoint(point){throw Error(`not implemented`)}distanceSquaredToPoint(point){throw Error(`not implemented`)}distanceToPlane(plane){throw Error(`not implemented`)}intersectPlane(plane){throw Error(`not implemented`)}intersectRay(ray,threshold=0,far){throw Error(`not implemented`)}};function isBoundingVolume(obj){return obj instanceof BoxBoundingVolume||obj instanceof SphereBoundingVolume||obj instanceof RegionBoundingVolume}function makeBoundingVolume(header){if(isBoundingVolume(header))return header;if(`box`in header)return new BoxBoundingVolume().fromJson(header);if(`sphere`in header)return new SphereBoundingVolume().fromJson(header);if(`region`in header)return new RegionBoundingVolume().fromJson(header);throw Error(`BoundingVolume ${JSON.stringify(header)} never suppored.`)}var debugMaterials=[4821759,8191922,16637280,16739958,5822969,376977,16747077,9259235,14514687].map(color=>new three_webgpu.LineBasicMaterial({color,depthWrite:!1,depthTest:!0,transparent:!0,opacity:.5})),debugBoxGeometry=(()=>{let indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),positions=new Float32Array(24);scratchVector.set(1,1,1).toArray(positions,0),scratchVector.set(-1,1,1).toArray(positions,3),scratchVector.set(-1,-1,1).toArray(positions,6),scratchVector.set(1,-1,1).toArray(positions,9),scratchVector.set(1,1,-1).toArray(positions,12),scratchVector.set(-1,1,-1).toArray(positions,15),scratchVector.set(-1,-1,-1).toArray(positions,18),scratchVector.set(1,-1,-1).toArray(positions,21);let geometry=new three_webgpu.BufferGeometry;return geometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry})(),debugSphereGeometry=(()=>{let positions=new Float32Array(384);for(let i=0;i<=32;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=Math.cos(theta),positions[i*6+1]=Math.sin(theta),positions[i*6+2]=0,theta=(i+1)/32*Math.PI*2,positions[i*6+3]=Math.cos(theta),positions[i*6+4]=Math.sin(theta),positions[i*6+5]=0}for(let i=32;i<=64;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=Math.cos(theta),positions[i*6+1]=0,positions[i*6+2]=Math.sin(theta),theta=(i+1)/32*Math.PI*2,positions[i*6+3]=Math.cos(theta),positions[i*6+4]=0,positions[i*6+5]=Math.sin(theta)}let geometry=new three_webgpu.BufferGeometry;return geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry})();function createDebugBoundingMesh(boundingVolume,level=0){if(boundingVolume instanceof BoxBoundingVolume){let line=new three_webgpu.LineSegments(debugBoxGeometry,debugMaterials[Math.min(level,debugMaterials.length-1)]);return line.position.copy(boundingVolume.center),quaternionFromMatrix3(boundingVolume.rotation,line.quaternion),line.scale.set(boundingVolume.halfSize.x,boundingVolume.halfSize.y,boundingVolume.halfSize.z),line.matrix.compose(line.position,line.quaternion,line.scale),line}else if(boundingVolume instanceof SphereBoundingVolume){let line=new three_webgpu.LineSegments(debugSphereGeometry,debugMaterials[Math.min(level,debugMaterials.length-1)]);return line.position.copy(boundingVolume.center),line.scale.set(boundingVolume.radius,boundingVolume.radius,boundingVolume.radius),line.matrix.compose(line.position,line.quaternion,line.scale),line}return null}var scratchVector3$9=new three_webgpu.Vector3,scratchPlane=new three_webgpu.Plane,scratchSphereBoundingVolume$1=new SphereBoundingVolume,scratchBoxBoundingVolume$1=new BoxBoundingVolume,Tile=class Tile{constructor(id,header,tileset,parent){var _a,_b,_c,_d;this.parent=null,this.contentParent=null,this.floor=0,this.id=id,this.state={visible:!1,frameNumber:0,selectedFrameNumber:0,requestedFrameNumber:0,touchedFrameNumber:0,distanceToCamera:0,centerZDepth:0,centerScreenY:0,screenSpaceError:0,visibilityPlaneMask:0,inRequestVolume:!1,shouldRefine:!1,stackLength:0,finalResolution:!0,selectionDepth:0,shouldSelect:!1,lastSelect:!1,ancestorWithContent:null,ancestorWithContentAvailable:null},this.parent=parent==null?null:parent,this.contentParent=parent?parent.hasRenderContent?parent:parent.contentParent:null,this.level=this.parent?this.parent.level+1:0,this.tileset=tileset,this.refine=(_a=header.refine)==null?this.parent?this.parent.refine:`REPLACE`:_a,this.transform=new three_webgpu.Matrix4,header.transform&&this.transform.fromArray(header.transform),this.parent&&this.transform.premultiply(this.parent.transform),typeof header.geometricError==`number`?this.geometricError=header.geometricError*this.transform.getMaxScaleOnAxis():this.geometricError=(_c=(_b=this.parent)==null?void 0:_b.geometricError)==null?0:_c,header.content&&header.content.uri?(this.content={uri:header.content.uri,loadState:`UNLOADED`,loadProgress:0,loadStateUpdateTime:require_memoryUsage.p(),loadfailRetryDelay:0,byteLength:0,memoryUsage:0},header.content.group!==void 0&&(this.content.group=header.content.group),/\.json$/.test(this.content.uri)?this.type=`TILESET`:this.type=`SCENEGRAPH`):(this.content=null,this.type=`EMPTY`),this.levelOfContent=this.parent?this.parent.levelOfContent:-1,this.type===`SCENEGRAPH`&&(this.levelOfContent+=1),header.boundingVolume&&(this.boundingVolume=makeBoundingVolume(header.boundingVolume).applyMatrix4(this.transform)),header.viewerRequestVolume&&(this.viewerRequestVolume=makeBoundingVolume(header.viewerRequestVolume).applyMatrix4(this.transform)),this.extras=(_d=header.extras)==null?{}:_d,typeof this.extras.floor!=`number`&&parent&&typeof parent.extras.floor==`number`&&(this.extras.floor=parent.extras.floor),typeof this.extras.floor==`number`&&(this.floor=this.extras.floor,this.tileset.floorLength=Math.max(this.tileset.floorLength,this.floor+1)),header.children?this.children=header.children.map((tileHeader,index)=>new Tile(`${this.id}.${index}`,tileHeader,tileset,this)):this.children=[]}traverse(callback){callback(this);for(let child of this.children)child.traverse(callback)}updateState(frameState){this.state.frameNumber=frameState.frameNumber;let transform=this.tileset.transform;if(this.boundingVolume){let boundingVolume;boundingVolume=this.boundingVolume instanceof BoxBoundingVolume?scratchBoxBoundingVolume$1.copy(this.boundingVolume):this.boundingVolume instanceof SphereBoundingVolume?scratchSphereBoundingVolume$1.copy(this.boundingVolume):this.boundingVolume.clone(),boundingVolume.applyMatrix4(transform),frameState.camera.type===`OrthographicCamera`?(scratchPlane.setFromNormalAndCoplanarPoint(frameState.camera.direction,frameState.camera.position),this.state.distanceToCamera=boundingVolume.distanceToPlane(scratchPlane)):this.state.distanceToCamera=boundingVolume.distanceToPoint(frameState.camera.position);let toCenter=boundingVolume.getCenter(scratchVector3$9).sub(frameState.camera.position);this.state.centerZDepth=frameState.camera.direction.dot(toCenter),this.state.centerScreenY=frameState.camera.up.dot(toCenter);let parentVisibilityPlaneMask=this.parent?this.parent.state.visibilityPlaneMask:CullingVolume.MASK_INDETERMINATE;this.state.visibilityPlaneMask=frameState.cullingVolume.computeVisibilityWithPlaneMask(boundingVolume,parentVisibilityPlaneMask),this.state.visible=this.state.visibilityPlaneMask!==CullingVolume.MASK_OUTSIDE,frameState.cameraCulling||(this.state.visible=!0)}else this.state.distanceToCamera=0,this.state.centerZDepth=0,this.state.visibilityPlaneMask=CullingVolume.MASK_INDETERMINATE,this.state.visible=!0;if((this.levelOfContent<=frameState.minLevelOfDetail||this.geometricError>=frameState.maxGeometricError)&&(this.state.visible=!0),this.viewerRequestVolume){let viewerRequestVolume;viewerRequestVolume=this.viewerRequestVolume instanceof BoxBoundingVolume?scratchBoxBoundingVolume$1.copy(this.viewerRequestVolume):this.viewerRequestVolume instanceof SphereBoundingVolume?scratchSphereBoundingVolume$1.copy(this.viewerRequestVolume):this.viewerRequestVolume.clone(),viewerRequestVolume.applyMatrix4(transform),this.state.inRequestVolume=viewerRequestVolume.distanceSquaredToPoint(frameState.camera.position)<=0}else this.state.inRequestVolume=!0;this.state.screenSpaceError=this.getScreenSpaceError(frameState,this.state.distanceToCamera,!1)}get selected(){return this.state.selectedFrameNumber===this.tileset.frameNumber}get hasChildren(){return this.children.length>0}get siblingIndex(){var _a,_b;return(_b=(_a=this.parent)==null?void 0:_a.children.indexOf(this))==null?0:_b}get hasTilesetContent(){return this.children.length>0&&this.type===`TILESET`}get hasRenderContent(){return this.type===`SCENEGRAPH`}get contentAvailable(){var _a;return this.hasRenderContent&&((_a=this.content)==null?void 0:_a.loadState)===`READY`}get hasUnloadedContent(){var _a;return((_a=this.content)==null?void 0:_a.loadState)===`UNLOADED`}get hasEmptyContent(){return this.type===`EMPTY`}get contentReady(){var _a;return((_a=this.content)==null?void 0:_a.loadState)===`READY`||this.hasEmptyContent}get contentByteLength(){return this.content?this.content.byteLength:0}get contentMemoryUsage(){return this.content?this.content.memoryUsage:0}getScreenSpaceError(frameState,distanceToCamera,useParentGeometricError){let scale=this.tileset.transform.getMaxScaleOnAxis(),parentGeometricError=this.parent?this.parent.geometricError:this.tileset.geometricError,geometricError=scale*(useParentGeometricError?parentGeometricError:this.geometricError);if(geometricError===0)return 0;let height=frameState.height,sseDenominator=frameState.sseDenominator;return frameState.camera.type===`OrthographicCamera`?geometricError/(1/(frameState.camera.projectionMatrix.elements[5]/2)/height*.9):geometricError/(Math.max(distanceToCamera,.001)*sseDenominator/height)}getPriority(frameState){let maySkipTile=this.refine===`ADD`||frameState.skipLevelOfDetail;if(maySkipTile&&!this.state.visible||frameState.frameNumber-this.state.touchedFrameNumber>=1)return-1;let parent=this.parent,screenSpaceError=parent&&(!maySkipTile||this.state.screenSpaceError===0)?parent.state.screenSpaceError:this.state.screenSpaceError,rootScreenSpaceError=this.tileset.root?this.tileset.root.state.screenSpaceError:0;return Math.max(rootScreenSpaceError-screenSpaceError,0)}},defaultIterator=item=>Number(item);function arrayMin(array,iterator=defaultIterator,needResult=!1){let item,result=1/0;for(let _item of array){let _result=iterator(_item);_result<=result&&(item=_item,result=_result)}return isFinite(result)||(result=0),needResult?[item,result]:item}function arrayEqual(array0,array1,equalFn=(v0,v1)=>v0===v1){let length=array0.length;if(length!==array1.length)return!1;for(let i=0;i<length;i++)if(equalFn(array0[i],array1[i])===!1)return!1;return!0}var arrayUniqueSet=new Set;function arrayUnique(array){arrayUniqueSet.clear();let result=[],length=array.length;for(let i=0;i<length;i++){let value=array[i];arrayUniqueSet.has(value)||(result.push(value),arrayUniqueSet.add(value))}return arrayUniqueSet.clear(),result}var arrayMinCallback=intersect=>intersect.distance,intersectDistanceSortCallback=(a,b)=>a.distance-b.distance;function sortIntersects(intersects,sortByDistance=!0,firstHitOnly=!1){if(firstHitOnly&&intersects.length>1){let intersect=arrayMin(intersects,arrayMinCallback);intersect?(intersects[0]=intersect,intersects.length=1):intersects.length=0}return sortByDistance&&intersects.length>1&&intersects.sort(intersectDistanceSortCallback),intersects}var BVHObject=class{constructor(position,indices){this.position=position,this.indices=indices}getPositionCount(){var _a,_b;let indices=this.indices,position=this.position;return indices?indices.array.length/((_a=indices.stride)==null?1:_a):position.array.length/((_b=position.stride)==null?3:_b)}getPositionByIndex(index,target){var _a,_b,_c,_d;let indices=this.indices,position=this.position,pIndex=index;if(indices){let array=indices.array,stride=(_a=indices.stride)==null?1:_a,offset=(_b=indices.offset)==null?0:_b;pIndex=array[index*stride+offset]}let array=position.array,stride=(_c=position.stride)==null?3:_c,offset=(_d=position.offset)==null?0:_d;return pIndex=pIndex*stride+offset,target.x=array[pIndex],target.y=array[pIndex+1],target.z=array[pIndex+2],target}createTree(maxTrianglesPerNode,maxDepth,extents){throw Error(`not implemented`)}trianglesInSphere(center,radius){throw Error(`not implemented`)}intersectRay(rayOrigin,rayDirection,threshold=0,onlyFirst=!1,filter){throw Error(`not implemented`)}},BVHNode=class{constructor(id,extents,startIndex,endIndex,deepth){this.id=id,this.extents=extents,this.startIndex=startIndex,this.endIndex=endIndex,this.deepth=deepth}};function packBVHNode(root,length){let array=new ArrayBuffer(length*36),float32Array=new Float32Array(array),uint32Array=new Uint32Array(array),uint16Array=new Uint16Array(array),stack=[root],node,offset;for(;node=stack.pop();)offset=node.id*36/4,float32Array[offset]=node.extents[0],float32Array[offset+1]=node.extents[1],float32Array[offset+2]=node.extents[2],float32Array[offset+3]=node.extents[3],float32Array[offset+4]=node.extents[4],float32Array[offset+5]=node.extents[5],uint32Array[offset+6]=node.startIndex,uint32Array[offset+7]=node.endIndex,offset=node.id*36/2,node.node0&&(uint16Array[offset+16]=node.node0.id,stack.push(node.node0)),node.node1&&(uint16Array[offset+17]=node.node1.id,stack.push(node.node1));return array}function intersectNodeBox(rayOrigin,invRayDirection,box,threshold=0){let minX=box.min.x-threshold,minY=box.min.y-threshold,minZ=box.min.z-threshold,maxX=box.max.x+threshold,maxY=box.max.y+threshold,maxZ=box.max.z+threshold,t_min=0,t_max=0,ty_min=0,ty_max=0,tz_min=0,tz_max=0;return invRayDirection.x>=0?(t_min=(minX-rayOrigin.x)*invRayDirection.x,t_max=(maxX-rayOrigin.x)*invRayDirection.x):(t_min=(maxX-rayOrigin.x)*invRayDirection.x,t_max=(minX-rayOrigin.x)*invRayDirection.x),invRayDirection.y>=0?(ty_min=(minY-rayOrigin.y)*invRayDirection.y,ty_max=(maxY-rayOrigin.y)*invRayDirection.y):(ty_min=(maxY-rayOrigin.y)*invRayDirection.y,ty_max=(minY-rayOrigin.y)*invRayDirection.y),t_min>ty_max||ty_min>t_max||((ty_min>t_min||t_min!==t_min)&&(t_min=ty_min),(ty_max<t_max||t_max!==t_max)&&(t_max=ty_max),invRayDirection.z>=0?(tz_min=(minZ-rayOrigin.z)*invRayDirection.z,tz_max=(maxZ-rayOrigin.z)*invRayDirection.z):(tz_min=(maxZ-rayOrigin.z)*invRayDirection.z,tz_max=(minZ-rayOrigin.z)*invRayDirection.z),t_min>tz_max||tz_min>t_max)||((tz_min>t_min||t_min!==t_min)&&(t_min=tz_min),(tz_max<t_max||t_max!==t_max)&&(t_max=tz_max),t_max<0)?null:t_min>=0?t_min:0}var BVHVector3=class BVHVector3{constructor(x,y,z){this.x=x,this.y=y,this.z=z}copy(v){return this.x=v.x,this.y=v.y,this.z=v.z,this}set(x,y,z){return this.x=x,this.y=y,this.z=z,this}fromArray(array,firstElementPos=0){return this.x=array[firstElementPos],this.y=array[firstElementPos+1],this.z=array[firstElementPos+2],this}toArray(array=[],offset=0){return array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array}add(v){return this.x+=v.x,this.y+=v.y,this.z+=v.z,this}multiplyScalar(scalar){return this.x*=scalar,this.y*=scalar,this.z*=scalar,this}subVectors(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this}addScaledVector(v,s){return this.x+=v.x*s,this.y+=v.y*s,this.z+=v.z*s,this}dot(v){return this.x*v.x+this.y*v.y+this.z*v.z}cross(v){let x=this.x,y=this.y,z=this.z;return this.x=y*v.z-z*v.y,this.y=z*v.x-x*v.z,this.z=x*v.y-y*v.x,this}crossVectors(a,b){let ax=a.x,ay=a.y,az=a.z,bx=b.x,by=b.y,bz=b.z;return this.x=ay*bz-az*by,this.y=az*bx-ax*bz,this.z=ax*by-ay*bx,this}distanceTo(v){return Math.sqrt(this.distanceToSquared(v))}distanceToSquared(v){let dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz}clone(){return new BVHVector3(this.x,this.y,this.z)}},BVHIntersect=class{constructor(pointA,pointB,pointC,index,intersectionPoint){this.pointA=pointA,this.pointB=pointB,this.pointC=pointC,this.index=index,this.intersectionPoint=intersectionPoint}},BVHBox3=class{constructor(min,max){this.min=min,this.max=max}},EPSILON$1=1e-6,scratchVector3$8=new BVHVector3(0,0,0),scratchVector3A=new BVHVector3(0,0,0),scratchVector3B=new BVHVector3(0,0,0),scratchVector3C=new BVHVector3(0,0,0),BVHMesh=class extends BVHObject{createTree(maxTrianglesPerNode,maxDepth,extents){maxDepth=Math.min(maxDepth,16);let triangleCount=this.getPositionCount()/3,offsetArray=triangleCount>65535?new Uint32Array(triangleCount):new Uint16Array(triangleCount),bboxArray=new Float32Array(triangleCount*6),nodesToSplit=[],nodesToSplitLength=0,idIndex=-1;if(extents)for(let i=0;i<triangleCount;i+=1){let indexOffset=i*3,bboxOffset=i*6,minX,minY,minZ,maxX,maxY,maxZ,temp;offsetArray[i]=i,this.getPositionByIndex(indexOffset,scratchVector3A),this.getPositionByIndex(indexOffset+1,scratchVector3B),this.getPositionByIndex(indexOffset+2,scratchVector3C),minX=maxX=scratchVector3A.x,temp=scratchVector3B.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),temp=scratchVector3C.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),minY=maxY=scratchVector3A.y,temp=scratchVector3B.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),temp=scratchVector3C.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),minZ=maxZ=scratchVector3A.z,temp=scratchVector3B.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),temp=scratchVector3C.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),bboxArray[bboxOffset]=minX,bboxArray[bboxOffset+1]=minY,bboxArray[bboxOffset+2]=minZ,bboxArray[bboxOffset+3]=maxX,bboxArray[bboxOffset+4]=maxY,bboxArray[bboxOffset+5]=maxZ}else{let gminX=1/0,gminY=1/0,gminZ=1/0,gmaxX=-1/0,gmaxY=-1/0,gmaxZ=-1/0;for(let i=0;i<triangleCount;i+=1){let indexOffset=i*3,bboxOffset=i*6,minX,minY,minZ,maxX,maxY,maxZ,temp;offsetArray[i]=i,this.getPositionByIndex(indexOffset,scratchVector3A),this.getPositionByIndex(indexOffset+1,scratchVector3B),this.getPositionByIndex(indexOffset+2,scratchVector3C),minX=maxX=scratchVector3A.x,temp=scratchVector3B.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),temp=scratchVector3C.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),minY=maxY=scratchVector3A.y,temp=scratchVector3B.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),temp=scratchVector3C.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),minZ=maxZ=scratchVector3A.z,temp=scratchVector3B.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),temp=scratchVector3C.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),bboxArray[bboxOffset]=minX,bboxArray[bboxOffset+1]=minY,bboxArray[bboxOffset+2]=minZ,bboxArray[bboxOffset+3]=maxX,bboxArray[bboxOffset+4]=maxY,bboxArray[bboxOffset+5]=maxZ,minX<gminX&&(gminX=minX),maxX>gmaxX&&(gmaxX=maxX),minY<gminY&&(gminY=minY),maxY>gmaxY&&(gmaxY=maxY),minZ<gminZ&&(gminZ=minZ),maxZ>gmaxZ&&(gmaxZ=maxZ)}extents=[gminX,gminY,gminZ,gmaxX,gmaxY,gmaxZ]}let rootNode=new BVHNode(++idIndex,extents,0,triangleCount,0);nodesToSplit[nodesToSplitLength++]=rootNode;let nodeSize=[],orders=[0,1,2],orderSorts=function(axis0,axis1){return nodeSize[axis1]-nodeSize[axis0]};function splitNode_(node){let startIndex=node.startIndex,endIndex=node.endIndex,extents=node.extents;nodeSize[0]=extents[3]-extents[0],nodeSize[1]=extents[4]-extents[1],nodeSize[2]=extents[5]-extents[2],orders.sort(orderSorts);for(let i=0;i<3;i++){let order=orders[i],center_x2=extents[order]+extents[order+3],headOffset=startIndex,tailOffset=endIndex-1,switcher=-1,temp;for(;headOffset<=tailOffset;)switcher===-1?(temp=offsetArray[headOffset],bboxArray[temp*6+order]+bboxArray[temp*6+order+3]<center_x2?headOffset++:switcher=temp):(temp=offsetArray[tailOffset],bboxArray[temp*6+order]+bboxArray[temp*6+order+3]>=center_x2?tailOffset--:(offsetArray[headOffset]=temp,offsetArray[tailOffset]=switcher,switcher=-1,headOffset++,tailOffset--));if(headOffset>startIndex&&headOffset<endIndex){let node0=new BVHNode(++idIndex,calcExtents(offsetArray,bboxArray,startIndex,headOffset,EPSILON$1),startIndex,headOffset,node.deepth+1);node0.deepth<maxDepth&&node0.endIndex-node0.startIndex>maxTrianglesPerNode&&(nodesToSplit[nodesToSplitLength++]=node0);let node1=new BVHNode(++idIndex,calcExtents(offsetArray,bboxArray,headOffset,endIndex,EPSILON$1),headOffset,endIndex,node.deepth+1);node1.deepth<maxDepth&&node1.endIndex-node1.startIndex>maxTrianglesPerNode&&(nodesToSplit[nodesToSplitLength++]=node1),node.node0=node0,node.node1=node1,node.startIndex=0,node.endIndex=0;break}}}for(;nodesToSplitLength;)splitNode_(nodesToSplit[--nodesToSplitLength]);return this.offsetArray=offsetArray,this.rootNodePacked=packBVHNode(rootNode,idIndex+1),nodesToSplit.length=0,this}trianglesInSphere(center,radius){let offsetArray=this.offsetArray,rootNode=this.rootNodePacked,rootNodeFloat32Array=new Float32Array(rootNode),rootNodeUint32Array=new Uint32Array(rootNode),rootNodeUint16Array=new Uint16Array(rootNode),nodeIdsToIntersect=[0],triangles=[],nodeId;for(;(nodeId=nodeIdsToIntersect.pop())!==void 0;){let offset=nodeId*36/4,vx=clamp$7(center.x,rootNodeFloat32Array[offset],rootNodeFloat32Array[offset+3])-center.x,vy=clamp$7(center.y,rootNodeFloat32Array[offset+1],rootNodeFloat32Array[offset+4])-center.y,vz=clamp$7(center.z,rootNodeFloat32Array[offset+2],rootNodeFloat32Array[offset+5])-center.z;if(vx*vx+vy*vy+vz*vz<=radius*radius){let start=rootNodeUint32Array[offset+6],end=rootNodeUint32Array[offset+7];for(let i=start;i<end;i++){let triangleIndex=offsetArray[i];triangles.push(triangleIndex)}let nodeIdOffset=nodeId*36/2,node0Id=rootNodeUint16Array[nodeIdOffset+16],node1Id=rootNodeUint16Array[nodeIdOffset+17];node0Id&&nodeIdsToIntersect.push(node0Id),node1Id&&nodeIdsToIntersect.push(node1Id)}}let triangleLength=triangles.length,triangleArray=new Float32Array(triangleLength*9);for(let i=0;i<triangleLength;i++){let indexOffset=triangles[i]*3;this.getPositionByIndex(indexOffset,scratchVector3$8),triangleArray[i*9]=scratchVector3$8.x,triangleArray[i*9+1]=scratchVector3$8.y,triangleArray[i*9+2]=scratchVector3$8.z,this.getPositionByIndex(indexOffset+1,scratchVector3$8),triangleArray[i*9+3]=scratchVector3$8.x,triangleArray[i*9+4]=scratchVector3$8.y,triangleArray[i*9+5]=scratchVector3$8.z,this.getPositionByIndex(indexOffset+2,scratchVector3$8),triangleArray[i*9+6]=scratchVector3$8.x,triangleArray[i*9+7]=scratchVector3$8.y,triangleArray[i*9+8]=scratchVector3$8.z}return triangleArray}intersectRay(rayOrigin,rayDirection,threshold=0,onlyFirst=!1,filter){let intersects=[],offsetArray=this.offsetArray,rootNode=this.rootNodePacked,rootNodeFloat32Array=new Float32Array(rootNode),rootNodeUint32Array=new Uint32Array(rootNode),rootNodeUint16Array=new Uint16Array(rootNode),invRayDirection=new BVHVector3(1/rayDirection.x,1/rayDirection.y,1/rayDirection.z),nodeIdsToIntersect=[0],nodeId,maxDistance=1/0,box=new BVHBox3(new BVHVector3(0,0,0),new BVHVector3(0,0,0)),pointA=new BVHVector3(0,0,0),pointB=new BVHVector3(0,0,0),pointC=new BVHVector3(0,0,0);for(;(nodeId=nodeIdsToIntersect.pop())!==void 0;){let offset=nodeId*36/4;box.min.x=rootNodeFloat32Array[offset],box.min.y=rootNodeFloat32Array[offset+1],box.min.z=rootNodeFloat32Array[offset+2],box.max.x=rootNodeFloat32Array[offset+3],box.max.y=rootNodeFloat32Array[offset+4],box.max.z=rootNodeFloat32Array[offset+5];let nodeBoxDistance=intersectNodeBox(rayOrigin,invRayDirection,box,threshold);if(nodeBoxDistance===null||onlyFirst&&nodeBoxDistance>maxDistance)continue;let ox=rayOrigin.x,oy=rayOrigin.y,oz=rayOrigin.z,dx=rayDirection.x,dy=rayDirection.y,dz=rayDirection.z,start=rootNodeUint32Array[offset+6],end=rootNodeUint32Array[offset+7];for(let i=start;i<end;i++){let triangleIndex=offsetArray[i],indexOffset=triangleIndex*3;this.getPositionByIndex(indexOffset,pointA);let ax=pointA.x,ay=pointA.y,az=pointA.z;this.getPositionByIndex(indexOffset+1,pointB);let bx=pointB.x,by=pointB.y,bz=pointB.z;this.getPositionByIndex(indexOffset+2,pointC);let cx=pointC.x,cy=pointC.y,cz=pointC.z,edge1X=bx-ax,edge1Y=by-ay,edge1Z=bz-az,edge2X=cx-ax,edge2Y=cy-ay,edge2Z=cz-az,normalX=edge1Y*edge2Z-edge1Z*edge2Y,normalY=edge1Z*edge2X-edge1X*edge2Z,normalZ=edge1X*edge2Y-edge1Y*edge2X,DdN=dx*normalX+dy*normalY+dz*normalZ,sign;if(DdN>0)sign=1;else if(DdN<0)sign=-1,DdN=-DdN;else continue;let diffX=ox-ax,diffY=oy-ay,diffZ=oz-az,DdQxE2=sign*(dx*(diffY*edge2Z-diffZ*edge2Y)+dy*(diffZ*edge2X-diffX*edge2Z)+dz*(diffX*edge2Y-diffY*edge2X));if(DdQxE2<0)continue;let DdE1xQ=sign*(dx*(edge1Y*diffZ-edge1Z*diffY)+dy*(edge1Z*diffX-edge1X*diffZ)+dz*(edge1X*diffY-edge1Y*diffX));if(DdE1xQ<0||DdQxE2+DdE1xQ>DdN)continue;let QdN=-sign*(diffX*normalX+diffY*normalY+diffZ*normalZ);if(QdN<0)continue;let t=QdN/DdN,intersect=new BVHIntersect(pointA,pointB,pointC,triangleIndex,new BVHVector3(ox+dx*t,oy+dy*t,oz+dz*t));(!filter||filter(intersect))&&(onlyFirst?t<maxDistance&&(maxDistance=t,intersects.length>0&&(intersects.length=0),intersects.push(intersect)):intersects.push(intersect))}let nodeIdOffset=nodeId*36/2,node0Id=rootNodeUint16Array[nodeIdOffset+16],node1Id=rootNodeUint16Array[nodeIdOffset+17];node0Id&&nodeIdsToIntersect.push(node0Id),node1Id&&nodeIdsToIntersect.push(node1Id)}return intersects}};function clamp$7(value,min,max){return value<min?min:value>max?max:value}function calcExtents(offsetArray,bboxArray,startIndex,endIndex,expandBy){if(startIndex>=endIndex)return[0,0,0,0,0,0];let minX=1/0,minY=1/0,minZ=1/0,maxX=-1/0,maxY=-1/0,maxZ=-1/0;for(let offset=startIndex;offset<endIndex;offset++){let bboxIndex=offsetArray[offset]*6,temp=bboxArray[bboxIndex];temp<minX&&(minX=temp),temp=bboxArray[bboxIndex+1],temp<minY&&(minY=temp),temp=bboxArray[bboxIndex+2],temp<minZ&&(minZ=temp),temp=bboxArray[bboxIndex+3],temp>maxX&&(maxX=temp),temp=bboxArray[bboxIndex+4],temp>maxY&&(maxY=temp),temp=bboxArray[bboxIndex+5],temp>maxZ&&(maxZ=temp)}return[minX-expandBy,minY-expandBy,minZ-expandBy,maxX+expandBy,maxY+expandBy,maxZ+expandBy]}(function(){let diff=new BVHVector3(0,0,0),edge1=new BVHVector3(0,0,0),edge2=new BVHVector3(0,0,0),normal=new BVHVector3(0,0,0);return function(a,b,c,rayOrigin,rayDirection){edge1.subVectors(b,a),edge2.subVectors(c,a),normal.crossVectors(edge1,edge2);let DdN=rayDirection.dot(normal),sign;if(DdN>0)sign=1;else if(DdN<0)sign=-1,DdN=-DdN;else return null;diff.subVectors(rayOrigin,a);let DdQxE2=sign*rayDirection.dot(edge2.crossVectors(diff,edge2));if(DdQxE2<0)return null;let DdE1xQ=sign*rayDirection.dot(edge1.cross(diff));if(DdE1xQ<0||DdQxE2+DdE1xQ>DdN)return null;let QdN=-sign*diff.dot(normal);if(QdN<0)return null;let t=QdN/DdN;return new BVHVector3(0,0,0).copy(rayDirection).multiplyScalar(t).add(rayOrigin)}})();var EPSILON=1e-6,ORDER_AXISES=[`x`,`y`,`z`],scratchVector3$7=new BVHVector3(0,0,0),BVHPoints=class extends BVHObject{createTree(maxPointsPerNode,maxDepth,extents){maxDepth=Math.min(maxDepth,16);let getPositionByIndex=this.getPositionByIndex.bind(this),pointCount=this.getPositionCount(),offsetArray=pointCount>65535?new Uint32Array(pointCount):new Uint16Array(pointCount),nodesToSplit=[],nodesToSplitLength=0,idIndex=-1;if(extents)for(let i=0;i<pointCount;i+=1)offsetArray[i]=i;else{getPositionByIndex(0,scratchVector3$7);let gminX=scratchVector3$7.x,gminY=scratchVector3$7.y,gminZ=scratchVector3$7.z,gmaxX=gminX,gmaxY=gminY,gmaxZ=gminZ;for(let i=0;i<pointCount;i+=1){offsetArray[i]=i,getPositionByIndex(i,scratchVector3$7);let x=scratchVector3$7.x,y=scratchVector3$7.y,z=scratchVector3$7.z;x<gminX?gminX=x:x>gmaxX&&(gmaxX=x),y<gminY?gminY=y:y>gmaxY&&(gmaxY=y),z<gminZ?gminZ=z:z>gmaxZ&&(gmaxZ=z)}extents=[gminX,gminY,gminZ,gmaxX,gmaxY,gmaxZ]}let rootNode=new BVHNode(++idIndex,extents,0,pointCount,0);nodesToSplit[nodesToSplitLength++]=rootNode;let nodeSize=[],orders=[0,1,2],orderSorts=function(axis0,axis1){return nodeSize[axis1]-nodeSize[axis0]};function splitNode_(node){let startIndex=node.startIndex,endIndex=node.endIndex,extents=node.extents;nodeSize[0]=extents[3]-extents[0],nodeSize[1]=extents[4]-extents[1],nodeSize[2]=extents[5]-extents[2];let order=orders.sort(orderSorts)[0],orderAxis=ORDER_AXISES[order],center=(extents[order]+extents[order+3])/2,headOffset=startIndex,tailOffset=endIndex-1,switcher=-1,temp;for(;headOffset<=tailOffset;)switcher===-1?(temp=offsetArray[headOffset],getPositionByIndex(temp,scratchVector3$7),scratchVector3$7[orderAxis]<center?headOffset++:switcher=temp):(temp=offsetArray[tailOffset],getPositionByIndex(temp,scratchVector3$7),scratchVector3$7[orderAxis]>=center?tailOffset--:(offsetArray[headOffset]=temp,offsetArray[tailOffset]=switcher,switcher=-1,headOffset++,tailOffset--));if(headOffset>startIndex){let node0Extents=extents.slice();node0Extents[order+3]=center+EPSILON;let node0=new BVHNode(++idIndex,node0Extents,startIndex,headOffset,node.deepth+1);node0.deepth<maxDepth&&node0.endIndex-node0.startIndex>maxPointsPerNode&&(nodesToSplit[nodesToSplitLength++]=node0),node.node0=node0}if(endIndex>headOffset){let node1Extents=extents.slice();node1Extents[order]=center-EPSILON;let node1=new BVHNode(++idIndex,node1Extents,headOffset,endIndex,node.deepth+1);node1.deepth<maxDepth&&node1.endIndex-node1.startIndex>maxPointsPerNode&&(nodesToSplit[nodesToSplitLength++]=node1),node.node1=node1}node.startIndex=0,node.endIndex=0}for(;nodesToSplitLength;)splitNode_(nodesToSplit[--nodesToSplitLength]);return this.offsetArray=offsetArray,this.rootNodePacked=packBVHNode(rootNode,idIndex+1),nodesToSplit.length=0,this}intersectRay(rayOrigin,rayDirection,threshold=0,onlyFirst=!1,filter){let intersects=[],offsetArray=this.offsetArray,rootNode=this.rootNodePacked,rootNodeFloat32Array=new Float32Array(rootNode),rootNodeUint32Array=new Uint32Array(rootNode),rootNodeUint16Array=new Uint16Array(rootNode),thresholdSquared=threshold*threshold,invRayDirection=new BVHVector3(1/rayDirection.x,1/rayDirection.y,1/rayDirection.z),nodeIdsToIntersect=[0],nodeId,maxDistance=1/0,box=new BVHBox3(new BVHVector3(0,0,0),new BVHVector3(0,0,0)),point=new BVHVector3(0,0,0);for(;(nodeId=nodeIdsToIntersect.pop())!==void 0;){let offset=nodeId*36/4;box.min.x=rootNodeFloat32Array[offset],box.min.y=rootNodeFloat32Array[offset+1],box.min.z=rootNodeFloat32Array[offset+2],box.max.x=rootNodeFloat32Array[offset+3],box.max.y=rootNodeFloat32Array[offset+4],box.max.z=rootNodeFloat32Array[offset+5];let nodeBoxDistance=intersectNodeBox(rayOrigin,invRayDirection,box,threshold);if(nodeBoxDistance===null||onlyFirst&&nodeBoxDistance>maxDistance)continue;let start=rootNodeUint32Array[offset+6],end=rootNodeUint32Array[offset+7];for(let i=start;i<end;i++){let indexOffset=offsetArray[i];this.getPositionByIndex(indexOffset,point);let x=point.x,y=point.y,z=point.z,vx=rayOrigin.x,vy=rayOrigin.y,vz=rayOrigin.z,dx=rayDirection.x,dy=rayDirection.y,dz=rayDirection.z,t=dx*(x-vx)+dy*(y-vy)+dz*(z-vz);if(t>0?(vx+=dx*t,vy+=dy*t,vz+=dz*t):t<0&&(t=0),dx=x-vx,dy=y-vy,dz=z-vz,dx*dx+dy*dy+dz*dz<=thresholdSquared){let intersect=new BVHIntersect(point,point,point,indexOffset,new BVHVector3(vx,vy,vz));(!filter||filter(intersect))&&(onlyFirst?t<maxDistance&&(maxDistance=t,intersects.length>0&&(intersects.length=0),intersects.push(intersect)):intersects.push(intersect))}}let nodeIdOffset=nodeId*36/2,node0Id=rootNodeUint16Array[nodeIdOffset+16],node1Id=rootNodeUint16Array[nodeIdOffset+17];node0Id&&nodeIdsToIntersect.push(node0Id),node1Id&&nodeIdsToIntersect.push(node1Id)}return intersects}},jsContent$1="(function(){var e=class{constructor(e,t){this.position=e,this.indices=t}getPositionCount(){var e,t;let n=this.indices,r=this.position;return n?n.array.length/((e=n.stride)==null?1:e):r.array.length/((t=r.stride)==null?3:t)}getPositionByIndex(e,t){var n,r,i,a;let o=this.indices,s=this.position,c=e;if(o){let t=o.array,i=(n=o.stride)==null?1:n,a=(r=o.offset)==null?0:r;c=t[e*i+a]}let l=s.array,u=(i=s.stride)==null?3:i,d=(a=s.offset)==null?0:a;return c=c*u+d,t.x=l[c],t.y=l[c+1],t.z=l[c+2],t}createTree(e,t,n){throw Error(`not implemented`)}trianglesInSphere(e,t){throw Error(`not implemented`)}intersectRay(e,t,n=0,r=!1,i){throw Error(`not implemented`)}},t=class{constructor(e,t,n,r,i){this.id=e,this.extents=t,this.startIndex=n,this.endIndex=r,this.deepth=i}};function n(e,t){let n=new ArrayBuffer(t*36),r=new Float32Array(n),i=new Uint32Array(n),a=new Uint16Array(n),o=[e],s,c;for(;s=o.pop();)c=s.id*36/4,r[c]=s.extents[0],r[c+1]=s.extents[1],r[c+2]=s.extents[2],r[c+3]=s.extents[3],r[c+4]=s.extents[4],r[c+5]=s.extents[5],i[c+6]=s.startIndex,i[c+7]=s.endIndex,c=s.id*36/2,s.node0&&(a[c+16]=s.node0.id,o.push(s.node0)),s.node1&&(a[c+17]=s.node1.id,o.push(s.node1));return n}function r(e,t,n,r=0){let i=n.min.x-r,a=n.min.y-r,o=n.min.z-r,s=n.max.x+r,c=n.max.y+r,l=n.max.z+r,u=0,d=0,f=0,p=0,m=0,h=0;return t.x>=0?(u=(i-e.x)*t.x,d=(s-e.x)*t.x):(u=(s-e.x)*t.x,d=(i-e.x)*t.x),t.y>=0?(f=(a-e.y)*t.y,p=(c-e.y)*t.y):(f=(c-e.y)*t.y,p=(a-e.y)*t.y),u>p||f>d||((f>u||u!==u)&&(u=f),(p<d||d!==d)&&(d=p),t.z>=0?(m=(o-e.z)*t.z,h=(l-e.z)*t.z):(m=(l-e.z)*t.z,h=(o-e.z)*t.z),u>h||m>d)||((m>u||u!==u)&&(u=m),(h<d||d!==d)&&(d=h),d<0)?null:u>=0?u:0}var i=class e{constructor(e,t,n){this.x=e,this.y=t,this.z=n}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}set(e,t,n){return this.x=e,this.y=t,this.z=n,this}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e){let t=this.x,n=this.y,r=this.z;return this.x=n*e.z-r*e.y,this.y=r*e.x-t*e.z,this.z=t*e.y-n*e.x,this}crossVectors(e,t){let n=e.x,r=e.y,i=e.z,a=t.x,o=t.y,s=t.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r}clone(){return new e(this.x,this.y,this.z)}},a=class{constructor(e,t,n,r,i){this.pointA=e,this.pointB=t,this.pointC=n,this.index=r,this.intersectionPoint=i}},o=class{constructor(e,t){this.min=e,this.max=t}};let s=1e-6,c=new i(0,0,0),l=new i(0,0,0),u=new i(0,0,0),d=new i(0,0,0);var f=class extends e{createTree(e,r,i){r=Math.min(r,16);let a=this.getPositionCount()/3,o=a>65535?new Uint32Array(a):new Uint16Array(a),c=new Float32Array(a*6),f=[],p=0,h=-1;if(i)for(let e=0;e<a;e+=1){let t=e*3,n=e*6,r,i,a,s,f,p,m;o[e]=e,this.getPositionByIndex(t,l),this.getPositionByIndex(t+1,u),this.getPositionByIndex(t+2,d),r=s=l.x,m=u.x,m<r&&(r=m),m>s&&(s=m),m=d.x,m<r&&(r=m),m>s&&(s=m),i=f=l.y,m=u.y,m<i&&(i=m),m>f&&(f=m),m=d.y,m<i&&(i=m),m>f&&(f=m),a=p=l.z,m=u.z,m<a&&(a=m),m>p&&(p=m),m=d.z,m<a&&(a=m),m>p&&(p=m),c[n]=r,c[n+1]=i,c[n+2]=a,c[n+3]=s,c[n+4]=f,c[n+5]=p}else{let e=1/0,t=1/0,n=1/0,r=-1/0,s=-1/0,f=-1/0;for(let i=0;i<a;i+=1){let a=i*3,p=i*6,m,h,g,_,v,y,b;o[i]=i,this.getPositionByIndex(a,l),this.getPositionByIndex(a+1,u),this.getPositionByIndex(a+2,d),m=_=l.x,b=u.x,b<m&&(m=b),b>_&&(_=b),b=d.x,b<m&&(m=b),b>_&&(_=b),h=v=l.y,b=u.y,b<h&&(h=b),b>v&&(v=b),b=d.y,b<h&&(h=b),b>v&&(v=b),g=y=l.z,b=u.z,b<g&&(g=b),b>y&&(y=b),b=d.z,b<g&&(g=b),b>y&&(y=b),c[p]=m,c[p+1]=h,c[p+2]=g,c[p+3]=_,c[p+4]=v,c[p+5]=y,m<e&&(e=m),_>r&&(r=_),h<t&&(t=h),v>s&&(s=v),g<n&&(n=g),y>f&&(f=y)}i=[e,t,n,r,s,f]}let g=new t(++h,i,0,a,0);f[p++]=g;let _=[],v=[0,1,2],y=function(e,t){return _[t]-_[e]};function b(n){let i=n.startIndex,a=n.endIndex,l=n.extents;_[0]=l[3]-l[0],_[1]=l[4]-l[1],_[2]=l[5]-l[2],v.sort(y);for(let u=0;u<3;u++){let d=v[u],g=l[d]+l[d+3],_=i,y=a-1,b=-1,x;for(;_<=y;)b===-1?(x=o[_],c[x*6+d]+c[x*6+d+3]<g?_++:b=x):(x=o[y],c[x*6+d]+c[x*6+d+3]>=g?y--:(o[_]=x,o[y]=b,b=-1,_++,y--));if(_>i&&_<a){let l=new t(++h,m(o,c,i,_,s),i,_,n.deepth+1);l.deepth<r&&l.endIndex-l.startIndex>e&&(f[p++]=l);let u=new t(++h,m(o,c,_,a,s),_,a,n.deepth+1);u.deepth<r&&u.endIndex-u.startIndex>e&&(f[p++]=u),n.node0=l,n.node1=u,n.startIndex=0,n.endIndex=0;break}}}for(;p;)b(f[--p]);return this.offsetArray=o,this.rootNodePacked=n(g,h+1),f.length=0,this}trianglesInSphere(e,t){let n=this.offsetArray,r=this.rootNodePacked,i=new Float32Array(r),a=new Uint32Array(r),o=new Uint16Array(r),s=[0],l=[],u;for(;(u=s.pop())!==void 0;){let r=u*36/4,c=p(e.x,i[r],i[r+3])-e.x,d=p(e.y,i[r+1],i[r+4])-e.y,f=p(e.z,i[r+2],i[r+5])-e.z;if(c*c+d*d+f*f<=t*t){let e=a[r+6],t=a[r+7];for(let r=e;r<t;r++){let e=n[r];l.push(e)}let i=u*36/2,c=o[i+16],d=o[i+17];c&&s.push(c),d&&s.push(d)}}let d=l.length,f=new Float32Array(d*9);for(let e=0;e<d;e++){let t=l[e]*3;this.getPositionByIndex(t,c),f[e*9]=c.x,f[e*9+1]=c.y,f[e*9+2]=c.z,this.getPositionByIndex(t+1,c),f[e*9+3]=c.x,f[e*9+4]=c.y,f[e*9+5]=c.z,this.getPositionByIndex(t+2,c),f[e*9+6]=c.x,f[e*9+7]=c.y,f[e*9+8]=c.z}return f}intersectRay(e,t,n=0,s=!1,c){let l=[],u=this.offsetArray,d=this.rootNodePacked,f=new Float32Array(d),p=new Uint32Array(d),m=new Uint16Array(d),h=new i(1/t.x,1/t.y,1/t.z),g=[0],_,v=1/0,y=new o(new i(0,0,0),new i(0,0,0)),b=new i(0,0,0),x=new i(0,0,0),S=new i(0,0,0);for(;(_=g.pop())!==void 0;){let o=_*36/4;y.min.x=f[o],y.min.y=f[o+1],y.min.z=f[o+2],y.max.x=f[o+3],y.max.y=f[o+4],y.max.z=f[o+5];let d=r(e,h,y,n);if(d===null||s&&d>v)continue;let C=e.x,w=e.y,T=e.z,E=t.x,D=t.y,O=t.z,k=p[o+6],A=p[o+7];for(let e=k;e<A;e++){let t=u[e],n=t*3;this.getPositionByIndex(n,b);let r=b.x,o=b.y,d=b.z;this.getPositionByIndex(n+1,x);let f=x.x,p=x.y,m=x.z;this.getPositionByIndex(n+2,S);let h=S.x,g=S.y,_=S.z,y=f-r,k=p-o,A=m-d,j=h-r,M=g-o,N=_-d,P=k*N-A*M,F=A*j-y*N,I=y*M-k*j,L=E*P+D*F+O*I,R;if(L>0)R=1;else if(L<0)R=-1,L=-L;else continue;let z=C-r,B=w-o,V=T-d,H=R*(E*(B*N-V*M)+D*(V*j-z*N)+O*(z*M-B*j));if(H<0)continue;let U=R*(E*(k*V-A*B)+D*(A*z-y*V)+O*(y*B-k*z));if(U<0||H+U>L)continue;let W=-R*(z*P+B*F+V*I);if(W<0)continue;let G=W/L,K=new a(b,x,S,t,new i(C+E*G,w+D*G,T+O*G));(!c||c(K))&&(s?G<v&&(v=G,l.length>0&&(l.length=0),l.push(K)):l.push(K))}let j=_*36/2,M=m[j+16],N=m[j+17];M&&g.push(M),N&&g.push(N)}return l}};function p(e,t,n){return e<t?t:e>n?n:e}function m(e,t,n,r,i){if(n>=r)return[0,0,0,0,0,0];let a=1/0,o=1/0,s=1/0,c=-1/0,l=-1/0,u=-1/0;for(let i=n;i<r;i++){let n=e[i]*6,r=t[n];r<a&&(a=r),r=t[n+1],r<o&&(o=r),r=t[n+2],r<s&&(s=r),r=t[n+3],r>c&&(c=r),r=t[n+4],r>l&&(l=r),r=t[n+5],r>u&&(u=r)}return[a-i,o-i,s-i,c+i,l+i,u+i]}(function(){let e=new i(0,0,0),t=new i(0,0,0),n=new i(0,0,0),r=new i(0,0,0);return function(a,o,s,c,l){t.subVectors(o,a),n.subVectors(s,a),r.crossVectors(t,n);let u=l.dot(r),d;if(u>0)d=1;else if(u<0)d=-1,u=-u;else return null;e.subVectors(c,a);let f=d*l.dot(n.crossVectors(e,n));if(f<0)return null;let p=d*l.dot(t.cross(e));if(p<0||f+p>u)return null;let m=-d*e.dot(r);if(m<0)return null;let h=m/u;return new i(0,0,0).copy(l).multiplyScalar(h).add(c)}})();let h=1e-6,g=[`x`,`y`,`z`],_=new i(0,0,0);var v=class extends e{createTree(e,r,i){r=Math.min(r,16);let a=this.getPositionByIndex.bind(this),o=this.getPositionCount(),s=o>65535?new Uint32Array(o):new Uint16Array(o),c=[],l=0,u=-1;if(i)for(let e=0;e<o;e+=1)s[e]=e;else{a(0,_);let e=_.x,t=_.y,n=_.z,r=e,c=t,l=n;for(let i=0;i<o;i+=1){s[i]=i,a(i,_);let o=_.x,u=_.y,d=_.z;o<e?e=o:o>r&&(r=o),u<t?t=u:u>c&&(c=u),d<n?n=d:d>l&&(l=d)}i=[e,t,n,r,c,l]}let d=new t(++u,i,0,o,0);c[l++]=d;let f=[],p=[0,1,2],m=function(e,t){return f[t]-f[e]};function v(n){let i=n.startIndex,o=n.endIndex,d=n.extents;f[0]=d[3]-d[0],f[1]=d[4]-d[1],f[2]=d[5]-d[2];let v=p.sort(m)[0],y=g[v],b=(d[v]+d[v+3])/2,x=i,S=o-1,C=-1,w;for(;x<=S;)C===-1?(w=s[x],a(w,_),_[y]<b?x++:C=w):(w=s[S],a(w,_),_[y]>=b?S--:(s[x]=w,s[S]=C,C=-1,x++,S--));if(x>i){let a=d.slice();a[v+3]=b+h;let o=new t(++u,a,i,x,n.deepth+1);o.deepth<r&&o.endIndex-o.startIndex>e&&(c[l++]=o),n.node0=o}if(o>x){let i=d.slice();i[v]=b-h;let a=new t(++u,i,x,o,n.deepth+1);a.deepth<r&&a.endIndex-a.startIndex>e&&(c[l++]=a),n.node1=a}n.startIndex=0,n.endIndex=0}for(;l;)v(c[--l]);return this.offsetArray=s,this.rootNodePacked=n(d,u+1),c.length=0,this}intersectRay(e,t,n=0,s=!1,c){let l=[],u=this.offsetArray,d=this.rootNodePacked,f=new Float32Array(d),p=new Uint32Array(d),m=new Uint16Array(d),h=n*n,g=new i(1/t.x,1/t.y,1/t.z),_=[0],v,y=1/0,b=new o(new i(0,0,0),new i(0,0,0)),x=new i(0,0,0);for(;(v=_.pop())!==void 0;){let o=v*36/4;b.min.x=f[o],b.min.y=f[o+1],b.min.z=f[o+2],b.max.x=f[o+3],b.max.y=f[o+4],b.max.z=f[o+5];let d=r(e,g,b,n);if(d===null||s&&d>y)continue;let S=p[o+6],C=p[o+7];for(let n=S;n<C;n++){let r=u[n];this.getPositionByIndex(r,x);let o=x.x,d=x.y,f=x.z,p=e.x,m=e.y,g=e.z,_=t.x,v=t.y,b=t.z,S=_*(o-p)+v*(d-m)+b*(f-g);if(S>0?(p+=_*S,m+=v*S,g+=b*S):S<0&&(S=0),_=o-p,v=d-m,b=f-g,_*_+v*v+b*b<=h){let e=new a(x,x,x,r,new i(p,m,g));(!c||c(e))&&(s?S<y&&(y=S,l.length>0&&(l.length=0),l.push(e)):l.push(e))}}let w=v*36/2,T=m[w+16],E=m[w+17];T&&_.push(T),E&&_.push(E)}return l}};function y(e){onmessage=t=>{Promise.resolve(t.data).then(t=>e(t)).then(({output:e,transfer:t})=>postMessage(e,t)).catch(e=>postMessage({$$error:e}))}}y(e=>Promise.resolve(e).then(e=>{let t=[],n=new Set;for(let r of e){let e;if(r.type===`mesh`)e=new f(r.attributes.position,r.indices);else if(r.type===`points`)e=new v(r.attributes.position,r.indices);else throw Error(`Invalid Type`);e.createTree(r.maxItemPerNode,r.maxTreeDepth,r.extents);let i={type:r.type,attributes:r.attributes,indices:r.indices,offsetArray:e.offsetArray,rootNodePacked:e.rootNodePacked};t.push(i);let a;for(let e in i.attributes){let t=i.attributes[e],r=t==null?void 0:t.array;r&&r.buffer instanceof ArrayBuffer&&n.add(r.buffer)}a=i.indices;let o=a==null?void 0:a.array;o&&o.buffer instanceof ArrayBuffer&&n.add(o.buffer),a=i.offsetArray,a&&a.buffer instanceof ArrayBuffer&&n.add(a.buffer),n.add(i.rootNodePacked)}return{output:t,transfer:Array.from(n)}}))})();",blob$1=typeof self<`u`&&self.Blob&&new Blob([`(self.URL || self.webkitURL).revokeObjectURL(self.location.href);`,jsContent$1],{type:`text/javascript;charset=utf-8`});function WorkerWrapper$1(options){let objURL;try{if(objURL=blob$1&&(self.URL||self.webkitURL).createObjectURL(blob$1),!objURL)throw``;let worker=new Worker(objURL,{name:options==null?void 0:options.name});return worker.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(objURL)}),worker}catch(e){return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(jsContent$1),{name:options==null?void 0:options.name})}}var Face3=class Face3{constructor(a,b,c,normal,materialIndex){this.a=a,this.b=b,this.c=c,this.normal=normal&&normal instanceof three_webgpu.Vector3?normal:new three.Vector3,this.materialIndex=materialIndex===void 0?0:materialIndex}clone(){return new Face3(this.a,this.b,this.c).copy(this)}copy(source){return this.a=source.a,this.b=source.b,this.c=source.c,this.normal instanceof three_webgpu.Vector3&&source.normal instanceof three_webgpu.Vector3&&this.normal.copy(source.normal),this.materialIndex=source.materialIndex,this}},bvhWorkerPool=new require_glTF_helpers.a(()=>new WorkerWrapper$1,4),defaultHitFilter=()=>!0,scratchRay=new three_webgpu.Ray,scratchNormalMatrix=new three_webgpu.Matrix3,scratchInverseMatrix=new three_webgpu.Matrix4,scratchIntersectionFaceA=new three_webgpu.Vector3,scratchIntersectionFaceB=new three_webgpu.Vector3,scratchIntersectionFaceC=new three_webgpu.Vector3,scratchPointCloudNormal=new three_webgpu.Vector3,intersectsMap=new WeakMap;function raycastMesh(mesh,bvh,raycaster,intersects){var _a,_b;let matrixWorld=mesh.matrixWorld;scratchInverseMatrix.copy(matrixWorld).invert(),scratchRay.copy(raycaster.ray).applyMatrix4(scratchInverseMatrix);let filter=(_a=raycaster.hitFilter)==null?defaultHitFilter:_a,onlyFirst=(_b=raycaster.firstHitOnly)==null?!1:_b,geometry=mesh.geometry,material=mesh.material,groups=geometry.groups,indicesAttr=geometry.index,bvhIntersects=bvh.intersectRay(scratchRay.origin,scratchRay.direction,0,onlyFirst,bvhIntersect=>{var _a;let triangleIndex=bvhIntersect.index,indexOffset=triangleIndex*3,intersectMaterial;if(Array.isArray(material)){if(groups){for(let group of groups)if(indexOffset>=group.start&&indexOffset-group.start<group.count){intersectMaterial=material[(_a=group.materialIndex)==null?0:_a];break}}}else intersectMaterial=material;if(!intersectMaterial)return!1;let intersectionPoint=bvhIntersect.intersectionPoint,point=new three_webgpu.Vector3(intersectionPoint.x,intersectionPoint.y,intersectionPoint.z).applyMatrix4(matrixWorld),distance=raycaster.ray.origin.distanceTo(point);if(distance<raycaster.near||distance>raycaster.far)return!1;let pointA=bvhIntersect.pointA,pointB=bvhIntersect.pointB,pointC=bvhIntersect.pointC,normal=three_webgpu.Triangle.getNormal(scratchIntersectionFaceA.set(pointA.x,pointA.y,pointA.z).applyMatrix4(matrixWorld),scratchIntersectionFaceB.set(pointB.x,pointB.y,pointB.z).applyMatrix4(matrixWorld),scratchIntersectionFaceC.set(pointC.x,pointC.y,pointC.z).applyMatrix4(matrixWorld),new three_webgpu.Vector3),normalContant=raycaster.ray.direction.dot(normal);if(intersectMaterial.side===three_webgpu.FrontSide&&normalContant>=0||intersectMaterial.side===three_webgpu.BackSide&&normalContant<=0)return!1;let intersect={distance,object:mesh,face:new Face3(indicesAttr?indicesAttr.array[indexOffset]:indexOffset,indicesAttr?indicesAttr.array[indexOffset+1]:indexOffset+1,indicesAttr?indicesAttr.array[indexOffset+2]:indexOffset+2,normal),point,distanceToRay:0,faceIndex:triangleIndex};return intersectsMap.set(bvhIntersect,intersect),filter(intersect)}),bvhIntersectLength=bvhIntersects.length;for(let i=0;i<bvhIntersectLength;i++){let intersect=intersectsMap.get(bvhIntersects[i]);intersect&&intersects.push(intersect)}bvhIntersects.length=0}function getNormalAttrForPointRaycast(geometry,preferInstanceNormal){if(preferInstanceNormal){let inst=geometry.getAttribute(`instanceNormal`);if(inst instanceof three_webgpu.BufferAttribute||inst instanceof three_webgpu.InterleavedBufferAttribute)return inst}let n=geometry.getAttribute(`normal`);if(n instanceof three_webgpu.BufferAttribute||n instanceof three_webgpu.InterleavedBufferAttribute)return n}function isIndexableBufferAttribute(attr){return attr instanceof three_webgpu.BufferAttribute||attr instanceof three_webgpu.InterleavedBufferAttribute}function raycastBVHPoints(object,geometry,bvh,raycaster,intersects,preferInstanceNormal,useGeometryIndex=!0){var _a,_b,_c,_d;let matrixWorld=object.matrixWorld;scratchNormalMatrix.getNormalMatrix(matrixWorld),scratchInverseMatrix.copy(matrixWorld).invert(),scratchRay.copy(raycaster.ray).applyMatrix4(scratchInverseMatrix);let threshold=((_b=(_a=raycaster.params.Points)==null?void 0:_a.threshold)==null?1:_b)*scratchInverseMatrix.getMaxScaleOnAxis(),filter=(_c=raycaster.hitFilter)==null?defaultHitFilter:_c,onlyFirst=(_d=raycaster.firstHitOnly)==null?!1:_d,indicesAttr=useGeometryIndex?geometry.index:null,normalAttr=getNormalAttrForPointRaycast(geometry,preferInstanceNormal),hasNormalAttr=isIndexableBufferAttribute(normalAttr),externalNormals=null;if(!hasNormalAttr&&object instanceof require_memoryUsage.m){let src=object.normals;require_memoryUsage._(src,object.numPoints)&&(externalNormals=src)}let bvhIntersects=bvh.intersectRay(scratchRay.origin,scratchRay.direction,threshold,onlyFirst,bvhIntersect=>{let intersectionPoint=bvhIntersect.intersectionPoint,point=new three_webgpu.Vector3(intersectionPoint.x,intersectionPoint.y,intersectionPoint.z).applyMatrix4(matrixWorld),distance=raycaster.ray.origin.distanceTo(point);if(distance<raycaster.near||distance>raycaster.far)return!1;let pointA=bvhIntersect.pointA,faceA=scratchIntersectionFaceA.set(pointA.x,pointA.y,pointA.z).applyMatrix4(matrixWorld),distanceToRay=point.distanceTo(faceA);if(distanceToRay/distance>.07)return!1;let pointIndex=bvhIntersect.index,positionIndex=indicesAttr?indicesAttr.array[pointIndex]:pointIndex,face;if(hasNormalAttr&&normalAttr)face=new Face3(positionIndex,positionIndex,positionIndex,new three_webgpu.Vector3().fromBufferAttribute(normalAttr,positionIndex).applyNormalMatrix(scratchNormalMatrix));else if(externalNormals)require_memoryUsage.h(externalNormals,positionIndex,scratchPointCloudNormal),scratchPointCloudNormal.lengthSq()>1e-12&&(scratchPointCloudNormal.applyNormalMatrix(scratchNormalMatrix),face=new Face3(positionIndex,positionIndex,positionIndex,scratchPointCloudNormal.clone()));else{let scaleAttr=geometry.getAttribute(`scale`),rotationAttr=geometry.getAttribute(`rotation`);if(scaleAttr instanceof three_webgpu.BufferAttribute&&rotationAttr instanceof three_webgpu.BufferAttribute){let scaleValue=new three_webgpu.Vector3().fromBufferAttribute(scaleAttr,positionIndex).toArray(),rotationValue=new three_webgpu.Vector4().fromBufferAttribute(rotationAttr,positionIndex).toArray(),rotationQuaternion=new three_webgpu.Quaternion(rotationValue[1],rotationValue[2],rotationValue[3],rotationValue[0]),[{axis}]=[{axis:`x`,scale:scaleValue[0]},{axis:`y`,scale:scaleValue[1]},{axis:`z`,scale:scaleValue[2]}].sort((a,b)=>a.scale-b.scale),normal=new three_webgpu.Vector3(0,0,0);normal[axis]=1,normal.applyQuaternion(rotationQuaternion).applyNormalMatrix(scratchNormalMatrix),raycaster.ray.direction.dot(normal)>0&&normal.negate(),face=new Face3(positionIndex,positionIndex,positionIndex,normal)}}let intersect={distance,object,face,point,distanceToRay,index:pointIndex};return intersectsMap.set(bvhIntersect,intersect),filter(intersect)}),bvhIntersectLength=bvhIntersects.length;for(let i=0;i<bvhIntersectLength;i++){let intersect=intersectsMap.get(bvhIntersects[i]);intersect&&intersects.push(intersect)}bvhIntersects.length=0}function raycastPoints(points,bvh,raycaster,intersects){raycastBVHPoints(points,points.geometry,bvh,raycaster,intersects,!1,!0)}var BVH_MESH_PROP=`__bvh_mesh__`,originMeshRaycast=three_webgpu.Mesh.prototype.raycast;function overrideMeshRaycast(raycaster,intersects){let bvh=getBvhTreeForMesh(this);bvh?raycastMesh(this,bvh,raycaster,intersects):originMeshRaycast.call(this,raycaster,intersects)}function getBvhTreeForMesh(mesh){let bvhMesh=mesh[BVH_MESH_PROP];return bvhMesh instanceof BVHMesh,bvhMesh}function bindBvhTreeForMesh(mesh,bvh){Object.assign(mesh,{[BVH_MESH_PROP]:bvh,raycast:overrideMeshRaycast})}var BVH_POINTS_PROP=`__bvh_points__`,BVH_POINT_CLOUD_PROP=`__bvh_point_cloud__`,originPointsRaycast=three_webgpu.Points.prototype.raycast;function overridePointsRaycast(raycaster,intersects){let bvh=getBvhTreeForPoints(this);bvh?raycastPoints(this,bvh,raycaster,intersects):originPointsRaycast.call(this,raycaster,intersects)}function overridePointCloudRaycast(raycaster,intersects){let bvh=getBvhTreeForPointCloud(this);bvh?raycastBVHPointCloud(this,bvh,raycaster,intersects):require_memoryUsage.m.prototype.raycast.call(this,raycaster,intersects)}var pointCloudRaycastGeometry=new three_webgpu.BufferGeometry;function raycastBVHPointCloud(object,bvh,raycaster,intersects){raycastBVHPoints(object,pointCloudRaycastGeometry,bvh,raycaster,intersects,!1,!1)}function getBvhTreeForPoints(mesh){let bvhPoints=mesh[BVH_POINTS_PROP];return bvhPoints instanceof BVHPoints,bvhPoints}function getBvhTreeForPointCloud(object){let bvh=object[BVH_POINT_CLOUD_PROP];return bvh instanceof BVHPoints?bvh:null}function bindBvhTreeForPointCloud(object,bvh){Object.assign(object,{[BVH_POINT_CLOUD_PROP]:bvh,raycast:overridePointCloudRaycast})}function bindBvhTreeForPoints(points,bvh){Object.assign(points,{[BVH_POINTS_PROP]:bvh,raycast:overridePointsRaycast})}function getPointsPositionAttr(geometry){let positionAttr=geometry.attributes.position;return positionAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:positionAttr.data.array,stride:positionAttr.data.stride,offset:positionAttr.offset}:positionAttr instanceof three_webgpu.BufferAttribute?{array:positionAttr.array}:null}function collectBvhBuildEntries(root){let entries=[];return root.traverse(child=>{if(child instanceof require_memoryUsage.m){entries.push({kind:`pointCloud`,obj:child});return}if((child instanceof three_webgpu.Mesh||child instanceof three_webgpu.Points)&&child.geometry instanceof three_webgpu.BufferGeometry){if(child instanceof three_webgpu.Points){entries.push({kind:`points`,obj:child});return}entries.push({kind:`mesh`,obj:child})}}),entries}function generateBvhTree(obj,useWorker=!0,maxItemPerNode=100,maxTreeDepth=10){let entries=collectBvhBuildEntries(obj);if(useWorker){let entryForInputSlot=[];return Promise.resolve().then(()=>{let input=[];entryForInputSlot=[];let transfer=new Set,transferValue=null;for(let i=0;i<entries.length;i++){let entry=entries[i];if(entry.kind===`pointCloud`){let pc=entry.obj,positions=pc.positions;if(!(positions.buffer instanceof ArrayBuffer))continue;let inputItem={type:`points`,attributes:{position:{array:positions,stride:3}},maxItemPerNode,maxTreeDepth,extents:pc.getLocalBoundingBoxExtents()};input.push(inputItem),entryForInputSlot.push(entry),transfer.add(positions.buffer);continue}let geometry=entry.obj.geometry;if(!(geometry instanceof three_webgpu.BufferGeometry))continue;let type;if(entry.kind===`mesh`?type=`mesh`:entry.kind===`points`&&(type=`points`),!type)continue;let bbox=geometry.boundingBox,extents=bbox?[bbox.min.x,bbox.min.y,bbox.min.z,bbox.max.x,bbox.max.y,bbox.max.z]:void 0,attributes={};if(entry.kind===`points`){let position=getPointsPositionAttr(geometry);if(!position)continue;attributes.position={array:position.array,stride:position.stride,offset:position.offset},transferValue=position.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)}else for(let name in geometry.attributes){let attr=geometry.attributes[name];attr instanceof three_webgpu.InterleavedBufferAttribute?(attributes[name]={array:attr.data.array,stride:attr.data.stride,offset:attr.offset},transferValue=attr.data.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)):(attributes[name]={array:attr.array},transferValue=attr.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer))}let indices,indexAttr=geometry.getIndex();indexAttr&&(indexAttr instanceof three_webgpu.InterleavedBufferAttribute?(indices={array:indexAttr.data.array,stride:indexAttr.data.stride,offset:indexAttr.offset},transferValue=indexAttr.data.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)):(indices={array:indexAttr.array},transferValue=indexAttr.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)));let inputItem={type,attributes,indices,maxItemPerNode,maxTreeDepth,extents};input.push(inputItem),entryForInputSlot.push(entry)}return bvhWorkerPool.postMessage(input,Array.from(transfer))}).then(output=>{var _a;for(let j=0;j<output.length;j++){let entry=entryForInputSlot[j],result=output[j];if(!entry||!result)continue;if(entry.kind===`pointCloud`){let pc=entry.obj,positionArray=(_a=result.attributes.position)==null?void 0:_a.array;positionArray instanceof Float32Array&&pc.swapPositionsBuffer(positionArray);let bvh=new BVHPoints(result.attributes.position,result.indices);bvh.offsetArray=result.offsetArray,bvh.rootNodePacked=result.rootNodePacked,bindBvhTreeForPointCloud(pc,bvh);continue}let meshOrPoints=entry.obj,geometry=meshOrPoints.geometry;if(!(geometry instanceof three_webgpu.BufferGeometry))continue;for(let name in result.attributes){let array=result.attributes[name].array,attr=geometry.attributes[name];attr&&(attr instanceof three_webgpu.InterleavedBufferAttribute?attr.data.array=array:attr.array=array)}let indices=geometry.getIndex();if(indices&&result.indices){let array=result.indices.array;indices instanceof three_webgpu.InterleavedBufferAttribute?indices.data.array=array:indices.array=array}if(entry.kind===`mesh`){let bvh=new BVHMesh(result.attributes.position,result.indices);bvh.offsetArray=result.offsetArray,bvh.rootNodePacked=result.rootNodePacked,bindBvhTreeForMesh(meshOrPoints,bvh)}else if(entry.kind===`points`){let bvh=new BVHPoints(result.attributes.position,result.indices);bvh.offsetArray=result.offsetArray,bvh.rootNodePacked=result.rootNodePacked,bindBvhTreeForPoints(meshOrPoints,bvh)}}return obj})}else return Promise.resolve().then(()=>{for(let entry of entries)if(entry.kind===`mesh`){let meshObj=entry.obj,geometry=meshObj.geometry,bbox=geometry.boundingBox,extents=bbox?[bbox.min.x,bbox.min.y,bbox.min.z,bbox.max.x,bbox.max.y,bbox.max.z]:void 0;if(geometry instanceof three_webgpu.BufferGeometry){let position,indices,positionAttr=geometry.attributes.position;position=positionAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:positionAttr.data.array,stride:positionAttr.data.stride,offset:positionAttr.offset}:{array:positionAttr.array};let indicesAttr=geometry.getIndex();indicesAttr&&(indices=indicesAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:indicesAttr.data.array,stride:indicesAttr.data.stride,offset:indicesAttr.offset}:{array:indicesAttr.array});let bvh=new BVHMesh(position,indices);bvh.createTree(maxItemPerNode,maxTreeDepth,extents),bindBvhTreeForMesh(meshObj,bvh)}}else if(entry.kind===`points`){let pointsObj=entry.obj,geometry=pointsObj.geometry,bbox=geometry.boundingBox,extents=bbox?[bbox.min.x,bbox.min.y,bbox.min.z,bbox.max.x,bbox.max.y,bbox.max.z]:void 0;if(geometry instanceof three_webgpu.BufferGeometry){let position=getPointsPositionAttr(geometry),indices;if(!position)continue;let indicesAttr=geometry.getIndex();indicesAttr&&(indices=indicesAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:indicesAttr.data.array,stride:indicesAttr.data.stride,offset:indicesAttr.offset}:{array:indicesAttr.array});let bvh=new BVHPoints(position,indices);bvh.createTree(maxItemPerNode,maxTreeDepth,extents),bindBvhTreeForPoints(pointsObj,bvh)}}else if(entry.kind===`pointCloud`){let pc=entry.obj,bvh=new BVHPoints({array:pc.positions,stride:3});bvh.createTree(maxItemPerNode,maxTreeDepth,pc.getLocalBoundingBoxExtents()),bindBvhTreeForPointCloud(pc,bvh)}return obj})}function mixNumber(from,to,progress){return from+(to-from)*progress}function value(x0,v0,t1,t){let a=(v0*t1+2*x0)/Math.pow(t1,3),b=-(2*v0*t1+3*x0)/Math.pow(t1,2),c=v0,d=x0;return a*Math.pow(t,3)+b*Math.pow(t,2)+c*t+d}function velocity(x0,v0,t1,t){let a=(v0*t1+2*x0)/Math.pow(t1,3),b=-(2*v0*t1+3*x0)/Math.pow(t1,2),c=v0;return 3*a*Math.pow(t,2)+2*b*t+c}function mixCircle(from,to,progress,circle){let circleLength=circle[1]-circle[0];return from=circleValue(from,circle),to=circleValue(to,circle),to-from>circleLength/2?mixNumber(from+circleLength,to,progress):from-to>circleLength/2?mixNumber(from-circleLength,to,progress):mixNumber(from,to,progress)}function circleValue(value,circle){let rangeLength=circle[1]-circle[0];return value<circle[0]?circleValue(value+rangeLength,circle):value>=circle[1]?circleValue(value-rangeLength,circle):value}function mixValue(from,to,progress,circle){return circle?mixCircle(from,to,progress,circle):mixNumber(from,to,progress)}function toNumber(num){let value=Number(num);return isNaN(value)||!isFinite(value)?0:value}var Motion=class{constructor(initalValue){this.config={},this.progress=1,this.ended=!0,this.value={},this.startTime=require_memoryUsage.p(),this.startVelocity=0,this.duration=0,this.keyframes=[];for(let name in initalValue){let content=initalValue[name];typeof content==`object`?(this.value[name]=toNumber(content.value),this.config[name]={circle:content.circle}):(this.value[name]=toNumber(content),this.config[name]={circle:!1})}this.keyframes=[{progress:0,value:Object.assign({},this.value)},{progress:1,value:Object.assign({},this.value)}]}getProgress(time){let deltaTime=time-this.startTime;return deltaTime<0?0:deltaTime>=this.duration?1:1-value(1,this.startVelocity,this.duration,deltaTime)}getValue(progress){for(let i=1;i<this.keyframes.length;i++)if(this.keyframes[i].progress>progress){let prev=this.keyframes[i-1],next=this.keyframes[i],value={};for(let name in this.config){let segmentProgress=(progress-prev.progress)/(next.progress-prev.progress);value[name]=mixValue(prev.value[name],next.value[name],segmentProgress,this.config[name].circle)}return value}return Object.assign({},this.keyframes[this.keyframes.length-1].value)}getProgressVelocity(time){let deltaTime=time-this.startTime;return deltaTime>=this.duration?0:velocity(1,this.startVelocity,this.duration,deltaTime)}update(time){return this.ended?!0:(this.progress=Math.min(1,Math.max(0,this.progress,this.getProgress(time))),this.value=this.getValue(this.progress),this.ended=this.progress>=1,this.ended&&this.callbacks&&(this.callbacks[0](),this.callbacks=void 0),this.ended)}getKeyFrameSegment(time){let progress=this.getProgress(time);for(let i=1;i<this.keyframes.length;i++)if(this.keyframes[i].progress>progress)return[this.keyframes[i-1],this.keyframes[i]];return[this.keyframes[this.keyframes.length-2],this.keyframes[this.keyframes.length-1]]}getTargetKeyframe(){return this.keyframes[this.keyframes.length-1]}set(value,duration,startProgressVelocity=0,time){var _a;isNaN(duration)&&(duration=0),isNaN(startProgressVelocity)&&(startProgressVelocity=0),time=time==null?require_memoryUsage.p():time;let currentProgress=this.getProgress(time),currentValue=this.getValue(currentProgress),targetValue={};for(let name in this.config)targetValue[name]=(_a=value[name])==null?currentValue[name]:_a;let keyframes=[{progress:0,value:currentValue},{progress:1,value:targetValue}];return this.setKeyframes(keyframes,duration,startProgressVelocity,time)}setKeyframes(keyframes,duration,startProgressVelocity=0,time){if(keyframes.length<2)throw Error(`keyframes invalid.`);return isNaN(duration)&&(duration=0),isNaN(startProgressVelocity)&&(startProgressVelocity=0),this.callbacks&&(this.callbacks[1](Error(`motion aborted.`)),this.callbacks=void 0),new Promise((resolve,reject)=>{time=time==null?require_memoryUsage.p():time,this.progress=0,this.ended=!1,this.startTime=time,this.startVelocity=startProgressVelocity,this.keyframes=keyframes,this.duration=duration,duration===0?(this.progress=1,this.value=Object.assign({},keyframes[keyframes.length-1].value)):this.value=Object.assign({},keyframes[0].value),this.callbacks=[resolve,reject]})}dispose(){this.callbacks&&(this.callbacks[1](Error(`motion dispose.`)),this.callbacks=void 0)}},PI$6=Math.PI;2*PI$6/3,2*PI$6/4.5;var linear=function(x){return x},easeInCubic=function(x){return x*x*x},easeInQuart=function(x){return x*x*x*x},APPEAR_ANIMATION_DURATION=500,versionMap$1=new WeakMap,scratchIntersectPoint=new three_webgpu.Vector3,scratchClippingBoxMatrixInverse=new three_webgpu.Matrix4,TileNode=class TileNode extends three_webgpu.Object3D{constructor(name,contentObject,animations,disposer=require_memoryUsage.d){super(),this.clippers=[],this.name=name,this.materials=[],this.pbmObjects=[],this.contentObject=contentObject,this.animations=animations,this.appearMotion=new Motion({appear:0}),this.disposers=[disposer],this.add(contentObject),contentObject.traverse(object=>{if(object instanceof three_webgpu.Mesh||object instanceof three_webgpu.Points){let material=object.material;if(Array.isArray(material))for(let i=0;i<material.length;i++)this.materials.push(material[i]);else this.materials.push(material)}(object instanceof require_pbmMeshMaterial.o||object instanceof require_pbmMeshMaterial.s)&&this.pbmObjects.push(object),object instanceof require_memoryUsage.m&&this.pbmObjects.push(object),object instanceof require_pbmGaussianSplattingObject.t&&this.pbmObjects.push(object)})}generateBvhTree(){return generateBvhTree(this,!0,200,20)}intersectRaycaster(raycaster,target){let intersects=target==null?[]:target,hitFilter=raycaster.hitFilter;raycaster.hitFilter=intersect=>{if(intersect.object instanceof require_memoryUsage.m&&intersect.object.pointBack===`HIDDEN`&&intersect.face&&intersect.face.normal.angleTo(raycaster.ray.direction)<Math.PI/2)return!1;let floorIndex=0,shownFloorIndex=-1;if((intersect.object instanceof require_pbmMeshMaterial.o||intersect.object instanceof require_pbmMeshMaterial.s)&&intersect.face){let material=Array.isArray(intersect.object.material)?intersect.object.material[intersect.face.materialIndex]:intersect.object.material;if(material){floorIndex=material.floorIndex,shownFloorIndex=material.shownFloorIndex;for(let clipper of this.clippers)if(!(typeof clipper.floorIndex==`number`&&clipper.floorIndex!==floorIndex)&&(scratchClippingBoxMatrixInverse.copy(clipper.clippingBoxMatrix).invert(),scratchIntersectPoint.copy(intersect.point).applyMatrix4(scratchClippingBoxMatrixInverse),Math.abs(scratchIntersectPoint.x)<.5&&Math.abs(scratchIntersectPoint.y)<.5&&Math.abs(scratchIntersectPoint.z)<.5))return!1}}if(intersect.object instanceof require_memoryUsage.m){floorIndex=intersect.object.floorIndex,shownFloorIndex=intersect.object.shownFloorIndex;for(let clipper of this.clippers)if(!(typeof clipper.floorIndex==`number`&&clipper.floorIndex!==floorIndex)&&(scratchClippingBoxMatrixInverse.copy(clipper.clippingBoxMatrix).invert(),scratchIntersectPoint.copy(intersect.point).applyMatrix4(scratchClippingBoxMatrixInverse),Math.abs(scratchIntersectPoint.x)<.5&&Math.abs(scratchIntersectPoint.y)<.5&&Math.abs(scratchIntersectPoint.z)<.5))return!1}let selectedFloorIndex=shownFloorIndex;return raycaster.floorIndex===void 0?raycaster.floor!==void 0&&(selectedFloorIndex=raycaster.floor===null?-1:raycaster.floor):selectedFloorIndex=raycaster.floorIndex,selectedFloorIndex>=0&&floorIndex!==selectedFloorIndex?!1:(Object.assign(intersect,{floorIndex,floor:floorIndex}),hitFilter?hitFilter.call(raycaster,intersect):!0)};let stack=this.children.slice(),object;for(;object=stack.pop();)if(object.visible){object.raycast(raycaster,intersects);for(let i=0,l=object.children.length;i<l;i++)stack.push(object.children[i])}return raycaster.hitFilter=hitFilter,sortIntersects(intersects,raycaster.sortByDistance,raycaster.firstHitOnly),intersects}update(renderer,camera,modelScene,tile3d,tile,parameterValue){let needsRender=!1;tile3d.visible&&tile.state.selectedFrameNumber===tile.tileset.frameNumber?this.appearMotion.getTargetKeyframe().value.appear!==1&&this.appearMotion.set({appear:1},APPEAR_ANIMATION_DURATION).catch(require_memoryUsage.d):this.appearMotion.getTargetKeyframe().value.appear!==0&&this.appearMotion.set({appear:0},0).catch(require_memoryUsage.d),this.appearMotion.ended!==!0&&this.appearMotion.update(camera.time),this.clippers=parameterValue.clippers;for(let pbmObject of this.pbmObjects)pbmObject instanceof require_pbmMeshMaterial.o||pbmObject instanceof require_pbmMeshMaterial.s?updatePBMMesh(pbmObject,this.appearMotion,renderer,camera,modelScene,tile,parameterValue)===!0&&(needsRender=!0):pbmObject instanceof require_memoryUsage.m?updatePBMPointCloud(pbmObject,this.appearMotion,renderer,camera,modelScene,tile,parameterValue)===!0&&(needsRender=!0):pbmObject instanceof require_pbmGaussianSplattingObject.t&&updatePBMGaussianSplattingObject(pbmObject,this.appearMotion,renderer,camera,modelScene,tile,parameterValue)===!0&&(needsRender=!0);return needsRender}dispose(){for(let disposer of this.disposers)disposer();this.disposers.length=0,this.pbmObjects.length=0}clone(){return new TileNode(this.name,this.contentObject.clone(),this.animations)}};function updatePBMMesh(mesh,appearMotion,renderer,camera,modelScene,tile,parameterValue){let needsRender=!1;versionMap$1.get(mesh)!==parameterValue.versionNumber&&(versionMap$1.set(mesh,parameterValue.versionNumber),needsRender=!0,mesh.castShadow=parameterValue.castShadow,mesh.receiveShadow=parameterValue.receiveShadow);let materials=mesh.material;for(let material of materials)require_memoryUsage.D(material)&&require_memoryUsage.C(material,parameterValue);return needsRender}function updatePBMPointCloud(pointCloud,appearMotion,_renderer,_camera,_modelScene,tile,parameterValue){var _a,_b;let needsRender=!1;if(parameterValue.pointAppearAnimation===!0&&tile.refine===`ADD`&&tile.tileset.rootMeta.pntsOrder===`RANDOM`){let maxScreenSpaceError=tile.tileset.currentMaxScreenSpaceError,screenSpaceError=tile.state.screenSpaceError,parentScreenSpaceError=(_b=(_a=tile.parent)==null?void 0:_a.state.screenSpaceError)==null?screenSpaceError:_b,progress=1;parentScreenSpaceError!==screenSpaceError&&(progress=(parentScreenSpaceError-maxScreenSpaceError)/(parentScreenSpaceError-screenSpaceError)),progress=require_memoryUsage.M(progress,0,1),progress=easeInCubic(progress);let drawCount=Math.floor(pointCloud.pointCount*progress*appearMotion.value.appear);pointCloud.visiblePointCount!==drawCount&&(pointCloud.visiblePointCount=drawCount,needsRender=!0)}return versionMap$1.get(pointCloud)!==parameterValue.versionNumber&&(versionMap$1.set(pointCloud,parameterValue.versionNumber),needsRender=!0,pointCloud.castShadow=parameterValue.castShadow,pointCloud.receiveShadow=parameterValue.receiveShadow,pointCloud.visible=parameterValue.modelAlpha>0,pointCloud.pointScale=parameterValue.pointScale,pointCloud.pointMinPixel=parameterValue.pointMinPixel,pointCloud.pointMaxPixel=parameterValue.pointMaxPixel,pointCloud.pointSize=parameterValue.pointSize,pointCloud.pointShape=parameterValue.pointShape,pointCloud.pointBack=parameterValue.pointBack,pointCloud.maxDisplayBoost=parameterValue.maxDisplayBoost,pointCloud.opacity=parameterValue.opacity,pointCloud.modelAlpha=parameterValue.modelAlpha,pointCloud.brightness=parameterValue.brightness,pointCloud.floorStyle=parameterValue.floorStyle,pointCloud.shownFloorIndex=parameterValue.shownFloorIndex,pointCloud.colorStyle=parameterValue.colorStyle,pointCloud.constantColor.copy(parameterValue.constantColor),pointCloud.colorSaturation=parameterValue.colorSaturation,pointCloud.colorBrightness=parameterValue.colorBrightness,pointCloud.outlineGain=parameterValue.outlineGain,pointCloud.distanceGain=parameterValue.distanceGain,pointCloud.useAddBlend=parameterValue.useAddBlend,pointCloud.gradientTexture=parameterValue.gradientTexture,pointCloud.clippers=parameterValue.clippers,pointCloud.modelBoundingMin.copy(parameterValue.boundingBox.min),pointCloud.modelBoundingMax.copy(parameterValue.boundingBox.max),pointCloud.styleRevision++,require_memoryUsage.C(pointCloud.material,parameterValue)),needsRender}function normalizeSHDegree(value){return Number.isFinite(value)?Math.min(Math.max(Math.floor(value),0),2):0}function updatePBMGaussianSplattingObject(splat,appearMotion,renderer,camera,modelScene,tile,parameterValue){let needsRender=!1;splat.updateMatrix(),splat.updateMatrixWorld();let shDegree=normalizeSHDegree(parameterValue.gaussianSplattingSHDegree);return splat.usedSHDegree!==shDegree&&(splat.usedSHDegree=shDegree,needsRender=!0),splat.initAnimationEnabled!==parameterValue.enableGaussianSplattingInitAnimation&&(splat.initAnimationEnabled=parameterValue.enableGaussianSplattingInitAnimation,needsRender=!0),splat.lastMatrixWorld?splat.transformChanged=!splat.lastMatrixWorld.equals(splat.matrixWorld):(splat.lastMatrixWorld=new three_webgpu.Matrix4,splat.transformChanged=!0,needsRender=!0),splat.lastMatrixWorld.copy(splat.matrixWorld),splat.transformChanged&&(needsRender=!0),needsRender}var Trajectory=class{constructor(id,header,tileset){this.id=id,this.name=header.name,this.visible=!1,this.tileset=tileset,this.transform=new three_webgpu.Matrix4,header.transform&&this.transform.fromArray(header.transform),this.transform.premultiply(this.tileset.root.transform),this.content={uri:header.file,byteLength:0,memoryUsage:0,loadState:`UNLOADED`,loadProgress:0,loadStateUpdateTime:require_memoryUsage.p(),loadfailRetryDelay:0,data:void 0}}},TrajectoryNode=class TrajectoryNode extends three_webgpu.Object3D{constructor(name,contentObject,disposer=require_memoryUsage.d){super(),this.name=name,this.contentObject=contentObject,this.name=name,this.add(contentObject),this.disposers=[disposer]}update(renderer,camera,modelScene,tile3d,trajectory,parameterValue){let material=this.contentObject.material[2];return material.uniforms.dashOffset.value=(material.uniforms.dashOffset.value-.003)%(material.uniforms.dashSize.value.x+material.uniforms.dashSize.value.y),!0}dispose(){for(let disposer of this.disposers)disposer();this.disposers.length=0}clone(){return new TrajectoryNode(this.name,this.contentObject.clone())}},priorityCache=new Map;function getPriority(frameState,tile,cache){if(cache&&cache.has(tile))return cache.get(tile);let maySkipTile=tile.refine===`ADD`||frameState.skipLevelOfDetail,parent=tile.parent,screenSpaceError=parent&&(!maySkipTile||tile.state.screenSpaceError===0)?parent.state.screenSpaceError:tile.state.screenSpaceError,rootScreenSpaceError=tile.tileset.root?tile.tileset.root.state.screenSpaceError:0,priority=Math.max(rootScreenSpaceError-screenSpaceError,0);return cache&&cache.set(tile,priority),priority}var TileRequestScheduler=class{constructor(tileset,options){this.tileset=tileset,this.options=options,this.activeRequests=0,this.requestQueue=[]}reset(){for(let item of this.requestQueue)this.options.onTileSkip&&(item.tile.content&&this.tileset.options.tileUnloader(item.tile),this.options.onTileSkip(item.tile));this.requestQueue.length=0}update(requestTiles,order,frameState){let currentTime=frameState.time,requestQueue=this.requestQueue,set=new Set(requestTiles);for(let i=0;i<requestQueue.length;i++){let requestItem=requestQueue[i];if(set.has(requestItem.tile)){set.delete(requestItem.tile);continue}requestItem.status===`WAITING`&&(requestQueue.splice(i,1),i--,this.options.onTileSkip&&this.options.onTileSkip(requestItem.tile))}set.size>0&&(set.forEach(tile=>{requestQueue.push({tile,status:`WAITING`,time:currentTime,error:null})}),set.clear());let freeSlots=frameState.maxRequests;for(let i=0;i<requestQueue.length&&freeSlots>0;i++){let requestItem=requestQueue[i];if(requestItem.status===`DONE`)requestItem.error===null?(freeSlots--,requestItem.tile.content&&(requestItem.tile.content.loadState=`READY`),this.options.onTileLoad&&this.options.onTileLoad(requestItem.tile)):this.options.onTileError&&this.options.onTileError(requestItem.tile,requestItem.error),requestQueue.splice(i,1),i--;else if(requestItem.status===`PENDING`&¤tTime-requestItem.time<1e3)break}switch(priorityCache.clear(),order){case`SCREEN_SPACE_ERROR`:requestQueue.sort((a,b)=>a.tile.state.requestedFrameNumber===b.tile.state.requestedFrameNumber?a.tile.state.requestedFrameNumber===frameState.frameNumber?getPriority(frameState,a.tile,priorityCache)-getPriority(frameState,b.tile,priorityCache):a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:b.tile.state.requestedFrameNumber-a.tile.state.requestedFrameNumber);break;case`SCREEN_VERTICAL`:requestQueue.sort((a,b)=>a.tile.state.requestedFrameNumber===b.tile.state.requestedFrameNumber?a.tile.state.requestedFrameNumber===frameState.frameNumber?a.tile.state.centerScreenY===b.tile.state.centerScreenY?a.tile.state.centerZDepth===b.tile.state.centerZDepth?a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:a.tile.state.centerZDepth-b.tile.state.centerZDepth:a.tile.state.centerScreenY-b.tile.state.centerScreenY:a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:b.tile.state.requestedFrameNumber-a.tile.state.requestedFrameNumber);break;case`SCREEN_LEVEL_VERTICAL`:requestQueue.sort((a,b)=>a.tile.state.requestedFrameNumber===b.tile.state.requestedFrameNumber?a.tile.state.requestedFrameNumber===frameState.frameNumber?a.tile.level===b.tile.level?a.tile.state.centerScreenY===b.tile.state.centerScreenY?a.tile.state.centerZDepth===b.tile.state.centerZDepth?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.state.centerZDepth-b.tile.state.centerZDepth:a.tile.state.centerScreenY-b.tile.state.centerScreenY:a.tile.level-b.tile.level:a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:b.tile.state.requestedFrameNumber-a.tile.state.requestedFrameNumber);break;default:break}if(freeSlots=Math.max(frameState.maxRequests-this.activeRequests,0),!frameState.skipLevelOfDetail){let insertIndex=0,length=requestQueue.length;for(let i=0;i<length;i++){let tile=requestQueue[i].tile;if(tile.hasTilesetContent||tile.contentParent===null||tile.contentParent.state.selectedFrameNumber===frameState.frameNumber){let removed=requestQueue.splice(i,1);requestQueue.splice(insertIndex++,0,...removed)}}}for(let i=0;i<requestQueue.length&&freeSlots>0;i++){let requestItem=requestQueue[i];requestItem.status===`WAITING`&&(freeSlots--,requestItem.status=`PENDING`,requestItem.time=currentTime,this.activeRequests++,this.tileset.options.tileLoader(requestItem.tile).catch(error=>{requestItem.error=error}).then(()=>{requestItem.status=`DONE`,requestItem.tile.content&&requestItem.tile.content.loadState===`READY`&&(requestItem.tile.content.loadState=`LOADING`),this.activeRequests--}))}}},CacheNode=class{constructor(item,previous,next){this.item=item,this.previous=previous,this.next=next}},CacheNodeList=class{constructor(){this.head=null,this.tail=null,this._length=0}get length(){return this._length}add(item){let node=new CacheNode(item,this.tail,null);return this.tail?(this.tail.next=node,this.tail=node):(this.head=node,this.tail=node),this._length++,node}remove(node){node.previous&&node.next?(node.previous.next=node.next,node.next.previous=node.previous):node.previous?(node.previous.next=null,this.tail=node.previous):node.next?(node.next.previous=null,this.head=node.next):(this.head=null,this.tail=null),node.next=null,node.previous=null,this._length--}splice(node,nextNode){node!==nextNode&&(this.remove(nextNode),this.insert(node,nextNode))}insert(node,nextNode){let oldNodeNext=node.next;node.next=nextNode,this.tail===node?this.tail=nextNode:oldNodeNext.previous=nextNode,nextNode.next=oldNodeNext,nextNode.previous=node,this._length++}toArray(){let array=[],current=this.head;for(;current;)array.push(current),current=current.next;return array}},TileCache=class{constructor(options={}){this.options=options,this.cacheNodeMap=new WeakMap,this.list=new CacheNodeList,this.sentinel=this.list.add(`sentinel`)}reset(){this.list.tail&&this.list.splice(this.list.tail,this.sentinel)}touchTile(tile){let node=this.cacheNodeMap.get(tile);node&&this.list.splice(this.sentinel,node)}loadTile(tile){if(!this.cacheNodeMap.has(tile)){let cacheNode=this.list.add(tile);this.cacheNodeMap.set(tile,cacheNode),this.options.onTileLoad&&this.options.onTileLoad(tile)}}unloadTile(tile){let node=this.cacheNodeMap.get(tile);node&&(this.list.remove(node),this.cacheNodeMap.delete(tile),this.options.onTileUnload&&this.options.onTileUnload(tile))}unloadTiles(isOverMemory){let node=this.list.head;for(;node!==this.sentinel&&isOverMemory();){let tile=node.item;node=node.next,this.unloadTile(tile)}}toArray(){let array=[];for(let item of this.list.toArray())item.item!==`sentinel`&&array.push(item.item);return array}},ManagedArray=class{constructor(){this.map=new Map,this.array=[],this._length=0}get length(){return this._length}get(index){return this.array[index]}set(index,element){index>=this.length&&(this._length=index+1),this.map.has(this.array[index])&&this.map.delete(this.array[index]),this.array[index]=element,this.map.set(element,index)}delete(element){let index=this.map.get(element);index!==void 0&&index>=0&&(this.array.splice(index,1),this.map.delete(element),this._length--)}push(element){if(!this.map.has(element)){let index=this._length++;this.array[index]=element,this.map.set(element,index)}}pop(){let element=this.array[--this._length];return this.map.delete(element),this.array[this._length]=void 0,element}reset(){this.array=[],this.map=new Map,this._length=0}find(target){return this.map.has(target)}peek(){return this.array[this._length-1]}},TilesetBaseTraverser=class{constructor(tileset){this.tileset=tileset,this._canSelectTile=!0,this._loadAllTilesTraversalStack=new ManagedArray}traverse(root,frameState,cacheFrameStates=[]){this.reset()}reset(){this._loadAllTilesTraversalStack.reset(),this.tileset.hasMixedContent=!1,this.tileset.needsRefinedTiles.clear(),this.tileset.requestedTiles.length=0,this.tileset.selectedTiles.length=0}updateTile(tile,frameState){this.updateTileVisibility(tile,frameState),tile.state.shouldSelect=!1,tile.state.finalResolution=!0}selectTile(tile,frameState){this._canSelectTile&&tile.contentAvailable&&tile.state.selectedFrameNumber<frameState.frameNumber&&(tile.state.selectedFrameNumber=frameState.frameNumber,this.tileset.selectedTiles.push(tile),this.tileset.needsRefinedTiles.add(tile))}loadTile(tile,frameState){this._canSelectTile&&(tile.state.requestedFrameNumber<frameState.frameNumber&&(tile.state.requestedFrameNumber=frameState.frameNumber,tile.content&&(tile.content.loadState===`FAILED`&&frameState.time-tile.content.loadStateUpdateTime>tile.content.loadfailRetryDelay&&(tile.content.loadState=`UNLOADED`,tile.content.loadProgress=0,tile.content.loadStateUpdateTime=frameState.time),tile.content.loadState===`UNLOADED`&&this.tileset.requestedTiles.push(tile))),this.tileset.needsRefinedTiles.add(tile))}touchTile(tile,frameState){this._canSelectTile&&(this.tileset.cache.touchTile(tile),tile.state.touchedFrameNumber=frameState.frameNumber)}canTraverse(tile,frameState){return!tile.state.inRequestVolume||tile.hasRenderContent&&(tile.levelOfContent>=frameState.maxLevelOfDetail||tile.levelOfContent>=0&&tile.geometricError<=frameState.minGeometricError)||tile.children.length===0?!1:tile.levelOfContent<frameState.minLevelOfDetail||tile.geometricError>=frameState.maxGeometricError||tile.hasTilesetContent?!0:tile.state.screenSpaceError>this.tileset.currentMaxScreenSpaceError}updateTileVisibility(tile,frameState){if(tile.updateState(frameState),!tile.state.visible||!tile.state.inRequestVolume)return;let hasChildren=tile.children.length>0;if(tile.hasTilesetContent&&hasChildren){let firstChild=tile.children[0];this.updateTileVisibility(firstChild,frameState),tile.state.visible=firstChild.state.visible;return}if(this.meetsScreenSpaceErrorEarly(tile,frameState)){tile.state.visible=!1;return}if(tile.refine===`REPLACE`&&hasChildren&&!this.anyChildrenVisible(tile,frameState)){tile.state.visible=!1;return}}anyChildrenVisible(tile,frameState){let anyVisible=!1,children=tile.children;for(let child of children)child.updateState(frameState),anyVisible=anyVisible||child.state.visible;return anyVisible}meetsScreenSpaceErrorEarly(tile,frameState){let{parent}=tile;return!parent||parent.refine!==`ADD`||parent.levelOfContent<frameState.minLevelOfDetail||parent.geometricError>frameState.maxGeometricError?!1:parent.levelOfContent>frameState.maxLevelOfDetail||parent.levelOfContent>=0&&parent.geometricError<frameState.minGeometricError?!0:tile.getScreenSpaceError(frameState,tile.state.distanceToCamera,!0)<this.tileset.currentMaxScreenSpaceError}sortTilesByDistanceToCamera(tiles){tiles.sort((a,b)=>b.state.distanceToCamera===0&&a.state.distanceToCamera===0?b.state.centerZDepth-a.state.centerZDepth:b.state.distanceToCamera-a.state.distanceToCamera)}},TilesetNormalTraverser=class extends TilesetBaseTraverser{constructor(tileset){super(tileset),this._traversalStack=new ManagedArray,this._emptyTraversalStack=new ManagedArray}traverse(root,frameState,cacheFrameStates=[]){super.traverse(root,frameState,cacheFrameStates);for(let frameState of cacheFrameStates)this._traversalStack.reset(),this._emptyTraversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState));this._traversalStack.reset(),this._emptyTraversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState))}reset(){super.reset(),this._traversalStack.reset(),this._emptyTraversalStack.reset()}executeTraversal(root,frameState){let stack=this._traversalStack;for(root.state.visible&&root.state.inRequestVolume&&stack.push(root);stack.length>0;){let tile=stack.pop(),parent=tile.parent,parentRefines=!parent||parent.state.shouldRefine,shouldRefine=!1;this.canTraverse(tile,frameState)&&(shouldRefine=this.updateAndPushChildren(tile,frameState,stack)&&parentRefines);let stoppedRefining=!shouldRefine&&parentRefines;tile.hasRenderContent?tile.refine===`ADD`?(this.loadTile(tile,frameState),this.selectDesiredTile(tile,frameState)):tile.refine===`REPLACE`&&(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)):(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)),this.touchTile(tile,frameState),tile.state.shouldRefine=shouldRefine}}updateAndPushChildren(tile,frameState,stack){let children=tile.children;for(let child of children)this.updateTile(child,frameState);this.sortTilesByDistanceToCamera(children);let checkRefines=tile.refine===`REPLACE`&&tile.hasRenderContent,hasVisibleChild=!1,refines=!0;for(let child of children)if(child.levelOfContent<=frameState.minLevelOfDetail||child.geometricError>=frameState.maxGeometricError||child.state.visible&&child.state.inRequestVolume?(stack.find(child)&&stack.delete(child),stack.push(child),hasVisibleChild===!1&&(hasVisibleChild=!0)):(checkRefines||frameState.loadSiblings)&&(this.loadTile(child,frameState),this.touchTile(child,frameState)),checkRefines){let childRefines;childRefines=child.state.inRequestVolume?child.hasRenderContent?child.contentAvailable:this.executeEmptyTraversal(child,frameState):!1,refines=refines&&childRefines}return hasVisibleChild||(refines=!1),refines}selectDesiredTile(tile,frameState){tile.contentAvailable&&super.selectTile(tile,frameState)}executeEmptyTraversal(root,frameState){let allDescendantsLoaded=!0,stack=this._emptyTraversalStack;for(stack.push(root);stack.length>0&&allDescendantsLoaded;){let tile=stack.pop(),traverse=!tile.hasRenderContent&&this.canTraverse(tile,frameState);if(!traverse&&!tile.contentAvailable&&(allDescendantsLoaded=!1),this.updateTile(tile,frameState),tile.state.visible||(this.loadTile(tile,frameState),this.touchTile(tile,frameState)),traverse){let children=tile.children;for(let child of children)stack.find(child)&&stack.delete(child),stack.push(child)}}return allDescendantsLoaded}},TilesetSkipTraverser=class extends TilesetBaseTraverser{constructor(tileset){super(tileset),this.baseScreenSpaceError=1024,this.skipScreenSpaceErrorFactor=16,this.skipLevels=1,this._traversalStack=new ManagedArray,this._descendantTraversalStack=new ManagedArray,this._selectionTraversalStack=new ManagedArray,this._selectionTraversalancestorStack=new ManagedArray}traverse(root,frameState,cacheFrameStates=[]){super.traverse(root,frameState,cacheFrameStates);for(let frameState of cacheFrameStates)this._traversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState),this.traverseAndSelect(root,frameState));this.tileset.hasMixedContent=!1,this._traversalStack.reset(),this._descendantTraversalStack.reset(),this._selectionTraversalStack.reset(),this._selectionTraversalancestorStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState),this.traverseAndSelect(root,frameState))}reset(){super.reset(),this._traversalStack.reset(),this._descendantTraversalStack.reset(),this._selectionTraversalStack.reset(),this._selectionTraversalancestorStack.reset()}executeTraversal(root,frameState){let stack=this._traversalStack;for(root.state.visible&&root.state.inRequestVolume&&stack.push(root);stack.length>0;){let tile=stack.pop();this.updateTileAncestorContentLinks(tile,frameState);let parent=tile.parent,parentRefines=!parent||parent.state.shouldRefine,shouldRefine=!1;this.canTraverse(tile,frameState)&&(shouldRefine=this.updateAndPushChildren(tile,frameState,stack)&&parentRefines);let stoppedRefining=!shouldRefine&&parentRefines;tile.hasRenderContent?tile.refine===`ADD`?(this.loadTile(tile,frameState),this.selectDesiredTile(tile,frameState)):tile.refine===`REPLACE`&&(this.inBaseTraversal(tile,this.baseScreenSpaceError)?(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)):stoppedRefining?(this.loadTile(tile,frameState),this.selectDesiredTile(tile,frameState)):this.reachedSkippingThreshold(tile)&&this.loadTile(tile,frameState)):(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)),this.touchTile(tile,frameState),tile.state.shouldRefine=shouldRefine}}updateAndPushChildren(tile,frameState,stack){let children=tile.children;for(let child of children)this.updateTile(child,frameState);this.sortTilesByDistanceToCamera(children);let hasVisibleChild=!1;for(let child of children)child.levelOfContent<=frameState.minLevelOfDetail||child.geometricError>=frameState.maxGeometricError||child.state.visible&&child.state.inRequestVolume?(stack.push(child),hasVisibleChild===!1&&(hasVisibleChild=!0)):frameState.loadSiblings&&(this.loadTile(child,frameState),this.touchTile(child,frameState));return hasVisibleChild}selectDesiredTile(tile,frameState){let loadedTile=tile.contentAvailable?tile:tile.state.ancestorWithContentAvailable;loadedTile&&(loadedTile.state.shouldSelect=!0),tile.contentAvailable||this.selectDescendants(tile,frameState)}selectDescendants(tile,frameState){let stack=this._descendantTraversalStack;for(stack.push(tile);stack.length>0;){let children=stack.pop().children;for(let child of children)child.state.visible&&(child.contentAvailable?(this.updateTile(child,frameState),this.touchTile(child,frameState),this.selectTile(child,frameState)):stack.push(child))}}reachedSkippingThreshold(tile){let ancestor=tile.state.ancestorWithContent;return ancestor!==null&&tile.state.screenSpaceError<ancestor.state.screenSpaceError/this.skipScreenSpaceErrorFactor&&tile.levelOfContent>ancestor.levelOfContent+this.skipLevels}updateTileAncestorContentLinks(tile,frameState){tile.state.ancestorWithContent=null,tile.state.ancestorWithContentAvailable=null;let{parent}=tile;if(!parent)return;let parentHasContent=!(parent.hasRenderContent&&parent.hasUnloadedContent)||parent.state.requestedFrameNumber===frameState.frameNumber;tile.state.ancestorWithContent=parentHasContent?parent:parent.state.ancestorWithContent,tile.state.ancestorWithContentAvailable=parent.contentAvailable?parent:parent.state.ancestorWithContentAvailable}inBaseTraversal(tile,baseScreenSpaceError){return tile.state.ancestorWithContent?tile.parent&&tile.state.screenSpaceError===0?tile.parent.state.screenSpaceError>baseScreenSpaceError:tile.state.screenSpaceError>baseScreenSpaceError:!0}traverseAndSelect(root,frameState){let stack=this._selectionTraversalStack,ancestorStack=this._selectionTraversalancestorStack,lastAncestor;for(stack.push(root);stack.length>0||ancestorStack.length>0;){if(ancestorStack.length>0){let waitingTile=ancestorStack.peek();if(waitingTile.state.stackLength===stack.length){ancestorStack.pop(),waitingTile!==lastAncestor&&(waitingTile.state.finalResolution=!1),this.selectTile(waitingTile,frameState);continue}}let tile=stack.pop();if(!tile)continue;let traverse=this.canTraverse(tile,frameState);if(tile.state.shouldSelect)if(tile.refine===`ADD`)this.selectTile(tile,frameState);else{if(tile.state.selectionDepth=ancestorStack.length,tile.state.selectionDepth>0&&(tile.tileset.hasMixedContent=!0),lastAncestor=tile,!traverse){this.selectTile(tile,frameState);continue}ancestorStack.push(tile),tile.state.stackLength=stack.length}if(traverse)for(let child of tile.children)child.state.visible&&stack.push(child)}}},TilesetMostDetailTraverser=class extends TilesetBaseTraverser{constructor(tileset){super(tileset),this._traversalStack=new ManagedArray}canTraverse(tile,frameState){return!(!tile.state.inRequestVolume||tile.levelOfContent>=frameState.maxLevelOfDetail||tile.levelOfContent>=0&&tile.geometricError<=frameState.minGeometricError||tile.children.length===0)}traverse(root,frameState,cacheFrameStates){super.traverse(root,frameState,[]),this._traversalStack.reset(),root.updateState(frameState);for(let frameState of cacheFrameStates)this._traversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,root.updateState(frameState),this.executeTraversal(root,frameState));this._traversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,root.updateState(frameState),this.executeTraversal(root,frameState))}reset(){super.reset(),this._traversalStack.reset()}executeTraversal(root,frameState){let stack=this._traversalStack;for(stack.push(root);stack.length>0;){let tile=stack.pop(),add=tile.refine===`ADD`,replace=tile.refine===`REPLACE`,traverse=this.canTraverse(tile,frameState);traverse&&this.updateAndPushChildren(tile,frameState,stack),(add||replace&&!traverse)&&(this.loadTile(tile,frameState),this.touchTile(tile,frameState),this.selectDesiredTile(tile,frameState))}}updateAndPushChildren(tile,frameState,stack){let{children}=tile;for(let i=0;i<children.length;++i){let child=children[i];child.updateState(frameState),child.state.visible&&stack.push(child)}}selectDesiredTile(tile,frameState){tile.contentAvailable&&super.selectTile(tile,frameState)}},Tileset=class{constructor(header,options){var _a,_b,_c,_d,_e,_f,_g;if(this.id=header.tilesetUrl,this.transform=new three_webgpu.Matrix4,this.hasMixedContent=!1,this.frameNumber=0,this.maxAverageTileMemory=0,this.asset={version:header.asset.version,tilesetVersion:header.asset.tilesetVersion||``,gltfUpAxis:(_a=header.asset.gltfUpAxis)==null?`Y`:_a,overview:header.asset.overview,trajectories:(_c=(_b=header.asset.trajectories)==null?void 0:_b.list)==null?[]:_c,extras:header.asset.extras},this.rootMeta=(_d=header.rootMeta)==null?{}:_d,this.pointLength=(_e=this.rootMeta.numTotalPoints)==null?1/0:_e,this.floorLength=(_f=this.rootMeta.numFloors)==null?1:_f,this.properties=(_g=header.properties)==null?{}:_g,this.options=options,this.requestedTiles=[],this.selectedTiles=[],this.unloadTiles=[],this.needsRefinedTiles=new Set,this.selectedTrajectories=[],this.normalTraverser=new TilesetNormalTraverser(this),this.skipTraverser=new TilesetSkipTraverser(this),this.mostDetailTraverser=new TilesetMostDetailTraverser(this),this.cache=new TileCache({onTileLoad:tile=>{this.cacheMemoryUsageInBytes+=tile.contentMemoryUsage},onTileUnload:tile=>{this.cacheMemoryUsageInBytes-=tile.contentMemoryUsage,this.unloadTiles.push(tile)}}),this.requestScheduler=new TileRequestScheduler(this,{onTileSkip:tile=>{},onTileLoad:tile=>{var _a;(_a=tile.content)!=null&&_a.data&&(this.loadedTiles.add(tile),this.cache.loadTile(tile)),this.options.onTileLoad(tile)},onTileError:(tile,error)=>{this.options.onTileError(tile,error)}}),this.loadedTiles=new Set,this.cacheMemoryUsageInBytes=0,this.currentMaxScreenSpaceError=NaN,this.root=new Tile(`${this.id}#tile:0`,header.root,this),this.geometricError=header.geometricError,this.trajectories=[],this.asset.trajectories)for(let index=0;index<this.asset.trajectories.length;index++){let trajectory=new Trajectory(`${this.id}#trajectory:${index}`,this.asset.trajectories[index],this);this.trajectories.push(trajectory)}}adjustScreenSpaceError(frameState){if(frameState.frameNumber%20==0)if((isNaN(this.currentMaxScreenSpaceError)||!isFinite(this.currentMaxScreenSpaceError))&&(this.currentMaxScreenSpaceError=frameState.maxScreenSpaceError),frameState.memoryAdjustedScreenSpaceError){let memoryUsage=0,totalTile=0,loadedTile=0;if(this.needsRefinedTiles.forEach(tile=>{tile.content&&(totalTile++,memoryUsage+=tile.content.memoryUsage,tile.content.loadState===`READY`&&loadedTile++)}),loadedTile<2||totalTile<2)this.currentMaxScreenSpaceError=frameState.maxScreenSpaceError;else{let mbBytes=1024*1024,usageBytes=memoryUsage/loadedTile*totalTile,cacheByteLimit=frameState.maxMemoryUsage*mbBytes,cacheByte=cacheByteLimit-require_memoryUsage.M(cacheByteLimit*.2,32*mbBytes,128*mbBytes),currentMaxScreenSpaceError=this.currentMaxScreenSpaceError;if(usageBytes<cacheByte){let step=.3*Math.max(1-usageBytes/cacheByte,0);currentMaxScreenSpaceError-=step}else usageBytes>cacheByteLimit&&(currentMaxScreenSpaceError+=.15);currentMaxScreenSpaceError=require_memoryUsage.M(currentMaxScreenSpaceError,.5,frameState.maxScreenSpaceError),Math.abs(currentMaxScreenSpaceError-this.currentMaxScreenSpaceError)>=.1&&(this.currentMaxScreenSpaceError=currentMaxScreenSpaceError)}}else this.currentMaxScreenSpaceError=frameState.maxScreenSpaceError}getTraverser(frameState){return frameState.mostDetail?this.mostDetailTraverser:frameState.skipLevelOfDetail?this.skipTraverser:this.normalTraverser}reset(){this.cache.reset(),this.skipTraverser.reset(),this.normalTraverser.reset(),this.mostDetailTraverser.reset(),this.requestScheduler.reset();let stack=[this.root],tile;for(;tile=stack.pop();){for(let i=0,l=tile.children.length;i<l;i++)stack.push(tile.children[i]);this.cache.unloadTile(tile)}for(;this.unloadTiles.length;){let tile=this.unloadTiles.pop();tile&&(this.loadedTiles.delete(tile),this.cacheMemoryUsageInBytes-=tile.contentMemoryUsage,this.options.tileUnloader(tile).catch(()=>{}).then(()=>{this.options.onTileUnload&&this.options.onTileUnload(tile)}))}for(this.loadedTiles.clear();this.trajectories.length;){let trajectory=this.trajectories.pop();trajectory&&this.options.trajectoryUnloader(trajectory).catch(()=>{}).then(()=>{this.options.onTrajectoryUnload&&this.options.onTrajectoryUnload(trajectory)})}}update(frameState,cacheFrameStates=[]){var _a;for(this.frameNumber=frameState.frameNumber,this.adjustScreenSpaceError(frameState),this.cache.reset(),this.getTraverser(frameState).traverse(this.root,frameState,cacheFrameStates),this.cache.unloadTiles(()=>this.cacheMemoryUsageInBytes>frameState.maxMemoryUsage*1024*1024),this.requestScheduler.update(this.requestedTiles,frameState.requestOrder,frameState);this.unloadTiles.length;){let tile=this.unloadTiles.pop();tile&&(this.loadedTiles.delete(tile),this.options.tileUnloader(tile).catch(()=>{}).then(()=>{this.options.onTileUnload&&this.options.onTileUnload(tile)}))}this.selectedTrajectories.length=0;for(let trajectory of this.trajectories)trajectory.visible===!0&&trajectory.content.loadState===`READY`&&(_a=trajectory.content.data)!=null&&_a.object?this.selectedTrajectories.push(trajectory):trajectory.visible===!0&&(trajectory.content.loadState===`FAILED`&&frameState.time-trajectory.content.loadStateUpdateTime>trajectory.content.loadfailRetryDelay&&(trajectory.content.loadState=`UNLOADED`,trajectory.content.loadStateUpdateTime=frameState.time),trajectory.content.loadState===`UNLOADED`&&this.options.trajectoryLoader(trajectory).then(()=>{this.options.onTrajectoryLoad(trajectory)}).catch(error=>{this.options.onTrajectoryError(trajectory,error)}))}};function normalizeTileHeader(input,resourcePath){var _a;if(input.content){let uri=(_a=input.content.uri)==null?input.content.url:_a;typeof uri==`string`&&!require_imageBitmap.d(uri)&&(input.content.uri=require_imageBitmap.f(require_imageBitmap.p(resourcePath,uri)))}if(input.transform){let errored=!1;for(let i=0;i<16;i++){let value=input.transform[i];if(typeof value!=`number`||isNaN(value)||!isFinite(value)){errored=!0;break}}if(input.transform[15]===0&&(errored=!0),errored)throw Error(`Invalid Tile Transform: `+JSON.stringify(input.transform))}if(input.children)for(let child of input.children)normalizeTileHeader(child,resourcePath);return input}function normalizeTilesetHeader(input,tilesetUrl){input.tilesetUrl=tilesetUrl;let resourcePath=/^blob\:/.test(tilesetUrl)?``:tilesetUrl.slice(0,tilesetUrl.lastIndexOf(`/`)+1);if(input.asset||(input.asset={}),input.rootMeta||(input.rootMeta={}),input.rootMeta.taskParameters||(input.rootMeta.taskParameters={}),input.asset.overview){let overview=input.asset.overview;require_imageBitmap.d(overview.imageFile)||(overview.imageFile=require_imageBitmap.f(require_imageBitmap.p(resourcePath,overview.imageFile))),require_imageBitmap.d(overview.worldFile)||(overview.worldFile=require_imageBitmap.f(require_imageBitmap.p(resourcePath,overview.worldFile)))}if(input.asset.trajectories)for(let index=0;index<input.asset.trajectories.list.length;index++){let trajectory=input.asset.trajectories.list[index];trajectory.file=require_imageBitmap.f(require_imageBitmap.p(resourcePath,trajectory.file))}return normalizeTileHeader(input.root,resourcePath),input}function delay(timeout){return new Promise(resolve=>setTimeout(resolve,timeout))}var initTextureQueue=new class{constructor(concurrency){this.queue=[],this.concurrency=concurrency,this.dequeuing=0}add(task,timeout=1e3){let doneResolve,doneReject,promise=new Promise((resolve,reject)=>{doneResolve=resolve,doneReject=reject});return this.queue.unshift(()=>{let taskPomise=Promise.resolve().then(task);taskPomise.then(doneResolve,doneReject);let timeoutPromise=delay(timeout);return Promise.race([taskPomise,timeoutPromise]).then(require_memoryUsage.d,require_memoryUsage.d)}),this.dequeue(),promise}dequeue(){for(;this.dequeuing<this.concurrency&&this.queue.length>0;){let task=this.queue.pop();this.dequeuing++,task().catch(require_memoryUsage.d).then(()=>{this.dequeuing--,this.dequeue()})}}}(1),skipImageSize=256;function canInit(texture){let img=texture.image;return!!img&&img.width>0&&img.height>0}function initTexture(texture,renderer){if(!canInit(texture))return Promise.resolve(texture);let img=texture.image;if(img&&(img==null?void 0:img.width)<skipImageSize&&(img==null?void 0:img.width)<skipImageSize)return renderer.initTexture(texture),Promise.resolve(texture);let disposed=!1,onTextureDispose=()=>{disposed=!0,texture.removeEventListener(`dispose`,onTextureDispose)};return texture.addEventListener(`dispose`,onTextureDispose),initTextureQueue.add(()=>new Promise(resolve=>{require_imageBitmap.s.shared.add(()=>{canInit(texture)&&disposed===!1&&renderer.initTexture(texture),texture.removeEventListener(`dispose`,onTextureDispose),resolve(texture)},!0)}))}function initTextures(textures,renderer){return Promise.all(textures.map(texture=>initTexture(texture,renderer)))}var SIZEOF_UINT32$1=4;function parseHeader(data,arrayBuffer,byteOffset){let view=new DataView(arrayBuffer);if(data.magic=view.getUint32(byteOffset,!0),byteOffset+=SIZEOF_UINT32$1,data.version=view.getUint32(byteOffset,!0),byteOffset+=SIZEOF_UINT32$1,data.byteLength=view.getUint32(byteOffset,!0),byteOffset+=SIZEOF_UINT32$1,data.version!==1)throw Error(`3D Tile Version ${data.version} not supported`);return byteOffset}var GL_TYPE;(function(GL_TYPE){GL_TYPE[GL_TYPE.BYTE=5120]=`BYTE`,GL_TYPE[GL_TYPE.UNSIGNED_BYTE=5121]=`UNSIGNED_BYTE`,GL_TYPE[GL_TYPE.SHORT=5122]=`SHORT`,GL_TYPE[GL_TYPE.UNSIGNED_SHORT=5123]=`UNSIGNED_SHORT`,GL_TYPE[GL_TYPE.INT=5124]=`INT`,GL_TYPE[GL_TYPE.UNSIGNED_INT=5125]=`UNSIGNED_INT`,GL_TYPE[GL_TYPE.FLOAT=5126]=`FLOAT`,GL_TYPE[GL_TYPE.DOUBLE=5130]=`DOUBLE`})(GL_TYPE||(GL_TYPE={}));var GL_TYPE_TO_ARRAY_TYPE={[GL_TYPE.DOUBLE]:Float64Array,[GL_TYPE.FLOAT]:Float32Array,[GL_TYPE.UNSIGNED_SHORT]:Uint16Array,[GL_TYPE.UNSIGNED_INT]:Uint32Array,[GL_TYPE.UNSIGNED_BYTE]:Uint8Array,[GL_TYPE.BYTE]:Int8Array,[GL_TYPE.SHORT]:Int16Array,[GL_TYPE.INT]:Int32Array},NAME_TO_GL_TYPE={DOUBLE:GL_TYPE.DOUBLE,FLOAT:GL_TYPE.FLOAT,UNSIGNED_SHORT:GL_TYPE.UNSIGNED_SHORT,UNSIGNED_INT:GL_TYPE.UNSIGNED_INT,UNSIGNED_BYTE:GL_TYPE.UNSIGNED_BYTE,BYTE:GL_TYPE.BYTE,SHORT:GL_TYPE.SHORT,INT:GL_TYPE.INT};function getArrayType(glType){let ArrayType=GL_TYPE_TO_ARRAY_TYPE[glType];if(!ArrayType)throw Error(`Failed to convert GL type`);return ArrayType}function getByteSize(glType){return getArrayType(glType).BYTES_PER_ELEMENT}function createTypedArray(glType,buffer,byteOffset=0,length){let ArrayType=getArrayType(glType);return byteOffset%getByteSize(glType)===0?new ArrayType(buffer,byteOffset,length==null?(buffer.byteLength-byteOffset)/getByteSize(glType):length):new ArrayType(length?buffer.slice(byteOffset,byteOffset+length*getByteSize(glType)):buffer.slice(byteOffset))}function glTypeFromName(name){let glType=NAME_TO_GL_TYPE[name];if(!glType)throw Error(`Failed to convert GL type`);return glType}var FeatureTable=class{constructor(featureTableJson,featureTableBinary){this.featuresLength=0,this.cachedTypedArrays={},this.json=featureTableJson,this.buffer=featureTableBinary;let featuresLengthArray=this.getGlobalProperty(`POINTS_LENGTH`,GL_TYPE.UNSIGNED_INT,1);featuresLengthArray&&featuresLengthArray.length&&(this.featuresLength=featuresLengthArray[0])}getExtension(extensionName){return this.json.extensions&&this.json.extensions[extensionName]}hasProperty(propertyName){return!!this.json[propertyName]}getGlobalProperty(propertyName,componentType,componentLength){let jsonValue=this.json[propertyName];return typeof jsonValue==`number`?new(getArrayType(componentType))([jsonValue]):Array.isArray(jsonValue)?new(getArrayType(componentType))(jsonValue):jsonValue&&Number.isFinite(jsonValue.byteOffset)?this.getTypedArrayFromBinary(propertyName,componentType,componentLength,1,jsonValue.byteOffset):null}getPropertyArray(propertyName,componentType,componentLength){let jsonValue=this.json[propertyName];return jsonValue&&Number.isFinite(jsonValue.byteOffset)?(`componentType`in jsonValue&&(componentType=glTypeFromName(jsonValue.componentType)),this.getTypedArrayFromBinary(propertyName,componentType,componentLength,this.featuresLength,jsonValue.byteOffset)):this.getTypedArrayFromArray(propertyName,componentType,jsonValue)}getProperty(propertyName,componentType,componentLength,featureId,result){if(!this.json[propertyName])return null;let typedArray=this.getPropertyArray(propertyName,componentType,componentLength);if(componentLength===1)return result[0]=typedArray[featureId],result;for(let i=0;i<componentLength;++i)result[i]=typedArray[componentLength*featureId+i];return result}getTypedArrayFromBinary(propertyName,componentType,componentLength,count,byteOffset){let cachedTypedArrays=this.cachedTypedArrays,typedArray=cachedTypedArrays[propertyName];return typedArray||(typedArray=createTypedArray(componentType,this.buffer.buffer,this.buffer.byteOffset+byteOffset,count*componentLength),cachedTypedArrays[propertyName]=typedArray),typedArray}getTypedArrayFromArray(propertyName,componentType,array){let cachedTypedArrays=this.cachedTypedArrays,typedArray=cachedTypedArrays[propertyName];return typedArray||(typedArray=createTypedArray(componentType,array),cachedTypedArrays[propertyName]=typedArray),typedArray}},SIZEOF_UINT32=4,DEPRECATION_WARNING=`b3dm tile in legacy format.`;function getStringFromArrayBuffer(arrayBuffer,byteOffset,byteLength){let textDecoder=new TextDecoder(`utf8`),typedArray=new Uint8Array(arrayBuffer,byteOffset,byteLength);return textDecoder.decode(typedArray)}function parseTable(data,arrayBuffer,byteOffset){return byteOffset=parseTablesHeader(data,arrayBuffer,byteOffset),byteOffset=parseFeatureTable(data,arrayBuffer,byteOffset),byteOffset=parseBatchTable(data,arrayBuffer,byteOffset),byteOffset}function parseTablesHeader(data,arrayBuffer,byteOffset){let view=new DataView(arrayBuffer),batchLength=0;data.header=data.header||{};let featureTableJsonByteLength=view.getUint32(byteOffset,!0);byteOffset+=SIZEOF_UINT32;let featureTableBinaryByteLength=view.getUint32(byteOffset,!0);byteOffset+=SIZEOF_UINT32;let batchTableJsonByteLength=view.getUint32(byteOffset,!0);byteOffset+=SIZEOF_UINT32;let batchTableBinaryByteLength=view.getUint32(byteOffset,!0);return byteOffset+=SIZEOF_UINT32,batchTableJsonByteLength>=570425344?(byteOffset-=SIZEOF_UINT32*2,batchLength=featureTableJsonByteLength,batchTableJsonByteLength=featureTableBinaryByteLength,batchTableBinaryByteLength=0,featureTableJsonByteLength=0,featureTableBinaryByteLength=0,console.warn(DEPRECATION_WARNING)):batchTableBinaryByteLength>=570425344&&(byteOffset-=SIZEOF_UINT32,batchLength=batchTableJsonByteLength,batchTableJsonByteLength=featureTableJsonByteLength,batchTableBinaryByteLength=featureTableBinaryByteLength,featureTableJsonByteLength=0,featureTableBinaryByteLength=0,console.warn(DEPRECATION_WARNING)),data.header.featureTableJsonByteLength=featureTableJsonByteLength,data.header.featureTableBinaryByteLength=featureTableBinaryByteLength,data.header.batchTableJsonByteLength=batchTableJsonByteLength,data.header.batchTableBinaryByteLength=batchTableBinaryByteLength,data.header.batchLength=batchLength,byteOffset}function parseFeatureTable(data,arrayBuffer,byteOffset){let{featureTableJsonByteLength,featureTableBinaryByteLength,batchLength}=data.header||{};if(data.featureTableJson={BATCH_LENGTH:batchLength||0},featureTableJsonByteLength&&featureTableJsonByteLength>0){let featureTableString=getStringFromArrayBuffer(arrayBuffer,byteOffset,featureTableJsonByteLength);data.featureTableJson=JSON.parse(featureTableString)}byteOffset+=featureTableJsonByteLength||0,data.featureTableBinary=new Uint8Array(arrayBuffer,byteOffset,featureTableBinaryByteLength),byteOffset+=featureTableBinaryByteLength||0;let featureTable=new FeatureTable(data.featureTableJson,data.featureTableBinary);if(Array.isArray(featureTable.json.RTC_CENTER)){let rctCenterArray=featureTable.json.RTC_CENTER;data.rtcCenter=[rctCenterArray[0],rctCenterArray[1],rctCenterArray[2]]}else{let rctCenterArray=featureTable.getGlobalProperty(`RTC_CENTER`,GL_TYPE.FLOAT,3);rctCenterArray&&(data.rtcCenter=[rctCenterArray[0],rctCenterArray[1],rctCenterArray[2]])}return byteOffset}function parseBatchTable(data,arrayBuffer,byteOffset){let{batchTableJsonByteLength,batchTableBinaryByteLength}=data.header||{};if(batchTableJsonByteLength&&batchTableJsonByteLength>0){let batchTableString=getStringFromArrayBuffer(arrayBuffer,byteOffset,batchTableJsonByteLength);data.batchTableJson=JSON.parse(batchTableString),byteOffset+=batchTableJsonByteLength,batchTableBinaryByteLength&&batchTableBinaryByteLength>0&&(data.batchTableBinary=new Uint8Array(arrayBuffer,byteOffset,batchTableBinaryByteLength),data.batchTableBinary=new Uint8Array(data.batchTableBinary),byteOffset+=batchTableBinaryByteLength)}return byteOffset}function sliceArrayBuffer(arrayBuffer,byteOffset,byteLength){let subArray=byteLength===void 0?new Uint8Array(arrayBuffer).subarray(byteOffset):new Uint8Array(arrayBuffer).subarray(byteOffset,byteOffset+byteLength);return new Uint8Array(subArray).buffer}function parseGlTFArrayBuffer(data,arrayBuffer,byteOffset){let gltfByteLength=data.byteLength-byteOffset;if(gltfByteLength===0)throw Error(`glTF byte length must be greater than 0.`);return byteOffset%4!=0&&console.warn(`${data.type}: embedded glb is not aligned to a 4-byte boundary.`),data.gltfArrayBuffer=sliceArrayBuffer(arrayBuffer,byteOffset,gltfByteLength),data.byteLength}function loadB3dm(url,options={}){var _a,_b,_c,_d,_e;let modelUpAxis=(_a=options.modelUpAxis)==null?`Y`:_a,upAxis=(_b=options.upAxis)==null?`Z`:_b,fetcher=(_c=options.fetcher)==null?require_memoryUsage.u:_c,onDownloadProgress=(_d=options.onDownloadProgress)==null?require_memoryUsage.d:_d,jsonModify=(_e=options.jsonModify)==null?require_memoryUsage.d:_e,data={uri:url,gltfUpAxis:modelUpAxis},byteLength=0;return Promise.resolve().then(()=>fetcher.ajax(url,{responseType:`arraybuffer`},void 0,void 0,onDownloadProgress).then(response=>(byteLength=response.body.byteLength,response.body))).then(arrayBuffer=>Promise.resolve(0).then(byteOffset=>parseHeader(data,arrayBuffer,byteOffset)).then(byteOffset=>parseTable(data,arrayBuffer,byteOffset)).then(byteOffset=>parseGlTFArrayBuffer(data,arrayBuffer,byteOffset))).then(()=>{var _a;return require_glTF_helpers.t(data.gltfArrayBuffer,{copyUV2:!1,resourcePath:url.slice(0,url.lastIndexOf(`/`)+1),search:(_a=url.split(`?`)[1])==null?``:_a,jsonModify(json){var _a,_b,_c;if(options.light===!1){let KHR_materials_unlit=`KHR_materials_unlit`;if(json.extensionsUsed=(_a=json.extensionsUsed)==null?[]:_a,json.extensionsUsed.indexOf(KHR_materials_unlit)===-1&&json.extensionsUsed.push(KHR_materials_unlit),json.materials)for(let material of json.materials)material.extensions=(_b=material.extensions)==null?{}:_b,material.extensions[KHR_materials_unlit]={}}return(_c=jsonModify(json))==null?json:_c},fetcher})}).then(result=>{let contentTransform=new three_webgpu.Matrix4;modelUpAxis===`Y`&&contentTransform.premultiply(require_memoryUsage.r);let rtcCenter;if(data.rtcCenter?rtcCenter=new three_webgpu.Vector3().fromArray(data.rtcCenter):result.CESIUM_RTC&&(rtcCenter=new three_webgpu.Vector3().copy(result.CESIUM_RTC.center)),rtcCenter){let rtcCenterTransform=new three_webgpu.Matrix4().setPosition(rtcCenter);contentTransform.premultiply(rtcCenterTransform)}return upAxis===`Y`&&contentTransform.premultiply(require_memoryUsage.i),result.scene.applyMatrix4(contentTransform),data.featureTableBinary=void 0,data.batchTableBinary=void 0,data.gltfArrayBuffer=void 0,{type:`b3dm`,modelUpAxis,upAxis,uri:url,byteLength,memoryUsage:require_memoryUsage.n(result.scene),scene:result.scene,textures:result.textures,animations:result.animations,rtcCenter,dispose:()=>result.dispose()}})}var jsContent="(function(){function e(e){onmessage=t=>{Promise.resolve(t.data).then(t=>e(t)).then(({output:e,transfer:t})=>postMessage(e,t)).catch(e=>postMessage({$$error:e}))}}var t;(function(e){e[e.BYTE=5120]=`BYTE`,e[e.UNSIGNED_BYTE=5121]=`UNSIGNED_BYTE`,e[e.SHORT=5122]=`SHORT`,e[e.UNSIGNED_SHORT=5123]=`UNSIGNED_SHORT`,e[e.INT=5124]=`INT`,e[e.UNSIGNED_INT=5125]=`UNSIGNED_INT`,e[e.FLOAT=5126]=`FLOAT`,e[e.DOUBLE=5130]=`DOUBLE`})(t||(t={}));let n={[t.DOUBLE]:Float64Array,[t.FLOAT]:Float32Array,[t.UNSIGNED_SHORT]:Uint16Array,[t.UNSIGNED_INT]:Uint32Array,[t.UNSIGNED_BYTE]:Uint8Array,[t.BYTE]:Int8Array,[t.SHORT]:Int16Array,[t.INT]:Int32Array},r={DOUBLE:t.DOUBLE,FLOAT:t.FLOAT,UNSIGNED_SHORT:t.UNSIGNED_SHORT,UNSIGNED_INT:t.UNSIGNED_INT,UNSIGNED_BYTE:t.UNSIGNED_BYTE,BYTE:t.BYTE,SHORT:t.SHORT,INT:t.INT};function i(e){let t=n[e];if(!t)throw Error(`Failed to convert GL type`);return t}function a(e){return i(e).BYTES_PER_ELEMENT}function o(e,t,n=0,r){let o=i(e);return n%a(e)===0?new o(t,n,r==null?(t.byteLength-n)/a(e):r):new o(r?t.slice(n,n+r*a(e)):t.slice(n))}function s(e){let t=r[e];if(!t)throw Error(`Failed to convert GL type`);return t}var c=class{constructor(e,n){this.featuresLength=0,this.cachedTypedArrays={},this.json=e,this.buffer=n;let r=this.getGlobalProperty(`POINTS_LENGTH`,t.UNSIGNED_INT,1);r&&r.length&&(this.featuresLength=r[0])}getExtension(e){return this.json.extensions&&this.json.extensions[e]}hasProperty(e){return!!this.json[e]}getGlobalProperty(e,t,n){let r=this.json[e];return typeof r==`number`?new(i(t))([r]):Array.isArray(r)?new(i(t))(r):r&&Number.isFinite(r.byteOffset)?this.getTypedArrayFromBinary(e,t,n,1,r.byteOffset):null}getPropertyArray(e,t,n){let r=this.json[e];return r&&Number.isFinite(r.byteOffset)?(`componentType`in r&&(t=s(r.componentType)),this.getTypedArrayFromBinary(e,t,n,this.featuresLength,r.byteOffset)):this.getTypedArrayFromArray(e,t,r)}getProperty(e,t,n,r,i){if(!this.json[e])return null;let a=this.getPropertyArray(e,t,n);if(n===1)return i[0]=a[r],i;for(let e=0;e<n;++e)i[e]=a[n*r+e];return i}getTypedArrayFromBinary(e,t,n,r,i){let a=this.cachedTypedArrays,s=a[e];return s||(s=o(t,this.buffer.buffer,this.buffer.byteOffset+i,r*n),a[e]=s),s}getTypedArrayFromArray(e,t,n){let r=this.cachedTypedArrays,i=r[e];return i||(i=o(t,n),r[e]=i),i}};e(e=>Promise.resolve(e).then(e=>{let t=new c(e.featureTableJson,e.featureTableBinary),n=u(t),r=d(t),i=p(t),a=[];return n&&a.push(n.array.buffer),r&&a.push(r.array.buffer),i&&a.push(i.array.buffer),{output:{position:n,color:r,normal:i},transfer:a}}));let l=65535;function u(e){if(e.hasProperty(`POSITION`))return{array:e.getPropertyArray(`POSITION`,t.FLOAT,3),itemSize:3,normalized:!1};if(e.hasProperty(`POSITION_QUANTIZED`)){let n=e.getPropertyArray(`POSITION_QUANTIZED`,t.UNSIGNED_SHORT,3),r=e.getGlobalProperty(`QUANTIZED_VOLUME_SCALE`,t.FLOAT,3),i=e.getGlobalProperty(`QUANTIZED_VOLUME_OFFSET`,t.FLOAT,3);if(!r||!i)throw Error(`QUANTIZED_VOLUME_SCALE or QUANTIZED_VOLUME_OFFSET never found.`);let a=new Float32Array(n.length),o=n.length/3,s=r[0]/l,c=r[1]/l,u=r[2]/l,d=i[0],f=i[1],p=i[2];for(let e=0,t;e<o;e++)t=e*3,a[t]=n[t]*s+d,a[++t]=n[t]*c+f,a[++t]=n[t]*u+p;return{array:a,itemSize:3,normalized:!1}}return null}function d(e){if(e.hasProperty(`RGB`)){let n=e.getPropertyArray(`RGB`,t.UNSIGNED_BYTE,3),r=n.length/3,i=new Uint8Array(r*4);for(let e=0,t,a;e<r;e++)a=e*4,t=e*3,i[a]=n[t],i[++a]=n[++t],i[++a]=n[++t];return{array:i,itemSize:4,normalized:!0}}else if(e.hasProperty(`RGBA`))return{array:e.getPropertyArray(`RGBA`,t.UNSIGNED_BYTE,4),itemSize:4,normalized:!0};else if(e.hasProperty(`RGB565`)){let n=e.getPropertyArray(`RGB565`,t.UNSIGNED_SHORT,1),r=n.length,i=new Uint8Array(r*4);for(let e=0,t,a;e<r;e++)a=n[e],t=e*4,i[t]=(a>>11&31)<<3,i[++t]=(a>>5&63)<<2,i[++t]=(a&31)<<3;return{array:i,itemSize:4,normalized:!0}}return null}let f=2/255;function p(e){if(e.hasProperty(`NORMAL`)){let n=e.getPropertyArray(`NORMAL`,t.FLOAT,3),r=n.length/3,i=new Int8Array(r*4);for(let e=0,t,a;e<r;e++)a=e*4,t=e*3,i[a]=n[t]*127,i[++a]=n[++t]*127,i[++a]=n[++t]*127;return{array:i,itemSize:4,normalized:!0}}else if(e.hasProperty(`NORMAL_OCT16P`)){let n=e.getPropertyArray(`NORMAL_OCT16P`,t.UNSIGNED_BYTE,2),r=n.length/2,i=new Int8Array(r*4);for(let e=0,t,a,o,s,c,l,u;e<r;e++)t=e*2,a=n[t]*f-1,o=n[++t]*f-1,c=a<0?-a:a,l=o<0?-o:o,s=1-(c+l),s<0&&(a=(1-l)*(a<0?-1:1),o=(1-c)*(o<0?-1:1)),u=Math.sqrt(a*a+o*o+s*s),t=e*4,i[t]=a/u*127,i[++t]=o/u*127,i[++t]=s/u*127;return{array:i,itemSize:4,normalized:!0}}return null}})();",blob=typeof self<`u`&&self.Blob&&new Blob([`(self.URL || self.webkitURL).revokeObjectURL(self.location.href);`,jsContent],{type:`text/javascript;charset=utf-8`});function WorkerWrapper(options){let objURL;try{if(objURL=blob&&(self.URL||self.webkitURL).createObjectURL(blob),!objURL)throw``;let worker=new Worker(objURL,{name:options==null?void 0:options.name});return worker.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(objURL)}),worker}catch(e){return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(jsContent),{name:options==null?void 0:options.name})}}var attributeWorkerPool=new require_glTF_helpers.a(()=>new WorkerWrapper,2);function parsePointCloud(data,_arrayBuffer,byteOffset){let featureTable=new FeatureTable(data.featureTableJson,data.featureTableBinary);return Promise.resolve().then(()=>{let featureTableDraco=featureTable.getExtension(`3DTILES_draco_point_compression`);if(featureTableDraco)return parseDraco(featureTableDraco,featureTable);{let bufferCopy=featureTable.buffer.slice();return attributeWorkerPool.postMessage({featureTableBinary:bufferCopy,featureTableJson:featureTable.json},[bufferCopy.buffer])}}).then(attributes=>(data.attributes=attributes,byteOffset))}function parseDraco(featureTableDraco,featureTable){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let dracoFeatureTableProperties=featureTableDraco.properties||{},dracoByteOffset=featureTableDraco.byteOffset,dracoByteLength=featureTableDraco.byteLength;if(!dracoFeatureTableProperties||!Number.isFinite(dracoByteOffset)||!dracoByteLength)throw Error(`Draco properties, byteOffset, and byteLength must be defined`);let dracoBuffer=featureTable.buffer.slice(dracoByteOffset,dracoByteOffset+dracoByteLength),attributeIDs=featureTableDraco.properties;return require_glTF_helpers.r.decodeGeometry(dracoBuffer.buffer,{attributeIDs,attributeTypes:{POSITION:`Float32Array`,NORMAL:`Float32Array`,RGB:`Uint8Array`,RGBA:`Uint8Array`},useUniqueIDs:!0}).then(geometry=>{let positionAttribute=geometry.getAttribute(`POSITION`),rgbAttribute=geometry.getAttribute(`RGB`),rgbaAttribute=geometry.getAttribute(`RGBA`),normalAttribute=geometry.getAttribute(`NORMAL`),colorAttribute;if(rgbaAttribute)colorAttribute=rgbaAttribute;else if(rgbAttribute){let pointCount=rgbAttribute.count,rgbArray=rgbAttribute.array,colorArray=new Uint8Array(pointCount*4);for(let i=0,offset3,offset4;i<pointCount;i++)offset4=i*4,offset3=i*3,colorArray[offset4]=rgbArray[offset3],colorArray[++offset4]=rgbArray[++offset3],colorArray[++offset4]=rgbArray[++offset3];colorAttribute=new three_webgpu.BufferAttribute(colorArray,4,rgbAttribute.normalized)}return{position:positionAttribute?{array:positionAttribute.array,itemSize:positionAttribute.itemSize,normalized:positionAttribute.normalized}:null,color:colorAttribute?{array:colorAttribute.array,itemSize:colorAttribute.itemSize,normalized:colorAttribute.normalized}:null,normal:normalAttribute?{array:normalAttribute.array,itemSize:normalAttribute.itemSize,normalized:normalAttribute.normalized}:null}})})}function srgbToLinear(channel){return channel<=.04045?channel/12.92:Math.pow((channel+.055)/1.055,2.4)}function decodeSrgbChannel(value,normalized,maxValue){let encoded=normalized||value>1?value/maxValue:value;return srgbToLinear(Math.min(Math.max(encoded,0),1))}function loadPnts(url,options={}){var _a,_b,_c;let upAxis=(_a=options.upAxis)==null?`Z`:_a,fetcher=(_b=options.fetcher)==null?require_memoryUsage.u:_b,onDownloadProgress=(_c=options.onDownloadProgress)==null?require_memoryUsage.d:_c,data={uri:url};return Promise.resolve().then(()=>fetcher.ajax(url,{responseType:`arraybuffer`},void 0,void 0,onDownloadProgress).then(response=>response.body)).then(arrayBuffer=>Promise.resolve(0).then(byteOffset=>parseHeader(data,arrayBuffer,byteOffset)).then(byteOffset=>parseTable(data,arrayBuffer,byteOffset)).then(byteOffset=>parsePointCloud(data,arrayBuffer,byteOffset))).then(()=>{var _a;return createPoints(data.attributes,{computeBoundingBox:(_a=options.computeBoundingBox)==null?!0:_a})}).then(result=>{let contentTransform=new three_webgpu.Matrix4,rtcCenter;if(data.rtcCenter&&(rtcCenter=new three_webgpu.Vector3().fromArray(data.rtcCenter)),rtcCenter){let rtcCenterTransform=new three_webgpu.Matrix4().setPosition(rtcCenter);contentTransform.premultiply(rtcCenterTransform)}return upAxis===`Y`&&contentTransform.premultiply(require_memoryUsage.i),result.object.applyMatrix4(contentTransform),data.gltfArrayBuffer=void 0,data.featureTableBinary=void 0,data.batchTableBinary=void 0,data.attributes=void 0,{type:`pnts`,modelUpAxis:`Z`,upAxis,uri:data.uri,byteLength:data.byteLength,memoryUsage:require_memoryUsage.n(result.object),scene:result.object,textures:[],animations:[],rtcCenter,dispose:()=>result.dispose()}})}function createPoints(attributes,options){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l,_m,_o,_p;let positionsSource=(_a=attributes.position)==null?void 0:_a.array,colorsSource=(_b=attributes.color)==null?void 0:_b.array,numPoints=attributes.position?Math.floor(attributes.position.array.length/attributes.position.itemSize):0,positions=new Float32Array;if(attributes.position&&positionsSource instanceof Float32Array&&attributes.position.itemSize===3&&attributes.position.normalized!==!0)positions=positionsSource.slice(0,numPoints*3);else if(positionsSource&&attributes.position){positions=new Float32Array(numPoints*3);let source=positionsSource,itemSize=Math.max(1,attributes.position.itemSize);for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3;positions[dstBase]=(_c=source[srcBase])==null?0:_c,positions[dstBase+1]=(_d=source[srcBase+1])==null?0:_d,positions[dstBase+2]=(_e=source[srcBase+2])==null?0:_e}}let colors=new Uint8Array(numPoints*3);if(colorsSource&&attributes.color&&colorsSource instanceof Uint8Array&&attributes.color.itemSize===3&&attributes.color.normalized===!0)colors=colorsSource;else if(colorsSource&&attributes.color&&colorsSource instanceof Float32Array&&attributes.color.itemSize===3&&attributes.color.normalized!==!0)colors=colorsSource;else if(colorsSource&&attributes.color){let source=colorsSource,itemSize=Math.max(1,attributes.color.itemSize);if(attributes.color.normalized)if(colorsSource instanceof Uint8Array){colors=new Uint8Array(numPoints*3);for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3,r=(_f=source[srcBase])==null?0:_f,g=(_g=source[srcBase+1])==null?r:_g,b=(_h=source[srcBase+2])==null?r:_h;colors[dstBase]=r,colors[dstBase+1]=g,colors[dstBase+2]=b}}else{colors=new Float32Array(numPoints*3);let typedSource=colorsSource,bytesPerElement=`BYTES_PER_ELEMENT`in typedSource?typedSource.BYTES_PER_ELEMENT:1,maxValue=Math.pow(2,bytesPerElement*8)-1;for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3,r=(_j=source[srcBase])==null?0:_j,g=(_k=source[srcBase+1])==null?r:_k,b=(_l=source[srcBase+2])==null?r:_l;colors[dstBase]=decodeSrgbChannel(r,!0,maxValue),colors[dstBase+1]=decodeSrgbChannel(g,!0,maxValue),colors[dstBase+2]=decodeSrgbChannel(b,!0,maxValue)}}else{colors=new Float32Array(numPoints*3);let typedSource=colorsSource,bytesPerElement=`BYTES_PER_ELEMENT`in typedSource?typedSource.BYTES_PER_ELEMENT:1,maxValue=Math.pow(2,bytesPerElement*8)-1;for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3,r=(_m=source[srcBase])==null?0:_m,g=(_o=source[srcBase+1])==null?r:_o,b=(_p=source[srcBase+2])==null?r:_p;colors[dstBase]=decodeSrgbChannel(r,!1,maxValue),colors[dstBase+1]=decodeSrgbChannel(g,!1,maxValue),colors[dstBase+2]=decodeSrgbChannel(b,!1,maxValue)}}}let normals=attributes.normal?require_memoryUsage.g(attributes.normal,numPoints):null,points=new require_memoryUsage.m({numPoints,positions,colors,normals});return points.matrix.compose(points.position,points.quaternion,points.scale),points.matrixAutoUpdate=!1,points.frustumCulled=!1,options.computeBoundingBox,Promise.resolve({object:points,dispose:()=>{points.dispose()}})}var _object_pattern=/^[og]\s*(.+)?/,_material_library_pattern=/^mtllib /,_material_use_pattern=/^usemtl /,_map_use_pattern=/^usemap /,_face_vertex_data_separator_pattern=/\s+/,_color=new three_webgpu.Color,ObjState=class{constructor(){this.objects=[],this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.materials={},this.materialLibraries=[],this.startObject(``,!1)}startObject(name,fromDeclaration){if(this.object&&this.object.fromDeclaration===!1){this.object.name=name,this.object.fromDeclaration=fromDeclaration!==!1;return}let previousMaterial=this.object&&typeof this.object.currentMaterial==`function`?this.object.currentMaterial():void 0;if(this.object&&typeof this.object._finalize==`function`&&this.object._finalize(!0),this.object={name:name||``,fromDeclaration:fromDeclaration!==!1,geometry:{vertices:[],hasNormal:!0,normals:[],hasColor:!0,colors:[],hasUV:!0,uvs:[],index:[],indexMap:{}},materials:[],smooth:!0,startMaterial:function(name,libraries){var _a,_b;let previous=this._finalize(!1);previous&&(previous.inherited||((_a=previous.groupCount)==null?0:_a)<=0)&&this.materials.splice((_b=previous.index)==null?0:_b,1);let material={index:this.materials.length,name:name||``,mtllib:Array.isArray(libraries)&&libraries.length>0?libraries[libraries.length-1]:``,smooth:previous===void 0?this.smooth:previous.smooth,groupStart:previous===void 0?0:previous.groupEnd,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(index){let cloned={index:typeof index==`number`?index:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1,clone(){return this}};return cloned.clone=this.clone.bind(cloned),cloned}};return this.materials.push(material),material},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(end){var _a,_b;let lastMultiMaterial=this.currentMaterial();if(lastMultiMaterial&&lastMultiMaterial.groupEnd===-1&&(lastMultiMaterial.groupEnd=this.geometry.index.length,lastMultiMaterial.groupCount=lastMultiMaterial.groupEnd-((_a=lastMultiMaterial.groupStart)==null?0:_a),lastMultiMaterial.inherited=!1),end&&this.materials.length>1)for(let mi=this.materials.length-1;mi>=0;mi--)((_b=this.materials[mi].groupCount)==null?0:_b)<=0&&this.materials.splice(mi,1);return end&&this.materials.length===0&&this.materials.push({name:``,smooth:this.smooth}),lastMultiMaterial}},previousMaterial&&previousMaterial.name&&typeof previousMaterial.clone==`function`){let declared=previousMaterial.clone(0);declared.inherited=!0,this.object.materials.push(declared)}this.objects.push(this.object)}finalize(){this.object&&typeof this.object._finalize==`function`&&this.object._finalize(!0)}parseVertexIndex(value,len){let index=parseInt(value,10);return(index>=0?index-1:index+len/3)*3}parseNormalIndex(value,len){let index=parseInt(value,10);return(index>=0?index-1:index+len/3)*3}parseUVIndex(value,len){let index=parseInt(value,10);return(index>=0?index-1:index+len/2)*2}addFace(a,b,c,ua,ub,uc,na,nb,nc){let geometry=this.object.geometry,vLen=this.vertices.length,nLen=this.normals.length,uLen=this.uvs.length,iva=this.parseVertexIndex(a,vLen),ivb=this.parseVertexIndex(b,vLen),ivc=this.parseVertexIndex(c,vLen),ina=na===void 0?void 0:this.parseNormalIndex(na,nLen),inb=nb===void 0?void 0:this.parseNormalIndex(nb,nLen),inc=nc===void 0?void 0:this.parseNormalIndex(nc,nLen),iua=ua===void 0?void 0:this.parseUVIndex(ua,uLen),iub=ub===void 0?void 0:this.parseUVIndex(ub,uLen),iuc=uc===void 0?void 0:this.parseUVIndex(uc,uLen);geometry.hasNormal===!0&&(ina===void 0||inb===void 0||inc===void 0)&&(geometry.hasNormal=!1),geometry.hasUV===!0&&(iua===void 0||iub===void 0||iuc===void 0)&&(geometry.hasUV=!1);let aKey=[iva,iua,ina].join(`:`),aIndex=geometry.indexMap[aKey];aIndex===void 0&&(aIndex=geometry.vertices.length/3,geometry.indexMap[aKey]=aIndex,geometry.vertices.push(this.vertices[iva+0],this.vertices[iva+1],this.vertices[iva+2]),geometry.hasColor&&(this.colors[iva]===void 0?geometry.hasColor=!1:geometry.colors.push(this.colors[iva+0],this.colors[iva+1],this.colors[iva+2])),geometry.hasNormal&&geometry.normals.push(this.normals[iva+0],this.normals[iva+1],this.normals[iva+2]),geometry.hasUV&&geometry.uvs.push(this.uvs[iua+0],this.uvs[iua+1])),geometry.index.push(aIndex);let bKey=[ivb,iub,inb].join(`:`),bIndex=geometry.indexMap[bKey];bIndex===void 0&&(bIndex=geometry.vertices.length/3,geometry.indexMap[bKey]=bIndex,geometry.vertices.push(this.vertices[ivb+0],this.vertices[ivb+1],this.vertices[ivb+2]),geometry.hasColor&&(this.colors[ivb]===void 0?geometry.hasColor=!1:geometry.colors.push(this.colors[ivb+0],this.colors[ivb+1],this.colors[ivb+2])),geometry.hasNormal&&geometry.normals.push(this.normals[ivb+0],this.normals[ivb+1],this.normals[ivb+2]),geometry.hasUV&&geometry.uvs.push(this.uvs[iub+0],this.uvs[iub+1])),geometry.index.push(bIndex);let cKey=[ivc,iuc,inc].join(`:`),cIndex=geometry.indexMap[cKey];cIndex===void 0&&(cIndex=geometry.vertices.length/3,geometry.indexMap[cKey]=cIndex,geometry.vertices.push(this.vertices[ivc+0],this.vertices[ivc+1],this.vertices[ivc+2]),geometry.hasColor&&(this.colors[ivc]===void 0?geometry.hasColor=!1:geometry.colors.push(this.colors[ivc+0],this.colors[ivc+1],this.colors[ivc+2])),geometry.hasNormal&&geometry.normals.push(this.normals[ivc+0],this.normals[ivc+1],this.normals[ivc+2]),geometry.hasUV&&geometry.uvs.push(this.uvs[iuc+0],this.uvs[iuc+1])),geometry.index.push(cIndex)}};function parseObj(text){let state=new ObjState;text.indexOf(`\r
|
|
383
|
+
`)}var GSplatHybridRenderer=class GSplatHybridRenderer{get unusable(){return this.disposed}get renderCount(){return this.lastRenderCount}constructor(device,format,depthFormat,backend=null){this.radixSort=null,this.projectorUniformBuffer=null,this.drawUniformBuffer=null,this.effectUniformBuffer=null,this.bakedTexture=null,this.bakedEnabled=!1,this.bakedViewCache=new WeakMap,this.bakedContentRevision=0,this.projectedCacheBuffer=null,this.projectedCacheCapacityPoints=0,this.sortKeysBuffer=null,this.sortKeysCapacityElements=0,this.renderCountBuffer=null,this.indirectArgsBuffer=null,this.quadIndexBuffer=null,this.readbackBuffer=null,this.readbackInFlight=!1,this.lastRenderCount=null,this.projectorBindGroup=null,this.projectorSources=null,this.indirectBindGroup=null,this.indirectSources=null,this.drawBindGroup=null,this.drawSources=null,this.disposed=!1,this.width=0,this.height=0,this.lastCameraSnapshot=new Float32Array(32),this.lastArenaRevision=-1,this.lastTotalPoints=-1,this.lastViewportWidth=-1,this.lastViewportHeight=-1,this.lastBakedView=null,this.lastBakedRevision=-1,this.lastFrameComplete=!1,this.projectorUniformScratch=new ArrayBuffer(GSplatHybridRenderer.PROJECTOR_UNIFORM_SIZE),this.drawUniformScratch=new ArrayBuffer(GSplatHybridRenderer.DRAW_UNIFORM_SIZE),this.effectUniformScratch=new ArrayBuffer(GSplatHybridRenderer.EFFECT_UNIFORM_SIZE),this.u32Scratch=new Uint32Array(1),this.device=device,this.format=format,this.depthFormat=depthFormat,this.backend=backend,this.plainVariant=this.createProjectorVariant(!1),this.bakedVariant=this.createProjectorVariant(!0),this.indirectBindGroupLayout=device.createBindGroupLayout({label:`gsplat-hybrid-indirect-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),this.drawBindGroupLayout=device.createBindGroupLayout({label:`gsplat-hybrid-draw-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}}]});let indirectModule=device.createShaderModule({label:`gsplat-hybrid-indirect`,code:gsplatHybridIndirect_default}),quadModule=device.createShaderModule({label:`gsplat-hybrid-quad`,code:gsplatQuad_default});this.indirectPipeline=device.createComputePipeline({label:`gsplat-hybrid-indirect`,layout:device.createPipelineLayout({label:`gsplat-hybrid-indirect-layout`,bindGroupLayouts:[this.indirectBindGroupLayout]}),compute:{module:indirectModule,entryPoint:`main`}}),this.drawPipeline=device.createRenderPipeline({label:`gsplat-hybrid-draw`,layout:device.createPipelineLayout({label:`gsplat-hybrid-draw-layout`,bindGroupLayouts:[this.drawBindGroupLayout]}),vertex:{module:quadModule,entryPoint:`vs_main`,buffers:[]},fragment:{module:quadModule,entryPoint:`fs_main`,targets:[{format,blend:{color:{operation:`add`,srcFactor:`src-alpha`,dstFactor:`one-minus-src-alpha`},alpha:{operation:`add`,srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-list`,cullMode:`none`},depthStencil:{format:depthFormat,depthWriteEnabled:!1,depthCompare:`less-equal`}}),this.radixSort=new RadixSortModule(device),this.projectorUniformBuffer=this.createBuffer(`projector-uniform`,GSplatHybridRenderer.PROJECTOR_UNIFORM_SIZE,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.drawUniformBuffer=this.createBuffer(`draw-uniform`,GSplatHybridRenderer.DRAW_UNIFORM_SIZE,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.renderCountBuffer=this.createBuffer(`render-count`,4,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC),this.indirectArgsBuffer=this.createBuffer(`indirect-args`,32,GPUBufferUsage.STORAGE|GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_DST),this.effectUniformBuffer=this.createBuffer(`effect-uniform`,GSplatHybridRenderer.EFFECT_UNIFORM_SIZE,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.createQuadIndexBuffer(),this.writeProjectorUniformConstants()}createProjectorVariant(baked){let device=this.device,tag=baked?`baked`:`plain`,entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:6,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:7,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}];baked&&entries.push({binding:9,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:`unfilterable-float`,viewDimension:`2d`}}),entries.push({binding:11,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}});let bindGroupLayout=device.createBindGroupLayout({label:`gsplat-hybrid-projector-bgl-${tag}`,entries}),module=device.createShaderModule({label:`gsplat-hybrid-projector-${tag}`,code:selectVariant(selectVariant(gsplatProjector_default,`DIAG`,!1),`BAKED`,baked)}),pipelineLayout=device.createPipelineLayout({label:`gsplat-hybrid-projector-layout-${tag}`,bindGroupLayouts:[bindGroupLayout]});return{baked,bindGroupLayout,projectorPipeline:device.createComputePipeline({label:`gsplat-hybrid-projector-${tag}`,layout:pipelineLayout,compute:{module,entryPoint:`main`}}),fillSortKeysPipeline:device.createComputePipeline({label:`gsplat-hybrid-fill-sort-keys-${tag}`,layout:pipelineLayout,compute:{module,entryPoint:`fill_sort_keys`}})}}setBakedSource(texture,enabled){this.bakedTexture=texture,this.bakedEnabled=enabled}notifyBakedContentChanged(){this.bakedContentRevision++}resolveBakedView(){var _a;if(!this.bakedEnabled||!this.bakedTexture||!this.backend)return null;let gpuTexture=(_a=this.backend.get(this.bakedTexture))==null?void 0:_a.texture;if(!gpuTexture)return null;let view=this.bakedViewCache.get(gpuTexture);return view||(view=gpuTexture.createView({label:`gsplat-hybrid-baked-color-view`}),this.bakedViewCache.set(gpuTexture,view)),view}resize(width,height){this.width=Math.max(0,Math.floor(width)),this.height=Math.max(0,Math.floor(height))}createBuffer(kind,size,usage){return this.device.createBuffer({label:`gsplat-hybrid-${kind}`,size,usage})}destroyBufferSafely(buffer){if(buffer)try{buffer.destroy()}catch(_a){}}createQuadIndexBuffer(){let data=new Uint16Array(768);for(let i=0;i<768;i++)data[i]=i;let byteLength=data.byteLength+3&-4,buffer=this.createBuffer(`quad-index`,byteLength,GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST);buffer&&(this.device.queue.writeBuffer(buffer,0,data),this.quadIndexBuffer=buffer)}ensureProjectedCache(totalPoints){if(this.unusable||totalPoints<=0)return!1;if(this.projectedCacheBuffer&&totalPoints<=this.projectedCacheCapacityPoints)return!0;let created=this.createBuffer(`projected-cache`,totalPoints*20,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC),previous=this.projectedCacheBuffer;return this.projectedCacheBuffer=created,this.projectedCacheCapacityPoints=totalPoints,this.destroyBufferSafely(previous),!0}ensureSortKeys(totalPoints){if(this.unusable||totalPoints<=0)return!1;let aligned=Math.ceil(totalPoints/2048)*2048;if(this.sortKeysBuffer&&aligned<=this.sortKeysCapacityElements)return!0;let created=this.createBuffer(`sort-keys`,aligned*4,GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST),previous=this.sortKeysBuffer;return this.sortKeysBuffer=created,this.sortKeysCapacityElements=aligned,this.destroyBufferSafely(previous),!0}writeProjectorUniformConstants(){let buffer=this.projectorUniformBuffer;if(!buffer)return;let dv=new DataView(this.projectorUniformScratch);dv.setFloat32(GSplatHybridRenderer.OFF_MIN_PIXEL_SIZE,2,!0),dv.setFloat32(GSplatHybridRenderer.OFF_MAX_RADIUS_CAP,require_pbmGaussianSplattingObject.m,!0),dv.setFloat32(GSplatHybridRenderer.OFF_COV_PACK_SCALE,4,!0),dv.setFloat32(GSplatHybridRenderer.OFF_TERM2_SQ_FLOOR,require_pbmGaussianSplattingObject.h,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DEPTH_EPSILON,require_pbmGaussianSplattingObject.f,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DET_EPSILON,require_pbmGaussianSplattingObject.p,!0),this.device.queue.writeBuffer(buffer,0,this.projectorUniformScratch)}writeProjectorFrameUniform(camera,viewportWidth,viewportHeight,totalPoints,entryCount){let buffer=this.projectorUniformBuffer;if(!buffer)return;let dv=new DataView(this.projectorUniformScratch),view=camera.matrixWorldInverse.elements;for(let i=0;i<16;i++)dv.setFloat32(GSplatHybridRenderer.OFF_VIEW+i*4,view[i],!0);let viewProj=new three_webgpu.Matrix4().multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse).elements;for(let i=0;i<16;i++)dv.setFloat32(GSplatHybridRenderer.OFF_VIEW_PROJ+i*4,viewProj[i],!0);let p=camera.projectionMatrix.elements;dv.setFloat32(GSplatHybridRenderer.OFF_FOCAL,p[0]*viewportWidth*.5,!0),dv.setFloat32(GSplatHybridRenderer.OFF_FOCAL+4,p[5]*viewportHeight*.5,!0),dv.setFloat32(GSplatHybridRenderer.OFF_VIEWPORT,viewportWidth,!0),dv.setFloat32(GSplatHybridRenderer.OFF_VIEWPORT+4,viewportHeight,!0),dv.setUint32(GSplatHybridRenderer.OFF_TOTAL_POINTS,totalPoints>>>0,!0),dv.setUint32(GSplatHybridRenderer.OFF_ENTRY_COUNT,entryCount>>>0,!0),this.device.queue.writeBuffer(buffer,0,this.projectorUniformScratch)}writeDrawUniform(camera,width,height){let buffer=this.drawUniformBuffer;if(!buffer)return;let dv=new DataView(this.drawUniformScratch),p=camera.projectionMatrix.elements;dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_VIEWPORT,width,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_VIEWPORT+4,height,!0),dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_P22,p[10],!0),dv.setFloat32(GSplatHybridRenderer.OFF_DRAW_P32,p[14],!0),this.device.queue.writeBuffer(buffer,0,this.drawUniformScratch)}static sourcesEqual(a,b){if(!a||a.length!==b.length)return!1;for(let i=0;i<b.length;i++)if(a[i]!==b[i])return!1;return!0}ensureProjectorBindGroup(arena,layoutTable,transforms,objectParams,variant,bakedView){let cache=this.projectedCacheBuffer,keys=this.sortKeysBuffer,count=this.renderCountBuffer,uniform=this.projectorUniformBuffer,effect=this.effectUniformBuffer;if(!cache||!keys||!count||!uniform||!effect||variant.baked&&!bakedView)return null;let sources=[variant.bindGroupLayout,arena,layoutTable,transforms,objectParams,cache,keys,count,uniform,variant.baked?bakedView:null,effect];if(this.projectorBindGroup&&GSplatHybridRenderer.sourcesEqual(this.projectorSources,sources))return this.projectorBindGroup;{let entries=[{binding:0,resource:{buffer:arena}},{binding:1,resource:{buffer:layoutTable}},{binding:2,resource:{buffer:transforms}},{binding:3,resource:{buffer:objectParams}},{binding:4,resource:{buffer:cache}},{binding:5,resource:{buffer:keys}},{binding:6,resource:{buffer:count}},{binding:7,resource:{buffer:uniform}}];variant.baked&&bakedView&&entries.push({binding:9,resource:bakedView}),entries.push({binding:11,resource:{buffer:effect}});let created=this.device.createBindGroup({label:`gsplat-hybrid-projector-bindgroup-${variant.baked?`baked`:`plain`}`,layout:variant.bindGroupLayout,entries});return this.projectorBindGroup=created,this.projectorSources=sources,created}}ensureIndirectBindGroup(){let count=this.renderCountBuffer,args=this.indirectArgsBuffer;if(!count||!args)return null;let sources=[count,args];if(this.indirectBindGroup&&GSplatHybridRenderer.sourcesEqual(this.indirectSources,sources))return this.indirectBindGroup;{let created=this.device.createBindGroup({label:`gsplat-hybrid-indirect-bindgroup`,layout:this.indirectBindGroupLayout,entries:[{binding:0,resource:{buffer:count}},{binding:1,resource:{buffer:args}}]});return this.indirectBindGroup=created,this.indirectSources=sources,created}}ensureDrawBindGroup(sortedIndices){let cache=this.projectedCacheBuffer,count=this.renderCountBuffer,uniform=this.drawUniformBuffer;if(!cache||!count||!uniform)return null;let sources=[cache,sortedIndices,count,uniform];if(this.drawBindGroup&&GSplatHybridRenderer.sourcesEqual(this.drawSources,sources))return this.drawBindGroup;{let created=this.device.createBindGroup({label:`gsplat-hybrid-draw-bindgroup`,layout:this.drawBindGroupLayout,entries:[{binding:0,resource:{buffer:cache}},{binding:1,resource:{buffer:sortedIndices}},{binding:2,resource:{buffer:count}},{binding:3,resource:{buffer:uniform}}]});return this.drawBindGroup=created,this.drawSources=sources,created}}reportSkip(_reason){return this.lastFrameComplete=!1,null}writeEffectUniform(camera,shBaked){let buffer=this.effectUniformBuffer;if(!buffer)return;let dv=new DataView(this.effectUniformScratch),m=camera.matrixWorld.elements;dv.setFloat32(GSplatHybridRenderer.OFF_CAMERA_WORLD_POS,m[12],!0),dv.setFloat32(GSplatHybridRenderer.OFF_CAMERA_WORLD_POS+4,m[13],!0),dv.setFloat32(GSplatHybridRenderer.OFF_CAMERA_WORLD_POS+8,m[14],!0),dv.setUint32(GSplatHybridRenderer.OFF_SH_BAKED,+!!shBaked,!0),dv.setFloat32(GSplatHybridRenderer.OFF_AGG_PROGRESS,0,!0),dv.setFloat32(GSplatHybridRenderer.OFF_AGG_POINT_DURATION,0,!0),dv.setUint32(GSplatHybridRenderer.OFF_AGG_ENABLED,0,!0),dv.setUint32(GSplatHybridRenderer.OFF_NUM_GS_LAYERS,0,!0),dv.setUint32(GSplatHybridRenderer.OFF_NUM_GS_CLIPPERS,0,!0);for(let i=0;i<3;i++)dv.setFloat32(GSplatHybridRenderer.OFF_AGG_BOUNDS_MIN+i*4,0,!0),dv.setFloat32(GSplatHybridRenderer.OFF_AGG_BOUNDS_MAX+i*4,0,!0);this.device.queue.writeBuffer(buffer,0,this.effectUniformScratch)}canReplayLastFrame(arena,mirrors,camera){if(!this.lastFrameComplete||!this.drawBindGroup||!this.quadIndexBuffer||!this.indirectArgsBuffer||arena.revision!==this.lastArenaRevision||arena.totalPoints!==this.lastTotalPoints||this.width!==this.lastViewportWidth||this.height!==this.lastViewportHeight)return!1;let{layout,transform,objectParams}=mirrors;if(layout.isDirty||transform.isDirty||objectParams.isDirty||this.resolveBakedView()!==this.lastBakedView||this.bakedContentRevision!==this.lastBakedRevision)return!1;let snapshot=this.lastCameraSnapshot,world=camera.matrixWorld.elements,proj=camera.projectionMatrix.elements;for(let i=0;i<16;i++)if(snapshot[i]!==world[i]||snapshot[16+i]!==proj[i])return!1;return!0}captureFrameSnapshot(arena,camera,totalPoints,bakedView){let snapshot=this.lastCameraSnapshot,world=camera.matrixWorld.elements,proj=camera.projectionMatrix.elements;for(let i=0;i<16;i++)snapshot[i]=world[i],snapshot[16+i]=proj[i];this.lastArenaRevision=arena.revision,this.lastTotalPoints=totalPoints,this.lastViewportWidth=this.width,this.lastViewportHeight=this.height,this.lastBakedView=bakedView,this.lastBakedRevision=this.bakedContentRevision,this.lastFrameComplete=!0}encodeDrawInto(drawPass,drawBindGroup,quadIndex,args){drawPass.setPipeline(this.drawPipeline),drawPass.setBindGroup(0,drawBindGroup),drawPass.setIndexBuffer(quadIndex,`uint16`),drawPass.drawIndexedIndirect(args,0)}prepareFrame(arena,mirrors,camera){if(!arena||arena.unusable)return this.reportSkip(`no-arena`);if(!mirrors)return this.reportSkip(`no-mirrors`);let arenaBuffer=arena.buffer,totalPoints=arena.totalPoints;if(!arenaBuffer||totalPoints<=0)return this.reportSkip(`no-points`);let{layout,transform,objectParams}=mirrors;if(layout.unusable||transform.unusable||objectParams.unusable)return this.reportSkip(`no-mirrors`);layout.upload(),transform.upload(),objectParams.upload();let entryCount=layout.entryCount;if(entryCount===0)return this.reportSkip(`no-entries`);let layoutBuffer=layout.buffer,transformBuffer=transform.buffer,objectParamsBuffer=objectParams.buffer;if(!layoutBuffer||!transformBuffer||!objectParamsBuffer)return this.reportSkip(`no-mirrors`);if(!this.ensureProjectedCache(totalPoints)||!this.ensureSortKeys(totalPoints))return this.reportSkip(`resource`);let indirectBindGroup=this.ensureIndirectBindGroup();if(!indirectBindGroup)return this.reportSkip(`bind-group`);let bakedView=this.resolveBakedView(),variant=bakedView?this.bakedVariant:this.plainVariant,projectorBindGroup=this.ensureProjectorBindGroup(arenaBuffer,layoutBuffer,transformBuffer,objectParamsBuffer,variant,bakedView);return projectorBindGroup?(this.writeProjectorFrameUniform(camera,this.width,this.height,totalPoints,entryCount),this.writeDrawUniform(camera,this.width,this.height),this.writeEffectUniform(camera,variant.baked),{projectorBindGroup,indirectBindGroup,variant,bakedView,workgroups:Math.ceil(totalPoints/256),totalPoints}):this.reportSkip(`bind-group`)}submitFrame(drawPass,arena,camera,mirrors){if(this.unusable||this.width<=0||this.height<=0)return;let cheapStaging=null,pendingDraw=null,encoder=this.device.createCommandEncoder({label:`gsplat-hybrid-frame`});if(arena==null||arena.encodeAssembly(encoder),arena&&mirrors&&this.canReplayLastFrame(arena,mirrors,camera)){this.device.queue.submit([encoder.finish()]);let replayBindGroup=this.drawBindGroup,replayIndex=this.quadIndexBuffer,replayArgs=this.indirectArgsBuffer;replayBindGroup&&replayIndex&&replayArgs&&this.encodeDrawInto(drawPass,replayBindGroup,replayIndex,replayArgs),arena.flushPendingDestroy();return}let prepared=this.prepareFrame(arena,mirrors,camera),renderCount=this.renderCountBuffer;renderCount&&encoder.clearBuffer(renderCount,0,4);let indirectArgs=this.indirectArgsBuffer;if(indirectArgs&&encoder.clearBuffer(indirectArgs,0,32),prepared){let headPass=encoder.beginComputePass({label:`gsplat-hybrid-head`});headPass.setBindGroup(0,prepared.projectorBindGroup),headPass.setPipeline(prepared.variant.fillSortKeysPipeline),headPass.dispatchWorkgroups(prepared.workgroups),headPass.setPipeline(prepared.variant.projectorPipeline),headPass.dispatchWorkgroups(prepared.workgroups),headPass.setPipeline(this.indirectPipeline),headPass.setBindGroup(0,prepared.indirectBindGroup),headPass.dispatchWorkgroups(1),headPass.end();let sortKeys=this.sortKeysBuffer,radixSort=this.radixSort;if(!sortKeys||!radixSort){this.lastFrameComplete=!1,this.device.queue.submit([encoder.finish()]),arena==null||arena.flushPendingDestroy();return}let{sortedIndices}=radixSort.encode(encoder,sortKeys,prepared.totalPoints,20,{destructiveKeys:!0,minCapacity:this.sortKeysCapacityElements}),drawBindGroup=this.ensureDrawBindGroup(sortedIndices);if(!drawBindGroup){this.lastFrameComplete=!1,this.device.queue.submit([encoder.finish()]),arena==null||arena.flushPendingDestroy();return}cheapStaging=this.encodeCheapReadback(encoder),pendingDraw={bindGroup:drawBindGroup,totalPoints:prepared.totalPoints,bakedView:prepared.bakedView}}if(this.device.queue.submit([encoder.finish()]),pendingDraw){let quadIndex=this.quadIndexBuffer,args=this.indirectArgsBuffer;quadIndex&&args&&(this.encodeDrawInto(drawPass,pendingDraw.bindGroup,quadIndex,args),this.captureFrameSnapshot(arena,camera,pendingDraw.totalPoints,pendingDraw.bakedView))}arena==null||arena.flushPendingDestroy(),cheapStaging&&(this.readbackInFlight=!0,this.finishCheapReadback(cheapStaging))}encodeCheapReadback(encoder){if(this.readbackInFlight)return null;let source=this.renderCountBuffer;if(!source)return null;let staging=this.createBuffer(`readback`,GSplatHybridRenderer.CHEAP_READBACK_SIZE,GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST);return staging?(this.readbackBuffer=staging,encoder.copyBufferToBuffer(source,0,staging,0,GSplatHybridRenderer.CHEAP_READBACK_SIZE),staging):null}finishCheapReadback(staging){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let size=GSplatHybridRenderer.CHEAP_READBACK_SIZE;try{yield this.device.queue.onSubmittedWorkDone(),yield staging.mapAsync(GPUMapMode.READ,0,size);let copied=new Uint32Array(staging.getMappedRange(0,size).slice(0));staging.unmap(),this.lastRenderCount=copied[0]>>>0}catch(_a){}finally{this.readbackInFlight=!1,this.destroyBufferSafely(staging),this.readbackBuffer===staging&&(this.readbackBuffer=null)}})}dispose(){var _a;this.disposed||(this.disposed=!0,this.destroyBufferSafely(this.projectorUniformBuffer),this.destroyBufferSafely(this.drawUniformBuffer),this.destroyBufferSafely(this.effectUniformBuffer),this.destroyBufferSafely(this.projectedCacheBuffer),this.destroyBufferSafely(this.sortKeysBuffer),this.destroyBufferSafely(this.renderCountBuffer),this.destroyBufferSafely(this.indirectArgsBuffer),this.destroyBufferSafely(this.quadIndexBuffer),this.projectorUniformBuffer=null,this.drawUniformBuffer=null,this.effectUniformBuffer=null,this.projectedCacheBuffer=null,this.sortKeysBuffer=null,this.renderCountBuffer=null,this.indirectArgsBuffer=null,this.quadIndexBuffer=null,this.lastFrameComplete=!1,this.projectedCacheCapacityPoints=0,this.sortKeysCapacityElements=0,this.bakedTexture=null,this.bakedEnabled=!1,this.lastBakedView=null,(_a=this.radixSort)==null||_a.destroy(),this.radixSort=null,this.projectorBindGroup=null,this.projectorSources=null,this.indirectBindGroup=null,this.indirectSources=null,this.drawBindGroup=null,this.drawSources=null)}};GSplatHybridRenderer.PROJECTOR_UNIFORM_SIZE=176,GSplatHybridRenderer.OFF_VIEW=0,GSplatHybridRenderer.OFF_VIEW_PROJ=64,GSplatHybridRenderer.OFF_FOCAL=128,GSplatHybridRenderer.OFF_VIEWPORT=136,GSplatHybridRenderer.OFF_TOTAL_POINTS=144,GSplatHybridRenderer.OFF_ENTRY_COUNT=148,GSplatHybridRenderer.OFF_MIN_PIXEL_SIZE=152,GSplatHybridRenderer.OFF_MAX_RADIUS_CAP=156,GSplatHybridRenderer.OFF_COV_PACK_SCALE=160,GSplatHybridRenderer.OFF_TERM2_SQ_FLOOR=164,GSplatHybridRenderer.OFF_DEPTH_EPSILON=168,GSplatHybridRenderer.OFF_DET_EPSILON=172,GSplatHybridRenderer.DRAW_UNIFORM_SIZE=32,GSplatHybridRenderer.OFF_DRAW_VIEWPORT=0,GSplatHybridRenderer.OFF_DRAW_P22=8,GSplatHybridRenderer.OFF_DRAW_P32=12,GSplatHybridRenderer.EFFECT_UNIFORM_SIZE=64,GSplatHybridRenderer.OFF_AGG_BOUNDS_MIN=0,GSplatHybridRenderer.OFF_AGG_PROGRESS=12,GSplatHybridRenderer.OFF_AGG_BOUNDS_MAX=16,GSplatHybridRenderer.OFF_AGG_POINT_DURATION=28,GSplatHybridRenderer.OFF_CAMERA_WORLD_POS=32,GSplatHybridRenderer.OFF_AGG_ENABLED=44,GSplatHybridRenderer.OFF_SH_BAKED=48,GSplatHybridRenderer.OFF_NUM_GS_LAYERS=56,GSplatHybridRenderer.OFF_NUM_GS_CLIPPERS=60,GSplatHybridRenderer.CHEAP_READBACK_SIZE=4;var BYTE_ALIGNMENT=4,MirrorBuffer=class{constructor(device){this.data=new ArrayBuffer(0),this.buf=null,this.capacityRecords=0,this.records=0,this.dirty=!0,this.disposed=!1,this.device=device}get buffer(){return this.unusable?null:this.buf}get recordCount(){return this.unusable?0:this.records}get unusable(){return this.disposed}get isDirty(){return this.dirty}markDirty(){this.dirty=!0}upload(){if(this.disposed||!this.dirty)return;let count=this.fill();if(count<0)return;this.records=count;let bytes=count*this.bytesPerRecord;if(bytes===0){this.dirty=!1;return}let buffer=this.buf;buffer&&(this.device.queue.writeBuffer(buffer,0,this.data,0,bytes),this.dirty=!1)}ensureCapacity(needed){if(this.disposed)return!1;if(this.buf&&needed<=this.capacityRecords)return!0;let bytes=needed*this.bytesPerRecord,created=this.device.createBuffer({label:`gsplat-mirror-${this.label}`,size:bytes,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return this.destroyBuffer(),this.buf=created,this.capacityRecords=needed,this.data=new ArrayBuffer(bytes),!0}dispose(){this.disposed||(this.disposed=!0,this.destroyBuffer(),this.data=new ArrayBuffer(0),this.capacityRecords=0,this.records=0)}destroyBuffer(){let buffer=this.buf;if(buffer){this.buf=null;try{buffer.destroy()}catch(_a){}}}assertAlignment(){this.bytesPerRecord%BYTE_ALIGNMENT!==0&&console.error(`[GS][cull] 镜像缓冲 ${this.label} 的记录字节数 ${this.bytesPerRecord} 不是 ${BYTE_ALIGNMENT} 的整数倍,storage buffer 寻址会错位。`)}},U32_PER_RECORD=4,BYTES_PER_RECORD$2=U32_PER_RECORD*4,LayoutMirror=class extends MirrorBuffer{constructor(device,getLayout){super(device),this.bytesPerRecord=BYTES_PER_RECORD$2,this.label=`layout`,this.lastRevision=-1,this.getLayout=getLayout,this.assertAlignment()}checkRevision(revision){revision!==this.lastRevision&&(this.lastRevision=revision,this.markDirty())}get entryCount(){return this.recordCount}fill(){let layout=this.getLayout(),count=layout.length;if(count===0)return 0;if(!this.ensureCapacity(count))return-1;let view=new Uint32Array(this.data);for(let i=0;i<count;i++){let entry=layout[i],base=i*U32_PER_RECORD;view[base+0]=entry.startPoint>>>0,view[base+1]=entry.count>>>0,view[base+2]=entry.transformIndex>>>0,view[base+3]=entry.layerIndex>>>0}return count}},F32_PER_RECORD$1=16,BYTES_PER_RECORD$1=F32_PER_RECORD$1*4,SOURCE_FLOATS_PER_OBJECT=20,TransformMirror=class extends MirrorBuffer{constructor(device,getStore){super(device),this.bytesPerRecord=BYTES_PER_RECORD$1,this.label=`transform`,this.getStore=getStore,this.assertAlignment()}fill(){let store=this.getStore(),count=store.objectCount;if(count===0)return 0;if(!this.ensureCapacity(count))return-1;let source=store.transforms;if(source.length<count*SOURCE_FLOATS_PER_OBJECT)return-1;let view=new Float32Array(this.data);for(let i=0;i<count;i++){let src=i*SOURCE_FLOATS_PER_OBJECT,dst=i*F32_PER_RECORD$1;for(let k=0;k<F32_PER_RECORD$1;k++)view[dst+k]=source[src+k]}return count}},F32_PER_RECORD=4,BYTES_PER_RECORD=F32_PER_RECORD*4,ObjectParamsMirror=class extends MirrorBuffer{constructor(device,getObjects){super(device),this.bytesPerRecord=BYTES_PER_RECORD,this.label=`object-params`,this.getObjects=getObjects,this.assertAlignment()}checkDirty(){let objects=this.getObjects();for(let i=0;i<objects.length;i++)if(objects[i].renderParamsChanged){this.markDirty();return}}fill(){let objects=this.getObjects(),count=objects.length;if(count===0)return 0;if(!this.ensureCapacity(count))return-1;let view=new Float32Array(this.data);for(let i=0;i<count;i++){let obj=objects[i],base=i*F32_PER_RECORD;view[base+0]=obj.preBlurAmount,view[base+1]=obj.blurAmount,view[base+2]=0,view[base+3]=0}return count}},NO_LAYOUT_ENTRIES=[],NO_MIRROR_OBJECTS=[],_scratchSize=new three_webgpu.Vector2,_shCameraWorld=new three_webgpu.Vector3,PBMGaussianSplattingRenderMesh=class extends three_webgpu.Mesh{constructor(){super(),this.needsRender=!1,this.assembler=new SplatAssembler,this.transformStore=new TransformStore,this.layerRegistry=new LayerRegistry,this.shAssembler=new SHAssembler,this.shBaker=new SHBaker,this.shScheduler=new SHBakeScheduler,this.shJobs=[],this.shEntries=[],this.shCapacityWarned=!1,this.shBakedActive=!1,this.shLastComputePath=null,this.glMaxTextureSize=0,this.pipeline=null,this.throttle=new SortThrottle,this._requestedPipelineMode=0,this._activePipelineMode=1,this._pipelineRenderer=null,this.assemblePending=!1,this.forceClipperUniformRefresh=!1,this.appliedSHDegree=0,this._requestedInstanceSize=128,this._effectiveInstanceSize=1,this._geometryQuadCount=1,this._pipelineResolved=!1,this._disposed=!1,this.maxComputePoints=DEFAULT_MAX_COMPUTE_POINTS,this._arena=null,this._layoutMirror=null,this._transformMirror=null,this._objectParamsMirror=null,this._mirrorSet=null,this._mirrorObjects=NO_MIRROR_OBJECTS,this._survivorCount=null,this._computePathActive=!1,this._hybridRenderer=null,this._computeFailure=null,this.onBeforeRender=(renderer,scene,camera,..._rest)=>{var _a,_b,_c;let objects=this.collectObjects(scene);if(objects.length===0){this.geometry.instanceCount=0,this._computePathActive=!1,(_a=this._arena)==null||_a.sync([],()=>({transformIndex:0,layerIndex:0}));return}this.prepareComputePath(renderer);let usedSH=0,dataSH=0;for(let obj of objects)obj.usedSHDegree>usedSH&&(usedSH=obj.usedSHDegree),obj.maxSHDegree>dataSH&&(dataSH=obj.maxSHDegree);let appliedSH=Math.max(0,Math.min(usedSH,dataSH,2)),shDegreeChanged=appliedSH!==this.appliedSHDegree;this.appliedSHDegree=appliedSH,this._computePathActive&&this.resolveHybridUnsupportedReason(objects)!==null&&(this._computePathActive=!1);let inputsDirty=!1;this.isSceneNeedsRebuild(objects)?(this.rebuildScene(objects),this.gsSceneState.lastClipperHash=``,this.forceClipperUniformRefresh=!0,inputsDirty=!0):shDegreeChanged&&this.syncSH(objects),this._computePathActive&&(this._arena===null||this._arena.unusable)&&(this._computePathActive=!1);for(let obj of objects)obj.transformChanged&&(this.transformStore.updateOne(obj),(_b=this._transformMirror)==null||_b.markDirty(),obj.transformChanged=!1,obj.selectedChanged=!1,inputsDirty=!0);(_c=this._objectParamsMirror)==null||_c.checkDirty();for(let obj of objects)obj.renderParamsChanged&&(this.transformStore.updateOne(obj),obj.renderParamsChanged=!1);this.assemblePending&&!this._computePathActive&&(this.assembler.assemble(),this.assemblePending=!1),this.updateSHBake(renderer,camera),this.syncMaterialTextures();let totalPoints=this.assembler.totalPoints;this.syncPipelineMode(renderer,totalPoints),this._pipelineResolved=!0;let pipeline=this.pipeline,packingOk=this.syncInstancePacking(totalPoints);inputsDirty&&pipeline.markInputsDirty(),this._frameParams.camera=camera,this._frameParams.objects=objects,this._frameParams.totalPoints=totalPoints;let resourcesReady=totalPoints>0&&this.assembler.dataTexture!==null&&this.transformStore.texture!==null;resourcesReady&&this.throttle.shouldSort(camera,inputsDirty)&&(pipeline.requestSort(this._frameParams),this.throttle.markSorted(camera)),pipeline.frameUpdate(this._frameParams);let clipperHash=this.getClipperHash(objects);(this.forceClipperUniformRefresh||clipperHash!==this.gsSceneState.lastClipperHash)&&(this.updateClipperUniforms(objects),this.gsSceneState.lastClipperHash=clipperHash,this.forceClipperUniformRefresh=!1,this.needsRender=!0);let indexSource=pipeline.indexSource;if(indexSource.kind===`orderTexture`)this.material.orderTexture=indexSource.texture;else{let attr=indexSource.attribute;this.geometry.getAttribute(`splatIndex`)!==attr&&(this.geometry.setAttribute(`splatIndex`,attr),this.geometry._maxInstanceCount=attr.count)}this.material.syncDynamicUniforms(),this.geometry.instanceCount=this._computePathActive?0:packingOk?this.resolveInstanceCount(pipeline,resourcesReady):0,this._computePathActive&&this.drawHybrid(renderer,camera)};let geometry=this.createGeometry(),material=this.createMaterial();this.geometry=geometry,this.material=material,this.frustumCulled=!1,this.renderOrder=-99999999999,this.gsSceneState={lastObjectsHash:``,lastClipperHash:``},this._frameParams={camera:null,objects:[],assembler:this.assembler,transformStore:this.transformStore,totalPoints:0}}get pipelineMode(){return this._requestedPipelineMode}set pipelineMode(value){this._requestedPipelineMode=value}get currentPipelineMode(){return this._activePipelineMode}get computePathActive(){return this._computePathActive}get arena(){return this._arena}get mirrors(){return this._mirrorSet}get survivorCount(){return this._survivorCount}setSurvivorCount(value){this._survivorCount=value}get requestedInstanceSize(){return this._requestedInstanceSize}set requestedInstanceSize(value){if(this._requestedInstanceSize=value,this._disposed)return;let result=resolveInstanceSize(value,this._activePipelineMode,this._pipelineResolved);this._effectiveInstanceSize=result.value,result.reason===`not-finite`?console.warn(`[GS] requestedInstanceSize 取值无效(${String(value)}),已按 1 生效。`):result.reason===`out-of-range`&&console.warn(`[GS] requestedInstanceSize=${value} 越界,已 clamp 到 ${result.value}(有效范围 [1, 256])。`)}get effectiveInstanceSize(){return this._effectiveInstanceSize}get sortCameraDistance(){return this.throttle.sortCameraDistance}set sortCameraDistance(value){this.throttle.sortCameraDistance=value}get sortCameraCoorient(){return this.throttle.sortCameraCoorient}set sortCameraCoorient(value){this.throttle.sortCameraCoorient=value}get sortMinIntervalMs(){return this.throttle.sortMinIntervalMs}set sortMinIntervalMs(value){this.throttle.sortMinIntervalMs=value}get shRebakeAngle(){return this.shScheduler?this.shScheduler.rebakeAngle:0}set shRebakeAngle(value){let v=sanitizeRebakeAngle(value);if(v===null){console.warn(`[PBMGaussianSplattingRenderMesh] shRebakeAngle 取值非法:${value},合法区间为 [0, 90),已忽略`);return}this.shScheduler&&(this.shScheduler.rebakeAngle=v)}createGeometry(){let geometry=new three_webgpu.InstancedBufferGeometry,{positions,indices}=buildPackedQuadGeometryData(1);geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.setIndex(new three_webgpu.BufferAttribute(indices,1));let splatIndices=new Float32Array(1),indexAttr=new three_webgpu.InstancedBufferAttribute(splatIndices,1,!1,1);return indexAttr.setUsage(three_webgpu.DynamicDrawUsage),geometry.setAttribute(`splatIndex`,indexAttr),geometry._maxInstanceCount=1,geometry.instanceCount=0,geometry}createMaterial(){return new PBMGaussianSplattingNodeMaterial({numGsLayers:0,numGsClippers:0,shBaked:!1})}createDefaultLayerClipperRanges(count){return Array.from({length:count},()=>new three_webgpu.Vector2(-1,0))}createDefaultClipperMatrices(count){return Array.from({length:count},()=>new three_webgpu.Matrix4)}collectObjects(scene){let pbmGSObjects=[];return scene.traverse(object=>{object instanceof require_pbmGaussianSplattingObject.t&&object.visible&&pbmGSObjects.push(object)}),pbmGSObjects.sort((a,b)=>{let keyA=a.uuid+a.gsViewLayerKey,keyB=b.uuid+b.gsViewLayerKey;return keyA<keyB?-1:+(keyA>keyB)}),pbmGSObjects}isSceneNeedsRebuild(objects){let hash=objects.map(obj=>`${obj.uuid}:${obj.gsViewLayerKey}`).join(`|`),result=hash!==this.gsSceneState.lastObjectsHash;return this.gsSceneState.lastObjectsHash=hash,result}getClipperHash(objects){return objects.map(obj=>{let clipperHash=obj.gsClippers.map(clipper=>{var _a;return`${(_a=clipper.floorIndex)==null?-1:_a}:${clipper.clippingBoxMatrix.elements.join(`,`)}`}).join(`;`);return`${obj.gsViewLayerKey}:${clipperHash}`}).join(`|`)}updateClipperCounts(layerCount,clipperCount){let nextLayerCount=Math.max(0,layerCount|0),nextClipperCount=Math.max(0,clipperCount|0);(this.material.numGsLayers!==nextLayerCount||this.material.numGsClippers!==nextClipperCount)&&(this.material.numGsLayers=nextLayerCount,this.material.numGsClippers=nextClipperCount,this.material.needsUpdate=!0)}updateClipperUniforms(pbmGSObjects){var _a,_b;let layerCount=this.layerRegistry.layerCount;if(layerCount===0){this.material.layerClipperRanges=[],this.material.clipperMatricesInverse=[],this.updateClipperCounts(0,0);return}let clippersByLayer=new Map;for(let object of pbmGSObjects){let layerKey=object.gsViewLayerKey||object.uuid;clippersByLayer.has(layerKey)||clippersByLayer.set(layerKey,object.gsClippers)}let totalClipperCount=0;for(let layerKey of this.layerRegistry.layerKeys)totalClipperCount+=((_a=clippersByLayer.get(layerKey))==null?[]:_a).length;let layerRanges=this.createDefaultLayerClipperRanges(layerCount),clipperMatrices=this.createDefaultClipperMatrices(totalClipperCount),clipperCursor=0;for(let layerKey of this.layerRegistry.layerKeys){let layerIndex=this.layerRegistry.layerKeyToIndex.get(layerKey);if(layerIndex===void 0)continue;let clippers=(_b=clippersByLayer.get(layerKey))==null?[]:_b,start=clipperCursor,count=0;for(let clipper of clippers)clipperMatrices[clipperCursor].copy(clipper.clippingBoxMatrix).invert(),clipperCursor++,count++;count>0&&layerRanges[layerIndex].set(start,count)}this.material.layerClipperRanges=layerRanges,this.material.clipperMatricesInverse=clipperMatrices,this.updateClipperCounts(layerCount,clipperCursor)}rebuildScene(objects){var _a,_b,_c,_d;this.layerRegistry.sync(objects),this.transformStore.sync(objects);let resolveIndices=obj=>{let transformIndex=this.transformStore.indexOf(obj);return transformIndex===void 0?(console.error(`[GS] resolveIndices: 对象缺少 transformIndex(布局不一致)。`),{transformIndex:0,layerIndex:this.layerRegistry.layerIndexOf(obj)}):{transformIndex,layerIndex:this.layerRegistry.layerIndexOf(obj)}};this.assembler.sync(objects,resolveIndices),this.assemblePending=!0,(_a=this._arena)==null||_a.sync(objects,resolveIndices),this._mirrorObjects=objects;let arenaForMirrors=this._arena;arenaForMirrors&&((_b=this._layoutMirror)==null||_b.checkRevision(arenaForMirrors.revision)),(_c=this._transformMirror)==null||_c.markDirty(),(_d=this._objectParamsMirror)==null||_d.markDirty(),this.syncSH(objects),this.assertLayoutConsistency(objects)}syncSH(objects){this.shAssembler.sync(objects,this.appliedSHDegree),this.shScheduler.prune(new Set(objects))}getMaxTextureSize(renderer){var _a,_b;let backend=renderer.backend;if(backend.isWebGPUBackend)return(_b=(_a=backend.device)==null?void 0:_a.limits.maxTextureDimension2D)==null?8192:_b;if(this.glMaxTextureSize===0){let gl=backend.gl;this.glMaxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE)}return this.glMaxTextureSize}updateSHBake(renderer,camera){var _a;this.shBakedActive=!1;let baker=this.shBaker,scheduler=this.shScheduler;if(this.appliedSHDegree===0){baker.releaseTarget(),scheduler.clear(),this.shLastComputePath=null;return}let compute=this._computePathActive,arena=this._arena,totalPoints=compute?arena.totalPoints:this.assembler.totalPoints,{reallocated,ok}=baker.ensureCapacity(totalPoints,this.getMaxTextureSize(renderer));if(!ok){this.shCapacityWarned||(this.shCapacityWarned=!0,console.warn(`[PBMGaussianSplattingRenderMesh] SH 烘焙纹理超出最大纹理尺寸,本帧不使用 SH`));return}let entries=this.assembler.regions;if(compute){let layout=arena.layout,out=this.shEntries;for(let i=0;i<layout.length;i++){let l=layout[i],e=out[i];e?(e.object=l.object,e.start=l.startPoint,e.count=l.count):out[i]={object:l.object,start:l.startPoint,count:l.count}}out.length=layout.length,entries=out}let forceAll=reallocated||this.shLastComputePath!==compute;this.shLastComputePath=compute,_shCameraWorld.setFromMatrixPosition(camera.matrixWorld),scheduler.plan(entries,this.shAssembler,_shCameraWorld,this.appliedSHDegree,forceAll,this.shJobs),baker.bake(renderer,this.shJobs,this.appliedSHDegree),this.shJobs.length>0&&((_a=this._hybridRenderer)==null||_a.notifyBakedContentChanged()),this.shBakedActive=!0}assertLayoutConsistency(objects){var _a;let regions=this.assembler.regions;if(regions.length!==objects.length||this.transformStore.objectCount!==objects.length){console.error(`[GS] 布局不一致:objects=${objects.length} regions=${regions.length} transforms=${this.transformStore.objectCount}`);return}for(let i=0;i<objects.length;i++)if(regions[i].object!==objects[i]||this.transformStore.indexOf(objects[i])!==i){console.error(`[GS] 布局不一致:第 ${i} 个对象在 regionList / TransformStore 中错位。`);break}let layout=(_a=this._arena)==null?void 0:_a.layout;if(layout&&layout.length>0){let previous=-1;for(let i=0;i<layout.length;i++){let entry=layout[i],position=this.transformStore.indexOf(entry.object);if(position===void 0||position<=previous||position!==entry.transformIndex){console.error(`[GS] 布局不一致:Arena 布局表第 ${i} 项错位(对象在 TransformStore 中的序号为 ${position==null?`不存在`:position},表项记录的 transformIndex 为 ${entry.transformIndex},前一项序号 ${previous})。`);break}previous=position}}}syncMaterialTextures(){var _a,_b,_c;this.material.transformsTexture=this.transformStore.texture;let baked=this.shBakedActive;this.material.shBaked!==baked&&(this.material.shBaked=baked,this.material.needsUpdate=!0);let bakedTexture=(_b=(_a=this.shBaker)==null?void 0:_a.texture)==null?null:_b;this.material.bakedColorTexture=baked?bakedTexture:null,(_c=this._hybridRenderer)==null||_c.setBakedSource(bakedTexture,baked),this.material.dataTexture=this.assembler.dataTexture,this.material.numPoints=this.assembler.totalPoints,this.material.transformIndicesTexture=null,this.material.layerIndicesTexture=null}syncPipelineMode(renderer,totalPoints){var _a;let resolved=resolvePipelineMode(this._requestedPipelineMode,renderer,totalPoints,this.pipeline);if(resolved===this._activePipelineMode&&this.pipeline&&this._pipelineRenderer===renderer)return;(_a=this.pipeline)==null||_a.dispose(),this.pipeline=resolved===2?new GpuSortPipeline(renderer):new CpuSortPipeline(renderer,()=>{this.needsRender=!0}),this._activePipelineMode=resolved,this._pipelineRenderer=renderer,this.pipeline.markInputsDirty(),this.throttle.reset();let useOrderTexture=this.pipeline.requiresOrderTexture;this.material.useOrderTexture!==useOrderTexture&&(this.material.useOrderTexture=useOrderTexture,this.material.needsUpdate=!0),this.geometry.instanceCount=0}syncInstancePacking(totalPoints){let effective=resolveInstanceSize(this._requestedInstanceSize,this._activePipelineMode,this._pipelineResolved).value;return this._effectiveInstanceSize=effective,totalPoints<=0?!0:this._geometryQuadCount===effective?(this.syncMaterialInstanceSize(effective),!0):(this.rebuildPackedQuadGeometry(effective),this.syncMaterialInstanceSize(effective),!0)}syncMaterialInstanceSize(effective){this.material.instanceSize!==effective&&(this.material.instanceSize=effective,this.material.needsUpdate=!0)}rebuildPackedQuadGeometry(quadCount){let geometry=this.geometry,prevPosition=geometry.getAttribute(`position`),prevIndex=geometry.getIndex(),{positions,indices}=buildPackedQuadGeometryData(quadCount);geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),this._geometryQuadCount=quadCount,this.releaseAttributeGpuResource(prevPosition),this.releaseAttributeGpuResource(prevIndex)}releaseAttributeGpuResource(attribute){var _a,_b;if(!attribute)return;let renderer=this._pipelineRenderer;try{(_b=(_a=renderer==null?void 0:renderer._attributes)==null?void 0:_a.delete)==null||_b.call(_a,attribute)}catch(_c){}}resolveInstanceCount(pipeline,resourcesReady){if(!resourcesReady)return 0;let raw=pipeline.instanceCount;if(!(raw>0))return 0;let k=this._effectiveInstanceSize,count=pipeline.requiresOrderTexture?Math.ceil(raw/k):raw;return!Number.isFinite(count)||count<0?0:count}probeComputeBackend(renderer){let backend=renderer==null?void 0:renderer.backend;return(backend==null?void 0:backend.isWebGPUBackend)===!0&&!!backend.device}prepareComputePath(renderer){var _a,_b;let backendOk=this.probeComputeBackend(renderer),device=backendOk&&!this._arena&&!this._disposed&&this._computeFailure===null?(_a=renderer==null?void 0:renderer.backend)==null?void 0:_a.device:void 0;if(device)try{this.createComputeResources(renderer,device)}catch(error){this._arena=null,this._hybridRenderer=null,this.disposeMirrors(),this._computeFailure=String((_b=error==null?void 0:error.message)==null?error:_b),console.error(`[GS] Compute_Path 初始化失败,3DGS 改用 Fallback_Path。常见原因:设备的 maxStorageBuffersInVertexStage 为 0(Draw pipeline 的顶点阶段要读 3 个 storage buffer)。原始错误:`,error);return}this._arena&&(this._arena.maxPoints=this.maxComputePoints);let arena=this._arena;this._computePathActive=backendOk&&arena!==null&&!arena.unusable&&this._hybridRenderer!==null}createComputeResources(renderer,device){this._arena=new SplatArena(device),this._hybridRenderer=this.createHybridRenderer(renderer,device),this.gsSceneState.lastObjectsHash=``,this.createMirrors(device)}createHybridRenderer(renderer,device){var _a,_b,_c,_d;if(renderer!=null&&renderer.logarithmicDepthBuffer)return null;let created=new GSplatHybridRenderer(device,((_c=(_b=(_a=renderer==null?void 0:renderer.getRenderTarget)==null?void 0:_a.call(renderer))==null?void 0:_b.texture)==null?void 0:_c.type)===three_webgpu.HalfFloatType?`rgba16float`:`rgba8unorm`,`depth24plus`,(_d=renderer.backend)==null?null:_d),size=renderer.getDrawingBufferSize(_scratchSize);return created.resize(size.x,size.y),created}drawHybrid(renderer,camera){let hybrid=this._hybridRenderer;if(!hybrid)return;let size=renderer.getDrawingBufferSize(_scratchSize);hybrid.resize(size.x,size.y);let activePass=this.getActiveRenderPass(renderer);activePass&&(hybrid.submitFrame(activePass.pass,this._arena,camera,this.mirrors),activePass.invalidateStateCache(),this._survivorCount=hybrid.renderCount)}getActiveRenderPass(renderer){var _a,_b;try{let renderContext=renderer._currentRenderContext;if(!renderContext)return null;let data=(_b=(_a=renderer.backend)==null?void 0:_a.get)==null?void 0:_b.call(_a,renderContext),pass=data==null?void 0:data.currentPass;return pass?{pass,invalidateStateCache:()=>{let sets=data.currentSets;sets&&(sets.pipeline=null,sets.index=null,sets.attributes={},sets.bindingGroups=[])}}:null}catch(_c){return null}}createMirrors(device){this._layoutMirror=new LayoutMirror(device,()=>{var _a,_b;return(_b=(_a=this._arena)==null?void 0:_a.layout)==null?NO_LAYOUT_ENTRIES:_b}),this._transformMirror=new TransformMirror(device,()=>this.transformStore),this._objectParamsMirror=new ObjectParamsMirror(device,()=>this._mirrorObjects),this._mirrorSet={layout:this._layoutMirror,transform:this._transformMirror,objectParams:this._objectParamsMirror}}disposeMirrors(){var _a,_b,_c;(_a=this._layoutMirror)==null||_a.dispose(),(_b=this._transformMirror)==null||_b.dispose(),(_c=this._objectParamsMirror)==null||_c.dispose(),this._layoutMirror=null,this._transformMirror=null,this._objectParamsMirror=null,this._mirrorSet=null,this._mirrorObjects=NO_MIRROR_OBJECTS}resolveHybridUnsupportedReason(objects){for(let object of objects)if(object.gsClippers.length>0)return`clipper-not-migrated`;return this.material.aggregationEnabled?`aggregation-not-migrated`:null}dispose(){var _a,_b,_c;this._disposed=!0,(_a=this.pipeline)==null||_a.dispose(),this.pipeline=null,this._pipelineRenderer=null,this.assembler.dispose(),(_b=this._arena)==null||_b.dispose(),this._arena=null,(_c=this._hybridRenderer)==null||_c.dispose(),this._hybridRenderer=null,this.disposeMirrors(),this._survivorCount=null,this._computePathActive=!1,this.transformStore.dispose(),this.shAssembler&&(this.shAssembler.dispose(),this.shAssembler=null),this.shBaker&&(this.shBaker.dispose(),this.shBaker=null),this.shScheduler&&(this.shScheduler.clear(),this.shScheduler=null),this.shJobs.length=0,this.shEntries.length=0,this.shBakedActive=!1,this.geometry.dispose(),this.material.dispose()}};function safeFloatAttribute(name,defaultValue=0){let nodeType=`float`,node=(0,three_tsl.attribute)(name,nodeType),originalGenerate=node.generate.bind(node);return node.generate=function(builder){return builder.hasGeometryAttribute(name)?originalGenerate(builder):builder.generateConst(nodeType,defaultValue)},(0,three_tsl.float)(node)}function mrFloat(name){return(0,three_tsl.float)((0,three_tsl.materialReference)(name,`float`)).toVar(name)}function mrVec3(name){return(0,three_tsl.vec3)((0,three_tsl.materialReference)(name,`vec3`)).toVar(name)}function mrVec4(name){return(0,three_tsl.vec4)((0,three_tsl.materialReference)(name,`vec4`)).toVar(name)}function mrMat4(name){return(0,three_tsl.mat4)((0,three_tsl.materialReference)(name,`mat4`)).toVar(name)}function mrCubeTexture(name,uvNode){let refNode=(0,three_tsl.materialReference)(name,`cubeTexture`),originSetup=refNode.setup;return refNode.setup=function(builder){let cubeTextureNode=originSetup.call(this,builder);return cubeTextureNode&&(uvNode&&(cubeTextureNode.uvNode=uvNode),cubeTextureNode.getUniformHash=function(){return[name,this.value.uuid].join(`-`)}),cubeTextureNode},(0,three_tsl.vec4)(refNode).toVar(name)}function mrTexture(name,uvNode){let refNode=(0,three_tsl.materialReference)(name,`texture`),originSetup=refNode.setup;return refNode.setup=function(builder){let textureNode=originSetup.call(this,builder);return textureNode&&(uvNode&&(textureNode.uvNode=uvNode),textureNode.getUniformHash=function(){return[name,this.value.uuid].join(`-`)}),textureNode},(0,three_tsl.vec4)(refNode).toVar(name)}var rgb2hsv=(0,three_tsl.Fn)(([color])=>{let c=(0,three_tsl.vec3)(color).toVar(),K=(0,three_tsl.vec4)(0,-1/3,2/3,-1),p=(0,three_tsl.mix)((0,three_tsl.vec4)(c.b,c.g,K.w,K.z),(0,three_tsl.vec4)(c.g,c.b,K.x,K.y),(0,three_tsl.step)(c.b,c.g)).toVar(),q=(0,three_tsl.mix)((0,three_tsl.vec4)(p.x,p.y,p.w,c.r),(0,three_tsl.vec4)(c.r,p.y,p.z,p.x),(0,three_tsl.step)(p.x,c.r)).toVar(),d=q.x.sub((0,three_tsl.min)(q.w,q.y)),e=(0,three_tsl.float)(1e-10);return(0,three_tsl.vec3)((0,three_tsl.abs)(q.z.add(q.w.sub(q.y).div(d.mul(6).add(e)))),d.div(q.x.add(e)),q.x)}).setLayout({name:`FN_rgb2hsv`,type:`vec3`,inputs:[{name:`color`,type:`vec3`}]}),hsv2rgb=(0,three_tsl.Fn)(([color])=>{let c=(0,three_tsl.vec3)(color).toVar(),K=(0,three_tsl.vec4)(1,2/3,1/3,3),p=(0,three_tsl.abs)((0,three_tsl.fract)((0,three_tsl.vec3)(c.x,c.x,c.x).add((0,three_tsl.vec3)(K.x,K.y,K.z))).mul(6).sub((0,three_tsl.vec3)(K.w,K.w,K.w)));return c.z.mul((0,three_tsl.mix)((0,three_tsl.vec3)(K.x,K.x,K.x),(0,three_tsl.clamp)(p.sub((0,three_tsl.vec3)(K.x,K.x,K.x)),0,1),c.y))}).setLayout({name:`FN_hsv2rgb`,type:`vec3`,inputs:[{name:`color`,type:`vec3`}]}),unpackRGBAToDepth=(0,three_tsl.Fn)(([color])=>(0,three_tsl.dot)(color,(0,three_tsl.vec4)(1/(256*256*256),1/(256*256),1/256,1))).setLayout({name:`FN_hsv2rgb`,type:`float`,inputs:[{name:`color`,type:`vec4`}]}),hdrBoost=(0,three_tsl.Fn)(([gainRGB,maxDisplayBoost,maxContentBoost,minContentBoost,capacityMin,capacityMax,gamma])=>{let gain=(0,three_tsl.vec3)((0,three_tsl.clamp)(gainRGB.r,(0,three_tsl.float)(0),(0,three_tsl.float)(1)),(0,three_tsl.clamp)(gainRGB.g,(0,three_tsl.float)(0),(0,three_tsl.float)(1)),(0,three_tsl.clamp)(gainRGB.b,(0,three_tsl.float)(0),(0,three_tsl.float)(1))),invGamma=(0,three_tsl.float)(1).div((0,three_tsl.max)(gamma,(0,three_tsl.float)(1e-6))),gainLinear=(0,three_tsl.vec3)((0,three_tsl.pow)(gain.r,invGamma),(0,three_tsl.pow)(gain.g,invGamma),(0,three_tsl.pow)(gain.b,invGamma)),logCapacityMin=(0,three_tsl.log2)((0,three_tsl.max)(capacityMin,(0,three_tsl.float)(1e-6))),denom=(0,three_tsl.log2)((0,three_tsl.max)(capacityMax,(0,three_tsl.float)(1e-6))).sub(logCapacityMin),weight=(0,three_tsl.clamp)((0,three_tsl.log2)((0,three_tsl.max)(maxDisplayBoost,(0,three_tsl.float)(1))).sub(logCapacityMin).div((0,three_tsl.max)(denom,(0,three_tsl.float)(1e-6))),(0,three_tsl.float)(0),(0,three_tsl.float)(1)).mul((0,three_tsl.step)((0,three_tsl.float)(1e-6),denom)),logMinBoost=(0,three_tsl.log2)((0,three_tsl.max)(minContentBoost,(0,three_tsl.float)(1e-6))),logMaxBoost=(0,three_tsl.log2)((0,three_tsl.max)(maxContentBoost,(0,three_tsl.float)(1e-6))),logGainW=(0,three_tsl.vec3)(logMinBoost).add(gainLinear.mul((0,three_tsl.vec3)(logMaxBoost.sub(logMinBoost)))).mul(weight);return(0,three_tsl.vec3)((0,three_tsl.exp2)(logGainW.x),(0,three_tsl.exp2)(logGainW.y),(0,three_tsl.exp2)(logGainW.z))}).setLayout({name:`FN_hdrBoost`,type:`vec3`,inputs:[{name:`gainRGB`,type:`vec3`},{name:`maxDisplayBoost`,type:`float`},{name:`maxContentBoost`,type:`float`},{name:`minContentBoost`,type:`float`},{name:`capacityMin`,type:`float`},{name:`capacityMax`,type:`float`},{name:`gamma`,type:`float`}]}),hdrOffset=(0,three_tsl.Fn)(([sdrRGB,boost,offsetSdr,offsetHdr])=>(0,three_tsl.vec3)(sdrRGB).add(offsetSdr).mul(boost).sub(offsetHdr)).setLayout({name:`FN_hdrOffset`,type:`vec3`,inputs:[{name:`sdrRGB`,type:`vec3`},{name:`boost`,type:`vec3`},{name:`offsetSdr`,type:`float`},{name:`offsetHdr`,type:`float`}]}),zoomVector=(0,three_tsl.Fn)(([direction,vector,zoom])=>{let theta=(0,three_tsl.dot)(direction,vector),d=direction.mul(theta),q=vector.sub(d).div(zoom);return(0,three_tsl.normalize)(d.add(q))}).setLayout({name:`FN_zoomVector`,type:`vec3`,inputs:[{name:`direction`,type:`vec3`},{name:`vector`,type:`vec3`},{name:`zoom`,type:`float`}]}),sampleDirection=(0,three_tsl.Fn)(([matrix,zoom,cameraDirection,positionWorld])=>{let panoOrigin=matrix.mul((0,three_tsl.vec4)(0,0,0,1)).xyz,zoomed=zoomVector(cameraDirection,(0,three_tsl.normalize)(positionWorld.sub(panoOrigin)),zoom);return matrix.toMat3().transpose().mul(zoomed)}).setLayout({name:`FN_sampleDirection`,type:`vec3`,inputs:[{name:`direction`,type:`mat4`},{name:`vector`,type:`float`},{name:`zoom`,type:`vec3`},{name:`positionWorld`,type:`vec3`}]}),TAU$3=Math.PI*2;function formatRad$1(rad){return rad>=0&&rad<TAU$3?rad:(rad%TAU$3+TAU$3)%TAU$3}function coordinatesToVector(coordinates,target){let distance=Math.abs(Math.cos(coordinates.latitude)),x=-Math.sin(coordinates.longitude)*distance,y=-Math.sin(coordinates.latitude),z=-Math.cos(coordinates.longitude)*distance;return target?target.set(x,y,z):new three_webgpu.Vector3(x,y,z)}function vectorToCoordinates(vector){return{longitude:formatRad$1(-Math.atan2(vector.x,-vector.z)),latitude:-Math.asin(vector.y/1)}}function longitudeToHeading(longitude){return(-longitude/Math.PI*180-90)/360+.25}function headingToLongitude(heading){return-((heading-.25)*360+90)/180*Math.PI}var DEFAULT_ASPECT=1,DEFAULT_NEAR=.1,DEFAULT_FAR=2e3,TAU$2=Math.PI*2,PI_2=Math.PI/2;function formatRad(rad){return rad>0&&rad<=TAU$2?rad:(rad%TAU$2+TAU$2)%TAU$2}function matrixLerp(from,to,weight,target){weight=Math.pow(weight,4);for(var i=0;i<16;i++)target.elements[i]=from.elements[i]+(to.elements[i]-from.elements[i])*weight;return target}var Camera=class extends three_webgpu.Camera{constructor(fov,aspect=DEFAULT_ASPECT,near=DEFAULT_NEAR,far=DEFAULT_FAR,perspToOrtho=new three_webgpu.Vector2,resolution=new three_webgpu.Vector2(512,512),pixelRatio=1){super(),this.fov=fov,this.aspect=aspect,this.near=near,this.far=far,this.perspToOrtho=perspToOrtho,this.resolution=resolution,this.pixelRatio=pixelRatio,this.time=0,this.controllerMode=null,this.needsRender=!0,this.refineModel=!0,this.pose={longitude:0,latitude:0,fov,distance:0,offset:new three_webgpu.Vector3},this.computePose(),this.perspectiveCamera=new three_webgpu.PerspectiveCamera(this.fov,this.aspect,.001,this.far);let top=Math.max(this.orthoDistance,.01)*Math.tan(.5*this.fov/180*Math.PI),left=-.5*this.aspect*2*top;this.orthographicCamera=new three_webgpu.OrthographicCamera(left,-left,top,-top,.001,this.far),this.computeProjectionMatrix(),this.lastValues={position:this.position.clone(),quaternion:this.quaternion.clone(),scale:this.scale.clone(),fov:this.fov,aspect:this.aspect,near:this.near,far:this.far,orthoDistance:this.orthoDistance,perspToOrtho:this.perspToOrtho.clone()},this.type=this.perspToOrtho.x<1?`PerspectiveCamera`:`OrthographicCamera`,this.autoNearFar=!0}get orthoDistance(){return this.pose.distance>1?this.pose.distance:1+(this.pose.distance-1)*this.perspToOrtho.x}get zoom(){return this.type===`OrthographicCamera`?this.orthographicCamera.zoom:this.type===`PerspectiveCamera`?this.perspectiveCamera.zoom:1}get top(){return this.type===`OrthographicCamera`?this.orthographicCamera.top:0}get bottom(){return this.type===`OrthographicCamera`?this.orthographicCamera.bottom:0}get left(){return this.type===`OrthographicCamera`?this.orthographicCamera.left:0}get right(){return this.type===`OrthographicCamera`?this.orthographicCamera.right:0}getDirection(target){return coordinatesToVector(this.pose,target)}computePose(distance=0){this.updateMatrix();let e=this.matrix.elements;return this.pose.latitude=Math.asin(require_memoryUsage.M(e[9],-1,1)),Math.abs(e[9])<.9999999?this.pose.longitude=formatRad(Math.atan2(e[8],e[10])):this.pose.longitude=formatRad(Math.atan2(-e[2],e[0])),this.pose.fov=this.fov,this.pose.distance=distance,this.pose.offset=new three_webgpu.Vector3(-e[8],-e[9],-e[10]).setLength(this.pose.distance).add(this.position),this}setFromPose(pose){var _a,_b,_c,_d,_e;let longitude=formatRad((_a=pose.longitude)==null?this.pose.longitude:_a),latitude=Math.max(-PI_2+1e-4,Math.min(PI_2-1e-4,(_b=pose.latitude)==null?this.pose.latitude:_b)),fov=(_c=pose.fov)==null?this.pose.fov:_c,distance=(_d=pose.distance)==null?this.pose.distance:_d,offset=(_e=pose.offset)==null?this.pose.offset:_e,vector=coordinatesToVector({longitude,latitude}).normalize();return this.position.set(0,0,0),this.lookAt(vector),this.position.add(offset).sub(vector.clone().setLength(distance)),this.fov!==fov&&(this.fov=fov,this.perspectiveCamera.fov=fov,this.updateProjectionMatrix()),this.updateMatrixWorld(!0),this.pose.longitude=longitude,this.pose.latitude=latitude,this.pose.fov=fov,this.pose.distance=distance,this.pose.offset.copy(offset),this.needsRender=!0,this}copyPose(){return{longitude:this.pose.longitude,latitude:this.pose.latitude,fov:this.pose.fov,distance:this.pose.distance,offset:this.pose.offset.clone()}}computeProjectionMatrix(){matrixLerp(this.orthographicCamera.projectionMatrix,this.perspectiveCamera.projectionMatrix,1-this.perspToOrtho.x,this.projectionMatrix),this.projectionMatrixInverse.copy(this.projectionMatrix).invert(),this.needsRender=!0}setViewOffset(fullWidth,fullHeight,x,y,width,height){this.perspectiveCamera.setViewOffset(fullWidth,fullHeight,x,y,width,height),this.orthographicCamera.setViewOffset(fullWidth,fullHeight,x,y,width,height),this.computeProjectionMatrix()}get view(){return this.perspectiveCamera.view?Object.assign({},this.perspectiveCamera.view):null}clearViewOffset(){this.perspectiveCamera.clearViewOffset(),this.orthographicCamera.clearViewOffset(),this.computeProjectionMatrix()}updateProjectionMatrix(){this.perspectiveCamera.coordinateSystem=this.coordinateSystem,this.orthographicCamera.coordinateSystem=this.coordinateSystem,this.perspectiveCamera.updateProjectionMatrix(),this.orthographicCamera.updateProjectionMatrix(),this.computeProjectionMatrix()}get perspectiveProjectionMatrix(){return this.perspectiveCamera.projectionMatrix}get perspectiveProjectionMatrixInverse(){return this.perspectiveCamera.projectionMatrixInverse}get orthographicProjectionMatrix(){return this.orthographicCamera.projectionMatrix}get orthographicProjectionMatrixInverse(){return this.orthographicCamera.projectionMatrixInverse}updateTime(time){this.time=time;let needsComputeProjectionMatrix=!1;if((this.lastValues.fov!==this.fov||this.lastValues.near!==this.near||this.lastValues.far!==this.far||this.lastValues.aspect!==this.aspect)&&(this.perspectiveCamera.coordinateSystem=this.coordinateSystem,this.perspectiveCamera.fov=this.fov,this.perspectiveCamera.near=this.near,this.perspectiveCamera.far=this.far,this.perspectiveCamera.aspect=this.aspect,this.perspectiveCamera.updateProjectionMatrix(),needsComputeProjectionMatrix=!0),!this.lastValues.position.equals(this.position)||!this.lastValues.quaternion.equals(this.quaternion)||!this.lastValues.scale.equals(this.scale)||!this.lastValues.perspToOrtho.equals(this.perspToOrtho)||this.lastValues.fov!==this.fov||this.lastValues.near!==this.near||this.lastValues.far!==this.far||this.lastValues.orthoDistance!==this.orthoDistance||this.lastValues.aspect!==this.aspect){let top=Math.max(this.orthoDistance,.01)*Math.tan(.5*this.fov/180*Math.PI),left=-.5*this.aspect*2*top;this.orthographicCamera.coordinateSystem=this.coordinateSystem,this.orthographicCamera.left=left,this.orthographicCamera.right=-left,this.orthographicCamera.top=top,this.orthographicCamera.bottom=-top,this.orthographicCamera.near=this.near,this.orthographicCamera.far=this.far,this.orthographicCamera.updateProjectionMatrix(),needsComputeProjectionMatrix=!0}needsComputeProjectionMatrix&&this.computeProjectionMatrix(),this.lastValues.position.copy(this.position),this.lastValues.quaternion.copy(this.quaternion),this.lastValues.scale.copy(this.scale),this.lastValues.fov=this.fov,this.lastValues.aspect=this.aspect,this.lastValues.near=this.near,this.lastValues.far=this.far,this.lastValues.orthoDistance=this.orthoDistance,this.lastValues.perspToOrtho.copy(this.perspToOrtho),this.type=this.perspToOrtho.x<1?`PerspectiveCamera`:`OrthographicCamera`}get isPerspectiveCamera(){return this.perspToOrtho.x<1}get isOrthographicCamera(){return this.perspToOrtho.x>=1}copy(source,recursive){return super.copy(source,recursive),this.fov=source.fov,this.aspect=source.aspect,this.near=source.near,this.far=source.far,this.perspToOrtho.copy(source.perspToOrtho),this.updateTime(require_memoryUsage.p()),this}},TRANSPARENT=(0,three_tsl.vec4)(0,0,0,0),scratchViewport$1=new three_webgpu.Vector4,resolution=(0,three_tsl.uniform)(new three_webgpu.Vector2(512,512)).onFrameUpdate(function(frame){let camera=frame.camera;camera instanceof Camera?this.value.copy(camera.resolution):frame.renderer&&(frame.renderer.getViewport(scratchViewport$1),this.value.set(scratchViewport$1.width,scratchViewport$1.height))}),pixelRatio=(0,three_tsl.uniform)(1).onFrameUpdate(function(frame){let camera=frame.camera;camera instanceof Camera?this.value=camera.pixelRatio:frame.renderer&&(this.value=frame.renderer.getPixelRatio())}),vCameraDirection=(0,three_tsl.vec3)(three_tsl.cameraViewMatrix.element((0,three_tsl.int)(0)).element((0,three_tsl.int)(2)),three_tsl.cameraViewMatrix.element((0,three_tsl.int)(1)).element((0,three_tsl.int)(2)),three_tsl.cameraViewMatrix.element((0,three_tsl.int)(2)).element((0,three_tsl.int)(2))).negate().normalize().toVarying(`v_cameraDirection`),MARK_STEP=1,ROOF_MARK=MARK_STEP*1,HIDDEN_MARK=MARK_STEP*2,vertexMark=safeFloatAttribute(`_feature_id_rsmask`,0),markConfidence=(mark,levelMark)=>(0,three_tsl.smoothstep)((0,three_tsl.float)(levelMark-MARK_STEP),(0,three_tsl.float)(levelMark),mark).mul((0,three_tsl.step)(mark,(0,three_tsl.float)(levelMark))),vRoofMark=markConfidence(vertexMark,ROOF_MARK).toVarying(`v_roofMark`),vHiddenMark=markConfidence(vertexMark,HIDDEN_MARK).toVarying(`v_hiddenMark`),progress=mrFloat(`progress`),maxDisplayBoost=mrFloat(`maxDisplayBoost`),modelAlpha=mrFloat(`modelAlpha`),pano0Matrix=mrMat4(`pano0Matrix`),pano0Zoom=mrFloat(`pano0Zoom`),pano0Histogram=mrVec4(`pano0Histogram`),pano0HdrMaxContentBoost=mrFloat(`pano0HdrMaxContentBoost`),pano0HdrMinContentBoost=mrFloat(`pano0HdrMinContentBoost`),pano0HdrCapacityMin=mrFloat(`pano0HdrCapacityMin`),pano0HdrCapacityMax=mrFloat(`pano0HdrCapacityMax`),pano0HdrGamma=mrFloat(`pano0HdrGamma`),pano0HdrOffsetSdr=mrFloat(`pano0HdrOffsetSdr`),pano0HdrOffsetHdr=mrFloat(`pano0HdrOffsetHdr`),pano0DepthMaxDepth=mrFloat(`pano0DepthMaxDepth`),pano1Matrix=mrMat4(`pano1Matrix`),pano1Zoom=mrFloat(`pano1Zoom`),pano1Histogram=mrVec4(`pano1Histogram`),pano1HdrMaxContentBoost=mrFloat(`pano1HdrMaxContentBoost`),pano1HdrMinContentBoost=mrFloat(`pano1HdrMinContentBoost`),pano1HdrCapacityMin=mrFloat(`pano1HdrCapacityMin`),pano1HdrCapacityMax=mrFloat(`pano1HdrCapacityMax`),pano1HdrGamma=mrFloat(`pano1HdrGamma`),pano1HdrOffsetSdr=mrFloat(`pano1HdrOffsetSdr`),pano1HdrOffsetHdr=mrFloat(`pano1HdrOffsetHdr`),pano1DepthMaxDepth=mrFloat(`pano1DepthMaxDepth`),panoFilterSaturationBias=mrFloat(`panoFilterSaturationBias`),panoFilterContrastBias=mrFloat(`panoFilterContrastBias`),panoFilterTemperatureBias=mrFloat(`panoFilterTemperatureBias`),panoFilterTintBias=mrFloat(`panoFilterTintBias`),refinedScreenProjectionMatrix=mrMat4(`refinedScreenProjectionMatrix`),refinedScreenMatrixInverse=mrMat4(`refinedScreenMatrixInverse`),refinedScreenOpacity=mrFloat(`refinedScreenOpacity`),refinedScreenPano=mrFloat(`refinedScreenPano`),colorAlpha=mrFloat(`colorAlpha`),brightness=mrFloat(`brightness`),floorIndex=mrFloat(`floorIndex`),shownFloorIndex=mrFloat(`shownFloorIndex`),modelBoundingMin=mrVec3(`modelBoundingMin`),modelBoundingMax=mrVec3(`modelBoundingMax`),constantColor=mrVec3(`constantColor`),pointScale=mrFloat(`pointScale`),pointMinPixel=mrFloat(`pointMinPixel`),pointMaxPixel=mrFloat(`pointMaxPixel`),colorSaturation=mrFloat(`colorSaturation`),colorBrightness=mrFloat(`colorBrightness`),isCurrentFloor=shownFloorIndex.lessThan(-.01).or((0,three_tsl.abs)(floorIndex.sub(shownFloorIndex)).lessThan(.99)).toVar(`isCurrentFloor`),isRoof=vRoofMark.greaterThan(.001).toVar(`isRoof`),isRoofCameraCut=(0,three_tsl.Fn)(()=>{let isRoofCut=(0,three_tsl.bool)().toVar(`isRoofCut`),roofCutProgress=(0,three_tsl.pow)((0,three_tsl.clamp)(vCameraDirection.y.negate(),0,1),3),roofThreshold=modelBoundingMax.y.sub(roofCutProgress.mul(modelBoundingMax.y.sub(modelBoundingMin.y)));return isRoofCut.assign(isRoof.and(three_tsl.positionWorld.y.greaterThan(roofThreshold))),isRoofCut})(),isRoofModelAlphaCut=(0,three_tsl.Fn)(()=>{let isRoofCut=(0,three_tsl.bool)().toVar(`isRoofCut`),roofCutProgress=(0,three_tsl.mix)(0,1,(0,three_tsl.pow)(modelAlpha,5)),roofThreshold=modelBoundingMax.y.sub(roofCutProgress.mul(modelBoundingMax.y.sub(modelBoundingMin.y)));return isRoofCut.assign(isRoof.and(three_tsl.positionWorld.y.greaterThan(roofThreshold))),isRoofCut})(),isHidden=vHiddenMark.greaterThan(.001).toVar(`isHidden`),isHiddenCut=(0,three_tsl.Fn)(()=>{let isHiddenCut=(0,three_tsl.bool)().toVar(`isHiddenCut`),hiddenCutProgress=(0,three_tsl.mix)(0,1,(0,three_tsl.pow)(modelAlpha,5)),hiddenThreshold=modelBoundingMax.y.sub(hiddenCutProgress.mul(modelBoundingMax.y.sub(modelBoundingMin.y)));return isHiddenCut.assign(isHidden.and(three_tsl.positionWorld.y.greaterThan(hiddenThreshold))),isHiddenCut})(),pano0Origin=pano0Matrix.mul((0,three_tsl.vec4)(0,0,0,1)).xyz.toVar(`pano0Origin`),pano0SampleDirection=sampleDirection(pano0Matrix,pano0Zoom,vCameraDirection,three_tsl.positionWorld).toVar(`pano0SampleDirection`),pano1Origin=pano1Matrix.mul((0,three_tsl.vec4)(0,0,0,1)).xyz.toVar(`pano1Origin`),pano1SampleDirection=sampleDirection(pano1Matrix,pano1Zoom,vCameraDirection,three_tsl.positionWorld).toVar(`pano1SampleDirection`),pano0SdrColor=mrCubeTexture(`pano0Map`,pano0SampleDirection).rgb.toVar(`pano0SdrColor`),pano1SdrColor=mrCubeTexture(`pano1Map`,pano1SampleDirection).rgb.toVar(`pano1SdrColor`),pano0GainColor=mrCubeTexture(`pano0Gainmap`,pano0SampleDirection).rgb.toVar(`pano0GainColor`),pano1GainColor=mrCubeTexture(`pano1Gainmap`,pano1SampleDirection).rgb.toVar(`pano1GainColor`),pano0HdrColor=(0,three_tsl.Fn)(()=>{let pano0HdrColor=(0,three_tsl.vec3)().toVar(`pano0HdrColor`),pano0HdrBoost=hdrBoost(pano0GainColor,maxDisplayBoost,pano0HdrMaxContentBoost,pano0HdrMinContentBoost,pano0HdrCapacityMin,pano0HdrCapacityMax,pano0HdrGamma);return pano0HdrColor.assign(hdrOffset(pano0SdrColor,pano0HdrBoost,pano0HdrOffsetSdr,pano0HdrOffsetHdr)),pano0HdrColor})(),pano1HdrColor=(0,three_tsl.Fn)(()=>{let pano1HdrColor=(0,three_tsl.vec3)().toVar(`pano1HdrColor`),pano1HdrBoost=hdrBoost(pano1GainColor,maxDisplayBoost,pano1HdrMaxContentBoost,pano1HdrMinContentBoost,pano1HdrCapacityMin,pano1HdrCapacityMax,pano1HdrGamma);return pano1HdrColor.assign(hdrOffset(pano1SdrColor,pano1HdrBoost,pano1HdrOffsetSdr,pano1HdrOffsetHdr)),pano1HdrColor})(),refinedScreenColor=(0,three_tsl.Fn)(()=>{let refinedScreenColor=(0,three_tsl.vec4)().toVar(`refinedScreenColor`),cameraPosition=refinedScreenMatrixInverse.mul((0,three_tsl.vec4)(three_tsl.positionWorld,1)).toVar(),zoom=(0,three_tsl.mix)(pano0Zoom,pano1Zoom,refinedScreenPano),cameraVertex=zoomVector((0,three_tsl.vec3)(0,0,1),(0,three_tsl.normalize)(cameraPosition.xyz),zoom),position=refinedScreenProjectionMatrix.mul((0,three_tsl.vec4)(cameraVertex,1)).toVar();position.divAssign(position.w);let uv=(0,three_tsl.vec3)(position.x,position.y.negate(),0).add(1).div(2);refinedScreenColor.assign(mrTexture(`refinedScreenMap`,uv.xy)),refinedScreenColor.a.mulAssign(refinedScreenOpacity);let overflow=(0,three_tsl.step)((0,three_tsl.abs)(position.x),1).mul((0,three_tsl.step)((0,three_tsl.abs)(position.y),1)).mul((0,three_tsl.step)(cameraPosition.z,0));return refinedScreenColor.assign((0,three_tsl.mix)(TRANSPARENT,refinedScreenColor,overflow)),refinedScreenColor})(),refinedScreenPano0Color=(0,three_tsl.mix)(refinedScreenColor,TRANSPARENT,refinedScreenPano).toVar(`refinedScreenPano0Color`),refinedScreenPano1Color=(0,three_tsl.mix)(refinedScreenColor,TRANSPARENT,(0,three_tsl.float)(1).sub(refinedScreenPano)).toVar(`refinedScreenPano1Color`),panoDepthTrustRange=.03,pano0DepthTrust=(0,three_tsl.Fn)(()=>{let pano0DepthTrust=(0,three_tsl.float)().toVar(`pano0DepthTrust`),pano0VertexDepth=(0,three_tsl.clamp)((0,three_tsl.length)(three_tsl.positionWorld.sub(pano0Origin)),0,(0,three_tsl.float)(pano0DepthMaxDepth)).toVar(),pano0Delta=(0,three_tsl.abs)(unpackRGBAToDepth((0,three_tsl.vec4)(mrCubeTexture(`pano0DepthMap`,pano0SampleDirection))).mul(pano0DepthMaxDepth).sub(pano0VertexDepth)),pano0MaxDelta=(0,three_tsl.float)(panoDepthTrustRange).mul(pano0VertexDepth);return pano0DepthTrust.assign((0,three_tsl.step)(pano0MaxDelta,pano0Delta)),pano0DepthTrust})(),pano1DepthTrust=(0,three_tsl.Fn)(()=>{let pano1DepthTrust=(0,three_tsl.float)().toVar(`pano1DepthTrust`),pano1VertexDepth=(0,three_tsl.clamp)((0,three_tsl.length)(three_tsl.positionWorld.sub(pano1Origin)),0,(0,three_tsl.float)(pano1DepthMaxDepth)).toVar(),pano1Delta=(0,three_tsl.abs)(unpackRGBAToDepth((0,three_tsl.vec4)(mrCubeTexture(`pano1DepthMap`,pano1SampleDirection))).mul(pano1DepthMaxDepth).sub(pano1VertexDepth)),pano1MaxDelta=(0,three_tsl.float)(panoDepthTrustRange).mul(pano1VertexDepth);return pano1DepthTrust.assign((0,three_tsl.step)(pano1MaxDelta,pano1Delta)),pano1DepthTrust})(),gradientColor=(0,three_tsl.Fn)(()=>{let gradientColor=(0,three_tsl.vec3)().toVar(`gradientColor`),uv=(0,three_tsl.float)(three_tsl.positionWorld.y.sub(modelBoundingMin.y)).div(modelBoundingMax.y.sub(modelBoundingMin.y));return gradientColor.assign(mrTexture(`gradientTexture`,(0,three_tsl.vec2)(uv,.5)).rgb),gradientColor})(),floorOpacity$1=(0,three_tsl.mix)((0,three_tsl.clamp)((0,three_tsl.float)(.2).mul((0,three_tsl.min)((0,three_tsl.float)(1).add(vCameraDirection.y),1)),0,1),(0,three_tsl.float)(1),(0,three_tsl.float)(isCurrentFloor)).toVar(`floorOpacity`),pano0Color=(0,three_tsl.property)(`vec3`).toVar(`pano0Color`),pano1Color=(0,three_tsl.property)(`vec3`).toVar(`pano1Color`),filterColorTemperature=(0,three_tsl.Fn)(([color_immutable,temperatureBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),tb=(0,three_tsl.clamp)(temperatureBias,-100,100);return color.r.assign(color.r.mul((0,three_tsl.float)(1).add(tb.div(300)))),color.b.assign(color.b.mul((0,three_tsl.float)(1).sub(tb.div(300)))),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterColorTemperature`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`temperatureBias`,type:`float`}]}),filterColorTint=(0,three_tsl.Fn)(([color_immutable,tintBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),tb=(0,three_tsl.clamp)(tintBias,-100,100),scaleR=(0,three_tsl.float)(1).add(tb.mul(-.5).div(200).mul((0,three_tsl.step)(tb,0))),scaleG=(0,three_tsl.float)(1).sub((0,three_tsl.mix)(tb.mul(.5).div(200),tb.div(200),(0,three_tsl.step)((0,three_tsl.float)(0),tb))),scaleB=(0,three_tsl.float)(1).add(tb.mul(-.5).div(200).mul((0,three_tsl.step)(tb,0)));return color.r.assign(color.r.mul(scaleR)),color.g.assign(color.g.mul(scaleG)),color.b.assign(color.b.mul(scaleB)),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterColorTint`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`tintBias`,type:`float`}]}),filterContrast=(0,three_tsl.Fn)(([color_immutable,histogram,contrastBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),meanVal=histogram.y,minVal=histogram.z,maxVal=histogram.w,cb=(0,three_tsl.clamp)(contrastBias,-1,1).toVar(),usedBias=cb.add(1).toVar(),biasSquarehalf=cb.mul(cb).div(2).toVar(),slopelow=usedBias.sub(1).div(meanVal).toVar(),slopehigh=(0,three_tsl.float)(1).sub(usedBias).div((0,three_tsl.float)(1).sub(meanVal)).toVar(),bias=usedBias.sub(meanVal).div((0,three_tsl.float)(1).sub(meanVal)).toVar(),scaleFactor=(0,three_tsl.float)(1).div(maxVal.sub(minVal)).toVar(),val=color.toVar(),maxv=(0,three_tsl.max)((0,three_tsl.max)(color.r,color.g),color.b).toVar();val.assign((0,three_tsl.mix)(val,val.mul((0,three_tsl.float)(1).sub(biasSquarehalf)).add(maxv.mul(biasSquarehalf)),(0,three_tsl.step)(cb,0)));let remapR=(0,three_tsl.mix)(slopehigh.mul(val.r).add(bias),slopelow.mul(val.r).add(1),(0,three_tsl.step)(val.r,meanVal)),remapG=(0,three_tsl.mix)(slopehigh.mul(val.g).add(bias),slopelow.mul(val.g).add(1),(0,three_tsl.step)(val.g,meanVal)),remapB=(0,three_tsl.mix)(slopehigh.mul(val.b).add(bias),slopelow.mul(val.b).add(1),(0,three_tsl.step)(val.b,meanVal));return color.assign(val.sub(meanVal).mul((0,three_tsl.vec3)(remapR,remapG,remapB).mul(scaleFactor)).add(meanVal)),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterContrast`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`histogram`,type:`vec4`},{name:`contrastBias`,type:`float`}]}),filterSaturation=(0,three_tsl.Fn)(([color_immutable,saturationBias])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),satScale=(0,three_tsl.float)(1).add(saturationBias),luminance=(0,three_tsl.float)(.299).mul(color.r).add((0,three_tsl.float)(.587).mul(color.g)).add((0,three_tsl.float)(.114).mul(color.b));return color.assign(color.sub(luminance).mul(satScale).add(luminance)),(0,three_tsl.clamp)(color,0,1)}).setLayout({name:`FN_filterSaturation`,type:`vec3`,inputs:[{name:`color`,type:`vec3`},{name:`saturationBias`,type:`float`}]});function colorFilter(saturationBias,contrastBias,temperatureBias,tintBias,lutSampler){return(0,three_tsl.Fn)(([color_immutable,histogram])=>{let rgb=(0,three_tsl.vec3)(color_immutable).toVar(),hsv=rgb2hsv(rgb).toVar();return hsv.z.assign((0,three_tsl.vec4)(lutSampler((0,three_tsl.vec2)(hsv.z,0))).r),rgb.assign(hsv2rgb(hsv)),rgb.assign((0,three_tsl.clamp)(rgb,0,1)),rgb.assign(filterColorTemperature(rgb,temperatureBias)),rgb.assign(filterColorTint(rgb,tintBias)),rgb.assign(filterContrast(rgb,histogram,contrastBias)),rgb.assign(filterSaturation(rgb,saturationBias)),rgb})}function panoTransition(options){return(0,three_tsl.Fn)(([pano0Color,pano1Color,progress])=>{let panoColor=(0,three_tsl.vec3)().toVar();if(options.transition===`BLACK`){let BLACK=(0,three_tsl.vec4)(.086,.106,.149,1),bp=(0,three_tsl.acos)((0,three_tsl.float)(-2).mul(progress).add(1)).toVar();panoColor.assign((0,three_tsl.mix)(pano0Color,BLACK,(0,three_tsl.min)((0,three_tsl.float)(1),bp))),panoColor.assign((0,three_tsl.mix)(panoColor,pano1Color,(0,three_tsl.max)((0,three_tsl.float)(0),bp.sub(Math.PI).add(1))))}else if(options.transition===`SPREAD`){let center=resolution.mul(pixelRatio).div(2).toVar(),radius=(0,three_tsl.length)(center).mul(1.2),tp=(0,three_tsl.distance)(three_tsl.screenCoordinate.xy,center).div(radius);panoColor.assign((0,three_tsl.mix)(pano0Color,pano1Color,(0,three_tsl.smoothstep)(0,.2,progress.sub(tp))))}else panoColor.assign((0,three_tsl.mix)(pano0Color,pano1Color,progress));return panoColor})}function panoColor(options){return(0,three_tsl.Fn)(([standardOutput])=>{if(options.usePano0HDR?pano0Color.assign(pano0HdrColor):pano0Color.assign(pano0SdrColor),options.usePano1HDR?pano1Color.assign(pano1HdrColor):pano1Color.assign(pano1SdrColor),options.useRefinedScreen&&(pano0Color.assign((0,three_tsl.mix)(pano0Color,refinedScreenPano0Color.rgb,refinedScreenPano0Color.a)),pano1Color.assign((0,three_tsl.mix)(pano1Color,refinedScreenPano1Color.rgb,refinedScreenPano1Color.a))),options.usePanoFilter){let filterFn=colorFilter(panoFilterSaturationBias,panoFilterContrastBias,panoFilterTemperatureBias,panoFilterTintBias,uv=>mrTexture(`panoFilterLutMap`,uv));options.usePano0HDR||pano0Color.assign(filterFn(pano0Color,pano0Histogram)),options.usePano1HDR||pano1Color.assign(filterFn(pano1Color,pano1Histogram))}if(options.usePano0Depth||options.usePano1Depth){let depthFallback=(0,three_tsl.vec4)(standardOutput).toVar(`depthFallback`),pano0Visible=(0,three_tsl.clamp)(progress.mul(10),0,1),pano1Visible=(0,three_tsl.clamp)((0,three_tsl.float)(1).sub(progress).mul(10),0,1);options.usePano0Depth&&pano0Color.assign((0,three_tsl.mix)(pano0Color,(0,three_tsl.mix)(pano0Color,depthFallback,pano0Visible),pano0DepthTrust)),options.usePano1Depth&&pano1Color.assign((0,three_tsl.mix)(pano1Color,(0,three_tsl.mix)(pano1Color,depthFallback,pano1Visible),pano1DepthTrust))}let panoColor=(0,three_tsl.vec3)(0).toVar(`panoColor`),transitionFn=panoTransition(options);return panoColor.assign(transitionFn(pano0Color,pano1Color,progress)),panoColor})}function setupMeshOutput(material,builder,materialType){let usePano=material.pano0Map!=null&&material.pano1Map!=null,useVertexMarkRoof=material.useVertexMarkRoof,useVertexMarkHidden=material.useVertexMarkHidden,roofStyle=material.roofStyle,useFloorStyleVisibility=material.floorStyle===`VISIBILITY`,useGradientTexture=material.gradientTexture!=null,useRefinedScreen=material.refinedScreenMap!=null,usePanoFilter=material.panoFilterLutMap!=null,usePano0HDR=material.useHDR===!0&&material.pano0Gainmap!=null,usePano1HDR=material.useHDR===!0&&material.pano1Gainmap!=null,colorMode=material.colorStyle,transition=material.transition,customNodes=getActiveCustomNodes(material.customNodes,materialType),customContext=createCustomNodeContext({pano0HDR:usePano0HDR,pano1HDR:usePano1HDR,pano0Depth:!1,pano1Depth:!1});material.outputNode=(0,three_tsl.Fn)(()=>{useFloorStyleVisibility&&isCurrentFloor.not().discard(),useVertexMarkHidden&&isHiddenCut.discard(),useVertexMarkRoof&&(roofStyle===`HIDE`?isRoofModelAlphaCut.discard():isRoofCameraCut.discard());for(let cn of customNodes)cn.slots.discard&&cn.slots.discard(customContext).discard();let result=(0,three_tsl.vec4)(0).toVar(`result`);result.assign(three_tsl.output),colorMode===`ALTITUDE`&&useGradientTexture?result.rgb.assign(gradientColor):colorMode===`CONSTANT`&&result.rgb.assign(constantColor);for(let cn of customNodes)cn.slots.modelColor&&result.rgb.assign(cn.slots.modelColor(result.rgb,customContext));if(result.a.mulAssign(floorOpacity$1.mul(colorAlpha)),usePano){let panoResult=panoColor({transition,usePanoFilter,useRefinedScreen,usePano0HDR,usePano1HDR,usePano0Depth:!1,usePano1Depth:!1})(three_tsl.output);for(let cn of customNodes)cn.slots.panoColor&&(panoResult=cn.slots.panoColor(panoResult,customContext));result.assign((0,three_tsl.mix)((0,three_tsl.vec4)(panoResult,1),result,modelAlpha))}let finalResult=result;for(let cn of customNodes)cn.slots.outputColor&&(finalResult=cn.slots.outputColor(finalResult,customContext));return finalResult})()}function setupMeshVertex(material,materialType,baseVertex){let customNodes=getActiveCustomNodes(material.customNodes,materialType).filter(cn=>cn.slots.vertexPosition!=null);if(customNodes.length===0)return baseVertex;let customContext=createCustomNodeContext(),customPosition=three_tsl.positionWorld;for(let cn of customNodes)customPosition=cn.slots.vertexPosition(customPosition,customContext);return three_tsl.positionLocal.assign(three_tsl.modelWorldMatrixInverse.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))).xyz),three_tsl.cameraProjectionMatrix.mul(three_tsl.cameraViewMatrix.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))))}function setupMeshPanoOnlyOutput(material,builder,materialType){let usePano=material.pano0Map!=null&&material.pano1Map!=null,useRefinedScreen=material.refinedScreenMap!=null,usePanoFilter=material.panoFilterLutMap!=null,usePano0HDR=material.useHDR===!0&&material.pano0Gainmap!=null,usePano1HDR=material.useHDR===!0&&material.pano1Gainmap!=null,transition=material.transition,customNodes=getActiveCustomNodes(material.customNodes,materialType),customContext=createCustomNodeContext({pano0HDR:usePano0HDR,pano1HDR:usePano1HDR,pano0Depth:!1,pano1Depth:!1});material.outputNode=(0,three_tsl.Fn)(()=>{for(let cn of customNodes)cn.slots.discard&&cn.slots.discard(customContext).discard();let result=(0,three_tsl.vec4)(0).toVar(`result`);if(usePano){let panoResult=panoColor({transition,usePanoFilter,useRefinedScreen,usePano0HDR,usePano1HDR,usePano0Depth:!1,usePano1Depth:!1})(three_tsl.output);for(let cn of customNodes)cn.slots.panoColor&&(panoResult=cn.slots.panoColor(panoResult,customContext));result.rgb.assign(panoResult)}result.a.assign((0,three_tsl.float)(1).sub((0,three_tsl.clamp)(modelAlpha.mul(30),0,1)));let finalResult=result;for(let cn of customNodes)cn.slots.outputColor&&(finalResult=cn.slots.outputColor(finalResult,customContext));return finalResult})()}function setupPointCloudVertex(material,builder){material.positionNode=(0,three_tsl.attribute)(`instancePosition`,`vec3`);let b=builder;b.addStack(),material.setupPosition(builder),b.context.position=b.removeStack();let customNodes=getActiveCustomNodes(material.customNodes,`pointcloud`).filter(cn=>cn.slots.vertexPosition!=null),worldPosition=three_tsl.positionWorld,viewPos=three_tsl.positionView;if(customNodes.length>0){let customContext=createCustomNodeContext(),customPosition=worldPosition;for(let cn of customNodes)customPosition=cn.slots.vertexPosition(customPosition,customContext);worldPosition=customPosition,three_tsl.positionLocal.assign(three_tsl.modelWorldMatrixInverse.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))).xyz),viewPos=three_tsl.cameraViewMatrix.mul((0,three_tsl.vec4)(customPosition,(0,three_tsl.float)(1))).xyz}let viewZ=viewPos.z.negate(),projY11=three_tsl.cameraProjectionMatrix.element((0,three_tsl.int)(1)).element((0,three_tsl.int)(1)),proj23=three_tsl.cameraProjectionMatrix.element((0,three_tsl.int)(2)).element((0,three_tsl.int)(3)),negProj23=(0,three_tsl.float)(0).sub(proj23),distFactor=(0,three_tsl.mix)((0,three_tsl.float)(1),viewZ,negProj23),pointPixelSize;if(material.pointSize===`ATTENUATION`){let height=(0,three_tsl.float)(1).div(projY11).mul(distFactor).mul(2);pointPixelSize=resolution.y.mul(pointScale).mul(pixelRatio).div(height)}else pointPixelSize=pointScale.mul(pixelRatio);pointPixelSize=(0,three_tsl.clamp)(pointPixelSize,pointMinPixel.mul(pixelRatio),pointMaxPixel.mul(pixelRatio));let maxPxRef=pointMaxPixel.mul(pixelRatio);if(pointPixelSize=(0,three_tsl.max)(pointPixelSize,(0,three_tsl.min)((0,three_tsl.float)(1),maxPxRef)),pointPixelSize=(0,three_tsl.min)(pointPixelSize,maxPxRef),material.pointBack===`HIDDEN`&&!material.flatShading){let instNormal=(0,three_tsl.attribute)(`instanceNormal`,`vec3`),worldNormal=(0,three_tsl.normalize)(three_tsl.modelWorldMatrix.mul((0,three_tsl.vec4)(instNormal,0)).xyz),facing=(0,three_tsl.dot)((0,three_tsl.normalize)(three_tsl.cameraPosition.sub(worldPosition)),worldNormal);pointPixelSize=(0,three_tsl.mix)((0,three_tsl.float)(0),pointPixelSize,(0,three_tsl.float)(facing.greaterThan(0)))}(0,three_tsl.varyingProperty)(`float`,`v_pointSize`).assign(pointPixelSize);let resDpr=resolution.y.mul(pixelRatio),pointViewSize=pointPixelSize.mul((0,three_tsl.float)(2)).mul(distFactor).div(projY11.mul(resDpr)),quadOffset=three_tsl.positionGeometry.xy,offsetView=(0,three_tsl.vec3)(quadOffset.x.mul(pointViewSize),quadOffset.y.mul(pointViewSize),(0,three_tsl.float)(0));return three_tsl.cameraProjectionMatrix.mul((0,three_tsl.vec4)(viewPos.add(offsetView),(0,three_tsl.float)(1)))}function setupPointCloudOutput(material,builder){let useGradientTexture=material.gradientTexture!=null,colorMode=material.colorStyle,pointBack=material.pointBack,pointShape=material.pointShape,flatShading=material.flatShading,customNodes=getActiveCustomNodes(material.customNodes,`pointcloud`),customContext=createCustomNodeContext();material.colorNode=(0,three_tsl.Fn)(()=>{let baseColor;baseColor=colorMode===`ALTITUDE`&&useGradientTexture?gradientColor:colorMode===`CONSTANT`?constantColor:(0,three_tsl.colorSpaceToWorking)((0,three_tsl.attribute)(`instanceColor`,`vec3`),three_webgpu.SRGBColorSpace),pointBack===`DARK`&&!flatShading&&(baseColor=(0,three_tsl.Fn)(([color_immutable])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),instNormal=(0,three_tsl.attribute)(`instanceNormal`,`vec3`),worldNormal=(0,three_tsl.normalize)(three_tsl.modelWorldMatrix.mul((0,three_tsl.vec4)(instNormal,0)).xyz),facing=(0,three_tsl.dot)((0,three_tsl.normalize)(three_tsl.cameraPosition.sub(three_tsl.positionWorld)),worldNormal);return color.assign((0,three_tsl.mix)(color.mul(.8),color,(0,three_tsl.float)(facing.greaterThan(0)))),color})(baseColor)),baseColor=(0,three_tsl.Fn)(([color_immutable])=>{let color=(0,three_tsl.vec3)(color_immutable).toVar(),hsvColor=rgb2hsv(color).toVar();return hsvColor.y.assign(hsvColor.y.add(colorSaturation)),hsvColor.z.assign(hsvColor.z.add(colorBrightness)),color.assign((0,three_tsl.max)(hsv2rgb(hsvColor),(0,three_tsl.float)(0))),color})(baseColor);for(let cn of customNodes)cn.slots.modelColor&&(baseColor=cn.slots.modelColor(baseColor,customContext));return baseColor})(),material.outputNode=(0,three_tsl.Fn)(([standardOutput])=>{let vPointSize=(0,three_tsl.varyingProperty)(`float`,`v_pointSize`);if((0,three_tsl.Discard)(vPointSize.lessThan(.001)),pointShape===`CIRCLE`){let quadPos=three_tsl.positionGeometry.xy,dist=(0,three_tsl.length)(quadPos);(0,three_tsl.Discard)(vPointSize.greaterThan((0,three_tsl.float)(3)).and(dist.greaterThan(.5)))}for(let cn of customNodes)cn.slots.discard&&cn.slots.discard(customContext).discard();let result=(0,three_tsl.vec4)(standardOutput).toVar(`result`);result.a.assign(floorOpacity$1.mul(modelAlpha));let finalResult=result;for(let cn of customNodes)cn.slots.outputColor&&(finalResult=cn.slots.outputColor(finalResult,customContext));return finalResult})(three_tsl.output)}function getActiveCustomNodes(customNodes,materialType){return!customNodes||customNodes.length===0?[]:customNodes.filter(cn=>cn.appliesTo(materialType))}function createCustomNodeContext(panoState){return{positionWorld:three_tsl.positionWorld,positionView:three_tsl.positionView,cameraDirection:vCameraDirection,resolution,pixelRatio,progress,maxDisplayBoost,modelAlpha,colorAlpha,brightness,colorSaturation,colorBrightness,constantColor,floorIndex,shownFloorIndex,isCurrentFloor,floorOpacity:floorOpacity$1,isRoof,isRoofCameraCut,isRoofModelAlphaCut,isHidden,isHiddenCut,modelBoundingMin,modelBoundingMax,pano0:{origin:pano0Origin,sampleDirection:pano0SampleDirection,sdrColor:pano0SdrColor,hdrColor:(panoState==null?void 0:panoState.pano0HDR)===!0?pano0HdrColor:pano0SdrColor,depthTrust:(panoState==null?void 0:panoState.pano0Depth)===!0?pano0DepthTrust:(0,three_tsl.float)(0)},pano1:{origin:pano1Origin,sampleDirection:pano1SampleDirection,sdrColor:pano1SdrColor,hdrColor:(panoState==null?void 0:panoState.pano1HDR)===!0?pano1HdrColor:pano1SdrColor,depthTrust:(panoState==null?void 0:panoState.pano1Depth)===!0?pano1DepthTrust:(0,three_tsl.float)(0)},pointScale,pointMinPixel,pointMaxPixel}}var _defaultValues$4=new require_pbmMeshMaterial.t,PBMMeshBasicNodeMaterial=class extends three_webgpu.MeshBasicNodeMaterial{static get type(){return`PBMMeshBasicNodeMaterial`}constructor(parameters){super(parameters),this.isPBMMeshBasicNodeMaterial=!0,this.setDefaultValues(_defaultValues$4),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.colorStyle,this.floorStyle,this.roofStyle,this.useVertexMarkRoof,this.useVertexMarkHidden,this.transition,!!this.pano0Map,!!this.gradientTexture,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`basic`,baseVertex)}setup(builder){setupMeshOutput(this,builder,`basic`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues$3=new require_pbmMeshMaterial.r,PBMMeshPhongNodeMaterial=class extends three_webgpu.MeshPhongNodeMaterial{static get type(){return`PBMMeshPhongNodeMaterial`}constructor(parameters){super(parameters),this.isPBMMeshPhongNodeMaterial=!0,this.setDefaultValues(_defaultValues$3),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.colorStyle,this.floorStyle,this.roofStyle,this.useVertexMarkRoof,this.useVertexMarkHidden,this.transition,!!this.pano0Map,!!this.gradientTexture,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`phong`,baseVertex)}setup(builder){setupMeshOutput(this,builder,`phong`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues$2=new require_pbmMeshMaterial.i,PBMMeshPhysicalNodeMaterial=class extends three_webgpu.MeshPhysicalNodeMaterial{static get type(){return`PBMMeshPhysicalNodeMaterial`}constructor(parameters){super(parameters),this.isPBMMeshPhysicalNodeMaterial=!0,this.setDefaultValues(_defaultValues$2),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.colorStyle,this.floorStyle,this.roofStyle,this.useVertexMarkRoof,this.useVertexMarkHidden,this.transition,!!this.pano0Map,!!this.gradientTexture,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`standard`,baseVertex)}setup(builder){setupMeshOutput(this,builder,`standard`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues$1=new require_pbmMeshMaterial.n,PBMMeshPanoOnlyNodeMaterial=class extends three_webgpu.MeshBasicNodeMaterial{static get type(){return`PBMPanoOnlyNodeMaterial`}constructor(parameters){super(parameters),this.isPBMPanoOnlyNodeMaterial=!0,this.setDefaultValues(_defaultValues$1),this.setValues(parameters)}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.transition,!!this.pano0Map,!!this.refinedScreenMap,!!this.panoFilterLutMap,this.useHDR,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){let baseVertex=super.setupVertex(builder);return setupMeshVertex(this,`panoOnly`,baseVertex)}setup(builder){setupMeshPanoOnlyOutput(this,builder,`panoOnly`),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}},_defaultValues=new require_memoryUsage.v,PBMPointCloudNodeMaterial=class extends three_webgpu.NodeMaterial{static get type(){return`PBMPointCloudNodeMaterial`}constructor(){super(),this.isPBMPointCloudNodeMaterial=!0,this.setDefaultValues(_defaultValues),this.lights=!1,this.side=three_webgpu.DoubleSide}customProgramCacheKey(){return super.customProgramCacheKey()+`,`+[this.pointSize,this.pointShape,this.pointBack,this.colorStyle,this.floorStyle,this.flatShading,!!this.gradientTexture,require_memoryUsage.E(this.customNodes)].join(`,`)}setupVertex(builder){return setupPointCloudVertex(this,builder)}setup(builder){setupPointCloudOutput(this,builder),super.setup(builder)}setupObserver(builder){let observer=super.setupObserver(builder);return observer.refreshUniforms.push(...require_memoryUsage.O),observer}};function registerPBMMaterials(renderer){renderer.library.addMaterial(PBMMeshBasicNodeMaterial,`PBMMeshBasicMaterial`),renderer.library.addMaterial(PBMMeshPhongNodeMaterial,`PBMMeshPhongMaterial`),renderer.library.addMaterial(PBMMeshPhysicalNodeMaterial,`PBMMeshPhysicalMaterial`),renderer.library.addMaterial(PBMMeshPanoOnlyNodeMaterial,`PBMPanoOnlyMaterial`),renderer.library.addMaterial(PBMPointCloudNodeMaterial,`PBMPointCloudMaterial`)}var VolumePlaneIntersect;(function(VolumePlaneIntersect){VolumePlaneIntersect[VolumePlaneIntersect.Outside=-1]=`Outside`,VolumePlaneIntersect[VolumePlaneIntersect.Intersecting=0]=`Intersecting`,VolumePlaneIntersect[VolumePlaneIntersect.Inside=1]=`Inside`})(VolumePlaneIntersect||(VolumePlaneIntersect={}));var EPSILON$2=1e-6,identityMatrix4$1=new three_webgpu.Matrix4().identity(),scratchVector=new three_webgpu.Vector3,scratchMatrix4$6=new three_webgpu.Matrix4,scratchXAxis=new three_webgpu.Vector3,scratchYAxis=new three_webgpu.Vector3,scratchZAxis=new three_webgpu.Vector3,scratchSize=new three_webgpu.Vector3,scratchBox3$2=new three_webgpu.Box3,scratchSphere$2=new three_webgpu.Sphere,scratchMatrix4Inverse$1=new three_webgpu.Matrix4,scratchRay$1=new three_webgpu.Ray,scratchObject3D=new three_webgpu.Object3D,scratchFrustum=new three_webgpu.Frustum;function quaternionFromMatrix3(matrix3,quaternion){let m=matrix3.elements;return quaternion.setFromRotationMatrix(scratchMatrix4$6.set(m[0],m[3],m[6],0,m[1],m[4],m[7],0,m[2],m[5],m[8],0,0,0,0,1)),quaternion}var CullingVolume=class CullingVolume{static get MASK_OUTSIDE(){return 4294967295}static get MASK_INSIDE(){return 0}static get MASK_INDETERMINATE(){return 2147483647}constructor(planes=[]){this.planes=planes}setFromFrustum(frustum){return this.planes=frustum.planes.map(plane=>plane.clone()),this}setFromCamera(camera){return scratchMatrix4$6.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),scratchFrustum.setFromProjectionMatrix(scratchMatrix4$6),this.setFromFrustum(scratchFrustum),this}applyMatrix4(matrix){for(let plane of this.planes)plane.applyMatrix4(matrix)}copy(cullingVolume){return this.planes=cullingVolume.planes.map(plane=>plane.clone()),this}clone(){return new CullingVolume().copy(this)}computeVisibility(boundingVolume){let intersect=VolumePlaneIntersect.Inside;for(let plane of this.planes)switch(boundingVolume.intersectPlane(plane)){case VolumePlaneIntersect.Outside:return VolumePlaneIntersect.Outside;case VolumePlaneIntersect.Intersecting:intersect=VolumePlaneIntersect.Intersecting;break;default:}return intersect}computeVisibilityWithPlaneMask(boundingVolume,parentPlaneMask){if(parentPlaneMask===CullingVolume.MASK_OUTSIDE||parentPlaneMask===CullingVolume.MASK_INSIDE)return parentPlaneMask;let mask=CullingVolume.MASK_INSIDE,length=Math.min(32,this.planes.length);for(let i=0;i<length;++i){let flag=1<<i;if((parentPlaneMask&flag)===0)continue;let plane=this.planes[i],result=boundingVolume.intersectPlane(plane);if(result===VolumePlaneIntersect.Outside)return CullingVolume.MASK_OUTSIDE;result===VolumePlaneIntersect.Intersecting&&(mask|=flag)}return mask}},BoxBoundingVolume=class BoxBoundingVolume{constructor(){this.type=`box`,this.center=new three_webgpu.Vector3,this.halfSize=new three_webgpu.Vector3,this.rotation=new three_webgpu.Matrix3}fromJson({box}){this.center.set(box[0],box[1],box[2]);let xAxisX=box[3],xAxisY=box[4],xAxisZ=box[5],yAxisX=box[6],yAxisY=box[7],yAxisZ=box[8],zAxisX=box[9],zAxisY=box[10],zAxisZ=box[11],xAxisSize=Math.max(Math.sqrt(xAxisX*xAxisX+xAxisY*xAxisY+xAxisZ*xAxisZ),.001),yAxisSize=Math.max(Math.sqrt(yAxisX*yAxisX+yAxisY*yAxisY+yAxisZ*yAxisZ),.001),zAxisSize=Math.max(Math.sqrt(zAxisX*zAxisX+zAxisY*zAxisY+zAxisZ*zAxisZ),.001);this.halfSize.set(xAxisSize,yAxisSize,zAxisSize);let sumSize=this.halfSize.toArray().reduce((sum,n)=>sum+n,0);return(isNaN(sumSize)||sumSize<=0)&&this.halfSize.setScalar(EPSILON$2),this.rotation.fromArray([xAxisX/xAxisSize,xAxisY/xAxisSize,xAxisZ/xAxisSize,yAxisX/yAxisSize,yAxisY/yAxisSize,yAxisZ/yAxisSize,zAxisX/zAxisSize,zAxisY/zAxisSize,zAxisZ/zAxisSize]),isNaN(this.rotation.toArray().reduce((sum,n)=>sum+n,0))&&this.rotation.identity(),this}toJson(){return this.rotation.extractBasis(scratchXAxis,scratchYAxis,scratchZAxis),{box:[...this.center.toArray(),...scratchXAxis.multiplyScalar(this.halfSize.x).toArray(),...scratchYAxis.multiplyScalar(this.halfSize.y).toArray(),...scratchZAxis.multiplyScalar(this.halfSize.z).toArray()]}}copy(boxBoundingVolume){return this.center.copy(boxBoundingVolume.center),this.halfSize.copy(boxBoundingVolume.halfSize),this.rotation.copy(boxBoundingVolume.rotation),this}clone(){return new BoxBoundingVolume().copy(this)}applyMatrix4(matrix){return matrix.equals(identityMatrix4$1)?this:(scratchObject3D.position.copy(this.center),quaternionFromMatrix3(this.rotation,scratchObject3D.quaternion),scratchObject3D.scale.copy(this.halfSize),scratchObject3D.matrix.compose(scratchObject3D.position,scratchObject3D.quaternion,scratchObject3D.scale),scratchObject3D.matrix.premultiply(matrix),scratchObject3D.matrix.decompose(scratchObject3D.position,scratchObject3D.quaternion,scratchObject3D.scale),this.center.copy(scratchObject3D.position),this.rotation.setFromMatrix4(scratchMatrix4$6.makeRotationFromQuaternion(scratchObject3D.quaternion)),this.halfSize.copy(scratchObject3D.scale),this)}getCenter(result){return result.copy(this.center)}distanceSquaredToPoint(point){let m=this.rotation.elements,offsetX=point.x-this.center.x,offsetY=point.y-this.center.y,offsetZ=point.z-this.center.z,distanceSquared=0,d;return d=offsetX*m[0]+offsetY*m[1]+offsetZ*m[2],d<0&&(d=-d),d-=this.halfSize.x,d>0&&(distanceSquared+=d*d),d=offsetX*m[3]+offsetY*m[4]+offsetZ*m[5],d<0&&(d=-d),d-=this.halfSize.y,d>0&&(distanceSquared+=d*d),d=offsetX*m[6]+offsetY*m[7]+offsetZ*m[8],d<0&&(d=-d),d-=this.halfSize.z,d>0&&(distanceSquared+=d*d),distanceSquared}distanceToPoint(point){return Math.sqrt(this.distanceSquaredToPoint(point))}distanceToPlane(plane){let point=plane.projectPoint(this.center,new three_webgpu.Vector3);return this.distanceToPoint(point)}getBoundingBox(target){return target.makeEmpty(),this.rotation.extractBasis(scratchXAxis,scratchYAxis,scratchZAxis),scratchXAxis.setLength(this.halfSize.x),scratchYAxis.setLength(this.halfSize.y),scratchZAxis.setLength(this.halfSize.z),target.expandByPoint(scratchVector.copy(this.center).add(scratchXAxis)),target.expandByPoint(scratchVector.copy(this.center).sub(scratchXAxis)),target.expandByPoint(scratchVector.copy(this.center).add(scratchYAxis)),target.expandByPoint(scratchVector.copy(this.center).sub(scratchYAxis)),target.expandByPoint(scratchVector.copy(this.center).add(scratchZAxis)),target.expandByPoint(scratchVector.copy(this.center).sub(scratchZAxis)),target}toGeometry(){let indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),positions=new Float32Array(24);scratchVector.set(this.halfSize.x,this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,0),scratchVector.set(-this.halfSize.x,this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,3),scratchVector.set(-this.halfSize.x,-this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,6),scratchVector.set(this.halfSize.x,-this.halfSize.y,this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,9),scratchVector.set(this.halfSize.x,this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,12),scratchVector.set(-this.halfSize.x,this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,15),scratchVector.set(-this.halfSize.x,-this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,18),scratchVector.set(this.halfSize.x,-this.halfSize.y,-this.halfSize.z).applyMatrix3(this.rotation).add(this.center).toArray(positions,21);let geometry=new three_webgpu.BufferGeometry;return geometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry}intersectPlane(plane){let center=this.center,normal=plane.normal,rotation=this.rotation.elements,halfSize=this.halfSize,normalX=normal.x,normalY=normal.y,normalZ=normal.z,radEffective=Math.abs(normalX*rotation[0]*halfSize.x+normalY*rotation[1]*halfSize.x+normalZ*rotation[2]*halfSize.x)+Math.abs(normalX*rotation[3]*halfSize.y+normalY*rotation[4]*halfSize.y+normalZ*rotation[5]*halfSize.y)+Math.abs(normalX*rotation[6]*halfSize.z+normalY*rotation[7]*halfSize.z+normalZ*rotation[8]*halfSize.z),distanceToPlane=normal.dot(center)+plane.constant;return distanceToPlane<=-radEffective?VolumePlaneIntersect.Outside:distanceToPlane>=radEffective?VolumePlaneIntersect.Inside:VolumePlaneIntersect.Intersecting}intersectRay(ray,threshold=0,far){if(scratchSize.copy(this.halfSize).multiplyScalar(2),scratchBox3$2.setFromCenterAndSize(scratchVector.set(0,0,0),scratchSize),scratchBox3$2.expandByScalar(threshold),this.rotation.extractBasis(scratchXAxis,scratchYAxis,scratchZAxis),scratchMatrix4$6.makeBasis(scratchXAxis,scratchYAxis,scratchZAxis),scratchMatrix4$6.setPosition(this.center),scratchMatrix4Inverse$1.copy(scratchMatrix4$6).invert(),scratchRay$1.copy(ray).applyMatrix4(scratchMatrix4Inverse$1),scratchBox3$2.containsPoint(scratchRay$1.origin))return!0;let target=scratchRay$1.intersectBox(scratchBox3$2,scratchVector);return target?far===void 0?!0:(far+=threshold,target.distanceToSquared(scratchRay$1.origin)<=far*far):!1}},SphereBoundingVolume=class SphereBoundingVolume{constructor(){this.type=`sphere`,this.center=new three_webgpu.Vector3,this.radius=-1}fromJson({sphere}){return this.center.set(sphere[0],sphere[1],sphere[2]),this.radius=Math.max(sphere[3],EPSILON$2),this}toJson(){return{sphere:[...this.center.toArray(),this.radius]}}copy(sphereBoundingVolume){return this.center.copy(sphereBoundingVolume.center),this.radius=sphereBoundingVolume.radius,this}clone(){return new SphereBoundingVolume().copy(this)}getBoundingBox(target){return target.setFromCenterAndSize(this.center,scratchSize.set(1,1,1).multiplyScalar(this.radius*2)),target}toGeometry(){let positions=new Float32Array(384);for(let i=0;i<=32;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+1]=this.center.y+Math.sin(theta)*this.radius,positions[i*6+2]=this.center.z+0,theta=(i+1)/32*Math.PI*2,positions[i*6+3]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+4]=this.center.y+Math.sin(theta)*this.radius,positions[i*6+5]=this.center.z+0}for(let i=32;i<=64;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+1]=this.center.y+0,positions[i*6+2]=this.center.z+Math.sin(theta)*this.radius,theta=(i+1)/32*Math.PI*2,positions[i*6+3]=this.center.x+Math.cos(theta)*this.radius,positions[i*6+4]=this.center.y+0,positions[i*6+5]=this.center.z+Math.sin(theta)*this.radius}let geometry=new three_webgpu.BufferGeometry;return geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry}applyMatrix4(matrix){return matrix.equals(identityMatrix4$1)?this:(this.center.applyMatrix4(matrix),this.radius*=matrix.getMaxScaleOnAxis(),this)}getCenter(result){return result.copy(this.center)}distanceSquaredToPoint(point){let distance=this.distanceToPoint(point);return distance*distance}distanceToPoint(point){let distance=this.center.distanceTo(point)-this.radius;return distance<=0?0:distance}distanceToPlane(plane){let distance=Math.abs(plane.distanceToPoint(this.center));return Math.max(0,distance-this.radius)}intersectPlane(plane){let center=this.center,radius=this.radius,distanceToPlane=plane.normal.dot(center)+plane.constant;return distanceToPlane<-radius?VolumePlaneIntersect.Outside:distanceToPlane<radius?VolumePlaneIntersect.Intersecting:VolumePlaneIntersect.Inside}intersectRay(ray,threshold=0,far){if(scratchSphere$2.set(this.center,this.radius+threshold),scratchSphere$2.containsPoint(ray.origin))return!0;let target=ray.intersectSphere(scratchSphere$2,scratchVector);return target?far===void 0?!0:(far+=threshold,ray.origin.distanceToSquared(target)<=far*far):!1}},RegionBoundingVolume=class RegionBoundingVolume{constructor(){throw this.type=`regin`,this.west=0,this.south=0,this.east=0,this.north=0,this.minHeight=0,this.maxHeight=0,Error(`Region bounding volume not supported.`)}fromJson({region}){return this.west=region[0],this.south=region[1],this.east=region[2],this.north=region[3],this.minHeight=region[4],this.maxHeight=region[5],this}toJson(){return{region:[this.west,this.south,this.east,this.north,this.minHeight,this.maxHeight]}}copy(regionBoundingVolume){return this.west=regionBoundingVolume.west,this.south=regionBoundingVolume.south,this.east=regionBoundingVolume.east,this.north=regionBoundingVolume.north,this.minHeight=regionBoundingVolume.minHeight,this.maxHeight=regionBoundingVolume.maxHeight,this}clone(){return new RegionBoundingVolume().copy(this)}getBoundingBox(target){throw Error(`not implemented`)}toGeometry(){throw Error(`not implemented`)}applyMatrix4(matrix){throw Error(`not implemented`)}getCenter(result){throw Error(`not implemented`)}distanceToPoint(point){throw Error(`not implemented`)}distanceSquaredToPoint(point){throw Error(`not implemented`)}distanceToPlane(plane){throw Error(`not implemented`)}intersectPlane(plane){throw Error(`not implemented`)}intersectRay(ray,threshold=0,far){throw Error(`not implemented`)}};function isBoundingVolume(obj){return obj instanceof BoxBoundingVolume||obj instanceof SphereBoundingVolume||obj instanceof RegionBoundingVolume}function makeBoundingVolume(header){if(isBoundingVolume(header))return header;if(`box`in header)return new BoxBoundingVolume().fromJson(header);if(`sphere`in header)return new SphereBoundingVolume().fromJson(header);if(`region`in header)return new RegionBoundingVolume().fromJson(header);throw Error(`BoundingVolume ${JSON.stringify(header)} never suppored.`)}var debugMaterials=[4821759,8191922,16637280,16739958,5822969,376977,16747077,9259235,14514687].map(color=>new three_webgpu.LineBasicMaterial({color,depthWrite:!1,depthTest:!0,transparent:!0,opacity:.5})),debugBoxGeometry=(()=>{let indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),positions=new Float32Array(24);scratchVector.set(1,1,1).toArray(positions,0),scratchVector.set(-1,1,1).toArray(positions,3),scratchVector.set(-1,-1,1).toArray(positions,6),scratchVector.set(1,-1,1).toArray(positions,9),scratchVector.set(1,1,-1).toArray(positions,12),scratchVector.set(-1,1,-1).toArray(positions,15),scratchVector.set(-1,-1,-1).toArray(positions,18),scratchVector.set(1,-1,-1).toArray(positions,21);let geometry=new three_webgpu.BufferGeometry;return geometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry})(),debugSphereGeometry=(()=>{let positions=new Float32Array(384);for(let i=0;i<=32;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=Math.cos(theta),positions[i*6+1]=Math.sin(theta),positions[i*6+2]=0,theta=(i+1)/32*Math.PI*2,positions[i*6+3]=Math.cos(theta),positions[i*6+4]=Math.sin(theta),positions[i*6+5]=0}for(let i=32;i<=64;i++){let theta=0;theta=i/32*Math.PI*2,positions[i*6+0]=Math.cos(theta),positions[i*6+1]=0,positions[i*6+2]=Math.sin(theta),theta=(i+1)/32*Math.PI*2,positions[i*6+3]=Math.cos(theta),positions[i*6+4]=0,positions[i*6+5]=Math.sin(theta)}let geometry=new three_webgpu.BufferGeometry;return geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(positions,3)),geometry.computeBoundingBox(),geometry.computeBoundingSphere(),geometry})();function createDebugBoundingMesh(boundingVolume,level=0){if(boundingVolume instanceof BoxBoundingVolume){let line=new three_webgpu.LineSegments(debugBoxGeometry,debugMaterials[Math.min(level,debugMaterials.length-1)]);return line.position.copy(boundingVolume.center),quaternionFromMatrix3(boundingVolume.rotation,line.quaternion),line.scale.set(boundingVolume.halfSize.x,boundingVolume.halfSize.y,boundingVolume.halfSize.z),line.matrix.compose(line.position,line.quaternion,line.scale),line}else if(boundingVolume instanceof SphereBoundingVolume){let line=new three_webgpu.LineSegments(debugSphereGeometry,debugMaterials[Math.min(level,debugMaterials.length-1)]);return line.position.copy(boundingVolume.center),line.scale.set(boundingVolume.radius,boundingVolume.radius,boundingVolume.radius),line.matrix.compose(line.position,line.quaternion,line.scale),line}return null}var scratchVector3$9=new three_webgpu.Vector3,scratchPlane=new three_webgpu.Plane,scratchSphereBoundingVolume$1=new SphereBoundingVolume,scratchBoxBoundingVolume$1=new BoxBoundingVolume,Tile=class Tile{constructor(id,header,tileset,parent){var _a,_b,_c,_d;this.parent=null,this.contentParent=null,this.floor=0,this.id=id,this.state={visible:!1,frameNumber:0,selectedFrameNumber:0,requestedFrameNumber:0,touchedFrameNumber:0,distanceToCamera:0,centerZDepth:0,centerScreenY:0,screenSpaceError:0,visibilityPlaneMask:0,inRequestVolume:!1,shouldRefine:!1,stackLength:0,finalResolution:!0,selectionDepth:0,shouldSelect:!1,lastSelect:!1,ancestorWithContent:null,ancestorWithContentAvailable:null},this.parent=parent==null?null:parent,this.contentParent=parent?parent.hasRenderContent?parent:parent.contentParent:null,this.level=this.parent?this.parent.level+1:0,this.tileset=tileset,this.refine=(_a=header.refine)==null?this.parent?this.parent.refine:`REPLACE`:_a,this.transform=new three_webgpu.Matrix4,header.transform&&this.transform.fromArray(header.transform),this.parent&&this.transform.premultiply(this.parent.transform),typeof header.geometricError==`number`?this.geometricError=header.geometricError*this.transform.getMaxScaleOnAxis():this.geometricError=(_c=(_b=this.parent)==null?void 0:_b.geometricError)==null?0:_c,header.content&&header.content.uri?(this.content={uri:header.content.uri,loadState:`UNLOADED`,loadProgress:0,loadStateUpdateTime:require_memoryUsage.p(),loadfailRetryDelay:0,byteLength:0,memoryUsage:0},header.content.group!==void 0&&(this.content.group=header.content.group),/\.json$/.test(this.content.uri)?this.type=`TILESET`:this.type=`SCENEGRAPH`):(this.content=null,this.type=`EMPTY`),this.levelOfContent=this.parent?this.parent.levelOfContent:-1,this.type===`SCENEGRAPH`&&(this.levelOfContent+=1),header.boundingVolume&&(this.boundingVolume=makeBoundingVolume(header.boundingVolume).applyMatrix4(this.transform)),header.viewerRequestVolume&&(this.viewerRequestVolume=makeBoundingVolume(header.viewerRequestVolume).applyMatrix4(this.transform)),this.extras=(_d=header.extras)==null?{}:_d,typeof this.extras.floor!=`number`&&parent&&typeof parent.extras.floor==`number`&&(this.extras.floor=parent.extras.floor),typeof this.extras.floor==`number`&&(this.floor=this.extras.floor,this.tileset.floorLength=Math.max(this.tileset.floorLength,this.floor+1)),header.children?this.children=header.children.map((tileHeader,index)=>new Tile(`${this.id}.${index}`,tileHeader,tileset,this)):this.children=[]}traverse(callback){callback(this);for(let child of this.children)child.traverse(callback)}updateState(frameState){this.state.frameNumber=frameState.frameNumber;let transform=this.tileset.transform;if(this.boundingVolume){let boundingVolume;boundingVolume=this.boundingVolume instanceof BoxBoundingVolume?scratchBoxBoundingVolume$1.copy(this.boundingVolume):this.boundingVolume instanceof SphereBoundingVolume?scratchSphereBoundingVolume$1.copy(this.boundingVolume):this.boundingVolume.clone(),boundingVolume.applyMatrix4(transform),frameState.camera.type===`OrthographicCamera`?(scratchPlane.setFromNormalAndCoplanarPoint(frameState.camera.direction,frameState.camera.position),this.state.distanceToCamera=boundingVolume.distanceToPlane(scratchPlane)):this.state.distanceToCamera=boundingVolume.distanceToPoint(frameState.camera.position);let toCenter=boundingVolume.getCenter(scratchVector3$9).sub(frameState.camera.position);this.state.centerZDepth=frameState.camera.direction.dot(toCenter),this.state.centerScreenY=frameState.camera.up.dot(toCenter);let parentVisibilityPlaneMask=this.parent?this.parent.state.visibilityPlaneMask:CullingVolume.MASK_INDETERMINATE;this.state.visibilityPlaneMask=frameState.cullingVolume.computeVisibilityWithPlaneMask(boundingVolume,parentVisibilityPlaneMask),this.state.visible=this.state.visibilityPlaneMask!==CullingVolume.MASK_OUTSIDE,frameState.cameraCulling||(this.state.visible=!0)}else this.state.distanceToCamera=0,this.state.centerZDepth=0,this.state.visibilityPlaneMask=CullingVolume.MASK_INDETERMINATE,this.state.visible=!0;if((this.levelOfContent<=frameState.minLevelOfDetail||this.geometricError>=frameState.maxGeometricError)&&(this.state.visible=!0),this.viewerRequestVolume){let viewerRequestVolume;viewerRequestVolume=this.viewerRequestVolume instanceof BoxBoundingVolume?scratchBoxBoundingVolume$1.copy(this.viewerRequestVolume):this.viewerRequestVolume instanceof SphereBoundingVolume?scratchSphereBoundingVolume$1.copy(this.viewerRequestVolume):this.viewerRequestVolume.clone(),viewerRequestVolume.applyMatrix4(transform),this.state.inRequestVolume=viewerRequestVolume.distanceSquaredToPoint(frameState.camera.position)<=0}else this.state.inRequestVolume=!0;this.state.screenSpaceError=this.getScreenSpaceError(frameState,this.state.distanceToCamera,!1)}get selected(){return this.state.selectedFrameNumber===this.tileset.frameNumber}get hasChildren(){return this.children.length>0}get siblingIndex(){var _a,_b;return(_b=(_a=this.parent)==null?void 0:_a.children.indexOf(this))==null?0:_b}get hasTilesetContent(){return this.children.length>0&&this.type===`TILESET`}get hasRenderContent(){return this.type===`SCENEGRAPH`}get contentAvailable(){var _a;return this.hasRenderContent&&((_a=this.content)==null?void 0:_a.loadState)===`READY`}get hasUnloadedContent(){var _a;return((_a=this.content)==null?void 0:_a.loadState)===`UNLOADED`}get hasEmptyContent(){return this.type===`EMPTY`}get contentReady(){var _a;return((_a=this.content)==null?void 0:_a.loadState)===`READY`||this.hasEmptyContent}get contentByteLength(){return this.content?this.content.byteLength:0}get contentMemoryUsage(){return this.content?this.content.memoryUsage:0}getScreenSpaceError(frameState,distanceToCamera,useParentGeometricError){let scale=this.tileset.transform.getMaxScaleOnAxis(),parentGeometricError=this.parent?this.parent.geometricError:this.tileset.geometricError,geometricError=scale*(useParentGeometricError?parentGeometricError:this.geometricError);if(geometricError===0)return 0;let height=frameState.height,sseDenominator=frameState.sseDenominator;return frameState.camera.type===`OrthographicCamera`?geometricError/(1/(frameState.camera.projectionMatrix.elements[5]/2)/height*.9):geometricError/(Math.max(distanceToCamera,.001)*sseDenominator/height)}getPriority(frameState){let maySkipTile=this.refine===`ADD`||frameState.skipLevelOfDetail;if(maySkipTile&&!this.state.visible||frameState.frameNumber-this.state.touchedFrameNumber>=1)return-1;let parent=this.parent,screenSpaceError=parent&&(!maySkipTile||this.state.screenSpaceError===0)?parent.state.screenSpaceError:this.state.screenSpaceError,rootScreenSpaceError=this.tileset.root?this.tileset.root.state.screenSpaceError:0;return Math.max(rootScreenSpaceError-screenSpaceError,0)}},defaultIterator=item=>Number(item);function arrayMin(array,iterator=defaultIterator,needResult=!1){let item,result=1/0;for(let _item of array){let _result=iterator(_item);_result<=result&&(item=_item,result=_result)}return isFinite(result)||(result=0),needResult?[item,result]:item}function arrayEqual(array0,array1,equalFn=(v0,v1)=>v0===v1){let length=array0.length;if(length!==array1.length)return!1;for(let i=0;i<length;i++)if(equalFn(array0[i],array1[i])===!1)return!1;return!0}var arrayUniqueSet=new Set;function arrayUnique(array){arrayUniqueSet.clear();let result=[],length=array.length;for(let i=0;i<length;i++){let value=array[i];arrayUniqueSet.has(value)||(result.push(value),arrayUniqueSet.add(value))}return arrayUniqueSet.clear(),result}var arrayMinCallback=intersect=>intersect.distance,intersectDistanceSortCallback=(a,b)=>a.distance-b.distance;function sortIntersects(intersects,sortByDistance=!0,firstHitOnly=!1){if(firstHitOnly&&intersects.length>1){let intersect=arrayMin(intersects,arrayMinCallback);intersect?(intersects[0]=intersect,intersects.length=1):intersects.length=0}return sortByDistance&&intersects.length>1&&intersects.sort(intersectDistanceSortCallback),intersects}var BVHObject=class{constructor(position,indices){this.position=position,this.indices=indices}getPositionCount(){var _a,_b;let indices=this.indices,position=this.position;return indices?indices.array.length/((_a=indices.stride)==null?1:_a):position.array.length/((_b=position.stride)==null?3:_b)}getPositionByIndex(index,target){var _a,_b,_c,_d;let indices=this.indices,position=this.position,pIndex=index;if(indices){let array=indices.array,stride=(_a=indices.stride)==null?1:_a,offset=(_b=indices.offset)==null?0:_b;pIndex=array[index*stride+offset]}let array=position.array,stride=(_c=position.stride)==null?3:_c,offset=(_d=position.offset)==null?0:_d;return pIndex=pIndex*stride+offset,target.x=array[pIndex],target.y=array[pIndex+1],target.z=array[pIndex+2],target}createTree(maxTrianglesPerNode,maxDepth,extents){throw Error(`not implemented`)}trianglesInSphere(center,radius){throw Error(`not implemented`)}intersectRay(rayOrigin,rayDirection,threshold=0,onlyFirst=!1,filter){throw Error(`not implemented`)}},BVHNode=class{constructor(id,extents,startIndex,endIndex,deepth){this.id=id,this.extents=extents,this.startIndex=startIndex,this.endIndex=endIndex,this.deepth=deepth}};function packBVHNode(root,length){let array=new ArrayBuffer(length*36),float32Array=new Float32Array(array),uint32Array=new Uint32Array(array),uint16Array=new Uint16Array(array),stack=[root],node,offset;for(;node=stack.pop();)offset=node.id*36/4,float32Array[offset]=node.extents[0],float32Array[offset+1]=node.extents[1],float32Array[offset+2]=node.extents[2],float32Array[offset+3]=node.extents[3],float32Array[offset+4]=node.extents[4],float32Array[offset+5]=node.extents[5],uint32Array[offset+6]=node.startIndex,uint32Array[offset+7]=node.endIndex,offset=node.id*36/2,node.node0&&(uint16Array[offset+16]=node.node0.id,stack.push(node.node0)),node.node1&&(uint16Array[offset+17]=node.node1.id,stack.push(node.node1));return array}function intersectNodeBox(rayOrigin,invRayDirection,box,threshold=0){let minX=box.min.x-threshold,minY=box.min.y-threshold,minZ=box.min.z-threshold,maxX=box.max.x+threshold,maxY=box.max.y+threshold,maxZ=box.max.z+threshold,t_min=0,t_max=0,ty_min=0,ty_max=0,tz_min=0,tz_max=0;return invRayDirection.x>=0?(t_min=(minX-rayOrigin.x)*invRayDirection.x,t_max=(maxX-rayOrigin.x)*invRayDirection.x):(t_min=(maxX-rayOrigin.x)*invRayDirection.x,t_max=(minX-rayOrigin.x)*invRayDirection.x),invRayDirection.y>=0?(ty_min=(minY-rayOrigin.y)*invRayDirection.y,ty_max=(maxY-rayOrigin.y)*invRayDirection.y):(ty_min=(maxY-rayOrigin.y)*invRayDirection.y,ty_max=(minY-rayOrigin.y)*invRayDirection.y),t_min>ty_max||ty_min>t_max||((ty_min>t_min||t_min!==t_min)&&(t_min=ty_min),(ty_max<t_max||t_max!==t_max)&&(t_max=ty_max),invRayDirection.z>=0?(tz_min=(minZ-rayOrigin.z)*invRayDirection.z,tz_max=(maxZ-rayOrigin.z)*invRayDirection.z):(tz_min=(maxZ-rayOrigin.z)*invRayDirection.z,tz_max=(minZ-rayOrigin.z)*invRayDirection.z),t_min>tz_max||tz_min>t_max)||((tz_min>t_min||t_min!==t_min)&&(t_min=tz_min),(tz_max<t_max||t_max!==t_max)&&(t_max=tz_max),t_max<0)?null:t_min>=0?t_min:0}var BVHVector3=class BVHVector3{constructor(x,y,z){this.x=x,this.y=y,this.z=z}copy(v){return this.x=v.x,this.y=v.y,this.z=v.z,this}set(x,y,z){return this.x=x,this.y=y,this.z=z,this}fromArray(array,firstElementPos=0){return this.x=array[firstElementPos],this.y=array[firstElementPos+1],this.z=array[firstElementPos+2],this}toArray(array=[],offset=0){return array[offset]=this.x,array[offset+1]=this.y,array[offset+2]=this.z,array}add(v){return this.x+=v.x,this.y+=v.y,this.z+=v.z,this}multiplyScalar(scalar){return this.x*=scalar,this.y*=scalar,this.z*=scalar,this}subVectors(a,b){return this.x=a.x-b.x,this.y=a.y-b.y,this.z=a.z-b.z,this}addScaledVector(v,s){return this.x+=v.x*s,this.y+=v.y*s,this.z+=v.z*s,this}dot(v){return this.x*v.x+this.y*v.y+this.z*v.z}cross(v){let x=this.x,y=this.y,z=this.z;return this.x=y*v.z-z*v.y,this.y=z*v.x-x*v.z,this.z=x*v.y-y*v.x,this}crossVectors(a,b){let ax=a.x,ay=a.y,az=a.z,bx=b.x,by=b.y,bz=b.z;return this.x=ay*bz-az*by,this.y=az*bx-ax*bz,this.z=ax*by-ay*bx,this}distanceTo(v){return Math.sqrt(this.distanceToSquared(v))}distanceToSquared(v){let dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz}clone(){return new BVHVector3(this.x,this.y,this.z)}},BVHIntersect=class{constructor(pointA,pointB,pointC,index,intersectionPoint){this.pointA=pointA,this.pointB=pointB,this.pointC=pointC,this.index=index,this.intersectionPoint=intersectionPoint}},BVHBox3=class{constructor(min,max){this.min=min,this.max=max}},EPSILON$1=1e-6,scratchVector3$8=new BVHVector3(0,0,0),scratchVector3A=new BVHVector3(0,0,0),scratchVector3B=new BVHVector3(0,0,0),scratchVector3C=new BVHVector3(0,0,0),BVHMesh=class extends BVHObject{createTree(maxTrianglesPerNode,maxDepth,extents){maxDepth=Math.min(maxDepth,16);let triangleCount=this.getPositionCount()/3,offsetArray=triangleCount>65535?new Uint32Array(triangleCount):new Uint16Array(triangleCount),bboxArray=new Float32Array(triangleCount*6),nodesToSplit=[],nodesToSplitLength=0,idIndex=-1;if(extents)for(let i=0;i<triangleCount;i+=1){let indexOffset=i*3,bboxOffset=i*6,minX,minY,minZ,maxX,maxY,maxZ,temp;offsetArray[i]=i,this.getPositionByIndex(indexOffset,scratchVector3A),this.getPositionByIndex(indexOffset+1,scratchVector3B),this.getPositionByIndex(indexOffset+2,scratchVector3C),minX=maxX=scratchVector3A.x,temp=scratchVector3B.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),temp=scratchVector3C.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),minY=maxY=scratchVector3A.y,temp=scratchVector3B.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),temp=scratchVector3C.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),minZ=maxZ=scratchVector3A.z,temp=scratchVector3B.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),temp=scratchVector3C.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),bboxArray[bboxOffset]=minX,bboxArray[bboxOffset+1]=minY,bboxArray[bboxOffset+2]=minZ,bboxArray[bboxOffset+3]=maxX,bboxArray[bboxOffset+4]=maxY,bboxArray[bboxOffset+5]=maxZ}else{let gminX=1/0,gminY=1/0,gminZ=1/0,gmaxX=-1/0,gmaxY=-1/0,gmaxZ=-1/0;for(let i=0;i<triangleCount;i+=1){let indexOffset=i*3,bboxOffset=i*6,minX,minY,minZ,maxX,maxY,maxZ,temp;offsetArray[i]=i,this.getPositionByIndex(indexOffset,scratchVector3A),this.getPositionByIndex(indexOffset+1,scratchVector3B),this.getPositionByIndex(indexOffset+2,scratchVector3C),minX=maxX=scratchVector3A.x,temp=scratchVector3B.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),temp=scratchVector3C.x,temp<minX&&(minX=temp),temp>maxX&&(maxX=temp),minY=maxY=scratchVector3A.y,temp=scratchVector3B.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),temp=scratchVector3C.y,temp<minY&&(minY=temp),temp>maxY&&(maxY=temp),minZ=maxZ=scratchVector3A.z,temp=scratchVector3B.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),temp=scratchVector3C.z,temp<minZ&&(minZ=temp),temp>maxZ&&(maxZ=temp),bboxArray[bboxOffset]=minX,bboxArray[bboxOffset+1]=minY,bboxArray[bboxOffset+2]=minZ,bboxArray[bboxOffset+3]=maxX,bboxArray[bboxOffset+4]=maxY,bboxArray[bboxOffset+5]=maxZ,minX<gminX&&(gminX=minX),maxX>gmaxX&&(gmaxX=maxX),minY<gminY&&(gminY=minY),maxY>gmaxY&&(gmaxY=maxY),minZ<gminZ&&(gminZ=minZ),maxZ>gmaxZ&&(gmaxZ=maxZ)}extents=[gminX,gminY,gminZ,gmaxX,gmaxY,gmaxZ]}let rootNode=new BVHNode(++idIndex,extents,0,triangleCount,0);nodesToSplit[nodesToSplitLength++]=rootNode;let nodeSize=[],orders=[0,1,2],orderSorts=function(axis0,axis1){return nodeSize[axis1]-nodeSize[axis0]};function splitNode_(node){let startIndex=node.startIndex,endIndex=node.endIndex,extents=node.extents;nodeSize[0]=extents[3]-extents[0],nodeSize[1]=extents[4]-extents[1],nodeSize[2]=extents[5]-extents[2],orders.sort(orderSorts);for(let i=0;i<3;i++){let order=orders[i],center_x2=extents[order]+extents[order+3],headOffset=startIndex,tailOffset=endIndex-1,switcher=-1,temp;for(;headOffset<=tailOffset;)switcher===-1?(temp=offsetArray[headOffset],bboxArray[temp*6+order]+bboxArray[temp*6+order+3]<center_x2?headOffset++:switcher=temp):(temp=offsetArray[tailOffset],bboxArray[temp*6+order]+bboxArray[temp*6+order+3]>=center_x2?tailOffset--:(offsetArray[headOffset]=temp,offsetArray[tailOffset]=switcher,switcher=-1,headOffset++,tailOffset--));if(headOffset>startIndex&&headOffset<endIndex){let node0=new BVHNode(++idIndex,calcExtents(offsetArray,bboxArray,startIndex,headOffset,EPSILON$1),startIndex,headOffset,node.deepth+1);node0.deepth<maxDepth&&node0.endIndex-node0.startIndex>maxTrianglesPerNode&&(nodesToSplit[nodesToSplitLength++]=node0);let node1=new BVHNode(++idIndex,calcExtents(offsetArray,bboxArray,headOffset,endIndex,EPSILON$1),headOffset,endIndex,node.deepth+1);node1.deepth<maxDepth&&node1.endIndex-node1.startIndex>maxTrianglesPerNode&&(nodesToSplit[nodesToSplitLength++]=node1),node.node0=node0,node.node1=node1,node.startIndex=0,node.endIndex=0;break}}}for(;nodesToSplitLength;)splitNode_(nodesToSplit[--nodesToSplitLength]);return this.offsetArray=offsetArray,this.rootNodePacked=packBVHNode(rootNode,idIndex+1),nodesToSplit.length=0,this}trianglesInSphere(center,radius){let offsetArray=this.offsetArray,rootNode=this.rootNodePacked,rootNodeFloat32Array=new Float32Array(rootNode),rootNodeUint32Array=new Uint32Array(rootNode),rootNodeUint16Array=new Uint16Array(rootNode),nodeIdsToIntersect=[0],triangles=[],nodeId;for(;(nodeId=nodeIdsToIntersect.pop())!==void 0;){let offset=nodeId*36/4,vx=clamp$7(center.x,rootNodeFloat32Array[offset],rootNodeFloat32Array[offset+3])-center.x,vy=clamp$7(center.y,rootNodeFloat32Array[offset+1],rootNodeFloat32Array[offset+4])-center.y,vz=clamp$7(center.z,rootNodeFloat32Array[offset+2],rootNodeFloat32Array[offset+5])-center.z;if(vx*vx+vy*vy+vz*vz<=radius*radius){let start=rootNodeUint32Array[offset+6],end=rootNodeUint32Array[offset+7];for(let i=start;i<end;i++){let triangleIndex=offsetArray[i];triangles.push(triangleIndex)}let nodeIdOffset=nodeId*36/2,node0Id=rootNodeUint16Array[nodeIdOffset+16],node1Id=rootNodeUint16Array[nodeIdOffset+17];node0Id&&nodeIdsToIntersect.push(node0Id),node1Id&&nodeIdsToIntersect.push(node1Id)}}let triangleLength=triangles.length,triangleArray=new Float32Array(triangleLength*9);for(let i=0;i<triangleLength;i++){let indexOffset=triangles[i]*3;this.getPositionByIndex(indexOffset,scratchVector3$8),triangleArray[i*9]=scratchVector3$8.x,triangleArray[i*9+1]=scratchVector3$8.y,triangleArray[i*9+2]=scratchVector3$8.z,this.getPositionByIndex(indexOffset+1,scratchVector3$8),triangleArray[i*9+3]=scratchVector3$8.x,triangleArray[i*9+4]=scratchVector3$8.y,triangleArray[i*9+5]=scratchVector3$8.z,this.getPositionByIndex(indexOffset+2,scratchVector3$8),triangleArray[i*9+6]=scratchVector3$8.x,triangleArray[i*9+7]=scratchVector3$8.y,triangleArray[i*9+8]=scratchVector3$8.z}return triangleArray}intersectRay(rayOrigin,rayDirection,threshold=0,onlyFirst=!1,filter){let intersects=[],offsetArray=this.offsetArray,rootNode=this.rootNodePacked,rootNodeFloat32Array=new Float32Array(rootNode),rootNodeUint32Array=new Uint32Array(rootNode),rootNodeUint16Array=new Uint16Array(rootNode),invRayDirection=new BVHVector3(1/rayDirection.x,1/rayDirection.y,1/rayDirection.z),nodeIdsToIntersect=[0],nodeId,maxDistance=1/0,box=new BVHBox3(new BVHVector3(0,0,0),new BVHVector3(0,0,0)),pointA=new BVHVector3(0,0,0),pointB=new BVHVector3(0,0,0),pointC=new BVHVector3(0,0,0);for(;(nodeId=nodeIdsToIntersect.pop())!==void 0;){let offset=nodeId*36/4;box.min.x=rootNodeFloat32Array[offset],box.min.y=rootNodeFloat32Array[offset+1],box.min.z=rootNodeFloat32Array[offset+2],box.max.x=rootNodeFloat32Array[offset+3],box.max.y=rootNodeFloat32Array[offset+4],box.max.z=rootNodeFloat32Array[offset+5];let nodeBoxDistance=intersectNodeBox(rayOrigin,invRayDirection,box,threshold);if(nodeBoxDistance===null||onlyFirst&&nodeBoxDistance>maxDistance)continue;let ox=rayOrigin.x,oy=rayOrigin.y,oz=rayOrigin.z,dx=rayDirection.x,dy=rayDirection.y,dz=rayDirection.z,start=rootNodeUint32Array[offset+6],end=rootNodeUint32Array[offset+7];for(let i=start;i<end;i++){let triangleIndex=offsetArray[i],indexOffset=triangleIndex*3;this.getPositionByIndex(indexOffset,pointA);let ax=pointA.x,ay=pointA.y,az=pointA.z;this.getPositionByIndex(indexOffset+1,pointB);let bx=pointB.x,by=pointB.y,bz=pointB.z;this.getPositionByIndex(indexOffset+2,pointC);let cx=pointC.x,cy=pointC.y,cz=pointC.z,edge1X=bx-ax,edge1Y=by-ay,edge1Z=bz-az,edge2X=cx-ax,edge2Y=cy-ay,edge2Z=cz-az,normalX=edge1Y*edge2Z-edge1Z*edge2Y,normalY=edge1Z*edge2X-edge1X*edge2Z,normalZ=edge1X*edge2Y-edge1Y*edge2X,DdN=dx*normalX+dy*normalY+dz*normalZ,sign;if(DdN>0)sign=1;else if(DdN<0)sign=-1,DdN=-DdN;else continue;let diffX=ox-ax,diffY=oy-ay,diffZ=oz-az,DdQxE2=sign*(dx*(diffY*edge2Z-diffZ*edge2Y)+dy*(diffZ*edge2X-diffX*edge2Z)+dz*(diffX*edge2Y-diffY*edge2X));if(DdQxE2<0)continue;let DdE1xQ=sign*(dx*(edge1Y*diffZ-edge1Z*diffY)+dy*(edge1Z*diffX-edge1X*diffZ)+dz*(edge1X*diffY-edge1Y*diffX));if(DdE1xQ<0||DdQxE2+DdE1xQ>DdN)continue;let QdN=-sign*(diffX*normalX+diffY*normalY+diffZ*normalZ);if(QdN<0)continue;let t=QdN/DdN,intersect=new BVHIntersect(pointA,pointB,pointC,triangleIndex,new BVHVector3(ox+dx*t,oy+dy*t,oz+dz*t));(!filter||filter(intersect))&&(onlyFirst?t<maxDistance&&(maxDistance=t,intersects.length>0&&(intersects.length=0),intersects.push(intersect)):intersects.push(intersect))}let nodeIdOffset=nodeId*36/2,node0Id=rootNodeUint16Array[nodeIdOffset+16],node1Id=rootNodeUint16Array[nodeIdOffset+17];node0Id&&nodeIdsToIntersect.push(node0Id),node1Id&&nodeIdsToIntersect.push(node1Id)}return intersects}};function clamp$7(value,min,max){return value<min?min:value>max?max:value}function calcExtents(offsetArray,bboxArray,startIndex,endIndex,expandBy){if(startIndex>=endIndex)return[0,0,0,0,0,0];let minX=1/0,minY=1/0,minZ=1/0,maxX=-1/0,maxY=-1/0,maxZ=-1/0;for(let offset=startIndex;offset<endIndex;offset++){let bboxIndex=offsetArray[offset]*6,temp=bboxArray[bboxIndex];temp<minX&&(minX=temp),temp=bboxArray[bboxIndex+1],temp<minY&&(minY=temp),temp=bboxArray[bboxIndex+2],temp<minZ&&(minZ=temp),temp=bboxArray[bboxIndex+3],temp>maxX&&(maxX=temp),temp=bboxArray[bboxIndex+4],temp>maxY&&(maxY=temp),temp=bboxArray[bboxIndex+5],temp>maxZ&&(maxZ=temp)}return[minX-expandBy,minY-expandBy,minZ-expandBy,maxX+expandBy,maxY+expandBy,maxZ+expandBy]}(function(){let diff=new BVHVector3(0,0,0),edge1=new BVHVector3(0,0,0),edge2=new BVHVector3(0,0,0),normal=new BVHVector3(0,0,0);return function(a,b,c,rayOrigin,rayDirection){edge1.subVectors(b,a),edge2.subVectors(c,a),normal.crossVectors(edge1,edge2);let DdN=rayDirection.dot(normal),sign;if(DdN>0)sign=1;else if(DdN<0)sign=-1,DdN=-DdN;else return null;diff.subVectors(rayOrigin,a);let DdQxE2=sign*rayDirection.dot(edge2.crossVectors(diff,edge2));if(DdQxE2<0)return null;let DdE1xQ=sign*rayDirection.dot(edge1.cross(diff));if(DdE1xQ<0||DdQxE2+DdE1xQ>DdN)return null;let QdN=-sign*diff.dot(normal);if(QdN<0)return null;let t=QdN/DdN;return new BVHVector3(0,0,0).copy(rayDirection).multiplyScalar(t).add(rayOrigin)}})();var EPSILON=1e-6,ORDER_AXISES=[`x`,`y`,`z`],scratchVector3$7=new BVHVector3(0,0,0),BVHPoints=class extends BVHObject{createTree(maxPointsPerNode,maxDepth,extents){maxDepth=Math.min(maxDepth,16);let getPositionByIndex=this.getPositionByIndex.bind(this),pointCount=this.getPositionCount(),offsetArray=pointCount>65535?new Uint32Array(pointCount):new Uint16Array(pointCount),nodesToSplit=[],nodesToSplitLength=0,idIndex=-1;if(extents)for(let i=0;i<pointCount;i+=1)offsetArray[i]=i;else{getPositionByIndex(0,scratchVector3$7);let gminX=scratchVector3$7.x,gminY=scratchVector3$7.y,gminZ=scratchVector3$7.z,gmaxX=gminX,gmaxY=gminY,gmaxZ=gminZ;for(let i=0;i<pointCount;i+=1){offsetArray[i]=i,getPositionByIndex(i,scratchVector3$7);let x=scratchVector3$7.x,y=scratchVector3$7.y,z=scratchVector3$7.z;x<gminX?gminX=x:x>gmaxX&&(gmaxX=x),y<gminY?gminY=y:y>gmaxY&&(gmaxY=y),z<gminZ?gminZ=z:z>gmaxZ&&(gmaxZ=z)}extents=[gminX,gminY,gminZ,gmaxX,gmaxY,gmaxZ]}let rootNode=new BVHNode(++idIndex,extents,0,pointCount,0);nodesToSplit[nodesToSplitLength++]=rootNode;let nodeSize=[],orders=[0,1,2],orderSorts=function(axis0,axis1){return nodeSize[axis1]-nodeSize[axis0]};function splitNode_(node){let startIndex=node.startIndex,endIndex=node.endIndex,extents=node.extents;nodeSize[0]=extents[3]-extents[0],nodeSize[1]=extents[4]-extents[1],nodeSize[2]=extents[5]-extents[2];let order=orders.sort(orderSorts)[0],orderAxis=ORDER_AXISES[order],center=(extents[order]+extents[order+3])/2,headOffset=startIndex,tailOffset=endIndex-1,switcher=-1,temp;for(;headOffset<=tailOffset;)switcher===-1?(temp=offsetArray[headOffset],getPositionByIndex(temp,scratchVector3$7),scratchVector3$7[orderAxis]<center?headOffset++:switcher=temp):(temp=offsetArray[tailOffset],getPositionByIndex(temp,scratchVector3$7),scratchVector3$7[orderAxis]>=center?tailOffset--:(offsetArray[headOffset]=temp,offsetArray[tailOffset]=switcher,switcher=-1,headOffset++,tailOffset--));if(headOffset>startIndex){let node0Extents=extents.slice();node0Extents[order+3]=center+EPSILON;let node0=new BVHNode(++idIndex,node0Extents,startIndex,headOffset,node.deepth+1);node0.deepth<maxDepth&&node0.endIndex-node0.startIndex>maxPointsPerNode&&(nodesToSplit[nodesToSplitLength++]=node0),node.node0=node0}if(endIndex>headOffset){let node1Extents=extents.slice();node1Extents[order]=center-EPSILON;let node1=new BVHNode(++idIndex,node1Extents,headOffset,endIndex,node.deepth+1);node1.deepth<maxDepth&&node1.endIndex-node1.startIndex>maxPointsPerNode&&(nodesToSplit[nodesToSplitLength++]=node1),node.node1=node1}node.startIndex=0,node.endIndex=0}for(;nodesToSplitLength;)splitNode_(nodesToSplit[--nodesToSplitLength]);return this.offsetArray=offsetArray,this.rootNodePacked=packBVHNode(rootNode,idIndex+1),nodesToSplit.length=0,this}intersectRay(rayOrigin,rayDirection,threshold=0,onlyFirst=!1,filter){let intersects=[],offsetArray=this.offsetArray,rootNode=this.rootNodePacked,rootNodeFloat32Array=new Float32Array(rootNode),rootNodeUint32Array=new Uint32Array(rootNode),rootNodeUint16Array=new Uint16Array(rootNode),thresholdSquared=threshold*threshold,invRayDirection=new BVHVector3(1/rayDirection.x,1/rayDirection.y,1/rayDirection.z),nodeIdsToIntersect=[0],nodeId,maxDistance=1/0,box=new BVHBox3(new BVHVector3(0,0,0),new BVHVector3(0,0,0)),point=new BVHVector3(0,0,0);for(;(nodeId=nodeIdsToIntersect.pop())!==void 0;){let offset=nodeId*36/4;box.min.x=rootNodeFloat32Array[offset],box.min.y=rootNodeFloat32Array[offset+1],box.min.z=rootNodeFloat32Array[offset+2],box.max.x=rootNodeFloat32Array[offset+3],box.max.y=rootNodeFloat32Array[offset+4],box.max.z=rootNodeFloat32Array[offset+5];let nodeBoxDistance=intersectNodeBox(rayOrigin,invRayDirection,box,threshold);if(nodeBoxDistance===null||onlyFirst&&nodeBoxDistance>maxDistance)continue;let start=rootNodeUint32Array[offset+6],end=rootNodeUint32Array[offset+7];for(let i=start;i<end;i++){let indexOffset=offsetArray[i];this.getPositionByIndex(indexOffset,point);let x=point.x,y=point.y,z=point.z,vx=rayOrigin.x,vy=rayOrigin.y,vz=rayOrigin.z,dx=rayDirection.x,dy=rayDirection.y,dz=rayDirection.z,t=dx*(x-vx)+dy*(y-vy)+dz*(z-vz);if(t>0?(vx+=dx*t,vy+=dy*t,vz+=dz*t):t<0&&(t=0),dx=x-vx,dy=y-vy,dz=z-vz,dx*dx+dy*dy+dz*dz<=thresholdSquared){let intersect=new BVHIntersect(point,point,point,indexOffset,new BVHVector3(vx,vy,vz));(!filter||filter(intersect))&&(onlyFirst?t<maxDistance&&(maxDistance=t,intersects.length>0&&(intersects.length=0),intersects.push(intersect)):intersects.push(intersect))}}let nodeIdOffset=nodeId*36/2,node0Id=rootNodeUint16Array[nodeIdOffset+16],node1Id=rootNodeUint16Array[nodeIdOffset+17];node0Id&&nodeIdsToIntersect.push(node0Id),node1Id&&nodeIdsToIntersect.push(node1Id)}return intersects}},jsContent$1="(function(){var e=class{constructor(e,t){this.position=e,this.indices=t}getPositionCount(){var e,t;let n=this.indices,r=this.position;return n?n.array.length/((e=n.stride)==null?1:e):r.array.length/((t=r.stride)==null?3:t)}getPositionByIndex(e,t){var n,r,i,a;let o=this.indices,s=this.position,c=e;if(o){let t=o.array,i=(n=o.stride)==null?1:n,a=(r=o.offset)==null?0:r;c=t[e*i+a]}let l=s.array,u=(i=s.stride)==null?3:i,d=(a=s.offset)==null?0:a;return c=c*u+d,t.x=l[c],t.y=l[c+1],t.z=l[c+2],t}createTree(e,t,n){throw Error(`not implemented`)}trianglesInSphere(e,t){throw Error(`not implemented`)}intersectRay(e,t,n=0,r=!1,i){throw Error(`not implemented`)}},t=class{constructor(e,t,n,r,i){this.id=e,this.extents=t,this.startIndex=n,this.endIndex=r,this.deepth=i}};function n(e,t){let n=new ArrayBuffer(t*36),r=new Float32Array(n),i=new Uint32Array(n),a=new Uint16Array(n),o=[e],s,c;for(;s=o.pop();)c=s.id*36/4,r[c]=s.extents[0],r[c+1]=s.extents[1],r[c+2]=s.extents[2],r[c+3]=s.extents[3],r[c+4]=s.extents[4],r[c+5]=s.extents[5],i[c+6]=s.startIndex,i[c+7]=s.endIndex,c=s.id*36/2,s.node0&&(a[c+16]=s.node0.id,o.push(s.node0)),s.node1&&(a[c+17]=s.node1.id,o.push(s.node1));return n}function r(e,t,n,r=0){let i=n.min.x-r,a=n.min.y-r,o=n.min.z-r,s=n.max.x+r,c=n.max.y+r,l=n.max.z+r,u=0,d=0,f=0,p=0,m=0,h=0;return t.x>=0?(u=(i-e.x)*t.x,d=(s-e.x)*t.x):(u=(s-e.x)*t.x,d=(i-e.x)*t.x),t.y>=0?(f=(a-e.y)*t.y,p=(c-e.y)*t.y):(f=(c-e.y)*t.y,p=(a-e.y)*t.y),u>p||f>d||((f>u||u!==u)&&(u=f),(p<d||d!==d)&&(d=p),t.z>=0?(m=(o-e.z)*t.z,h=(l-e.z)*t.z):(m=(l-e.z)*t.z,h=(o-e.z)*t.z),u>h||m>d)||((m>u||u!==u)&&(u=m),(h<d||d!==d)&&(d=h),d<0)?null:u>=0?u:0}var i=class e{constructor(e,t,n){this.x=e,this.y=t,this.z=n}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}set(e,t,n){return this.x=e,this.y=t,this.z=n,this}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e){let t=this.x,n=this.y,r=this.z;return this.x=n*e.z-r*e.y,this.y=r*e.x-t*e.z,this.z=t*e.y-n*e.x,this}crossVectors(e,t){let n=e.x,r=e.y,i=e.z,a=t.x,o=t.y,s=t.z;return this.x=r*s-i*o,this.y=i*a-n*s,this.z=n*o-r*a,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){let t=this.x-e.x,n=this.y-e.y,r=this.z-e.z;return t*t+n*n+r*r}clone(){return new e(this.x,this.y,this.z)}},a=class{constructor(e,t,n,r,i){this.pointA=e,this.pointB=t,this.pointC=n,this.index=r,this.intersectionPoint=i}},o=class{constructor(e,t){this.min=e,this.max=t}};let s=1e-6,c=new i(0,0,0),l=new i(0,0,0),u=new i(0,0,0),d=new i(0,0,0);var f=class extends e{createTree(e,r,i){r=Math.min(r,16);let a=this.getPositionCount()/3,o=a>65535?new Uint32Array(a):new Uint16Array(a),c=new Float32Array(a*6),f=[],p=0,h=-1;if(i)for(let e=0;e<a;e+=1){let t=e*3,n=e*6,r,i,a,s,f,p,m;o[e]=e,this.getPositionByIndex(t,l),this.getPositionByIndex(t+1,u),this.getPositionByIndex(t+2,d),r=s=l.x,m=u.x,m<r&&(r=m),m>s&&(s=m),m=d.x,m<r&&(r=m),m>s&&(s=m),i=f=l.y,m=u.y,m<i&&(i=m),m>f&&(f=m),m=d.y,m<i&&(i=m),m>f&&(f=m),a=p=l.z,m=u.z,m<a&&(a=m),m>p&&(p=m),m=d.z,m<a&&(a=m),m>p&&(p=m),c[n]=r,c[n+1]=i,c[n+2]=a,c[n+3]=s,c[n+4]=f,c[n+5]=p}else{let e=1/0,t=1/0,n=1/0,r=-1/0,s=-1/0,f=-1/0;for(let i=0;i<a;i+=1){let a=i*3,p=i*6,m,h,g,_,v,y,b;o[i]=i,this.getPositionByIndex(a,l),this.getPositionByIndex(a+1,u),this.getPositionByIndex(a+2,d),m=_=l.x,b=u.x,b<m&&(m=b),b>_&&(_=b),b=d.x,b<m&&(m=b),b>_&&(_=b),h=v=l.y,b=u.y,b<h&&(h=b),b>v&&(v=b),b=d.y,b<h&&(h=b),b>v&&(v=b),g=y=l.z,b=u.z,b<g&&(g=b),b>y&&(y=b),b=d.z,b<g&&(g=b),b>y&&(y=b),c[p]=m,c[p+1]=h,c[p+2]=g,c[p+3]=_,c[p+4]=v,c[p+5]=y,m<e&&(e=m),_>r&&(r=_),h<t&&(t=h),v>s&&(s=v),g<n&&(n=g),y>f&&(f=y)}i=[e,t,n,r,s,f]}let g=new t(++h,i,0,a,0);f[p++]=g;let _=[],v=[0,1,2],y=function(e,t){return _[t]-_[e]};function b(n){let i=n.startIndex,a=n.endIndex,l=n.extents;_[0]=l[3]-l[0],_[1]=l[4]-l[1],_[2]=l[5]-l[2],v.sort(y);for(let u=0;u<3;u++){let d=v[u],g=l[d]+l[d+3],_=i,y=a-1,b=-1,x;for(;_<=y;)b===-1?(x=o[_],c[x*6+d]+c[x*6+d+3]<g?_++:b=x):(x=o[y],c[x*6+d]+c[x*6+d+3]>=g?y--:(o[_]=x,o[y]=b,b=-1,_++,y--));if(_>i&&_<a){let l=new t(++h,m(o,c,i,_,s),i,_,n.deepth+1);l.deepth<r&&l.endIndex-l.startIndex>e&&(f[p++]=l);let u=new t(++h,m(o,c,_,a,s),_,a,n.deepth+1);u.deepth<r&&u.endIndex-u.startIndex>e&&(f[p++]=u),n.node0=l,n.node1=u,n.startIndex=0,n.endIndex=0;break}}}for(;p;)b(f[--p]);return this.offsetArray=o,this.rootNodePacked=n(g,h+1),f.length=0,this}trianglesInSphere(e,t){let n=this.offsetArray,r=this.rootNodePacked,i=new Float32Array(r),a=new Uint32Array(r),o=new Uint16Array(r),s=[0],l=[],u;for(;(u=s.pop())!==void 0;){let r=u*36/4,c=p(e.x,i[r],i[r+3])-e.x,d=p(e.y,i[r+1],i[r+4])-e.y,f=p(e.z,i[r+2],i[r+5])-e.z;if(c*c+d*d+f*f<=t*t){let e=a[r+6],t=a[r+7];for(let r=e;r<t;r++){let e=n[r];l.push(e)}let i=u*36/2,c=o[i+16],d=o[i+17];c&&s.push(c),d&&s.push(d)}}let d=l.length,f=new Float32Array(d*9);for(let e=0;e<d;e++){let t=l[e]*3;this.getPositionByIndex(t,c),f[e*9]=c.x,f[e*9+1]=c.y,f[e*9+2]=c.z,this.getPositionByIndex(t+1,c),f[e*9+3]=c.x,f[e*9+4]=c.y,f[e*9+5]=c.z,this.getPositionByIndex(t+2,c),f[e*9+6]=c.x,f[e*9+7]=c.y,f[e*9+8]=c.z}return f}intersectRay(e,t,n=0,s=!1,c){let l=[],u=this.offsetArray,d=this.rootNodePacked,f=new Float32Array(d),p=new Uint32Array(d),m=new Uint16Array(d),h=new i(1/t.x,1/t.y,1/t.z),g=[0],_,v=1/0,y=new o(new i(0,0,0),new i(0,0,0)),b=new i(0,0,0),x=new i(0,0,0),S=new i(0,0,0);for(;(_=g.pop())!==void 0;){let o=_*36/4;y.min.x=f[o],y.min.y=f[o+1],y.min.z=f[o+2],y.max.x=f[o+3],y.max.y=f[o+4],y.max.z=f[o+5];let d=r(e,h,y,n);if(d===null||s&&d>v)continue;let C=e.x,w=e.y,T=e.z,E=t.x,D=t.y,O=t.z,k=p[o+6],A=p[o+7];for(let e=k;e<A;e++){let t=u[e],n=t*3;this.getPositionByIndex(n,b);let r=b.x,o=b.y,d=b.z;this.getPositionByIndex(n+1,x);let f=x.x,p=x.y,m=x.z;this.getPositionByIndex(n+2,S);let h=S.x,g=S.y,_=S.z,y=f-r,k=p-o,A=m-d,j=h-r,M=g-o,N=_-d,P=k*N-A*M,F=A*j-y*N,I=y*M-k*j,L=E*P+D*F+O*I,R;if(L>0)R=1;else if(L<0)R=-1,L=-L;else continue;let z=C-r,B=w-o,V=T-d,H=R*(E*(B*N-V*M)+D*(V*j-z*N)+O*(z*M-B*j));if(H<0)continue;let U=R*(E*(k*V-A*B)+D*(A*z-y*V)+O*(y*B-k*z));if(U<0||H+U>L)continue;let W=-R*(z*P+B*F+V*I);if(W<0)continue;let G=W/L,K=new a(b,x,S,t,new i(C+E*G,w+D*G,T+O*G));(!c||c(K))&&(s?G<v&&(v=G,l.length>0&&(l.length=0),l.push(K)):l.push(K))}let j=_*36/2,M=m[j+16],N=m[j+17];M&&g.push(M),N&&g.push(N)}return l}};function p(e,t,n){return e<t?t:e>n?n:e}function m(e,t,n,r,i){if(n>=r)return[0,0,0,0,0,0];let a=1/0,o=1/0,s=1/0,c=-1/0,l=-1/0,u=-1/0;for(let i=n;i<r;i++){let n=e[i]*6,r=t[n];r<a&&(a=r),r=t[n+1],r<o&&(o=r),r=t[n+2],r<s&&(s=r),r=t[n+3],r>c&&(c=r),r=t[n+4],r>l&&(l=r),r=t[n+5],r>u&&(u=r)}return[a-i,o-i,s-i,c+i,l+i,u+i]}(function(){let e=new i(0,0,0),t=new i(0,0,0),n=new i(0,0,0),r=new i(0,0,0);return function(a,o,s,c,l){t.subVectors(o,a),n.subVectors(s,a),r.crossVectors(t,n);let u=l.dot(r),d;if(u>0)d=1;else if(u<0)d=-1,u=-u;else return null;e.subVectors(c,a);let f=d*l.dot(n.crossVectors(e,n));if(f<0)return null;let p=d*l.dot(t.cross(e));if(p<0||f+p>u)return null;let m=-d*e.dot(r);if(m<0)return null;let h=m/u;return new i(0,0,0).copy(l).multiplyScalar(h).add(c)}})();let h=1e-6,g=[`x`,`y`,`z`],_=new i(0,0,0);var v=class extends e{createTree(e,r,i){r=Math.min(r,16);let a=this.getPositionByIndex.bind(this),o=this.getPositionCount(),s=o>65535?new Uint32Array(o):new Uint16Array(o),c=[],l=0,u=-1;if(i)for(let e=0;e<o;e+=1)s[e]=e;else{a(0,_);let e=_.x,t=_.y,n=_.z,r=e,c=t,l=n;for(let i=0;i<o;i+=1){s[i]=i,a(i,_);let o=_.x,u=_.y,d=_.z;o<e?e=o:o>r&&(r=o),u<t?t=u:u>c&&(c=u),d<n?n=d:d>l&&(l=d)}i=[e,t,n,r,c,l]}let d=new t(++u,i,0,o,0);c[l++]=d;let f=[],p=[0,1,2],m=function(e,t){return f[t]-f[e]};function v(n){let i=n.startIndex,o=n.endIndex,d=n.extents;f[0]=d[3]-d[0],f[1]=d[4]-d[1],f[2]=d[5]-d[2];let v=p.sort(m)[0],y=g[v],b=(d[v]+d[v+3])/2,x=i,S=o-1,C=-1,w;for(;x<=S;)C===-1?(w=s[x],a(w,_),_[y]<b?x++:C=w):(w=s[S],a(w,_),_[y]>=b?S--:(s[x]=w,s[S]=C,C=-1,x++,S--));if(x>i){let a=d.slice();a[v+3]=b+h;let o=new t(++u,a,i,x,n.deepth+1);o.deepth<r&&o.endIndex-o.startIndex>e&&(c[l++]=o),n.node0=o}if(o>x){let i=d.slice();i[v]=b-h;let a=new t(++u,i,x,o,n.deepth+1);a.deepth<r&&a.endIndex-a.startIndex>e&&(c[l++]=a),n.node1=a}n.startIndex=0,n.endIndex=0}for(;l;)v(c[--l]);return this.offsetArray=s,this.rootNodePacked=n(d,u+1),c.length=0,this}intersectRay(e,t,n=0,s=!1,c){let l=[],u=this.offsetArray,d=this.rootNodePacked,f=new Float32Array(d),p=new Uint32Array(d),m=new Uint16Array(d),h=n*n,g=new i(1/t.x,1/t.y,1/t.z),_=[0],v,y=1/0,b=new o(new i(0,0,0),new i(0,0,0)),x=new i(0,0,0);for(;(v=_.pop())!==void 0;){let o=v*36/4;b.min.x=f[o],b.min.y=f[o+1],b.min.z=f[o+2],b.max.x=f[o+3],b.max.y=f[o+4],b.max.z=f[o+5];let d=r(e,g,b,n);if(d===null||s&&d>y)continue;let S=p[o+6],C=p[o+7];for(let n=S;n<C;n++){let r=u[n];this.getPositionByIndex(r,x);let o=x.x,d=x.y,f=x.z,p=e.x,m=e.y,g=e.z,_=t.x,v=t.y,b=t.z,S=_*(o-p)+v*(d-m)+b*(f-g);if(S>0?(p+=_*S,m+=v*S,g+=b*S):S<0&&(S=0),_=o-p,v=d-m,b=f-g,_*_+v*v+b*b<=h){let e=new a(x,x,x,r,new i(p,m,g));(!c||c(e))&&(s?S<y&&(y=S,l.length>0&&(l.length=0),l.push(e)):l.push(e))}}let w=v*36/2,T=m[w+16],E=m[w+17];T&&_.push(T),E&&_.push(E)}return l}};function y(e){onmessage=t=>{Promise.resolve(t.data).then(t=>e(t)).then(({output:e,transfer:t})=>postMessage(e,t)).catch(e=>postMessage({$$error:e}))}}y(e=>Promise.resolve(e).then(e=>{let t=[],n=new Set;for(let r of e){let e;if(r.type===`mesh`)e=new f(r.attributes.position,r.indices);else if(r.type===`points`)e=new v(r.attributes.position,r.indices);else throw Error(`Invalid Type`);e.createTree(r.maxItemPerNode,r.maxTreeDepth,r.extents);let i={type:r.type,attributes:r.attributes,indices:r.indices,offsetArray:e.offsetArray,rootNodePacked:e.rootNodePacked};t.push(i);let a;for(let e in i.attributes){let t=i.attributes[e],r=t==null?void 0:t.array;r&&r.buffer instanceof ArrayBuffer&&n.add(r.buffer)}a=i.indices;let o=a==null?void 0:a.array;o&&o.buffer instanceof ArrayBuffer&&n.add(o.buffer),a=i.offsetArray,a&&a.buffer instanceof ArrayBuffer&&n.add(a.buffer),n.add(i.rootNodePacked)}return{output:t,transfer:Array.from(n)}}))})();",blob$1=typeof self<`u`&&self.Blob&&new Blob([`(self.URL || self.webkitURL).revokeObjectURL(self.location.href);`,jsContent$1],{type:`text/javascript;charset=utf-8`});function WorkerWrapper$1(options){let objURL;try{if(objURL=blob$1&&(self.URL||self.webkitURL).createObjectURL(blob$1),!objURL)throw``;let worker=new Worker(objURL,{name:options==null?void 0:options.name});return worker.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(objURL)}),worker}catch(e){return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(jsContent$1),{name:options==null?void 0:options.name})}}var Face3=class Face3{constructor(a,b,c,normal,materialIndex){this.a=a,this.b=b,this.c=c,this.normal=normal&&normal instanceof three_webgpu.Vector3?normal:new three.Vector3,this.materialIndex=materialIndex===void 0?0:materialIndex}clone(){return new Face3(this.a,this.b,this.c).copy(this)}copy(source){return this.a=source.a,this.b=source.b,this.c=source.c,this.normal instanceof three_webgpu.Vector3&&source.normal instanceof three_webgpu.Vector3&&this.normal.copy(source.normal),this.materialIndex=source.materialIndex,this}},bvhWorkerPool=new require_glTF_helpers.a(()=>new WorkerWrapper$1,4),defaultHitFilter=()=>!0,scratchRay=new three_webgpu.Ray,scratchNormalMatrix=new three_webgpu.Matrix3,scratchInverseMatrix=new three_webgpu.Matrix4,scratchIntersectionFaceA=new three_webgpu.Vector3,scratchIntersectionFaceB=new three_webgpu.Vector3,scratchIntersectionFaceC=new three_webgpu.Vector3,scratchPointCloudNormal=new three_webgpu.Vector3,intersectsMap=new WeakMap;function raycastMesh(mesh,bvh,raycaster,intersects){var _a,_b;let matrixWorld=mesh.matrixWorld;scratchInverseMatrix.copy(matrixWorld).invert(),scratchRay.copy(raycaster.ray).applyMatrix4(scratchInverseMatrix);let filter=(_a=raycaster.hitFilter)==null?defaultHitFilter:_a,onlyFirst=(_b=raycaster.firstHitOnly)==null?!1:_b,geometry=mesh.geometry,material=mesh.material,groups=geometry.groups,indicesAttr=geometry.index,bvhIntersects=bvh.intersectRay(scratchRay.origin,scratchRay.direction,0,onlyFirst,bvhIntersect=>{var _a;let triangleIndex=bvhIntersect.index,indexOffset=triangleIndex*3,intersectMaterial;if(Array.isArray(material)){if(groups){for(let group of groups)if(indexOffset>=group.start&&indexOffset-group.start<group.count){intersectMaterial=material[(_a=group.materialIndex)==null?0:_a];break}}}else intersectMaterial=material;if(!intersectMaterial)return!1;let intersectionPoint=bvhIntersect.intersectionPoint,point=new three_webgpu.Vector3(intersectionPoint.x,intersectionPoint.y,intersectionPoint.z).applyMatrix4(matrixWorld),distance=raycaster.ray.origin.distanceTo(point);if(distance<raycaster.near||distance>raycaster.far)return!1;let pointA=bvhIntersect.pointA,pointB=bvhIntersect.pointB,pointC=bvhIntersect.pointC,normal=three_webgpu.Triangle.getNormal(scratchIntersectionFaceA.set(pointA.x,pointA.y,pointA.z).applyMatrix4(matrixWorld),scratchIntersectionFaceB.set(pointB.x,pointB.y,pointB.z).applyMatrix4(matrixWorld),scratchIntersectionFaceC.set(pointC.x,pointC.y,pointC.z).applyMatrix4(matrixWorld),new three_webgpu.Vector3),normalContant=raycaster.ray.direction.dot(normal);if(intersectMaterial.side===three_webgpu.FrontSide&&normalContant>=0||intersectMaterial.side===three_webgpu.BackSide&&normalContant<=0)return!1;let intersect={distance,object:mesh,face:new Face3(indicesAttr?indicesAttr.array[indexOffset]:indexOffset,indicesAttr?indicesAttr.array[indexOffset+1]:indexOffset+1,indicesAttr?indicesAttr.array[indexOffset+2]:indexOffset+2,normal),point,distanceToRay:0,faceIndex:triangleIndex};return intersectsMap.set(bvhIntersect,intersect),filter(intersect)}),bvhIntersectLength=bvhIntersects.length;for(let i=0;i<bvhIntersectLength;i++){let intersect=intersectsMap.get(bvhIntersects[i]);intersect&&intersects.push(intersect)}bvhIntersects.length=0}function getNormalAttrForPointRaycast(geometry,preferInstanceNormal){if(preferInstanceNormal){let inst=geometry.getAttribute(`instanceNormal`);if(inst instanceof three_webgpu.BufferAttribute||inst instanceof three_webgpu.InterleavedBufferAttribute)return inst}let n=geometry.getAttribute(`normal`);if(n instanceof three_webgpu.BufferAttribute||n instanceof three_webgpu.InterleavedBufferAttribute)return n}function isIndexableBufferAttribute(attr){return attr instanceof three_webgpu.BufferAttribute||attr instanceof three_webgpu.InterleavedBufferAttribute}function raycastBVHPoints(object,geometry,bvh,raycaster,intersects,preferInstanceNormal,useGeometryIndex=!0){var _a,_b,_c,_d;let matrixWorld=object.matrixWorld;scratchNormalMatrix.getNormalMatrix(matrixWorld),scratchInverseMatrix.copy(matrixWorld).invert(),scratchRay.copy(raycaster.ray).applyMatrix4(scratchInverseMatrix);let threshold=((_b=(_a=raycaster.params.Points)==null?void 0:_a.threshold)==null?1:_b)*scratchInverseMatrix.getMaxScaleOnAxis(),filter=(_c=raycaster.hitFilter)==null?defaultHitFilter:_c,onlyFirst=(_d=raycaster.firstHitOnly)==null?!1:_d,indicesAttr=useGeometryIndex?geometry.index:null,normalAttr=getNormalAttrForPointRaycast(geometry,preferInstanceNormal),hasNormalAttr=isIndexableBufferAttribute(normalAttr),externalNormals=null;if(!hasNormalAttr&&object instanceof require_memoryUsage.m){let src=object.normals;require_memoryUsage._(src,object.numPoints)&&(externalNormals=src)}let bvhIntersects=bvh.intersectRay(scratchRay.origin,scratchRay.direction,threshold,onlyFirst,bvhIntersect=>{let intersectionPoint=bvhIntersect.intersectionPoint,point=new three_webgpu.Vector3(intersectionPoint.x,intersectionPoint.y,intersectionPoint.z).applyMatrix4(matrixWorld),distance=raycaster.ray.origin.distanceTo(point);if(distance<raycaster.near||distance>raycaster.far)return!1;let pointA=bvhIntersect.pointA,faceA=scratchIntersectionFaceA.set(pointA.x,pointA.y,pointA.z).applyMatrix4(matrixWorld),distanceToRay=point.distanceTo(faceA);if(distanceToRay/distance>.07)return!1;let pointIndex=bvhIntersect.index,positionIndex=indicesAttr?indicesAttr.array[pointIndex]:pointIndex,face;if(hasNormalAttr&&normalAttr)face=new Face3(positionIndex,positionIndex,positionIndex,new three_webgpu.Vector3().fromBufferAttribute(normalAttr,positionIndex).applyNormalMatrix(scratchNormalMatrix));else if(externalNormals)require_memoryUsage.h(externalNormals,positionIndex,scratchPointCloudNormal),scratchPointCloudNormal.lengthSq()>1e-12&&(scratchPointCloudNormal.applyNormalMatrix(scratchNormalMatrix),face=new Face3(positionIndex,positionIndex,positionIndex,scratchPointCloudNormal.clone()));else{let scaleAttr=geometry.getAttribute(`scale`),rotationAttr=geometry.getAttribute(`rotation`);if(scaleAttr instanceof three_webgpu.BufferAttribute&&rotationAttr instanceof three_webgpu.BufferAttribute){let scaleValue=new three_webgpu.Vector3().fromBufferAttribute(scaleAttr,positionIndex).toArray(),rotationValue=new three_webgpu.Vector4().fromBufferAttribute(rotationAttr,positionIndex).toArray(),rotationQuaternion=new three_webgpu.Quaternion(rotationValue[1],rotationValue[2],rotationValue[3],rotationValue[0]),[{axis}]=[{axis:`x`,scale:scaleValue[0]},{axis:`y`,scale:scaleValue[1]},{axis:`z`,scale:scaleValue[2]}].sort((a,b)=>a.scale-b.scale),normal=new three_webgpu.Vector3(0,0,0);normal[axis]=1,normal.applyQuaternion(rotationQuaternion).applyNormalMatrix(scratchNormalMatrix),raycaster.ray.direction.dot(normal)>0&&normal.negate(),face=new Face3(positionIndex,positionIndex,positionIndex,normal)}}let intersect={distance,object,face,point,distanceToRay,index:pointIndex};return intersectsMap.set(bvhIntersect,intersect),filter(intersect)}),bvhIntersectLength=bvhIntersects.length;for(let i=0;i<bvhIntersectLength;i++){let intersect=intersectsMap.get(bvhIntersects[i]);intersect&&intersects.push(intersect)}bvhIntersects.length=0}function raycastPoints(points,bvh,raycaster,intersects){raycastBVHPoints(points,points.geometry,bvh,raycaster,intersects,!1,!0)}var BVH_MESH_PROP=`__bvh_mesh__`,originMeshRaycast=three_webgpu.Mesh.prototype.raycast;function overrideMeshRaycast(raycaster,intersects){let bvh=getBvhTreeForMesh(this);bvh?raycastMesh(this,bvh,raycaster,intersects):originMeshRaycast.call(this,raycaster,intersects)}function getBvhTreeForMesh(mesh){let bvhMesh=mesh[BVH_MESH_PROP];return bvhMesh instanceof BVHMesh,bvhMesh}function bindBvhTreeForMesh(mesh,bvh){Object.assign(mesh,{[BVH_MESH_PROP]:bvh,raycast:overrideMeshRaycast})}var BVH_POINTS_PROP=`__bvh_points__`,BVH_POINT_CLOUD_PROP=`__bvh_point_cloud__`,originPointsRaycast=three_webgpu.Points.prototype.raycast;function overridePointsRaycast(raycaster,intersects){let bvh=getBvhTreeForPoints(this);bvh?raycastPoints(this,bvh,raycaster,intersects):originPointsRaycast.call(this,raycaster,intersects)}function overridePointCloudRaycast(raycaster,intersects){let bvh=getBvhTreeForPointCloud(this);bvh?raycastBVHPointCloud(this,bvh,raycaster,intersects):require_memoryUsage.m.prototype.raycast.call(this,raycaster,intersects)}var pointCloudRaycastGeometry=new three_webgpu.BufferGeometry;function raycastBVHPointCloud(object,bvh,raycaster,intersects){raycastBVHPoints(object,pointCloudRaycastGeometry,bvh,raycaster,intersects,!1,!1)}function getBvhTreeForPoints(mesh){let bvhPoints=mesh[BVH_POINTS_PROP];return bvhPoints instanceof BVHPoints,bvhPoints}function getBvhTreeForPointCloud(object){let bvh=object[BVH_POINT_CLOUD_PROP];return bvh instanceof BVHPoints?bvh:null}function bindBvhTreeForPointCloud(object,bvh){Object.assign(object,{[BVH_POINT_CLOUD_PROP]:bvh,raycast:overridePointCloudRaycast})}function bindBvhTreeForPoints(points,bvh){Object.assign(points,{[BVH_POINTS_PROP]:bvh,raycast:overridePointsRaycast})}function getPointsPositionAttr(geometry){let positionAttr=geometry.attributes.position;return positionAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:positionAttr.data.array,stride:positionAttr.data.stride,offset:positionAttr.offset}:positionAttr instanceof three_webgpu.BufferAttribute?{array:positionAttr.array}:null}function collectBvhBuildEntries(root){let entries=[];return root.traverse(child=>{if(child instanceof require_memoryUsage.m){entries.push({kind:`pointCloud`,obj:child});return}if((child instanceof three_webgpu.Mesh||child instanceof three_webgpu.Points)&&child.geometry instanceof three_webgpu.BufferGeometry){if(child instanceof three_webgpu.Points){entries.push({kind:`points`,obj:child});return}entries.push({kind:`mesh`,obj:child})}}),entries}function generateBvhTree(obj,useWorker=!0,maxItemPerNode=100,maxTreeDepth=10){let entries=collectBvhBuildEntries(obj);if(useWorker){let entryForInputSlot=[];return Promise.resolve().then(()=>{let input=[];entryForInputSlot=[];let transfer=new Set,transferValue=null;for(let i=0;i<entries.length;i++){let entry=entries[i];if(entry.kind===`pointCloud`){let pc=entry.obj,positions=pc.positions;if(!(positions.buffer instanceof ArrayBuffer))continue;let inputItem={type:`points`,attributes:{position:{array:positions,stride:3}},maxItemPerNode,maxTreeDepth,extents:pc.getLocalBoundingBoxExtents()};input.push(inputItem),entryForInputSlot.push(entry),transfer.add(positions.buffer);continue}let geometry=entry.obj.geometry;if(!(geometry instanceof three_webgpu.BufferGeometry))continue;let type;if(entry.kind===`mesh`?type=`mesh`:entry.kind===`points`&&(type=`points`),!type)continue;let bbox=geometry.boundingBox,extents=bbox?[bbox.min.x,bbox.min.y,bbox.min.z,bbox.max.x,bbox.max.y,bbox.max.z]:void 0,attributes={};if(entry.kind===`points`){let position=getPointsPositionAttr(geometry);if(!position)continue;attributes.position={array:position.array,stride:position.stride,offset:position.offset},transferValue=position.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)}else for(let name in geometry.attributes){let attr=geometry.attributes[name];attr instanceof three_webgpu.InterleavedBufferAttribute?(attributes[name]={array:attr.data.array,stride:attr.data.stride,offset:attr.offset},transferValue=attr.data.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)):(attributes[name]={array:attr.array},transferValue=attr.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer))}let indices,indexAttr=geometry.getIndex();indexAttr&&(indexAttr instanceof three_webgpu.InterleavedBufferAttribute?(indices={array:indexAttr.data.array,stride:indexAttr.data.stride,offset:indexAttr.offset},transferValue=indexAttr.data.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)):(indices={array:indexAttr.array},transferValue=indexAttr.array,transferValue&&transferValue.buffer instanceof ArrayBuffer&&transfer.add(transferValue.buffer)));let inputItem={type,attributes,indices,maxItemPerNode,maxTreeDepth,extents};input.push(inputItem),entryForInputSlot.push(entry)}return bvhWorkerPool.postMessage(input,Array.from(transfer))}).then(output=>{var _a;for(let j=0;j<output.length;j++){let entry=entryForInputSlot[j],result=output[j];if(!entry||!result)continue;if(entry.kind===`pointCloud`){let pc=entry.obj,positionArray=(_a=result.attributes.position)==null?void 0:_a.array;positionArray instanceof Float32Array&&pc.swapPositionsBuffer(positionArray);let bvh=new BVHPoints(result.attributes.position,result.indices);bvh.offsetArray=result.offsetArray,bvh.rootNodePacked=result.rootNodePacked,bindBvhTreeForPointCloud(pc,bvh);continue}let meshOrPoints=entry.obj,geometry=meshOrPoints.geometry;if(!(geometry instanceof three_webgpu.BufferGeometry))continue;for(let name in result.attributes){let array=result.attributes[name].array,attr=geometry.attributes[name];attr&&(attr instanceof three_webgpu.InterleavedBufferAttribute?attr.data.array=array:attr.array=array)}let indices=geometry.getIndex();if(indices&&result.indices){let array=result.indices.array;indices instanceof three_webgpu.InterleavedBufferAttribute?indices.data.array=array:indices.array=array}if(entry.kind===`mesh`){let bvh=new BVHMesh(result.attributes.position,result.indices);bvh.offsetArray=result.offsetArray,bvh.rootNodePacked=result.rootNodePacked,bindBvhTreeForMesh(meshOrPoints,bvh)}else if(entry.kind===`points`){let bvh=new BVHPoints(result.attributes.position,result.indices);bvh.offsetArray=result.offsetArray,bvh.rootNodePacked=result.rootNodePacked,bindBvhTreeForPoints(meshOrPoints,bvh)}}return obj})}else return Promise.resolve().then(()=>{for(let entry of entries)if(entry.kind===`mesh`){let meshObj=entry.obj,geometry=meshObj.geometry,bbox=geometry.boundingBox,extents=bbox?[bbox.min.x,bbox.min.y,bbox.min.z,bbox.max.x,bbox.max.y,bbox.max.z]:void 0;if(geometry instanceof three_webgpu.BufferGeometry){let position,indices,positionAttr=geometry.attributes.position;position=positionAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:positionAttr.data.array,stride:positionAttr.data.stride,offset:positionAttr.offset}:{array:positionAttr.array};let indicesAttr=geometry.getIndex();indicesAttr&&(indices=indicesAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:indicesAttr.data.array,stride:indicesAttr.data.stride,offset:indicesAttr.offset}:{array:indicesAttr.array});let bvh=new BVHMesh(position,indices);bvh.createTree(maxItemPerNode,maxTreeDepth,extents),bindBvhTreeForMesh(meshObj,bvh)}}else if(entry.kind===`points`){let pointsObj=entry.obj,geometry=pointsObj.geometry,bbox=geometry.boundingBox,extents=bbox?[bbox.min.x,bbox.min.y,bbox.min.z,bbox.max.x,bbox.max.y,bbox.max.z]:void 0;if(geometry instanceof three_webgpu.BufferGeometry){let position=getPointsPositionAttr(geometry),indices;if(!position)continue;let indicesAttr=geometry.getIndex();indicesAttr&&(indices=indicesAttr instanceof three_webgpu.InterleavedBufferAttribute?{array:indicesAttr.data.array,stride:indicesAttr.data.stride,offset:indicesAttr.offset}:{array:indicesAttr.array});let bvh=new BVHPoints(position,indices);bvh.createTree(maxItemPerNode,maxTreeDepth,extents),bindBvhTreeForPoints(pointsObj,bvh)}}else if(entry.kind===`pointCloud`){let pc=entry.obj,bvh=new BVHPoints({array:pc.positions,stride:3});bvh.createTree(maxItemPerNode,maxTreeDepth,pc.getLocalBoundingBoxExtents()),bindBvhTreeForPointCloud(pc,bvh)}return obj})}function mixNumber(from,to,progress){return from+(to-from)*progress}function value(x0,v0,t1,t){let a=(v0*t1+2*x0)/Math.pow(t1,3),b=-(2*v0*t1+3*x0)/Math.pow(t1,2),c=v0,d=x0;return a*Math.pow(t,3)+b*Math.pow(t,2)+c*t+d}function velocity(x0,v0,t1,t){let a=(v0*t1+2*x0)/Math.pow(t1,3),b=-(2*v0*t1+3*x0)/Math.pow(t1,2),c=v0;return 3*a*Math.pow(t,2)+2*b*t+c}function mixCircle(from,to,progress,circle){let circleLength=circle[1]-circle[0];return from=circleValue(from,circle),to=circleValue(to,circle),to-from>circleLength/2?mixNumber(from+circleLength,to,progress):from-to>circleLength/2?mixNumber(from-circleLength,to,progress):mixNumber(from,to,progress)}function circleValue(value,circle){let rangeLength=circle[1]-circle[0];return value<circle[0]?circleValue(value+rangeLength,circle):value>=circle[1]?circleValue(value-rangeLength,circle):value}function mixValue(from,to,progress,circle){return circle?mixCircle(from,to,progress,circle):mixNumber(from,to,progress)}function toNumber(num){let value=Number(num);return isNaN(value)||!isFinite(value)?0:value}var Motion=class{constructor(initalValue){this.config={},this.progress=1,this.ended=!0,this.value={},this.startTime=require_memoryUsage.p(),this.startVelocity=0,this.duration=0,this.keyframes=[];for(let name in initalValue){let content=initalValue[name];typeof content==`object`?(this.value[name]=toNumber(content.value),this.config[name]={circle:content.circle}):(this.value[name]=toNumber(content),this.config[name]={circle:!1})}this.keyframes=[{progress:0,value:Object.assign({},this.value)},{progress:1,value:Object.assign({},this.value)}]}getProgress(time){let deltaTime=time-this.startTime;return deltaTime<0?0:deltaTime>=this.duration?1:1-value(1,this.startVelocity,this.duration,deltaTime)}getValue(progress){for(let i=1;i<this.keyframes.length;i++)if(this.keyframes[i].progress>progress){let prev=this.keyframes[i-1],next=this.keyframes[i],value={};for(let name in this.config){let segmentProgress=(progress-prev.progress)/(next.progress-prev.progress);value[name]=mixValue(prev.value[name],next.value[name],segmentProgress,this.config[name].circle)}return value}return Object.assign({},this.keyframes[this.keyframes.length-1].value)}getProgressVelocity(time){let deltaTime=time-this.startTime;return deltaTime>=this.duration?0:velocity(1,this.startVelocity,this.duration,deltaTime)}update(time){return this.ended?!0:(this.progress=Math.min(1,Math.max(0,this.progress,this.getProgress(time))),this.value=this.getValue(this.progress),this.ended=this.progress>=1,this.ended&&this.callbacks&&(this.callbacks[0](),this.callbacks=void 0),this.ended)}getKeyFrameSegment(time){let progress=this.getProgress(time);for(let i=1;i<this.keyframes.length;i++)if(this.keyframes[i].progress>progress)return[this.keyframes[i-1],this.keyframes[i]];return[this.keyframes[this.keyframes.length-2],this.keyframes[this.keyframes.length-1]]}getTargetKeyframe(){return this.keyframes[this.keyframes.length-1]}set(value,duration,startProgressVelocity=0,time){var _a;isNaN(duration)&&(duration=0),isNaN(startProgressVelocity)&&(startProgressVelocity=0),time=time==null?require_memoryUsage.p():time;let currentProgress=this.getProgress(time),currentValue=this.getValue(currentProgress),targetValue={};for(let name in this.config)targetValue[name]=(_a=value[name])==null?currentValue[name]:_a;let keyframes=[{progress:0,value:currentValue},{progress:1,value:targetValue}];return this.setKeyframes(keyframes,duration,startProgressVelocity,time)}setKeyframes(keyframes,duration,startProgressVelocity=0,time){if(keyframes.length<2)throw Error(`keyframes invalid.`);return isNaN(duration)&&(duration=0),isNaN(startProgressVelocity)&&(startProgressVelocity=0),this.callbacks&&(this.callbacks[1](Error(`motion aborted.`)),this.callbacks=void 0),new Promise((resolve,reject)=>{time=time==null?require_memoryUsage.p():time,this.progress=0,this.ended=!1,this.startTime=time,this.startVelocity=startProgressVelocity,this.keyframes=keyframes,this.duration=duration,duration===0?(this.progress=1,this.value=Object.assign({},keyframes[keyframes.length-1].value)):this.value=Object.assign({},keyframes[0].value),this.callbacks=[resolve,reject]})}dispose(){this.callbacks&&(this.callbacks[1](Error(`motion dispose.`)),this.callbacks=void 0)}},PI$6=Math.PI;2*PI$6/3,2*PI$6/4.5;var linear=function(x){return x},easeInCubic=function(x){return x*x*x},easeInQuart=function(x){return x*x*x*x},APPEAR_ANIMATION_DURATION=500,versionMap$1=new WeakMap,scratchIntersectPoint=new three_webgpu.Vector3,scratchClippingBoxMatrixInverse=new three_webgpu.Matrix4,TileNode=class TileNode extends three_webgpu.Object3D{constructor(name,contentObject,animations,disposer=require_memoryUsage.d){super(),this.clippers=[],this.name=name,this.materials=[],this.pbmObjects=[],this.contentObject=contentObject,this.animations=animations,this.appearMotion=new Motion({appear:0}),this.disposers=[disposer],this.add(contentObject),contentObject.traverse(object=>{if(object instanceof three_webgpu.Mesh||object instanceof three_webgpu.Points){let material=object.material;if(Array.isArray(material))for(let i=0;i<material.length;i++)this.materials.push(material[i]);else this.materials.push(material)}(object instanceof require_pbmMeshMaterial.o||object instanceof require_pbmMeshMaterial.s)&&this.pbmObjects.push(object),object instanceof require_memoryUsage.m&&this.pbmObjects.push(object),object instanceof require_pbmGaussianSplattingObject.t&&this.pbmObjects.push(object)})}generateBvhTree(){return generateBvhTree(this,!0,200,20)}intersectRaycaster(raycaster,target){let intersects=target==null?[]:target,hitFilter=raycaster.hitFilter;raycaster.hitFilter=intersect=>{if(intersect.object instanceof require_memoryUsage.m&&intersect.object.pointBack===`HIDDEN`&&intersect.face&&intersect.face.normal.angleTo(raycaster.ray.direction)<Math.PI/2)return!1;let floorIndex=0,shownFloorIndex=-1;if((intersect.object instanceof require_pbmMeshMaterial.o||intersect.object instanceof require_pbmMeshMaterial.s)&&intersect.face){let material=Array.isArray(intersect.object.material)?intersect.object.material[intersect.face.materialIndex]:intersect.object.material;if(material){floorIndex=material.floorIndex,shownFloorIndex=material.shownFloorIndex;for(let clipper of this.clippers)if(!(typeof clipper.floorIndex==`number`&&clipper.floorIndex!==floorIndex)&&(scratchClippingBoxMatrixInverse.copy(clipper.clippingBoxMatrix).invert(),scratchIntersectPoint.copy(intersect.point).applyMatrix4(scratchClippingBoxMatrixInverse),Math.abs(scratchIntersectPoint.x)<.5&&Math.abs(scratchIntersectPoint.y)<.5&&Math.abs(scratchIntersectPoint.z)<.5))return!1}}if(intersect.object instanceof require_memoryUsage.m){floorIndex=intersect.object.floorIndex,shownFloorIndex=intersect.object.shownFloorIndex;for(let clipper of this.clippers)if(!(typeof clipper.floorIndex==`number`&&clipper.floorIndex!==floorIndex)&&(scratchClippingBoxMatrixInverse.copy(clipper.clippingBoxMatrix).invert(),scratchIntersectPoint.copy(intersect.point).applyMatrix4(scratchClippingBoxMatrixInverse),Math.abs(scratchIntersectPoint.x)<.5&&Math.abs(scratchIntersectPoint.y)<.5&&Math.abs(scratchIntersectPoint.z)<.5))return!1}let selectedFloorIndex=shownFloorIndex;return raycaster.floorIndex===void 0?raycaster.floor!==void 0&&(selectedFloorIndex=raycaster.floor===null?-1:raycaster.floor):selectedFloorIndex=raycaster.floorIndex,selectedFloorIndex>=0&&floorIndex!==selectedFloorIndex?!1:(Object.assign(intersect,{floorIndex,floor:floorIndex}),hitFilter?hitFilter.call(raycaster,intersect):!0)};let stack=this.children.slice(),object;for(;object=stack.pop();)if(object.visible){object.raycast(raycaster,intersects);for(let i=0,l=object.children.length;i<l;i++)stack.push(object.children[i])}return raycaster.hitFilter=hitFilter,sortIntersects(intersects,raycaster.sortByDistance,raycaster.firstHitOnly),intersects}update(renderer,camera,modelScene,tile3d,tile,parameterValue){let needsRender=!1;tile3d.visible&&tile.state.selectedFrameNumber===tile.tileset.frameNumber?this.appearMotion.getTargetKeyframe().value.appear!==1&&this.appearMotion.set({appear:1},APPEAR_ANIMATION_DURATION).catch(require_memoryUsage.d):this.appearMotion.getTargetKeyframe().value.appear!==0&&this.appearMotion.set({appear:0},0).catch(require_memoryUsage.d),this.appearMotion.ended!==!0&&this.appearMotion.update(camera.time),this.clippers=parameterValue.clippers;for(let pbmObject of this.pbmObjects)pbmObject instanceof require_pbmMeshMaterial.o||pbmObject instanceof require_pbmMeshMaterial.s?updatePBMMesh(pbmObject,this.appearMotion,renderer,camera,modelScene,tile,parameterValue)===!0&&(needsRender=!0):pbmObject instanceof require_memoryUsage.m?updatePBMPointCloud(pbmObject,this.appearMotion,renderer,camera,modelScene,tile,parameterValue)===!0&&(needsRender=!0):pbmObject instanceof require_pbmGaussianSplattingObject.t&&updatePBMGaussianSplattingObject(pbmObject,this.appearMotion,renderer,camera,modelScene,tile,parameterValue)===!0&&(needsRender=!0);return needsRender}dispose(){for(let disposer of this.disposers)disposer();this.disposers.length=0,this.pbmObjects.length=0}clone(){return new TileNode(this.name,this.contentObject.clone(),this.animations)}};function updatePBMMesh(mesh,appearMotion,renderer,camera,modelScene,tile,parameterValue){let needsRender=!1;versionMap$1.get(mesh)!==parameterValue.versionNumber&&(versionMap$1.set(mesh,parameterValue.versionNumber),needsRender=!0,mesh.castShadow=parameterValue.castShadow,mesh.receiveShadow=parameterValue.receiveShadow);let materials=mesh.material;for(let material of materials)require_memoryUsage.D(material)&&require_memoryUsage.C(material,parameterValue);return needsRender}function updatePBMPointCloud(pointCloud,appearMotion,_renderer,_camera,_modelScene,tile,parameterValue){var _a,_b;let needsRender=!1;if(parameterValue.pointAppearAnimation===!0&&tile.refine===`ADD`&&tile.tileset.rootMeta.pntsOrder===`RANDOM`){let maxScreenSpaceError=tile.tileset.currentMaxScreenSpaceError,screenSpaceError=tile.state.screenSpaceError,parentScreenSpaceError=(_b=(_a=tile.parent)==null?void 0:_a.state.screenSpaceError)==null?screenSpaceError:_b,progress=1;parentScreenSpaceError!==screenSpaceError&&(progress=(parentScreenSpaceError-maxScreenSpaceError)/(parentScreenSpaceError-screenSpaceError)),progress=require_memoryUsage.M(progress,0,1),progress=easeInCubic(progress);let drawCount=Math.floor(pointCloud.pointCount*progress*appearMotion.value.appear);pointCloud.visiblePointCount!==drawCount&&(pointCloud.visiblePointCount=drawCount,needsRender=!0)}return versionMap$1.get(pointCloud)!==parameterValue.versionNumber&&(versionMap$1.set(pointCloud,parameterValue.versionNumber),needsRender=!0,pointCloud.castShadow=parameterValue.castShadow,pointCloud.receiveShadow=parameterValue.receiveShadow,pointCloud.visible=parameterValue.modelAlpha>0,pointCloud.pointScale=parameterValue.pointScale,pointCloud.pointMinPixel=parameterValue.pointMinPixel,pointCloud.pointMaxPixel=parameterValue.pointMaxPixel,pointCloud.pointSize=parameterValue.pointSize,pointCloud.pointShape=parameterValue.pointShape,pointCloud.pointBack=parameterValue.pointBack,pointCloud.maxDisplayBoost=parameterValue.maxDisplayBoost,pointCloud.opacity=parameterValue.opacity,pointCloud.modelAlpha=parameterValue.modelAlpha,pointCloud.brightness=parameterValue.brightness,pointCloud.floorStyle=parameterValue.floorStyle,pointCloud.shownFloorIndex=parameterValue.shownFloorIndex,pointCloud.colorStyle=parameterValue.colorStyle,pointCloud.constantColor.copy(parameterValue.constantColor),pointCloud.colorSaturation=parameterValue.colorSaturation,pointCloud.colorBrightness=parameterValue.colorBrightness,pointCloud.outlineGain=parameterValue.outlineGain,pointCloud.distanceGain=parameterValue.distanceGain,pointCloud.useAddBlend=parameterValue.useAddBlend,pointCloud.gradientTexture=parameterValue.gradientTexture,pointCloud.clippers=parameterValue.clippers,pointCloud.modelBoundingMin.copy(parameterValue.boundingBox.min),pointCloud.modelBoundingMax.copy(parameterValue.boundingBox.max),pointCloud.styleRevision++,require_memoryUsage.C(pointCloud.material,parameterValue)),needsRender}function normalizeSHDegree(value){return Number.isFinite(value)?Math.min(Math.max(Math.floor(value),0),2):0}function updatePBMGaussianSplattingObject(splat,appearMotion,renderer,camera,modelScene,tile,parameterValue){let needsRender=!1;splat.updateMatrix(),splat.updateMatrixWorld();let shDegree=normalizeSHDegree(parameterValue.gaussianSplattingSHDegree);return splat.usedSHDegree!==shDegree&&(splat.usedSHDegree=shDegree,needsRender=!0),splat.initAnimationEnabled!==parameterValue.enableGaussianSplattingInitAnimation&&(splat.initAnimationEnabled=parameterValue.enableGaussianSplattingInitAnimation,needsRender=!0),splat.lastMatrixWorld?splat.transformChanged=!splat.lastMatrixWorld.equals(splat.matrixWorld):(splat.lastMatrixWorld=new three_webgpu.Matrix4,splat.transformChanged=!0,needsRender=!0),splat.lastMatrixWorld.copy(splat.matrixWorld),splat.transformChanged&&(needsRender=!0),needsRender}var Trajectory=class{constructor(id,header,tileset){this.id=id,this.name=header.name,this.visible=!1,this.tileset=tileset,this.transform=new three_webgpu.Matrix4,header.transform&&this.transform.fromArray(header.transform),this.transform.premultiply(this.tileset.root.transform),this.content={uri:header.file,byteLength:0,memoryUsage:0,loadState:`UNLOADED`,loadProgress:0,loadStateUpdateTime:require_memoryUsage.p(),loadfailRetryDelay:0,data:void 0}}},TrajectoryNode=class TrajectoryNode extends three_webgpu.Object3D{constructor(name,contentObject,disposer=require_memoryUsage.d){super(),this.name=name,this.contentObject=contentObject,this.name=name,this.add(contentObject),this.disposers=[disposer]}update(renderer,camera,modelScene,tile3d,trajectory,parameterValue){let material=this.contentObject.material[2];return material.uniforms.dashOffset.value=(material.uniforms.dashOffset.value-.003)%(material.uniforms.dashSize.value.x+material.uniforms.dashSize.value.y),!0}dispose(){for(let disposer of this.disposers)disposer();this.disposers.length=0}clone(){return new TrajectoryNode(this.name,this.contentObject.clone())}},priorityCache=new Map;function getPriority(frameState,tile,cache){if(cache&&cache.has(tile))return cache.get(tile);let maySkipTile=tile.refine===`ADD`||frameState.skipLevelOfDetail,parent=tile.parent,screenSpaceError=parent&&(!maySkipTile||tile.state.screenSpaceError===0)?parent.state.screenSpaceError:tile.state.screenSpaceError,rootScreenSpaceError=tile.tileset.root?tile.tileset.root.state.screenSpaceError:0,priority=Math.max(rootScreenSpaceError-screenSpaceError,0);return cache&&cache.set(tile,priority),priority}var TileRequestScheduler=class{constructor(tileset,options){this.tileset=tileset,this.options=options,this.activeRequests=0,this.requestQueue=[]}reset(){for(let item of this.requestQueue)this.options.onTileSkip&&(item.tile.content&&this.tileset.options.tileUnloader(item.tile),this.options.onTileSkip(item.tile));this.requestQueue.length=0}update(requestTiles,order,frameState){let currentTime=frameState.time,requestQueue=this.requestQueue,set=new Set(requestTiles);for(let i=0;i<requestQueue.length;i++){let requestItem=requestQueue[i];if(set.has(requestItem.tile)){set.delete(requestItem.tile);continue}requestItem.status===`WAITING`&&(requestQueue.splice(i,1),i--,this.options.onTileSkip&&this.options.onTileSkip(requestItem.tile))}set.size>0&&(set.forEach(tile=>{requestQueue.push({tile,status:`WAITING`,time:currentTime,error:null})}),set.clear());let freeSlots=frameState.maxRequests;for(let i=0;i<requestQueue.length&&freeSlots>0;i++){let requestItem=requestQueue[i];if(requestItem.status===`DONE`)requestItem.error===null?(freeSlots--,requestItem.tile.content&&(requestItem.tile.content.loadState=`READY`),this.options.onTileLoad&&this.options.onTileLoad(requestItem.tile)):this.options.onTileError&&this.options.onTileError(requestItem.tile,requestItem.error),requestQueue.splice(i,1),i--;else if(requestItem.status===`PENDING`&¤tTime-requestItem.time<1e3)break}switch(priorityCache.clear(),order){case`SCREEN_SPACE_ERROR`:requestQueue.sort((a,b)=>a.tile.state.requestedFrameNumber===b.tile.state.requestedFrameNumber?a.tile.state.requestedFrameNumber===frameState.frameNumber?getPriority(frameState,a.tile,priorityCache)-getPriority(frameState,b.tile,priorityCache):a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:b.tile.state.requestedFrameNumber-a.tile.state.requestedFrameNumber);break;case`SCREEN_VERTICAL`:requestQueue.sort((a,b)=>a.tile.state.requestedFrameNumber===b.tile.state.requestedFrameNumber?a.tile.state.requestedFrameNumber===frameState.frameNumber?a.tile.state.centerScreenY===b.tile.state.centerScreenY?a.tile.state.centerZDepth===b.tile.state.centerZDepth?a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:a.tile.state.centerZDepth-b.tile.state.centerZDepth:a.tile.state.centerScreenY-b.tile.state.centerScreenY:a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:b.tile.state.requestedFrameNumber-a.tile.state.requestedFrameNumber);break;case`SCREEN_LEVEL_VERTICAL`:requestQueue.sort((a,b)=>a.tile.state.requestedFrameNumber===b.tile.state.requestedFrameNumber?a.tile.state.requestedFrameNumber===frameState.frameNumber?a.tile.level===b.tile.level?a.tile.state.centerScreenY===b.tile.state.centerScreenY?a.tile.state.centerZDepth===b.tile.state.centerZDepth?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.state.centerZDepth-b.tile.state.centerZDepth:a.tile.state.centerScreenY-b.tile.state.centerScreenY:a.tile.level-b.tile.level:a.tile.level===b.tile.level?a.tile.state.distanceToCamera-b.tile.state.distanceToCamera:a.tile.level-b.tile.level:b.tile.state.requestedFrameNumber-a.tile.state.requestedFrameNumber);break;default:break}if(freeSlots=Math.max(frameState.maxRequests-this.activeRequests,0),!frameState.skipLevelOfDetail){let insertIndex=0,length=requestQueue.length;for(let i=0;i<length;i++){let tile=requestQueue[i].tile;if(tile.hasTilesetContent||tile.contentParent===null||tile.contentParent.state.selectedFrameNumber===frameState.frameNumber){let removed=requestQueue.splice(i,1);requestQueue.splice(insertIndex++,0,...removed)}}}for(let i=0;i<requestQueue.length&&freeSlots>0;i++){let requestItem=requestQueue[i];requestItem.status===`WAITING`&&(freeSlots--,requestItem.status=`PENDING`,requestItem.time=currentTime,this.activeRequests++,this.tileset.options.tileLoader(requestItem.tile).catch(error=>{requestItem.error=error}).then(()=>{requestItem.status=`DONE`,requestItem.tile.content&&requestItem.tile.content.loadState===`READY`&&(requestItem.tile.content.loadState=`LOADING`),this.activeRequests--}))}}},CacheNode=class{constructor(item,previous,next){this.item=item,this.previous=previous,this.next=next}},CacheNodeList=class{constructor(){this.head=null,this.tail=null,this._length=0}get length(){return this._length}add(item){let node=new CacheNode(item,this.tail,null);return this.tail?(this.tail.next=node,this.tail=node):(this.head=node,this.tail=node),this._length++,node}remove(node){node.previous&&node.next?(node.previous.next=node.next,node.next.previous=node.previous):node.previous?(node.previous.next=null,this.tail=node.previous):node.next?(node.next.previous=null,this.head=node.next):(this.head=null,this.tail=null),node.next=null,node.previous=null,this._length--}splice(node,nextNode){node!==nextNode&&(this.remove(nextNode),this.insert(node,nextNode))}insert(node,nextNode){let oldNodeNext=node.next;node.next=nextNode,this.tail===node?this.tail=nextNode:oldNodeNext.previous=nextNode,nextNode.next=oldNodeNext,nextNode.previous=node,this._length++}toArray(){let array=[],current=this.head;for(;current;)array.push(current),current=current.next;return array}},TileCache=class{constructor(options={}){this.options=options,this.cacheNodeMap=new WeakMap,this.list=new CacheNodeList,this.sentinel=this.list.add(`sentinel`)}reset(){this.list.tail&&this.list.splice(this.list.tail,this.sentinel)}touchTile(tile){let node=this.cacheNodeMap.get(tile);node&&this.list.splice(this.sentinel,node)}loadTile(tile){if(!this.cacheNodeMap.has(tile)){let cacheNode=this.list.add(tile);this.cacheNodeMap.set(tile,cacheNode),this.options.onTileLoad&&this.options.onTileLoad(tile)}}unloadTile(tile){let node=this.cacheNodeMap.get(tile);node&&(this.list.remove(node),this.cacheNodeMap.delete(tile),this.options.onTileUnload&&this.options.onTileUnload(tile))}unloadTiles(isOverMemory){let node=this.list.head;for(;node!==this.sentinel&&isOverMemory();){let tile=node.item;node=node.next,this.unloadTile(tile)}}toArray(){let array=[];for(let item of this.list.toArray())item.item!==`sentinel`&&array.push(item.item);return array}},ManagedArray=class{constructor(){this.map=new Map,this.array=[],this._length=0}get length(){return this._length}get(index){return this.array[index]}set(index,element){index>=this.length&&(this._length=index+1),this.map.has(this.array[index])&&this.map.delete(this.array[index]),this.array[index]=element,this.map.set(element,index)}delete(element){let index=this.map.get(element);index!==void 0&&index>=0&&(this.array.splice(index,1),this.map.delete(element),this._length--)}push(element){if(!this.map.has(element)){let index=this._length++;this.array[index]=element,this.map.set(element,index)}}pop(){let element=this.array[--this._length];return this.map.delete(element),this.array[this._length]=void 0,element}reset(){this.array=[],this.map=new Map,this._length=0}find(target){return this.map.has(target)}peek(){return this.array[this._length-1]}},TilesetBaseTraverser=class{constructor(tileset){this.tileset=tileset,this._canSelectTile=!0,this._loadAllTilesTraversalStack=new ManagedArray}traverse(root,frameState,cacheFrameStates=[]){this.reset()}reset(){this._loadAllTilesTraversalStack.reset(),this.tileset.hasMixedContent=!1,this.tileset.needsRefinedTiles.clear(),this.tileset.requestedTiles.length=0,this.tileset.selectedTiles.length=0}updateTile(tile,frameState){this.updateTileVisibility(tile,frameState),tile.state.shouldSelect=!1,tile.state.finalResolution=!0}selectTile(tile,frameState){this._canSelectTile&&tile.contentAvailable&&tile.state.selectedFrameNumber<frameState.frameNumber&&(tile.state.selectedFrameNumber=frameState.frameNumber,this.tileset.selectedTiles.push(tile),this.tileset.needsRefinedTiles.add(tile))}loadTile(tile,frameState){this._canSelectTile&&(tile.state.requestedFrameNumber<frameState.frameNumber&&(tile.state.requestedFrameNumber=frameState.frameNumber,tile.content&&(tile.content.loadState===`FAILED`&&frameState.time-tile.content.loadStateUpdateTime>tile.content.loadfailRetryDelay&&(tile.content.loadState=`UNLOADED`,tile.content.loadProgress=0,tile.content.loadStateUpdateTime=frameState.time),tile.content.loadState===`UNLOADED`&&this.tileset.requestedTiles.push(tile))),this.tileset.needsRefinedTiles.add(tile))}touchTile(tile,frameState){this._canSelectTile&&(this.tileset.cache.touchTile(tile),tile.state.touchedFrameNumber=frameState.frameNumber)}canTraverse(tile,frameState){return!tile.state.inRequestVolume||tile.hasRenderContent&&(tile.levelOfContent>=frameState.maxLevelOfDetail||tile.levelOfContent>=0&&tile.geometricError<=frameState.minGeometricError)||tile.children.length===0?!1:tile.levelOfContent<frameState.minLevelOfDetail||tile.geometricError>=frameState.maxGeometricError||tile.hasTilesetContent?!0:tile.state.screenSpaceError>this.tileset.currentMaxScreenSpaceError}updateTileVisibility(tile,frameState){if(tile.updateState(frameState),!tile.state.visible||!tile.state.inRequestVolume)return;let hasChildren=tile.children.length>0;if(tile.hasTilesetContent&&hasChildren){let firstChild=tile.children[0];this.updateTileVisibility(firstChild,frameState),tile.state.visible=firstChild.state.visible;return}if(this.meetsScreenSpaceErrorEarly(tile,frameState)){tile.state.visible=!1;return}if(tile.refine===`REPLACE`&&hasChildren&&!this.anyChildrenVisible(tile,frameState)){tile.state.visible=!1;return}}anyChildrenVisible(tile,frameState){let anyVisible=!1,children=tile.children;for(let child of children)child.updateState(frameState),anyVisible=anyVisible||child.state.visible;return anyVisible}meetsScreenSpaceErrorEarly(tile,frameState){let{parent}=tile;return!parent||parent.refine!==`ADD`||parent.levelOfContent<frameState.minLevelOfDetail||parent.geometricError>frameState.maxGeometricError?!1:parent.levelOfContent>frameState.maxLevelOfDetail||parent.levelOfContent>=0&&parent.geometricError<frameState.minGeometricError?!0:tile.getScreenSpaceError(frameState,tile.state.distanceToCamera,!0)<this.tileset.currentMaxScreenSpaceError}sortTilesByDistanceToCamera(tiles){tiles.sort((a,b)=>b.state.distanceToCamera===0&&a.state.distanceToCamera===0?b.state.centerZDepth-a.state.centerZDepth:b.state.distanceToCamera-a.state.distanceToCamera)}},TilesetNormalTraverser=class extends TilesetBaseTraverser{constructor(tileset){super(tileset),this._traversalStack=new ManagedArray,this._emptyTraversalStack=new ManagedArray}traverse(root,frameState,cacheFrameStates=[]){super.traverse(root,frameState,cacheFrameStates);for(let frameState of cacheFrameStates)this._traversalStack.reset(),this._emptyTraversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState));this._traversalStack.reset(),this._emptyTraversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState))}reset(){super.reset(),this._traversalStack.reset(),this._emptyTraversalStack.reset()}executeTraversal(root,frameState){let stack=this._traversalStack;for(root.state.visible&&root.state.inRequestVolume&&stack.push(root);stack.length>0;){let tile=stack.pop(),parent=tile.parent,parentRefines=!parent||parent.state.shouldRefine,shouldRefine=!1;this.canTraverse(tile,frameState)&&(shouldRefine=this.updateAndPushChildren(tile,frameState,stack)&&parentRefines);let stoppedRefining=!shouldRefine&&parentRefines;tile.hasRenderContent?tile.refine===`ADD`?(this.loadTile(tile,frameState),this.selectDesiredTile(tile,frameState)):tile.refine===`REPLACE`&&(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)):(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)),this.touchTile(tile,frameState),tile.state.shouldRefine=shouldRefine}}updateAndPushChildren(tile,frameState,stack){let children=tile.children;for(let child of children)this.updateTile(child,frameState);this.sortTilesByDistanceToCamera(children);let checkRefines=tile.refine===`REPLACE`&&tile.hasRenderContent,hasVisibleChild=!1,refines=!0;for(let child of children)if(child.levelOfContent<=frameState.minLevelOfDetail||child.geometricError>=frameState.maxGeometricError||child.state.visible&&child.state.inRequestVolume?(stack.find(child)&&stack.delete(child),stack.push(child),hasVisibleChild===!1&&(hasVisibleChild=!0)):(checkRefines||frameState.loadSiblings)&&(this.loadTile(child,frameState),this.touchTile(child,frameState)),checkRefines){let childRefines;childRefines=child.state.inRequestVolume?child.hasRenderContent?child.contentAvailable:this.executeEmptyTraversal(child,frameState):!1,refines=refines&&childRefines}return hasVisibleChild||(refines=!1),refines}selectDesiredTile(tile,frameState){tile.contentAvailable&&super.selectTile(tile,frameState)}executeEmptyTraversal(root,frameState){let allDescendantsLoaded=!0,stack=this._emptyTraversalStack;for(stack.push(root);stack.length>0&&allDescendantsLoaded;){let tile=stack.pop(),traverse=!tile.hasRenderContent&&this.canTraverse(tile,frameState);if(!traverse&&!tile.contentAvailable&&(allDescendantsLoaded=!1),this.updateTile(tile,frameState),tile.state.visible||(this.loadTile(tile,frameState),this.touchTile(tile,frameState)),traverse){let children=tile.children;for(let child of children)stack.find(child)&&stack.delete(child),stack.push(child)}}return allDescendantsLoaded}},TilesetSkipTraverser=class extends TilesetBaseTraverser{constructor(tileset){super(tileset),this.baseScreenSpaceError=1024,this.skipScreenSpaceErrorFactor=16,this.skipLevels=1,this._traversalStack=new ManagedArray,this._descendantTraversalStack=new ManagedArray,this._selectionTraversalStack=new ManagedArray,this._selectionTraversalancestorStack=new ManagedArray}traverse(root,frameState,cacheFrameStates=[]){super.traverse(root,frameState,cacheFrameStates);for(let frameState of cacheFrameStates)this._traversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState),this.traverseAndSelect(root,frameState));this.tileset.hasMixedContent=!1,this._traversalStack.reset(),this._descendantTraversalStack.reset(),this._selectionTraversalStack.reset(),this._selectionTraversalancestorStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,this.updateTile(root,frameState),this.executeTraversal(root,frameState),this.traverseAndSelect(root,frameState))}reset(){super.reset(),this._traversalStack.reset(),this._descendantTraversalStack.reset(),this._selectionTraversalStack.reset(),this._selectionTraversalancestorStack.reset()}executeTraversal(root,frameState){let stack=this._traversalStack;for(root.state.visible&&root.state.inRequestVolume&&stack.push(root);stack.length>0;){let tile=stack.pop();this.updateTileAncestorContentLinks(tile,frameState);let parent=tile.parent,parentRefines=!parent||parent.state.shouldRefine,shouldRefine=!1;this.canTraverse(tile,frameState)&&(shouldRefine=this.updateAndPushChildren(tile,frameState,stack)&&parentRefines);let stoppedRefining=!shouldRefine&&parentRefines;tile.hasRenderContent?tile.refine===`ADD`?(this.loadTile(tile,frameState),this.selectDesiredTile(tile,frameState)):tile.refine===`REPLACE`&&(this.inBaseTraversal(tile,this.baseScreenSpaceError)?(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)):stoppedRefining?(this.loadTile(tile,frameState),this.selectDesiredTile(tile,frameState)):this.reachedSkippingThreshold(tile)&&this.loadTile(tile,frameState)):(this.loadTile(tile,frameState),stoppedRefining&&this.selectDesiredTile(tile,frameState)),this.touchTile(tile,frameState),tile.state.shouldRefine=shouldRefine}}updateAndPushChildren(tile,frameState,stack){let children=tile.children;for(let child of children)this.updateTile(child,frameState);this.sortTilesByDistanceToCamera(children);let hasVisibleChild=!1;for(let child of children)child.levelOfContent<=frameState.minLevelOfDetail||child.geometricError>=frameState.maxGeometricError||child.state.visible&&child.state.inRequestVolume?(stack.push(child),hasVisibleChild===!1&&(hasVisibleChild=!0)):frameState.loadSiblings&&(this.loadTile(child,frameState),this.touchTile(child,frameState));return hasVisibleChild}selectDesiredTile(tile,frameState){let loadedTile=tile.contentAvailable?tile:tile.state.ancestorWithContentAvailable;loadedTile&&(loadedTile.state.shouldSelect=!0),tile.contentAvailable||this.selectDescendants(tile,frameState)}selectDescendants(tile,frameState){let stack=this._descendantTraversalStack;for(stack.push(tile);stack.length>0;){let children=stack.pop().children;for(let child of children)child.state.visible&&(child.contentAvailable?(this.updateTile(child,frameState),this.touchTile(child,frameState),this.selectTile(child,frameState)):stack.push(child))}}reachedSkippingThreshold(tile){let ancestor=tile.state.ancestorWithContent;return ancestor!==null&&tile.state.screenSpaceError<ancestor.state.screenSpaceError/this.skipScreenSpaceErrorFactor&&tile.levelOfContent>ancestor.levelOfContent+this.skipLevels}updateTileAncestorContentLinks(tile,frameState){tile.state.ancestorWithContent=null,tile.state.ancestorWithContentAvailable=null;let{parent}=tile;if(!parent)return;let parentHasContent=!(parent.hasRenderContent&&parent.hasUnloadedContent)||parent.state.requestedFrameNumber===frameState.frameNumber;tile.state.ancestorWithContent=parentHasContent?parent:parent.state.ancestorWithContent,tile.state.ancestorWithContentAvailable=parent.contentAvailable?parent:parent.state.ancestorWithContentAvailable}inBaseTraversal(tile,baseScreenSpaceError){return tile.state.ancestorWithContent?tile.parent&&tile.state.screenSpaceError===0?tile.parent.state.screenSpaceError>baseScreenSpaceError:tile.state.screenSpaceError>baseScreenSpaceError:!0}traverseAndSelect(root,frameState){let stack=this._selectionTraversalStack,ancestorStack=this._selectionTraversalancestorStack,lastAncestor;for(stack.push(root);stack.length>0||ancestorStack.length>0;){if(ancestorStack.length>0){let waitingTile=ancestorStack.peek();if(waitingTile.state.stackLength===stack.length){ancestorStack.pop(),waitingTile!==lastAncestor&&(waitingTile.state.finalResolution=!1),this.selectTile(waitingTile,frameState);continue}}let tile=stack.pop();if(!tile)continue;let traverse=this.canTraverse(tile,frameState);if(tile.state.shouldSelect)if(tile.refine===`ADD`)this.selectTile(tile,frameState);else{if(tile.state.selectionDepth=ancestorStack.length,tile.state.selectionDepth>0&&(tile.tileset.hasMixedContent=!0),lastAncestor=tile,!traverse){this.selectTile(tile,frameState);continue}ancestorStack.push(tile),tile.state.stackLength=stack.length}if(traverse)for(let child of tile.children)child.state.visible&&stack.push(child)}}},TilesetMostDetailTraverser=class extends TilesetBaseTraverser{constructor(tileset){super(tileset),this._traversalStack=new ManagedArray}canTraverse(tile,frameState){return!(!tile.state.inRequestVolume||tile.levelOfContent>=frameState.maxLevelOfDetail||tile.levelOfContent>=0&&tile.geometricError<=frameState.minGeometricError||tile.children.length===0)}traverse(root,frameState,cacheFrameStates){super.traverse(root,frameState,[]),this._traversalStack.reset(),root.updateState(frameState);for(let frameState of cacheFrameStates)this._traversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,root.updateState(frameState),this.executeTraversal(root,frameState));this._traversalStack.reset(),frameState.camera.refine&&(this._canSelectTile=frameState.camera.visible,root.updateState(frameState),this.executeTraversal(root,frameState))}reset(){super.reset(),this._traversalStack.reset()}executeTraversal(root,frameState){let stack=this._traversalStack;for(stack.push(root);stack.length>0;){let tile=stack.pop(),add=tile.refine===`ADD`,replace=tile.refine===`REPLACE`,traverse=this.canTraverse(tile,frameState);traverse&&this.updateAndPushChildren(tile,frameState,stack),(add||replace&&!traverse)&&(this.loadTile(tile,frameState),this.touchTile(tile,frameState),this.selectDesiredTile(tile,frameState))}}updateAndPushChildren(tile,frameState,stack){let{children}=tile;for(let i=0;i<children.length;++i){let child=children[i];child.updateState(frameState),child.state.visible&&stack.push(child)}}selectDesiredTile(tile,frameState){tile.contentAvailable&&super.selectTile(tile,frameState)}},Tileset=class{constructor(header,options){var _a,_b,_c,_d,_e,_f,_g;if(this.id=header.tilesetUrl,this.transform=new three_webgpu.Matrix4,this.hasMixedContent=!1,this.frameNumber=0,this.maxAverageTileMemory=0,this.asset={version:header.asset.version,tilesetVersion:header.asset.tilesetVersion||``,gltfUpAxis:(_a=header.asset.gltfUpAxis)==null?`Y`:_a,overview:header.asset.overview,trajectories:(_c=(_b=header.asset.trajectories)==null?void 0:_b.list)==null?[]:_c,extras:header.asset.extras},this.rootMeta=(_d=header.rootMeta)==null?{}:_d,this.pointLength=(_e=this.rootMeta.numTotalPoints)==null?1/0:_e,this.floorLength=(_f=this.rootMeta.numFloors)==null?1:_f,this.properties=(_g=header.properties)==null?{}:_g,this.options=options,this.requestedTiles=[],this.selectedTiles=[],this.unloadTiles=[],this.needsRefinedTiles=new Set,this.selectedTrajectories=[],this.normalTraverser=new TilesetNormalTraverser(this),this.skipTraverser=new TilesetSkipTraverser(this),this.mostDetailTraverser=new TilesetMostDetailTraverser(this),this.cache=new TileCache({onTileLoad:tile=>{this.cacheMemoryUsageInBytes+=tile.contentMemoryUsage},onTileUnload:tile=>{this.cacheMemoryUsageInBytes-=tile.contentMemoryUsage,this.unloadTiles.push(tile)}}),this.requestScheduler=new TileRequestScheduler(this,{onTileSkip:tile=>{},onTileLoad:tile=>{var _a;(_a=tile.content)!=null&&_a.data&&(this.loadedTiles.add(tile),this.cache.loadTile(tile)),this.options.onTileLoad(tile)},onTileError:(tile,error)=>{this.options.onTileError(tile,error)}}),this.loadedTiles=new Set,this.cacheMemoryUsageInBytes=0,this.currentMaxScreenSpaceError=NaN,this.root=new Tile(`${this.id}#tile:0`,header.root,this),this.geometricError=header.geometricError,this.trajectories=[],this.asset.trajectories)for(let index=0;index<this.asset.trajectories.length;index++){let trajectory=new Trajectory(`${this.id}#trajectory:${index}`,this.asset.trajectories[index],this);this.trajectories.push(trajectory)}}adjustScreenSpaceError(frameState){if(frameState.frameNumber%20==0)if((isNaN(this.currentMaxScreenSpaceError)||!isFinite(this.currentMaxScreenSpaceError))&&(this.currentMaxScreenSpaceError=frameState.maxScreenSpaceError),frameState.memoryAdjustedScreenSpaceError){let memoryUsage=0,totalTile=0,loadedTile=0;if(this.needsRefinedTiles.forEach(tile=>{tile.content&&(totalTile++,memoryUsage+=tile.content.memoryUsage,tile.content.loadState===`READY`&&loadedTile++)}),loadedTile<2||totalTile<2)this.currentMaxScreenSpaceError=frameState.maxScreenSpaceError;else{let mbBytes=1024*1024,usageBytes=memoryUsage/loadedTile*totalTile,cacheByteLimit=frameState.maxMemoryUsage*mbBytes,cacheByte=cacheByteLimit-require_memoryUsage.M(cacheByteLimit*.2,32*mbBytes,128*mbBytes),currentMaxScreenSpaceError=this.currentMaxScreenSpaceError;if(usageBytes<cacheByte){let step=.3*Math.max(1-usageBytes/cacheByte,0);currentMaxScreenSpaceError-=step}else usageBytes>cacheByteLimit&&(currentMaxScreenSpaceError+=.15);currentMaxScreenSpaceError=require_memoryUsage.M(currentMaxScreenSpaceError,.5,frameState.maxScreenSpaceError),Math.abs(currentMaxScreenSpaceError-this.currentMaxScreenSpaceError)>=.1&&(this.currentMaxScreenSpaceError=currentMaxScreenSpaceError)}}else this.currentMaxScreenSpaceError=frameState.maxScreenSpaceError}getTraverser(frameState){return frameState.mostDetail?this.mostDetailTraverser:frameState.skipLevelOfDetail?this.skipTraverser:this.normalTraverser}reset(){this.cache.reset(),this.skipTraverser.reset(),this.normalTraverser.reset(),this.mostDetailTraverser.reset(),this.requestScheduler.reset();let stack=[this.root],tile;for(;tile=stack.pop();){for(let i=0,l=tile.children.length;i<l;i++)stack.push(tile.children[i]);this.cache.unloadTile(tile)}for(;this.unloadTiles.length;){let tile=this.unloadTiles.pop();tile&&(this.loadedTiles.delete(tile),this.cacheMemoryUsageInBytes-=tile.contentMemoryUsage,this.options.tileUnloader(tile).catch(()=>{}).then(()=>{this.options.onTileUnload&&this.options.onTileUnload(tile)}))}for(this.loadedTiles.clear();this.trajectories.length;){let trajectory=this.trajectories.pop();trajectory&&this.options.trajectoryUnloader(trajectory).catch(()=>{}).then(()=>{this.options.onTrajectoryUnload&&this.options.onTrajectoryUnload(trajectory)})}}update(frameState,cacheFrameStates=[]){var _a;for(this.frameNumber=frameState.frameNumber,this.adjustScreenSpaceError(frameState),this.cache.reset(),this.getTraverser(frameState).traverse(this.root,frameState,cacheFrameStates),this.cache.unloadTiles(()=>this.cacheMemoryUsageInBytes>frameState.maxMemoryUsage*1024*1024),this.requestScheduler.update(this.requestedTiles,frameState.requestOrder,frameState);this.unloadTiles.length;){let tile=this.unloadTiles.pop();tile&&(this.loadedTiles.delete(tile),this.options.tileUnloader(tile).catch(()=>{}).then(()=>{this.options.onTileUnload&&this.options.onTileUnload(tile)}))}this.selectedTrajectories.length=0;for(let trajectory of this.trajectories)trajectory.visible===!0&&trajectory.content.loadState===`READY`&&(_a=trajectory.content.data)!=null&&_a.object?this.selectedTrajectories.push(trajectory):trajectory.visible===!0&&(trajectory.content.loadState===`FAILED`&&frameState.time-trajectory.content.loadStateUpdateTime>trajectory.content.loadfailRetryDelay&&(trajectory.content.loadState=`UNLOADED`,trajectory.content.loadStateUpdateTime=frameState.time),trajectory.content.loadState===`UNLOADED`&&this.options.trajectoryLoader(trajectory).then(()=>{this.options.onTrajectoryLoad(trajectory)}).catch(error=>{this.options.onTrajectoryError(trajectory,error)}))}};function normalizeTileHeader(input,resourcePath){var _a;if(input.content){let uri=(_a=input.content.uri)==null?input.content.url:_a;typeof uri==`string`&&!require_imageBitmap.d(uri)&&(input.content.uri=require_imageBitmap.f(require_imageBitmap.p(resourcePath,uri)))}if(input.transform){let errored=!1;for(let i=0;i<16;i++){let value=input.transform[i];if(typeof value!=`number`||isNaN(value)||!isFinite(value)){errored=!0;break}}if(input.transform[15]===0&&(errored=!0),errored)throw Error(`Invalid Tile Transform: `+JSON.stringify(input.transform))}if(input.children)for(let child of input.children)normalizeTileHeader(child,resourcePath);return input}function normalizeTilesetHeader(input,tilesetUrl){input.tilesetUrl=tilesetUrl;let resourcePath=/^blob\:/.test(tilesetUrl)?``:tilesetUrl.slice(0,tilesetUrl.lastIndexOf(`/`)+1);if(input.asset||(input.asset={}),input.rootMeta||(input.rootMeta={}),input.rootMeta.taskParameters||(input.rootMeta.taskParameters={}),input.asset.overview){let overview=input.asset.overview;require_imageBitmap.d(overview.imageFile)||(overview.imageFile=require_imageBitmap.f(require_imageBitmap.p(resourcePath,overview.imageFile))),require_imageBitmap.d(overview.worldFile)||(overview.worldFile=require_imageBitmap.f(require_imageBitmap.p(resourcePath,overview.worldFile)))}if(input.asset.trajectories)for(let index=0;index<input.asset.trajectories.list.length;index++){let trajectory=input.asset.trajectories.list[index];trajectory.file=require_imageBitmap.f(require_imageBitmap.p(resourcePath,trajectory.file))}return normalizeTileHeader(input.root,resourcePath),input}function delay(timeout){return new Promise(resolve=>setTimeout(resolve,timeout))}var initTextureQueue=new class{constructor(concurrency){this.queue=[],this.concurrency=concurrency,this.dequeuing=0}add(task,timeout=1e3){let doneResolve,doneReject,promise=new Promise((resolve,reject)=>{doneResolve=resolve,doneReject=reject});return this.queue.unshift(()=>{let taskPomise=Promise.resolve().then(task);taskPomise.then(doneResolve,doneReject);let timeoutPromise=delay(timeout);return Promise.race([taskPomise,timeoutPromise]).then(require_memoryUsage.d,require_memoryUsage.d)}),this.dequeue(),promise}dequeue(){for(;this.dequeuing<this.concurrency&&this.queue.length>0;){let task=this.queue.pop();this.dequeuing++,task().catch(require_memoryUsage.d).then(()=>{this.dequeuing--,this.dequeue()})}}}(1),skipImageSize=256;function canInit(texture){let img=texture.image;return!!img&&img.width>0&&img.height>0}function uploadTexture(texture,renderer){if(!canInit(texture))return Promise.resolve(texture);let img=texture.image;if(img&&(img==null?void 0:img.width)<skipImageSize&&(img==null?void 0:img.height)<skipImageSize)return renderer.initTexture(texture),Promise.resolve(texture);let disposed=!1,onTextureDispose=()=>{disposed=!0,texture.removeEventListener(`dispose`,onTextureDispose)};return texture.addEventListener(`dispose`,onTextureDispose),initTextureQueue.add(()=>new Promise(resolve=>{require_imageBitmap.s.shared.add(()=>{canInit(texture)&&disposed===!1&&renderer.initTexture(texture),texture.removeEventListener(`dispose`,onTextureDispose),resolve(texture)},!0)}))}function initTexture(texture,renderer){var _a,_b;let target=renderer;return((_a=target.isInitialized)==null?target.initialized:_a)?uploadTexture(texture,renderer):Promise.resolve((_b=target.ready)==null?target.init():_b).then(()=>uploadTexture(texture,renderer))}function initTextures(textures,renderer){return Promise.all(textures.map(texture=>initTexture(texture,renderer)))}var SIZEOF_UINT32$1=4;function parseHeader(data,arrayBuffer,byteOffset){let view=new DataView(arrayBuffer);if(data.magic=view.getUint32(byteOffset,!0),byteOffset+=SIZEOF_UINT32$1,data.version=view.getUint32(byteOffset,!0),byteOffset+=SIZEOF_UINT32$1,data.byteLength=view.getUint32(byteOffset,!0),byteOffset+=SIZEOF_UINT32$1,data.version!==1)throw Error(`3D Tile Version ${data.version} not supported`);return byteOffset}var GL_TYPE;(function(GL_TYPE){GL_TYPE[GL_TYPE.BYTE=5120]=`BYTE`,GL_TYPE[GL_TYPE.UNSIGNED_BYTE=5121]=`UNSIGNED_BYTE`,GL_TYPE[GL_TYPE.SHORT=5122]=`SHORT`,GL_TYPE[GL_TYPE.UNSIGNED_SHORT=5123]=`UNSIGNED_SHORT`,GL_TYPE[GL_TYPE.INT=5124]=`INT`,GL_TYPE[GL_TYPE.UNSIGNED_INT=5125]=`UNSIGNED_INT`,GL_TYPE[GL_TYPE.FLOAT=5126]=`FLOAT`,GL_TYPE[GL_TYPE.DOUBLE=5130]=`DOUBLE`})(GL_TYPE||(GL_TYPE={}));var GL_TYPE_TO_ARRAY_TYPE={[GL_TYPE.DOUBLE]:Float64Array,[GL_TYPE.FLOAT]:Float32Array,[GL_TYPE.UNSIGNED_SHORT]:Uint16Array,[GL_TYPE.UNSIGNED_INT]:Uint32Array,[GL_TYPE.UNSIGNED_BYTE]:Uint8Array,[GL_TYPE.BYTE]:Int8Array,[GL_TYPE.SHORT]:Int16Array,[GL_TYPE.INT]:Int32Array},NAME_TO_GL_TYPE={DOUBLE:GL_TYPE.DOUBLE,FLOAT:GL_TYPE.FLOAT,UNSIGNED_SHORT:GL_TYPE.UNSIGNED_SHORT,UNSIGNED_INT:GL_TYPE.UNSIGNED_INT,UNSIGNED_BYTE:GL_TYPE.UNSIGNED_BYTE,BYTE:GL_TYPE.BYTE,SHORT:GL_TYPE.SHORT,INT:GL_TYPE.INT};function getArrayType(glType){let ArrayType=GL_TYPE_TO_ARRAY_TYPE[glType];if(!ArrayType)throw Error(`Failed to convert GL type`);return ArrayType}function getByteSize(glType){return getArrayType(glType).BYTES_PER_ELEMENT}function createTypedArray(glType,buffer,byteOffset=0,length){let ArrayType=getArrayType(glType);return byteOffset%getByteSize(glType)===0?new ArrayType(buffer,byteOffset,length==null?(buffer.byteLength-byteOffset)/getByteSize(glType):length):new ArrayType(length?buffer.slice(byteOffset,byteOffset+length*getByteSize(glType)):buffer.slice(byteOffset))}function glTypeFromName(name){let glType=NAME_TO_GL_TYPE[name];if(!glType)throw Error(`Failed to convert GL type`);return glType}var FeatureTable=class{constructor(featureTableJson,featureTableBinary){this.featuresLength=0,this.cachedTypedArrays={},this.json=featureTableJson,this.buffer=featureTableBinary;let featuresLengthArray=this.getGlobalProperty(`POINTS_LENGTH`,GL_TYPE.UNSIGNED_INT,1);featuresLengthArray&&featuresLengthArray.length&&(this.featuresLength=featuresLengthArray[0])}getExtension(extensionName){return this.json.extensions&&this.json.extensions[extensionName]}hasProperty(propertyName){return!!this.json[propertyName]}getGlobalProperty(propertyName,componentType,componentLength){let jsonValue=this.json[propertyName];return typeof jsonValue==`number`?new(getArrayType(componentType))([jsonValue]):Array.isArray(jsonValue)?new(getArrayType(componentType))(jsonValue):jsonValue&&Number.isFinite(jsonValue.byteOffset)?this.getTypedArrayFromBinary(propertyName,componentType,componentLength,1,jsonValue.byteOffset):null}getPropertyArray(propertyName,componentType,componentLength){let jsonValue=this.json[propertyName];return jsonValue&&Number.isFinite(jsonValue.byteOffset)?(`componentType`in jsonValue&&(componentType=glTypeFromName(jsonValue.componentType)),this.getTypedArrayFromBinary(propertyName,componentType,componentLength,this.featuresLength,jsonValue.byteOffset)):this.getTypedArrayFromArray(propertyName,componentType,jsonValue)}getProperty(propertyName,componentType,componentLength,featureId,result){if(!this.json[propertyName])return null;let typedArray=this.getPropertyArray(propertyName,componentType,componentLength);if(componentLength===1)return result[0]=typedArray[featureId],result;for(let i=0;i<componentLength;++i)result[i]=typedArray[componentLength*featureId+i];return result}getTypedArrayFromBinary(propertyName,componentType,componentLength,count,byteOffset){let cachedTypedArrays=this.cachedTypedArrays,typedArray=cachedTypedArrays[propertyName];return typedArray||(typedArray=createTypedArray(componentType,this.buffer.buffer,this.buffer.byteOffset+byteOffset,count*componentLength),cachedTypedArrays[propertyName]=typedArray),typedArray}getTypedArrayFromArray(propertyName,componentType,array){let cachedTypedArrays=this.cachedTypedArrays,typedArray=cachedTypedArrays[propertyName];return typedArray||(typedArray=createTypedArray(componentType,array),cachedTypedArrays[propertyName]=typedArray),typedArray}},SIZEOF_UINT32=4,DEPRECATION_WARNING=`b3dm tile in legacy format.`;function getStringFromArrayBuffer(arrayBuffer,byteOffset,byteLength){let textDecoder=new TextDecoder(`utf8`),typedArray=new Uint8Array(arrayBuffer,byteOffset,byteLength);return textDecoder.decode(typedArray)}function parseTable(data,arrayBuffer,byteOffset){return byteOffset=parseTablesHeader(data,arrayBuffer,byteOffset),byteOffset=parseFeatureTable(data,arrayBuffer,byteOffset),byteOffset=parseBatchTable(data,arrayBuffer,byteOffset),byteOffset}function parseTablesHeader(data,arrayBuffer,byteOffset){let view=new DataView(arrayBuffer),batchLength=0;data.header=data.header||{};let featureTableJsonByteLength=view.getUint32(byteOffset,!0);byteOffset+=SIZEOF_UINT32;let featureTableBinaryByteLength=view.getUint32(byteOffset,!0);byteOffset+=SIZEOF_UINT32;let batchTableJsonByteLength=view.getUint32(byteOffset,!0);byteOffset+=SIZEOF_UINT32;let batchTableBinaryByteLength=view.getUint32(byteOffset,!0);return byteOffset+=SIZEOF_UINT32,batchTableJsonByteLength>=570425344?(byteOffset-=SIZEOF_UINT32*2,batchLength=featureTableJsonByteLength,batchTableJsonByteLength=featureTableBinaryByteLength,batchTableBinaryByteLength=0,featureTableJsonByteLength=0,featureTableBinaryByteLength=0,console.warn(DEPRECATION_WARNING)):batchTableBinaryByteLength>=570425344&&(byteOffset-=SIZEOF_UINT32,batchLength=batchTableJsonByteLength,batchTableJsonByteLength=featureTableJsonByteLength,batchTableBinaryByteLength=featureTableBinaryByteLength,featureTableJsonByteLength=0,featureTableBinaryByteLength=0,console.warn(DEPRECATION_WARNING)),data.header.featureTableJsonByteLength=featureTableJsonByteLength,data.header.featureTableBinaryByteLength=featureTableBinaryByteLength,data.header.batchTableJsonByteLength=batchTableJsonByteLength,data.header.batchTableBinaryByteLength=batchTableBinaryByteLength,data.header.batchLength=batchLength,byteOffset}function parseFeatureTable(data,arrayBuffer,byteOffset){let{featureTableJsonByteLength,featureTableBinaryByteLength,batchLength}=data.header||{};if(data.featureTableJson={BATCH_LENGTH:batchLength||0},featureTableJsonByteLength&&featureTableJsonByteLength>0){let featureTableString=getStringFromArrayBuffer(arrayBuffer,byteOffset,featureTableJsonByteLength);data.featureTableJson=JSON.parse(featureTableString)}byteOffset+=featureTableJsonByteLength||0,data.featureTableBinary=new Uint8Array(arrayBuffer,byteOffset,featureTableBinaryByteLength),byteOffset+=featureTableBinaryByteLength||0;let featureTable=new FeatureTable(data.featureTableJson,data.featureTableBinary);if(Array.isArray(featureTable.json.RTC_CENTER)){let rctCenterArray=featureTable.json.RTC_CENTER;data.rtcCenter=[rctCenterArray[0],rctCenterArray[1],rctCenterArray[2]]}else{let rctCenterArray=featureTable.getGlobalProperty(`RTC_CENTER`,GL_TYPE.FLOAT,3);rctCenterArray&&(data.rtcCenter=[rctCenterArray[0],rctCenterArray[1],rctCenterArray[2]])}return byteOffset}function parseBatchTable(data,arrayBuffer,byteOffset){let{batchTableJsonByteLength,batchTableBinaryByteLength}=data.header||{};if(batchTableJsonByteLength&&batchTableJsonByteLength>0){let batchTableString=getStringFromArrayBuffer(arrayBuffer,byteOffset,batchTableJsonByteLength);data.batchTableJson=JSON.parse(batchTableString),byteOffset+=batchTableJsonByteLength,batchTableBinaryByteLength&&batchTableBinaryByteLength>0&&(data.batchTableBinary=new Uint8Array(arrayBuffer,byteOffset,batchTableBinaryByteLength),data.batchTableBinary=new Uint8Array(data.batchTableBinary),byteOffset+=batchTableBinaryByteLength)}return byteOffset}function sliceArrayBuffer(arrayBuffer,byteOffset,byteLength){let subArray=byteLength===void 0?new Uint8Array(arrayBuffer).subarray(byteOffset):new Uint8Array(arrayBuffer).subarray(byteOffset,byteOffset+byteLength);return new Uint8Array(subArray).buffer}function parseGlTFArrayBuffer(data,arrayBuffer,byteOffset){let gltfByteLength=data.byteLength-byteOffset;if(gltfByteLength===0)throw Error(`glTF byte length must be greater than 0.`);return byteOffset%4!=0&&console.warn(`${data.type}: embedded glb is not aligned to a 4-byte boundary.`),data.gltfArrayBuffer=sliceArrayBuffer(arrayBuffer,byteOffset,gltfByteLength),data.byteLength}function loadB3dm(url,options={}){var _a,_b,_c,_d,_e;let modelUpAxis=(_a=options.modelUpAxis)==null?`Y`:_a,upAxis=(_b=options.upAxis)==null?`Z`:_b,fetcher=(_c=options.fetcher)==null?require_memoryUsage.u:_c,onDownloadProgress=(_d=options.onDownloadProgress)==null?require_memoryUsage.d:_d,jsonModify=(_e=options.jsonModify)==null?require_memoryUsage.d:_e,data={uri:url,gltfUpAxis:modelUpAxis},byteLength=0;return Promise.resolve().then(()=>fetcher.ajax(url,{responseType:`arraybuffer`},void 0,void 0,onDownloadProgress).then(response=>(byteLength=response.body.byteLength,response.body))).then(arrayBuffer=>Promise.resolve(0).then(byteOffset=>parseHeader(data,arrayBuffer,byteOffset)).then(byteOffset=>parseTable(data,arrayBuffer,byteOffset)).then(byteOffset=>parseGlTFArrayBuffer(data,arrayBuffer,byteOffset))).then(()=>{var _a;return require_glTF_helpers.t(data.gltfArrayBuffer,{copyUV2:!1,resourcePath:url.slice(0,url.lastIndexOf(`/`)+1),search:(_a=url.split(`?`)[1])==null?``:_a,jsonModify(json){var _a,_b,_c;if(options.light===!1){let KHR_materials_unlit=`KHR_materials_unlit`;if(json.extensionsUsed=(_a=json.extensionsUsed)==null?[]:_a,json.extensionsUsed.indexOf(KHR_materials_unlit)===-1&&json.extensionsUsed.push(KHR_materials_unlit),json.materials)for(let material of json.materials)material.extensions=(_b=material.extensions)==null?{}:_b,material.extensions[KHR_materials_unlit]={}}return(_c=jsonModify(json))==null?json:_c},fetcher})}).then(result=>{let contentTransform=new three_webgpu.Matrix4;modelUpAxis===`Y`&&contentTransform.premultiply(require_memoryUsage.r);let rtcCenter;if(data.rtcCenter?rtcCenter=new three_webgpu.Vector3().fromArray(data.rtcCenter):result.CESIUM_RTC&&(rtcCenter=new three_webgpu.Vector3().copy(result.CESIUM_RTC.center)),rtcCenter){let rtcCenterTransform=new three_webgpu.Matrix4().setPosition(rtcCenter);contentTransform.premultiply(rtcCenterTransform)}return upAxis===`Y`&&contentTransform.premultiply(require_memoryUsage.i),result.scene.applyMatrix4(contentTransform),data.featureTableBinary=void 0,data.batchTableBinary=void 0,data.gltfArrayBuffer=void 0,{type:`b3dm`,modelUpAxis,upAxis,uri:url,byteLength,memoryUsage:require_memoryUsage.n(result.scene),scene:result.scene,textures:result.textures,animations:result.animations,rtcCenter,dispose:()=>result.dispose()}})}var jsContent="(function(){function e(e){onmessage=t=>{Promise.resolve(t.data).then(t=>e(t)).then(({output:e,transfer:t})=>postMessage(e,t)).catch(e=>postMessage({$$error:e}))}}var t;(function(e){e[e.BYTE=5120]=`BYTE`,e[e.UNSIGNED_BYTE=5121]=`UNSIGNED_BYTE`,e[e.SHORT=5122]=`SHORT`,e[e.UNSIGNED_SHORT=5123]=`UNSIGNED_SHORT`,e[e.INT=5124]=`INT`,e[e.UNSIGNED_INT=5125]=`UNSIGNED_INT`,e[e.FLOAT=5126]=`FLOAT`,e[e.DOUBLE=5130]=`DOUBLE`})(t||(t={}));let n={[t.DOUBLE]:Float64Array,[t.FLOAT]:Float32Array,[t.UNSIGNED_SHORT]:Uint16Array,[t.UNSIGNED_INT]:Uint32Array,[t.UNSIGNED_BYTE]:Uint8Array,[t.BYTE]:Int8Array,[t.SHORT]:Int16Array,[t.INT]:Int32Array},r={DOUBLE:t.DOUBLE,FLOAT:t.FLOAT,UNSIGNED_SHORT:t.UNSIGNED_SHORT,UNSIGNED_INT:t.UNSIGNED_INT,UNSIGNED_BYTE:t.UNSIGNED_BYTE,BYTE:t.BYTE,SHORT:t.SHORT,INT:t.INT};function i(e){let t=n[e];if(!t)throw Error(`Failed to convert GL type`);return t}function a(e){return i(e).BYTES_PER_ELEMENT}function o(e,t,n=0,r){let o=i(e);return n%a(e)===0?new o(t,n,r==null?(t.byteLength-n)/a(e):r):new o(r?t.slice(n,n+r*a(e)):t.slice(n))}function s(e){let t=r[e];if(!t)throw Error(`Failed to convert GL type`);return t}var c=class{constructor(e,n){this.featuresLength=0,this.cachedTypedArrays={},this.json=e,this.buffer=n;let r=this.getGlobalProperty(`POINTS_LENGTH`,t.UNSIGNED_INT,1);r&&r.length&&(this.featuresLength=r[0])}getExtension(e){return this.json.extensions&&this.json.extensions[e]}hasProperty(e){return!!this.json[e]}getGlobalProperty(e,t,n){let r=this.json[e];return typeof r==`number`?new(i(t))([r]):Array.isArray(r)?new(i(t))(r):r&&Number.isFinite(r.byteOffset)?this.getTypedArrayFromBinary(e,t,n,1,r.byteOffset):null}getPropertyArray(e,t,n){let r=this.json[e];return r&&Number.isFinite(r.byteOffset)?(`componentType`in r&&(t=s(r.componentType)),this.getTypedArrayFromBinary(e,t,n,this.featuresLength,r.byteOffset)):this.getTypedArrayFromArray(e,t,r)}getProperty(e,t,n,r,i){if(!this.json[e])return null;let a=this.getPropertyArray(e,t,n);if(n===1)return i[0]=a[r],i;for(let e=0;e<n;++e)i[e]=a[n*r+e];return i}getTypedArrayFromBinary(e,t,n,r,i){let a=this.cachedTypedArrays,s=a[e];return s||(s=o(t,this.buffer.buffer,this.buffer.byteOffset+i,r*n),a[e]=s),s}getTypedArrayFromArray(e,t,n){let r=this.cachedTypedArrays,i=r[e];return i||(i=o(t,n),r[e]=i),i}};e(e=>Promise.resolve(e).then(e=>{let t=new c(e.featureTableJson,e.featureTableBinary),n=u(t),r=d(t),i=p(t),a=[];return n&&a.push(n.array.buffer),r&&a.push(r.array.buffer),i&&a.push(i.array.buffer),{output:{position:n,color:r,normal:i},transfer:a}}));let l=65535;function u(e){if(e.hasProperty(`POSITION`))return{array:e.getPropertyArray(`POSITION`,t.FLOAT,3),itemSize:3,normalized:!1};if(e.hasProperty(`POSITION_QUANTIZED`)){let n=e.getPropertyArray(`POSITION_QUANTIZED`,t.UNSIGNED_SHORT,3),r=e.getGlobalProperty(`QUANTIZED_VOLUME_SCALE`,t.FLOAT,3),i=e.getGlobalProperty(`QUANTIZED_VOLUME_OFFSET`,t.FLOAT,3);if(!r||!i)throw Error(`QUANTIZED_VOLUME_SCALE or QUANTIZED_VOLUME_OFFSET never found.`);let a=new Float32Array(n.length),o=n.length/3,s=r[0]/l,c=r[1]/l,u=r[2]/l,d=i[0],f=i[1],p=i[2];for(let e=0,t;e<o;e++)t=e*3,a[t]=n[t]*s+d,a[++t]=n[t]*c+f,a[++t]=n[t]*u+p;return{array:a,itemSize:3,normalized:!1}}return null}function d(e){if(e.hasProperty(`RGB`)){let n=e.getPropertyArray(`RGB`,t.UNSIGNED_BYTE,3),r=n.length/3,i=new Uint8Array(r*4);for(let e=0,t,a;e<r;e++)a=e*4,t=e*3,i[a]=n[t],i[++a]=n[++t],i[++a]=n[++t];return{array:i,itemSize:4,normalized:!0}}else if(e.hasProperty(`RGBA`))return{array:e.getPropertyArray(`RGBA`,t.UNSIGNED_BYTE,4),itemSize:4,normalized:!0};else if(e.hasProperty(`RGB565`)){let n=e.getPropertyArray(`RGB565`,t.UNSIGNED_SHORT,1),r=n.length,i=new Uint8Array(r*4);for(let e=0,t,a;e<r;e++)a=n[e],t=e*4,i[t]=(a>>11&31)<<3,i[++t]=(a>>5&63)<<2,i[++t]=(a&31)<<3;return{array:i,itemSize:4,normalized:!0}}return null}let f=2/255;function p(e){if(e.hasProperty(`NORMAL`)){let n=e.getPropertyArray(`NORMAL`,t.FLOAT,3),r=n.length/3,i=new Int8Array(r*4);for(let e=0,t,a;e<r;e++)a=e*4,t=e*3,i[a]=n[t]*127,i[++a]=n[++t]*127,i[++a]=n[++t]*127;return{array:i,itemSize:4,normalized:!0}}else if(e.hasProperty(`NORMAL_OCT16P`)){let n=e.getPropertyArray(`NORMAL_OCT16P`,t.UNSIGNED_BYTE,2),r=n.length/2,i=new Int8Array(r*4);for(let e=0,t,a,o,s,c,l,u;e<r;e++)t=e*2,a=n[t]*f-1,o=n[++t]*f-1,c=a<0?-a:a,l=o<0?-o:o,s=1-(c+l),s<0&&(a=(1-l)*(a<0?-1:1),o=(1-c)*(o<0?-1:1)),u=Math.sqrt(a*a+o*o+s*s),t=e*4,i[t]=a/u*127,i[++t]=o/u*127,i[++t]=s/u*127;return{array:i,itemSize:4,normalized:!0}}return null}})();",blob=typeof self<`u`&&self.Blob&&new Blob([`(self.URL || self.webkitURL).revokeObjectURL(self.location.href);`,jsContent],{type:`text/javascript;charset=utf-8`});function WorkerWrapper(options){let objURL;try{if(objURL=blob&&(self.URL||self.webkitURL).createObjectURL(blob),!objURL)throw``;let worker=new Worker(objURL,{name:options==null?void 0:options.name});return worker.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(objURL)}),worker}catch(e){return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(jsContent),{name:options==null?void 0:options.name})}}var attributeWorkerPool=new require_glTF_helpers.a(()=>new WorkerWrapper,2);function parsePointCloud(data,_arrayBuffer,byteOffset){let featureTable=new FeatureTable(data.featureTableJson,data.featureTableBinary);return Promise.resolve().then(()=>{let featureTableDraco=featureTable.getExtension(`3DTILES_draco_point_compression`);if(featureTableDraco)return parseDraco(featureTableDraco,featureTable);{let bufferCopy=featureTable.buffer.slice();return attributeWorkerPool.postMessage({featureTableBinary:bufferCopy,featureTableJson:featureTable.json},[bufferCopy.buffer])}}).then(attributes=>(data.attributes=attributes,byteOffset))}function parseDraco(featureTableDraco,featureTable){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let dracoFeatureTableProperties=featureTableDraco.properties||{},dracoByteOffset=featureTableDraco.byteOffset,dracoByteLength=featureTableDraco.byteLength;if(!dracoFeatureTableProperties||!Number.isFinite(dracoByteOffset)||!dracoByteLength)throw Error(`Draco properties, byteOffset, and byteLength must be defined`);let dracoBuffer=featureTable.buffer.slice(dracoByteOffset,dracoByteOffset+dracoByteLength),attributeIDs=featureTableDraco.properties;return require_glTF_helpers.r.decodeGeometry(dracoBuffer.buffer,{attributeIDs,attributeTypes:{POSITION:`Float32Array`,NORMAL:`Float32Array`,RGB:`Uint8Array`,RGBA:`Uint8Array`},useUniqueIDs:!0}).then(geometry=>{let positionAttribute=geometry.getAttribute(`POSITION`),rgbAttribute=geometry.getAttribute(`RGB`),rgbaAttribute=geometry.getAttribute(`RGBA`),normalAttribute=geometry.getAttribute(`NORMAL`),colorAttribute;if(rgbaAttribute)colorAttribute=rgbaAttribute;else if(rgbAttribute){let pointCount=rgbAttribute.count,rgbArray=rgbAttribute.array,colorArray=new Uint8Array(pointCount*4);for(let i=0,offset3,offset4;i<pointCount;i++)offset4=i*4,offset3=i*3,colorArray[offset4]=rgbArray[offset3],colorArray[++offset4]=rgbArray[++offset3],colorArray[++offset4]=rgbArray[++offset3];colorAttribute=new three_webgpu.BufferAttribute(colorArray,4,rgbAttribute.normalized)}return{position:positionAttribute?{array:positionAttribute.array,itemSize:positionAttribute.itemSize,normalized:positionAttribute.normalized}:null,color:colorAttribute?{array:colorAttribute.array,itemSize:colorAttribute.itemSize,normalized:colorAttribute.normalized}:null,normal:normalAttribute?{array:normalAttribute.array,itemSize:normalAttribute.itemSize,normalized:normalAttribute.normalized}:null}})})}function srgbToLinear(channel){return channel<=.04045?channel/12.92:Math.pow((channel+.055)/1.055,2.4)}function decodeSrgbChannel(value,normalized,maxValue){let encoded=normalized||value>1?value/maxValue:value;return srgbToLinear(Math.min(Math.max(encoded,0),1))}function loadPnts(url,options={}){var _a,_b,_c;let upAxis=(_a=options.upAxis)==null?`Z`:_a,fetcher=(_b=options.fetcher)==null?require_memoryUsage.u:_b,onDownloadProgress=(_c=options.onDownloadProgress)==null?require_memoryUsage.d:_c,data={uri:url};return Promise.resolve().then(()=>fetcher.ajax(url,{responseType:`arraybuffer`},void 0,void 0,onDownloadProgress).then(response=>response.body)).then(arrayBuffer=>Promise.resolve(0).then(byteOffset=>parseHeader(data,arrayBuffer,byteOffset)).then(byteOffset=>parseTable(data,arrayBuffer,byteOffset)).then(byteOffset=>parsePointCloud(data,arrayBuffer,byteOffset))).then(()=>{var _a;return createPoints(data.attributes,{computeBoundingBox:(_a=options.computeBoundingBox)==null?!0:_a})}).then(result=>{let contentTransform=new three_webgpu.Matrix4,rtcCenter;if(data.rtcCenter&&(rtcCenter=new three_webgpu.Vector3().fromArray(data.rtcCenter)),rtcCenter){let rtcCenterTransform=new three_webgpu.Matrix4().setPosition(rtcCenter);contentTransform.premultiply(rtcCenterTransform)}return upAxis===`Y`&&contentTransform.premultiply(require_memoryUsage.i),result.object.applyMatrix4(contentTransform),data.gltfArrayBuffer=void 0,data.featureTableBinary=void 0,data.batchTableBinary=void 0,data.attributes=void 0,{type:`pnts`,modelUpAxis:`Z`,upAxis,uri:data.uri,byteLength:data.byteLength,memoryUsage:require_memoryUsage.n(result.object),scene:result.object,textures:[],animations:[],rtcCenter,dispose:()=>result.dispose()}})}function createPoints(attributes,options){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l,_m,_o,_p;let positionsSource=(_a=attributes.position)==null?void 0:_a.array,colorsSource=(_b=attributes.color)==null?void 0:_b.array,numPoints=attributes.position?Math.floor(attributes.position.array.length/attributes.position.itemSize):0,positions=new Float32Array;if(attributes.position&&positionsSource instanceof Float32Array&&attributes.position.itemSize===3&&attributes.position.normalized!==!0)positions=positionsSource.slice(0,numPoints*3);else if(positionsSource&&attributes.position){positions=new Float32Array(numPoints*3);let source=positionsSource,itemSize=Math.max(1,attributes.position.itemSize);for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3;positions[dstBase]=(_c=source[srcBase])==null?0:_c,positions[dstBase+1]=(_d=source[srcBase+1])==null?0:_d,positions[dstBase+2]=(_e=source[srcBase+2])==null?0:_e}}let colors=new Uint8Array(numPoints*3);if(colorsSource&&attributes.color&&colorsSource instanceof Uint8Array&&attributes.color.itemSize===3&&attributes.color.normalized===!0)colors=colorsSource;else if(colorsSource&&attributes.color&&colorsSource instanceof Float32Array&&attributes.color.itemSize===3&&attributes.color.normalized!==!0)colors=colorsSource;else if(colorsSource&&attributes.color){let source=colorsSource,itemSize=Math.max(1,attributes.color.itemSize);if(attributes.color.normalized)if(colorsSource instanceof Uint8Array){colors=new Uint8Array(numPoints*3);for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3,r=(_f=source[srcBase])==null?0:_f,g=(_g=source[srcBase+1])==null?r:_g,b=(_h=source[srcBase+2])==null?r:_h;colors[dstBase]=r,colors[dstBase+1]=g,colors[dstBase+2]=b}}else{colors=new Float32Array(numPoints*3);let typedSource=colorsSource,bytesPerElement=`BYTES_PER_ELEMENT`in typedSource?typedSource.BYTES_PER_ELEMENT:1,maxValue=Math.pow(2,bytesPerElement*8)-1;for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3,r=(_j=source[srcBase])==null?0:_j,g=(_k=source[srcBase+1])==null?r:_k,b=(_l=source[srcBase+2])==null?r:_l;colors[dstBase]=decodeSrgbChannel(r,!0,maxValue),colors[dstBase+1]=decodeSrgbChannel(g,!0,maxValue),colors[dstBase+2]=decodeSrgbChannel(b,!0,maxValue)}}else{colors=new Float32Array(numPoints*3);let typedSource=colorsSource,bytesPerElement=`BYTES_PER_ELEMENT`in typedSource?typedSource.BYTES_PER_ELEMENT:1,maxValue=Math.pow(2,bytesPerElement*8)-1;for(let i=0;i<numPoints;i++){let srcBase=i*itemSize,dstBase=i*3,r=(_m=source[srcBase])==null?0:_m,g=(_o=source[srcBase+1])==null?r:_o,b=(_p=source[srcBase+2])==null?r:_p;colors[dstBase]=decodeSrgbChannel(r,!1,maxValue),colors[dstBase+1]=decodeSrgbChannel(g,!1,maxValue),colors[dstBase+2]=decodeSrgbChannel(b,!1,maxValue)}}}let normals=attributes.normal?require_memoryUsage.g(attributes.normal,numPoints):null,points=new require_memoryUsage.m({numPoints,positions,colors,normals});return points.matrix.compose(points.position,points.quaternion,points.scale),points.matrixAutoUpdate=!1,points.frustumCulled=!1,options.computeBoundingBox,Promise.resolve({object:points,dispose:()=>{points.dispose()}})}var _object_pattern=/^[og]\s*(.+)?/,_material_library_pattern=/^mtllib /,_material_use_pattern=/^usemtl /,_map_use_pattern=/^usemap /,_face_vertex_data_separator_pattern=/\s+/,_color=new three_webgpu.Color,ObjState=class{constructor(){this.objects=[],this.vertices=[],this.normals=[],this.colors=[],this.uvs=[],this.materials={},this.materialLibraries=[],this.startObject(``,!1)}startObject(name,fromDeclaration){if(this.object&&this.object.fromDeclaration===!1){this.object.name=name,this.object.fromDeclaration=fromDeclaration!==!1;return}let previousMaterial=this.object&&typeof this.object.currentMaterial==`function`?this.object.currentMaterial():void 0;if(this.object&&typeof this.object._finalize==`function`&&this.object._finalize(!0),this.object={name:name||``,fromDeclaration:fromDeclaration!==!1,geometry:{vertices:[],hasNormal:!0,normals:[],hasColor:!0,colors:[],hasUV:!0,uvs:[],index:[],indexMap:{}},materials:[],smooth:!0,startMaterial:function(name,libraries){var _a,_b;let previous=this._finalize(!1);previous&&(previous.inherited||((_a=previous.groupCount)==null?0:_a)<=0)&&this.materials.splice((_b=previous.index)==null?0:_b,1);let material={index:this.materials.length,name:name||``,mtllib:Array.isArray(libraries)&&libraries.length>0?libraries[libraries.length-1]:``,smooth:previous===void 0?this.smooth:previous.smooth,groupStart:previous===void 0?0:previous.groupEnd,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(index){let cloned={index:typeof index==`number`?index:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1,clone(){return this}};return cloned.clone=this.clone.bind(cloned),cloned}};return this.materials.push(material),material},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(end){var _a,_b;let lastMultiMaterial=this.currentMaterial();if(lastMultiMaterial&&lastMultiMaterial.groupEnd===-1&&(lastMultiMaterial.groupEnd=this.geometry.index.length,lastMultiMaterial.groupCount=lastMultiMaterial.groupEnd-((_a=lastMultiMaterial.groupStart)==null?0:_a),lastMultiMaterial.inherited=!1),end&&this.materials.length>1)for(let mi=this.materials.length-1;mi>=0;mi--)((_b=this.materials[mi].groupCount)==null?0:_b)<=0&&this.materials.splice(mi,1);return end&&this.materials.length===0&&this.materials.push({name:``,smooth:this.smooth}),lastMultiMaterial}},previousMaterial&&previousMaterial.name&&typeof previousMaterial.clone==`function`){let declared=previousMaterial.clone(0);declared.inherited=!0,this.object.materials.push(declared)}this.objects.push(this.object)}finalize(){this.object&&typeof this.object._finalize==`function`&&this.object._finalize(!0)}parseVertexIndex(value,len){let index=parseInt(value,10);return(index>=0?index-1:index+len/3)*3}parseNormalIndex(value,len){let index=parseInt(value,10);return(index>=0?index-1:index+len/3)*3}parseUVIndex(value,len){let index=parseInt(value,10);return(index>=0?index-1:index+len/2)*2}addFace(a,b,c,ua,ub,uc,na,nb,nc){let geometry=this.object.geometry,vLen=this.vertices.length,nLen=this.normals.length,uLen=this.uvs.length,iva=this.parseVertexIndex(a,vLen),ivb=this.parseVertexIndex(b,vLen),ivc=this.parseVertexIndex(c,vLen),ina=na===void 0?void 0:this.parseNormalIndex(na,nLen),inb=nb===void 0?void 0:this.parseNormalIndex(nb,nLen),inc=nc===void 0?void 0:this.parseNormalIndex(nc,nLen),iua=ua===void 0?void 0:this.parseUVIndex(ua,uLen),iub=ub===void 0?void 0:this.parseUVIndex(ub,uLen),iuc=uc===void 0?void 0:this.parseUVIndex(uc,uLen);geometry.hasNormal===!0&&(ina===void 0||inb===void 0||inc===void 0)&&(geometry.hasNormal=!1),geometry.hasUV===!0&&(iua===void 0||iub===void 0||iuc===void 0)&&(geometry.hasUV=!1);let aKey=[iva,iua,ina].join(`:`),aIndex=geometry.indexMap[aKey];aIndex===void 0&&(aIndex=geometry.vertices.length/3,geometry.indexMap[aKey]=aIndex,geometry.vertices.push(this.vertices[iva+0],this.vertices[iva+1],this.vertices[iva+2]),geometry.hasColor&&(this.colors[iva]===void 0?geometry.hasColor=!1:geometry.colors.push(this.colors[iva+0],this.colors[iva+1],this.colors[iva+2])),geometry.hasNormal&&geometry.normals.push(this.normals[iva+0],this.normals[iva+1],this.normals[iva+2]),geometry.hasUV&&geometry.uvs.push(this.uvs[iua+0],this.uvs[iua+1])),geometry.index.push(aIndex);let bKey=[ivb,iub,inb].join(`:`),bIndex=geometry.indexMap[bKey];bIndex===void 0&&(bIndex=geometry.vertices.length/3,geometry.indexMap[bKey]=bIndex,geometry.vertices.push(this.vertices[ivb+0],this.vertices[ivb+1],this.vertices[ivb+2]),geometry.hasColor&&(this.colors[ivb]===void 0?geometry.hasColor=!1:geometry.colors.push(this.colors[ivb+0],this.colors[ivb+1],this.colors[ivb+2])),geometry.hasNormal&&geometry.normals.push(this.normals[ivb+0],this.normals[ivb+1],this.normals[ivb+2]),geometry.hasUV&&geometry.uvs.push(this.uvs[iub+0],this.uvs[iub+1])),geometry.index.push(bIndex);let cKey=[ivc,iuc,inc].join(`:`),cIndex=geometry.indexMap[cKey];cIndex===void 0&&(cIndex=geometry.vertices.length/3,geometry.indexMap[cKey]=cIndex,geometry.vertices.push(this.vertices[ivc+0],this.vertices[ivc+1],this.vertices[ivc+2]),geometry.hasColor&&(this.colors[ivc]===void 0?geometry.hasColor=!1:geometry.colors.push(this.colors[ivc+0],this.colors[ivc+1],this.colors[ivc+2])),geometry.hasNormal&&geometry.normals.push(this.normals[ivc+0],this.normals[ivc+1],this.normals[ivc+2]),geometry.hasUV&&geometry.uvs.push(this.uvs[iuc+0],this.uvs[iuc+1])),geometry.index.push(cIndex)}};function parseObj(text){let state=new ObjState;text.indexOf(`\r
|
|
384
384
|
`)!==-1&&(text=text.replace(/\r\n/g,`
|
|
385
385
|
`)),text.indexOf(`\\
|
|
386
386
|
`)!==-1&&(text=text.replace(/\\\n/g,``));let lines=text.split(`
|
|
@@ -511,7 +511,7 @@ s@?569-s@?5t69-s@?5o69-=\f(≤-A=FC-的整数,s@?-精确)s{-y|nqlopxr5
|
|
|
511
511
|
--yr-\x07-J-@?5sntP||q;\x076H--yr-\b-J-@?5sntP||q;\b6H--vs-5\x07-KJ-}nnz;prr{dvqu-\v\v-\b-KJ-}nnz;prr{Urvtu6-
|
|
512
512
|
----qvpnqH--\f--yr-r-J-yn\brh\b-7-}nnz;prr{dvqu-8-\x07jH--<<-/无点/:不改动目标像素--vs-5r-JJ-=\x07SSSSSSSS6-
|
|
513
513
|
----qvpnqH--\f--yr-p-J-r-3-=\x07SSSSH--yr--J-s@?55p-KK->>6-3-=\x07>S6-<-@>;=H--yr-t-J-s@?55p-KK-B6-3-=\x07@S6-<-C@;=H--yr-o-J-s@?5p-3-=\x07>S6-<-@>;=H--r{-rpAIs@?K59-t9-o9->;=6H\f`),SHADER_STAGE_FRAGMENT=2,COLOR_WRITE_RGB=7;function buildCompositeAdditiveShaderCode(){return transparencyWgslConstants()+`
|
|
514
|
-
`+composite_additive_default}function buildCompositeBlendShaderCode(){return composite_blend_default}function additiveColorTarget(colorFormat){return{format:colorFormat,blend:{color:{srcFactor:`one`,dstFactor:`one`,operation:`add`},alpha:{srcFactor:`zero`,dstFactor:`one`,operation:`add`}},writeMask:COLOR_WRITE_RGB}}function blendColorTarget(colorFormat){return{format:colorFormat,blend:{color:{srcFactor:`constant`,dstFactor:`one-minus-constant`,operation:`add`},alpha:{srcFactor:`zero`,dstFactor:`one`,operation:`add`}},writeMask:COLOR_WRITE_RGB}}function createAdditivePipeline(device,colorFormat){return createCompositePipeline(device,`additive`,buildCompositeAdditiveShaderCode(),additiveColorTarget(colorFormat))}function createBlendPipeline(device,colorFormat){return createCompositePipeline(device,`blend`,buildCompositeBlendShaderCode(),blendColorTarget(colorFormat))}function createCompositePipeline(device,name,code,target){let bindGroupLayout=device.createBindGroupLayout({label:`pointcloud-composite-${name}-bgl`,entries:[{binding:0,visibility:SHADER_STAGE_FRAGMENT,buffer:{type:`read-only-storage`}},{binding:1,visibility:SHADER_STAGE_FRAGMENT,buffer:{type:`uniform`}}]}),module=device.createShaderModule({label:`pointcloud-composite-${name}`,code});return{pipeline:device.createRenderPipeline({label:`pointcloud-composite-${name}`,layout:device.createPipelineLayout({bindGroupLayouts:[bindGroupLayout]}),vertex:{module,entryPoint:`vs_main`},fragment:{module,entryPoint:`fs_main`,targets:[target]},primitive:{topology:`triangle-list`}}),bindGroupLayout}}function createCompositePipelines(device,colorFormat){return{colorFormat,additive:createAdditivePipeline(device,colorFormat),blend:createBlendPipeline(device,colorFormat)}}function packRGB565(r,g,b){let r5=Math.round(r*31)&31,g6=Math.round(g*63)&63,b5=Math.round(b*31)&31;return r5<<11|g6<<5|b5}function linearToSrgb(v){return v<=.0031308?v*12.92:1.055*Math.pow(v,1/2.4)-.055}var rTable=null,gTable=null,bTable=null;function buildTables(){rTable=new Uint16Array(256),gTable=new Uint16Array(256),bTable=new Uint16Array(256);for(let i=0;i<256;i++)rTable[i]=Math.round(i/255*31)<<11,gTable[i]=Math.round(i/255*63)<<5,bTable[i]=Math.round(i/255*31)}function encodeSrgb8ToRgb565(r,g,b){return rTable===null&&buildTables(),rTable[r&255]|gTable[g&255]|bTable[b&255]}function encodeColorStyle(colorStyle){return colorStyle===`ALTITUDE`?1:colorStyle===`CONSTANT`?2:0}function encodeFloorStyle(floorStyle){return+(floorStyle===`OPACITY`)}function encodePointBack(pointBack){return pointBack===`HIDDEN`?1:pointBack===`DARK`?2:0}function encodeTileFlags(hasNormals,useAddBlend){let flags=0;return hasNormals&&(flags|=1),useAddBlend&&(flags|=8),flags}var scratchA=new Float64Array(16);function multiplyMat4(a,b,out){let a11=a[0],a12=a[4],a13=a[8],a14=a[12],a21=a[1],a22=a[5],a23=a[9],a24=a[13],a31=a[2],a32=a[6],a33=a[10],a34=a[14],a41=a[3],a42=a[7],a43=a[11],a44=a[15],b11=b[0],b12=b[4],b13=b[8],b14=b[12],b21=b[1],b22=b[5],b23=b[9],b24=b[13],b31=b[2],b32=b[6],b33=b[10],b34=b[14],b41=b[3],b42=b[7],b43=b[11],b44=b[15];return out[0]=a11*b11+a12*b21+a13*b31+a14*b41,out[4]=a11*b12+a12*b22+a13*b32+a14*b42,out[8]=a11*b13+a12*b23+a13*b33+a14*b43,out[12]=a11*b14+a12*b24+a13*b34+a14*b44,out[1]=a21*b11+a22*b21+a23*b31+a24*b41,out[5]=a21*b12+a22*b22+a23*b32+a24*b42,out[9]=a21*b13+a22*b23+a23*b33+a24*b43,out[13]=a21*b14+a22*b24+a23*b34+a24*b44,out[2]=a31*b11+a32*b21+a33*b31+a34*b41,out[6]=a31*b12+a32*b22+a33*b32+a34*b42,out[10]=a31*b13+a32*b23+a33*b33+a34*b43,out[14]=a31*b14+a32*b24+a33*b34+a34*b44,out[3]=a41*b11+a42*b21+a43*b31+a44*b41,out[7]=a41*b12+a42*b22+a43*b32+a44*b42,out[11]=a41*b13+a42*b23+a43*b33+a44*b43,out[15]=a41*b14+a42*b24+a43*b34+a44*b44,out}function invertMat4(m,out){let n11=m[0],n21=m[1],n31=m[2],n41=m[3],n12=m[4],n22=m[5],n32=m[6],n42=m[7],n13=m[8],n23=m[9],n33=m[10],n43=m[11],n14=m[12],n24=m[13],n34=m[14],n44=m[15],t11=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44,t12=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44,t13=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44,t14=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34,det=n11*t11+n21*t12+n31*t13+n41*t14;if(det===0)return out.fill(0),out;let detInv=1/det;return out[0]=t11*detInv,out[1]=(n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44)*detInv,out[2]=(n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44)*detInv,out[3]=(n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43)*detInv,out[4]=t12*detInv,out[5]=(n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44)*detInv,out[6]=(n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44)*detInv,out[7]=(n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43)*detInv,out[8]=t13*detInv,out[9]=(n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44)*detInv,out[10]=(n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44)*detInv,out[11]=(n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43)*detInv,out[12]=t14*detInv,out[13]=(n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34)*detInv,out[14]=(n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34)*detInv,out[15]=(n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33)*detInv,out}var IDENTITY=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function writeMat4(dv,offset,m){for(let i=0;i<16;i++)dv.setFloat32(offset+i*4,m[i],!0)}function writeVec4f(dv,offset,x,y,z,w){dv.setFloat32(offset,x,!0),dv.setFloat32(offset+4,y,!0),dv.setFloat32(offset+8,z,!0),dv.setFloat32(offset+12,w,!0)}function writeVec4u(dv,offset,x,y,z,w){dv.setUint32(offset,x>>>0,!0),dv.setUint32(offset+4,y>>>0,!0),dv.setUint32(offset+8,z>>>0,!0),dv.setUint32(offset+12,w>>>0,!0)}function writeClipper(dv,invOffset,metaOffset,clipper){var _a;if(clipper===void 0){writeMat4(dv,invOffset,IDENTITY),writeVec4f(dv,metaOffset,0,0,0,0);return}writeMat4(dv,invOffset,invertMat4(clipper.clippingBoxMatrix.elements,scratchA)),writeVec4f(dv,metaOffset,(_a=clipper.floorIndex)==null?-1:_a,0,0,1)}function writeTileUniformsDataView(dv,tile,viewProj,byteOffset=0){if(dv.byteLength<byteOffset+TILE.size)throw RangeError(`TileUniforms 需要 ${TILE.size} 字节,DataView 剩余 ${dv.byteLength-byteOffset} 字节`);let T=TILE.offsets,o=byteOffset;writeMat4(dv,o+T.modelMatrix,tile.modelMatrix.elements),writeVec4f(dv,o+T.bboxMin,tile.bboxMin.x,tile.bboxMin.y,tile.bboxMin.z,0),writeVec4f(dv,o+T.bboxMax,tile.bboxMax.x,tile.bboxMax.y,tile.bboxMax.z,tile.brightness),writeVec4u(dv,o+T.tilePack,tile.pointCount,encodeTileFlags(tile.hasNormals,tile.useAddBlend),tile.category,0),writeMat4(dv,o+T.mvp,multiplyMat4(viewProj.elements,tile.modelMatrix.elements,scratchA)),writeVec4f(dv,o+T.constantColor,tile.constantColor.x,tile.constantColor.y,tile.constantColor.z,1),writeVec4f(dv,o+T.colorGain,tile.colorSaturation,tile.colorBrightness,tile.outlineGain,tile.distanceGain),writeVec4u(dv,o+T.stylePack,encodeColorStyle(tile.colorStyle),encodeFloorStyle(tile.floorStyle),encodePointBack(tile.pointBack),0),writeVec4f(dv,o+T.floorPack,tile.floorIndex,tile.shownFloorIndex,tile.opacity,tile.modelAlpha),writeVec4f(dv,o+T.alphaPack,tile.alpha,0,0,0);let clippers=tile.clippers;writeClipper(dv,o+T.clip0Inv,o+T.clip0Meta,clippers.length>0?clippers[0]:void 0),writeClipper(dv,o+T.clip1Inv,o+T.clip1Meta,clippers.length>1?clippers[1]:void 0)}function clamp01(v){return v>0?v<1?v:1:0}var PointCloudComputeRenderer=class{get colorFormat(){return this.format}constructor(device,format){this.width=0,this.height=0,this.pointBuffer=null,this.colorBuffer=null,this.normalBuffer=null,this.framebuffer=null,this.clearBindGroup=null,this.rasterizeBindGroup=null,this.displayBindGroup=null,this.pointCount=0,this.frameUniformScratch=new ArrayBuffer(FRAME.size),this.tileUniformScratch=new ArrayBuffer(TILE.size),this.pointSizeUniformState={sizeMode:1,pointScale:.02,pointMinPixel:0,pointMaxPixel:40,pixelRatio:1,resolutionY:1,hardPixelMax:12,pointShape:1,maxDisplayBoost:1},this.ready=!1,this.binnedCore=null,this.frameViewProj=new three_webgpu.Matrix4,this.pointCloudCache=new Map,this.rasterizeBindGroupCache=new Map,this.tileUniformBufferCache=new Map,this.tileDisposeListeners=new Map,this.packedColorScratch=new Uint32Array,this.packedNormalScratch=new Uint32Array,this.tmpVec3c=new three_webgpu.Vector3,this.tmpVec3d=new three_webgpu.Vector3,this.currentTileKey=null,this.compositePipelines=null,this.compositeBindGroups=null,this.layerClearBindGroup=null,this.stageReady={blend:!1,additive:!1},this.device=device,this.format=format,this.transparency=new TransparencyBuffers(device),this.frameUniformBuffer=device.createBuffer({size:FRAME.size,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.displayParamsBuffer=device.createBuffer({size:8,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let uniformView=new DataView(this.frameUniformScratch),identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);new Float32Array(this.frameUniformScratch,0,16).set(identity);let F=FRAME.offsets;uniformView.setUint32(F.screenInfo,0,!0),uniformView.setUint32(F.screenInfo+4,0,!0),uniformView.setUint32(F.screenInfo+12,this.pointSizeUniformState.sizeMode,!0),uniformView.setFloat32(F.sizeInfo0,this.pointSizeUniformState.pointScale,!0),uniformView.setFloat32(F.sizeInfo0+4,this.pointSizeUniformState.pointMinPixel,!0),uniformView.setFloat32(F.sizeInfo0+8,this.pointSizeUniformState.pointMaxPixel,!0),uniformView.setFloat32(F.sizeInfo0+12,this.pointSizeUniformState.pixelRatio,!0),uniformView.setUint32(F.sizeInfo1,Math.round(this.pointSizeUniformState.resolutionY),!0),uniformView.setUint32(F.sizeInfo1+4,Math.round(this.pointSizeUniformState.hardPixelMax),!0),uniformView.setUint32(F.sizeInfo1+8,this.pointSizeUniformState.pointShape,!0),device.queue.writeBuffer(this.frameUniformBuffer,0,this.frameUniformScratch);let clearModule=device.createShaderModule({code:UNIFORM_WGSL+clear_default}),fullscreenQuadModule=device.createShaderModule({code:fullscreenQuad_default});this.clearPipeline=device.createComputePipeline({layout:`auto`,compute:{module:clearModule,entryPoint:`main`}}),this.tileBindGroupLayout=device.createBindGroupLayout({label:`pointcloud-tile-bgl`,entries:tileBindGroupLayoutEntries(!0)}),this.fullscreenQuadPipeline=device.createRenderPipeline({layout:`auto`,vertex:{module:fullscreenQuadModule,entryPoint:`vs_main`},fragment:{module:fullscreenQuadModule,entryPoint:`fs_main`,targets:[{format:this.format}]},primitive:{topology:`triangle-list`},depthStencil:{format:`depth24plus`,depthWriteEnabled:!0,depthCompare:`less`}}),this.placeholderGradientTexture=device.createTexture({size:{width:1,height:1},format:`rgba8unorm`,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),this.placeholderGradientView=this.placeholderGradientTexture.createView(),device.queue.writeTexture({texture:this.placeholderGradientTexture},new Uint8Array([128,128,128,255]),{offset:0,bytesPerRow:4},{width:1,height:1,depthOrArrayLayers:1}),this.gradientSampler=device.createSampler({magFilter:`linear`,minFilter:`linear`,addressModeU:`clamp-to-edge`,addressModeV:`clamp-to-edge`})}setPointCloud(cacheKey,positions,colors,count,versions,rasterResources){var _a,_b,_c,_d;let positionsVersion=(_a=versions==null?void 0:versions.positionsVersion)==null?0:_a,colorsVersion=(_b=versions==null?void 0:versions.colorsVersion)==null?0:_b,styleRevision=(_c=cacheKey.styleRevision)==null?0:_c,cached=this.pointCloudCache.get(cacheKey);if(cached&&cached.count===count&&cached.positionsRef===positions&&cached.colorsRef===colors&&cached.positionsVersion===positionsVersion&&cached.colorsVersion===colorsVersion&&cached.styleRevision===styleRevision)this.pointBuffer=cached.pointBuffer,this.colorBuffer=cached.colorBuffer,this.pointCount=cached.count,this.normalBuffer=cached.normalBuffer;else{cached&&(cached.pointBuffer.destroy(),cached.colorBuffer.destroy(),cached.normalBuffer.destroy(),this.rasterizeBindGroupCache.delete(cacheKey));let pointBuffer=this.device.createBuffer({size:Math.max(12,count*12),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(pointBuffer,0,positions.buffer,positions.byteOffset,count*12);let colorBuffer=this.device.createBuffer({size:Math.max(4,count*4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});if(this.packedColorScratch.length<count&&(this.packedColorScratch=new Uint32Array(count)),colors instanceof Uint8Array)for(let i=0;i<count;i++){let base=i*3;this.packedColorScratch[i]=encodeSrgb8ToRgb565(colors[base],colors[base+1],colors[base+2])}else for(let i=0;i<count;i++){let base=i*3;this.packedColorScratch[i]=packRGB565(linearToSrgb(clamp01(colors[base])),linearToSrgb(clamp01(colors[base+1])),linearToSrgb(clamp01(colors[base+2])))}this.device.queue.writeBuffer(colorBuffer,0,this.packedColorScratch.buffer,0,count*4);let normalBuffer=this.device.createBuffer({size:Math.max(4,count*4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});this.packedNormalScratch.length<count&&(this.packedNormalScratch=new Uint32Array(count));let packedNormals=this.packedNormalScratch,srcNormals=cacheKey.normals;if(require_memoryUsage._(srcNormals,count))for(let i=0;i<count;i++){let base=i*4;packedNormals[i]=srcNormals[base]&255|(srcNormals[base+1]&255)<<8|(srcNormals[base+2]&255)<<16}else for(let i=0;i<count;i++)packedNormals[i]=8323072;this.device.queue.writeBuffer(normalBuffer,0,packedNormals.buffer,packedNormals.byteOffset,count*4),this.pointCloudCache.set(cacheKey,{pointBuffer,colorBuffer,normalBuffer,count,positionsRef:positions,colorsRef:colors,positionsVersion,colorsVersion,styleRevision}),this.registerTileDisposer(cacheKey),this.pointBuffer=pointBuffer,this.colorBuffer=colorBuffer,this.normalBuffer=normalBuffer,this.pointCount=count}let gradientView=(_d=rasterResources==null?void 0:rasterResources.gradientView)==null?this.placeholderGradientView:_d,normalBuffer=this.normalBuffer;if(!normalBuffer)return;let tileUniformBuffer=this.ensureTileUniformBuffer(cacheKey);this.bindRasterizeGroup(cacheKey,tileUniformBuffer,gradientView,normalBuffer),this.ready=!!this.framebuffer&&!!this.rasterizeBindGroup}prepareFrame(totalPointCount){this.framebuffer&&(this.binnedCore||(this.binnedCore=new BinnedCore(this.device,this.tileBindGroupLayout,this.frameUniformBuffer)),this.binnedCore.prepare(totalPointCount,this.framebuffer))}beginPointCloudFrame(camera,scratchM4){scratchM4.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),this.frameViewProj.copy(scratchM4);let viewProj=this.frameViewProj.elements,dv=new DataView(this.frameUniformScratch);for(let i=0;i<16;i++)dv.setFloat32(FRAME.offsets.viewProj+i*4,viewProj[i],!0);this.writeFrameUniformsDataView(dv,camera),this.device.queue.writeBuffer(this.frameUniformBuffer,0,this.frameUniformScratch)}writeTileUniform(pc,pointCount,category,alpha){let tileBuffer=this.ensureTileUniformBuffer(pc);writeTileUniformsDataView(new DataView(this.tileUniformScratch),{modelMatrix:pc.matrixWorld,bboxMin:pc.modelBoundingMin,bboxMax:pc.modelBoundingMax,brightness:pc.brightness,pointCount,hasNormals:require_memoryUsage._(pc.normals,pointCount),category,alpha,floorIndex:pc.floorIndex,shownFloorIndex:pc.shownFloorIndex,opacity:pc.opacity,modelAlpha:pc.modelAlpha,floorStyle:pc.floorStyle,clippers:pc.clippers,colorStyle:pc.colorStyle,useAddBlend:pc.useAddBlend,constantColor:pc.constantColor,colorSaturation:pc.colorSaturation,colorBrightness:pc.colorBrightness,outlineGain:pc.outlineGain,distanceGain:pc.distanceGain,pointBack:pc.pointBack},this.frameViewProj),this.device.queue.writeBuffer(tileBuffer,0,this.tileUniformScratch)}setPointSizeParams(params){var _a;this.pointSizeUniformState.sizeMode=+(params.sizeMode===`ATTENUATION`),this.pointSizeUniformState.pointScale=Math.max(0,params.pointScale),this.pointSizeUniformState.pointMinPixel=Math.max(0,params.pointMinPixel),this.pointSizeUniformState.pointMaxPixel=Math.max(this.pointSizeUniformState.pointMinPixel,params.pointMaxPixel),this.pointSizeUniformState.pixelRatio=Math.max(.1,params.pixelRatio),this.pointSizeUniformState.resolutionY=Math.max(1,params.resolutionY),this.pointSizeUniformState.pointShape=+(params.pointShape===`CIRCLE`);let boost=(_a=params.maxDisplayBoost)==null?this.pointSizeUniformState.maxDisplayBoost:_a;this.pointSizeUniformState.maxDisplayBoost=Math.max(.1,boost),this.pointSizeUniformState.hardPixelMax=Math.round(Math.min(96,Math.max(1,this.pointSizeUniformState.pointMaxPixel*this.pointSizeUniformState.pixelRatio)))}getPlaceholderGradientView(){return this.placeholderGradientView}writePointAttenuationUniforms(dv,camera){let proj=camera.projectionMatrix.elements,view=camera.matrixWorldInverse.elements,F=FRAME.offsets;dv.setFloat32(F.pointAttenPack,-proj[11],!0),dv.setFloat32(F.pointAttenPack+4,2/proj[5],!0),dv.setFloat32(F.pointAttenPack+8,0,!0),dv.setFloat32(F.pointAttenPack+12,0,!0),dv.setFloat32(F.viewZRow,view[2],!0),dv.setFloat32(F.viewZRow+4,view[6],!0),dv.setFloat32(F.viewZRow+8,view[10],!0),dv.setFloat32(F.viewZRow+12,view[14],!0)}writeFrameUniformsDataView(dv,camera){let F=FRAME.offsets;dv.setUint32(F.screenInfo,this.width,!0),dv.setUint32(F.screenInfo+4,this.height,!0),dv.setUint32(F.screenInfo+8,0,!0),this.writePointAttenuationUniforms(dv,camera),dv.setUint32(F.screenInfo+12,this.pointSizeUniformState.sizeMode,!0),dv.setFloat32(F.sizeInfo0,this.pointSizeUniformState.pointScale,!0),dv.setFloat32(F.sizeInfo0+4,this.pointSizeUniformState.pointMinPixel,!0),dv.setFloat32(F.sizeInfo0+8,this.pointSizeUniformState.pointMaxPixel,!0),dv.setFloat32(F.sizeInfo0+12,this.pointSizeUniformState.pixelRatio,!0),dv.setUint32(F.sizeInfo1,Math.round(this.pointSizeUniformState.resolutionY),!0),dv.setUint32(F.sizeInfo1+4,Math.round(this.pointSizeUniformState.hardPixelMax),!0),dv.setUint32(F.sizeInfo1+8,this.pointSizeUniformState.pointShape,!0),dv.setUint32(F.sizeInfo1+12,0,!0),camera.updateMatrixWorld(!0);let camPos=camera.getWorldPosition(this.tmpVec3c);dv.setFloat32(F.cameraWorld,camPos.x,!0),dv.setFloat32(F.cameraWorld+4,camPos.y,!0),dv.setFloat32(F.cameraWorld+8,camPos.z,!0),dv.setFloat32(F.cameraWorld+12,0,!0);let camFwd=this.tmpVec3d.set(0,0,-1).applyQuaternion(camera.quaternion);dv.setFloat32(F.cameraForward,camFwd.x,!0),dv.setFloat32(F.cameraForward+4,camFwd.y,!0),dv.setFloat32(F.cameraForward+8,camFwd.z,!0),dv.setFloat32(F.cameraForward+12,0,!0),this.writeRasterUniforms(dv)}writeRasterUniforms(dv){var _a,_b,_c,_d;let F=FRAME.offsets;dv.setFloat32(F.rasterParams,RASTER_CONFIG.smallThreshold,!0),dv.setFloat32(F.rasterParams+4,RASTER_CONFIG.largeThreshold,!0),dv.setFloat32(F.rasterParams+8,0,!0),dv.setFloat32(F.rasterParams+12,0,!0),dv.setUint32(F.binnedInfo,(_b=(_a=this.binnedCore)==null?void 0:_a.bucketCapacity)==null?0:_b,!0),dv.setUint32(F.binnedInfo+4,(_d=(_c=this.binnedCore)==null?void 0:_c.subBlockCapacity)==null?0:_d,!0),dv.setUint32(F.binnedInfo+8,this.device.limits.maxComputeWorkgroupsPerDimension,!0),dv.setUint32(F.binnedInfo+12,0,!0)}resize(width,height){var _a;width<=0||height<=0||(this.width=width,this.height=height,(_a=this.framebuffer)==null||_a.destroy(),this.framebuffer=this.device.createBuffer({size:width*height*4,usage:GPUBufferUsage.STORAGE}),this.device.queue.writeBuffer(this.displayParamsBuffer,0,new Uint32Array([width,height])),this.device.queue.writeBuffer(this.frameUniformBuffer,FRAME.offsets.screenInfo,new Uint32Array([width,height])),this.rasterizeBindGroupCache.clear(),this.rasterizeBindGroup=null,this.ready=!1,this.recreateBindGroups())}encodeFramebufferClear(computePass){!this.clearBindGroup||!this.framebuffer||(computePass.setPipeline(this.clearPipeline),computePass.setBindGroup(0,this.clearBindGroup),computePass.dispatchWorkgroups(Math.ceil(this.width*this.height/256)))}encodeRasterize(computePass){this.encodeRasterizeStage(computePass,`opaque`)}encodeRasterizeStage(computePass,stage){let core=this.binnedCore;if(!core||!this.ready||!this.rasterizeBindGroup||this.pointCount<=0)return!1;if(stage===`opaque`)return core.encodeClassify(computePass,this.rasterizeBindGroup,this.pointCount),!0;if(!this.stageReady[stage])return!1;let tileBindGroup=this.ensureTransparentTileBindGroup(stage);return tileBindGroup?core.encodeStageClassify(computePass,stage,tileBindGroup,this.pointCount):!1}ensureTransparencyBuffers(kind){return this.transparency.ensure(kind,this.width,this.height)}releaseAdditiveBuffers(){this.transparency.release(`additive`),this.stageReady.additive=!1}releaseBlendBuffers(){this.transparency.release(`layer`),this.stageReady.blend=!1,this.layerClearBindGroup=null}prepareTransparentStages(needBlend,needAdditive,depthView){return this.transparency.beginFrame(),this.resetStageReady(),needBlend&&depthView&&this.ensureTransparencyBuffers(`layer`)&&(this.stageReady.blend=this.prepareStage(`blend`,depthView)),needAdditive&&this.ensureTransparencyBuffers(`additive`)&&(this.stageReady.additive=this.prepareStage(`additive`,null)),{blend:this.stageReady.blend,additive:this.stageReady.additive}}prepareStage(stage,depthView){let core=this.binnedCore;if(!core||!this.framebuffer)return!1;let buffers={additive:this.transparency.additive,layer:this.transparency.layer};return core.prepareStage(stage,buffers,this.transparency.revision,depthView)!==null||stage===`blend`&&!this.getLayerClearBindGroup()?!1:this.getCompositeBindGroup(stage)!==null}getLayerClearBindGroup(){let layer=this.transparency.layer;if(!layer)return null;let revision=this.transparency.revision;return(!this.layerClearBindGroup||this.layerClearBindGroup.revision!==revision)&&(this.layerClearBindGroup={revision,bindGroup:this.device.createBindGroup({label:`pointcloud-blend-layer-clear`,layout:this.clearPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:layer}},{binding:1,resource:{buffer:this.frameUniformBuffer}}]})}),this.layerClearBindGroup.bindGroup}encodeLayerClear(computePass,bindGroup){computePass.setPipeline(this.clearPipeline),computePass.setBindGroup(0,bindGroup),computePass.dispatchWorkgroups(Math.ceil(this.width*this.height/256))}getCompositePipelines(){if(this.compositePipelines===null)try{this.compositePipelines=createCompositePipelines(this.device,this.format)}catch(e){this.compositePipelines=e instanceof Error?e:Error(String(e)),console.error(`[PointCloudComputeRenderer] failed to create composite pipelines:`,e)}return this.compositePipelines instanceof Error?null:this.compositePipelines}getCompositeBindGroup(stage){let pipelines=this.getCompositePipelines();if(!pipelines)return null;let buffer=stage===`blend`?this.transparency.layer:this.transparency.additive;if(!buffer)return null;let revision=this.transparency.revision;(!this.compositeBindGroups||this.compositeBindGroups.revision!==revision)&&(this.compositeBindGroups={revision,additive:null,blend:null});let cache=this.compositeBindGroups,bindGroup=cache[stage];return bindGroup||(bindGroup=this.device.createBindGroup({label:`pointcloud-composite-${stage}`,layout:pipelines[stage].bindGroupLayout,entries:[{binding:0,resource:{buffer}},{binding:1,resource:{buffer:this.displayParamsBuffer}}]}),cache[stage]=bindGroup),bindGroup}ensureTransparentTileBindGroup(stage){let key=this.currentTileKey,core=this.binnedCore;if(!key||!core)return null;let entry=this.rasterizeBindGroupCache.get(key);if(!entry||entry.bindGroup!==this.rasterizeBindGroup)return null;if(entry.transparentBindGroup)return entry.transparentBindGroup;let bindGroup=core.createTransparentTileBindGroup([{binding:1,resource:{buffer:this.frameUniformBuffer}},{binding:2,resource:{buffer:entry.pointBuffer}},{binding:3,resource:{buffer:entry.colorBuffer}},{binding:4,resource:entry.gradientView},{binding:5,resource:this.gradientSampler},{binding:6,resource:{buffer:entry.normalBuffer}},{binding:7,resource:{buffer:entry.tileUniformBuffer}}],stage);return bindGroup instanceof Error?null:(entry.transparentBindGroup=bindGroup,bindGroup)}encodeFramebufferDisplay(renderPass){!this.displayBindGroup||!this.framebuffer||(renderPass.setPipeline(this.fullscreenQuadPipeline),renderPass.setBindGroup(0,this.displayBindGroup),renderPass.draw(3))}submitMergedPointCloudFrame(colorTextureView,depthTextureView,rasterizeSteps,options){this.submitOpaqueStage(colorTextureView,depthTextureView,rasterizeSteps,options)}submitTransparentStages(colorTextureView,depthTextureView,groups,additiveSteps){let result={blendGroups:0,additive:!1},core=this.binnedCore;if(!core)return result;groups.length>0&&!this.stageReady.blend&&depthTextureView&&this.ensureTransparencyBuffers(`layer`)&&(this.stageReady.blend=this.prepareStage(`blend`,depthTextureView)),additiveSteps&&!this.stageReady.additive&&this.ensureTransparencyBuffers(`additive`)&&(this.stageReady.additive=this.prepareStage(`additive`,null));let pipelines=this.getCompositePipelines();if(!pipelines)return this.resetStageReady(),result;let layerClearBG=groups.length>0&&this.stageReady.blend?this.getLayerClearBindGroup():null,blendBG=layerClearBG?this.getCompositeBindGroup(`blend`):null,runBlend=!!layerClearBG&&!!blendBG,additiveBG=additiveSteps&&this.stageReady.additive?this.getCompositeBindGroup(`additive`):null,additivePlanes=this.transparency.additive,runAdditive=!!additiveSteps&&!!additiveBG&&!!additivePlanes;if(!runBlend&&!runAdditive)return this.resetStageReady(),result;let blendCount=runBlend?groups.length:0,encoder=this.device.createCommandEncoder({label:`pointcloud-transparent-stages`});for(let g=0;g<blendCount;g++){let group=groups[g];core.encodeClearCounters(encoder);let pass=encoder.beginComputePass({label:`pointcloud-blend-compute`});this.encodeLayerClear(pass,layerClearBG),group.steps(pass),core.encodeStageCoop(pass,`blend`),pass.end(),this.encodeComposite(encoder,colorTextureView,pipelines.blend.pipeline,blendBG,`pointcloud-blend-composite`,group.alpha)}if(result.blendGroups=blendCount,runAdditive){encoder.clearBuffer(additivePlanes),core.encodeClearCounters(encoder);let pass=encoder.beginComputePass({label:`pointcloud-additive-compute`});additiveSteps(pass),core.encodeStageCoop(pass,`additive`),pass.end(),this.encodeComposite(encoder,colorTextureView,pipelines.additive.pipeline,additiveBG,`pointcloud-additive-composite`),result.additive=!0}return this.device.queue.submit([encoder.finish()]),this.resetStageReady(),result}encodeComposite(encoder,colorView,pipeline,bindGroup,label,blendConstant){let pass=encoder.beginRenderPass({label,colorAttachments:[{view:colorView,loadOp:`load`,storeOp:`store`}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),blendConstant!==void 0&&pass.setBlendConstant({r:blendConstant,g:blendConstant,b:blendConstant,a:blendConstant}),pass.draw(3),pass.end()}resetStageReady(){this.stageReady.blend=!1,this.stageReady.additive=!1}submitOpaqueStage(colorTextureView,depthTextureView,rasterizeSteps,options){var _a,_b;let core=this.binnedCore;if(!core)return;let shouldClear=(_a=options==null?void 0:options.clear)==null?!0:_a,shouldDisplay=(_b=options==null?void 0:options.display)==null?!0:_b,encoder=this.device.createCommandEncoder();core.encodeClearCounters(encoder);let computePass=encoder.beginComputePass();if(shouldClear&&this.encodeFramebufferClear(computePass),rasterizeSteps(computePass),core.encodeCoop(computePass),computePass.end(),shouldDisplay){let renderPass=encoder.beginRenderPass({colorAttachments:[{view:colorTextureView,loadOp:`load`,storeOp:`store`}],depthStencilAttachment:{view:depthTextureView,depthLoadOp:`load`,depthStoreOp:`store`}});this.encodeFramebufferDisplay(renderPass),renderPass.end()}this.device.queue.submit([encoder.finish()])}dispose(){var _a,_b;(_a=this.binnedCore)==null||_a.dispose(),this.binnedCore=null,this.transparency.dispose(),this.compositeBindGroups=null,this.layerClearBindGroup=null,this.compositePipelines=null,this.currentTileKey=null,this.resetStageReady();for(let[key,listener]of this.tileDisposeListeners)try{key.removeEventListener(`dispose`,listener)}catch(_c){}this.tileDisposeListeners.clear();for(let entry of this.pointCloudCache.values())entry.pointBuffer.destroy(),entry.colorBuffer.destroy(),entry.normalBuffer.destroy();this.pointCloudCache.clear();for(let buffer of this.tileUniformBufferCache.values())buffer.destroy();this.tileUniformBufferCache.clear(),this.rasterizeBindGroupCache.clear(),(_b=this.framebuffer)==null||_b.destroy(),this.frameUniformBuffer.destroy(),this.displayParamsBuffer.destroy(),this.placeholderGradientTexture.destroy(),this.pointBuffer=null,this.colorBuffer=null,this.normalBuffer=null,this.framebuffer=null,this.clearBindGroup=null,this.rasterizeBindGroup=null,this.displayBindGroup=null,this.ready=!1}registerTileDisposer(cacheKey){if(this.tileDisposeListeners.has(cacheKey))return;let target=cacheKey;if(typeof target.addEventListener!=`function`)return;let listener=()=>{this.releaseTileResources(cacheKey)};this.tileDisposeListeners.set(cacheKey,listener),target.addEventListener(`dispose`,listener)}releaseTileResources(cacheKey){let cached=this.pointCloudCache.get(cacheKey);cached&&(cached.pointBuffer.destroy(),cached.colorBuffer.destroy(),cached.normalBuffer.destroy(),this.pointCloudCache.delete(cacheKey)),this.rasterizeBindGroupCache.delete(cacheKey);let tileUniform=this.tileUniformBufferCache.get(cacheKey);tileUniform&&(tileUniform.destroy(),this.tileUniformBufferCache.delete(cacheKey));let listener=this.tileDisposeListeners.get(cacheKey);if(listener){try{cacheKey.removeEventListener(`dispose`,listener)}catch(_a){}this.tileDisposeListeners.delete(cacheKey)}}recreateBindGroups(){this.clearBindGroup=null,this.rasterizeBindGroup=null,this.displayBindGroup=null,this.ready=!1,this.framebuffer&&(this.clearBindGroup=this.device.createBindGroup({layout:this.clearPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.framebuffer}},{binding:1,resource:{buffer:this.frameUniformBuffer}}]}),this.displayBindGroup=this.device.createBindGroup({layout:this.fullscreenQuadPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.framebuffer}},{binding:1,resource:{buffer:this.displayParamsBuffer}}]}),this.ready=!1)}ensureTileUniformBuffer(cacheKey){let buffer=this.tileUniformBufferCache.get(cacheKey);return buffer||(buffer=this.device.createBuffer({size:TILE.size,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.tileUniformBufferCache.set(cacheKey,buffer),this.registerTileDisposer(cacheKey)),buffer}bindRasterizeGroup(cacheKey,tileUniformBuffer,gradientView,normalBuffer){if(!this.framebuffer||!this.pointBuffer||!this.colorBuffer){this.rasterizeBindGroup=null,this.currentTileKey=null;return}this.currentTileKey=cacheKey;let cachedBindGroup=this.rasterizeBindGroupCache.get(cacheKey);if(cachedBindGroup&&cachedBindGroup.pointBuffer===this.pointBuffer&&cachedBindGroup.colorBuffer===this.colorBuffer&&cachedBindGroup.normalBuffer===normalBuffer&&cachedBindGroup.tileUniformBuffer===tileUniformBuffer&&cachedBindGroup.gradientView===gradientView){this.rasterizeBindGroup=cachedBindGroup.bindGroup;return}let bindGroup=this.device.createBindGroup({layout:this.tileBindGroupLayout,entries:[{binding:0,resource:{buffer:this.framebuffer}},{binding:1,resource:{buffer:this.frameUniformBuffer}},{binding:2,resource:{buffer:this.pointBuffer}},{binding:3,resource:{buffer:this.colorBuffer}},{binding:4,resource:gradientView},{binding:5,resource:this.gradientSampler},{binding:6,resource:{buffer:normalBuffer}},{binding:7,resource:{buffer:tileUniformBuffer}}]});this.rasterizeBindGroupCache.set(cacheKey,{bindGroup,transparentBindGroup:null,pointBuffer:this.pointBuffer,colorBuffer:this.colorBuffer,normalBuffer,tileUniformBuffer,gradientView}),this.rasterizeBindGroup=bindGroup}},DEFAULT_POINT_CLOUD_TRANSPARENCY_MODE=`blend`;function isPointCloudTransparencyMode(v){return v===`blend`||v===`opaque`}function describeValue(v){try{return typeof v==`string`?JSON.stringify(v):String(v)}catch(_a){return`<${typeof v}>`}}var TransparencySettings=class{constructor(){this.needsRender=!1,this.pendingBlendRelease=!1,this._mode=DEFAULT_POINT_CLOUD_TRANSPARENCY_MODE}get mode(){return this._mode}set mode(value){if(!isPointCloudTransparencyMode(value)){console.warn(`[Five] pointCloudTransparencyMode 只接受 'blend' 或 'opaque',收到 ${describeValue(value)},保持 '${this._mode}'。`);return}value!==this._mode&&(this._mode===`blend`&&value===`opaque`&&(this.pendingBlendRelease=!0),this._mode=value,this.needsRender=!0)}};function classifyBlock(block,cameraForwardY,mode,blendLayerAvailable,additiveBufferAvailable){let alpha=pointAlpha(block.opacity,floorOpacity(block,cameraForwardY),block.modelAlpha);return!isSelectedFloor(block.floorIndex,block.shownFloorIndex)&&block.floorStyle!==`OPACITY`||isAlphaCulled(alpha)?{kind:`skip`,alpha}:block.useAddBlend?{kind:additiveBufferAvailable?`additive`:`skip`,alpha}:alpha<1&&mode===`blend`&&blendLayerAvailable?{kind:`blend`,alpha}:{kind:`opaque`,alpha}}function classifyBlocks(input){let{cameraForwardY,mode,blendLayerAvailable,additiveBufferAvailable}=input,blocks=Array(input.blocks.length),hasAdditive=!1,hasBlend=!1;for(let i=0;i<input.blocks.length;i++){let c=classifyBlock(input.blocks[i],cameraForwardY,mode,blendLayerAvailable,additiveBufferAvailable);blocks[i]=c,c.kind===`additive`?hasAdditive=!0:c.kind===`blend`&&(hasBlend=!0)}return{blocks,hasAdditive,hasBlend}}function tileCategoryOf(kind){switch(kind){case`opaque`:return TILE_CATEGORY.OPAQUE;case`additive`:return TILE_CATEGORY.ADDITIVE;case`blend`:return TILE_CATEGORY.BLEND;default:return null}}function normalizeFloorIndex(f){return Number.isFinite(f)&&f!==0?f:0}function distanceToBox(box,p){let sq=0;for(let k=0;k<3;k++){let c=Math.max(box[k],Math.min(p[k],box[k+3])),d=p[k]-c;sq+=d*d}return Math.sqrt(sq)}function groupBlendBlocks(blocks,cameraPos){let map=new Map;for(let b of blocks){let floorIndex=normalizeFloorIndex(b.floorIndex),alpha=Math.fround(b.alpha),key=`${floorIndex}|${alpha}`,g=map.get(key);g||(g={floorIndex,alpha,box:null,blockIndices:[]},map.set(key,g)),g.blockIndices.push(b.index);let wb=b.worldBox;if(wb)if(!g.box)g.box=[wb[0],wb[1],wb[2],wb[3],wb[4],wb[5]];else for(let k=0;k<3;k++)g.box[k]=Math.min(g.box[k],wb[k]),g.box[k+3]=Math.max(g.box[k+3],wb[k+3])}let groups=[];return map.forEach(g=>{groups.push({floorIndex:g.floorIndex,alpha:g.alpha,distance:g.box?distanceToBox(g.box,cameraPos):Number.MAX_VALUE,blockIndices:g.blockIndices.sort((x,y)=>x-y)})}),groups.sort((x,y)=>x.distance===y.distance?x.floorIndex===y.floorIndex?x.alpha-y.alpha:x.floorIndex-y.floorIndex:y.distance>x.distance?1:-1),groups}function planFrame(classification,groups){let opaque=[],additive=[],blendCount=0,blocks=classification.blocks;for(let i=0;i<blocks.length;i++){let k=blocks[i].kind;k===`opaque`?opaque.push(i):k===`additive`?additive.push(i):k===`blend`&&blendCount++}let hasAdditive=additive.length>0,hasBlend=blendCount>0,split=hasAdditive||hasBlend,steps=[{kind:`clearCounters`,stage:`opaque`},{kind:`compute`,stage:`opaque`,blockIndices:opaque},{kind:`display`}];if(!split)return steps.push({kind:`threeScene`}),{split,hasBlend,hasAdditive,groups:[],steps};steps.push({kind:`threeOpaque`});let usedGroups=hasBlend?groups:[];for(let g=0;g<usedGroups.length;g++){let group=usedGroups[g];steps.push({kind:`clearCounters`,stage:`blend`,group:g},{kind:`clearLayer`,group:g},{kind:`compute`,stage:`blend`,group:g,blockIndices:group.blockIndices.slice()},{kind:`compositeBlend`,group:g,alpha:group.alpha})}return hasAdditive&&steps.push({kind:`clearAdditive`},{kind:`clearCounters`,stage:`additive`},{kind:`compute`,stage:`additive`,blockIndices:additive},{kind:`compositeAdditive`}),steps.push({kind:`threeTransparent`}),{split,hasBlend,hasAdditive,groups:usedGroups,steps}}function planExtraBufferReleases(input){return{releaseLayerAtStart:input.pendingBlendRelease,releaseAdditiveAtEnd:!input.anyAddBlendParam}}var scratchMatrix4=new three_webgpu.Matrix4,scratchCameraPos=new three_webgpu.Vector3,scratchBox3$1=new three_webgpu.Box3,scratchCameraForward=new three_webgpu.Vector3;function worldBoxOf(pc,out){let ext=pc.getLocalBoundingBoxExtents();return ext?(out.min.set(ext[0],ext[1],ext[2]),out.max.set(ext[3],ext[4],ext[5]),out.applyMatrix4(pc.matrixWorld)):null}var FiveRenderer=class{get pointCloudTransparencyMode(){return this.transparencySettings.mode}set pointCloudTransparencyMode(value){this.transparencySettings.mode=value}get needsRender(){return this.transparencySettings.needsRender}set needsRender(value){this.transparencySettings.needsRender=value}constructor(options){var _a;this.renderMode=`default`,this.pointcloudComputeRenderer=null,this.useComputePointCloud=null,this.compositeRenderTarget=null,this.lastWidth=0,this.lastHeight=0,this.gpuTextureViewCache=new WeakMap,this.depthOnlyViewCache=new WeakMap,this.transparencySettings=new TransparencySettings,this.outputType=(_a=options==null?void 0:options.outputType)==null?three_webgpu.UnsignedByteType:_a,this.composer=new EffectComposer(options),this.composerVersion=``,this.renderMode=`default`,this.sceneRenders={default:new SceneRenderer}}render(renderer,scene,modelScene,camera,sceneUpdated){var _a,_b;let canvas=renderer.domElement,width=canvas.width,height=canvas.height;if(width<=0||height<=0)return!1;this.composer.updateStatus();let{endabledPassNumber,needsColorGBuffer,needsDepthGBuffer,version}=this.composer.status,hasPasses=endabledPassNumber>0,prevRenderTarget=renderer.getRenderTarget();if((width!==this.lastWidth||height!==this.lastHeight)&&(this.lastWidth=width,this.lastHeight=height,(_a=this.compositeRenderTarget)==null||_a.dispose(),this.compositeRenderTarget=new three_webgpu.RenderTarget(width,height,{type:this.outputType}),this.compositeRenderTarget.depthTexture=new three_webgpu.DepthTexture(width,height),(_b=this.pointcloudComputeRenderer)==null||_b.resize(width,height),sceneUpdated=!0),!this.compositeRenderTarget)return renderer.setRenderTarget(prevRenderTarget),!1;!sceneUpdated&&hasPasses&&version!==this.composerVersion&&(sceneUpdated=!0),this.composerVersion=version,sceneUpdated&&this.renderSceneToComposite(renderer,scene,modelScene,camera);let rendered=!1;return hasPasses?(this.composer.setSize(width,height),this.composer.gbuffer.clear(),needsColorGBuffer&&this.composer.gbuffer.set(`color`,this.compositeRenderTarget.texture),needsDepthGBuffer&&this.compositeRenderTarget.depthTexture&&this.composer.gbuffer.set(`depth`,this.compositeRenderTarget.depthTexture),renderer.setRenderTarget(this.composer.readBuffer),renderFullScreen(renderer,this.compositeRenderTarget.texture),rendered=this.composer.render(renderer)):sceneUpdated&&(renderer.setRenderTarget(null),renderFullScreen(renderer,this.compositeRenderTarget.texture),rendered=!0),renderer.setRenderTarget(prevRenderTarget),rendered}renderSceneToComposite(renderer,scene,modelScene,camera){if(!this.compositeRenderTarget)return;camera.updateMatrixWorld(!0),scene.updateMatrixWorld(!0);let pointClouds=[];if(scene.traverse(object=>{object instanceof require_memoryUsage.m&&pointClouds.push(object)}),pointClouds.length===0)renderer.setRenderTarget(this.compositeRenderTarget),renderer.clear(!0,!0,!0),renderer.render(scene,camera);else{if(this.useComputePointCloud===null)try{let backend=renderer.backend;this.useComputePointCloud=(backend==null?void 0:backend.isWebGPUBackend)===!0&&!!(backend!=null&&backend.device)}catch(_a){this.useComputePointCloud=!1}this.useComputePointCloud?this.renderPointCloudCompute(renderer,scene,pointClouds,camera):(renderer.setRenderTarget(this.compositeRenderTarget),renderer.clear(!0,!0,!0),renderer.render(scene,camera))}}sortByDistance(pointClouds,cameraPos){let dist=new Map;for(let pc of pointClouds)dist.set(pc,worldBoxOf(pc,scratchBox3$1)?scratchBox3$1.distanceToPoint(cameraPos):Number.MAX_VALUE);return pointClouds.slice().sort((a,b)=>dist.get(a)-dist.get(b))}renderPointCloudCompute(renderer,scene,pointClouds,camera){var _a,_b,_c;let releases=planExtraBufferReleases({anyAddBlendParam:pointClouds.some(pc=>pc.useAddBlend),pendingBlendRelease:this.transparencySettings.pendingBlendRelease});releases.releaseLayerAtStart&&this.pointcloudComputeRenderer&&(this.pointcloudComputeRenderer.releaseBlendBuffers(),this.transparencySettings.pendingBlendRelease=!1),renderer.setRenderTarget(this.compositeRenderTarget),renderer.clear(!0,!0,!0);let targetViews=this.getCompositeTargetViews(renderer),targetFormat=targetViews==null?void 0:targetViews.colorFormat;if(targetFormat&&((_a=this.pointcloudComputeRenderer)==null?void 0:_a.colorFormat)!==targetFormat)try{let device=renderer.backend.device;if(!device)return;(_b=this.pointcloudComputeRenderer)==null||_b.dispose(),this.pointcloudComputeRenderer=new PointCloudComputeRenderer(device,targetFormat),this.pointcloudComputeRenderer.resize(this.lastWidth,this.lastHeight)}catch(_d){this.pointcloudComputeRenderer=null;return}if(!this.pointcloudComputeRenderer)return;let computeRenderer=this.pointcloudComputeRenderer,framePixelRatio=Math.max(.1,camera.pixelRatio||renderer.getPixelRatio()),frameResolutionY=Math.max(1,((_c=camera.resolution)==null?void 0:_c.y)||this.lastHeight),pointCloudsToDraw=[],totalPointCount=0;for(let pc of pointClouds){if(!pc.visible||!pc.layers.test(camera.layers))continue;let visibleCount=Math.max(0,Math.min(pc.visiblePointCount,pc.numPoints));visibleCount!==0&&(pointCloudsToDraw.push(pc),totalPointCount+=visibleCount)}let plan=null,dispatchOrder=[],classification=null;if(targetViews&&pointCloudsToDraw.length>0){computeRenderer.prepareFrame(totalPointCount);let cameraWorldPos=camera.getWorldPosition(scratchCameraPos),firstPc=pointCloudsToDraw[0];dispatchOrder=this.sortByDistance(pointCloudsToDraw,cameraWorldPos),computeRenderer.setPointSizeParams({sizeMode:firstPc.pointSize,pointShape:firstPc.pointShape,pointScale:firstPc.pointScale,pointMinPixel:firstPc.pointMinPixel,pointMaxPixel:firstPc.pointMaxPixel,pixelRatio:framePixelRatio,resolutionY:frameResolutionY,maxDisplayBoost:firstPc.maxDisplayBoost});let cameraForwardY=scratchCameraForward.set(0,0,-1).applyQuaternion(camera.quaternion).y,blocks=dispatchOrder.map(pc=>({floorIndex:pc.floorIndex,shownFloorIndex:pc.shownFloorIndex,floorStyle:pc.floorStyle,opacity:pc.opacity,modelAlpha:pc.modelAlpha,useAddBlend:pc.useAddBlend})),mode=this.transparencySettings.mode,wanted=classifyBlocks({blocks,cameraForwardY,mode,blendLayerAvailable:!0,additiveBufferAvailable:!0}),availability=computeRenderer.prepareTransparentStages(wanted.hasBlend,wanted.hasAdditive,targetViews.layerDepthView);classification=classifyBlocks({blocks,cameraForwardY,mode,blendLayerAvailable:availability.blend,additiveBufferAvailable:availability.additive});let blendInputs=[],blockResults=classification.blocks;for(let i=0;i<blockResults.length;i++){if(blockResults[i].kind!==`blend`)continue;let pc=dispatchOrder[i],box=worldBoxOf(pc,scratchBox3$1);blendInputs.push({index:i,floorIndex:pc.floorIndex,alpha:blockResults[i].alpha,worldBox:box?[box.min.x,box.min.y,box.min.z,box.max.x,box.max.y,box.max.z]:null})}let groups=blendInputs.length>0?groupBlendBlocks(blendInputs,[cameraWorldPos.x,cameraWorldPos.y,cameraWorldPos.z]):[];plan=planFrame(classification,groups)}let blockIndicesOf=stage=>{if(!plan)return[];for(let step of plan.steps)if(step.kind===`compute`&&step.stage===stage)return step.blockIndices;return[]},makeSteps=(stage,indices)=>computePass=>{var _a;let blockResults=classification.blocks;for(let i of indices){let pc=dispatchOrder[i],c=blockResults[i],category=tileCategoryOf(c.kind);if(category===null)continue;let visibleCount=Math.max(0,Math.min(pc.visiblePointCount,pc.numPoints)),gradientView=(_a=this.getCachedGpuTextureView(renderer,pc.gradientTexture))==null?computeRenderer.getPlaceholderGradientView():_a;computeRenderer.setPointCloud(pc,pc.positions,pc.colors,visibleCount,{positionsVersion:pc.positionVersion,colorsVersion:pc.styleRevision},{gradientView}),computeRenderer.writeTileUniform(pc,visibleCount,category,c.alpha),computeRenderer.encodeRasterizeStage(computePass,stage)}};if(targetViews&&plan){let opaqueSteps=makeSteps(`opaque`,blockIndicesOf(`opaque`));computeRenderer.submitOpaqueStage(targetViews.colorView,targetViews.depthView,computePass=>{computeRenderer.beginPointCloudFrame(camera,scratchMatrix4),opaqueSteps(computePass)})}let hidden=[],prevAutoClear=renderer.autoClear,prevAutoClearColor=renderer.autoClearColor,prevAutoClearDepth=renderer.autoClearDepth,prevAutoClearStencil=renderer.autoClearStencil,prevOpaque=renderer.opaque,prevTransparent=renderer.transparent;try{for(let pc of pointClouds)pc.visible&&(pc.visible=!1,hidden.push(pc));if(renderer.autoClear=!1,renderer.autoClearColor=!1,renderer.autoClearDepth=!1,renderer.autoClearStencil=!1,renderer.setRenderTarget(this.compositeRenderTarget),!plan||!plan.split||!targetViews)renderer.render(scene,camera);else{renderer.opaque=!0,renderer.transparent=!1,renderer.render(scene,camera);let blendGroups=plan.groups.map(g=>({alpha:g.alpha,steps:makeSteps(`blend`,g.blockIndices)})),additiveSteps=plan.hasAdditive?makeSteps(`additive`,blockIndicesOf(`additive`)):null;computeRenderer.submitTransparentStages(targetViews.colorView,targetViews.layerDepthView,blendGroups,additiveSteps),renderer.opaque=!1,renderer.transparent=!0,renderer.setRenderTarget(this.compositeRenderTarget),renderer.render(scene,camera)}}finally{renderer.opaque=prevOpaque,renderer.transparent=prevTransparent,renderer.autoClear=prevAutoClear,renderer.autoClearColor=prevAutoClearColor,renderer.autoClearDepth=prevAutoClearDepth,renderer.autoClearStencil=prevAutoClearStencil;for(let pc of hidden)pc.visible=!0;releases.releaseAdditiveAtEnd&&computeRenderer.releaseAdditiveBuffers()}}dispose(){var _a,_b;this.composer.dispose(),(_a=this.pointcloudComputeRenderer)==null||_a.dispose(),this.pointcloudComputeRenderer=null,(_b=this.compositeRenderTarget)==null||_b.dispose(),this.compositeRenderTarget=null}getCompositeTargetViews(renderer){var _a;if(!((_a=this.compositeRenderTarget)!=null&&_a.depthTexture))return null;try{let backend=renderer.backend,colorData=backend.get(this.compositeRenderTarget.texture),depthData=backend.get(this.compositeRenderTarget.depthTexture),colorTexture=colorData==null?void 0:colorData.texture,depthTexture=depthData==null?void 0:depthData.texture;if(!colorTexture||!depthTexture)return null;let depthView=this.getCachedView(depthTexture);return{colorView:this.getCachedView(colorTexture),depthView,layerDepthView:this.getLayerDepthView(depthTexture,depthView),colorFormat:colorTexture.format}}catch(_b){return null}}getCachedGpuTextureView(renderer,texture){var _a;if(!texture)return null;try{let backend=renderer.backend,data=(_a=backend==null?void 0:backend.get)==null?void 0:_a.call(backend,texture),gpuTex=data==null?void 0:data.texture;return gpuTex?this.getCachedView(gpuTex):null}catch(_b){return null}}getLayerDepthView(depthTexture,defaultView){let format=depthTexture.format;if(format!==`depth24plus-stencil8`&&format!==`depth32float-stencil8`)return defaultView;let view=this.depthOnlyViewCache.get(depthTexture);return view||(view=depthTexture.createView({aspect:`depth-only`}),this.depthOnlyViewCache.set(depthTexture,view)),view}getCachedView(gpuTex){let view=this.gpuTextureViewCache.get(gpuTex);return view||(view=gpuTex.createView(),this.gpuTextureViewCache.set(gpuTex,view)),view}},_a$3,userAgent=typeof navigator<`u`?((_a$3=navigator==null?void 0:navigator.userAgent)==null?``:_a$3).toLowerCase():`node`;(()=>{try{let canvas=document.createElement(`canvas`);return!!(window.WebGLRenderingContext&&(canvas.getContext(`webgl`)||canvas.getContext(`experimental-webgl`)))}catch(error){return!1}})();var canWebGPU=typeof navigator<`u`&&navigator.gpu!==void 0;typeof window<`u`&&canWebGPU?navigator.gpu.requestAdapter().then(adapter=>(adapter||(canWebGPU=!1),canWebGPU)).catch(()=>(canWebGPU=!1,canWebGPU)):Promise.resolve(canWebGPU),typeof history<`u`&&`pushState`in history&&`replaceState`in history&&`state`in history;var isMobile=/android/i.test(userAgent)||/webos/i.test(userAgent)||/ipad|iphone|ipod/i.test(userAgent)||/iemobile/i.test(userAgent)||/opera mini/i.test(userAgent)||/blackberry/i.test(userAgent)||/windows phone/i.test(userAgent),BUTTON_FIELDS=[`trigger`,`grip`,`primary`,`secondary`,`pinch`],AXIS_FIELDS=[`x`,`y`];function deepFreeze(obj){for(let key of Object.keys(obj)){let value=obj[key];typeof value==`object`&&value&&!Object.isFrozen(value)&&deepFreeze(value)}return Object.freeze(obj)}function createStandardProfile(){return{buttons:{trigger:0,grip:1,primary:4,secondary:5,pinch:null},axes:{x:2,y:3},model:`auto`}}function createVisionProProfile(){return{buttons:{trigger:null,grip:null,primary:null,secondary:null,pinch:null},axes:{x:null,y:null},model:`none`}}var DEFAULT_PROFILES=deepFreeze({Pico:createStandardProfile(),Oculus:createStandardProfile(),Default:createStandardProfile(),VP:createVisionProProfile()});function detectDeviceType(ua,maxTouchPoints){try{let agent=ua===void 0?navigator.userAgent:ua,touchPoints=maxTouchPoints===void 0?navigator.maxTouchPoints:maxTouchPoints;return typeof agent==`string`?agent.includes(`PICO`)||agent.includes(`Pico`)?`Pico`:agent.includes(`Macintosh`)&&touchPoints===5?`VP`:agent.includes(`Oculus`)?`Oculus`:`Default`:`Default`}catch(_a){return`Default`}}function isValidIndex(value){return value===null||typeof value==`number`&&Number.isInteger(value)&&value>=0}function isPlainObject(value){return typeof value==`object`&&!!value}function safeWarn(warn,field){if(warn)try{warn(field)}catch(_a){}}function resolveProfile(type,override,warn){var _a;let base=(_a=DEFAULT_PROFILES[type])==null?DEFAULT_PROFILES.Default:_a,result={buttons:Object.assign({},base.buttons),axes:Object.assign({},base.axes),model:base.model};if(!isPlainObject(override))return result;let buttonsOverride=override.buttons;if(buttonsOverride!==void 0)if(isPlainObject(buttonsOverride))for(let field of BUTTON_FIELDS){let value=buttonsOverride[field];value!==void 0&&(isValidIndex(value)?result.buttons[field]=value:safeWarn(warn,`buttons.${field}`))}else safeWarn(warn,`buttons`);let axesOverride=override.axes;if(axesOverride!==void 0)if(isPlainObject(axesOverride))for(let field of AXIS_FIELDS){let value=axesOverride[field];value!==void 0&&(isValidIndex(value)?result.axes[field]=value:safeWarn(warn,`axes.${field}`))}else safeWarn(warn,`axes`);let modelOverride=override.model;return modelOverride!==void 0&&(modelOverride===`auto`||modelOverride===`none`?result.model=modelOverride:safeWarn(warn,`model`)),result}function toPublicMachineType(device){return device===`Default`?`Pico`:device}function clientWaitAsyncWithTimeout(){let{gl}=this,sync=gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE,0);return gl.flush(),new Promise((resolve,reject)=>{function test(){if(sync===null){reject();return}let res=gl.clientWaitSync(sync,gl.SYNC_FLUSH_COMMANDS_BIT,0);if(res===gl.WAIT_FAILED){gl.deleteSync(sync),reject();return}if(res===gl.TIMEOUT_EXPIRED){setTimeout(test,0);return}gl.deleteSync(sync),resolve()}test()})}function installWebGLAsyncReadFix(backend){if(detectDeviceType()===`Default`)return!1;let webglBackend=backend;if((webglBackend==null?void 0:webglBackend.isWebGLBackend)!==!0)return!1;let utils=webglBackend.utils;return!utils||typeof utils._clientWaitAsync!=`function`?!1:(utils._clientWaitAsync=clientWaitAsyncWithTimeout,!0)}var patchedContexts=new WeakSet;function installWebGLBlendEquationFix(backend){let webglBackend=backend;if((webglBackend==null?void 0:webglBackend.isWebGLBackend)!==!0)return!1;let gl=webglBackend.gl;if(!gl||typeof gl.blendEquationSeparate!=`function`||patchedContexts.has(gl))return!1;let originalBlendEquationSeparate=gl.blendEquationSeparate.bind(gl);return gl.blendEquationSeparate=(modeRGB,modeAlpha)=>{originalBlendEquationSeparate(modeRGB===void 0?gl.MAX:modeRGB,modeAlpha===void 0?gl.MAX:modeAlpha)},patchedContexts.add(gl),!0}var DEFAULT_BACKGROUND_COLOR=1579548;typeof navigator<`u`&&navigator.gpu;var InternalWebGPURenderer=class extends three_webgpu.WebGPURenderer{constructor({antialias=!1,logarithmicDepthBuffer,outputType=three_webgpu.UnsignedByteType,forceWebGL=!1}){var _a;super({antialias,alpha:!0,depth:!0,logarithmicDepthBuffer,outputType,forceWebGL}),this._backendReady=!1,this.forceWebGL=forceWebGL,forceWebGL===!1&&canWebGPU===!1&&console.warn(`设备不支持开启 WEBGPU`),this.outputColorSpace=three_webgpu.SRGBColorSpace,this.setClearColor(DEFAULT_BACKGROUND_COLOR,1);let defaultOnDeviceLost=(_a=this.onDeviceLost)==null?void 0:_a.bind(this);this.onDeviceLost=info=>{var _a;defaultOnDeviceLost==null||defaultOnDeviceLost(info);try{(_a=this.onDeviceLostCallback)==null||_a.call(this,info)}catch(error){console.error(`onDeviceLostCallback error`,error)}},this.ready=this.init().then(()=>{installWebGLAsyncReadFix(this.backend),installWebGLBlendEquationFix(this.backend),this._backendReady=!0})}get isInitialized(){return this._backendReady}get isXRCapable(){let backend=this.backend;return(backend==null?void 0:backend.isWebGPUBackend)!==!0}reconfigureContext(){if(this._backendReady!==!0)return;let backend=this.backend;if(backend&&typeof backend.updateSize==`function`)try{backend.updateSize()}catch(error){console.error(`reconfigureContext error`,error)}}},sharedProjScreenMatrix=new three_webgpu.Matrix4,sharedFrustum=new three_webgpu.Frustum,renderResolution=new three_webgpu.Vector2,clockForMixer=new WeakMap;function updateObject(object){let needsRender=!1;return object.needsRender===!0?(object.needsRender=!1,needsRender=!0):object.mixer&&object.mixer.stats.actions.inUse>0&&(needsRender=!0),needsRender}var Scene=class extends three_webgpu.Scene{constructor(){super(...arguments),this.needsRender=!1}add(...objects){return super.add(...objects)}remove(...objects){return super.remove(...objects)}update(renderer,camera){let needsRender=!1,time;return camera instanceof Camera?(time=camera.time,renderResolution.copy(camera.resolution)):(time=require_memoryUsage.p(),renderer.getSize(renderResolution)),sharedProjScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),sharedFrustum.setFromProjectionMatrix(sharedProjScreenMatrix),this.traverseVisible(object=>{if(object.setResolution&&object.setResolution(renderResolution.x,renderResolution.y),object.setTime&&object.setTime(time),object.mixer instanceof three_webgpu.AnimationMixer){let mixer=object.mixer,clock=clockForMixer.get(mixer);clock||(clock=new Clock,clockForMixer.set(mixer,clock)),clock.update(time),mixer.update(clock.getDelta())}(object instanceof three_webgpu.Mesh||object instanceof three_webgpu.Line||object instanceof three_webgpu.Points)&&(!object.frustumCulled||sharedFrustum.intersectsObject(object))&&(updateObject(object)&&(needsRender=!0),object.traverseAncestors(object=>{updateObject(object)&&(needsRender=!0)}))}),this.needsRender=needsRender,needsRender}},easeOut$2=x=>x*(2-x),sharedGeometry2$2=(()=>{let vertices=new Float32Array([-.18,0,-.18,.18,0,-.18,-.18,0,.18,.18,0,.18]),uvs=new Float32Array([1,0,0,0,1,1,0,1]),index=new Uint8Array([0,2,1,2,3,1]),sharedGeometry=new three_webgpu.BufferGeometry;return sharedGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),sharedGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),sharedGeometry.setIndex(new three_webgpu.BufferAttribute(index,1)),sharedGeometry})(),CENTER$3=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST$3=(0,three_tsl.float)(.017);function tslInside$3(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER$3.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST$3),dist)}function tslOutside$3(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER$3.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST$3),outerDist,dist))}function createPanoCircleMaterial(color){let u={baseColor:(0,three_tsl.uniform)(new three_webgpu.Color(color)),circleScale:(0,three_tsl.uniform)(1),ringScale:(0,three_tsl.uniform)(1),ringOpacity:(0,three_tsl.uniform)(1),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),progress:(0,three_tsl.uniform)(0),progressOpacity:(0,three_tsl.uniform)(0),expand0:(0,three_tsl.uniform)(0),expand1:(0,three_tsl.uniform)(0),expandOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),tapScale:(0,three_tsl.uniform)(1),tapOpacity:(0,three_tsl.uniform)(1),disable:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)(),circleColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.8).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER$3))).mul(1.5)).clamp(0,1).mul(u.tapOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.15).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.234).mul(u.circleScale).mul(u.tapScale)))),ringColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,1)).dot(vuv.sub(CENTER$3)))).clamp(0,1).mul(u.tapOpacity).mul(u.ringOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.27).mul(u.ringScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.32).mul(u.ringScale).mul(u.tapScale)))),loadAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER$3.x.sub(vuv.x),CENTER$3.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadAngle)).mul(.4).add(.1).mul(u.tapOpacity).mul(u.loadingOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.208).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),progAngle=three_tsl.PI.add((0,three_tsl.atan)(CENTER$3.x.sub(vuv.x),CENTER$3.y.sub(vuv.y))),progColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.step)(u.progress.mul(three_tsl.PI2),progAngle)).mul(.5).mul(u.tapOpacity).mul(u.progressOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.208).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),expand0Radius=(0,three_tsl.float)(.2).add((0,three_tsl.float)(.23).mul(u.expand0)),expand0Dist=(0,three_tsl.length)(CENTER$3.sub(vuv)),expand0Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand0Radius.sub(expand0Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand0.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$3(vuv,expand0Radius))),expand1Radius=(0,three_tsl.float)(.2).add((0,three_tsl.float)(.23).mul(u.expand1)),expand1Dist=(0,three_tsl.length)(CENTER$3.sub(vuv)),expand1Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand1Radius.sub(expand1Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand1.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$3(vuv,expand1Radius))),disableColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).mul(tslOutside$3(vuv,(0,three_tsl.float)(.32).mul(u.circleScale).mul(u.tapScale)))),result=(0,three_tsl.vec4)(1,1,1,0);result=(0,three_tsl.mix)(result,expand1Color,expand1Color.w),result=(0,three_tsl.mix)(result,expand0Color,expand0Color.w),result=(0,three_tsl.mix)(result,progColor,progColor.w),result=(0,three_tsl.mix)(result,loadColor,loadColor.w),result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,ringColor,ringColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.xyz.mul(u.baseColor),result.w.mul(u.opacity).mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoCircleMesh=class extends three_webgpu.Object3D{constructor(options={}){var _a,_b;super();let color=(_a=options.color)==null?16777215:_a,scale=(_b=options.scale)==null?1:_b;this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({progress:0}),this.ringMotion=new Motion({scale:1,opacity:1}),this.tapMotion=new Motion({scale:1,opacity:1}),this.loadingOpacityMotion=new Motion({opacity:0}),this.progressMotion=new Motion({progress:0}),this.progressOpacityMotion=new Motion({opacity:0}),this.opacityMotion=new Motion({opacity:0}),this.disableMotion=new Motion({progress:0});let{material,u}=createPanoCircleMaterial(color);this.panoU=u,this.panoMesh=new three_webgpu.Mesh(sharedGeometry2$2,material),this.renderOrder=-2,this.panoMesh.renderOrder=-2,this.panoMesh.position.y=.004,this.panoMesh.scale.set(scale,1,scale),this.add(this.panoMesh),this.currentStartTime=require_memoryUsage.p(),this.needsRender=!0}setProgress(progress){this.setDisabled(!1),this.setLoading(!1),this.progress!==progress&&(progress=require_memoryUsage.M(progress,0,1),this.tapMotion.ended&&(this.progress===0&&this.progressOpacityMotion.set({opacity:1},500).catch(require_memoryUsage.d),progress===0?this.progressOpacityMotion.set({opacity:0},500).catch(require_memoryUsage.d).then(()=>{this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d)}):this.progressMotion.set({progress:require_memoryUsage.M(progress*1.2,0,1)},100).catch(require_memoryUsage.d)),this.progress=progress)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},200).catch(require_memoryUsage.d))}setCurrent(current){this.current!==current&&(this.currentMotion.set({progress:+!!current},2e3).catch(require_memoryUsage.d),this.current=current,this.current===!0&&(this.currentStartTime=require_memoryUsage.p()))}setLoading(loading){this.loading!==loading&&(this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.loadingOpacityMotion.set({opacity:+!!loading},500).catch(require_memoryUsage.d))}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({progress:+!!disabled},500).catch(require_memoryUsage.d))}tap(){return this.tapMotion.ended?(this.progressOpacityMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d),this.tapMotion.setKeyframes([{progress:0,value:{scale:1,opacity:1}},{progress:.3,value:{scale:.85,opacity:.5}},{progress:.8,value:{scale:1.05,opacity:.6}},{progress:1,value:{scale:1,opacity:1}}],600).then(()=>{this.progressOpacityMotion.set({opacity:+(this.progress>0)},300).catch(require_memoryUsage.d),this.progressMotion.set({progress:this.progress},120).catch(require_memoryUsage.d)}).catch(require_memoryUsage.d)):Promise.resolve()}updateTime(time,deltaTime){if(this.progressMotion.ended||(this.progressMotion.update(time),this.panoU.progress.value=this.progressMotion.value.progress,this.needsRender=!0),this.progressOpacityMotion.ended||(this.progressOpacityMotion.update(time),this.panoU.progressOpacity.value=this.progressOpacityMotion.value.opacity,this.needsRender=!0),this.opacityMotion.ended||(this.opacityMotion.update(time),this.panoU.opacity.value=this.opacityMotion.value.opacity,this.needsRender=!0),this.visible=this.opacityMotion.value.opacity!==0,(!this.loadingOpacityMotion.ended||this.loadingOpacityMotion.value.opacity>0)&&(this.loadingOpacityMotion.update(time),this.panoU.loadingOpacity.value=this.loadingOpacityMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0),this.tapMotion.ended||(this.tapMotion.update(time),this.panoU.tapOpacity.value=this.tapMotion.value.opacity,this.panoU.tapScale.value=this.tapMotion.value.scale,this.needsRender=!0),this.current||!this.currentMotion.ended){this.currentMotion.update(time),this.panoU.expandOpacity.value=this.currentMotion.value.progress;{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let scale=1+Math.sin(Math.PI*deltaTime)/25*this.currentMotion.value.progress;this.panoU.circleScale.value=scale,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand0.value=easeOut$2(x)*this.currentMotion.value.progress,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1e3)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand1.value=easeOut$2(x)*this.currentMotion.value.progress,this.needsRender=!0}}}if(this.currentMotion.value.progress>.2&&this.progress===0&&this.loading===!1&&(time-this.currentStartTime-1e3)/2e3%5<2?this.ringMotion.getTargetKeyframe().value.scale!==.8&&this.ringMotion.set({scale:.8,opacity:0},600).catch(require_memoryUsage.d):this.ringMotion.getTargetKeyframe().value.scale!==1&&this.ringMotion.set({scale:1,opacity:1},600).catch(require_memoryUsage.d),!this.ringMotion.ended){let{scale,opacity}=this.ringMotion.value;this.ringMotion.update(time),this.panoU.ringScale.value=scale,this.panoU.ringOpacity.value=opacity,this.needsRender=!0}if(!this.disableMotion.ended){let{progress}=this.disableMotion.value;this.disableMotion.update(time),this.panoU.disable.value=progress,this.needsRender=!0}}dispose(){this.ringMotion.dispose(),this.tapMotion.dispose(),this.progressMotion.dispose(),this.progressOpacityMotion.dispose(),this.opacityMotion.dispose(),this.currentMotion.dispose(),this.panoMesh.material.dispose()}},easeOut$1=x=>x*(2-x),sharedGeometry2$1=(()=>{let vertices=new Float32Array([-.18,0,-.18,.18,0,-.18,-.18,0,.18,.18,0,.18]),uvs=new Float32Array([1,0,0,0,1,1,0,1]),index=new Uint8Array([0,2,1,2,3,1]),sharedGeometry=new three_webgpu.BufferGeometry;return sharedGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),sharedGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),sharedGeometry.setIndex(new three_webgpu.BufferAttribute(index,1)),sharedGeometry})(),CENTER$2=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST$2=(0,three_tsl.float)(.017);function tslInside$2(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER$2.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST$2),dist)}function tslOutside$2(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER$2.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST$2),outerDist,dist))}function createPanoCircleSolidMaterial(color){let u={baseColor:(0,three_tsl.uniform)(new three_webgpu.Color(color)),circleScale:(0,three_tsl.uniform)(1),circleOpacity:(0,three_tsl.uniform)(1),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),progress:(0,three_tsl.uniform)(0),progressOpacity:(0,three_tsl.uniform)(0),expand0:(0,three_tsl.uniform)(0),expand1:(0,three_tsl.uniform)(0),expandOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),tapScale:(0,three_tsl.uniform)(1),tapOpacity:(0,three_tsl.uniform)(1),disable:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)(),circleColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.8).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER$2))).mul(1.5)).clamp(0,1).mul((0,three_tsl.step)(u.progress,(0,three_tsl.float)(0))).mul(u.tapOpacity).mul(tslInside$2(vuv,(0,three_tsl.float)(.2).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$2(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),loadAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER$2.x.sub(vuv.x),CENTER$2.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadAngle)).mul(.9).add(.1).mul(u.tapOpacity).mul(u.loadingOpacity).mul(tslInside$2(vuv,(0,three_tsl.float)(.2).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$2(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),progAngle=three_tsl.PI.add((0,three_tsl.atan)(CENTER$2.x.sub(vuv.x),CENTER$2.y.sub(vuv.y))),progBarBase=(0,three_tsl.float)(1).sub((0,three_tsl.step)(u.progress.mul(three_tsl.PI2),progAngle)),r=(0,three_tsl.float)(.04),endAngle=u.progress.mul(three_tsl.PI2),startCap=(0,three_tsl.step)((0,three_tsl.length)((0,three_tsl.vec2)(CENTER$2.x.add((0,three_tsl.float)(0).sin().mul(.25)),CENTER$2.y.add((0,three_tsl.float)(0).cos().mul(.25))).sub(vuv)),r),endCap=(0,three_tsl.step)((0,three_tsl.length)((0,three_tsl.vec2)(CENTER$2.x.add(endAngle.sin().mul(.25)),CENTER$2.y.add(endAngle.cos().mul(.25))).sub(vuv)),r),progColor=(0,three_tsl.vec4)(1,1,1,progBarBase.add(startCap).add(endCap).clamp(0,1).mul(.9).mul(u.tapOpacity).mul(u.progressOpacity).mul(tslInside$2(vuv,(0,three_tsl.float)(.2).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$2(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),expand0Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.25).mul(u.expand0)),expand0Dist=(0,three_tsl.length)(CENTER$2.sub(vuv)),expand0Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand0Radius.sub(expand0Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand0.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$2(vuv,expand0Radius))),expand1Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.23).mul(u.expand1)),expand1Dist=(0,three_tsl.length)(CENTER$2.sub(vuv)),expand1Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand1Radius.sub(expand1Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand1.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$2(vuv,expand1Radius))),disableColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).mul(u.tapOpacity).mul(tslOutside$2(vuv,(0,three_tsl.float)(.32).mul(u.circleScale).mul(u.tapScale)))),result=(0,three_tsl.vec4)(1,1,1,0);result=(0,three_tsl.mix)(result,expand1Color,expand1Color.w),result=(0,three_tsl.mix)(result,expand0Color,expand0Color.w),result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,progColor,progColor.w),result=(0,three_tsl.mix)(result,loadColor,loadColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.xyz.mul(u.baseColor),result.w.mul(u.opacity).mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoCircleMeshSolid=class extends three_webgpu.Object3D{constructor(options={}){var _a,_b;super();let color=(_a=options.color)==null?16777215:_a,scale=(_b=options.scale)==null?1:_b;this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({progress:0}),this.tapMotion=new Motion({scale:1,opacity:1}),this.loadingOpacityMotion=new Motion({opacity:0}),this.progressMotion=new Motion({progress:0}),this.progressOpacityMotion=new Motion({opacity:0}),this.opacityMotion=new Motion({opacity:0}),this.disableMotion=new Motion({progress:0});let{material,u}=createPanoCircleSolidMaterial(color);this.panoU=u,this.panoMesh=new three_webgpu.Mesh(sharedGeometry2$1,material),this.renderOrder=-2,this.panoMesh.renderOrder=-2,this.panoMesh.position.y=.004,this.panoMesh.scale.set(scale,1,scale),this.add(this.panoMesh),this.currentStartTime=require_memoryUsage.p(),this.needsRender=!0}setProgress(progress){this.setDisabled(!1),this.setLoading(!1),this.progress!==progress&&(progress=require_memoryUsage.M(progress,0,1),this.tapMotion.ended&&(this.progress===0&&this.progressOpacityMotion.set({opacity:1},500).catch(require_memoryUsage.d),progress===0?this.progressOpacityMotion.set({opacity:0},500).catch(require_memoryUsage.d).then(()=>{this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d)}):this.progressMotion.set({progress:require_memoryUsage.M(progress*1.2,0,1)},100).catch(require_memoryUsage.d)),this.progress=progress)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},200).catch(require_memoryUsage.d))}setCurrent(current){this.current!==current&&(this.currentMotion.set({progress:+!!current},2e3).catch(require_memoryUsage.d),this.current=current,this.current===!0&&(this.currentStartTime=require_memoryUsage.p()))}setLoading(loading){this.loading!==loading&&(this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.loadingOpacityMotion.set({opacity:+!!loading},500).catch(require_memoryUsage.d))}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({progress:+!!disabled},500).catch(require_memoryUsage.d))}tap(){return this.tapMotion.ended?(this.progressOpacityMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d),this.tapMotion.setKeyframes([{progress:0,value:{scale:1,opacity:1}},{progress:.3,value:{scale:.85,opacity:.5}},{progress:.8,value:{scale:1.05,opacity:.6}},{progress:1,value:{scale:1,opacity:1}}],600).then(()=>{this.progressOpacityMotion.set({opacity:+(this.progress>0)},300).catch(require_memoryUsage.d),this.progressMotion.set({progress:this.progress},120).catch(require_memoryUsage.d)}).catch(require_memoryUsage.d)):Promise.resolve()}updateTime(time,deltaTime){if(this.progressMotion.ended||(this.progressMotion.update(time),this.panoU.progress.value=this.progressMotion.value.progress,this.needsRender=!0),this.progressOpacityMotion.ended||(this.progressOpacityMotion.update(time),this.panoU.progressOpacity.value=this.progressOpacityMotion.value.opacity,this.needsRender=!0),this.opacityMotion.ended||(this.opacityMotion.update(time),this.panoU.opacity.value=this.opacityMotion.value.opacity,this.needsRender=!0),this.visible=this.opacityMotion.value.opacity!==0,(!this.loadingOpacityMotion.ended||this.loadingOpacityMotion.value.opacity>0)&&(this.loadingOpacityMotion.update(time),this.panoU.loadingOpacity.value=this.loadingOpacityMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0),this.tapMotion.ended||(this.tapMotion.update(time),this.panoU.tapOpacity.value=this.tapMotion.value.opacity,this.panoU.tapScale.value=this.tapMotion.value.scale,this.needsRender=!0),this.panoU.circleOpacity.value=Math.max(.6,1-Math.max(this.loadingOpacityMotion.value.opacity,this.progressOpacityMotion.value.opacity)),this.current||!this.currentMotion.ended){this.currentMotion.update(time),this.panoU.expandOpacity.value=this.currentMotion.value.progress;{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let scale=1+Math.sin(Math.PI*deltaTime)/25*this.currentMotion.value.progress;this.panoU.circleScale.value=scale,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand0.value=easeOut$1(x)*this.currentMotion.value.progress,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1e3)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand1.value=easeOut$1(x)*this.currentMotion.value.progress,this.needsRender=!0}}}if(!this.disableMotion.ended){let{progress}=this.disableMotion.value;this.disableMotion.update(time),this.panoU.disable.value=progress,this.needsRender=!0}}dispose(){this.tapMotion.dispose(),this.progressMotion.dispose(),this.progressOpacityMotion.dispose(),this.opacityMotion.dispose(),this.currentMotion.dispose(),this.panoMesh.material.dispose()}},easeOut=x=>x*(2-x),sharedGeometry2=(()=>{let vertices=new Float32Array([-.18,0,-.18,.18,0,-.18,-.18,0,.18,.18,0,.18]),uvs=new Float32Array([1,0,0,0,1,1,0,1]),index=new Uint8Array([0,2,1,2,3,1]),sharedGeometry=new three_webgpu.BufferGeometry;return sharedGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),sharedGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),sharedGeometry.setIndex(new three_webgpu.BufferAttribute(index,1)),sharedGeometry})(),CENTER$1=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST$1=(0,three_tsl.float)(.017);function tslInside$1(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER$1.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST$1),dist)}function tslOutside$1(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER$1.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST$1),outerDist,dist))}function createPanoCircleCustomMaterial(options){let map=options.map,useBorder=options.borderWidth>0,u={baseColor:(0,three_tsl.uniform)(new three_webgpu.Color(options.color)),circleScale:(0,three_tsl.uniform)(1),circleOpacity:(0,three_tsl.uniform)(1),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),progress:(0,three_tsl.uniform)(0),progressOpacity:(0,three_tsl.uniform)(0),expand0:(0,three_tsl.uniform)(0),expand1:(0,three_tsl.uniform)(0),expandOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),tapScale:(0,three_tsl.uniform)(1),tapOpacity:(0,three_tsl.uniform)(1),disable:(0,three_tsl.uniform)(0)},uMapAlpha=(0,three_tsl.uniform)(options.mapAlpha),uBorderWidth=(0,three_tsl.uniform)(options.borderWidth),uBorderColor=(0,three_tsl.uniform)(new three_webgpu.Color(options.borderColor)),vuv=(0,three_tsl.uv)(),radius=(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale),ringInner=useBorder?tslInside$1(vuv,radius.sub(uBorderWidth.clamp(0,1).mul(radius))):tslInside$1(vuv,radius.sub((0,three_tsl.float)(.2).mul(radius))),image;if(map){let delta=radius.div(.5);image=(0,three_tsl.texture)(map,vuv.sub(CENTER$1).div(delta).add(CENTER$1)),image=(0,three_tsl.vec4)(image.rgb,image.a.mul(uMapAlpha)),options.mapUseColor&&(image=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(1)).mul(image))}else image=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(1));let circleImage;if(options.mapUseReverse)circleImage=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(1).sub(image.a));else if(useBorder){let clipAlpha=tslInside$1(vuv,radius.sub(uBorderWidth.clamp(0,1).mul(radius))),borderGradient=uBorderWidth.mul(2).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER$1)))).clamp(0,1);circleImage=(0,three_tsl.mix)((0,three_tsl.vec4)(uBorderColor,clipAlpha.mul(borderGradient)),image,image.a)}else circleImage=image;let circleColor=(0,three_tsl.vec4)(circleImage.rgb,circleImage.a.mul(u.circleOpacity).mul(u.tapOpacity).mul(tslOutside$1(vuv,radius))),disableColor=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(.5).mul(u.tapOpacity).mul(tslOutside$1(vuv,(0,three_tsl.float)(.32).mul(u.circleScale).mul(u.tapScale)))),loadingAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER$1.x.sub(vuv.x),CENTER$1.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadingGradient=(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadingAngle)).mul(.9).add(.1),loadingColor=(0,three_tsl.vec4)(u.baseColor,loadingGradient.mul(u.tapOpacity).mul(u.loadingOpacity).mul(ringInner).mul(tslOutside$1(vuv,radius))),progressAngle=three_tsl.PI.add((0,three_tsl.atan)(CENTER$1.x.sub(vuv.x),CENTER$1.y.sub(vuv.y))),progressBar=(0,three_tsl.float)(1).sub((0,three_tsl.step)(u.progress.mul(three_tsl.PI2),progressAngle)).mul(.7),progressColor=(0,three_tsl.vec4)(u.baseColor,progressBar.mul(u.tapOpacity).mul(u.progressOpacity).mul(ringInner).mul(tslOutside$1(vuv,radius))),expand0Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.25).mul(u.expand0)),expand0Dist=(0,three_tsl.length)(CENTER$1.sub(vuv)),expand0Gradient=(0,three_tsl.float)(1).sub(expand0Radius.sub(expand0Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand0.sub(.5)).mul(2)).mul(1.2).clamp(0,1)),expand0Color=(0,three_tsl.vec4)(u.baseColor,expand0Gradient.mul(u.expandOpacity).mul(tslOutside$1(vuv,expand0Radius))),expand1Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.23).mul(u.expand1)),expand1Dist=(0,three_tsl.length)(CENTER$1.sub(vuv)),expand1Gradient=(0,three_tsl.float)(1).sub(expand1Radius.sub(expand1Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand1.sub(.5)).mul(2)).mul(1.2).clamp(0,1)),expand1Color=(0,three_tsl.vec4)(u.baseColor,expand1Gradient.mul(u.expandOpacity).mul(tslOutside$1(vuv,expand1Radius))),result=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(0));result=(0,three_tsl.mix)(result,expand1Color,expand1Color.w),result=(0,three_tsl.mix)(result,expand0Color,expand0Color.w),result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,progressColor,progressColor.w),result=(0,three_tsl.mix)(result,loadingColor,loadingColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.rgb,result.a.mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoCircleMeshCustom=class extends three_webgpu.Object3D{constructor(options={}){var _a,_b,_c,_d,_e,_f,_g;super();let color=(_a=options.color)==null?16777215:_a,scale=(_b=options.scale)==null?1:_b;this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({progress:0}),this.tapMotion=new Motion({scale:1,opacity:1}),this.loadingOpacityMotion=new Motion({opacity:0}),this.progressMotion=new Motion({progress:0}),this.progressOpacityMotion=new Motion({opacity:0}),this.opacityMotion=new Motion({opacity:0}),this.disableMotion=new Motion({progress:0});let{material,u}=createPanoCircleCustomMaterial({color,map:options.map,mapAlpha:(_c=options.mapAlpha)==null?1:_c,borderWidth:(_d=options.borderWidth)==null?.1:_d,borderColor:(_e=options.borderColor)==null?16777215:_e,mapUseColor:(_f=options.mapUseColor)==null?!1:_f,mapUseReverse:(_g=options.mapUseReverse)==null?!1:_g});this.panoU=u,this.panoMesh=new three_webgpu.Mesh(sharedGeometry2,material),this.renderOrder=-2,this.panoMesh.renderOrder=-2,this.panoMesh.position.y=.004,this.panoMesh.scale.set(scale,1,scale),this.add(this.panoMesh),this.currentStartTime=require_memoryUsage.p(),this.needsRender=!0}setProgress(progress){this.setDisabled(!1),this.setLoading(!1),this.progress!==progress&&(progress=require_memoryUsage.M(progress,0,1),this.tapMotion.ended&&(this.progress===0&&this.progressOpacityMotion.set({opacity:1},500).catch(require_memoryUsage.d),progress===0?this.progressOpacityMotion.set({opacity:0},500).catch(require_memoryUsage.d).then(()=>{this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d)}):this.progressMotion.set({progress:require_memoryUsage.M(progress*1.2,0,1)},100).catch(require_memoryUsage.d)),this.progress=progress)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},200).catch(require_memoryUsage.d))}setCurrent(current){this.current!==current&&(this.currentMotion.set({progress:+!!current},2e3).catch(require_memoryUsage.d),this.current=current,this.current===!0&&(this.currentStartTime=require_memoryUsage.p()))}setLoading(loading){this.loading!==loading&&(this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.loadingOpacityMotion.set({opacity:+!!loading},500).catch(require_memoryUsage.d))}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({progress:+!!disabled},500).catch(require_memoryUsage.d))}tap(){return this.tapMotion.ended?(this.progressOpacityMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d),this.tapMotion.setKeyframes([{progress:0,value:{scale:1,opacity:1}},{progress:.3,value:{scale:.85,opacity:.5}},{progress:.8,value:{scale:1.05,opacity:.6}},{progress:1,value:{scale:1,opacity:1}}],600).then(()=>{this.progressOpacityMotion.set({opacity:+(this.progress>0)},300).catch(require_memoryUsage.d),this.progressMotion.set({progress:this.progress},120).catch(require_memoryUsage.d)}).catch(require_memoryUsage.d)):Promise.resolve()}updateTime(time,deltaTime){if(this.progressMotion.ended||(this.progressMotion.update(time),this.panoU.progress.value=this.progressMotion.value.progress,this.needsRender=!0),this.progressOpacityMotion.ended||(this.progressOpacityMotion.update(time),this.panoU.progressOpacity.value=this.progressOpacityMotion.value.opacity,this.needsRender=!0),this.opacityMotion.ended||(this.opacityMotion.update(time),this.panoU.opacity.value=this.opacityMotion.value.opacity,this.needsRender=!0),this.visible=this.opacityMotion.value.opacity!==0,(!this.loadingOpacityMotion.ended||this.loadingOpacityMotion.value.opacity>0)&&(this.loadingOpacityMotion.update(time),this.panoU.loadingOpacity.value=this.loadingOpacityMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0),this.tapMotion.ended||(this.tapMotion.update(time),this.panoU.tapOpacity.value=this.tapMotion.value.opacity,this.panoU.tapScale.value=this.tapMotion.value.scale,this.needsRender=!0),this.panoU.circleOpacity.value=Math.max(.6,1-Math.max(this.loadingOpacityMotion.value.opacity,this.progressOpacityMotion.value.opacity)),this.current||!this.currentMotion.ended){this.currentMotion.update(time),this.panoU.expandOpacity.value=this.currentMotion.value.progress;{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand0.value=easeOut(x)*this.currentMotion.value.progress,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1e3)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand1.value=easeOut(x)*this.currentMotion.value.progress,this.needsRender=!0}}}if(!this.disableMotion.ended){let{progress}=this.disableMotion.value;this.disableMotion.update(time),this.panoU.disable.value=progress,this.needsRender=!0}}dispose(){this.tapMotion.dispose(),this.progressMotion.dispose(),this.progressOpacityMotion.dispose(),this.opacityMotion.dispose(),this.currentMotion.dispose(),this.panoMesh.material.dispose()}};function isSimilarValue(value,anotherValue,circleLength){let _value=Math.abs(value-anotherValue);return _value<.001||circleLength!==void 0&&Math.abs(circleLength-_value)<.001}function notSimilarValue(value,anotherValue,circleLength){return!isSimilarValue(value,anotherValue,circleLength)}function isSimilarVector3(vector,anotherVector){return vector.distanceTo(anotherVector)<.001}function notSimilarVector3(vector,anotherVector){return!isSimilarVector3(vector,anotherVector)}function isPromise(obj){return!!obj&&(typeof obj==`object`||typeof obj==`function`)&&typeof obj.then==`function`}function createEvent(type,eventArgs){let defaultPrevented=!1,event={type,timeStamp:require_memoryUsage.p(),get defaultPrevented(){return defaultPrevented},preventDefault(){defaultPrevented=!0}};for(let key of Object.keys(eventArgs))key in event||(event[key]=eventArgs[key]);return event}var extendableEventPromisesMap=new WeakMap;function createExtendableEvent(type,eventArgs){let event=createEvent(type,Object.assign(Object.assign({},eventArgs),{waitUntil(promise){let promises=extendableEventPromisesMap.get(event);promises&&promises.push(promise)}}));return extendableEventPromisesMap.set(event,[]),event}function waitForExtendableEvent(event){var _a;return Promise.all((_a=extendableEventPromisesMap.get(event))==null?[]:_a).then(require_memoryUsage.d)}function assignState(state,fromState){state.mode=fromState.mode,state.workCode=fromState.workCode,state.panoIndex=fromState.panoIndex,state.longitude=fromState.longitude,state.latitude=fromState.latitude,state.fov=fromState.fov,state.offset.copy(fromState.offset),state.distance=fromState.distance}function stateEqual(state,equalsState){return state.workCode===equalsState.workCode&&state.mode===equalsState.mode&&state.panoIndex===equalsState.panoIndex&&isSimilarValue(state.longitude,equalsState.longitude,Math.PI*2)&&isSimilarValue(state.latitude,equalsState.latitude)&&isSimilarValue(state.fov,equalsState.fov)&&isSimilarVector3(state.offset,equalsState.offset)&&isSimilarValue(state.distance,equalsState.distance)}function assignPose(pose,fromPose){pose.longitude=fromPose.longitude,pose.latitude=fromPose.latitude,pose.fov=fromPose.fov,pose.distance=fromPose.distance,pose.offset.copy(fromPose.offset)}function clonePose(pose){return{longitude:pose.longitude,latitude:pose.latitude,fov:pose.fov,offset:pose.offset.clone(),distance:pose.distance}}function isThirdPersonMode(mode){switch(mode){case`Floorplan`:return!0;case`Mapview`:return!0;default:return!1}}function isFristPersonMode(mode){switch(mode){case`Panorama`:return!0;case`VRPanorama`:return!0;case`XRPanorama`:return!0;case`Model`:return!0;default:return!1}}function isEmptyObject(obj){for(let name in obj)return!1;return!0}var uScaleY=(0,three_tsl.uniform)(1),vuv$1=(0,three_tsl.uv)(),TAU=(0,three_tsl.float)(6.2831852),PI$1=(0,three_tsl.float)(3.1415926),theta=TAU.mul(vuv$1.x),phi=PI$1.mul(vuv$1.y.sub(.5)),dist$1=phi.cos().abs(),target=(0,three_tsl.normalize)((0,three_tsl.vec3)(theta.sin().negate().mul(dist$1),phi.sin().mul(uScaleY),theta.cos().negate().mul(dist$1))),cubemapNode=(0,three_tsl.cubeTexture)(new three_webgpu.CubeTexture,target),equirectangularMaterial=new three_webgpu.NodeMaterial;equirectangularMaterial.fragmentNode=cubemapNode,equirectangularMaterial.transparent=!0,equirectangularMaterial.depthTest=!1,equirectangularMaterial.depthWrite=!1;var equirectangularFsQuad=new FullScreenQuad(equirectangularMaterial);function renderCubeToEquirectangular(renderer,cubemap,flipY){cubemapNode.value=cubemap,uScaleY.value=flipY?-1:1,equirectangularFsQuad.render(renderer),cubemapNode.value=null}var scratchPrevClearColor$2=new three_webgpu.Color,clearColor$1=0,clearAlpha$1=1;function getRgbaDataFromCubeTexture(renderer,cubemap,flipY,rgbaData){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let renderTarget=new three_webgpu.RenderTarget(rgbaData.width,rgbaData.height,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:three_webgpu.LinearFilter,minFilter:three_webgpu.LinearFilter}),prevRenderTarget=renderer.getRenderTarget();renderer.getClearColor(scratchPrevClearColor$2);let prevClearAlpha=renderer.getClearAlpha(),preAutoClear=renderer.autoClear,preAutoClearColor=renderer.autoClearColor,preAutoClearDepth=renderer.autoClearDepth,preAutoClearStencil=renderer.autoClearStencil;renderer.autoClear=!0,renderer.autoClearColor=!0,renderer.autoClearDepth=!0,renderer.autoClearStencil=!0,renderer.setRenderTarget(renderTarget),renderer.setClearColor(clearColor$1,clearAlpha$1),renderCubeToEquirectangular(renderer,cubemap,flipY),renderer.setRenderTarget(prevRenderTarget),renderer.setClearColor(scratchPrevClearColor$2,prevClearAlpha),renderer.autoClear=preAutoClear,renderer.autoClearColor=preAutoClearColor,renderer.autoClearDepth=preAutoClearDepth,renderer.autoClearStencil=preAutoClearStencil;let pixels=yield renderer.readRenderTargetPixelsAsync(renderTarget,0,0,rgbaData.width,rgbaData.height);return rgbaData.data.set(pixels),renderTarget.dispose(),rgbaData})}var Hammer=(function(window,document,exportName,undefined){"use strict";var VENDOR_PREFIXES=[``,`webkit`,`Moz`,`MS`,`ms`,`o`],TEST_ELEMENT=document.createElement?document.createElement(`div`):undefined,TYPE_FUNCTION=`function`,round=Math.round,abs=Math.abs,now=Date.now;function setTimeoutContext(fn,timeout,context){return setTimeout(bindFn(fn,context),timeout)}function invokeArrayArg(arg,fn,context){return Array.isArray(arg)?(each(arg,context[fn],context),!0):!1}function each(obj,iterator,context){var i;if(obj)if(obj.forEach)obj.forEach(iterator,context);else if(obj.length!==undefined)for(i=0;i<obj.length;)iterator.call(context,obj[i],i,obj),i++;else for(i in obj)obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)}function deprecate(method,name,message){var deprecationMessage=`DEPRECATED METHOD: `+name+`
|
|
514
|
+
`+composite_additive_default}function buildCompositeBlendShaderCode(){return composite_blend_default}function additiveColorTarget(colorFormat){return{format:colorFormat,blend:{color:{srcFactor:`one`,dstFactor:`one`,operation:`add`},alpha:{srcFactor:`zero`,dstFactor:`one`,operation:`add`}},writeMask:COLOR_WRITE_RGB}}function blendColorTarget(colorFormat){return{format:colorFormat,blend:{color:{srcFactor:`constant`,dstFactor:`one-minus-constant`,operation:`add`},alpha:{srcFactor:`zero`,dstFactor:`one`,operation:`add`}},writeMask:COLOR_WRITE_RGB}}function createAdditivePipeline(device,colorFormat){return createCompositePipeline(device,`additive`,buildCompositeAdditiveShaderCode(),additiveColorTarget(colorFormat))}function createBlendPipeline(device,colorFormat){return createCompositePipeline(device,`blend`,buildCompositeBlendShaderCode(),blendColorTarget(colorFormat))}function createCompositePipeline(device,name,code,target){let bindGroupLayout=device.createBindGroupLayout({label:`pointcloud-composite-${name}-bgl`,entries:[{binding:0,visibility:SHADER_STAGE_FRAGMENT,buffer:{type:`read-only-storage`}},{binding:1,visibility:SHADER_STAGE_FRAGMENT,buffer:{type:`uniform`}}]}),module=device.createShaderModule({label:`pointcloud-composite-${name}`,code});return{pipeline:device.createRenderPipeline({label:`pointcloud-composite-${name}`,layout:device.createPipelineLayout({bindGroupLayouts:[bindGroupLayout]}),vertex:{module,entryPoint:`vs_main`},fragment:{module,entryPoint:`fs_main`,targets:[target]},primitive:{topology:`triangle-list`}}),bindGroupLayout}}function createCompositePipelines(device,colorFormat){return{colorFormat,additive:createAdditivePipeline(device,colorFormat),blend:createBlendPipeline(device,colorFormat)}}function packRGB565(r,g,b){let r5=Math.round(r*31)&31,g6=Math.round(g*63)&63,b5=Math.round(b*31)&31;return r5<<11|g6<<5|b5}function linearToSrgb(v){return v<=.0031308?v*12.92:1.055*Math.pow(v,1/2.4)-.055}var rTable=null,gTable=null,bTable=null;function buildTables(){rTable=new Uint16Array(256),gTable=new Uint16Array(256),bTable=new Uint16Array(256);for(let i=0;i<256;i++)rTable[i]=Math.round(i/255*31)<<11,gTable[i]=Math.round(i/255*63)<<5,bTable[i]=Math.round(i/255*31)}function encodeSrgb8ToRgb565(r,g,b){return rTable===null&&buildTables(),rTable[r&255]|gTable[g&255]|bTable[b&255]}function encodeColorStyle(colorStyle){return colorStyle===`ALTITUDE`?1:colorStyle===`CONSTANT`?2:0}function encodeFloorStyle(floorStyle){return+(floorStyle===`OPACITY`)}function encodePointBack(pointBack){return pointBack===`HIDDEN`?1:pointBack===`DARK`?2:0}function encodeTileFlags(hasNormals,useAddBlend){let flags=0;return hasNormals&&(flags|=1),useAddBlend&&(flags|=8),flags}var scratchA=new Float64Array(16);function multiplyMat4(a,b,out){let a11=a[0],a12=a[4],a13=a[8],a14=a[12],a21=a[1],a22=a[5],a23=a[9],a24=a[13],a31=a[2],a32=a[6],a33=a[10],a34=a[14],a41=a[3],a42=a[7],a43=a[11],a44=a[15],b11=b[0],b12=b[4],b13=b[8],b14=b[12],b21=b[1],b22=b[5],b23=b[9],b24=b[13],b31=b[2],b32=b[6],b33=b[10],b34=b[14],b41=b[3],b42=b[7],b43=b[11],b44=b[15];return out[0]=a11*b11+a12*b21+a13*b31+a14*b41,out[4]=a11*b12+a12*b22+a13*b32+a14*b42,out[8]=a11*b13+a12*b23+a13*b33+a14*b43,out[12]=a11*b14+a12*b24+a13*b34+a14*b44,out[1]=a21*b11+a22*b21+a23*b31+a24*b41,out[5]=a21*b12+a22*b22+a23*b32+a24*b42,out[9]=a21*b13+a22*b23+a23*b33+a24*b43,out[13]=a21*b14+a22*b24+a23*b34+a24*b44,out[2]=a31*b11+a32*b21+a33*b31+a34*b41,out[6]=a31*b12+a32*b22+a33*b32+a34*b42,out[10]=a31*b13+a32*b23+a33*b33+a34*b43,out[14]=a31*b14+a32*b24+a33*b34+a34*b44,out[3]=a41*b11+a42*b21+a43*b31+a44*b41,out[7]=a41*b12+a42*b22+a43*b32+a44*b42,out[11]=a41*b13+a42*b23+a43*b33+a44*b43,out[15]=a41*b14+a42*b24+a43*b34+a44*b44,out}function invertMat4(m,out){let n11=m[0],n21=m[1],n31=m[2],n41=m[3],n12=m[4],n22=m[5],n32=m[6],n42=m[7],n13=m[8],n23=m[9],n33=m[10],n43=m[11],n14=m[12],n24=m[13],n34=m[14],n44=m[15],t11=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44,t12=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44,t13=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44,t14=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34,det=n11*t11+n21*t12+n31*t13+n41*t14;if(det===0)return out.fill(0),out;let detInv=1/det;return out[0]=t11*detInv,out[1]=(n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44)*detInv,out[2]=(n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44)*detInv,out[3]=(n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43)*detInv,out[4]=t12*detInv,out[5]=(n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44)*detInv,out[6]=(n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44)*detInv,out[7]=(n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43)*detInv,out[8]=t13*detInv,out[9]=(n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44)*detInv,out[10]=(n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44)*detInv,out[11]=(n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43)*detInv,out[12]=t14*detInv,out[13]=(n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34)*detInv,out[14]=(n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34)*detInv,out[15]=(n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33)*detInv,out}var IDENTITY=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function writeMat4(dv,offset,m){for(let i=0;i<16;i++)dv.setFloat32(offset+i*4,m[i],!0)}function writeVec4f(dv,offset,x,y,z,w){dv.setFloat32(offset,x,!0),dv.setFloat32(offset+4,y,!0),dv.setFloat32(offset+8,z,!0),dv.setFloat32(offset+12,w,!0)}function writeVec4u(dv,offset,x,y,z,w){dv.setUint32(offset,x>>>0,!0),dv.setUint32(offset+4,y>>>0,!0),dv.setUint32(offset+8,z>>>0,!0),dv.setUint32(offset+12,w>>>0,!0)}function writeClipper(dv,invOffset,metaOffset,clipper){var _a;if(clipper===void 0){writeMat4(dv,invOffset,IDENTITY),writeVec4f(dv,metaOffset,0,0,0,0);return}writeMat4(dv,invOffset,invertMat4(clipper.clippingBoxMatrix.elements,scratchA)),writeVec4f(dv,metaOffset,(_a=clipper.floorIndex)==null?-1:_a,0,0,1)}function writeTileUniformsDataView(dv,tile,viewProj,byteOffset=0){if(dv.byteLength<byteOffset+TILE.size)throw RangeError(`TileUniforms 需要 ${TILE.size} 字节,DataView 剩余 ${dv.byteLength-byteOffset} 字节`);let T=TILE.offsets,o=byteOffset;writeMat4(dv,o+T.modelMatrix,tile.modelMatrix.elements),writeVec4f(dv,o+T.bboxMin,tile.bboxMin.x,tile.bboxMin.y,tile.bboxMin.z,0),writeVec4f(dv,o+T.bboxMax,tile.bboxMax.x,tile.bboxMax.y,tile.bboxMax.z,tile.brightness),writeVec4u(dv,o+T.tilePack,tile.pointCount,encodeTileFlags(tile.hasNormals,tile.useAddBlend),tile.category,0),writeMat4(dv,o+T.mvp,multiplyMat4(viewProj.elements,tile.modelMatrix.elements,scratchA)),writeVec4f(dv,o+T.constantColor,tile.constantColor.x,tile.constantColor.y,tile.constantColor.z,1),writeVec4f(dv,o+T.colorGain,tile.colorSaturation,tile.colorBrightness,tile.outlineGain,tile.distanceGain),writeVec4u(dv,o+T.stylePack,encodeColorStyle(tile.colorStyle),encodeFloorStyle(tile.floorStyle),encodePointBack(tile.pointBack),0),writeVec4f(dv,o+T.floorPack,tile.floorIndex,tile.shownFloorIndex,tile.opacity,tile.modelAlpha),writeVec4f(dv,o+T.alphaPack,tile.alpha,0,0,0);let clippers=tile.clippers;writeClipper(dv,o+T.clip0Inv,o+T.clip0Meta,clippers.length>0?clippers[0]:void 0),writeClipper(dv,o+T.clip1Inv,o+T.clip1Meta,clippers.length>1?clippers[1]:void 0)}function clamp01(v){return v>0?v<1?v:1:0}var PointCloudComputeRenderer=class{get colorFormat(){return this.format}constructor(device,format){this.width=0,this.height=0,this.pointBuffer=null,this.colorBuffer=null,this.normalBuffer=null,this.framebuffer=null,this.clearBindGroup=null,this.rasterizeBindGroup=null,this.displayBindGroup=null,this.pointCount=0,this.frameUniformScratch=new ArrayBuffer(FRAME.size),this.tileUniformScratch=new ArrayBuffer(TILE.size),this.pointSizeUniformState={sizeMode:1,pointScale:.02,pointMinPixel:0,pointMaxPixel:40,pixelRatio:1,resolutionY:1,hardPixelMax:12,pointShape:1,maxDisplayBoost:1},this.ready=!1,this.binnedCore=null,this.frameViewProj=new three_webgpu.Matrix4,this.pointCloudCache=new Map,this.rasterizeBindGroupCache=new Map,this.tileUniformBufferCache=new Map,this.tileDisposeListeners=new Map,this.packedColorScratch=new Uint32Array,this.packedNormalScratch=new Uint32Array,this.tmpVec3c=new three_webgpu.Vector3,this.tmpVec3d=new three_webgpu.Vector3,this.currentTileKey=null,this.compositePipelines=null,this.compositeBindGroups=null,this.layerClearBindGroup=null,this.stageReady={blend:!1,additive:!1},this.device=device,this.format=format,this.transparency=new TransparencyBuffers(device),this.frameUniformBuffer=device.createBuffer({size:FRAME.size,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.displayParamsBuffer=device.createBuffer({size:8,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let uniformView=new DataView(this.frameUniformScratch),identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);new Float32Array(this.frameUniformScratch,0,16).set(identity);let F=FRAME.offsets;uniformView.setUint32(F.screenInfo,0,!0),uniformView.setUint32(F.screenInfo+4,0,!0),uniformView.setUint32(F.screenInfo+12,this.pointSizeUniformState.sizeMode,!0),uniformView.setFloat32(F.sizeInfo0,this.pointSizeUniformState.pointScale,!0),uniformView.setFloat32(F.sizeInfo0+4,this.pointSizeUniformState.pointMinPixel,!0),uniformView.setFloat32(F.sizeInfo0+8,this.pointSizeUniformState.pointMaxPixel,!0),uniformView.setFloat32(F.sizeInfo0+12,this.pointSizeUniformState.pixelRatio,!0),uniformView.setUint32(F.sizeInfo1,Math.round(this.pointSizeUniformState.resolutionY),!0),uniformView.setUint32(F.sizeInfo1+4,Math.round(this.pointSizeUniformState.hardPixelMax),!0),uniformView.setUint32(F.sizeInfo1+8,this.pointSizeUniformState.pointShape,!0),device.queue.writeBuffer(this.frameUniformBuffer,0,this.frameUniformScratch);let clearModule=device.createShaderModule({code:UNIFORM_WGSL+clear_default}),fullscreenQuadModule=device.createShaderModule({code:fullscreenQuad_default});this.clearPipeline=device.createComputePipeline({layout:`auto`,compute:{module:clearModule,entryPoint:`main`}}),this.tileBindGroupLayout=device.createBindGroupLayout({label:`pointcloud-tile-bgl`,entries:tileBindGroupLayoutEntries(!0)}),this.fullscreenQuadPipeline=device.createRenderPipeline({layout:`auto`,vertex:{module:fullscreenQuadModule,entryPoint:`vs_main`},fragment:{module:fullscreenQuadModule,entryPoint:`fs_main`,targets:[{format:this.format}]},primitive:{topology:`triangle-list`},depthStencil:{format:`depth24plus`,depthWriteEnabled:!0,depthCompare:`less`}}),this.placeholderGradientTexture=device.createTexture({size:{width:1,height:1},format:`rgba8unorm`,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),this.placeholderGradientView=this.placeholderGradientTexture.createView(),device.queue.writeTexture({texture:this.placeholderGradientTexture},new Uint8Array([128,128,128,255]),{offset:0,bytesPerRow:4},{width:1,height:1,depthOrArrayLayers:1}),this.gradientSampler=device.createSampler({magFilter:`linear`,minFilter:`linear`,addressModeU:`clamp-to-edge`,addressModeV:`clamp-to-edge`})}setPointCloud(cacheKey,positions,colors,count,versions,rasterResources){var _a,_b,_c,_d;let positionsVersion=(_a=versions==null?void 0:versions.positionsVersion)==null?0:_a,colorsVersion=(_b=versions==null?void 0:versions.colorsVersion)==null?0:_b,styleRevision=(_c=cacheKey.styleRevision)==null?0:_c,cached=this.pointCloudCache.get(cacheKey);if(cached&&cached.count===count&&cached.positionsRef===positions&&cached.colorsRef===colors&&cached.positionsVersion===positionsVersion&&cached.colorsVersion===colorsVersion&&cached.styleRevision===styleRevision)this.pointBuffer=cached.pointBuffer,this.colorBuffer=cached.colorBuffer,this.pointCount=cached.count,this.normalBuffer=cached.normalBuffer;else{cached&&(cached.pointBuffer.destroy(),cached.colorBuffer.destroy(),cached.normalBuffer.destroy(),this.rasterizeBindGroupCache.delete(cacheKey));let pointBuffer=this.device.createBuffer({size:Math.max(12,count*12),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(pointBuffer,0,positions.buffer,positions.byteOffset,count*12);let colorBuffer=this.device.createBuffer({size:Math.max(4,count*4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});if(this.packedColorScratch.length<count&&(this.packedColorScratch=new Uint32Array(count)),colors instanceof Uint8Array)for(let i=0;i<count;i++){let base=i*3;this.packedColorScratch[i]=encodeSrgb8ToRgb565(colors[base],colors[base+1],colors[base+2])}else for(let i=0;i<count;i++){let base=i*3;this.packedColorScratch[i]=packRGB565(linearToSrgb(clamp01(colors[base])),linearToSrgb(clamp01(colors[base+1])),linearToSrgb(clamp01(colors[base+2])))}this.device.queue.writeBuffer(colorBuffer,0,this.packedColorScratch.buffer,0,count*4);let normalBuffer=this.device.createBuffer({size:Math.max(4,count*4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});this.packedNormalScratch.length<count&&(this.packedNormalScratch=new Uint32Array(count));let packedNormals=this.packedNormalScratch,srcNormals=cacheKey.normals;if(require_memoryUsage._(srcNormals,count))for(let i=0;i<count;i++){let base=i*4;packedNormals[i]=srcNormals[base]&255|(srcNormals[base+1]&255)<<8|(srcNormals[base+2]&255)<<16}else for(let i=0;i<count;i++)packedNormals[i]=8323072;this.device.queue.writeBuffer(normalBuffer,0,packedNormals.buffer,packedNormals.byteOffset,count*4),this.pointCloudCache.set(cacheKey,{pointBuffer,colorBuffer,normalBuffer,count,positionsRef:positions,colorsRef:colors,positionsVersion,colorsVersion,styleRevision}),this.registerTileDisposer(cacheKey),this.pointBuffer=pointBuffer,this.colorBuffer=colorBuffer,this.normalBuffer=normalBuffer,this.pointCount=count}let gradientView=(_d=rasterResources==null?void 0:rasterResources.gradientView)==null?this.placeholderGradientView:_d,normalBuffer=this.normalBuffer;if(!normalBuffer)return;let tileUniformBuffer=this.ensureTileUniformBuffer(cacheKey);this.bindRasterizeGroup(cacheKey,tileUniformBuffer,gradientView,normalBuffer),this.ready=!!this.framebuffer&&!!this.rasterizeBindGroup}prepareFrame(totalPointCount){this.framebuffer&&(this.binnedCore||(this.binnedCore=new BinnedCore(this.device,this.tileBindGroupLayout,this.frameUniformBuffer)),this.binnedCore.prepare(totalPointCount,this.framebuffer))}beginPointCloudFrame(camera,scratchM4){scratchM4.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),this.frameViewProj.copy(scratchM4);let viewProj=this.frameViewProj.elements,dv=new DataView(this.frameUniformScratch);for(let i=0;i<16;i++)dv.setFloat32(FRAME.offsets.viewProj+i*4,viewProj[i],!0);this.writeFrameUniformsDataView(dv,camera),this.device.queue.writeBuffer(this.frameUniformBuffer,0,this.frameUniformScratch)}writeTileUniform(pc,pointCount,category,alpha){let tileBuffer=this.ensureTileUniformBuffer(pc);writeTileUniformsDataView(new DataView(this.tileUniformScratch),{modelMatrix:pc.matrixWorld,bboxMin:pc.modelBoundingMin,bboxMax:pc.modelBoundingMax,brightness:pc.brightness,pointCount,hasNormals:require_memoryUsage._(pc.normals,pointCount),category,alpha,floorIndex:pc.floorIndex,shownFloorIndex:pc.shownFloorIndex,opacity:pc.opacity,modelAlpha:pc.modelAlpha,floorStyle:pc.floorStyle,clippers:pc.clippers,colorStyle:pc.colorStyle,useAddBlend:pc.useAddBlend,constantColor:pc.constantColor,colorSaturation:pc.colorSaturation,colorBrightness:pc.colorBrightness,outlineGain:pc.outlineGain,distanceGain:pc.distanceGain,pointBack:pc.pointBack},this.frameViewProj),this.device.queue.writeBuffer(tileBuffer,0,this.tileUniformScratch)}setPointSizeParams(params){var _a;this.pointSizeUniformState.sizeMode=+(params.sizeMode===`ATTENUATION`),this.pointSizeUniformState.pointScale=Math.max(0,params.pointScale),this.pointSizeUniformState.pointMinPixel=Math.max(0,params.pointMinPixel),this.pointSizeUniformState.pointMaxPixel=Math.max(this.pointSizeUniformState.pointMinPixel,params.pointMaxPixel),this.pointSizeUniformState.pixelRatio=Math.max(.1,params.pixelRatio),this.pointSizeUniformState.resolutionY=Math.max(1,params.resolutionY),this.pointSizeUniformState.pointShape=+(params.pointShape===`CIRCLE`);let boost=(_a=params.maxDisplayBoost)==null?this.pointSizeUniformState.maxDisplayBoost:_a;this.pointSizeUniformState.maxDisplayBoost=Math.max(.1,boost),this.pointSizeUniformState.hardPixelMax=Math.round(Math.min(96,Math.max(1,this.pointSizeUniformState.pointMaxPixel*this.pointSizeUniformState.pixelRatio)))}getPlaceholderGradientView(){return this.placeholderGradientView}writePointAttenuationUniforms(dv,camera){let proj=camera.projectionMatrix.elements,view=camera.matrixWorldInverse.elements,F=FRAME.offsets;dv.setFloat32(F.pointAttenPack,-proj[11],!0),dv.setFloat32(F.pointAttenPack+4,2/proj[5],!0),dv.setFloat32(F.pointAttenPack+8,0,!0),dv.setFloat32(F.pointAttenPack+12,0,!0),dv.setFloat32(F.viewZRow,view[2],!0),dv.setFloat32(F.viewZRow+4,view[6],!0),dv.setFloat32(F.viewZRow+8,view[10],!0),dv.setFloat32(F.viewZRow+12,view[14],!0)}writeFrameUniformsDataView(dv,camera){let F=FRAME.offsets;dv.setUint32(F.screenInfo,this.width,!0),dv.setUint32(F.screenInfo+4,this.height,!0),dv.setUint32(F.screenInfo+8,0,!0),this.writePointAttenuationUniforms(dv,camera),dv.setUint32(F.screenInfo+12,this.pointSizeUniformState.sizeMode,!0),dv.setFloat32(F.sizeInfo0,this.pointSizeUniformState.pointScale,!0),dv.setFloat32(F.sizeInfo0+4,this.pointSizeUniformState.pointMinPixel,!0),dv.setFloat32(F.sizeInfo0+8,this.pointSizeUniformState.pointMaxPixel,!0),dv.setFloat32(F.sizeInfo0+12,this.pointSizeUniformState.pixelRatio,!0),dv.setUint32(F.sizeInfo1,Math.round(this.pointSizeUniformState.resolutionY),!0),dv.setUint32(F.sizeInfo1+4,Math.round(this.pointSizeUniformState.hardPixelMax),!0),dv.setUint32(F.sizeInfo1+8,this.pointSizeUniformState.pointShape,!0),dv.setUint32(F.sizeInfo1+12,0,!0),camera.updateMatrixWorld(!0);let camPos=camera.getWorldPosition(this.tmpVec3c);dv.setFloat32(F.cameraWorld,camPos.x,!0),dv.setFloat32(F.cameraWorld+4,camPos.y,!0),dv.setFloat32(F.cameraWorld+8,camPos.z,!0),dv.setFloat32(F.cameraWorld+12,0,!0);let camFwd=this.tmpVec3d.set(0,0,-1).applyQuaternion(camera.quaternion);dv.setFloat32(F.cameraForward,camFwd.x,!0),dv.setFloat32(F.cameraForward+4,camFwd.y,!0),dv.setFloat32(F.cameraForward+8,camFwd.z,!0),dv.setFloat32(F.cameraForward+12,0,!0),this.writeRasterUniforms(dv)}writeRasterUniforms(dv){var _a,_b,_c,_d;let F=FRAME.offsets;dv.setFloat32(F.rasterParams,RASTER_CONFIG.smallThreshold,!0),dv.setFloat32(F.rasterParams+4,RASTER_CONFIG.largeThreshold,!0),dv.setFloat32(F.rasterParams+8,0,!0),dv.setFloat32(F.rasterParams+12,0,!0),dv.setUint32(F.binnedInfo,(_b=(_a=this.binnedCore)==null?void 0:_a.bucketCapacity)==null?0:_b,!0),dv.setUint32(F.binnedInfo+4,(_d=(_c=this.binnedCore)==null?void 0:_c.subBlockCapacity)==null?0:_d,!0),dv.setUint32(F.binnedInfo+8,this.device.limits.maxComputeWorkgroupsPerDimension,!0),dv.setUint32(F.binnedInfo+12,0,!0)}resize(width,height){var _a;width<=0||height<=0||(this.width=width,this.height=height,(_a=this.framebuffer)==null||_a.destroy(),this.framebuffer=this.device.createBuffer({size:width*height*4,usage:GPUBufferUsage.STORAGE}),this.device.queue.writeBuffer(this.displayParamsBuffer,0,new Uint32Array([width,height])),this.device.queue.writeBuffer(this.frameUniformBuffer,FRAME.offsets.screenInfo,new Uint32Array([width,height])),this.rasterizeBindGroupCache.clear(),this.rasterizeBindGroup=null,this.ready=!1,this.recreateBindGroups())}encodeFramebufferClear(computePass){!this.clearBindGroup||!this.framebuffer||(computePass.setPipeline(this.clearPipeline),computePass.setBindGroup(0,this.clearBindGroup),computePass.dispatchWorkgroups(Math.ceil(this.width*this.height/256)))}encodeRasterize(computePass){this.encodeRasterizeStage(computePass,`opaque`)}encodeRasterizeStage(computePass,stage){let core=this.binnedCore;if(!core||!this.ready||!this.rasterizeBindGroup||this.pointCount<=0)return!1;if(stage===`opaque`)return core.encodeClassify(computePass,this.rasterizeBindGroup,this.pointCount),!0;if(!this.stageReady[stage])return!1;let tileBindGroup=this.ensureTransparentTileBindGroup(stage);return tileBindGroup?core.encodeStageClassify(computePass,stage,tileBindGroup,this.pointCount):!1}ensureTransparencyBuffers(kind){return this.transparency.ensure(kind,this.width,this.height)}releaseAdditiveBuffers(){this.transparency.release(`additive`),this.stageReady.additive=!1}releaseBlendBuffers(){this.transparency.release(`layer`),this.stageReady.blend=!1,this.layerClearBindGroup=null}prepareTransparentStages(needBlend,needAdditive,depthView){return this.transparency.beginFrame(),this.resetStageReady(),needBlend&&depthView&&this.ensureTransparencyBuffers(`layer`)&&(this.stageReady.blend=this.prepareStage(`blend`,depthView)),needAdditive&&this.ensureTransparencyBuffers(`additive`)&&(this.stageReady.additive=this.prepareStage(`additive`,null)),{blend:this.stageReady.blend,additive:this.stageReady.additive}}prepareStage(stage,depthView){let core=this.binnedCore;if(!core||!this.framebuffer)return!1;let buffers={additive:this.transparency.additive,layer:this.transparency.layer};return core.prepareStage(stage,buffers,this.transparency.revision,depthView)!==null||stage===`blend`&&!this.getLayerClearBindGroup()?!1:this.getCompositeBindGroup(stage)!==null}getLayerClearBindGroup(){let layer=this.transparency.layer;if(!layer)return null;let revision=this.transparency.revision;return(!this.layerClearBindGroup||this.layerClearBindGroup.revision!==revision)&&(this.layerClearBindGroup={revision,bindGroup:this.device.createBindGroup({label:`pointcloud-blend-layer-clear`,layout:this.clearPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:layer}},{binding:1,resource:{buffer:this.frameUniformBuffer}}]})}),this.layerClearBindGroup.bindGroup}encodeLayerClear(computePass,bindGroup){computePass.setPipeline(this.clearPipeline),computePass.setBindGroup(0,bindGroup),computePass.dispatchWorkgroups(Math.ceil(this.width*this.height/256))}getCompositePipelines(){if(this.compositePipelines===null)try{this.compositePipelines=createCompositePipelines(this.device,this.format)}catch(e){this.compositePipelines=e instanceof Error?e:Error(String(e)),console.error(`[PointCloudComputeRenderer] failed to create composite pipelines:`,e)}return this.compositePipelines instanceof Error?null:this.compositePipelines}getCompositeBindGroup(stage){let pipelines=this.getCompositePipelines();if(!pipelines)return null;let buffer=stage===`blend`?this.transparency.layer:this.transparency.additive;if(!buffer)return null;let revision=this.transparency.revision;(!this.compositeBindGroups||this.compositeBindGroups.revision!==revision)&&(this.compositeBindGroups={revision,additive:null,blend:null});let cache=this.compositeBindGroups,bindGroup=cache[stage];return bindGroup||(bindGroup=this.device.createBindGroup({label:`pointcloud-composite-${stage}`,layout:pipelines[stage].bindGroupLayout,entries:[{binding:0,resource:{buffer}},{binding:1,resource:{buffer:this.displayParamsBuffer}}]}),cache[stage]=bindGroup),bindGroup}ensureTransparentTileBindGroup(stage){let key=this.currentTileKey,core=this.binnedCore;if(!key||!core)return null;let entry=this.rasterizeBindGroupCache.get(key);if(!entry||entry.bindGroup!==this.rasterizeBindGroup)return null;if(entry.transparentBindGroup)return entry.transparentBindGroup;let bindGroup=core.createTransparentTileBindGroup([{binding:1,resource:{buffer:this.frameUniformBuffer}},{binding:2,resource:{buffer:entry.pointBuffer}},{binding:3,resource:{buffer:entry.colorBuffer}},{binding:4,resource:entry.gradientView},{binding:5,resource:this.gradientSampler},{binding:6,resource:{buffer:entry.normalBuffer}},{binding:7,resource:{buffer:entry.tileUniformBuffer}}],stage);return bindGroup instanceof Error?null:(entry.transparentBindGroup=bindGroup,bindGroup)}encodeFramebufferDisplay(renderPass){!this.displayBindGroup||!this.framebuffer||(renderPass.setPipeline(this.fullscreenQuadPipeline),renderPass.setBindGroup(0,this.displayBindGroup),renderPass.draw(3))}submitMergedPointCloudFrame(colorTextureView,depthTextureView,rasterizeSteps,options){this.submitOpaqueStage(colorTextureView,depthTextureView,rasterizeSteps,options)}submitTransparentStages(colorTextureView,depthTextureView,groups,additiveSteps){let result={blendGroups:0,additive:!1},core=this.binnedCore;if(!core)return result;groups.length>0&&!this.stageReady.blend&&depthTextureView&&this.ensureTransparencyBuffers(`layer`)&&(this.stageReady.blend=this.prepareStage(`blend`,depthTextureView)),additiveSteps&&!this.stageReady.additive&&this.ensureTransparencyBuffers(`additive`)&&(this.stageReady.additive=this.prepareStage(`additive`,null));let pipelines=this.getCompositePipelines();if(!pipelines)return this.resetStageReady(),result;let layerClearBG=groups.length>0&&this.stageReady.blend?this.getLayerClearBindGroup():null,blendBG=layerClearBG?this.getCompositeBindGroup(`blend`):null,runBlend=!!layerClearBG&&!!blendBG,additiveBG=additiveSteps&&this.stageReady.additive?this.getCompositeBindGroup(`additive`):null,additivePlanes=this.transparency.additive,runAdditive=!!additiveSteps&&!!additiveBG&&!!additivePlanes;if(!runBlend&&!runAdditive)return this.resetStageReady(),result;let blendCount=runBlend?groups.length:0,encoder=this.device.createCommandEncoder({label:`pointcloud-transparent-stages`});for(let g=0;g<blendCount;g++){let group=groups[g];core.encodeClearCounters(encoder);let pass=encoder.beginComputePass({label:`pointcloud-blend-compute`});this.encodeLayerClear(pass,layerClearBG),group.steps(pass),core.encodeStageCoop(pass,`blend`),pass.end(),this.encodeComposite(encoder,colorTextureView,pipelines.blend.pipeline,blendBG,`pointcloud-blend-composite`,group.alpha)}if(result.blendGroups=blendCount,runAdditive){encoder.clearBuffer(additivePlanes),core.encodeClearCounters(encoder);let pass=encoder.beginComputePass({label:`pointcloud-additive-compute`});additiveSteps(pass),core.encodeStageCoop(pass,`additive`),pass.end(),this.encodeComposite(encoder,colorTextureView,pipelines.additive.pipeline,additiveBG,`pointcloud-additive-composite`),result.additive=!0}return this.device.queue.submit([encoder.finish()]),this.resetStageReady(),result}encodeComposite(encoder,colorView,pipeline,bindGroup,label,blendConstant){let pass=encoder.beginRenderPass({label,colorAttachments:[{view:colorView,loadOp:`load`,storeOp:`store`}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),blendConstant!==void 0&&pass.setBlendConstant({r:blendConstant,g:blendConstant,b:blendConstant,a:blendConstant}),pass.draw(3),pass.end()}resetStageReady(){this.stageReady.blend=!1,this.stageReady.additive=!1}submitOpaqueStage(colorTextureView,depthTextureView,rasterizeSteps,options){var _a,_b;let core=this.binnedCore;if(!core)return;let shouldClear=(_a=options==null?void 0:options.clear)==null?!0:_a,shouldDisplay=(_b=options==null?void 0:options.display)==null?!0:_b,encoder=this.device.createCommandEncoder();core.encodeClearCounters(encoder);let computePass=encoder.beginComputePass();if(shouldClear&&this.encodeFramebufferClear(computePass),rasterizeSteps(computePass),core.encodeCoop(computePass),computePass.end(),shouldDisplay){let renderPass=encoder.beginRenderPass({colorAttachments:[{view:colorTextureView,loadOp:`load`,storeOp:`store`}],depthStencilAttachment:{view:depthTextureView,depthLoadOp:`load`,depthStoreOp:`store`}});this.encodeFramebufferDisplay(renderPass),renderPass.end()}this.device.queue.submit([encoder.finish()])}dispose(){var _a,_b;(_a=this.binnedCore)==null||_a.dispose(),this.binnedCore=null,this.transparency.dispose(),this.compositeBindGroups=null,this.layerClearBindGroup=null,this.compositePipelines=null,this.currentTileKey=null,this.resetStageReady();for(let[key,listener]of this.tileDisposeListeners)try{key.removeEventListener(`dispose`,listener)}catch(_c){}this.tileDisposeListeners.clear();for(let entry of this.pointCloudCache.values())entry.pointBuffer.destroy(),entry.colorBuffer.destroy(),entry.normalBuffer.destroy();this.pointCloudCache.clear();for(let buffer of this.tileUniformBufferCache.values())buffer.destroy();this.tileUniformBufferCache.clear(),this.rasterizeBindGroupCache.clear(),(_b=this.framebuffer)==null||_b.destroy(),this.frameUniformBuffer.destroy(),this.displayParamsBuffer.destroy(),this.placeholderGradientTexture.destroy(),this.pointBuffer=null,this.colorBuffer=null,this.normalBuffer=null,this.framebuffer=null,this.clearBindGroup=null,this.rasterizeBindGroup=null,this.displayBindGroup=null,this.ready=!1}registerTileDisposer(cacheKey){if(this.tileDisposeListeners.has(cacheKey))return;let target=cacheKey;if(typeof target.addEventListener!=`function`)return;let listener=()=>{this.releaseTileResources(cacheKey)};this.tileDisposeListeners.set(cacheKey,listener),target.addEventListener(`dispose`,listener)}releaseTileResources(cacheKey){let cached=this.pointCloudCache.get(cacheKey);cached&&(cached.pointBuffer.destroy(),cached.colorBuffer.destroy(),cached.normalBuffer.destroy(),this.pointCloudCache.delete(cacheKey)),this.rasterizeBindGroupCache.delete(cacheKey);let tileUniform=this.tileUniformBufferCache.get(cacheKey);tileUniform&&(tileUniform.destroy(),this.tileUniformBufferCache.delete(cacheKey));let listener=this.tileDisposeListeners.get(cacheKey);if(listener){try{cacheKey.removeEventListener(`dispose`,listener)}catch(_a){}this.tileDisposeListeners.delete(cacheKey)}}recreateBindGroups(){this.clearBindGroup=null,this.rasterizeBindGroup=null,this.displayBindGroup=null,this.ready=!1,this.framebuffer&&(this.clearBindGroup=this.device.createBindGroup({layout:this.clearPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.framebuffer}},{binding:1,resource:{buffer:this.frameUniformBuffer}}]}),this.displayBindGroup=this.device.createBindGroup({layout:this.fullscreenQuadPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.framebuffer}},{binding:1,resource:{buffer:this.displayParamsBuffer}}]}),this.ready=!1)}ensureTileUniformBuffer(cacheKey){let buffer=this.tileUniformBufferCache.get(cacheKey);return buffer||(buffer=this.device.createBuffer({size:TILE.size,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.tileUniformBufferCache.set(cacheKey,buffer),this.registerTileDisposer(cacheKey)),buffer}bindRasterizeGroup(cacheKey,tileUniformBuffer,gradientView,normalBuffer){if(!this.framebuffer||!this.pointBuffer||!this.colorBuffer){this.rasterizeBindGroup=null,this.currentTileKey=null;return}this.currentTileKey=cacheKey;let cachedBindGroup=this.rasterizeBindGroupCache.get(cacheKey);if(cachedBindGroup&&cachedBindGroup.pointBuffer===this.pointBuffer&&cachedBindGroup.colorBuffer===this.colorBuffer&&cachedBindGroup.normalBuffer===normalBuffer&&cachedBindGroup.tileUniformBuffer===tileUniformBuffer&&cachedBindGroup.gradientView===gradientView){this.rasterizeBindGroup=cachedBindGroup.bindGroup;return}let bindGroup=this.device.createBindGroup({layout:this.tileBindGroupLayout,entries:[{binding:0,resource:{buffer:this.framebuffer}},{binding:1,resource:{buffer:this.frameUniformBuffer}},{binding:2,resource:{buffer:this.pointBuffer}},{binding:3,resource:{buffer:this.colorBuffer}},{binding:4,resource:gradientView},{binding:5,resource:this.gradientSampler},{binding:6,resource:{buffer:normalBuffer}},{binding:7,resource:{buffer:tileUniformBuffer}}]});this.rasterizeBindGroupCache.set(cacheKey,{bindGroup,transparentBindGroup:null,pointBuffer:this.pointBuffer,colorBuffer:this.colorBuffer,normalBuffer,tileUniformBuffer,gradientView}),this.rasterizeBindGroup=bindGroup}},DEFAULT_POINT_CLOUD_TRANSPARENCY_MODE=`blend`;function isPointCloudTransparencyMode(v){return v===`blend`||v===`opaque`}function describeValue(v){try{return typeof v==`string`?JSON.stringify(v):String(v)}catch(_a){return`<${typeof v}>`}}var TransparencySettings=class{constructor(){this.needsRender=!1,this.pendingBlendRelease=!1,this._mode=DEFAULT_POINT_CLOUD_TRANSPARENCY_MODE}get mode(){return this._mode}set mode(value){if(!isPointCloudTransparencyMode(value)){console.warn(`[Five] pointCloudTransparencyMode 只接受 'blend' 或 'opaque',收到 ${describeValue(value)},保持 '${this._mode}'。`);return}value!==this._mode&&(this._mode===`blend`&&value===`opaque`&&(this.pendingBlendRelease=!0),this._mode=value,this.needsRender=!0)}};function classifyBlock(block,cameraForwardY,mode,blendLayerAvailable,additiveBufferAvailable){let alpha=pointAlpha(block.opacity,floorOpacity(block,cameraForwardY),block.modelAlpha);return!isSelectedFloor(block.floorIndex,block.shownFloorIndex)&&block.floorStyle!==`OPACITY`||isAlphaCulled(alpha)?{kind:`skip`,alpha}:block.useAddBlend?{kind:additiveBufferAvailable?`additive`:`skip`,alpha}:alpha<1&&mode===`blend`&&blendLayerAvailable?{kind:`blend`,alpha}:{kind:`opaque`,alpha}}function classifyBlocks(input){let{cameraForwardY,mode,blendLayerAvailable,additiveBufferAvailable}=input,blocks=Array(input.blocks.length),hasAdditive=!1,hasBlend=!1;for(let i=0;i<input.blocks.length;i++){let c=classifyBlock(input.blocks[i],cameraForwardY,mode,blendLayerAvailable,additiveBufferAvailable);blocks[i]=c,c.kind===`additive`?hasAdditive=!0:c.kind===`blend`&&(hasBlend=!0)}return{blocks,hasAdditive,hasBlend}}function tileCategoryOf(kind){switch(kind){case`opaque`:return TILE_CATEGORY.OPAQUE;case`additive`:return TILE_CATEGORY.ADDITIVE;case`blend`:return TILE_CATEGORY.BLEND;default:return null}}function normalizeFloorIndex(f){return Number.isFinite(f)&&f!==0?f:0}function distanceToBox(box,p){let sq=0;for(let k=0;k<3;k++){let c=Math.max(box[k],Math.min(p[k],box[k+3])),d=p[k]-c;sq+=d*d}return Math.sqrt(sq)}function groupBlendBlocks(blocks,cameraPos){let map=new Map;for(let b of blocks){let floorIndex=normalizeFloorIndex(b.floorIndex),alpha=Math.fround(b.alpha),key=`${floorIndex}|${alpha}`,g=map.get(key);g||(g={floorIndex,alpha,box:null,blockIndices:[]},map.set(key,g)),g.blockIndices.push(b.index);let wb=b.worldBox;if(wb)if(!g.box)g.box=[wb[0],wb[1],wb[2],wb[3],wb[4],wb[5]];else for(let k=0;k<3;k++)g.box[k]=Math.min(g.box[k],wb[k]),g.box[k+3]=Math.max(g.box[k+3],wb[k+3])}let groups=[];return map.forEach(g=>{groups.push({floorIndex:g.floorIndex,alpha:g.alpha,distance:g.box?distanceToBox(g.box,cameraPos):Number.MAX_VALUE,blockIndices:g.blockIndices.sort((x,y)=>x-y)})}),groups.sort((x,y)=>x.distance===y.distance?x.floorIndex===y.floorIndex?x.alpha-y.alpha:x.floorIndex-y.floorIndex:y.distance>x.distance?1:-1),groups}function planFrame(classification,groups){let opaque=[],additive=[],blendCount=0,blocks=classification.blocks;for(let i=0;i<blocks.length;i++){let k=blocks[i].kind;k===`opaque`?opaque.push(i):k===`additive`?additive.push(i):k===`blend`&&blendCount++}let hasAdditive=additive.length>0,hasBlend=blendCount>0,split=hasAdditive||hasBlend,steps=[{kind:`clearCounters`,stage:`opaque`},{kind:`compute`,stage:`opaque`,blockIndices:opaque},{kind:`display`}];if(!split)return steps.push({kind:`threeScene`}),{split,hasBlend,hasAdditive,groups:[],steps};steps.push({kind:`threeOpaque`});let usedGroups=hasBlend?groups:[];for(let g=0;g<usedGroups.length;g++){let group=usedGroups[g];steps.push({kind:`clearCounters`,stage:`blend`,group:g},{kind:`clearLayer`,group:g},{kind:`compute`,stage:`blend`,group:g,blockIndices:group.blockIndices.slice()},{kind:`compositeBlend`,group:g,alpha:group.alpha})}return hasAdditive&&steps.push({kind:`clearAdditive`},{kind:`clearCounters`,stage:`additive`},{kind:`compute`,stage:`additive`,blockIndices:additive},{kind:`compositeAdditive`}),steps.push({kind:`threeTransparent`}),{split,hasBlend,hasAdditive,groups:usedGroups,steps}}function planExtraBufferReleases(input){return{releaseLayerAtStart:input.pendingBlendRelease,releaseAdditiveAtEnd:!input.anyAddBlendParam}}var scratchMatrix4=new three_webgpu.Matrix4,scratchCameraPos=new three_webgpu.Vector3,scratchBox3$1=new three_webgpu.Box3,scratchCameraForward=new three_webgpu.Vector3;function worldBoxOf(pc,out){let ext=pc.getLocalBoundingBoxExtents();return ext?(out.min.set(ext[0],ext[1],ext[2]),out.max.set(ext[3],ext[4],ext[5]),out.applyMatrix4(pc.matrixWorld)):null}var FiveRenderer=class{get pointCloudTransparencyMode(){return this.transparencySettings.mode}set pointCloudTransparencyMode(value){this.transparencySettings.mode=value}get needsRender(){return this.transparencySettings.needsRender}set needsRender(value){this.transparencySettings.needsRender=value}constructor(options){var _a;this.renderMode=`default`,this.pointcloudComputeRenderer=null,this.useComputePointCloud=null,this.compositeRenderTarget=null,this.lastWidth=0,this.lastHeight=0,this.gpuTextureViewCache=new WeakMap,this.depthOnlyViewCache=new WeakMap,this.transparencySettings=new TransparencySettings,this.outputType=(_a=options==null?void 0:options.outputType)==null?three_webgpu.UnsignedByteType:_a,this.composer=new EffectComposer(options),this.composerVersion=``,this.renderMode=`default`,this.sceneRenders={default:new SceneRenderer}}render(renderer,scene,modelScene,camera,sceneUpdated){var _a,_b;let canvas=renderer.domElement,width=canvas.width,height=canvas.height;if(width<=0||height<=0)return!1;this.composer.updateStatus();let{endabledPassNumber,needsColorGBuffer,needsDepthGBuffer,version}=this.composer.status,hasPasses=endabledPassNumber>0,prevRenderTarget=renderer.getRenderTarget();if((width!==this.lastWidth||height!==this.lastHeight)&&(this.lastWidth=width,this.lastHeight=height,(_a=this.compositeRenderTarget)==null||_a.dispose(),this.compositeRenderTarget=new three_webgpu.RenderTarget(width,height,{type:this.outputType}),this.compositeRenderTarget.depthTexture=new three_webgpu.DepthTexture(width,height),(_b=this.pointcloudComputeRenderer)==null||_b.resize(width,height),sceneUpdated=!0),!this.compositeRenderTarget)return renderer.setRenderTarget(prevRenderTarget),!1;!sceneUpdated&&hasPasses&&version!==this.composerVersion&&(sceneUpdated=!0),this.composerVersion=version,sceneUpdated&&this.renderSceneToComposite(renderer,scene,modelScene,camera);let rendered=!1;return hasPasses?(this.composer.setSize(width,height),this.composer.gbuffer.clear(),needsColorGBuffer&&this.composer.gbuffer.set(`color`,this.compositeRenderTarget.texture),needsDepthGBuffer&&this.compositeRenderTarget.depthTexture&&this.composer.gbuffer.set(`depth`,this.compositeRenderTarget.depthTexture),renderer.setRenderTarget(this.composer.readBuffer),renderFullScreen(renderer,this.compositeRenderTarget.texture),rendered=this.composer.render(renderer)):sceneUpdated&&(renderer.setRenderTarget(null),renderFullScreen(renderer,this.compositeRenderTarget.texture),rendered=!0),renderer.setRenderTarget(prevRenderTarget),rendered}renderSceneToComposite(renderer,scene,modelScene,camera){if(!this.compositeRenderTarget)return;camera.updateMatrixWorld(!0),scene.updateMatrixWorld(!0);let pointClouds=[];if(scene.traverse(object=>{object instanceof require_memoryUsage.m&&pointClouds.push(object)}),pointClouds.length===0)renderer.setRenderTarget(this.compositeRenderTarget),renderer.clear(!0,!0,!0),renderer.render(scene,camera);else{if(this.useComputePointCloud===null)try{let backend=renderer.backend;this.useComputePointCloud=(backend==null?void 0:backend.isWebGPUBackend)===!0&&!!(backend!=null&&backend.device)}catch(_a){this.useComputePointCloud=!1}this.useComputePointCloud?this.renderPointCloudCompute(renderer,scene,pointClouds,camera):(renderer.setRenderTarget(this.compositeRenderTarget),renderer.clear(!0,!0,!0),renderer.render(scene,camera))}}sortByDistance(pointClouds,cameraPos){let dist=new Map;for(let pc of pointClouds)dist.set(pc,worldBoxOf(pc,scratchBox3$1)?scratchBox3$1.distanceToPoint(cameraPos):Number.MAX_VALUE);return pointClouds.slice().sort((a,b)=>dist.get(a)-dist.get(b))}renderPointCloudCompute(renderer,scene,pointClouds,camera){var _a,_b,_c;let releases=planExtraBufferReleases({anyAddBlendParam:pointClouds.some(pc=>pc.useAddBlend),pendingBlendRelease:this.transparencySettings.pendingBlendRelease});releases.releaseLayerAtStart&&this.pointcloudComputeRenderer&&(this.pointcloudComputeRenderer.releaseBlendBuffers(),this.transparencySettings.pendingBlendRelease=!1),renderer.setRenderTarget(this.compositeRenderTarget),renderer.clear(!0,!0,!0);let targetViews=this.getCompositeTargetViews(renderer),targetFormat=targetViews==null?void 0:targetViews.colorFormat;if(targetFormat&&((_a=this.pointcloudComputeRenderer)==null?void 0:_a.colorFormat)!==targetFormat)try{let device=renderer.backend.device;if(!device)return;(_b=this.pointcloudComputeRenderer)==null||_b.dispose(),this.pointcloudComputeRenderer=new PointCloudComputeRenderer(device,targetFormat),this.pointcloudComputeRenderer.resize(this.lastWidth,this.lastHeight)}catch(_d){this.pointcloudComputeRenderer=null;return}if(!this.pointcloudComputeRenderer)return;let computeRenderer=this.pointcloudComputeRenderer,framePixelRatio=Math.max(.1,camera.pixelRatio||renderer.getPixelRatio()),frameResolutionY=Math.max(1,((_c=camera.resolution)==null?void 0:_c.y)||this.lastHeight),pointCloudsToDraw=[],totalPointCount=0;for(let pc of pointClouds){if(!pc.visible||!pc.layers.test(camera.layers))continue;let visibleCount=Math.max(0,Math.min(pc.visiblePointCount,pc.numPoints));visibleCount!==0&&(pointCloudsToDraw.push(pc),totalPointCount+=visibleCount)}let plan=null,dispatchOrder=[],classification=null;if(targetViews&&pointCloudsToDraw.length>0){computeRenderer.prepareFrame(totalPointCount);let cameraWorldPos=camera.getWorldPosition(scratchCameraPos),firstPc=pointCloudsToDraw[0];dispatchOrder=this.sortByDistance(pointCloudsToDraw,cameraWorldPos),computeRenderer.setPointSizeParams({sizeMode:firstPc.pointSize,pointShape:firstPc.pointShape,pointScale:firstPc.pointScale,pointMinPixel:firstPc.pointMinPixel,pointMaxPixel:firstPc.pointMaxPixel,pixelRatio:framePixelRatio,resolutionY:frameResolutionY,maxDisplayBoost:firstPc.maxDisplayBoost});let cameraForwardY=scratchCameraForward.set(0,0,-1).applyQuaternion(camera.quaternion).y,blocks=dispatchOrder.map(pc=>({floorIndex:pc.floorIndex,shownFloorIndex:pc.shownFloorIndex,floorStyle:pc.floorStyle,opacity:pc.opacity,modelAlpha:pc.modelAlpha,useAddBlend:pc.useAddBlend})),mode=this.transparencySettings.mode,wanted=classifyBlocks({blocks,cameraForwardY,mode,blendLayerAvailable:!0,additiveBufferAvailable:!0}),availability=computeRenderer.prepareTransparentStages(wanted.hasBlend,wanted.hasAdditive,targetViews.layerDepthView);classification=classifyBlocks({blocks,cameraForwardY,mode,blendLayerAvailable:availability.blend,additiveBufferAvailable:availability.additive});let blendInputs=[],blockResults=classification.blocks;for(let i=0;i<blockResults.length;i++){if(blockResults[i].kind!==`blend`)continue;let pc=dispatchOrder[i],box=worldBoxOf(pc,scratchBox3$1);blendInputs.push({index:i,floorIndex:pc.floorIndex,alpha:blockResults[i].alpha,worldBox:box?[box.min.x,box.min.y,box.min.z,box.max.x,box.max.y,box.max.z]:null})}let groups=blendInputs.length>0?groupBlendBlocks(blendInputs,[cameraWorldPos.x,cameraWorldPos.y,cameraWorldPos.z]):[];plan=planFrame(classification,groups)}let blockIndicesOf=stage=>{if(!plan)return[];for(let step of plan.steps)if(step.kind===`compute`&&step.stage===stage)return step.blockIndices;return[]},makeSteps=(stage,indices)=>computePass=>{var _a;let blockResults=classification.blocks;for(let i of indices){let pc=dispatchOrder[i],c=blockResults[i],category=tileCategoryOf(c.kind);if(category===null)continue;let visibleCount=Math.max(0,Math.min(pc.visiblePointCount,pc.numPoints)),gradientView=(_a=this.getCachedGpuTextureView(renderer,pc.gradientTexture))==null?computeRenderer.getPlaceholderGradientView():_a;computeRenderer.setPointCloud(pc,pc.positions,pc.colors,visibleCount,{positionsVersion:pc.positionVersion,colorsVersion:pc.styleRevision},{gradientView}),computeRenderer.writeTileUniform(pc,visibleCount,category,c.alpha),computeRenderer.encodeRasterizeStage(computePass,stage)}};if(targetViews&&plan){let opaqueSteps=makeSteps(`opaque`,blockIndicesOf(`opaque`));computeRenderer.submitOpaqueStage(targetViews.colorView,targetViews.depthView,computePass=>{computeRenderer.beginPointCloudFrame(camera,scratchMatrix4),opaqueSteps(computePass)})}let hidden=[],prevAutoClear=renderer.autoClear,prevAutoClearColor=renderer.autoClearColor,prevAutoClearDepth=renderer.autoClearDepth,prevAutoClearStencil=renderer.autoClearStencil,prevOpaque=renderer.opaque,prevTransparent=renderer.transparent;try{for(let pc of pointClouds)pc.visible&&(pc.visible=!1,hidden.push(pc));if(renderer.autoClear=!1,renderer.autoClearColor=!1,renderer.autoClearDepth=!1,renderer.autoClearStencil=!1,renderer.setRenderTarget(this.compositeRenderTarget),!plan||!plan.split||!targetViews)renderer.render(scene,camera);else{renderer.opaque=!0,renderer.transparent=!1,renderer.render(scene,camera);let blendGroups=plan.groups.map(g=>({alpha:g.alpha,steps:makeSteps(`blend`,g.blockIndices)})),additiveSteps=plan.hasAdditive?makeSteps(`additive`,blockIndicesOf(`additive`)):null;computeRenderer.submitTransparentStages(targetViews.colorView,targetViews.layerDepthView,blendGroups,additiveSteps),renderer.opaque=!1,renderer.transparent=!0,renderer.setRenderTarget(this.compositeRenderTarget),renderer.render(scene,camera)}}finally{renderer.opaque=prevOpaque,renderer.transparent=prevTransparent,renderer.autoClear=prevAutoClear,renderer.autoClearColor=prevAutoClearColor,renderer.autoClearDepth=prevAutoClearDepth,renderer.autoClearStencil=prevAutoClearStencil;for(let pc of hidden)pc.visible=!0;releases.releaseAdditiveAtEnd&&computeRenderer.releaseAdditiveBuffers()}}dispose(){var _a,_b;this.composer.dispose(),(_a=this.pointcloudComputeRenderer)==null||_a.dispose(),this.pointcloudComputeRenderer=null,(_b=this.compositeRenderTarget)==null||_b.dispose(),this.compositeRenderTarget=null}getCompositeTargetViews(renderer){var _a;if(!((_a=this.compositeRenderTarget)!=null&&_a.depthTexture))return null;try{let backend=renderer.backend,colorData=backend.get(this.compositeRenderTarget.texture),depthData=backend.get(this.compositeRenderTarget.depthTexture),colorTexture=colorData==null?void 0:colorData.texture,depthTexture=depthData==null?void 0:depthData.texture;if(!colorTexture||!depthTexture)return null;let depthView=this.getCachedView(depthTexture);return{colorView:this.getCachedView(colorTexture),depthView,layerDepthView:this.getLayerDepthView(depthTexture,depthView),colorFormat:colorTexture.format}}catch(_b){return null}}getCachedGpuTextureView(renderer,texture){var _a;if(!texture)return null;try{let backend=renderer.backend,data=(_a=backend==null?void 0:backend.get)==null?void 0:_a.call(backend,texture),gpuTex=data==null?void 0:data.texture;return gpuTex?this.getCachedView(gpuTex):null}catch(_b){return null}}getLayerDepthView(depthTexture,defaultView){let format=depthTexture.format;if(format!==`depth24plus-stencil8`&&format!==`depth32float-stencil8`)return defaultView;let view=this.depthOnlyViewCache.get(depthTexture);return view||(view=depthTexture.createView({aspect:`depth-only`}),this.depthOnlyViewCache.set(depthTexture,view)),view}getCachedView(gpuTex){let view=this.gpuTextureViewCache.get(gpuTex);return view||(view=gpuTex.createView(),this.gpuTextureViewCache.set(gpuTex,view)),view}},_a$3,userAgent=typeof navigator<`u`?((_a$3=navigator==null?void 0:navigator.userAgent)==null?``:_a$3).toLowerCase():`node`;(()=>{try{let canvas=document.createElement(`canvas`);return!!(window.WebGLRenderingContext&&(canvas.getContext(`webgl`)||canvas.getContext(`experimental-webgl`)))}catch(error){return!1}})();var canWebGPU=typeof navigator<`u`&&navigator.gpu!==void 0;typeof window<`u`&&canWebGPU?navigator.gpu.requestAdapter().then(adapter=>(adapter||(canWebGPU=!1),canWebGPU)).catch(()=>(canWebGPU=!1,canWebGPU)):Promise.resolve(canWebGPU),typeof history<`u`&&`pushState`in history&&`replaceState`in history&&`state`in history;var isMobile=/android/i.test(userAgent)||/webos/i.test(userAgent)||/ipad|iphone|ipod/i.test(userAgent)||/iemobile/i.test(userAgent)||/opera mini/i.test(userAgent)||/blackberry/i.test(userAgent)||/windows phone/i.test(userAgent),BUTTON_FIELDS=[`trigger`,`grip`,`primary`,`secondary`,`pinch`],AXIS_FIELDS=[`x`,`y`];function deepFreeze(obj){for(let key of Object.keys(obj)){let value=obj[key];typeof value==`object`&&value&&!Object.isFrozen(value)&&deepFreeze(value)}return Object.freeze(obj)}function createStandardProfile(){return{buttons:{trigger:0,grip:1,primary:4,secondary:5,pinch:null},axes:{x:2,y:3},model:`auto`}}function createVisionProProfile(){return{buttons:{trigger:null,grip:null,primary:null,secondary:null,pinch:null},axes:{x:null,y:null},model:`none`}}var DEFAULT_PROFILES=deepFreeze({Pico:createStandardProfile(),Oculus:createStandardProfile(),Default:createStandardProfile(),VP:createVisionProProfile()});function detectDeviceType(ua,maxTouchPoints){try{let agent=ua===void 0?navigator.userAgent:ua,touchPoints=maxTouchPoints===void 0?navigator.maxTouchPoints:maxTouchPoints;return typeof agent==`string`?agent.includes(`PICO`)||agent.includes(`Pico`)?`Pico`:agent.includes(`Macintosh`)&&touchPoints===5?`VP`:agent.includes(`Oculus`)?`Oculus`:`Default`:`Default`}catch(_a){return`Default`}}function isValidIndex(value){return value===null||typeof value==`number`&&Number.isInteger(value)&&value>=0}function isPlainObject(value){return typeof value==`object`&&!!value}function safeWarn(warn,field){if(warn)try{warn(field)}catch(_a){}}function resolveProfile(type,override,warn){var _a;let base=(_a=DEFAULT_PROFILES[type])==null?DEFAULT_PROFILES.Default:_a,result={buttons:Object.assign({},base.buttons),axes:Object.assign({},base.axes),model:base.model};if(!isPlainObject(override))return result;let buttonsOverride=override.buttons;if(buttonsOverride!==void 0)if(isPlainObject(buttonsOverride))for(let field of BUTTON_FIELDS){let value=buttonsOverride[field];value!==void 0&&(isValidIndex(value)?result.buttons[field]=value:safeWarn(warn,`buttons.${field}`))}else safeWarn(warn,`buttons`);let axesOverride=override.axes;if(axesOverride!==void 0)if(isPlainObject(axesOverride))for(let field of AXIS_FIELDS){let value=axesOverride[field];value!==void 0&&(isValidIndex(value)?result.axes[field]=value:safeWarn(warn,`axes.${field}`))}else safeWarn(warn,`axes`);let modelOverride=override.model;return modelOverride!==void 0&&(modelOverride===`auto`||modelOverride===`none`?result.model=modelOverride:safeWarn(warn,`model`)),result}function toPublicMachineType(device){return device===`Default`?`Pico`:device}function clientWaitAsyncWithTimeout(){let{gl}=this,sync=gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE,0);return gl.flush(),new Promise((resolve,reject)=>{function test(){if(sync===null){reject();return}let res=gl.clientWaitSync(sync,gl.SYNC_FLUSH_COMMANDS_BIT,0);if(res===gl.WAIT_FAILED){gl.deleteSync(sync),reject();return}if(res===gl.TIMEOUT_EXPIRED){setTimeout(test,0);return}gl.deleteSync(sync),resolve()}test()})}function installWebGLAsyncReadFix(backend){if(detectDeviceType()===`Default`)return!1;let webglBackend=backend;if((webglBackend==null?void 0:webglBackend.isWebGLBackend)!==!0)return!1;let utils=webglBackend.utils;return!utils||typeof utils._clientWaitAsync!=`function`?!1:(utils._clientWaitAsync=clientWaitAsyncWithTimeout,!0)}var patchedContexts=new WeakSet;function installWebGLBlendEquationFix(backend){let webglBackend=backend;if((webglBackend==null?void 0:webglBackend.isWebGLBackend)!==!0)return!1;let gl=webglBackend.gl;if(!gl||typeof gl.blendEquationSeparate!=`function`||patchedContexts.has(gl))return!1;let originalBlendEquationSeparate=gl.blendEquationSeparate.bind(gl);return gl.blendEquationSeparate=(modeRGB,modeAlpha)=>{originalBlendEquationSeparate(modeRGB===void 0?gl.MAX:modeRGB,modeAlpha===void 0?gl.MAX:modeAlpha)},patchedContexts.add(gl),!0}var DEFAULT_BACKGROUND_COLOR=1579548;typeof navigator<`u`&&navigator.gpu;var InternalWebGPURenderer=class extends three_webgpu.WebGPURenderer{constructor({antialias=!1,logarithmicDepthBuffer,outputType=three_webgpu.UnsignedByteType,forceWebGL=!1}){var _a;super({antialias,alpha:!0,depth:!0,logarithmicDepthBuffer,outputType,forceWebGL}),this._backendReady=!1,this.forceWebGL=forceWebGL,forceWebGL===!1&&canWebGPU===!1&&console.warn(`设备不支持开启 WEBGPU`),this.outputColorSpace=three_webgpu.SRGBColorSpace,this.setClearColor(DEFAULT_BACKGROUND_COLOR,1);let defaultOnDeviceLost=(_a=this.onDeviceLost)==null?void 0:_a.bind(this);this.onDeviceLost=info=>{var _a;defaultOnDeviceLost==null||defaultOnDeviceLost(info);try{(_a=this.onDeviceLostCallback)==null||_a.call(this,info)}catch(error){console.error(`onDeviceLostCallback error`,error)}},this.ready=this.init().then(()=>{installWebGLAsyncReadFix(this.backend),installWebGLBlendEquationFix(this.backend),this._backendReady=!0})}get isInitialized(){return this._backendReady}get isXRCapable(){let backend=this.backend;return(backend==null?void 0:backend.isWebGPUBackend)!==!0}reconfigureContext(){if(this._backendReady!==!0)return;let backend=this.backend;if(backend&&typeof backend.updateSize==`function`)try{backend.updateSize()}catch(error){console.error(`reconfigureContext error`,error)}}},sharedProjScreenMatrix=new three_webgpu.Matrix4,sharedFrustum=new three_webgpu.Frustum,renderResolution=new three_webgpu.Vector2,clockForMixer=new WeakMap;function updateObject(object){let needsRender=!1;return object.needsRender===!0?(object.needsRender=!1,needsRender=!0):object.mixer&&object.mixer.stats.actions.inUse>0&&(needsRender=!0),needsRender}var Scene=class extends three_webgpu.Scene{constructor(){super(...arguments),this.needsRender=!1}add(...objects){return super.add(...objects)}remove(...objects){return super.remove(...objects)}update(renderer,camera){let needsRender=!1,time;return camera instanceof Camera?(time=camera.time,renderResolution.copy(camera.resolution)):(time=require_memoryUsage.p(),renderer.getSize(renderResolution)),sharedProjScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse),sharedFrustum.setFromProjectionMatrix(sharedProjScreenMatrix),this.traverseVisible(object=>{if(object.setResolution&&object.setResolution(renderResolution.x,renderResolution.y),object.setTime&&object.setTime(time),object.mixer instanceof three_webgpu.AnimationMixer){let mixer=object.mixer,clock=clockForMixer.get(mixer);clock||(clock=new Clock,clockForMixer.set(mixer,clock)),clock.update(time),mixer.update(clock.getDelta())}(object instanceof three_webgpu.Mesh||object instanceof three_webgpu.Line||object instanceof three_webgpu.Points)&&(!object.frustumCulled||sharedFrustum.intersectsObject(object))&&(updateObject(object)&&(needsRender=!0),object.traverseAncestors(object=>{updateObject(object)&&(needsRender=!0)}))}),this.needsRender=needsRender,needsRender}},easeOut$2=x=>x*(2-x),sharedGeometry2$2=(()=>{let vertices=new Float32Array([-.18,0,-.18,.18,0,-.18,-.18,0,.18,.18,0,.18]),uvs=new Float32Array([1,0,0,0,1,1,0,1]),index=new Uint8Array([0,2,1,2,3,1]),sharedGeometry=new three_webgpu.BufferGeometry;return sharedGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),sharedGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),sharedGeometry.setIndex(new three_webgpu.BufferAttribute(index,1)),sharedGeometry})(),CENTER$3=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST$3=(0,three_tsl.float)(.017);function tslInside$3(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER$3.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST$3),dist)}function tslOutside$3(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER$3.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST$3),outerDist,dist))}function createPanoCircleMaterial(color){let u={baseColor:(0,three_tsl.uniform)(new three_webgpu.Color(color)),hdrBoost:(0,three_tsl.uniform)(1),circleScale:(0,three_tsl.uniform)(1),ringScale:(0,three_tsl.uniform)(1),ringOpacity:(0,three_tsl.uniform)(1),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),progress:(0,three_tsl.uniform)(0),progressOpacity:(0,three_tsl.uniform)(0),expand0:(0,three_tsl.uniform)(0),expand1:(0,three_tsl.uniform)(0),expandOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),tapScale:(0,three_tsl.uniform)(1),tapOpacity:(0,three_tsl.uniform)(1),disable:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)(),circleColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.8).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER$3))).mul(1.5)).clamp(0,1).mul(u.tapOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.15).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.234).mul(u.circleScale).mul(u.tapScale)))),ringColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,1)).dot(vuv.sub(CENTER$3)))).clamp(0,1).mul(u.tapOpacity).mul(u.ringOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.27).mul(u.ringScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.32).mul(u.ringScale).mul(u.tapScale)))),loadAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER$3.x.sub(vuv.x),CENTER$3.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadAngle)).mul(.4).add(.1).mul(u.tapOpacity).mul(u.loadingOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.208).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),progAngle=three_tsl.PI.add((0,three_tsl.atan)(CENTER$3.x.sub(vuv.x),CENTER$3.y.sub(vuv.y))),progColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.step)(u.progress.mul(three_tsl.PI2),progAngle)).mul(.5).mul(u.tapOpacity).mul(u.progressOpacity).mul(tslInside$3(vuv,(0,three_tsl.float)(.208).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$3(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),expand0Radius=(0,three_tsl.float)(.2).add((0,three_tsl.float)(.23).mul(u.expand0)),expand0Dist=(0,three_tsl.length)(CENTER$3.sub(vuv)),expand0Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand0Radius.sub(expand0Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand0.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$3(vuv,expand0Radius))),expand1Radius=(0,three_tsl.float)(.2).add((0,three_tsl.float)(.23).mul(u.expand1)),expand1Dist=(0,three_tsl.length)(CENTER$3.sub(vuv)),expand1Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand1Radius.sub(expand1Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand1.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$3(vuv,expand1Radius))),disableColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).mul(tslOutside$3(vuv,(0,three_tsl.float)(.32).mul(u.circleScale).mul(u.tapScale)))),result=(0,three_tsl.vec4)(1,1,1,0);result=(0,three_tsl.mix)(result,expand1Color,expand1Color.w),result=(0,three_tsl.mix)(result,expand0Color,expand0Color.w),result=(0,three_tsl.mix)(result,progColor,progColor.w),result=(0,three_tsl.mix)(result,loadColor,loadColor.w),result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,ringColor,ringColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.xyz.mul(u.baseColor).mul(u.hdrBoost),result.w.mul(u.opacity).mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoCircleMesh=class extends three_webgpu.Object3D{constructor(options={}){var _a,_b;super();let color=(_a=options.color)==null?16777215:_a,scale=(_b=options.scale)==null?1:_b;this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({progress:0}),this.ringMotion=new Motion({scale:1,opacity:1}),this.tapMotion=new Motion({scale:1,opacity:1}),this.loadingOpacityMotion=new Motion({opacity:0}),this.progressMotion=new Motion({progress:0}),this.progressOpacityMotion=new Motion({opacity:0}),this.opacityMotion=new Motion({opacity:0}),this.disableMotion=new Motion({progress:0});let{material,u}=createPanoCircleMaterial(color);this.panoU=u,this.panoMesh=new three_webgpu.Mesh(sharedGeometry2$2,material),this.renderOrder=-2,this.panoMesh.renderOrder=-2,this.panoMesh.position.y=.004,this.panoMesh.scale.set(scale,1,scale),this.add(this.panoMesh),this.currentStartTime=require_memoryUsage.p(),this.needsRender=!0}setProgress(progress){this.setDisabled(!1),this.setLoading(!1),this.progress!==progress&&(progress=require_memoryUsage.M(progress,0,1),this.tapMotion.ended&&(this.progress===0&&this.progressOpacityMotion.set({opacity:1},500).catch(require_memoryUsage.d),progress===0?this.progressOpacityMotion.set({opacity:0},500).catch(require_memoryUsage.d).then(()=>{this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d)}):this.progressMotion.set({progress:require_memoryUsage.M(progress*1.2,0,1)},100).catch(require_memoryUsage.d)),this.progress=progress)}setHDRBoost(boost){this.panoU.hdrBoost.value!==boost&&(this.panoU.hdrBoost.value=boost,this.needsRender=!0)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},200).catch(require_memoryUsage.d))}setCurrent(current){this.current!==current&&(this.currentMotion.set({progress:+!!current},2e3).catch(require_memoryUsage.d),this.current=current,this.current===!0&&(this.currentStartTime=require_memoryUsage.p()))}setLoading(loading){this.loading!==loading&&(this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.loadingOpacityMotion.set({opacity:+!!loading},500).catch(require_memoryUsage.d))}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({progress:+!!disabled},500).catch(require_memoryUsage.d))}tap(){return this.tapMotion.ended?(this.progressOpacityMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d),this.tapMotion.setKeyframes([{progress:0,value:{scale:1,opacity:1}},{progress:.3,value:{scale:.85,opacity:.5}},{progress:.8,value:{scale:1.05,opacity:.6}},{progress:1,value:{scale:1,opacity:1}}],600).then(()=>{this.progressOpacityMotion.set({opacity:+(this.progress>0)},300).catch(require_memoryUsage.d),this.progressMotion.set({progress:this.progress},120).catch(require_memoryUsage.d)}).catch(require_memoryUsage.d)):Promise.resolve()}updateTime(time,deltaTime){if(this.progressMotion.ended||(this.progressMotion.update(time),this.panoU.progress.value=this.progressMotion.value.progress,this.needsRender=!0),this.progressOpacityMotion.ended||(this.progressOpacityMotion.update(time),this.panoU.progressOpacity.value=this.progressOpacityMotion.value.opacity,this.needsRender=!0),this.opacityMotion.ended||(this.opacityMotion.update(time),this.panoU.opacity.value=this.opacityMotion.value.opacity,this.needsRender=!0),this.visible=this.opacityMotion.value.opacity!==0,(!this.loadingOpacityMotion.ended||this.loadingOpacityMotion.value.opacity>0)&&(this.loadingOpacityMotion.update(time),this.panoU.loadingOpacity.value=this.loadingOpacityMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0),this.tapMotion.ended||(this.tapMotion.update(time),this.panoU.tapOpacity.value=this.tapMotion.value.opacity,this.panoU.tapScale.value=this.tapMotion.value.scale,this.needsRender=!0),this.current||!this.currentMotion.ended){this.currentMotion.update(time),this.panoU.expandOpacity.value=this.currentMotion.value.progress;{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let scale=1+Math.sin(Math.PI*deltaTime)/25*this.currentMotion.value.progress;this.panoU.circleScale.value=scale,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand0.value=easeOut$2(x)*this.currentMotion.value.progress,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1e3)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand1.value=easeOut$2(x)*this.currentMotion.value.progress,this.needsRender=!0}}}if(this.currentMotion.value.progress>.2&&this.progress===0&&this.loading===!1&&(time-this.currentStartTime-1e3)/2e3%5<2?this.ringMotion.getTargetKeyframe().value.scale!==.8&&this.ringMotion.set({scale:.8,opacity:0},600).catch(require_memoryUsage.d):this.ringMotion.getTargetKeyframe().value.scale!==1&&this.ringMotion.set({scale:1,opacity:1},600).catch(require_memoryUsage.d),!this.ringMotion.ended){let{scale,opacity}=this.ringMotion.value;this.ringMotion.update(time),this.panoU.ringScale.value=scale,this.panoU.ringOpacity.value=opacity,this.needsRender=!0}if(!this.disableMotion.ended){let{progress}=this.disableMotion.value;this.disableMotion.update(time),this.panoU.disable.value=progress,this.needsRender=!0}}dispose(){this.ringMotion.dispose(),this.tapMotion.dispose(),this.progressMotion.dispose(),this.progressOpacityMotion.dispose(),this.opacityMotion.dispose(),this.currentMotion.dispose(),this.panoMesh.material.dispose()}},easeOut$1=x=>x*(2-x),sharedGeometry2$1=(()=>{let vertices=new Float32Array([-.18,0,-.18,.18,0,-.18,-.18,0,.18,.18,0,.18]),uvs=new Float32Array([1,0,0,0,1,1,0,1]),index=new Uint8Array([0,2,1,2,3,1]),sharedGeometry=new three_webgpu.BufferGeometry;return sharedGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),sharedGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),sharedGeometry.setIndex(new three_webgpu.BufferAttribute(index,1)),sharedGeometry})(),CENTER$2=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST$2=(0,three_tsl.float)(.017);function tslInside$2(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER$2.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST$2),dist)}function tslOutside$2(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER$2.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST$2),outerDist,dist))}function createPanoCircleSolidMaterial(color){let u={baseColor:(0,three_tsl.uniform)(new three_webgpu.Color(color)),hdrBoost:(0,three_tsl.uniform)(1),circleScale:(0,three_tsl.uniform)(1),circleOpacity:(0,three_tsl.uniform)(1),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),progress:(0,three_tsl.uniform)(0),progressOpacity:(0,three_tsl.uniform)(0),expand0:(0,three_tsl.uniform)(0),expand1:(0,three_tsl.uniform)(0),expandOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),tapScale:(0,three_tsl.uniform)(1),tapOpacity:(0,three_tsl.uniform)(1),disable:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)(),circleColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.8).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER$2))).mul(1.5)).clamp(0,1).mul((0,three_tsl.step)(u.progress,(0,three_tsl.float)(0))).mul(u.tapOpacity).mul(tslInside$2(vuv,(0,three_tsl.float)(.2).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$2(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),loadAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER$2.x.sub(vuv.x),CENTER$2.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadAngle)).mul(.9).add(.1).mul(u.tapOpacity).mul(u.loadingOpacity).mul(tslInside$2(vuv,(0,three_tsl.float)(.2).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$2(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),progAngle=three_tsl.PI.add((0,three_tsl.atan)(CENTER$2.x.sub(vuv.x),CENTER$2.y.sub(vuv.y))),progBarBase=(0,three_tsl.float)(1).sub((0,three_tsl.step)(u.progress.mul(three_tsl.PI2),progAngle)),r=(0,three_tsl.float)(.04),endAngle=u.progress.mul(three_tsl.PI2),startCap=(0,three_tsl.step)((0,three_tsl.length)((0,three_tsl.vec2)(CENTER$2.x.add((0,three_tsl.float)(0).sin().mul(.25)),CENTER$2.y.add((0,three_tsl.float)(0).cos().mul(.25))).sub(vuv)),r),endCap=(0,three_tsl.step)((0,three_tsl.length)((0,three_tsl.vec2)(CENTER$2.x.add(endAngle.sin().mul(.25)),CENTER$2.y.add(endAngle.cos().mul(.25))).sub(vuv)),r),progColor=(0,three_tsl.vec4)(1,1,1,progBarBase.add(startCap).add(endCap).clamp(0,1).mul(.9).mul(u.tapOpacity).mul(u.progressOpacity).mul(tslInside$2(vuv,(0,three_tsl.float)(.2).mul(u.circleScale).mul(u.tapScale))).mul(tslOutside$2(vuv,(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale)))),expand0Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.25).mul(u.expand0)),expand0Dist=(0,three_tsl.length)(CENTER$2.sub(vuv)),expand0Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand0Radius.sub(expand0Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand0.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$2(vuv,expand0Radius))),expand1Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.23).mul(u.expand1)),expand1Dist=(0,three_tsl.length)(CENTER$2.sub(vuv)),expand1Color=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub(expand1Radius.sub(expand1Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand1.sub(.5)).mul(2)).mul(1.2).clamp(0,1)).mul(u.expandOpacity).mul(tslOutside$2(vuv,expand1Radius))),disableColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).mul(u.tapOpacity).mul(tslOutside$2(vuv,(0,three_tsl.float)(.32).mul(u.circleScale).mul(u.tapScale)))),result=(0,three_tsl.vec4)(1,1,1,0);result=(0,three_tsl.mix)(result,expand1Color,expand1Color.w),result=(0,three_tsl.mix)(result,expand0Color,expand0Color.w),result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,progColor,progColor.w),result=(0,three_tsl.mix)(result,loadColor,loadColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.xyz.mul(u.baseColor).mul(u.hdrBoost),result.w.mul(u.opacity).mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoCircleMeshSolid=class extends three_webgpu.Object3D{constructor(options={}){var _a,_b;super();let color=(_a=options.color)==null?16777215:_a,scale=(_b=options.scale)==null?1:_b;this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({progress:0}),this.tapMotion=new Motion({scale:1,opacity:1}),this.loadingOpacityMotion=new Motion({opacity:0}),this.progressMotion=new Motion({progress:0}),this.progressOpacityMotion=new Motion({opacity:0}),this.opacityMotion=new Motion({opacity:0}),this.disableMotion=new Motion({progress:0});let{material,u}=createPanoCircleSolidMaterial(color);this.panoU=u,this.panoMesh=new three_webgpu.Mesh(sharedGeometry2$1,material),this.renderOrder=-2,this.panoMesh.renderOrder=-2,this.panoMesh.position.y=.004,this.panoMesh.scale.set(scale,1,scale),this.add(this.panoMesh),this.currentStartTime=require_memoryUsage.p(),this.needsRender=!0}setProgress(progress){this.setDisabled(!1),this.setLoading(!1),this.progress!==progress&&(progress=require_memoryUsage.M(progress,0,1),this.tapMotion.ended&&(this.progress===0&&this.progressOpacityMotion.set({opacity:1},500).catch(require_memoryUsage.d),progress===0?this.progressOpacityMotion.set({opacity:0},500).catch(require_memoryUsage.d).then(()=>{this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d)}):this.progressMotion.set({progress:require_memoryUsage.M(progress*1.2,0,1)},100).catch(require_memoryUsage.d)),this.progress=progress)}setHDRBoost(boost){this.panoU.hdrBoost.value!==boost&&(this.panoU.hdrBoost.value=boost,this.needsRender=!0)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},200).catch(require_memoryUsage.d))}setCurrent(current){this.current!==current&&(this.currentMotion.set({progress:+!!current},2e3).catch(require_memoryUsage.d),this.current=current,this.current===!0&&(this.currentStartTime=require_memoryUsage.p()))}setLoading(loading){this.loading!==loading&&(this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.loadingOpacityMotion.set({opacity:+!!loading},500).catch(require_memoryUsage.d))}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({progress:+!!disabled},500).catch(require_memoryUsage.d))}tap(){return this.tapMotion.ended?(this.progressOpacityMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d),this.tapMotion.setKeyframes([{progress:0,value:{scale:1,opacity:1}},{progress:.3,value:{scale:.85,opacity:.5}},{progress:.8,value:{scale:1.05,opacity:.6}},{progress:1,value:{scale:1,opacity:1}}],600).then(()=>{this.progressOpacityMotion.set({opacity:+(this.progress>0)},300).catch(require_memoryUsage.d),this.progressMotion.set({progress:this.progress},120).catch(require_memoryUsage.d)}).catch(require_memoryUsage.d)):Promise.resolve()}updateTime(time,deltaTime){if(this.progressMotion.ended||(this.progressMotion.update(time),this.panoU.progress.value=this.progressMotion.value.progress,this.needsRender=!0),this.progressOpacityMotion.ended||(this.progressOpacityMotion.update(time),this.panoU.progressOpacity.value=this.progressOpacityMotion.value.opacity,this.needsRender=!0),this.opacityMotion.ended||(this.opacityMotion.update(time),this.panoU.opacity.value=this.opacityMotion.value.opacity,this.needsRender=!0),this.visible=this.opacityMotion.value.opacity!==0,(!this.loadingOpacityMotion.ended||this.loadingOpacityMotion.value.opacity>0)&&(this.loadingOpacityMotion.update(time),this.panoU.loadingOpacity.value=this.loadingOpacityMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0),this.tapMotion.ended||(this.tapMotion.update(time),this.panoU.tapOpacity.value=this.tapMotion.value.opacity,this.panoU.tapScale.value=this.tapMotion.value.scale,this.needsRender=!0),this.panoU.circleOpacity.value=Math.max(.6,1-Math.max(this.loadingOpacityMotion.value.opacity,this.progressOpacityMotion.value.opacity)),this.current||!this.currentMotion.ended){this.currentMotion.update(time),this.panoU.expandOpacity.value=this.currentMotion.value.progress;{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let scale=1+Math.sin(Math.PI*deltaTime)/25*this.currentMotion.value.progress;this.panoU.circleScale.value=scale,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand0.value=easeOut$1(x)*this.currentMotion.value.progress,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1e3)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand1.value=easeOut$1(x)*this.currentMotion.value.progress,this.needsRender=!0}}}if(!this.disableMotion.ended){let{progress}=this.disableMotion.value;this.disableMotion.update(time),this.panoU.disable.value=progress,this.needsRender=!0}}dispose(){this.tapMotion.dispose(),this.progressMotion.dispose(),this.progressOpacityMotion.dispose(),this.opacityMotion.dispose(),this.currentMotion.dispose(),this.panoMesh.material.dispose()}},easeOut=x=>x*(2-x),sharedGeometry2=(()=>{let vertices=new Float32Array([-.18,0,-.18,.18,0,-.18,-.18,0,.18,.18,0,.18]),uvs=new Float32Array([1,0,0,0,1,1,0,1]),index=new Uint8Array([0,2,1,2,3,1]),sharedGeometry=new three_webgpu.BufferGeometry;return sharedGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),sharedGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),sharedGeometry.setIndex(new three_webgpu.BufferAttribute(index,1)),sharedGeometry})(),CENTER$1=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST$1=(0,three_tsl.float)(.017);function tslInside$1(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER$1.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST$1),dist)}function tslOutside$1(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER$1.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST$1),outerDist,dist))}function createPanoCircleCustomMaterial(options){let map=options.map,useBorder=options.borderWidth>0,u={baseColor:(0,three_tsl.uniform)(new three_webgpu.Color(options.color)),hdrBoost:(0,three_tsl.uniform)(1),circleScale:(0,three_tsl.uniform)(1),circleOpacity:(0,three_tsl.uniform)(1),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),progress:(0,three_tsl.uniform)(0),progressOpacity:(0,three_tsl.uniform)(0),expand0:(0,three_tsl.uniform)(0),expand1:(0,three_tsl.uniform)(0),expandOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),tapScale:(0,three_tsl.uniform)(1),tapOpacity:(0,three_tsl.uniform)(1),disable:(0,three_tsl.uniform)(0)},uMapAlpha=(0,three_tsl.uniform)(options.mapAlpha),uBorderWidth=(0,three_tsl.uniform)(options.borderWidth),uBorderColor=(0,three_tsl.uniform)(new three_webgpu.Color(options.borderColor)),vuv=(0,three_tsl.uv)(),radius=(0,three_tsl.float)(.3).mul(u.circleScale).mul(u.tapScale),ringInner=useBorder?tslInside$1(vuv,radius.sub(uBorderWidth.clamp(0,1).mul(radius))):tslInside$1(vuv,radius.sub((0,three_tsl.float)(.2).mul(radius))),image;if(map){let delta=radius.div(.5);image=(0,three_tsl.texture)(map,vuv.sub(CENTER$1).div(delta).add(CENTER$1)),image=(0,three_tsl.vec4)(image.rgb,image.a.mul(uMapAlpha)),options.mapUseColor&&(image=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(1)).mul(image))}else image=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(1));let circleImage;if(options.mapUseReverse)circleImage=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(1).sub(image.a));else if(useBorder){let clipAlpha=tslInside$1(vuv,radius.sub(uBorderWidth.clamp(0,1).mul(radius))),borderGradient=uBorderWidth.mul(2).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER$1)))).clamp(0,1);circleImage=(0,three_tsl.mix)((0,three_tsl.vec4)(uBorderColor,clipAlpha.mul(borderGradient)),image,image.a)}else circleImage=image;let circleColor=(0,three_tsl.vec4)(circleImage.rgb,circleImage.a.mul(u.circleOpacity).mul(u.tapOpacity).mul(tslOutside$1(vuv,radius))),disableColor=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(.5).mul(u.tapOpacity).mul(tslOutside$1(vuv,(0,three_tsl.float)(.32).mul(u.circleScale).mul(u.tapScale)))),loadingAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER$1.x.sub(vuv.x),CENTER$1.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadingGradient=(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadingAngle)).mul(.9).add(.1),loadingColor=(0,three_tsl.vec4)(u.baseColor,loadingGradient.mul(u.tapOpacity).mul(u.loadingOpacity).mul(ringInner).mul(tslOutside$1(vuv,radius))),progressAngle=three_tsl.PI.add((0,three_tsl.atan)(CENTER$1.x.sub(vuv.x),CENTER$1.y.sub(vuv.y))),progressBar=(0,three_tsl.float)(1).sub((0,three_tsl.step)(u.progress.mul(three_tsl.PI2),progressAngle)).mul(.7),progressColor=(0,three_tsl.vec4)(u.baseColor,progressBar.mul(u.tapOpacity).mul(u.progressOpacity).mul(ringInner).mul(tslOutside$1(vuv,radius))),expand0Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.25).mul(u.expand0)),expand0Dist=(0,three_tsl.length)(CENTER$1.sub(vuv)),expand0Gradient=(0,three_tsl.float)(1).sub(expand0Radius.sub(expand0Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand0.sub(.5)).mul(2)).mul(1.2).clamp(0,1)),expand0Color=(0,three_tsl.vec4)(u.baseColor,expand0Gradient.mul(u.expandOpacity).mul(tslOutside$1(vuv,expand0Radius))),expand1Radius=(0,three_tsl.float)(.25).add((0,three_tsl.float)(.23).mul(u.expand1)),expand1Dist=(0,three_tsl.length)(CENTER$1.sub(vuv)),expand1Gradient=(0,three_tsl.float)(1).sub(expand1Radius.sub(expand1Dist).div(.2).clamp(0,1)).mul(.8).mul((0,three_tsl.float)(1).sub((0,three_tsl.abs)(u.expand1.sub(.5)).mul(2)).mul(1.2).clamp(0,1)),expand1Color=(0,three_tsl.vec4)(u.baseColor,expand1Gradient.mul(u.expandOpacity).mul(tslOutside$1(vuv,expand1Radius))),result=(0,three_tsl.vec4)(u.baseColor,(0,three_tsl.float)(0));result=(0,three_tsl.mix)(result,expand1Color,expand1Color.w),result=(0,three_tsl.mix)(result,expand0Color,expand0Color.w),result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,progressColor,progressColor.w),result=(0,three_tsl.mix)(result,loadingColor,loadingColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.rgb.mul(u.hdrBoost),result.a.mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoCircleMeshCustom=class extends three_webgpu.Object3D{constructor(options={}){var _a,_b,_c,_d,_e,_f,_g;super();let color=(_a=options.color)==null?16777215:_a,scale=(_b=options.scale)==null?1:_b;this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({progress:0}),this.tapMotion=new Motion({scale:1,opacity:1}),this.loadingOpacityMotion=new Motion({opacity:0}),this.progressMotion=new Motion({progress:0}),this.progressOpacityMotion=new Motion({opacity:0}),this.opacityMotion=new Motion({opacity:0}),this.disableMotion=new Motion({progress:0});let{material,u}=createPanoCircleCustomMaterial({color,map:options.map,mapAlpha:(_c=options.mapAlpha)==null?1:_c,borderWidth:(_d=options.borderWidth)==null?.1:_d,borderColor:(_e=options.borderColor)==null?16777215:_e,mapUseColor:(_f=options.mapUseColor)==null?!1:_f,mapUseReverse:(_g=options.mapUseReverse)==null?!1:_g});this.panoU=u,this.panoMesh=new three_webgpu.Mesh(sharedGeometry2,material),this.renderOrder=-2,this.panoMesh.renderOrder=-2,this.panoMesh.position.y=.004,this.panoMesh.scale.set(scale,1,scale),this.add(this.panoMesh),this.currentStartTime=require_memoryUsage.p(),this.needsRender=!0}setProgress(progress){this.setDisabled(!1),this.setLoading(!1),this.progress!==progress&&(progress=require_memoryUsage.M(progress,0,1),this.tapMotion.ended&&(this.progress===0&&this.progressOpacityMotion.set({opacity:1},500).catch(require_memoryUsage.d),progress===0?this.progressOpacityMotion.set({opacity:0},500).catch(require_memoryUsage.d).then(()=>{this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d)}):this.progressMotion.set({progress:require_memoryUsage.M(progress*1.2,0,1)},100).catch(require_memoryUsage.d)),this.progress=progress)}setHDRBoost(boost){this.panoU.hdrBoost.value!==boost&&(this.panoU.hdrBoost.value=boost,this.needsRender=!0)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},200).catch(require_memoryUsage.d))}setCurrent(current){this.current!==current&&(this.currentMotion.set({progress:+!!current},2e3).catch(require_memoryUsage.d),this.current=current,this.current===!0&&(this.currentStartTime=require_memoryUsage.p()))}setLoading(loading){this.loading!==loading&&(this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.loadingOpacityMotion.set({opacity:+!!loading},500).catch(require_memoryUsage.d))}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({progress:+!!disabled},500).catch(require_memoryUsage.d))}tap(){return this.tapMotion.ended?(this.progressOpacityMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.progressMotion.set({progress:0},0).catch(require_memoryUsage.d),this.tapMotion.setKeyframes([{progress:0,value:{scale:1,opacity:1}},{progress:.3,value:{scale:.85,opacity:.5}},{progress:.8,value:{scale:1.05,opacity:.6}},{progress:1,value:{scale:1,opacity:1}}],600).then(()=>{this.progressOpacityMotion.set({opacity:+(this.progress>0)},300).catch(require_memoryUsage.d),this.progressMotion.set({progress:this.progress},120).catch(require_memoryUsage.d)}).catch(require_memoryUsage.d)):Promise.resolve()}updateTime(time,deltaTime){if(this.progressMotion.ended||(this.progressMotion.update(time),this.panoU.progress.value=this.progressMotion.value.progress,this.needsRender=!0),this.progressOpacityMotion.ended||(this.progressOpacityMotion.update(time),this.panoU.progressOpacity.value=this.progressOpacityMotion.value.opacity,this.needsRender=!0),this.opacityMotion.ended||(this.opacityMotion.update(time),this.panoU.opacity.value=this.opacityMotion.value.opacity,this.needsRender=!0),this.visible=this.opacityMotion.value.opacity!==0,(!this.loadingOpacityMotion.ended||this.loadingOpacityMotion.value.opacity>0)&&(this.loadingOpacityMotion.update(time),this.panoU.loadingOpacity.value=this.loadingOpacityMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0),this.tapMotion.ended||(this.tapMotion.update(time),this.panoU.tapOpacity.value=this.tapMotion.value.opacity,this.panoU.tapScale.value=this.tapMotion.value.scale,this.needsRender=!0),this.panoU.circleOpacity.value=Math.max(.6,1-Math.max(this.loadingOpacityMotion.value.opacity,this.progressOpacityMotion.value.opacity)),this.current||!this.currentMotion.ended){this.currentMotion.update(time),this.panoU.expandOpacity.value=this.currentMotion.value.progress;{let deltaTime=(time-this.currentStartTime-1500)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand0.value=easeOut(x)*this.currentMotion.value.progress,this.needsRender=!0}}{let deltaTime=(time-this.currentStartTime-1e3)/2e3;if(deltaTime%5<2){let x=deltaTime%1;this.panoU.expand1.value=easeOut(x)*this.currentMotion.value.progress,this.needsRender=!0}}}if(!this.disableMotion.ended){let{progress}=this.disableMotion.value;this.disableMotion.update(time),this.panoU.disable.value=progress,this.needsRender=!0}}dispose(){this.tapMotion.dispose(),this.progressMotion.dispose(),this.progressOpacityMotion.dispose(),this.opacityMotion.dispose(),this.currentMotion.dispose(),this.panoMesh.material.dispose()}};function isSimilarValue(value,anotherValue,circleLength){let _value=Math.abs(value-anotherValue);return _value<.001||circleLength!==void 0&&Math.abs(circleLength-_value)<.001}function notSimilarValue(value,anotherValue,circleLength){return!isSimilarValue(value,anotherValue,circleLength)}function isSimilarVector3(vector,anotherVector){return vector.distanceTo(anotherVector)<.001}function notSimilarVector3(vector,anotherVector){return!isSimilarVector3(vector,anotherVector)}function isPromise(obj){return!!obj&&(typeof obj==`object`||typeof obj==`function`)&&typeof obj.then==`function`}function createEvent(type,eventArgs){let defaultPrevented=!1,event={type,timeStamp:require_memoryUsage.p(),get defaultPrevented(){return defaultPrevented},preventDefault(){defaultPrevented=!0}};for(let key of Object.keys(eventArgs))key in event||(event[key]=eventArgs[key]);return event}var extendableEventPromisesMap=new WeakMap;function createExtendableEvent(type,eventArgs){let event=createEvent(type,Object.assign(Object.assign({},eventArgs),{waitUntil(promise){let promises=extendableEventPromisesMap.get(event);promises&&promises.push(promise)}}));return extendableEventPromisesMap.set(event,[]),event}function waitForExtendableEvent(event){var _a;return Promise.all((_a=extendableEventPromisesMap.get(event))==null?[]:_a).then(require_memoryUsage.d)}function assignState(state,fromState){state.mode=fromState.mode,state.workCode=fromState.workCode,state.panoIndex=fromState.panoIndex,state.longitude=fromState.longitude,state.latitude=fromState.latitude,state.fov=fromState.fov,state.offset.copy(fromState.offset),state.distance=fromState.distance}function stateEqual(state,equalsState){return state.workCode===equalsState.workCode&&state.mode===equalsState.mode&&state.panoIndex===equalsState.panoIndex&&isSimilarValue(state.longitude,equalsState.longitude,Math.PI*2)&&isSimilarValue(state.latitude,equalsState.latitude)&&isSimilarValue(state.fov,equalsState.fov)&&isSimilarVector3(state.offset,equalsState.offset)&&isSimilarValue(state.distance,equalsState.distance)}function assignPose(pose,fromPose){pose.longitude=fromPose.longitude,pose.latitude=fromPose.latitude,pose.fov=fromPose.fov,pose.distance=fromPose.distance,pose.offset.copy(fromPose.offset)}function clonePose(pose){return{longitude:pose.longitude,latitude:pose.latitude,fov:pose.fov,offset:pose.offset.clone(),distance:pose.distance}}function isThirdPersonMode(mode){switch(mode){case`Floorplan`:return!0;case`Mapview`:return!0;default:return!1}}function isFristPersonMode(mode){switch(mode){case`Panorama`:return!0;case`VRPanorama`:return!0;case`XRPanorama`:return!0;case`Model`:return!0;default:return!1}}function isEmptyObject(obj){for(let name in obj)return!1;return!0}var uScaleY=(0,three_tsl.uniform)(1),vuv$1=(0,three_tsl.uv)(),TAU=(0,three_tsl.float)(6.2831852),PI$1=(0,three_tsl.float)(3.1415926),theta=TAU.mul(vuv$1.x),phi=PI$1.mul(vuv$1.y.sub(.5)),dist$1=phi.cos().abs(),target=(0,three_tsl.normalize)((0,three_tsl.vec3)(theta.sin().negate().mul(dist$1),phi.sin().mul(uScaleY),theta.cos().negate().mul(dist$1))),cubemapNode=(0,three_tsl.cubeTexture)(new three_webgpu.CubeTexture,target),equirectangularMaterial=new three_webgpu.NodeMaterial;equirectangularMaterial.fragmentNode=cubemapNode,equirectangularMaterial.transparent=!0,equirectangularMaterial.depthTest=!1,equirectangularMaterial.depthWrite=!1;var equirectangularFsQuad=new FullScreenQuad(equirectangularMaterial);function renderCubeToEquirectangular(renderer,cubemap,flipY){cubemapNode.value=cubemap,uScaleY.value=flipY?-1:1,equirectangularFsQuad.render(renderer),cubemapNode.value=null}var scratchPrevClearColor$2=new three_webgpu.Color,clearColor$1=0,clearAlpha$1=1;function getRgbaDataFromCubeTexture(renderer,cubemap,flipY,rgbaData){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let renderTarget=new three_webgpu.RenderTarget(rgbaData.width,rgbaData.height,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:three_webgpu.LinearFilter,minFilter:three_webgpu.LinearFilter}),prevRenderTarget=renderer.getRenderTarget();renderer.getClearColor(scratchPrevClearColor$2);let prevClearAlpha=renderer.getClearAlpha(),preAutoClear=renderer.autoClear,preAutoClearColor=renderer.autoClearColor,preAutoClearDepth=renderer.autoClearDepth,preAutoClearStencil=renderer.autoClearStencil;renderer.autoClear=!0,renderer.autoClearColor=!0,renderer.autoClearDepth=!0,renderer.autoClearStencil=!0,renderer.setRenderTarget(renderTarget),renderer.setClearColor(clearColor$1,clearAlpha$1),renderCubeToEquirectangular(renderer,cubemap,flipY),renderer.setRenderTarget(prevRenderTarget),renderer.setClearColor(scratchPrevClearColor$2,prevClearAlpha),renderer.autoClear=preAutoClear,renderer.autoClearColor=preAutoClearColor,renderer.autoClearDepth=preAutoClearDepth,renderer.autoClearStencil=preAutoClearStencil;let pixels=yield renderer.readRenderTargetPixelsAsync(renderTarget,0,0,rgbaData.width,rgbaData.height);return rgbaData.data.set(pixels),renderTarget.dispose(),rgbaData})}var Hammer=(function(window,document,exportName,undefined){"use strict";var VENDOR_PREFIXES=[``,`webkit`,`Moz`,`MS`,`ms`,`o`],TEST_ELEMENT=document.createElement?document.createElement(`div`):undefined,TYPE_FUNCTION=`function`,round=Math.round,abs=Math.abs,now=Date.now;function setTimeoutContext(fn,timeout,context){return setTimeout(bindFn(fn,context),timeout)}function invokeArrayArg(arg,fn,context){return Array.isArray(arg)?(each(arg,context[fn],context),!0):!1}function each(obj,iterator,context){var i;if(obj)if(obj.forEach)obj.forEach(iterator,context);else if(obj.length!==undefined)for(i=0;i<obj.length;)iterator.call(context,obj[i],i,obj),i++;else for(i in obj)obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)}function deprecate(method,name,message){var deprecationMessage=`DEPRECATED METHOD: `+name+`
|
|
515
515
|
`+message+` AT
|
|
516
516
|
`;return function(){var e=Error(`get-stack-trace`),stack=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,``).replace(/^\s+at\s+/gm,``).replace(/^Object.<anonymous>\s*\(/gm,`{anonymous}()@`):`Unknown Stack Trace`,log=window.console&&(window.console.warn||window.console.log);return log&&log.call(window.console,deprecationMessage,stack),method.apply(this,arguments)}}var assign=typeof Object.assign==`function`?Object.assign:function(target){if(target===undefined||target===null)throw TypeError(`Cannot convert undefined or null to object`);for(var output=Object(target),index=1;index<arguments.length;index++){var source=arguments[index];if(source!==undefined&&source!==null)for(var nextKey in source)source.hasOwnProperty(nextKey)&&(output[nextKey]=source[nextKey])}return output},extend=deprecate(function(dest,src,merge){for(var keys=Object.keys(src),i=0;i<keys.length;)(!merge||merge&&dest[keys[i]]===undefined)&&(dest[keys[i]]=src[keys[i]]),i++;return dest},`extend`,"Use `assign`."),merge=deprecate(function(dest,src){return extend(dest,src,!0)},`merge`,"Use `assign`.");function inherit(child,base,properties){var baseP=base.prototype,childP=child.prototype=Object.create(baseP);childP.constructor=child,childP._super=baseP,properties&&assign(childP,properties)}function bindFn(fn,context){return function(){return fn.apply(context,arguments)}}function boolOrFn(val,args){return typeof val==TYPE_FUNCTION?val.apply(args&&args[0]||undefined,args):val}function ifUndefined(val1,val2){return val1===undefined?val2:val1}function addEventListeners(target,types,handler){each(splitStr(types),function(type){target.addEventListener(type,handler,!1)})}function removeEventListeners(target,types,handler){each(splitStr(types),function(type){target.removeEventListener(type,handler,!1)})}function hasParent(node,parent){for(;node;){if(node==parent)return!0;node=node.parentNode}return!1}function inStr(str,find){return str.indexOf(find)>-1}function splitStr(str){return str.trim().split(/\s+/g)}function inArray(src,find,findByKey){if(src.indexOf&&!findByKey)return src.indexOf(find);for(var i=0;i<src.length;){if(findByKey&&src[i][findByKey]==find||!findByKey&&src[i]===find)return i;i++}return-1}function toArray(obj){return Array.prototype.slice.call(obj,0)}function uniqueArray(src,key,sort){for(var results=[],values=[],i=0;i<src.length;){var val=key?src[i][key]:src[i];inArray(values,val)<0&&results.push(src[i]),values[i]=val,i++}return sort&&(results=key?results.sort(function(a,b){return a[key]>b[key]}):results.sort()),results}function prefixed(obj,property){for(var prefix,prop,camelProp=property[0].toUpperCase()+property.slice(1),i=0;i<VENDOR_PREFIXES.length;){if(prefix=VENDOR_PREFIXES[i],prop=prefix?prefix+camelProp:property,prop in obj)return prop;i++}return undefined}var _uniqueId=1;function uniqueId(){return _uniqueId++}function getWindowForElement(element){var doc=element.ownerDocument||element;return doc.defaultView||doc.parentWindow||window}var MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i,SUPPORT_TOUCH=`ontouchstart`in window,SUPPORT_POINTER_EVENTS=prefixed(window,`PointerEvent`)!==undefined,SUPPORT_ONLY_TOUCH=SUPPORT_TOUCH&&MOBILE_REGEX.test(navigator.userAgent),INPUT_TYPE_TOUCH=`touch`,INPUT_TYPE_PEN=`pen`,INPUT_TYPE_MOUSE=`mouse`,INPUT_TYPE_KINECT=`kinect`,COMPUTE_INTERVAL=25,INPUT_START=1,INPUT_MOVE=2,INPUT_END=4,INPUT_CANCEL=8,DIRECTION_NONE=1,DIRECTION_LEFT=2,DIRECTION_RIGHT=4,DIRECTION_UP=8,DIRECTION_DOWN=16,DIRECTION_HORIZONTAL=DIRECTION_LEFT|DIRECTION_RIGHT,DIRECTION_VERTICAL=DIRECTION_UP|DIRECTION_DOWN,DIRECTION_ALL=DIRECTION_HORIZONTAL|DIRECTION_VERTICAL,PROPS_XY=[`x`,`y`],PROPS_CLIENT_XY=[`clientX`,`clientY`];function Input(manager,callback){var self=this;this.manager=manager,this.callback=callback,this.element=manager.element,this.target=manager.options.inputTarget,this.domHandler=function(ev){boolOrFn(manager.options.enable,[manager])&&self.handler(ev)},this.init()}Input.prototype={handler:function(){},init:function(){this.evEl&&addEventListeners(this.element,this.evEl,this.domHandler),this.evTarget&&addEventListeners(this.target,this.evTarget,this.domHandler),this.evWin&&addEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&removeEventListeners(this.element,this.evEl,this.domHandler),this.evTarget&&removeEventListeners(this.target,this.evTarget,this.domHandler),this.evWin&&removeEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)}};function createInputInstance(manager){var Type;return Type=manager.options.inputClass||(SUPPORT_POINTER_EVENTS?PointerEventInput:SUPPORT_ONLY_TOUCH?TouchInput:SUPPORT_TOUCH?TouchMouseInput:MouseInput),new Type(manager,inputHandler)}function inputHandler(manager,eventType,input){var pointersLen=input.pointers.length,changedPointersLen=input.changedPointers.length,isFirst=eventType&INPUT_START&&pointersLen-changedPointersLen===0,isFinal=eventType&(INPUT_END|INPUT_CANCEL)&&pointersLen-changedPointersLen===0;input.isFirst=!!isFirst,input.isFinal=!!isFinal,isFirst&&(manager.session={}),input.eventType=eventType,computeInputData(manager,input),manager.emit(`hammer.input`,input),manager.recognize(input),manager.session.prevInput=input}function computeInputData(manager,input){var session=manager.session,pointers=input.pointers,pointersLength=pointers.length;session.firstInput||(session.firstInput=simpleCloneInputData(input)),pointersLength>1&&!session.firstMultiple?session.firstMultiple=simpleCloneInputData(input):pointersLength===1&&(session.firstMultiple=!1);var firstInput=session.firstInput,firstMultiple=session.firstMultiple,offsetCenter=firstMultiple?firstMultiple.center:firstInput.center,center=input.center=getCenter(pointers);input.timeStamp=now(),input.deltaTime=input.timeStamp-firstInput.timeStamp,input.angle=getAngle(offsetCenter,center),input.distance=getDistance(offsetCenter,center),computeDeltaXY(session,input),input.offsetDirection=getDirection(input.deltaX,input.deltaY);var overallVelocity=getVelocity(input.deltaTime,input.deltaX,input.deltaY);input.overallVelocityX=overallVelocity.x,input.overallVelocityY=overallVelocity.y,input.overallVelocity=abs(overallVelocity.x)>abs(overallVelocity.y)?overallVelocity.x:overallVelocity.y,input.scale=firstMultiple?getScale(firstMultiple.pointers,pointers):1,input.rotation=firstMultiple?getRotation(firstMultiple.pointers,pointers):0,input.maxPointers=session.prevInput?input.pointers.length>session.prevInput.maxPointers?input.pointers.length:session.prevInput.maxPointers:input.pointers.length,computeIntervalInputData(session,input);var target=manager.element;hasParent(input.srcEvent.target,target)&&(target=input.srcEvent.target),input.target=target}function computeDeltaXY(session,input){var center=input.center,offset=session.offsetDelta||{},prevDelta=session.prevDelta||{},prevInput=session.prevInput||{};(input.eventType===INPUT_START||prevInput.eventType===INPUT_END)&&(prevDelta=session.prevDelta={x:prevInput.deltaX||0,y:prevInput.deltaY||0},offset=session.offsetDelta={x:center.x,y:center.y}),input.deltaX=prevDelta.x+(center.x-offset.x),input.deltaY=prevDelta.y+(center.y-offset.y)}function computeIntervalInputData(session,input){var last=session.lastInterval||input,deltaTime=input.timeStamp-last.timeStamp,velocity,velocityX,velocityY,direction;if(input.eventType!=INPUT_CANCEL&&(deltaTime>COMPUTE_INTERVAL||last.velocity===undefined)){var deltaX=input.deltaX-last.deltaX,deltaY=input.deltaY-last.deltaY,v=getVelocity(deltaTime,deltaX,deltaY);velocityX=v.x,velocityY=v.y,velocity=abs(v.x)>abs(v.y)?v.x:v.y,direction=getDirection(deltaX,deltaY),session.lastInterval=input}else velocity=last.velocity,velocityX=last.velocityX,velocityY=last.velocityY,direction=last.direction;input.velocity=velocity,input.velocityX=velocityX,input.velocityY=velocityY,input.direction=direction}function simpleCloneInputData(input){for(var pointers=[],i=0;i<input.pointers.length;)pointers[i]={clientX:round(input.pointers[i].clientX),clientY:round(input.pointers[i].clientY)},i++;return{timeStamp:now(),pointers,center:getCenter(pointers),deltaX:input.deltaX,deltaY:input.deltaY}}function getCenter(pointers){var pointersLength=pointers.length;if(pointersLength===1)return{x:round(pointers[0].clientX),y:round(pointers[0].clientY)};for(var x=0,y=0,i=0;i<pointersLength;)x+=pointers[i].clientX,y+=pointers[i].clientY,i++;return{x:round(x/pointersLength),y:round(y/pointersLength)}}function getVelocity(deltaTime,x,y){return{x:x/deltaTime||0,y:y/deltaTime||0}}function getDirection(x,y){return x===y?DIRECTION_NONE:abs(x)>=abs(y)?x<0?DIRECTION_LEFT:DIRECTION_RIGHT:y<0?DIRECTION_UP:DIRECTION_DOWN}function getDistance(p1,p2,props){props||(props=PROPS_XY);var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.sqrt(x*x+y*y)}function getAngle(p1,p2,props){props||(props=PROPS_XY);var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.atan2(y,x)*180/Math.PI}function getRotation(start,end){return getAngle(end[1],end[0],PROPS_CLIENT_XY)+getAngle(start[1],start[0],PROPS_CLIENT_XY)}function getScale(start,end){return getDistance(end[0],end[1],PROPS_CLIENT_XY)/getDistance(start[0],start[1],PROPS_CLIENT_XY)}var MOUSE_INPUT_MAP={mousedown:INPUT_START,mousemove:INPUT_MOVE,mouseup:INPUT_END},MOUSE_ELEMENT_EVENTS=`mousedown`,MOUSE_WINDOW_EVENTS=`mousemove mouseup`;function MouseInput(){this.evEl=MOUSE_ELEMENT_EVENTS,this.evWin=MOUSE_WINDOW_EVENTS,this.pressed=!1,Input.apply(this,arguments)}inherit(MouseInput,Input,{handler:function(ev){var eventType=MOUSE_INPUT_MAP[ev.type];eventType&INPUT_START&&(ev.button===0||ev.button===2)&&(this.pressed=!0),eventType&INPUT_MOVE&&ev.which!==1&&(eventType=INPUT_END),this.pressed&&(eventType&INPUT_END&&(this.pressed=!1),this.callback(this.manager,eventType,{pointers:[ev],changedPointers:[ev],pointerType:INPUT_TYPE_MOUSE,srcEvent:ev}))}});var POINTER_INPUT_MAP={pointerdown:INPUT_START,pointermove:INPUT_MOVE,pointerup:INPUT_END,pointercancel:INPUT_CANCEL,pointerout:INPUT_CANCEL},IE10_POINTER_TYPE_ENUM={2:INPUT_TYPE_TOUCH,3:INPUT_TYPE_PEN,4:INPUT_TYPE_MOUSE,5:INPUT_TYPE_KINECT},POINTER_ELEMENT_EVENTS=`pointerdown`,POINTER_WINDOW_EVENTS=`pointermove pointerup pointercancel`;window.MSPointerEvent&&!window.PointerEvent&&(POINTER_ELEMENT_EVENTS=`MSPointerDown`,POINTER_WINDOW_EVENTS=`MSPointerMove MSPointerUp MSPointerCancel`);function PointerEventInput(){this.evEl=POINTER_ELEMENT_EVENTS,this.evWin=POINTER_WINDOW_EVENTS,Input.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}inherit(PointerEventInput,Input,{handler:function(ev){var store=this.store,removePointer=!1,preventSaveEv=!1,eventType=POINTER_INPUT_MAP[ev.type.toLowerCase().replace(`ms`,``)],pointerType=IE10_POINTER_TYPE_ENUM[ev.pointerType]||ev.pointerType,isTouch=pointerType==INPUT_TYPE_TOUCH,storeIndex=inArray(store,ev.pointerId,`pointerId`);eventType&INPUT_START&&(ev.button===0||ev.button===2||isTouch)?storeIndex<0&&(store.push(ev),storeIndex=store.length-1):eventType&(INPUT_END|INPUT_CANCEL)?removePointer=!0:!isTouch&&ev.buttons===0&&(removePointer=!0,preventSaveEv=!0,eventType=POINTER_INPUT_MAP.pointerup),!(storeIndex<0)&&(preventSaveEv||(store[storeIndex]=ev),this.callback(this.manager,eventType,{pointers:store,changedPointers:[ev],pointerType,srcEvent:store[storeIndex]}),removePointer&&store.splice(storeIndex,1))}});var SINGLE_TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL},SINGLE_TOUCH_TARGET_EVENTS=`touchstart`,SINGLE_TOUCH_WINDOW_EVENTS=`touchstart touchmove touchend touchcancel`;function SingleTouchInput(){this.evTarget=SINGLE_TOUCH_TARGET_EVENTS,this.evWin=SINGLE_TOUCH_WINDOW_EVENTS,this.started=!1,Input.apply(this,arguments)}inherit(SingleTouchInput,Input,{handler:function(ev){var type=SINGLE_TOUCH_INPUT_MAP[ev.type];if(type===INPUT_START&&(this.started=!0),this.started){var touches=normalizeSingleTouches.call(this,ev,type);type&(INPUT_END|INPUT_CANCEL)&&touches[0].length-touches[1].length===0&&(this.started=!1),this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}}});function normalizeSingleTouches(ev,type){var all=toArray(ev.touches),changed=toArray(ev.changedTouches);return type&(INPUT_END|INPUT_CANCEL)&&(all=uniqueArray(all.concat(changed),`identifier`,!0)),[all,changed]}var TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL},TOUCH_TARGET_EVENTS=`touchstart touchmove touchend touchcancel`;function TouchInput(){this.evTarget=TOUCH_TARGET_EVENTS,this.targetIds={},Input.apply(this,arguments)}inherit(TouchInput,Input,{handler:function(ev){var type=TOUCH_INPUT_MAP[ev.type],touches=getTouches.call(this,ev,type);touches&&this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function getTouches(ev,type){var allTouches=toArray(ev.touches),targetIds=this.targetIds;if(type&(INPUT_START|INPUT_MOVE)&&allTouches.length===1)return targetIds[allTouches[0].identifier]=!0,[allTouches,allTouches];var i,targetTouches,changedTouches=toArray(ev.changedTouches),changedTargetTouches=[],target=this.target;if(targetTouches=allTouches.filter(function(touch){return hasParent(touch.target,target)}),type===INPUT_START)for(i=0;i<targetTouches.length;)targetIds[targetTouches[i].identifier]=!0,i++;for(i=0;i<changedTouches.length;)targetIds[changedTouches[i].identifier]&&changedTargetTouches.push(changedTouches[i]),type&(INPUT_END|INPUT_CANCEL)&&delete targetIds[changedTouches[i].identifier],i++;if(changedTargetTouches.length)return[uniqueArray(targetTouches.concat(changedTargetTouches),`identifier`,!0),changedTargetTouches]}var DEDUP_TIMEOUT=2500,DEDUP_DISTANCE=25;function TouchMouseInput(){Input.apply(this,arguments);var handler=bindFn(this.handler,this);this.touch=new TouchInput(this.manager,handler),this.mouse=new MouseInput(this.manager,handler),this.primaryTouch=null,this.lastTouches=[]}inherit(TouchMouseInput,Input,{handler:function(manager,inputEvent,inputData){var isTouch=inputData.pointerType==INPUT_TYPE_TOUCH,isMouse=inputData.pointerType==INPUT_TYPE_MOUSE;if(!(isMouse&&inputData.sourceCapabilities&&inputData.sourceCapabilities.firesTouchEvents)){if(isTouch)recordTouches.call(this,inputEvent,inputData);else if(isMouse&&isSyntheticEvent.call(this,inputData))return;this.callback(manager,inputEvent,inputData)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});function recordTouches(eventType,eventData){eventType&INPUT_START?(this.primaryTouch=eventData.changedPointers[0].identifier,setLastTouch.call(this,eventData)):eventType&(INPUT_END|INPUT_CANCEL)&&setLastTouch.call(this,eventData)}function setLastTouch(eventData){var touch=eventData.changedPointers[0];if(touch.identifier===this.primaryTouch){var lastTouch={x:touch.clientX,y:touch.clientY};this.lastTouches.push(lastTouch);var lts=this.lastTouches;setTimeout(function(){var i=lts.indexOf(lastTouch);i>-1&<s.splice(i,1)},DEDUP_TIMEOUT)}}function isSyntheticEvent(eventData){for(var x=eventData.srcEvent.clientX,y=eventData.srcEvent.clientY,i=0;i<this.lastTouches.length;i++){var t=this.lastTouches[i],dx=Math.abs(x-t.x),dy=Math.abs(y-t.y);if(dx<=DEDUP_DISTANCE&&dy<=DEDUP_DISTANCE)return!0}return!1}var PREFIXED_TOUCH_ACTION=TEST_ELEMENT?prefixed(TEST_ELEMENT.style,`touchAction`):undefined,NATIVE_TOUCH_ACTION=PREFIXED_TOUCH_ACTION!==undefined,TOUCH_ACTION_COMPUTE=`compute`,TOUCH_ACTION_AUTO=`auto`,TOUCH_ACTION_MANIPULATION=`manipulation`,TOUCH_ACTION_NONE=`none`,TOUCH_ACTION_PAN_X=`pan-x`,TOUCH_ACTION_PAN_Y=`pan-y`,TOUCH_ACTION_MAP=getTouchActionProps();function TouchAction(manager,value){this.manager=manager,this.set(value)}TouchAction.prototype={set:function(value){value==TOUCH_ACTION_COMPUTE&&(value=this.compute()),NATIVE_TOUCH_ACTION&&this.manager.element.style&&TOUCH_ACTION_MAP[value]&&(this.manager.element.style[PREFIXED_TOUCH_ACTION]=value),this.actions=value.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var actions=[];return each(this.manager.recognizers,function(recognizer){boolOrFn(recognizer.options.enable,[recognizer])&&(actions=actions.concat(recognizer.getTouchAction()))}),cleanTouchActions(actions.join(` `))},preventDefaults:function(input){var srcEvent=input.srcEvent,direction=input.offsetDirection;if(this.manager.session.prevented){srcEvent.preventDefault();return}var actions=this.actions,hasNone=inStr(actions,TOUCH_ACTION_NONE)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_NONE],hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y],hasPanX=inStr(actions,TOUCH_ACTION_PAN_X)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];if(hasNone){var isTapPointer=input.pointers.length===1,isTapMovement=input.distance<2,isTapTouchTime=input.deltaTime<250;if(isTapPointer&&isTapMovement&&isTapTouchTime)return}if(!(hasPanX&&hasPanY)&&(hasNone||hasPanY&&direction&DIRECTION_HORIZONTAL||hasPanX&&direction&DIRECTION_VERTICAL))return this.preventSrc(srcEvent)},preventSrc:function(srcEvent){this.manager.session.prevented=!0,srcEvent.preventDefault()}};function cleanTouchActions(actions){if(inStr(actions,TOUCH_ACTION_NONE))return TOUCH_ACTION_NONE;var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X),hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);return hasPanX&&hasPanY?TOUCH_ACTION_NONE:hasPanX||hasPanY?hasPanX?TOUCH_ACTION_PAN_X:TOUCH_ACTION_PAN_Y:inStr(actions,TOUCH_ACTION_MANIPULATION)?TOUCH_ACTION_MANIPULATION:TOUCH_ACTION_AUTO}function getTouchActionProps(){if(!NATIVE_TOUCH_ACTION)return!1;var touchMap={},cssSupports=window.CSS&&window.CSS.supports;return[`auto`,`manipulation`,`pan-y`,`pan-x`,`pan-x pan-y`,`none`].forEach(function(val){touchMap[val]=cssSupports?window.CSS.supports(`touch-action`,val):!0}),touchMap}var STATE_POSSIBLE=1,STATE_BEGAN=2,STATE_CHANGED=4,STATE_ENDED=8,STATE_RECOGNIZED=STATE_ENDED,STATE_CANCELLED=16,STATE_FAILED=32;function Recognizer(options){this.options=assign({},this.defaults,options||{}),this.id=uniqueId(),this.manager=null,this.options.enable=ifUndefined(this.options.enable,!0),this.state=STATE_POSSIBLE,this.simultaneous={},this.requireFail=[]}Recognizer.prototype={defaults:{},set:function(options){return assign(this.options,options),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,`recognizeWith`,this))return this;var simultaneous=this.simultaneous;return otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this),simultaneous[otherRecognizer.id]||(simultaneous[otherRecognizer.id]=otherRecognizer,otherRecognizer.recognizeWith(this)),this},dropRecognizeWith:function(otherRecognizer){return invokeArrayArg(otherRecognizer,`dropRecognizeWith`,this)?this:(otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this),delete this.simultaneous[otherRecognizer.id],this)},requireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,`requireFailure`,this))return this;var requireFail=this.requireFail;return otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this),inArray(requireFail,otherRecognizer)===-1&&(requireFail.push(otherRecognizer),otherRecognizer.requireFailure(this)),this},dropRequireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,`dropRequireFailure`,this))return this;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);var index=inArray(this.requireFail,otherRecognizer);return index>-1&&this.requireFail.splice(index,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(otherRecognizer){return!!this.simultaneous[otherRecognizer.id]},emit:function(input){var self=this,state=this.state;function emit(event){self.manager.emit(event,input)}state<STATE_ENDED&&emit(self.options.event+stateStr(state)),emit(self.options.event),input.additionalEvent&&emit(input.additionalEvent),state>=STATE_ENDED&&emit(self.options.event+stateStr(state))},tryEmit:function(input){if(this.canEmit())return this.emit(input);this.state=STATE_FAILED},canEmit:function(){for(var i=0;i<this.requireFail.length;){if(!(this.requireFail[i].state&(STATE_FAILED|STATE_POSSIBLE)))return!1;i++}return!0},recognize:function(inputData){var inputDataClone=assign({},inputData);if(!boolOrFn(this.options.enable,[this,inputDataClone])){this.reset(),this.state=STATE_FAILED;return}this.state&(STATE_RECOGNIZED|STATE_CANCELLED|STATE_FAILED)&&(this.state=STATE_POSSIBLE),this.state=this.process(inputDataClone),this.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED|STATE_CANCELLED)&&this.tryEmit(inputDataClone)},process:function(inputData){},getTouchAction:function(){},reset:function(){}};function stateStr(state){return state&STATE_CANCELLED?`cancel`:state&STATE_ENDED?`end`:state&STATE_CHANGED?`move`:state&STATE_BEGAN?`start`:``}function directionStr(direction){return direction==DIRECTION_DOWN?`down`:direction==DIRECTION_UP?`up`:direction==DIRECTION_LEFT?`left`:direction==DIRECTION_RIGHT?`right`:``}function getRecognizerByNameIfManager(otherRecognizer,recognizer){var manager=recognizer.manager;return manager?manager.get(otherRecognizer):otherRecognizer}function AttrRecognizer(){Recognizer.apply(this,arguments)}inherit(AttrRecognizer,Recognizer,{defaults:{pointers:1},attrTest:function(input){var optionPointers=this.options.pointers;return optionPointers===0||input.pointers.length===optionPointers},process:function(input){var state=this.state,eventType=input.eventType,isRecognized=state&(STATE_BEGAN|STATE_CHANGED),isValid=this.attrTest(input);return isRecognized&&(eventType&INPUT_CANCEL||!isValid)?state|STATE_CANCELLED:isRecognized||isValid?eventType&INPUT_END?state|STATE_ENDED:state&STATE_BEGAN?state|STATE_CHANGED:STATE_BEGAN:STATE_FAILED}});function PanRecognizer(){AttrRecognizer.apply(this,arguments),this.pX=null,this.pY=null}inherit(PanRecognizer,AttrRecognizer,{defaults:{event:`pan`,threshold:10,pointers:1,direction:DIRECTION_ALL},getTouchAction:function(){var direction=this.options.direction,actions=[];return direction&DIRECTION_HORIZONTAL&&actions.push(TOUCH_ACTION_PAN_Y),direction&DIRECTION_VERTICAL&&actions.push(TOUCH_ACTION_PAN_X),actions},directionTest:function(input){var options=this.options,hasMoved=!0,distance=input.distance,direction=input.direction,x=input.deltaX,y=input.deltaY;return direction&options.direction||(options.direction&DIRECTION_HORIZONTAL?(direction=x===0?DIRECTION_NONE:x<0?DIRECTION_LEFT:DIRECTION_RIGHT,hasMoved=x!=this.pX,distance=Math.abs(input.deltaX)):(direction=y===0?DIRECTION_NONE:y<0?DIRECTION_UP:DIRECTION_DOWN,hasMoved=y!=this.pY,distance=Math.abs(input.deltaY))),input.direction=direction,hasMoved&&distance>options.threshold&&direction&options.direction},attrTest:function(input){return AttrRecognizer.prototype.attrTest.call(this,input)&&(this.state&STATE_BEGAN||!(this.state&STATE_BEGAN)&&this.directionTest(input))},emit:function(input){this.pX=input.deltaX,this.pY=input.deltaY;var direction=directionStr(input.direction);direction&&(input.additionalEvent=this.options.event+direction),this._super.emit.call(this,input)}});function PinchRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:`pinch`,threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.scale-1)>this.options.threshold||this.state&STATE_BEGAN)},emit:function(input){if(input.scale!==1){var inOut=input.scale<1?`in`:`out`;input.additionalEvent=this.options.event+inOut}this._super.emit.call(this,input)}});function PressRecognizer(){Recognizer.apply(this,arguments),this._timer=null,this._input=null}inherit(PressRecognizer,Recognizer,{defaults:{event:`press`,pointers:1,time:251,threshold:9},getTouchAction:function(){return[TOUCH_ACTION_AUTO]},process:function(input){var options=this.options,validPointers=input.pointers.length===options.pointers,validMovement=input.distance<options.threshold,validTime=input.deltaTime>options.time;if(this._input=input,!validMovement||!validPointers||input.eventType&(INPUT_END|INPUT_CANCEL)&&!validTime)this.reset();else if(input.eventType&INPUT_START)this.reset(),this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED,this.tryEmit()},options.time,this);else if(input.eventType&INPUT_END)return STATE_RECOGNIZED;return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(input){this.state===STATE_RECOGNIZED&&(input&&input.eventType&INPUT_END?this.manager.emit(this.options.event+`up`,input):(this._input.timeStamp=now(),this.manager.emit(this.options.event,this._input)))}});function RotateRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:`rotate`,threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.rotation)>this.options.threshold||this.state&STATE_BEGAN)}});function SwipeRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:`swipe`,threshold:10,velocity:.3,direction:DIRECTION_HORIZONTAL|DIRECTION_VERTICAL,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(input){var direction=this.options.direction,velocity;return direction&(DIRECTION_HORIZONTAL|DIRECTION_VERTICAL)?velocity=input.overallVelocity:direction&DIRECTION_HORIZONTAL?velocity=input.overallVelocityX:direction&DIRECTION_VERTICAL&&(velocity=input.overallVelocityY),this._super.attrTest.call(this,input)&&direction&input.offsetDirection&&input.distance>this.options.threshold&&input.maxPointers==this.options.pointers&&abs(velocity)>this.options.velocity&&input.eventType&INPUT_END},emit:function(input){var direction=directionStr(input.offsetDirection);direction&&this.manager.emit(this.options.event+direction,input),this.manager.emit(this.options.event,input)}});function TapRecognizer(){Recognizer.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}inherit(TapRecognizer,Recognizer,{defaults:{event:`tap`,pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[TOUCH_ACTION_MANIPULATION]},process:function(input){var options=this.options,validPointers=input.pointers.length===options.pointers,validMovement=input.distance<options.threshold,validTouchTime=input.deltaTime<options.time;if(this.reset(),input.eventType&INPUT_START&&this.count===0)return this.failTimeout();if(validMovement&&validTouchTime&&validPointers){if(input.eventType!=INPUT_END)return this.failTimeout();var validInterval=this.pTime?input.timeStamp-this.pTime<options.interval:!0,validMultiTap=!this.pCenter||getDistance(this.pCenter,input.center)<options.posThreshold;if(this.pTime=input.timeStamp,this.pCenter=input.center,!validMultiTap||!validInterval?this.count=1:this.count+=1,this._input=input,this.count%options.taps===0)return this.hasRequireFailures()?(this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED,this.tryEmit()},options.interval,this),STATE_BEGAN):STATE_RECOGNIZED}return STATE_FAILED},failTimeout:function(){return this._timer=setTimeoutContext(function(){this.state=STATE_FAILED},this.options.interval,this),STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==STATE_RECOGNIZED&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}});function Hammer(element,options){return options=options||{},options.recognizers=ifUndefined(options.recognizers,Hammer.defaults.preset),new Manager(element,options)}Hammer.VERSION=`2.0.7`,Hammer.defaults={domEvents:!1,touchAction:TOUCH_ACTION_COMPUTE,enable:!0,inputTarget:null,inputClass:null,preset:[[RotateRecognizer,{enable:!1}],[PinchRecognizer,{enable:!1},[`rotate`]],[SwipeRecognizer,{direction:DIRECTION_HORIZONTAL}],[PanRecognizer,{direction:DIRECTION_HORIZONTAL},[`swipe`]],[TapRecognizer],[TapRecognizer,{event:`doubletap`,taps:2},[`tap`]],[PressRecognizer]],cssProps:{userSelect:`none`,touchSelect:`none`,touchCallout:`none`,contentZooming:`none`,userDrag:`none`,tapHighlightColor:`rgba(0,0,0,0)`}};var STOP=1,FORCED_STOP=2;function Manager(element,options){this.options=assign({},Hammer.defaults,options||{}),this.options.inputTarget=this.options.inputTarget||element,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=element,this.input=createInputInstance(this),this.touchAction=new TouchAction(this,this.options.touchAction),toggleCssProps(this,!0),each(this.options.recognizers,function(item){var recognizer=this.add(new item[0](item[1]));item[2]&&recognizer.recognizeWith(item[2]),item[3]&&recognizer.requireFailure(item[3])},this)}Manager.prototype={set:function(options){return assign(this.options,options),options.touchAction&&this.touchAction.update(),options.inputTarget&&(this.input.destroy(),this.input.target=options.inputTarget,this.input.init()),this},stop:function(force){this.session.stopped=force?FORCED_STOP:STOP},recognize:function(inputData){var session=this.session;if(!session.stopped){this.touchAction.preventDefaults(inputData);var recognizer,recognizers=this.recognizers,curRecognizer=session.curRecognizer;(!curRecognizer||curRecognizer&&curRecognizer.state&STATE_RECOGNIZED)&&(curRecognizer=session.curRecognizer=null);for(var i=0;i<recognizers.length;)recognizer=recognizers[i],session.stopped!==FORCED_STOP&&(!curRecognizer||recognizer==curRecognizer||recognizer.canRecognizeWith(curRecognizer))?recognizer.recognize(inputData):recognizer.reset(),!curRecognizer&&recognizer.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED)&&(curRecognizer=session.curRecognizer=recognizer),i++}},get:function(recognizer){if(recognizer instanceof Recognizer)return recognizer;for(var recognizers=this.recognizers,i=0;i<recognizers.length;i++)if(recognizers[i].options.event==recognizer)return recognizers[i];return null},add:function(recognizer){if(invokeArrayArg(recognizer,`add`,this))return this;var existing=this.get(recognizer.options.event);return existing&&this.remove(existing),this.recognizers.push(recognizer),recognizer.manager=this,this.touchAction.update(),recognizer},remove:function(recognizer){if(invokeArrayArg(recognizer,`remove`,this))return this;if(recognizer=this.get(recognizer),recognizer){var recognizers=this.recognizers,index=inArray(recognizers,recognizer);index!==-1&&(recognizers.splice(index,1),this.touchAction.update())}return this},on:function(events,handler){if(events!==undefined&&handler!==undefined){var handlers=this.handlers;return each(splitStr(events),function(event){handlers[event]=handlers[event]||[],handlers[event].push(handler)}),this}},off:function(events,handler){if(events!==undefined){var handlers=this.handlers;return each(splitStr(events),function(event){handler?handlers[event]&&handlers[event].splice(inArray(handlers[event],handler),1):delete handlers[event]}),this}},emit:function(event,data){this.options.domEvents&&triggerDomEvent(event,data);var handlers=this.handlers[event]&&this.handlers[event].slice();if(!(!handlers||!handlers.length)){data.type=event,data.preventDefault=function(){data.srcEvent.preventDefault()};for(var i=0;i<handlers.length;)handlers[i](data),i++}},destroy:function(){this.element&&toggleCssProps(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}};function toggleCssProps(manager,add){var element=manager.element;if(element.style){var prop;each(manager.options.cssProps,function(value,name){prop=prefixed(element.style,name),add?(manager.oldCssProps[prop]=element.style[prop],element.style[prop]=value):element.style[prop]=manager.oldCssProps[prop]||``}),add||(manager.oldCssProps={})}}function triggerDomEvent(event,data){var gestureEvent=document.createEvent(`Event`);gestureEvent.initEvent(event,!0,!0),gestureEvent.gesture=data,data.target.dispatchEvent(gestureEvent)}return assign(Hammer,{INPUT_START,INPUT_MOVE,INPUT_END,INPUT_CANCEL,STATE_POSSIBLE,STATE_BEGAN,STATE_CHANGED,STATE_ENDED,STATE_RECOGNIZED,STATE_CANCELLED,STATE_FAILED,DIRECTION_NONE,DIRECTION_LEFT,DIRECTION_RIGHT,DIRECTION_UP,DIRECTION_DOWN,DIRECTION_HORIZONTAL,DIRECTION_VERTICAL,DIRECTION_ALL,Manager,Input,TouchAction,TouchInput,MouseInput,PointerEventInput,TouchMouseInput,SingleTouchInput,Recognizer,AttrRecognizer,Tap:TapRecognizer,Pan:PanRecognizer,Swipe:SwipeRecognizer,Pinch:PinchRecognizer,Rotate:RotateRecognizer,Press:PressRecognizer,on:addEventListeners,off:removeEventListeners,each,merge,extend,assign,inherit,bindFn,prefixed}),Hammer})(typeof window<`u`?window:{},typeof document<`u`?document:{},`Hammer`);function setRaycasterFromCamera(raycaster,coords,camera){if(camera.isPerspectiveCamera){raycaster.setFromCamera(coords,camera);return}if(camera.isOrthographicCamera){let cameraPlaneNdcZ=camera.projectionMatrix.elements[14];raycaster.ray.origin.set(coords.x,coords.y,cameraPlaneNdcZ).unproject(camera),raycaster.ray.direction.set(0,0,-1).transformDirection(camera.matrixWorld),raycaster.camera=camera;return}raycaster.setFromCamera(coords,camera)}var BaseController=class BaseController extends require_memoryUsage.j{static parseArgs(args){return args instanceof BaseController?args:Object.assign({},args)}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f,_g,_h;let args_=this.parseArgs(args),{state,currentState}=args_.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex};return Object.assign(Object.assign({},pano),{mode:``,longitude:(_d=state.longitude)==null?currentState.longitude:_d,latitude:(_e=state.latitude)==null?currentState.latitude:_e,fov:(_f=state.fov)==null?currentState.fov:_f,offset:(_g=state.offset)==null?currentState.offset:_g,distance:(_h=state.distance)==null?currentState.distance:_h})}constructor(args){var _a,_b,_c;super();let args_=BaseController.parseArgs(args);this.mode=``,this.pending=new Set,this.userAction=args_.initial.userAction,this.destroyed=!1,this.fiveId=args_.fiveId,this.scene=args_.scene,this.modelScene=args_.modelScene,this.xrCustomObjectsScene=args_.xrCustomObjectsScene,this.helper=args_.helper,this.camera=args_.camera,this.renderer=args_.renderer,this.viewport=args_.viewport,this.element=args_.element,this.enableWheel=args_.enableWheel,this.enableHDR=args_.enableHDR,this.works=args_.works,this.imageOptions=args_.imageOptions,this.videoTexture=args_.videoTexture,this.extraElements=args_.extraElements,this.initial=args_.initial,this.currentPano=typeof this.initial.state.panoIndex==`number`?{workCode:(_c=(_a=this.initial.state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:this.initial.state.panoIndex}:{workCode:this.initial.currentState.workCode,panoIndex:this.initial.currentState.panoIndex},this.needsRender=!0,this.cameraMotion=new Motion({longitude:{value:this.camera.pose.longitude,circle:[0,Math.PI*2]},latitude:this.camera.pose.latitude,fov:this.camera.pose.fov}),this.inMomentumMovement=null,this.eventUnbinds=[args_.element].concat(args_.extraElements||[]).map(element=>this.bindEvents(element)),this.initAnimationIsReady=!1,this.pending.add(`init-animation`),this.initAnimationReady=new Promise(resolve=>{require_imageBitmap.s.shared.add(()=>{this.initAnimation().then(()=>{this.initAnimationIsReady=!0,this.pending.delete(`init-animation`),resolve()})},!0,0)})}updateConfiguration(args){return!0}destroy(){var _a;this.stopMomentumMovement(),this.destroyed=!0,this.off(),this.cameraMotion.dispose();for(let unbind of this.eventUnbinds)unbind();this.panState=void 0,(_a=this.pressState)==null||_a.stop(),this.pressState=void 0}isReady(){return this.inMomentumMovement===null&&this.pending.size===0&&this.cameraMotion.ended===!0}bindExtraElement(element){for(let unbind of this.eventUnbinds)if(unbind.element===element)return;this.eventUnbinds.push(this.bindEvents(element))}unbindExtraElement(element){let eventUnbinds=[];for(let unbind of this.eventUnbinds)unbind.element===element?unbind():eventUnbinds.push(unbind);this.eventUnbinds=eventUnbinds}updateModel(modelScene){this.needsRender=!0}updateWork(works,state,options,userAction){return this.works=works,this.userAction=userAction,!1}updateTime(time,deltaTime,...args){if(this.destroyed)return;let cameraPose={};this.cameraMotion.ended&&(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),isEmptyObject(cameraPose)&&this.setCamera(cameraPose)}render(){return!1}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let cameraValue={};return pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let cameraKeyframe=[];for(let keyframe of keyframes)cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.cameraMotion.setKeyframes(cameraKeyframe,duration)})}getTargetState(){let targetKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1];return Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:targetKeyFrame.value.longitude,latitude:targetKeyFrame.value.latitude,fov:targetKeyFrame.value.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance})}initAnimation(){let{state,currentState,duration,userAction}=this.initial,toState=BaseController.initAnimationEndState(this);return this.userAction=userAction,this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state:toState,userAction:this.userAction})),this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state:toState,userAction:this.userAction})),Promise.resolve()}setCamera(cameraPose={}){var _a,_b,_c,_d,_e;let longitude=(_a=cameraPose.longitude)==null?this.camera.pose.longitude:_a,latitude=(_b=cameraPose.latitude)==null?this.camera.pose.latitude:_b,fov=(_c=cameraPose.fov)==null?this.camera.pose.fov:_c,distance=(_d=cameraPose.distance)==null?this.camera.pose.distance:_d,offset=(_e=cameraPose.offset)==null?this.camera.pose.offset:_e,directionUpdated=notSimilarValue(longitude,this.camera.pose.longitude,Math.PI*2)||notSimilarValue(latitude,this.camera.pose.latitude),fovUpdated=notSimilarValue(fov,this.camera.pose.fov),distanceUpdated=notSimilarValue(distance,this.camera.pose.distance),offsetUpdated=notSimilarVector3(offset,this.camera.pose.offset);(fovUpdated||directionUpdated||offsetUpdated||distanceUpdated)&&(this.camera.setFromPose({longitude,latitude,fov,distance,offset}),this.emit(`camera.update`,createEvent(`camera.update`,{userAction:this.userAction,state:Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov,offset,distance})})),this.needsRender=!0)}stopMomentumMovement(){if(this.inMomentumMovement&&this.inMomentumMovement.event&&!this.inMomentumMovement.event.defaultPrevented&&!this.inMomentumMovement.event.isFinal){let gestureEvent=createEvent(`gesture.momentum`,Object.assign(Object.assign({},this.inMomentumMovement.event),{isFirst:!1,isFinal:!0}));this.emit(`gesture.fire`,gestureEvent),this.emit(`gesture.momentum`,gestureEvent)}this.inMomentumMovement=null}onPanGesture(event){this.stopMomentumMovement(),this.emit(`gesture.pan`,event)}onTapGesture(event){this.stopMomentumMovement(),this.emit(`gesture.tap`,event)}onDblTapGesture(event){this.stopMomentumMovement(),this.emit(`gesture.dbltap`,event),!event.defaultPrevented&&(event.type=`gesture.tap`,this.onTapGesture(event))}onPressGesture(event){this.stopMomentumMovement(),this.emit(`gesture.press`,event)}onPinchGesture(event){this.stopMomentumMovement(),this.emit(`gesture.pinch`,event)}onMouseWheel(event){this.stopMomentumMovement(),this.emit(`gesture.mousewheel`,event)}onMouseMove(event){this.stopMomentumMovement(),this.emit(`gesture.mousemove`,event)}relativeClientPosition(mouseXY){let{top,left,width,height}=this.element.getBoundingClientRect();return left+=width*this.viewport.left,top+=height*(1-this.viewport.bottom-this.viewport.height),width*=this.viewport.width,height*=this.viewport.height,new three_webgpu.Vector2((mouseXY.x-left)/width*2-1,-(mouseXY.y-top)/height*2+1)}createRaycasterFromCamera(coords,camera){let raycaster=new three_webgpu.Raycaster;return raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.near=camera.near,raycaster.far=camera.far,setRaycasterFromCamera(raycaster,coords,camera),raycaster}bindEvents(element){let testEventArea=center=>{let mouse=this.relativeClientPosition(center);return!(Math.abs(mouse.x)>1||Math.abs(mouse.y)>1)},getEventKeys=srcEvent=>({button:`button`in srcEvent?srcEvent.button:0,buttons:`buttons`in srcEvent?srcEvent.buttons:0,shiftKey:`shiftKey`in srcEvent?srcEvent.shiftKey:!1,ctrlKey:`ctrlKey`in srcEvent?srcEvent.ctrlKey:!1,altKey:`altKey`in srcEvent?srcEvent.altKey:!1,metaKey:`metaKey`in srcEvent?srcEvent.metaKey:!1}),mc=new Hammer.Manager(element),getFirstInput=mc=>mc.session.firstInput||null,panRecogniser=new Hammer.Pan({threshold:10,pointers:0}),tapRecogniser=new Hammer.Tap({interval:410}),pinchRecogniser=new Hammer.Pinch({threshold:0,pointers:2});mc.add([panRecogniser,tapRecogniser,pinchRecogniser]),mc.on(`panstart pan`,input=>{let eventKeys=getEventKeys(input.srcEvent),firstInput=getFirstInput(mc);if(firstInput&&!testEventArea(firstInput.center))return;let gestureEvent=createEvent(`gesture.pan`,{target:input.target,pointerType:input.pointerType,srcEvent:input.srcEvent,pointers:input.pointers.map(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})}),isFirst:input.isFirst,isFinal:input.isFinal,scale:input.scale,center:(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})})(input.center),velocityX:input.velocityX,velocityY:input.velocityY,overallVelocityX:input.overallVelocityX,overallVelocityY:input.overallVelocityY,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.onPanGesture(gestureEvent),onPressCancel()}),mc.on(`tap`,input=>{let eventKeys=getEventKeys(input.srcEvent);if(input.pointerType===`mouse`&&eventKeys.button!==0)return;let firstInput=getFirstInput(mc);if(firstInput&&!testEventArea(firstInput.center))return;let gestureEvent=createEvent(`gesture.tap`,{target:input.target,pointerType:input.pointerType,srcEvent:input.srcEvent,pointers:input.pointers.map(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})}),isFirst:!0,isFinal:!0,scale:input.scale,center:(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})})(input.center),velocityX:input.velocityX,velocityY:input.velocityY,overallVelocityX:input.overallVelocityX,overallVelocityY:input.overallVelocityY,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.onTapGesture(gestureEvent),onPressCancel()}),mc.on(`pinchstart pinch pinchend`,input=>{let eventKeys=getEventKeys(input.srcEvent),firstInput=getFirstInput(mc);if(firstInput&&!testEventArea(firstInput.center))return;let gestureEvent=createEvent(`gesture.pinch`,{target:input.target,pointerType:input.pointerType,srcEvent:input.srcEvent,pointers:input.pointers.map(point=>{var _a;let coords=this.relativeClientPosition(point),raycaster=new three_webgpu.Raycaster;return raycaster.params.Points={threshold:.1},setRaycasterFromCamera(raycaster,coords,this.camera),Object.assign(Object.assign({x:point.x,y:point.y,delta:(_a=point.delta)==null?0:_a},eventKeys),{coords,raycaster})}),isFirst:input.type===`pinchstart`,isFinal:input.type===`pinchend`,scale:input.scale,center:(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})})(input.center),velocityX:input.velocityX,velocityY:input.velocityY,overallVelocityX:input.overallVelocityX,overallVelocityY:input.overallVelocityY,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.onPinchGesture(gestureEvent),onPressCancel()}),mc.on(`dbltap`,input=>{let eventKeys=getEventKeys(input.srcEvent);if(input.pointerType===`mouse`&&eventKeys.button!==0)return;let firstInput=getFirstInput(mc);if(firstInput&&!testEventArea(firstInput.center))return;let gestureEvent=createEvent(`gesture.dbltap`,{target:input.target,pointerType:input.pointerType,srcEvent:input.srcEvent,pointers:input.pointers.map(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})}),isFirst:!0,isFinal:!0,scale:input.scale,center:(point=>{let coords=this.relativeClientPosition(point),raycaster=this.createRaycasterFromCamera(coords,this.camera);return Object.assign(Object.assign({x:point.x,y:point.y,delta:0},eventKeys),{coords,raycaster})})(input.center),velocityX:input.velocityX,velocityY:input.velocityY,overallVelocityX:input.overallVelocityX,overallVelocityY:input.overallVelocityY,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.onDblTapGesture(gestureEvent),onPressCancel()});let scrollPinchSession=null,scrollPinchTimer=null,wheelEventToPinshGestureEvent=(type,prevScale,event)=>{let xy={x:event.clientX,y:event.clientY},coords=this.relativeClientPosition(xy),raycaster=this.createRaycasterFromCamera(coords,this.camera),center=Object.assign(Object.assign(Object.assign(Object.assign({},xy),{coords,raycaster}),getEventKeys(event)),{delta:0}),scale=type===`pinchend`?prevScale:prevScale-event.deltaY/280;return createEvent(`gesture.pinch`,{target:event.target,pointerType:`mouse`,srcEvent:event,pointers:[Object.assign({},center)],isFirst:type===`pinchstart`,isFinal:type===`pinchend`,scale:require_memoryUsage.M(scale,.1,10),center:Object.assign({},center),velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))})},onMouseWheel=event=>{var _a;if(testEventArea({x:event.clientX,y:event.clientY})){if(event.preventDefault(),event.ctrlKey){let prevScale=(_a=scrollPinchSession==null?void 0:scrollPinchSession.prevEvent.scale)==null?1:_a,gestureEvent=wheelEventToPinshGestureEvent(scrollPinchSession?`pinch`:`pinchstart`,prevScale,event);this.emit(`gesture.fire`,gestureEvent),scrollPinchSession===null?scrollPinchSession={firstEvent:gestureEvent,prevEvent:gestureEvent}:scrollPinchSession.prevEvent=gestureEvent,this.emit(`gesture.fire`,gestureEvent),this.onPinchGesture(gestureEvent),scrollPinchTimer!==null&&window.clearTimeout(scrollPinchTimer),scrollPinchTimer=window.setTimeout(()=>{var _a;scrollPinchTimer=null;let gestureEvent=wheelEventToPinshGestureEvent(`pinchend`,(_a=scrollPinchSession==null?void 0:scrollPinchSession.prevEvent.scale)==null?1:_a,event);this.emit(`gesture.fire`,gestureEvent),scrollPinchSession=null,this.onPinchGesture(gestureEvent)},200)}else{let delta=(Math.abs(event.deltaY)>Math.abs(event.deltaX)?event.deltaY:event.deltaX)/-60,isFirst=this.mouseWheelState!==void 0,xy={x:event.clientX,y:event.clientY},coords=this.relativeClientPosition(xy),raycaster=this.createRaycasterFromCamera(coords,this.camera),center=Object.assign(Object.assign(Object.assign(Object.assign({},xy),{coords,raycaster}),getEventKeys(event)),{delta}),gestureEvent=createEvent(`gesture.mousewheel`,{target:event.target,pointerType:`mouse`,srcEvent:event,pointers:[Object.assign({},center)],isFirst,isFinal:!1,scale:0,center:Object.assign({},center),velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.onMouseWheel(gestureEvent),this.mouseWheelState&&clearTimeout(this.mouseWheelState.timer),this.mouseWheelState={timer:setTimeout(()=>{this.mouseWheelState=void 0;let gestureEvent=createEvent(`gesture.mousewheel`,{target:event.target,pointerType:`mouse`,srcEvent:event,pointers:[Object.assign(Object.assign({},center),{delta:0})],isFirst:!1,isFinal:!0,scale:0,center:Object.assign(Object.assign({},center),{delta:0}),velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.onMouseWheel(gestureEvent)},100)}}onPressCancel()}},onMouseMove=event=>{if(isMobile)return;if(!testEventArea({x:event.clientX,y:event.clientY})){onMouseOut();return}let isFirst=!1;this.mouseMoveState||(isFirst=!0);let xy={x:event.clientX,y:event.clientY},coords=this.relativeClientPosition(xy),raycaster=this.createRaycasterFromCamera(coords,this.camera),center=Object.assign(Object.assign(Object.assign(Object.assign({},xy),{coords,raycaster}),getEventKeys(event)),{delta:0}),gestureEvent=createEvent(`gesture.mousemove`,{target:event.target,pointerType:`mouse`,srcEvent:event,pointers:[Object.assign({},center)],isFirst,isFinal:!1,scale:0,center:Object.assign({},center),velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),this.mouseMoveState={timeStamp:require_memoryUsage.p(),event:gestureEvent},this.onMouseMove(gestureEvent),this.pressState&&Math.abs(event.clientX-this.pressState.event.center.y)>10&&Math.abs(event.clientY-this.pressState.event.center.y)>10&&onPressCancel()},onMouseOut=()=>{if(this.mouseMoveState){let gestureEvent=createEvent(this.mouseMoveState.event.type,Object.assign(Object.assign({},this.mouseMoveState.event),{isFinal:!0}));this.emit(`gesture.fire`,gestureEvent),this.mouseMoveState=void 0,this.onMouseMove(gestureEvent)}onPressCancel()},onPress=event=>{if(!testEventArea(event.center)){onPressCancel();return}let isFirst=!1;this.pressState||(isFirst=!0,this.pressState={event,timeStamp:require_memoryUsage.p(),stop:require_memoryUsage.d});let delta=require_memoryUsage.p()-this.pressState.timeStamp,gestureEvent=createEvent(this.pressState.event.type,Object.assign(Object.assign({},this.pressState.event),{isFirst,isFinal:!1,center:Object.assign(Object.assign({},this.pressState.event.center),{delta}),pointers:this.pressState.event.pointers.map(pointer=>Object.assign(Object.assign({},pointer),{delta}))}));this.emit(`gesture.fire`,gestureEvent),this.onPressGesture(gestureEvent),this.pressState&&(this.pressState.stop=require_imageBitmap.s.shared.add(time=>{onPress(event)},!0,1))},onPressTouch=event=>{if(onPressCancel(),event.touches.length>1||event.changedTouches.length<=0)return;let xy={x:event.changedTouches[0].clientX,y:event.changedTouches[0].clientY},coords=this.relativeClientPosition(xy),raycaster=this.createRaycasterFromCamera(coords,this.camera),center=Object.assign(Object.assign(Object.assign(Object.assign({},xy),{coords,raycaster}),getEventKeys(event)),{delta:0}),gestureEvent=createEvent(`gesture.press`,{target:event.target,pointerType:`touch`,srcEvent:event,pointers:[Object.assign({},center)],isFirst:!1,isFinal:!1,scale:0,center,velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),onPress(gestureEvent)},onPressMouse=event=>{onPressCancel();let xy={x:event.clientX,y:event.clientY},coords=this.relativeClientPosition(xy),raycaster=this.createRaycasterFromCamera(coords,this.camera),center=Object.assign(Object.assign(Object.assign(Object.assign({},xy),{coords,raycaster}),getEventKeys(event)),{delta:0}),gestureEvent=createEvent(`gesture.press`,{target:event.target,pointerType:`mouse`,srcEvent:event,pointers:[Object.assign({},center)],isFirst:!1,isFinal:!1,scale:0,center,velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))});this.emit(`gesture.fire`,gestureEvent),onPress(gestureEvent)},onPressCancel=()=>{var _a;if(this.pressState){let delta=require_memoryUsage.p()-this.pressState.timeStamp,gestureEvent=createEvent(this.pressState.event.type,Object.assign(Object.assign({},this.pressState.event),{center:Object.assign(Object.assign({},this.pressState.event.center),{delta}),isFirst:!1,isFinal:!0,pointers:this.pressState.event.pointers.map(pointer=>Object.assign(Object.assign({},pointer),{delta}))}));this.emit(`gesture.fire`,gestureEvent),this.onPressGesture(gestureEvent),(_a=this.pressState)==null||_a.stop(),this.pressState=void 0}},gesturePinchSession=null,safariGestureEventToGestureEvent=event=>{var _a,_b,_c;let isFirst=!1,isFinal=!1;switch(event.type){case`gesturestart`:isFirst=!0;break;case`gestureend`:isFinal=!0;break;default:break}let xy={x:(_a=event.clientX)==null?0:_a,y:(_b=event.clientY)==null?0:_b},coords=this.relativeClientPosition(xy),raycaster=this.createRaycasterFromCamera(coords,this.camera),center=Object.assign(Object.assign(Object.assign(Object.assign({},xy),{coords,raycaster}),getEventKeys(event)),{delta:0});return createEvent(`gesture.pinch`,{target:event.target,pointerType:`mouse`,srcEvent:event,pointers:[Object.assign({},center)],isFirst,isFinal,scale:(_c=event.scale)==null?1:_c,center:Object.assign({},center),velocityX:0,velocityY:0,overallVelocityX:0,overallVelocityY:0,userAction:!0,state:Object.assign(Object.assign({mode:this.mode},this.currentPano),clonePose(this.camera.pose))})},onGestureStart=event=>{if(event.preventDefault(),isMobile)return;let gestureEvent=safariGestureEventToGestureEvent(event);this.emit(`gesture.fire`,gestureEvent),gesturePinchSession={firstEvent:gestureEvent};let firstInput=gesturePinchSession.firstEvent;firstInput&&!testEventArea(firstInput.center)||this.onPinchGesture(gestureEvent)},onGestureChange=event=>{if(event.preventDefault(),isMobile||!gesturePinchSession)return;let firstInput=gesturePinchSession.firstEvent;if(firstInput&&!testEventArea(firstInput.center))return;let gestureEvent=safariGestureEventToGestureEvent(event);this.emit(`gesture.fire`,gestureEvent),this.onPinchGesture(gestureEvent)},onGestureEnd=event=>{if(event.preventDefault(),isMobile||!gesturePinchSession)return;let firstInput=gesturePinchSession.firstEvent;if(gesturePinchSession=null,firstInput&&!testEventArea(firstInput.center))return;let gestureEvent=safariGestureEventToGestureEvent(event);this.emit(`gesture.fire`,gestureEvent),this.onPinchGesture(gestureEvent)},preventDefault=event=>{if(event&&typeof event.preventDefault==`function`&&event.currentTarget===element&&event.preventDefault(),typeof getSelection==`function`){let selection=getSelection();selection&&selection.focusNode&&(selection.removeAllRanges&&selection.removeAllRanges(),selection.empty&&selection.empty())}};return this.enableWheel&&element.addEventListener(`wheel`,onMouseWheel,{passive:!1}),element.addEventListener(`mousemove`,onMouseMove,!1),element.addEventListener(`mouseout`,onMouseOut,!1),element.addEventListener(`touchstart`,onPressTouch,{passive:!0}),element.addEventListener(`touchend`,onPressCancel,!1),element.addEventListener(`touchcancel`,onPressCancel,!1),element.addEventListener(`mousedown`,onPressMouse,!1),element.addEventListener(`mouseup`,onPressCancel,!1),element.addEventListener(`gesturestart`,onGestureStart,{passive:!1}),element.addEventListener(`gesturechange`,onGestureChange,{passive:!1}),element.addEventListener(`gestureend`,onGestureEnd,{passive:!1}),element.addEventListener(`touchstart`,preventDefault,{passive:!1}),element.addEventListener(`contextmenu`,preventDefault,!1),Object.assign(()=>{mc.destroy(),element.removeEventListener(`wheel`,onMouseWheel,!1),element.removeEventListener(`mousemove`,onMouseMove,!1),element.removeEventListener(`mouseout`,onMouseOut,!1),element.removeEventListener(`touchstart`,onPressTouch,!1),element.removeEventListener(`touchend`,onPressCancel,!1),element.removeEventListener(`touchcancel`,onPressCancel,!1),element.removeEventListener(`mousedown`,onPressMouse,!1),element.removeEventListener(`mouseup`,onPressCancel,!1),element.removeEventListener(`gesturestart`,onGestureStart,!1),element.removeEventListener(`gesturechange`,onGestureChange,!1),element.removeEventListener(`gestureend`,onGestureEnd,!1),element.removeEventListener(`touchstart`,preventDefault,!1),element.removeEventListener(`contextmenu`,preventDefault,!1)},{element})}},sharedGeometry$2=new three_webgpu.CircleGeometry(.1,16),vuv=(0,three_tsl.uv)(),dist=(0,three_tsl.vec2)(.5,.5).sub(vuv).length(),SD=(0,three_tsl.float)(.01),outerDist=(0,three_tsl.float)(.49),innerDist=(0,three_tsl.float)(.29),outsideVal=(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SD),outerDist,dist)),insideVal=(0,three_tsl.smoothstep)(innerDist,innerDist.add(SD),dist),bg=(0,three_tsl.vec4)(.576,.635,1,.3),gradient=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.abs)(dist.sub(outerDist.add(innerDist).div(2))).div(outerDist.sub(innerDist)).mul(1.5).add(.1).clamp(0,1)),mixed=(0,three_tsl.mix)(bg,gradient,gradient.w),finalColor=(0,three_tsl.vec4)(mixed.xyz,mixed.w.mul(outsideVal).mul(insideVal)),sharedMaterial=new three_webgpu.NodeMaterial;sharedMaterial.fragmentNode=finalColor,sharedMaterial.side=three_webgpu.DoubleSide,sharedMaterial.blending=three_webgpu.CustomBlending,sharedMaterial.blendSrc=three_webgpu.SrcAlphaFactor,sharedMaterial.blendDst=three_webgpu.OneMinusSrcAlphaFactor,sharedMaterial.blendSrcAlpha=three_webgpu.OneFactor,sharedMaterial.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,sharedMaterial.depthWrite=!1,sharedMaterial.transparent=!0;var IntersectMesh=class extends three_webgpu.Object3D{constructor(){super(),this.ringMesh=new three_webgpu.Mesh(sharedGeometry$2,sharedMaterial),this.ringMesh.position.z=.01,this.ringMesh.renderOrder=9999999999,this.add(this.ringMesh)}dispose(){this.remove(this.ringMesh)}},scratchObserverBox$2=new three_webgpu.Box3,scratchVector3$3=new three_webgpu.Vector3,defaultFloorplanControllerCustomInitArgs={defaultLongitude:Math.PI/4,defaultLatitude:Math.PI/4,defaultFov:80,maxFov:120,minFov:20,maxLatitude:Math.PI/2,minLatitude:-Math.PI/2,intersectMeshCreator:()=>new IntersectMesh},FloorplanController=class FloorplanController extends BaseController{static distanceFromModel(modelScene,fov,aspect){let boundingBox=modelScene.boundingBox,radius=boundingBox.isEmpty()?10:Math.pow(Math.pow(boundingBox.max.x-boundingBox.min.x+1,2)+Math.pow(boundingBox.max.y-boundingBox.min.y+1,2)+Math.pow(boundingBox.max.z-boundingBox.min.z+1,2),1/2);radius=isNaN(radius)||!isFinite(radius)?1:radius;let distance=radius/2/Math.tan(Math.PI*fov/360);return aspect<1&&(distance/=aspect),isNaN(distance)||!isFinite(distance)?radius:distance}static parseArgs(args){var _a,_b,_c,_d,_e,_f,_g,_h;if(args instanceof FloorplanController)return args;let args_=super.parseArgs(args);return Object.assign(Object.assign({},args_),{defaultLongitude:(_a=args.defaultLongitude)==null?defaultFloorplanControllerCustomInitArgs.defaultLongitude:_a,defaultLatitude:(_b=args.defaultLatitude)==null?defaultFloorplanControllerCustomInitArgs.defaultLatitude:_b,defaultFov:(_c=args.defaultFov)==null?defaultFloorplanControllerCustomInitArgs.defaultFov:_c,maxFov:(_d=args.maxFov)==null?defaultFloorplanControllerCustomInitArgs.maxFov:_d,minFov:(_e=args.minFov)==null?defaultFloorplanControllerCustomInitArgs.minFov:_e,maxLatitude:(_f=args.maxLatitude)==null?defaultFloorplanControllerCustomInitArgs.maxLatitude:_f,minLatitude:(_g=args.minLatitude)==null?defaultFloorplanControllerCustomInitArgs.minLatitude:_g,intersectMeshCreator:(_h=args.intersectMeshCreator)==null?defaultFloorplanControllerCustomInitArgs.intersectMeshCreator:_h})}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f,_g;let args_=this.parseArgs(args),{state,currentState}=args.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex},fov=(_d=state.fov)==null?args_.defaultFov:_d,longitude=(_e=state.longitude)==null?isThirdPersonMode(currentState.mode)?currentState.longitude:args_.defaultLongitude:_e,minLatitude=require_memoryUsage.M(typeof args_.minLatitude==`function`?args_.minLatitude(fov):args_.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof args_.maxLatitude==`function`?args_.maxLatitude(fov):args_.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M((_f=state.latitude)==null?currentState.mode===`Floorplan`?currentState.latitude:args_.defaultLatitude:_f,minLatitude,maxLatitude),offset=state.offset?state.offset.clone():args.modelScene.boundingBox.getCenter(new three_webgpu.Vector3),distance=(_g=state.distance)==null?FloorplanController.distanceFromModel(args_.modelScene,args_.defaultFov,args_.camera.aspect):_g;return Object.assign(Object.assign({},pano),{mode:`Floorplan`,longitude,latitude,fov,offset,distance})}constructor(args){let args_=FloorplanController.parseArgs(args);super(args_),this.mode=`Floorplan`,this.defaultLongitude=args_.defaultLongitude,this.defaultLatitude=args_.defaultLatitude,this.defaultFov=args_.defaultFov,this.maxFov=args_.maxFov,this.minFov=args_.minFov,this.maxLatitude=args_.maxLatitude,this.minLatitude=args_.minLatitude,this.locationMotion=new Motion({x:this.camera.pose.offset.x,y:this.camera.pose.offset.y,z:this.camera.pose.offset.z,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x}),this.pendingTextureId=null,this.textureLoader=new require_pick.i,this.intersectMeshCreator=args_.intersectMeshCreator,this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=`intersect`,this.intersectMesh.visible=!1,this.helper.add(this.intersectMesh)}updateConfiguration(args){if(super.updateConfiguration(args)===!1)return!1;if(args.defaultLongitude!==void 0&&this.defaultLongitude!==args.defaultLongitude&&(this.defaultLongitude=args.defaultLongitude),args.defaultLatitude!==void 0&&this.defaultLatitude!==args.defaultLatitude&&(this.defaultLatitude=args.defaultLatitude),args.defaultFov!==void 0&&this.defaultFov!==args.defaultFov&&(this.defaultFov=args.defaultFov),args.maxFov!==void 0&&this.maxFov!==args.maxFov&&(this.maxFov=args.maxFov),args.minFov!==void 0&&this.minFov!==args.minFov&&(this.minFov=args.minFov),args.maxLatitude!==void 0&&this.maxLatitude!==args.maxLatitude&&(this.maxLatitude=args.maxLatitude),args.minLatitude!==void 0&&this.minLatitude!==args.minLatitude&&(this.minLatitude=args.minLatitude),args.intersectMeshCreator!==void 0&&this.intersectMeshCreator!==args.intersectMeshCreator){this.intersectMeshCreator=args.intersectMeshCreator;let lastMesh=this.intersectMesh;this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=lastMesh.name,this.intersectMesh.visible=lastMesh.visible;let parent=this.intersectMesh.parent;parent&&parent.add(this.intersectMesh),lastMesh.dispose()}return!0}destroy(){super.destroy(),this.pendingTextureId=null,this.locationMotion.dispose(),this.panState=void 0,this.intersectMesh.dispose(),this.helper.remove(this.intersectMesh)}isReady(){return this.locationMotion.ended===!1?!1:super.isReady()}updateWork(works,state,options,userAction){var _a;return this.works=works,this.updateCamera(state,(_a=options.duration)==null?0:_a,userAction),!0}updateModel(modelScene){super.updateModel(modelScene);let offset=modelScene.boundingBox.getCenter(new three_webgpu.Vector3),distance=FloorplanController.distanceFromModel(modelScene,this.defaultFov,this.camera.aspect);this.updateCamera({offset,distance},0,!0)}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationValue={},cameraValue={};return pose.distance!==void 0&&(locationValue.distance=pose.distance),pose.offset!==void 0&&(locationValue.x=pose.offset.x,locationValue.y=pose.offset.y,locationValue.z=pose.offset.z),pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.locationMotion.set(locationValue,duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationKeyframe=[],cameraKeyframe=[];for(let keyframe of keyframes)locationKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{distance:keyframe.value.distance,x:keyframe.value.offset.x,y:keyframe.value.offset.x,z:keyframe.value.offset.x}}),cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.locationMotion.setKeyframes(locationKeyframe,duration).catch(require_memoryUsage.d),this.cameraMotion.setKeyframes(keyframes,duration)})}updateTime(time,deltaTime,...args){if(this.destroyed)return;let uniforms={},cameraPose={};if(this.modelAlphaMotion.ended||(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.modelScene.parameter.modelAlpha===0&&this.modelScene.parameter.progress!==1){let{pano0,pano1}=this.modelScene.parameter;pano0&&pano0.map!==(pano1==null?void 0:pano1.map)&&pano0.map.dispose(),uniforms.progress=1,uniforms.pano0=uniforms.pano1=pano1}if(this.perspToOrthoMotion.ended||(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),this.locationMotion.ended||(this.locationMotion.update(time),cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z)),this.cameraMotion.ended||(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),isEmptyObject(uniforms)||this.modelScene.parameter.set(uniforms),isEmptyObject(cameraPose)||this.setCamera(cameraPose),this.intersectMesh&&this.intersectMesh.parent){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1)}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1];return Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,offset:new three_webgpu.Vector3(targetLocationKeyFrame.value.x,targetLocationKeyFrame.value.y,targetLocationKeyFrame.value.z),distance:targetLocationKeyFrame.value.distance})}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{state,currentState,duration,userAction}=this.initial;this.userAction=userAction;let toState=FloorplanController.initAnimationEndState(this),cameraValue=require_pick.r(toState,[`longitude`,`latitude`,`fov`]),locationValue={x:toState.offset.x,y:toState.offset.y,z:toState.offset.z,distance:toState.distance};this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state:toState,userAction:this.userAction})),this.modelAlphaMotion.set({modelAlpha:1},duration/3).catch(require_memoryUsage.d),this.perspToOrthoMotion.set({perspToOrtho:0},duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d),this.locationMotion.set(locationValue,duration).then(()=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state:toState,userAction:this.userAction}))},error=>{let state=Object.assign(Object.assign(Object.assign({},this.currentPano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction}))}).then(()=>{resolve()})})}updateRenderSize(size){this.needsRender=!0}getForwardObserverOrNot(raycaster){let[intersection]=this.modelScene.intersectRaycaster(raycaster);if(!intersection)return null;let observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$2.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$2.containsPoint(raycaster.ray.origin)||raycaster.ray.intersectsBox(scratchObserverBox$2)))for(let observer of work.observers)observers.push(observer)}let[observer,distance]=arrayMin(observers,observer=>scratchVector3$3.copy(observer.standingPosition).applyMatrix4(observer.work.transform).distanceTo(intersection.point),!0);return observer&&distance<Math.max(observer.standingPosition.distanceTo(this.camera.position)/5,10)?observer:null}coordinatesForOffset(offset){let size=this.renderer.getSize(new three_webgpu.Vector2);return{longitude:-2*offset.x/(size.x*this.viewport.width),latitude:2*offset.y/(size.y*this.viewport.height)}}requestMomentumMovement(event,isFirst,velocity,duration){if(this.inMomentumMovement===null)return;duration=Math.max(duration,1);let nextVelocity=Object.assign({},velocity),delta={longitude:0,latitude:0};for(let i=0;i<duration;i++)nextVelocity.longitude*=.996,nextVelocity.latitude*=.996*.998,delta.longitude+=nextVelocity.longitude,delta.latitude+=nextVelocity.latitude;let longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),fov=this.cameraMotion.value.fov,minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude),state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov:this.cameraMotion.value.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance}),isFinal=!(nextVelocity.longitude>1e-4||nextVelocity.longitude<-1e-4||nextVelocity.latitude>1e-4||nextVelocity.latitude<-1e-4),gestureEvent=createEvent(`gesture.momentum`,Object.assign(Object.assign({},event),{isFirst,isFinal,state}));if(this.emit(`gesture.fire`,gestureEvent),this.inMomentumMovement.event=gestureEvent,this.emit(`gesture.momentum`,gestureEvent),event.defaultPrevented){this.inMomentumMovement=null;return}this.inMomentumMovement&&(this.cameraMotion.set({longitude,latitude},0).catch(require_memoryUsage.d),isFinal?this.inMomentumMovement=null:require_imageBitmap.s.shared.add((time,deltaTime)=>{this.requestMomentumMovement(event,!1,nextVelocity,deltaTime)},!0))}onPanGesture(event){this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let lastPanState=this.panState,pointerLength=event.pointers.length;if(event.isFinal?this.panState=void 0:this.panState={pointerLength,x:event.center.x,y:event.center.y},lastPanState===void 0||lastPanState.pointerLength!==pointerLength)return;let offset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},mouse=this.relativeClientPosition(event.center),side=1,currentLatitude=this.camera.pose.latitude;Math.abs(currentLatitude)>Math.PI/6&&(side=currentLatitude<0?mouse.y<0?-1:1:mouse.y>0?-1:1),offset.x*=side;let delta=this.coordinatesForOffset(offset),longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),fov=this.camera.pose.fov,minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude);this.camera.aspect<1&&Math.abs(event.overallVelocityX)>.2&&Math.atan2(Math.abs(event.overallVelocityY),Math.abs(event.overallVelocityX))<Math.PI/6.923&&(latitude=this.cameraMotion.value.latitude);let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov,offset:this.camera.pose.offset,distance:this.camera.pose.distance});if(event.state=state,this.emit(`gesture.pan`,event),!event.defaultPrevented&&(this.cameraMotion.set({longitude:state.longitude,latitude:state.latitude},0).catch(require_memoryUsage.d),event.isFinal)){let x=event.velocityX*side,y=event.velocityY;this.inMomentumMovement={uuid:require_memoryUsage.N()},this.requestMomentumMovement(event,!0,this.coordinatesForOffset({x,y}),0)}}onPinchGesture(event){var _a;if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement();let fov=(_a=this.pinchState)==null?void 0:_a.fov;if(event.isFirst){this.pinchState={x:event.center.x,y:event.center.y,fov:this.cameraMotion.value.fov};return}if(event.isFinal&&(this.panState=void 0,this.pinchState=void 0),fov===void 0)return;let nextFov=require_memoryUsage.M(fov/event.scale,this.minFov,this.maxFov),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(nextFov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(nextFov):this.maxLatitude,-Math.PI/2,Math.PI/2),nextLatitude=require_memoryUsage.M(this.cameraMotion.value.latitude,minLatitude,maxLatitude);event.state.fov=nextFov,event.state.latitude=nextLatitude,this.emit(`gesture.pinch`,event),!event.defaultPrevented&&(this.cameraMotion.set({fov:nextFov,latitude:nextLatitude},0).catch(require_memoryUsage.d),this.onPanGesture(event))}onMouseMove(event){var _a,_b;if(!this.intersectMesh.parent||this.panState)return;if(this.emit(`gesture.mousemove`,event),event.defaultPrevented){this.hideIntersectMesh();return}let raycaster=event.center.raycaster;if(event.isFinal&&this.intersectMesh.parent&&this.intersectMesh.visible===!0){this.hideIntersectMesh();return}let[intersection]=this.modelScene.intersectRaycaster(raycaster),intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection){let face=(_b=(_a=intersection.face)==null?void 0:_a.normal)==null?new three_webgpu.Vector3().copy(raycaster.ray.direction).multiplyScalar(-1):_b,positionVector=face.clone(),position=intersection.point.clone();this.intersectMesh.position.copy(position);let lookAtVector=position.clone().add(positionVector);if(this.intersectMesh.lookAt(lookAtVector),Math.abs(face.y)>.99){let _vector=this.camera.position.clone().sub(position);this.intersectMesh.rotation.z=-Math.atan2(_vector.z,_vector.x)}this.intersectMesh.visible=!0,this.needsRender=!0}else this.hideIntersectMesh()}onMouseWheel(event){if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement();let{minFov,maxFov}=this,nextFov=require_memoryUsage.M(this.camera.fov-event.center.delta,minFov,maxFov),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(nextFov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(nextFov):this.maxLatitude,-Math.PI/2,Math.PI/2),nextLatitude=require_memoryUsage.M(this.cameraMotion.value.latitude,minLatitude,maxLatitude);event.state.fov=nextFov,event.state.latitude=nextLatitude,this.emit(`gesture.mousewheel`,event),!event.defaultPrevented&&this.cameraMotion.set({fov:nextFov,latitude:nextLatitude},0).catch(require_memoryUsage.d)}onTapGesture(event){var _a;this.userAction=event.userAction,this.stopMomentumMovement();let raycaster=event.center.raycaster,observer=this.getForwardObserverOrNot(raycaster);if(!observer)this.emit(`gesture.tap`,event);else{let options={longitude:this.camera.pose.longitude,latitude:0},state=Object.assign(Object.assign({},event.state),{mode:`Panorama`,workCode:observer.work.workCode,panoIndex:observer.panoIndex,longitude:options.longitude,latitude:options.latitude,offset:observer?observer.position.clone():new three_webgpu.Vector3,distance:0});if(event.state=state,this.emit(`gesture.tap`,event),!event.defaultPrevented&&(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:event.userAction,options,progress:0,error:null})),observer&&observer.active)){let pendingTextureId=this.pendingTextureId=require_memoryUsage.N(),panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),imageURLTransform=this.imageOptions.transform,imageURLOptions=Object.assign({key:`pano.${panoId}`},require_pick.r(this.imageOptions,[`format`,`size`,`quality`,`sharpen`,`forceUseExifOrientation`,`mappings`])),colorImageURLs={right:observer.images.work.getURL(observer.images.right),left:observer.images.work.getURL(observer.images.left),up:observer.images.work.getURL(observer.images.up),down:observer.images.work.getURL(observer.images.down),front:observer.images.work.getURL(observer.images.front),back:observer.images.work.getURL(observer.images.back)},gainmapImageURLs,gainmapConfigUrl,gainmap=this.enableHDR?observer.images.gainmap:void 0;gainmap&&(gainmapImageURLs={right:observer.images.work.getURL(gainmap.right),left:observer.images.work.getURL(gainmap.left),up:observer.images.work.getURL(gainmap.up),down:observer.images.work.getURL(gainmap.down),front:observer.images.work.getURL(gainmap.front),back:observer.images.work.getURL(gainmap.back)},gainmapConfigUrl=observer.images.work.getURL(gainmap.cfg));let hash=`pano:`+jsonHash([colorImageURLs,gainmapImageURLs,imageURLOptions]),parameter=this.modelScene.parameter,existsPano;if(parameter.pano0&¶meter.pano0.map.name===hash?existsPano=parameter.pano0:parameter.pano1&¶meter.pano1.map.name===hash&&(existsPano=parameter.pano1),existsPano)parameter.pano0&¶meter.pano0.map!==existsPano.map&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==existsPano.map&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:existsPano,pano1:existsPano}),this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,progress:0,state,options,error:null}));else{let colorTextureTask=this.textureLoader.loadCubeTexture(colorImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer),gainmapTask=gainmapConfigUrl&&gainmapImageURLs?Promise.all([getFetcher(this.fiveId,observer.work).ajax(gainmapConfigUrl,{responseType:`text`}).then(response=>require_memoryUsage.A(JSON.parse(response.body))),this.textureLoader.loadCubeTexture(gainmapImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,colorSpace:three_webgpu.NoColorSpace,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer)]).then(([config,gainmapResponse])=>({config,map:gainmapResponse.body})):Promise.resolve(void 0);Promise.all([colorTextureTask,gainmapTask]).then(_a=>(0,tslib.__awaiter)(this,[_a],void 0,function*([response,gainmap]){var _b,_c;let{body:texture}=response;if(this.destroyed||this.pendingTextureId!==pendingTextureId){texture.dispose();return}this.pendingTextureId=null,texture.name=hash;let image=Array.isArray(texture.image)?texture.image[0]:texture.image,mapSize=(_b=image==null?void 0:image.width)==null?2048:_b,rgbaData=yield getRgbaDataFromCubeTexture(this.renderer,texture,!0,sharedHistogramRgbaData),mapHistogram=new Histogram().formPixels(rgbaData.data),panoPicture={panoId,map:texture,mapSize,mapHistogram:new three_webgpu.Vector4().fromArray(mapHistogram.toArray()),matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap:gainmap?{map:gainmap.map,cfg:gainmap.config}:void 0};parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_c=parameter.pano0)==null?void 0:_c.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:panoPicture,pano1:panoPicture}),this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,progress:0,state,options,error:null}))})).catch(error=>{this.destroyed||this.pendingTextureId!==pendingTextureId||(this.pendingTextureId=null)})}}}}onDblTapGesture(event){this.userAction=event.userAction,this.stopMomentumMovement();let fov=this.cameraMotion.value.fov,nextFov=this.minFov-fov<fov-this.defaultFov?this.minFov:this.defaultFov;event.state.fov=nextFov,this.emit(`gesture.dbltap`,event),!event.defaultPrevented&&(this.cameraMotion.set({fov:nextFov},360).catch(require_memoryUsage.d),this.hideIntersectMesh())}hideIntersectMesh(){this.intersectMesh.visible=!1,this.needsRender=!0}},defaultTopviewControllerCustomInitArgs=Object.assign(Object.assign({},require_pick.t(defaultFloorplanControllerCustomInitArgs,[`defaultLongitude`,`defaultLatitude`,`maxLatitude`,`minLatitude`])),{defaultLongitude:0,defaultLatitude:Math.PI/2}),TopviewController=class TopviewController extends FloorplanController{static parseArgs(args){var _a,_b;if(args instanceof TopviewController)return args;let args_=Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2,defaultLongitude:(_a=args.defaultLongitude)==null?defaultTopviewControllerCustomInitArgs.defaultLongitude:_a,defaultLatitude:(_b=args.defaultLatitude)==null?defaultTopviewControllerCustomInitArgs.defaultLatitude:_b});return super.parseArgs(args_)}static initAnimationEndState(args){var _a,_b;let args_=this.parseArgs(args),state=super.initAnimationEndState(Object.assign(Object.assign({},args_),{initial:Object.assign(Object.assign({},args_.initial),{state:Object.assign(Object.assign({},args_.initial.state),{longitude:(_a=args_.initial.state.longitude)==null?args_.defaultLongitude:_a,latitude:(_b=args_.initial.state.latitude)==null?args_.defaultLatitude:_b})})}));return Object.assign(Object.assign({},state),{mode:`Topview`})}constructor(args){let args_=TopviewController.parseArgs(args);super(args_),this.mode=`Topview`}updateConfiguration(args){return super.updateConfiguration(Object.assign({},args))}updateModel(modelScene){this.needsRender=!0;let offset=this.modelScene.boundingBox.getCenter(new three_webgpu.Vector3);this.locationMotion.set({x:offset.x,y:offset.y,z:offset.z,distance:FloorplanController.distanceFromModel(this.modelScene,this.defaultFov,this.camera.aspect)},0).catch(require_memoryUsage.d),this.hideIntersectMesh()}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationValue={},cameraValue={};return pose.distance!==void 0&&(locationValue.distance=pose.distance),pose.offset!==void 0&&(locationValue.x=pose.offset.x,locationValue.y=pose.offset.y,locationValue.z=pose.offset.z),pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.locationMotion.set(locationValue,duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationKeyframe=[],cameraKeyframe=[];for(let keyframe of keyframes)locationKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{distance:keyframe.value.distance,x:keyframe.value.offset.x,y:keyframe.value.offset.y,z:keyframe.value.offset.z}}),cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.locationMotion.setKeyframes(locationKeyframe,duration).catch(require_memoryUsage.d),this.cameraMotion.setKeyframes(keyframes,duration)})}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{state,currentState,duration,userAction}=this.initial;this.userAction=userAction;let toState=TopviewController.initAnimationEndState(this),cameraValue={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},locationValue={x:toState.offset.x,y:toState.offset.y,z:toState.offset.z,distance:toState.distance};this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state:toState,userAction:this.userAction})),this.modelAlphaMotion.set({modelAlpha:1},duration/3).catch(require_memoryUsage.d),this.perspToOrthoMotion.set({perspToOrtho:1},duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d),this.locationMotion.set(locationValue,duration).then(()=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state:toState,userAction:this.userAction}))},error=>{let state=Object.assign(Object.assign(Object.assign({},this.currentPano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction}))}).then(()=>{resolve()})})}requestMomentumMovement(){this.inMomentumMovement=null}onPanGesture(event){this.userAction=event.userAction,this.stopMomentumMovement();let lastPanState=this.panState,pointerLength=event.pointers.length;if(event.isFinal?this.panState=void 0:this.panState={pointerLength,x:event.center.x,y:event.center.y},lastPanState===void 0||lastPanState.pointerLength!==pointerLength)return;let screenOffset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),targetDistance=this.locationMotion.value.distance;targetDistance*=Math.tan(this.cameraMotion.value.fov/2*Math.PI/180);let renderSize=this.renderer.getSize(new three_webgpu.Vector2),panLeftDistance=2*screenOffset.x*targetDistance/renderSize.y,panUpDistance=2*screenOffset.y*targetDistance/renderSize.y,axies=new three_webgpu.Vector3;axies.setFromMatrixColumn(this.camera.matrix,0),axies.multiplyScalar(-panLeftDistance),offset.add(axies),axies.setFromMatrixColumn(this.camera.matrix,1),axies.multiplyScalar(panUpDistance),offset.add(axies);let center=this.modelScene.boundingBox.getCenter(new three_webgpu.Vector3),size=this.modelScene.boundingBox.getSize(new three_webgpu.Vector3),radius=Math.max(size.x,size.y,size.z)/2;offset.clamp(center.clone().sub(new three_webgpu.Vector3().setScalar(radius)),center.clone().add(new three_webgpu.Vector3().setScalar(radius))),event.state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:0,latitude:Math.PI/2,fov:this.cameraMotion.value.fov,offset,distance:this.locationMotion.value.distance}),this.emit(`gesture.pan`,event),!event.defaultPrevented&&this.locationMotion.set({x:offset.x,y:offset.y,z:offset.z},0).catch(require_memoryUsage.d)}onPinchGesture(event){var _a;if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement();let fov=(_a=this.pinchState)==null?void 0:_a.fov;if(event.isFirst){this.pinchState={x:event.center.x,y:event.center.y,fov:this.cameraMotion.value.fov};return}if(event.isFinal&&(this.pinchState=void 0),fov===void 0)return;let nextFov=require_memoryUsage.M(fov/event.scale,this.minFov,this.maxFov);event.state.fov=nextFov,this.emit(`gesture.pinch`,event),!event.defaultPrevented&&(this.cameraMotion.set({fov:nextFov},0).catch(require_memoryUsage.d),event.type=`gesture.pan`,this.onPanGesture(event))}onMouseWheel(event){if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement();let nextFov=require_memoryUsage.M(this.cameraMotion.value.fov-event.center.delta,this.minFov,this.maxFov);event.state.fov=nextFov,this.emit(`gesture.mousewheel`,event),!event.defaultPrevented&&this.cameraMotion.set({fov:nextFov},0).catch(require_memoryUsage.d)}},defaultPanoramaLikeControllerCustomInitArgs={defaultLatitude:0,defaultFov:90,maxFov:120,minFov:20,maxLatitude:fov=>Math.PI/2-fov/2/180*Math.PI,minLatitude:fov=>-Math.PI/2+fov/2/180*Math.PI,moveSpeed:3.6,intersectMeshCreator:()=>new IntersectMesh,aerialObserverMinHeight:5},PanoramaLikeController=class PanoramaLikeController extends BaseController{static parseArgs(args){var _a,_b,_c,_d,_e,_f,_g,_h,_j;if(args instanceof PanoramaLikeController)return args;let args_=super.parseArgs(args);return Object.assign(Object.assign({},args_),{defaultLatitude:(_a=args.defaultLatitude)==null?defaultPanoramaLikeControllerCustomInitArgs.defaultLatitude:_a,defaultFov:(_b=args.defaultFov)==null?defaultPanoramaLikeControllerCustomInitArgs.defaultFov:_b,maxFov:(_c=args.maxFov)==null?defaultPanoramaLikeControllerCustomInitArgs.maxFov:_c,minFov:(_d=args.minFov)==null?defaultPanoramaLikeControllerCustomInitArgs.minFov:_d,maxLatitude:(_e=args.maxLatitude)==null?defaultPanoramaLikeControllerCustomInitArgs.maxLatitude:_e,minLatitude:(_f=args.minLatitude)==null?defaultPanoramaLikeControllerCustomInitArgs.minLatitude:_f,moveSpeed:(_g=args.moveSpeed)==null?defaultPanoramaLikeControllerCustomInitArgs.moveSpeed:_g,intersectMeshCreator:(_h=args.intersectMeshCreator)==null?defaultPanoramaLikeControllerCustomInitArgs.intersectMeshCreator:_h,aerialObserverMinHeight:(_j=args.aerialObserverMinHeight)==null?defaultPanoramaLikeControllerCustomInitArgs.aerialObserverMinHeight:_j})}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f;let args_=this.parseArgs(args),works=args_.works,{state,currentState}=args.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex},observer=works.getObserver(pano),fov=require_memoryUsage.M((_d=state.fov)==null?isFristPersonMode(currentState.mode)?currentState.fov:args_.defaultFov:_d,args_.minFov,args_.maxFov),longitude=(_e=state.longitude)==null?currentState.longitude:_e,minLatitude=require_memoryUsage.M(typeof args_.minLatitude==`function`?args_.minLatitude(fov):args_.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof args_.maxLatitude==`function`?args_.maxLatitude(fov):args_.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M((_f=state.latitude)==null?isFristPersonMode(currentState.mode)?currentState.latitude:args_.defaultLatitude:_f,minLatitude,maxLatitude),offset=new three_webgpu.Vector3;return observer&&offset.copy(observer.position).applyMatrix4(observer.work.transform),{workCode:pano.workCode,panoIndex:pano.panoIndex,mode:`PanoramaLike`,longitude,latitude,fov,offset,distance:0}}constructor(args){let args_=PanoramaLikeController.parseArgs(args);super(args_),this.mode=`PanoramaLike`,this.defaultLatitude=args_.defaultLatitude,this.defaultFov=args_.defaultFov,this.maxFov=args_.maxFov,this.minFov=args_.minFov,this.maxLatitude=args_.maxLatitude,this.minLatitude=args_.minLatitude,this.moveSpeed=args_.moveSpeed,this.intersectMeshCreator=args_.intersectMeshCreator,this.aerialObserverMinHeight=args_.aerialObserverMinHeight,this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=`intersect`,this.intersectMesh.visible=!1,this.helper.add(this.intersectMesh)}updateConfiguration(args){if(super.updateConfiguration(args)===!1)return!1;if(args.defaultLatitude!==void 0&&this.defaultLatitude!==args.defaultLatitude&&(this.defaultLatitude=args.defaultLatitude),args.maxLatitude!==void 0&&this.maxLatitude!==args.maxLatitude&&(this.maxLatitude=args.maxLatitude),args.minLatitude!==void 0&&this.minLatitude!==args.minLatitude&&(this.minLatitude=args.minLatitude),args.defaultFov!==void 0&&this.defaultFov!==args.defaultFov&&(this.defaultFov=args.defaultFov),args.maxFov!==void 0&&this.maxFov!==args.maxFov&&(this.maxFov=args.maxFov),args.minFov!==void 0&&this.minFov!==args.minFov&&(this.minFov=args.minFov),args.moveSpeed!==void 0&&this.moveSpeed!==args.moveSpeed&&(this.moveSpeed=args.moveSpeed),args.intersectMeshCreator!==void 0&&this.intersectMeshCreator!==args.intersectMeshCreator){this.intersectMeshCreator=args.intersectMeshCreator;let lastMesh=this.intersectMesh;this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=lastMesh.name,this.intersectMesh.visible=lastMesh.visible;let parent=this.intersectMesh.parent;parent&&parent.add(this.intersectMesh),lastMesh.dispose()}return args.aerialObserverMinHeight!==void 0&&this.aerialObserverMinHeight!==args.aerialObserverMinHeight&&(this.aerialObserverMinHeight=args.aerialObserverMinHeight),!0}destroy(){super.destroy(),this.intersectMesh&&(this.helper.remove(this.intersectMesh),this.intersectMesh.dispose()),this.panState=void 0}isReady(){return this.panState||this.pinchState?!1:super.isReady()}calculateMovingDuration(duration,distance){switch(typeof duration){case`function`:return duration(distance,this.moveSpeed);case`number`:return duration;case`string`:return Number(duration);default:return require_memoryUsage.M(distance,2,5)/this.moveSpeed*1e3}}hideIntersectMesh(){this.intersectMesh.visible=!1,this.needsRender=!0}coordinatesForOffset(offset){let fov=this.cameraMotion.value.fov,aspect=this.camera.aspect,size=this.renderer.getSize(new three_webgpu.Vector2);return{longitude:2*offset.x/(size.x*this.viewport.width)*fov/95*aspect,latitude:-2*offset.y/(size.y*this.viewport.height)*fov/95}}cameraBounce(){let{longitude,latitude,fov}=this.cameraMotion.value,keyframes=[{progress:0,value:{longitude,latitude,fov}},{progress:.5,value:{longitude,latitude,fov:fov*.98}},{progress:1,value:{longitude,latitude,fov}}];this.cameraMotion.setKeyframes(keyframes,500).catch(require_memoryUsage.d)}requestMomentumMovement(event,isFirst,velocity,duration){if(this.inMomentumMovement===null)return;duration=Math.max(duration,1);let nextVelocity=Object.assign({},velocity),delta={longitude:0,latitude:0};for(let i=0;i<duration;i++)nextVelocity.longitude*=.996,nextVelocity.latitude*=.996*.99,delta.longitude+=nextVelocity.longitude,delta.latitude+=nextVelocity.latitude;let fov=this.cameraMotion.value.fov,longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude),state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance}),isFinal=!(nextVelocity.longitude>1e-4||nextVelocity.longitude<-1e-4||nextVelocity.latitude>1e-4||nextVelocity.latitude<-1e-4),gestureEvent=createEvent(`gesture.momentum`,Object.assign(Object.assign({},event),{isFirst,isFinal,state}));if(this.emit(`gesture.fire`,gestureEvent),this.inMomentumMovement.event=gestureEvent,this.emit(`gesture.momentum`,gestureEvent),event.defaultPrevented){this.inMomentumMovement=null;return}this.inMomentumMovement&&(this.cameraMotion.set({longitude,latitude},0).catch(require_memoryUsage.d),isFinal?this.inMomentumMovement=null:require_imageBitmap.s.shared.add((time,deltaTime)=>{this.requestMomentumMovement(event,!1,nextVelocity,deltaTime)},!0))}onPanGesture(event){this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let lastPanState=this.panState,pointerLength=event.pointers.length;if(event.isFinal?this.panState=void 0:this.panState={pointerLength,x:event.center.x,y:event.center.y},lastPanState===void 0||lastPanState.pointerLength!==pointerLength)return;let offset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},delta=this.coordinatesForOffset(offset),longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),fov=this.cameraMotion.value.fov,minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude);this.camera.aspect<1&&Math.abs(event.overallVelocityX)>.2&&Math.atan2(Math.abs(event.overallVelocityY),Math.abs(event.overallVelocityX))<Math.PI/6.923&&(latitude=this.cameraMotion.value.latitude);let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance});if(event.state=state,this.emit(`gesture.pan`,event),event.defaultPrevented)return;let cameraValue={longitude:state.longitude,latitude:state.latitude,fov:state.fov};if(this.cameraMotion.set(cameraValue,0).catch(require_memoryUsage.d),event.isFinal){let x=event.velocityX,y=event.velocityY*.6;Math.abs(y)>.5&&Math.abs(x)<.5&&(x=0),this.inMomentumMovement={uuid:require_memoryUsage.N()},this.requestMomentumMovement(event,!0,this.coordinatesForOffset({x,y}),0)}}onPinchGesture(event){var _a;this.userAction=event.userAction,this.stopMomentumMovement();let fov=(_a=this.pinchState)==null?void 0:_a.fov,delta=event.scale;if(event.isFirst){this.pinchState={x:event.center.x,y:event.center.y,fov:this.cameraMotion.value.fov};return}if(event.isFinal&&(this.pinchState=void 0),fov===void 0)return;let nextFov=require_memoryUsage.M(fov/delta,this.minFov,this.maxFov),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(nextFov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(nextFov):this.maxLatitude,-Math.PI/2,Math.PI/2),nextLatitude=require_memoryUsage.M(this.cameraMotion.value.latitude,minLatitude,maxLatitude);event.state.fov=nextFov,event.state.latitude=nextLatitude,this.emit(`gesture.pinch`,event),!event.defaultPrevented&&(this.cameraMotion.set({fov:nextFov,latitude:nextLatitude},0).catch(require_memoryUsage.d),event.type=`gesture.pan`,this.onPanGesture(event))}onMouseWheel(event){this.userAction=event.userAction,this.stopMomentumMovement();let nextFov=require_memoryUsage.M(this.cameraMotion.value.fov-event.center.delta,this.minFov,this.maxFov),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(nextFov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(nextFov):this.maxLatitude,-Math.PI/2,Math.PI/2),nextLatitude=require_memoryUsage.M(this.cameraMotion.value.latitude,minLatitude,maxLatitude);event.state.fov=nextFov,event.state.latitude=nextLatitude,this.emit(`gesture.mousewheel`,event),!event.defaultPrevented&&(this.cameraMotion.set({fov:nextFov,latitude:nextLatitude},0).catch(require_memoryUsage.d),this.onMouseMove(event))}onMouseMove(event){var _a,_b;if(!this.intersectMesh.parent||this.panState||(this.emit(`gesture.mousemove`,event),event.defaultPrevented))return;let raycaster=event.center.raycaster;if(event.isFinal&&this.intersectMesh.parent){this.hideIntersectMesh();return}raycaster.floorIndex=-1;let[intersection]=this.modelScene.intersectRaycaster(raycaster),intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection){let face=(_b=(_a=intersection.face)==null?void 0:_a.normal)==null?new three_webgpu.Vector3().copy(raycaster.ray.direction).multiplyScalar(-1):_b,positionVector=face.clone(),position=intersection.point.clone();this.intersectMesh.position.copy(position);let lookAtVector=position.clone().add(positionVector);if(this.intersectMesh.lookAt(lookAtVector),Math.abs(face.y)>.99){let _vector=this.camera.position.clone().sub(position);this.intersectMesh.rotation.z=-Math.atan2(_vector.z,_vector.x)}this.intersectMesh.visible=!0,this.needsRender=!0}else this.hideIntersectMesh()}onDblTapGesture(event){this.userAction=event.userAction,this.stopMomentumMovement();let fov=this.cameraMotion.value.fov,imageLevel=2,observer=this.works.getObserver(this.currentPano);if(observer){let tiles=observer.images.tiles;tiles&&tiles.length&&(imageLevel=Math.max(...tiles.map(tile=>tile.level)))}let minFov=Math.max(40-imageLevel*5,this.minFov,5),nextFov=minFov-fov<fov-this.defaultFov?minFov:this.defaultFov;event.state.fov=nextFov,this.emit(`gesture.dbltap`,event),!event.defaultPrevented&&(this.cameraMotion.set({fov:nextFov},360).catch(require_memoryUsage.d),this.hideIntersectMesh())}},blankVideo=`data:video/mp4;base64,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`,result;function canplayVideo(){return result||(result=new Promise(resolve=>{let timeout,video=document.createElement(`video`);video.muted=!0,video.src=blankVideo,video.addEventListener(`timeupdate`,function timeupdate(){video.removeEventListener(`timeupdate`,timeupdate,!1),clearTimeout(timeout);let canvas=document.createElement(`canvas`);canvas.width=canvas.height=1;let context=canvas.getContext(`2d`);if(!context){resolve(!1);return}context.drawImage(video,0,0,1,1);let{data}=context.getImageData(0,0,1,1);data[3]>10?resolve(!0):resolve(!1)},!1),video.addEventListener(`canplay`,function canplay(){video.removeEventListener(`canplay`,canplay,!1),video.play()},!1),timeout=window.setTimeout(()=>resolve(!1),1e3)}))}var FACE_ORDER=[`right`,`left`,`up`,`down`,`front`,`back`];function getBox(face,x,y,size){let box=new three_webgpu.Box3;switch(face){case`up`:box.min.y=.5,box.max.y=.5,box.min.x=x-.5,box.max.x=x-.5+size,box.min.z=-y+.5-size,box.max.z=-y+.5;break;case`down`:box.min.y=-.5,box.max.y=-.5,box.min.x=x-.5,box.max.x=x-.5+size,box.min.z=y-.5,box.max.z=y-.5+size;break;case`left`:box.min.x=-.5,box.max.x=-.5,box.min.z=-x+.5-size,box.max.z=-x+.5,box.min.y=-y+.5-size,box.max.y=-y+.5;break;case`right`:box.min.x=.5,box.max.x=.5,box.min.z=x-.5,box.max.z=x-.5+size,box.min.y=-y+.5-size,box.max.y=-y+.5;break;case`front`:box.min.z=-.5,box.max.z=-.5,box.min.x=x-.5,box.max.x=x-.5+size,box.min.y=-y+.5-size,box.max.y=-y+.5;break;case`back`:box.min.z=.5,box.max.z=.5,box.min.x=-x+.5-size,box.max.x=-x+.5,box.min.y=-y+.5-size,box.max.y=-y+.5;break;default:break}return box.applyMatrix4(new three_webgpu.Matrix4().makeRotationY(Math.PI))}var createChildren=(node,level)=>{if(node.level>=level)return;let childDepth=node.level+1,childSize=node.size/2,childPositions=[new three_webgpu.Vector2(node.position.x,node.position.y),new three_webgpu.Vector2(node.position.x+childSize,node.position.y),new three_webgpu.Vector2(node.position.x,node.position.y+childSize),new three_webgpu.Vector2(node.position.x+childSize,node.position.y+childSize)];for(let childPosition of childPositions){let childNode={face:node.face,level:childDepth,size:childSize,position:childPosition,box:getBox(node.face,childPosition.x,childPosition.y,childSize),parent:node,children:[]};node.children.push(childNode),createChildren(childNode,level)}};function createTileCubeNode(face,level){let node={level:0,face,position:new three_webgpu.Vector2(0,0),size:1,box:getBox(face,0,0,1),parent:null,children:[]};return createChildren(node,level),node}function createTileCubeTree(level){return{children:FACE_ORDER.map(face=>createTileCubeNode(face,level)),maxLevel:level}}function traverseTileCubeNode(nodeOrTree,callback){for(let child of nodeOrTree.children)callback(child)!==!1&&traverseTileCubeNode(child,callback)}var _a$2,scratchSortVector3=new three_webgpu.Vector3,scratchCameraQuaternion=new three_webgpu.Quaternion,scratchCameraMatrix=new three_webgpu.Matrix4,scratchCameraProjectMatrix=new three_webgpu.Matrix4,scratchFrustumMatrix=new three_webgpu.Matrix4,scratchFrustumMatrixInverse=new three_webgpu.Matrix4,scratchFrustumProjectMatrix=new three_webgpu.Matrix4,scratchSceneQuaternionInverse=new three_webgpu.Quaternion,scratchSceneMatrixInverse=new three_webgpu.Matrix4,clearAlpha=0,scratchPrevClearColor$1=new three_webgpu.Color,SQRT1_2=(_a$2=Math.SQRT1_2)==null?Math.sqrt(2):_a$2,TILE_QUATERNION={up:new three_webgpu.Quaternion(SQRT1_2,0,0,SQRT1_2),down:new three_webgpu.Quaternion(-SQRT1_2,0,0,SQRT1_2),left:new three_webgpu.Quaternion(0,SQRT1_2,0,SQRT1_2),right:new three_webgpu.Quaternion(0,-SQRT1_2,0,SQRT1_2),front:new three_webgpu.Quaternion(0,0,0,1),back:new three_webgpu.Quaternion(0,1,0,0)},tileGeometry=(()=>{let vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,-.5,.5,0,.5,.5,0]),uvs=new Float32Array([0,0,1,0,0,1,1,1]),indices=new Uint32Array([0,1,2,1,3,2]),tileGeometry=new three_webgpu.BufferGeometry;return tileGeometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),tileGeometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),tileGeometry.setIndex(new three_webgpu.BufferAttribute(indices,1)),tileGeometry.computeBoundingBox(),tileGeometry})(),_placeholderTexture=null;function getPlaceholderTexture(){return _placeholderTexture||(_placeholderTexture=new three_webgpu.DataTexture(new Uint8Array([255,255,255,255]),1,1),_placeholderTexture.needsUpdate=!0),_placeholderTexture}function createHDRUniforms(){return{enabled:(0,three_tsl.uniform)(0),maxDisplayBoost:(0,three_tsl.uniform)(1),gamma:(0,three_tsl.uniform)(require_memoryUsage.k.gamma),minContentBoost:(0,three_tsl.uniform)(require_memoryUsage.k.minContentBoost),maxContentBoost:(0,three_tsl.uniform)(require_memoryUsage.k.maxContentBoost),hdrCapacityMin:(0,three_tsl.uniform)(require_memoryUsage.k.hdrCapacityMin),hdrCapacityMax:(0,three_tsl.uniform)(require_memoryUsage.k.hdrCapacityMax),offsetSdr:(0,three_tsl.uniform)(require_memoryUsage.k.offsetSdr),offsetHdr:(0,three_tsl.uniform)(require_memoryUsage.k.offsetHdr)}}function computeHDRBoostNode(gainRGB,u){let gain=(0,three_tsl.vec3)((0,three_tsl.clamp)(gainRGB.r,(0,three_tsl.float)(0),(0,three_tsl.float)(1)),(0,three_tsl.clamp)(gainRGB.g,(0,three_tsl.float)(0),(0,three_tsl.float)(1)),(0,three_tsl.clamp)(gainRGB.b,(0,three_tsl.float)(0),(0,three_tsl.float)(1))),invGamma=(0,three_tsl.float)(1).div((0,three_tsl.max)(u.gamma,(0,three_tsl.float)(1e-6))),gainLinear=(0,three_tsl.vec3)((0,three_tsl.pow)(gain.r,invGamma),(0,three_tsl.pow)(gain.g,invGamma),(0,three_tsl.pow)(gain.b,invGamma)),logDisplayBoost=(0,three_tsl.log2)((0,three_tsl.max)(u.maxDisplayBoost,(0,three_tsl.float)(1))),logCapacityMin=(0,three_tsl.log2)((0,three_tsl.max)(u.hdrCapacityMin,(0,three_tsl.float)(1e-6))),denom=(0,three_tsl.log2)((0,three_tsl.max)(u.hdrCapacityMax,(0,three_tsl.float)(1e-6))).sub(logCapacityMin),weight=(0,three_tsl.clamp)(logDisplayBoost.sub(logCapacityMin).div((0,three_tsl.max)(denom,(0,three_tsl.float)(1e-6))),(0,three_tsl.float)(0),(0,three_tsl.float)(1)).mul((0,three_tsl.step)((0,three_tsl.float)(1e-6),denom)),logMinBoost=(0,three_tsl.log2)((0,three_tsl.max)(u.minContentBoost,(0,three_tsl.float)(1e-6))),logMaxBoost=(0,three_tsl.log2)((0,three_tsl.max)(u.maxContentBoost,(0,three_tsl.float)(1e-6))),logGainW=(0,three_tsl.vec3)(logMinBoost).add(gainLinear.mul((0,three_tsl.vec3)(logMaxBoost.sub(logMinBoost)))).mul(weight);return(0,three_tsl.vec3)((0,three_tsl.exp2)(logGainW.x),(0,three_tsl.exp2)(logGainW.y),(0,three_tsl.exp2)(logGainW.z))}function hdrOffsetNode(sdrRGB,boost,u){return(0,three_tsl.vec3)(sdrRGB).add(u.offsetSdr).mul(boost).sub(u.offsetHdr)}var TileMaterial=class extends three_webgpu.NodeMaterial{constructor(hdr){super(),this.map=null,this.flipY=!0,this.level=-1,this._hdr=hdr,this._mapNode=(0,three_tsl.texture)(getPlaceholderTexture()),this._gainNode=(0,three_tsl.texture)(getPlaceholderTexture()),this.depthTest=!0,this.depthWrite=!1,this.transparent=!0,this.setupNode()}setupNode(){let texCoord=(0,three_tsl.uv)(),finalUV=(0,three_tsl.vec3)(texCoord.x,texCoord.y,0),opacityNode=(0,three_tsl.materialReference)(`opacity`,`float`),texColor=this._mapNode.sample(finalUV.xy),boost=computeHDRBoostNode(this._gainNode.sample(finalUV.xy).rgb,this._hdr),hdrColor=hdrOffsetNode(texColor.rgb,boost,this._hdr),finalColor=(0,three_tsl.vec4)((0,three_tsl.mix)(texColor.rgb,hdrColor,this._hdr.enabled),texColor.a.mul(opacityNode));this.outputNode=finalColor}setMap(value){this.map=value,this._mapNode.value=value==null?getPlaceholderTexture():value}setGain(value){this._gainNode.value=value==null?getPlaceholderTexture():value}},TileMesh=class extends three_webgpu.Mesh{constructor(node,textureTask,material,releaseMaterial,releaseTexture){super(tileGeometry,material),this.disposed=!1,this.releaseMaterial=releaseMaterial,this.releaseTexture=releaseTexture,node.box.getCenter(this.position),this.quaternion.multiplyQuaternions(new three_webgpu.Quaternion().setFromAxisAngle(new three_webgpu.Vector3(0,1,0),-Math.PI),TILE_QUATERNION[node.face]),this.scale.setScalar(node.size),this.node=node,this.name=`tiling:tile`,this.material.level=node.level,this.material.visible=!1,this.material.polygonOffset=!0,this.material.polygonOffsetFactor=-node.level,this.material.polygonOffsetUnits=-node.level,this.activeTime=-1,this.frustumCulled=!1,this.renderOrder=node.level,this.appearDuration=0,this.appearMotion=new Motion({appear:0}),textureTask.then(([colorTexture,gainmapTexture])=>{this.colorTexture=colorTexture,this.gainmapTexture=gainmapTexture,this.disposed?(this.releaseTexture(colorTexture),this.releaseTexture(gainmapTexture),this.colorTexture=void 0,this.gainmapTexture=void 0):(this.material.setMap(colorTexture==null?null:colorTexture),this.material.setGain(gainmapTexture),this.material.visible=!0,this.appearMotion.set({appear:1},this.appearDuration*1e3).catch(require_memoryUsage.d))}).catch(require_memoryUsage.d)}updateTime(time){let needsRender=!1;if(this.disposed)return needsRender;this.appearMotion.ended===!1&&this.appearMotion.update(time),this.activeTime=time;let opacity=easeInCubic(this.appearMotion.value.appear);return this.material.opacity!==opacity&&(this.material.opacity=opacity,needsRender=!0),this.material.transparent=!0,needsRender}dispose(){this.disposed=!0,this.releaseTexture(this.colorTexture),this.releaseTexture(this.gainmapTexture),this.colorTexture=void 0,this.gainmapTexture=void 0,this.releaseMaterial(this.material)}},boundingGeometry=createSimpleBoxBufferGeometry(20,20,20);boundingGeometry.applyMatrix4(new three_webgpu.Matrix4().makeScale(-1,1,1));var BoundingMaterial=class extends three_webgpu.NodeMaterial{constructor(hdr){super();let dir=(0,three_tsl.normalize)(three_tsl.positionLocal),samplingDir=(0,three_tsl.vec3)(dir.x,dir.y,dir.z);this._mapNode=(0,three_tsl.cubeTexture)(new three_webgpu.CubeTexture,samplingDir),this._gainNode=(0,three_tsl.cubeTexture)(new three_webgpu.CubeTexture,samplingDir);let boost=computeHDRBoostNode(this._gainNode.rgb,hdr),hdrColor=hdrOffsetNode(this._mapNode.rgb,boost,hdr);this.fragmentNode=(0,three_tsl.vec4)((0,three_tsl.mix)(this._mapNode.rgb,hdrColor,hdr.enabled),1),this.depthTest=!0,this.depthWrite=!0,this.transparent=!1}get map(){return this._mapNode.value}set map(value){this._mapNode.value=value}set gainmap(value){this._gainNode.value=value==null?null:value}},BoundingMesh$1=class extends three_webgpu.Mesh{constructor(hdr){super(boundingGeometry,new BoundingMaterial(hdr)),this.disposed=!1,this.frustumCulled=!1,this.renderOrder=9999}update(time,map,gainmap){if(this.disposed){this.material.map=null,this.material.gainmap=null,this.visible=!1;return}this.material.map=map,gainmap&&(this.material.gainmap=gainmap),this.visible=map!==null}dispose(){this.disposed=!0,this.material.dispose()}},TILE_MATERIAL_POOL_MAX=64,TILE_TEXTURE_POOL_MAX_PER_SIZE=32,Tiling=class{constructor(options){var _a;this.prevHDRKey=``,this.tileMaterialPool=[],this.tileTexturePool=new Map,this.forceRenderWhenNextUpdate=!0,this.releaseTileMaterial=material=>{if(material.setMap(null),material.setGain(null),material.opacity=0,material.visible=!1,this.disposed||this.tileMaterialPool.length>=TILE_MATERIAL_POOL_MAX){material.dispose();return}this.tileMaterialPool.push(material)},this.releaseTileTexture=texture=>{var _a,_b;if(!texture)return;let image=texture.image,width=(_a=image==null?void 0:image.width)==null?0:_a,height=(_b=image==null?void 0:image.height)==null?0:_b;if(this.disposed||width===0||height===0){texture.dispose();return}let key=`${width}x${height}:${texture.colorSpace}`,list=this.tileTexturePool.get(key);if(list||(list=[],this.tileTexturePool.set(key,list)),list.length>=TILE_TEXTURE_POOL_MAX_PER_SIZE){texture.dispose();return}list.push(texture)},this.fiveId=options.fiveId,this.enableHDR=(_a=options.enableHDR)==null?!1:_a,this.disposed=!1,this.level=0,this.pedding=0,this.maxRequest=1,this.appearDuration=.5,this.maxCacheTile=48,this.imageOptions={},this.hdrUniforms=createHDRUniforms(),this.boundingMesh=new BoundingMesh$1(this.hdrUniforms),this.boundingMesh.frustumCulled=!1,this.textureLoader=new require_pick.i,this.observer=null,this.tileTree=createTileCubeTree(0),this.tileMeshes=new Map,this.frustum=new three_webgpu.Frustum,this.scene=new three_webgpu.Scene,this.camera=new three_webgpu.PerspectiveCamera(90,1,.1,100),this.scene.add(this.boundingMesh),this.renderTarget=new three_webgpu.RenderTarget(1,1,{depthBuffer:!0,stencilBuffer:!1,generateMipmaps:!1,magFilter:three_webgpu.LinearFilter,minFilter:three_webgpu.LinearFilter,wrapS:three_webgpu.ClampToEdgeWrapping,wrapT:three_webgpu.ClampToEdgeWrapping,type:options.enableHDR?three_webgpu.HalfFloatType:three_webgpu.UnsignedByteType}),this.renderTarget.texture.colorSpace=options.enableHDR?three_webgpu.LinearSRGBColorSpace:three_webgpu.SRGBColorSpace}dispose(){this.setObserver(null),this.renderTarget.dispose(),this.boundingMesh.dispose();for(let material of this.tileMaterialPool)material.dispose();this.tileMaterialPool.length=0,this.tileTexturePool.forEach(list=>{for(let texture of list){let image=texture.image;image&&typeof image.close==`function`&&image.close(),texture.dispose()}}),this.tileTexturePool.clear(),this.disposed=!0}acquireTileMaterial(){return this.tileMaterialPool.pop()||new TileMaterial(this.hdrUniforms)}acquireTileTexture(width,height,colorSpace){let list=this.tileTexturePool.get(`${width}x${height}:${colorSpace}`);return list&&list.pop()||new three_webgpu.Texture}adoptTileTexture(loaded){var _a,_b;if(!loaded)return;let image=loaded.image,width=(_a=image==null?void 0:image.width)==null?0:_a,height=(_b=image==null?void 0:image.height)==null?0:_b;if(width===0||height===0)return loaded;let pooled=this.acquireTileTexture(width,height,loaded.colorSpace),prevImage=pooled.image;return prevImage&&prevImage!==image&&typeof prevImage.close==`function`&&prevImage.close(),pooled.image=loaded.image,pooled.flipY=loaded.flipY,pooled.wrapS=loaded.wrapS,pooled.wrapT=loaded.wrapT,pooled.minFilter=loaded.minFilter,pooled.magFilter=loaded.magFilter,pooled.colorSpace=loaded.colorSpace,pooled.generateMipmaps=loaded.generateMipmaps,pooled.repeat.copy(loaded.repeat),pooled.offset.copy(loaded.offset),pooled.center.copy(loaded.center),pooled.matrixAutoUpdate=loaded.matrixAutoUpdate,pooled.updateMatrix(),pooled.needsUpdate=!0,loaded.image=null,pooled}cleanup(){this.tileMeshes.forEach(tileMesh=>{tileMesh.dispose(),this.scene.remove(tileMesh)}),this.tileMeshes.clear(),this.forceRenderWhenNextUpdate=!0}setObserver(observer){var _a,_b,_c,_d;if(this.disposed||this.observer===observer)return;this.cleanup(),this.observer=observer;let maxLevel=(_d=(_c=(_b=(_a=this.observer)==null?void 0:_a.images.tiles)==null?void 0:_b.slice().sort((a,b)=>b.level-a.level)[0])==null?void 0:_c.level)==null?0:_d;this.tileTree=createTileCubeTree(maxLevel)}update(frameState){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k;let needsRender=this.forceRenderWhenNextUpdate;if(this.disposed)return needsRender;let{time,resolution,pixelRatio,renderer,cameraMatrix,cameraProjectionMatrix,panoMap,panoGainmap,panoMatrix,panoZoom,minLevel,level,useHDR,maxDisplayBoost}=frameState,gainmapCfg=panoGainmap==null?void 0:panoGainmap.cfg;this.boundingMesh.update(time,panoMap,panoGainmap==null?void 0:panoGainmap.map),this.hdrUniforms.enabled.value=+!!useHDR,this.hdrUniforms.maxDisplayBoost.value=maxDisplayBoost==null?1:maxDisplayBoost,this.hdrUniforms.gamma.value=(_a=gainmapCfg==null?void 0:gainmapCfg.gamma)==null?require_memoryUsage.k.gamma:_a,this.hdrUniforms.minContentBoost.value=(_b=gainmapCfg==null?void 0:gainmapCfg.minContentBoost)==null?require_memoryUsage.k.minContentBoost:_b,this.hdrUniforms.maxContentBoost.value=(_c=gainmapCfg==null?void 0:gainmapCfg.maxContentBoost)==null?require_memoryUsage.k.maxContentBoost:_c,this.hdrUniforms.hdrCapacityMin.value=(_d=gainmapCfg==null?void 0:gainmapCfg.hdrCapacityMin)==null?require_memoryUsage.k.hdrCapacityMin:_d,this.hdrUniforms.hdrCapacityMax.value=(_e=gainmapCfg==null?void 0:gainmapCfg.hdrCapacityMax)==null?require_memoryUsage.k.hdrCapacityMax:_e,this.hdrUniforms.offsetSdr.value=(_f=gainmapCfg==null?void 0:gainmapCfg.offsetSdr)==null?require_memoryUsage.k.offsetSdr:_f,this.hdrUniforms.offsetHdr.value=(_g=gainmapCfg==null?void 0:gainmapCfg.offsetHdr)==null?require_memoryUsage.k.offsetHdr:_g;let hdrKey=[this.hdrUniforms.enabled.value,this.hdrUniforms.maxDisplayBoost.value,this.hdrUniforms.gamma.value,this.hdrUniforms.minContentBoost.value,this.hdrUniforms.maxContentBoost.value,this.hdrUniforms.hdrCapacityMin.value,this.hdrUniforms.hdrCapacityMax.value,this.hdrUniforms.offsetSdr.value,this.hdrUniforms.offsetHdr.value].join(`|`);if(hdrKey!==this.prevHDRKey&&(this.prevHDRKey=hdrKey,needsRender=!0),this.observer===null)return(this.renderTarget.width!==1||this.renderTarget.height!==1)&&(this.renderTarget.setSize(1,1),needsRender=!0),!1;this.level=require_memoryUsage.M(level,0,this.tileTree.maxLevel);let width=Math.floor(resolution.width*pixelRatio),height=Math.floor(resolution.height*pixelRatio),maxSize=Math.max(width,height),maxTextureSize=(_k=(_j=(_h=renderer.backend.device)==null?void 0:_h.limits)==null?void 0:_j.maxTextureDimension2D)==null?8192:_k;maxSize>maxTextureSize&&(width=Math.floor(width/maxSize*maxTextureSize),height=Math.floor(height/maxSize*maxTextureSize)),(this.renderTarget.width!==width||this.renderTarget.height!==height)&&this.renderTarget.setSize(width,height),this.scene.matrix.equals(panoMatrix)||(this.scene.matrix.copy(panoMatrix),this.scene.matrixWorld.copy(this.scene.matrix),this.scene.matrix.decompose(this.scene.position,this.scene.quaternion,this.scene.scale),this.scene.matrixAutoUpdate=!1,needsRender=!0);let cameraQuaternion=scratchCameraQuaternion.setFromRotationMatrix(cameraMatrix),relativeCameraMatrix=scratchCameraMatrix.compose(this.scene.position,cameraQuaternion,this.scene.scale);this.camera.matrix.equals(relativeCameraMatrix)||(this.camera.matrix.copy(relativeCameraMatrix),this.camera.matrixWorld.copy(this.camera.matrix),this.camera.position.copy(this.scene.position),this.camera.quaternion.copy(cameraQuaternion),this.camera.scale.copy(this.scene.scale),needsRender=!0);let cameraProjectionMatrixWithZoom=scratchCameraProjectMatrix.copy(cameraProjectionMatrix);cameraProjectionMatrixWithZoom.elements[0]*=panoZoom,cameraProjectionMatrixWithZoom.elements[5]*=panoZoom,this.camera.projectionMatrix.equals(cameraProjectionMatrixWithZoom)||(this.camera.projectionMatrix.copy(cameraProjectionMatrixWithZoom),this.camera.projectionMatrixInverse.copy(this.camera.projectionMatrix).invert(),needsRender=!0),scratchSceneQuaternionInverse.copy(this.scene.quaternion).invert(),scratchSceneMatrixInverse.makeRotationFromQuaternion(scratchSceneQuaternionInverse),scratchFrustumMatrix.copy(this.camera.matrix),scratchFrustumMatrix.setPosition(0,0,0),scratchFrustumMatrix.premultiply(scratchSceneMatrixInverse),scratchFrustumMatrixInverse.copy(scratchFrustumMatrix).invert(),scratchFrustumProjectMatrix.multiplyMatrices(this.camera.projectionMatrix,scratchFrustumMatrixInverse),this.frustum.setFromProjectionMatrix(scratchFrustumProjectMatrix);let direction=this.frustum.planes[5].normal,currentNodes=[];level>=minLevel&&traverseTileCubeNode(this.tileTree,node=>{if(!(node.level<minLevel)){if(node.level>level||!this.frustum.intersectsBox(node.box))return!1;currentNodes.push(node)}});let angleCache=new WeakMap;currentNodes.sort((a,b)=>{if(a.level!==b.level)return a.level-b.level;let aAngle=angleCache.get(a);aAngle===void 0&&(aAngle=a.box.getCenter(scratchSortVector3).angleTo(direction),angleCache.set(a,aAngle));let bAngle=angleCache.get(b);return bAngle===void 0&&(bAngle=b.box.getCenter(scratchSortVector3).angleTo(direction),angleCache.set(b,bAngle)),aAngle-bAngle});let usedNodes=new WeakSet,tileSources=this.observer.images.tiles;if(tileSources)for(let node of currentNodes){let tileSource=tileSources.find(tileSource=>tileSource.level===node.level);if(!tileSource)continue;usedNodes.add(node);let tileMesh=this.tileMeshes.get(node);if(tileMesh){tileMesh.appearDuration=this.appearDuration,tileMesh.updateTime(time)&&(needsRender=!0);continue}if(this.pedding>=this.maxRequest)continue;let tileRow=Math.pow(2,node.level)*node.position.y,tileCol=Math.pow(2,node.level)*node.position.x,identity=`${panoStringify({panoIndex:this.observer.panoIndex,workCode:this.observer.work.workCode})}.${node.face}.${node.level}.${tileRow}.${tileCol}`,source=tileSource.work.getURL(tileSource[node.face]),gainmapSource=this.enableHDR&&tileSource.gainmap?tileSource.work.getURL(tileSource.gainmap[node.face]):void 0,sourceSize=tileSource.size,imageURLTransform=this.imageOptions.transform,imageURLOptions=Object.assign(Object.assign({},require_pick.r(this.imageOptions,[`format`,`sharpen`,`forceUseExifOrientation`,`mappings`])),{key:`pano_tile.${identity}`,size:tileSource.scale>=1?void 0:sourceSize*node.size*tileSource.scale,cut:node.size===1?void 0:[sourceSize*node.position.x,sourceSize*node.position.y,sourceSize*node.size,sourceSize*node.size]});node.level===1&&tileSource.scale>=.5&&(imageURLOptions.format===`jpg`||/\.jpg$/.test(source))&&(imageURLOptions.size=void 0,imageURLOptions.quality||(imageURLOptions.quality=70)),node.size===1&&console.warn(`tile: ${imageURLOptions.key} should not appear.`),this.pedding++;let colorTask=Promise.all([this.textureLoader.loadTexture(source,{imageURL:{transform:imageURLTransform,options:imageURLOptions},colorSpace:three_webgpu.SRGBColorSpace,minFilter:three_webgpu.LinearFilter,magFilter:three_webgpu.LinearFilter,generateMipmaps:!1,fetcher:getFetcher(this.fiveId,this.observer.work)}).then(respose=>this.adoptTileTexture(respose.body)),gainmapSource?this.textureLoader.loadTexture(gainmapSource,{imageURL:{transform:imageURLTransform,options:imageURLOptions},colorSpace:three_webgpu.NoColorSpace,minFilter:three_webgpu.LinearFilter,magFilter:three_webgpu.LinearFilter,generateMipmaps:!1,fetcher:getFetcher(this.fiveId,this.observer.work)}).then(respose=>this.adoptTileTexture(respose.body)):Promise.resolve(void 0)]);colorTask.then(([texture,gainmapTexture])=>Promise.all([texture?initTexture(texture,renderer):Promise.resolve(),gainmapTexture?initTexture(gainmapTexture,renderer):Promise.resolve()])).then(result=>(this.pedding--,result),error=>(this.pedding--,Promise.reject(error))),tileMesh=new TileMesh(node,colorTask,this.acquireTileMaterial(),this.releaseTileMaterial,this.releaseTileTexture),tileMesh.name=`tiling:tile-${identity}`,tileMesh.visible=!1,tileMesh.appearDuration=this.appearDuration,this.tileMeshes.set(node,tileMesh),this.scene.add(tileMesh),tileMesh.updateTime(time),needsRender=!0}let usedTileMeshs=[],unUsedTileMeshs=[];this.tileMeshes.forEach((tileMesh,node)=>{usedNodes.has(node)?usedTileMeshs.push(tileMesh):unUsedTileMeshs.push(tileMesh);let visible=node.level>=minLevel&&node.level<=level;tileMesh.visible!==visible&&(tileMesh.visible=visible,needsRender=!0)});let outdatedTileMeshs=unUsedTileMeshs.sort((a,b)=>b.activeTime-a.activeTime).slice(Math.max(0,this.maxCacheTile-usedTileMeshs.length));for(let tileMesh of outdatedTileMeshs)this.tileMeshes.delete(tileMesh.node),this.scene.remove(tileMesh),tileMesh.dispose(),needsRender=!0;if(needsRender){let prevRenderTarget=renderer.getRenderTarget(),prevClearColor=renderer.getClearColor(scratchPrevClearColor$1),prevClearAlpha=renderer.getClearAlpha(),preAutoClear=renderer.autoClear,preAutoClearColor=renderer.autoClearColor,preAutoClearDepth=renderer.autoClearDepth,preAutoClearStencil=renderer.autoClearStencil;renderer.autoClear=!0,renderer.autoClearColor=!0,renderer.autoClearDepth=!0,renderer.autoClearStencil=!0,renderer.setRenderTarget(this.renderTarget),renderer.setClearColor(new three_webgpu.Color(0,0,0),clearAlpha),renderer.render(this.scene,this.camera),renderer.setRenderTarget(prevRenderTarget),renderer.setClearColor(prevClearColor,prevClearAlpha),renderer.autoClear=preAutoClear,renderer.autoClearColor=preAutoClearColor,renderer.autoClearDepth=preAutoClearDepth,renderer.autoClearStencil=preAutoClearStencil}return this.forceRenderWhenNextUpdate=!1,needsRender}},CANDIDATE_ORDER=[`videoFrame`,`video`,`canvasFromVideoFrame`,`canvasFromVideo`],CANDIDATE_SHORT={videoFrame:`vf`,video:`video`,canvasFromVideoFrame:`cvf`,canvasFromVideo:`cv`},BRIGHT_THRESHOLD=6,MAX_CONSECUTIVE_FAILS=10,MIN_FAIL_DURATION_MS=3e3,BLACKLIST_TTL_MS=15e3,MAX_CANVAS_SIZE=4096,INTERMEDIATE_FORMAT=`rgba8unorm-srgb`,BLIT_SHADER=`
|
|
517
517
|
struct VSOut {
|
|
@@ -556,7 +556,7 @@ fn fs(in: VSOut) -> @location(0) vec4f {
|
|
|
556
556
|
}`)),gl.attachShader(program,compile(gl.FRAGMENT_SHADER,`#version 300 es
|
|
557
557
|
precision mediump float;
|
|
558
558
|
in vec2 uv; uniform sampler2D tex; out vec4 color;
|
|
559
|
-
void main() { color = vec4(texture(tex, uv).rgb, 1.0); }`)),gl.linkProgram(program),!gl.getProgramParameter(program,gl.LINK_STATUS))return null;let texture=gl.createTexture();return gl.bindTexture(gl.TEXTURE_2D,texture),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE),{canvas,gl,texture,program,pixels:new Uint8Array(GL_PROBE_SIZE*GL_PROBE_SIZE*4)}}catch(_a){return null}}function disposeGLProbe(probe){var _a;let{gl}=probe;gl.deleteTexture(probe.texture),gl.deleteProgram(probe.program),(_a=gl.getExtension(`WEBGL_lose_context`))==null||_a.loseContext()}var GPU_PROBE_WIDTH=64,GPU_PROBE_HEIGHT=16,VideoTextureBridge=class{constructor(videoTexture){var _a;this.debug={path:`pending`,candidate:``,locked:!1,probe:``,updateCalls:0,skipNotReady:0,blitCount:0,rvfcCount:0,fails:0,targetSize:``,lastError:``},this.mode=`unknown`,this.device=null,this.broken=!1,this.disposed=!1,this.locked=!1,this.blacklist=new Map,this.probing=!1,this.nextProbeAt=0,this.probeInterval=300,this.consecutiveFails=0,this.failingSince=0,this.frameTexture=null,this.frameReady=!1,this.heldFrame=null,this.canvas=null,this.canvasContext=null,this.gpuTexture=null,this.externalTexture=null,this.externalReady=!1,this.width=0,this.height=0,this.frameDirty=!0,this.lastVideoTime=-1,this.videoFrameCallbackId=null,this.glProbe=null,this.glProbeFailed=!1,this.gpuProbe=null,this.probeCanvas=null,this.forced=!1,this.onSourceChange=()=>{this.forced||(this.blacklist.clear(),this.locked=!1,this.debug.locked=!1,this.probeInterval=300,this.nextProbeAt=0,this.consecutiveFails=0,this.frameDirty=!0)},this.videoTexture=videoTexture,this.current=(_a=CANDIDATE_ORDER.find(isAvailable))==null?`video`:_a,this.debug.candidate=this.current,this.scheduleVideoFrameCallback();let video=this.video;typeof(video==null?void 0:video.addEventListener)==`function`&&video.addEventListener(`loadstart`,this.onSourceChange)}get video(){return this.videoTexture.image}scheduleVideoFrameCallback(){let video=this.video;this.disposed||typeof(video==null?void 0:video.requestVideoFrameCallback)!=`function`||(this.videoFrameCallbackId=video.requestVideoFrameCallback(()=>{this.videoFrameCallbackId=null,this.frameDirty=!0,this.debug.rvfcCount++,this.scheduleVideoFrameCallback()}))}get texture(){var _a;if(this.broken||this.mode===`unknown`)return this.videoTexture;let wantsExternal=this.mode===`webgpu`&&(this.current===`videoFrame`||this.current===`video`),external=this.externalReady?this.externalTexture:null,frame=this.frameReady?this.frameTexture:null;return(_a=wantsExternal?external==null?frame:external:frame==null?external:frame)==null?getPlaceholder():_a}update(renderer){if(this.debug.updateCalls++,this.disposed||this.broken||!this.resolveMode(renderer))return;let video=this.video;if(!(video instanceof HTMLVideoElement))return;if(video.readyState<2||video.videoWidth===0||video.videoHeight===0){this.debug.skipNotReady++;return}let now=performance.now();if(!this.locked&&!this.probing&&now>=this.nextProbeAt&&this.startProbe(),!(!this.frameDirty&&(this.debug.rvfcCount>0||video.currentTime===this.lastVideoTime)))try{this.produce(this.current,video),this.frameDirty=!1,this.lastVideoTime=video.currentTime,this.consecutiveFails=0,this.debug.blitCount++}catch(error){this.onProduceFailed(error)}}forceCandidate(candidate){if(candidate===null){this.forced=!1,this.onSourceChange();return}this.forced=!0,this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}resolveMode(renderer){if(this.mode!==`unknown`)return!0;let backend=renderer==null?void 0:renderer.backend;if(!backend)return!1;if(backend.isWebGPUBackend===!0){if(!backend.device)return!1;this.device=backend.device,this.mode=`webgpu`}else this.mode=`webgl`;return this.debug.path=this.mode,this.ensureFrameTexture(),!0}ensureFrameTexture(){if(this.frameTexture)return;let source=this.videoTexture,texture=new three_webgpu.VideoFrameTexture;texture.colorSpace=three_webgpu.SRGBColorSpace,texture.generateMipmaps=!1,texture.minFilter=source.minFilter,texture.magFilter=source.magFilter,texture.wrapS=source.wrapS,texture.wrapT=source.wrapT,this.frameTexture=texture}produce(candidate,video){let webgpu=this.mode===`webgpu`;switch(candidate){case`videoFrame`:{let frame=createVideoFrame(video);if(webgpu)try{this.blit(frame,video)}finally{frame.close()}else this.setFrame(frame,frame);break}case`video`:webgpu?this.blit(video,video):this.setFrame(video,null);break;case`canvasFromVideoFrame`:{let frame=createVideoFrame(video);try{this.drawCanvas(frame,video)}finally{frame.close()}this.setFrame(this.canvas,null);break}case`canvasFromVideo`:this.drawCanvas(video,video),this.setFrame(this.canvas,null);break}}setFrame(image,owned){this.frameTexture.setFrame(image);let previous=this.heldFrame;this.heldFrame=owned,previous&&previous!==owned&&previous.close(),this.frameReady=!0}drawCanvas(source,video){let scale=Math.min(1,MAX_CANVAS_SIZE/Math.max(video.videoWidth,video.videoHeight)),width=Math.max(1,Math.floor(video.videoWidth*scale)),height=Math.max(1,Math.floor(video.videoHeight*scale));if(!this.canvas&&(this.canvas=document.createElement(`canvas`),this.canvasContext=this.canvas.getContext(`2d`,{alpha:!1}),!this.canvasContext))throw Error(`canvas 2d 上下文不可用`);this.canvas.width!==width&&(this.canvas.width=width),this.canvas.height!==height&&(this.canvas.height=height),this.canvasContext.drawImage(source,0,0,width,height)}isBlacklisted(candidate){let expiresAt=this.blacklist.get(candidate);return expiresAt===void 0?!1:performance.now()>=expiresAt?(this.blacklist.delete(candidate),!1):!0}onProduceFailed(error){var _a;let now=performance.now();if(this.consecutiveFails===0&&(this.failingSince=now),this.consecutiveFails++,this.debug.fails++,this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a),this.consecutiveFails<MAX_CONSECUTIVE_FAILS||now-this.failingSince<MIN_FAIL_DURATION_MS)return;console.warn(`[Five] 视频候选路径 ${this.current} 持续失败,暂时弃用`,error),this.blacklist.set(this.current,now+BLACKLIST_TTL_MS);let next=CANDIDATE_ORDER.find(c=>isAvailable(c)&&!this.isBlacklisted(c));this.consecutiveFails=0,next?(this.current=next,this.debug.candidate=next,this.locked=!1,this.debug.locked=!1,this.nextProbeAt=0,this.frameDirty=!0):(console.warn(`[Five] 视频所有候选路径均失败,回退为 VideoTexture 上传`),this.broken=!0,this.debug.path=`fallback`,this.releaseOutputs())}blit(source,video){this.ensureTarget(video.videoWidth,video.videoHeight);let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device),external=device.importExternalTexture({source}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoBlit`}),pass=encoder.beginRenderPass({colorAttachments:[{view:this.gpuTexture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),device.queue.submit([encoder.finish()]),this.externalReady=!0,this.debug.targetSize=`${this.width}x${this.height}`}ensureTarget(videoWidth,videoHeight){let device=this.device,maxSize=device.limits.maxTextureDimension2D,scale=Math.min(1,maxSize/Math.max(videoWidth,videoHeight)),width=Math.max(1,Math.floor(videoWidth*scale)),height=Math.max(1,Math.floor(videoHeight*scale));if(this.gpuTexture&&this.width===width&&this.height===height)return;let prevGPUTexture=this.gpuTexture,gpuTexture=device.createTexture({label:`five.videoBlit.target`,size:{width,height},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});if(this.gpuTexture=gpuTexture,this.width=width,this.height=height,this.externalTexture)this.externalTexture.sourceTexture=gpuTexture,this.externalTexture.image={width,height},this.externalTexture.dispose();else{let texture=new three_webgpu.ExternalTexture(gpuTexture);texture.colorSpace=three_webgpu.SRGBColorSpace,texture.flipY=!1,texture.generateMipmaps=!1,texture.minFilter=three_webgpu.LinearFilter,texture.magFilter=three_webgpu.LinearFilter,texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.image={width,height},this.externalTexture=texture}prevGPUTexture==null||prevGPUTexture.destroy()}startProbe(){this.probing=!0,this.runProbe().catch(error=>{var _a;this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a)}).finally(()=>{this.probing=!1,this.nextProbeAt=performance.now()+this.probeInterval,this.probeInterval=Math.min(this.probeInterval*1.5,5e3)})}runProbe(){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let results=[],chosen=null;for(let candidate of CANDIDATE_ORDER){let label=CANDIDATE_SHORT[candidate];if(this.disposed)return;if(this.isBlacklisted(candidate)||!isAvailable(candidate)){results.push(`${label}:n/a`);continue}let brightness;try{brightness=yield this.probeCandidate(candidate)}catch(_a){brightness=-1}if(results.push(`${label}:${brightness===null?`?`:brightness}`),brightness===null||brightness>=BRIGHT_THRESHOLD){chosen=candidate;break}}this.debug.probe=results.join(` `),chosen&&this.select(chosen)})}select(candidate){this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}probeCandidate(candidate){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let video=this.video;if(!(video instanceof HTMLVideoElement)||video.readyState<2)return-1;switch(candidate){case`canvasFromVideoFrame`:return this.probe2d(video,!0);case`canvasFromVideo`:return this.probe2d(video,!1);default:return this.mode===`webgpu`?this.probeGPU(video,candidate===`videoFrame`):this.probeGL(video,candidate===`videoFrame`)}})}probe2d(video,useFrame){if(!this.probeCanvas){let canvas=document.createElement(`canvas`);canvas.width=canvas.height=GL_PROBE_SIZE;let context=canvas.getContext(`2d`,{willReadFrequently:!0});if(!context)return-1;this.probeCanvas=context}let frame=useFrame?createVideoFrame(video):null;try{return this.probeCanvas.drawImage(frame==null?video:frame,0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),maxChannel(this.probeCanvas.getImageData(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE).data)}finally{frame==null||frame.close()}}probeGL(video,useFrame){!this.glProbe&&!this.glProbeFailed&&(this.glProbe=createGLProbe(),this.glProbeFailed=this.glProbe===null);let probe=this.glProbe;if(!probe)return null;let{gl}=probe,frame=useFrame?createVideoFrame(video):null;try{return gl.getError(),gl.viewport(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),gl.bindTexture(gl.TEXTURE_2D,probe.texture),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,frame==null?video:frame),gl.getError()===gl.NO_ERROR?(gl.useProgram(probe.program),gl.drawArrays(gl.TRIANGLES,0,3),gl.readPixels(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE,gl.RGBA,gl.UNSIGNED_BYTE,probe.pixels),maxChannel(probe.pixels)):-1}finally{frame==null||frame.close()}}probeGPU(video,useFrame){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device);this.gpuProbe||(this.gpuProbe={texture:device.createTexture({label:`five.videoProbe.target`,size:{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),buffer:device.createBuffer({label:`five.videoProbe.readback`,size:GPU_PROBE_WIDTH*4*GPU_PROBE_HEIGHT,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});let probe=this.gpuProbe;device.pushErrorScope(`validation`);let encodeError=null,frame=useFrame?createVideoFrame(video):null;try{let external=device.importExternalTexture({source:frame==null?video:frame}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoProbe`}),pass=encoder.beginRenderPass({colorAttachments:[{view:probe.texture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),encoder.copyTextureToBuffer({texture:probe.texture},{buffer:probe.buffer,bytesPerRow:GPU_PROBE_WIDTH*4},{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT}),device.queue.submit([encoder.finish()])}catch(error){encodeError=error}finally{frame==null||frame.close()}let scopeError=yield device.popErrorScope();if(encodeError||scopeError)return-1;yield probe.buffer.mapAsync(GPUMapMode.READ);let brightness=maxChannel(new Uint8Array(probe.buffer.getMappedRange()));return probe.buffer.unmap(),brightness})}releaseProbeResources(){this.glProbe&&(disposeGLProbe(this.glProbe),this.glProbe=null),this.glProbeFailed=!1,this.probeCanvas=null,this.gpuProbe&&(this.gpuProbe.texture.destroy(),this.gpuProbe.buffer.destroy(),this.gpuProbe=null)}releaseOutputs(){var _a,_b,_c,_d;(_a=this.heldFrame)==null||_a.close(),this.heldFrame=null,(_b=this.frameTexture)==null||_b.dispose(),this.frameTexture=null,this.frameReady=!1,(_c=this.externalTexture)==null||_c.dispose(),this.externalTexture=null,this.externalReady=!1,(_d=this.gpuTexture)==null||_d.destroy(),this.gpuTexture=null,this.width=this.height=0,this.canvas=null,this.canvasContext=null}dispose(){if(this.disposed)return;this.disposed=!0;let video=this.video;this.videoFrameCallbackId!==null&&typeof(video==null?void 0:video.cancelVideoFrameCallback)==`function`&&video.cancelVideoFrameCallback(this.videoFrameCallbackId),this.videoFrameCallbackId=null,typeof(video==null?void 0:video.removeEventListener)==`function`&&video.removeEventListener(`loadstart`,this.onSourceChange),this.releaseOutputs(),this.releaseProbeResources()}},bridges=new WeakMap;function getVideoTextureBridge(videoTexture){let bridge=bridges.get(videoTexture);if(!bridge){let created=new VideoTextureBridge(videoTexture);bridge=created,bridges.set(videoTexture,created);let onDispose=()=>{videoTexture.removeEventListener(`dispose`,onDispose),bridges.get(videoTexture)===created&&bridges.delete(videoTexture),created.dispose()};videoTexture.addEventListener(`dispose`,onDispose)}return bridge}var ROTATE_Y_PI_MATRIX=new three_webgpu.Matrix4().makeRotationAxis(new three_webgpu.Vector3(0,1,0),Math.PI),scratchMapMatrix=new three_webgpu.Matrix4,CUBE_MAP_FLIP=(0,three_tsl.float)(-1),VIDEO_UV_CENTER=(0,three_tsl.vec2)(.5,.5),sharedGeometry$1=createSimpleBoxBufferGeometry(2,2,2);sharedGeometry$1.applyMatrix4(new three_webgpu.Matrix4().makeScale(-1,1,1));function createPanoVideoMaterial(){let u={size:(0,three_tsl.uniform)(new three_webgpu.Vector2),mapMatrix:(0,three_tsl.uniform)(new three_webgpu.Matrix4),panoMatrix:(0,three_tsl.uniform)(new three_webgpu.Matrix4),alpha:(0,three_tsl.uniform)(1),map:(0,three_tsl.texture)(new three_webgpu.Texture)},cameraToVertex=three_tsl.positionWorld.sub(three_tsl.cameraPosition).normalize().toVar(`cameraToVertex`),panoDirection=u.panoMatrix.toMat3().transpose().mul(cameraToVertex).toVar(`panoDirection`),cubeDirection=(0,three_tsl.vec3)(panoDirection.x.mul(CUBE_MAP_FLIP),panoDirection.y,panoDirection.z),mapCoods=u.mapMatrix.mul((0,three_tsl.vec4)(cubeDirection,1)).toVar(`mapCoods`),videoUv=(0,three_tsl.vec2)((0,three_tsl.float)(.5).add(mapCoods.x.div(mapCoods.z).div(u.size.x)),(0,three_tsl.float)(.5).sub(mapCoods.y.div(mapCoods.z).div(u.size.y))).toVar(`videoUv`),videoColor=(0,three_tsl.texture)(u.map,videoUv),match=(0,three_tsl.float)(1).sub((0,three_tsl.step)((0,three_tsl.float)(0),mapCoods.z)).mul((0,three_tsl.float)(1).sub((0,three_tsl.step)((0,three_tsl.float)(.5),(0,three_tsl.abs)(videoUv.x.sub(.5))))).mul((0,three_tsl.float)(1).sub((0,three_tsl.step)((0,three_tsl.float)(.5),(0,three_tsl.abs)(videoUv.y.sub(.5))))),blendAlpha=(0,three_tsl.float)(5).mul((0,three_tsl.float)(1).sub((0,three_tsl.distance)(videoUv,VIDEO_UV_CENTER).div(.55).clamp(0,1))).clamp(0,1),material=new three_webgpu.NodeMaterial;return material.fragmentNode=(0,three_tsl.vec4)(videoColor.rgb,match.mul(blendAlpha).mul(u.alpha)),material.depthTest=!1,material.depthWrite=!1,material.fog=!1,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,{material,u}}var PanoVideo=class{constructor(){this.videoBridge=null;let{material,u}=createPanoVideoMaterial();this.material=material,this.u=u,this.object=new three_webgpu.Mesh(sharedGeometry$1,this.material),this.object.visible=!1,this.object.renderOrder=-1,this.object.frustumCulled=!1,this.object.name=`pano-video`,this.alphaMotion=new Motion({alpha:0}),this.active=!1,this.object.onBeforeRender=renderer=>{let bridge=this.videoBridge;bridge&&(bridge.update(renderer),this.u.map.value=bridge.texture)}}setMaterial(value){value?(this.u.size.value.copy(value.size),this.u.mapMatrix.value.copy(scratchMapMatrix.multiplyMatrices(ROTATE_Y_PI_MATRIX,value.matrix).transpose()),this.u.panoMatrix.value.copy(value.panoMatrix),value.map.colorSpace=three_webgpu.SRGBColorSpace,value.map.isVideoTexture?(this.videoBridge=getVideoTextureBridge(value.map),this.u.map.value=this.videoBridge.texture):(this.videoBridge=null,this.u.map.value=value.map),this.alphaMotion.set({alpha:value.alpha},500).catch(require_memoryUsage.d)):(this.u.size.value.setScalar(0),this.u.mapMatrix.value.identity(),this.u.panoMatrix.value.identity(),this.videoBridge=null,this.u.map.value=null,this.u.alpha.value=0,this.alphaMotion.set({alpha:0},0).catch(require_memoryUsage.d));let active=value!==null;this.active!==active&&(this.active=active,this.object.visible=active)}updateTime(time){this.alphaMotion.ended||(this.alphaMotion.update(time),this.u.alpha.value=this.alphaMotion.value.alpha)}dispose(){this.material.dispose()}},clearColor=new three_webgpu.Color(0,0,0),scratchPrevClearColor=new three_webgpu.Color;function packDepthToRGBA(depth){let r=depth.mul(256*256*256).fract(),g=depth.mul(256*256).fract().sub(r.mul(1/256)),b=depth.mul(256).fract().sub(g.mul(1/256));return(0,three_tsl.vec4)(r,g,b,depth.sub(b.mul(1/256))).mul(256/255)}var maxDepthUniform=(0,three_tsl.uniform)(0),depthFragmentNode=packDepthToRGBA((0,three_tsl.clamp)((0,three_tsl.length)(three_tsl.positionWorld.sub(three_tsl.cameraPosition)).div(maxDepthUniform),0,1)),depthMaterial=new three_webgpu.NodeMaterial;depthMaterial.fragmentNode=depthFragmentNode,depthMaterial.fog=!1;function renderDepthCube(renderer,scene,cubeCamera,maxDepth=1e3){maxDepthUniform.value=maxDepth,renderer.getClearColor(scratchPrevClearColor);let prevClearAlpha=renderer.getClearAlpha(),prevOverrideMaterial=scene.overrideMaterial;scene.overrideMaterial=depthMaterial,renderer.setClearColor(clearColor,0),cubeCamera.update(renderer,scene),renderer.setClearColor(scratchPrevClearColor,prevClearAlpha),scene.overrideMaterial=prevOverrideMaterial}function toError(error){if(error instanceof Error)return error;let type=typeof error;return Error(type&&type===`object`?JSON.stringify(error):error)}var defaultEffectEase=linear,scratchRaycaster=new three_webgpu.Raycaster,scratchVector3$2=new three_webgpu.Vector3,adjustPanoCircleMeshVectors=[new three_webgpu.Vector3(0,0,0).multiplyScalar(.1),new three_webgpu.Vector3(1,0,0).multiplyScalar(.1),new three_webgpu.Vector3(-.5,0,-Math.sqrt(3)/2).multiplyScalar(.1),new three_webgpu.Vector3(-.5,0,Math.sqrt(3)/2).multiplyScalar(.1)],defaultPanoramaControllerCustomInitArgs=Object.assign(Object.assign({},defaultPanoramaLikeControllerCustomInitArgs),{maxAccessibleDistance:5,panoTapTriggerRadius:.5,panoCircleMeshCreator:(observer,options)=>observer.position.distanceTo(observer.standingPosition)>options.aerialObserverMinHeight?new PanoCircleMeshSolid:new PanoCircleMesh,adjustPanoCircleMeshPositionBasedOnModel:!1,tileLevelForFov:((fov,viewSize)=>{var _a;let degToRad=rad=>rad/180*Math.PI,log2=(_a=Math.log2)==null?(n=>Math.log(n)*Math.LOG2E):_a,size=viewSize.height/2/Math.tan(degToRad(fov/2))*Math.tan(degToRad(45))*2,level=Math.max(log2(size/512),0);return level<2.3&&level>.1&&(level=1),level=level%1>.75?Math.ceil(level):Math.floor(level),level}),tileAppearDuration:.5,tileMaxRequest:3,flyEffectUseDepthBuffer:!1}),PanoramaController=class PanoramaController extends PanoramaLikeController{static parseArgs(args){var _a,_b,_c,_d,_e,_f,_g,_h;if(args instanceof PanoramaController)return args;let args_=super.parseArgs(args);return Object.assign(Object.assign({},args_),{maxAccessibleDistance:(_a=args.maxAccessibleDistance)==null?defaultPanoramaControllerCustomInitArgs.maxAccessibleDistance:_a,panoTapTriggerRadius:(_b=args.panoTapTriggerRadius)==null?defaultPanoramaControllerCustomInitArgs.panoTapTriggerRadius:_b,panoCircleMeshCreator:(_c=args.panoCircleMeshCreator)==null?defaultPanoramaControllerCustomInitArgs.panoCircleMeshCreator:_c,adjustPanoCircleMeshPositionBasedOnModel:(_d=args.adjustPanoCircleMeshPositionBasedOnModel)==null?defaultPanoramaControllerCustomInitArgs.adjustPanoCircleMeshPositionBasedOnModel:_d,tileLevelForFov:(_e=args.tileLevelForFov)==null?defaultPanoramaControllerCustomInitArgs.tileLevelForFov:_e,tileAppearDuration:(_f=args.tileAppearDuration)==null?defaultPanoramaControllerCustomInitArgs.tileAppearDuration:_f,tileMaxRequest:(_g=args.tileMaxRequest)==null?defaultPanoramaControllerCustomInitArgs.tileMaxRequest:_g,flyEffectUseDepthBuffer:(_h=args.flyEffectUseDepthBuffer)==null?defaultPanoramaControllerCustomInitArgs.flyEffectUseDepthBuffer:_h})}static initAnimationEndState(args){let args_=this.parseArgs(args),state=super.initAnimationEndState(args_);return Object.assign(Object.assign({},state),{mode:`Panorama`})}constructor(args){let args_=PanoramaController.parseArgs(args);super(args_),this.mode=`Panorama`,this.initAnimationed=!1,this.maxAccessibleDistance=args_.maxAccessibleDistance,this.panoTapTriggerRadius=args_.panoTapTriggerRadius,this.panoCircleMeshCreator=args_.panoCircleMeshCreator,this.adjustPanoCircleMeshPositionBasedOnModel=args_.adjustPanoCircleMeshPositionBasedOnModel,this.tileLevelForFov=args_.tileLevelForFov,this.tileAppearDuration=args_.tileAppearDuration,this.tileMaxRequest=args_.tileMaxRequest,this.flyEffectUseDepthBuffer=args_.flyEffectUseDepthBuffer,this.adjustPanoCircleMeshPositionFix=new Map;let{pano0,pano1}=this.modelScene.parameter.resolveValue();pano0&&(pano1==null?void 0:pano1.map)!==pano0.map&&(this.modelScene.parameter.set({pano0:pano1}),pano0.map.dispose());let existsPanoSet=new Set;pano0&&existsPanoSet.add(pano0),pano1&&existsPanoSet.add(pano1),this.panoMeshes=new Map,this.locationMotion=new Motion({count:0,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x}),this.panoResources={},this.panoResources[this.locationMotion.keyframes[0].key=this.locationMotion.keyframes[1].key=require_memoryUsage.N()]={panoId:panoStringify(this.currentPano),panoPicture:this.modelScene.parameter.resolveValue().pano1,position:this.camera.pose.offset.clone(),effect:`fly`,effectEasing:defaultEffectEase,fixCameraTransform:new three_webgpu.Matrix4},this.panoPictureObserverMap=new WeakMap,this.textureLoader=new require_pick.i,this.tiling=new Tiling({fiveId:this.fiveId,enableHDR:this.enableHDR}),this.panoVideo=new PanoVideo,this.scene.add(this.panoVideo.object),this.accessibleObserverFloorCheckCount=0}get tileLevel(){return this.tiling.level}updateConfiguration(args){return super.updateConfiguration(args)===!1?!1:(args.maxAccessibleDistance!==void 0&&this.maxAccessibleDistance!==args.maxAccessibleDistance&&(this.maxAccessibleDistance=args.maxAccessibleDistance),args.panoTapTriggerRadius!==void 0&&this.panoTapTriggerRadius!==args.panoTapTriggerRadius&&(this.panoTapTriggerRadius=args.panoTapTriggerRadius),args.panoCircleMeshCreator!==void 0&&this.panoCircleMeshCreator!==args.panoCircleMeshCreator&&(this.panoCircleMeshCreator=args.panoCircleMeshCreator,this.panoMeshes&&(this.panoMeshes.forEach(panoMesh=>{this.helper.remove(panoMesh),panoMesh.dispose()}),this.panoMeshes.clear())),args.tileLevelForFov!==void 0&&this.tileLevelForFov!==args.tileLevelForFov&&(this.tileLevelForFov=args.tileLevelForFov),args.tileMaxRequest!==void 0&&this.tileMaxRequest!==args.tileMaxRequest&&(this.tileMaxRequest=args.tileMaxRequest),args.flyEffectUseDepthBuffer!==void 0&&this.flyEffectUseDepthBuffer!==args.flyEffectUseDepthBuffer&&(this.flyEffectUseDepthBuffer=args.flyEffectUseDepthBuffer),args.adjustPanoCircleMeshPositionBasedOnModel!==void 0&&this.adjustPanoCircleMeshPositionBasedOnModel!==args.adjustPanoCircleMeshPositionBasedOnModel&&(this.adjustPanoCircleMeshPositionBasedOnModel=args.adjustPanoCircleMeshPositionBasedOnModel,this.adjustPanoCircleMeshPositionBasedOnModel||this.adjustPanoCircleMeshPositionFix.clear()),!0)}destroy(){super.destroy(),this.tiling.dispose(),this.modelScene.parameter.set({refinedScreen:null,pano0Depth:null,pano1Depth:null}),this.pano0DepthCubeRenderTarget&&(this.pano0DepthCubeRenderTarget.dispose(),this.pano0DepthCubeRenderTarget=void 0),this.pano1DepthCubeRenderTarget&&(this.pano1DepthCubeRenderTarget.dispose(),this.pano1DepthCubeRenderTarget=void 0),this.locationMotion.dispose(),this.pendingTextureTask=void 0,this.panoMeshes&&(this.panoMeshes.forEach(panoMesh=>{this.helper.remove(panoMesh),panoMesh.dispose()}),this.panoMeshes.clear());let video=this.videoTexture.image;video.pause(),video.oncanplay=require_memoryUsage.d,video.ontimeupdate=require_memoryUsage.d,this.scene.remove(this.panoVideo.object),this.panoVideo.setMaterial(null),this.panoVideo.dispose();let{pano0,pano1}=this.modelScene.parameter.resolveValue();for(let name of Object.keys(this.panoResources)){let panoResource=this.panoResources[name];if(panoResource.panoPicture){let texture=panoResource.panoPicture.map;texture&&texture!==(pano0==null?void 0:pano0.map)&&texture!==(pano1==null?void 0:pano1.map)&&(texture.dispose(),panoResource.panoPicture=null)}delete this.panoResources[name]}}isReady(){return this.locationMotion.ended===!0?super.isReady():!1}isTileReady(){let tilingTileReay=this.tiling.pedding<=0;return this.initAnimationed&&tilingTileReay}updateWork(works,state,options,userAction){this.userAction=userAction,this.works=works;let toState=PanoramaController.initAnimationEndState(Object.assign(Object.assign({},this),{initial:{currentState:Object.assign(Object.assign({},this.currentPano),this.camera.pose),duration:options.duration,effect:options.effect,state,userAction}}));return(toState.workCode!==this.currentPano.workCode||toState.panoIndex!==this.currentPano.panoIndex||toState.longitude!==this.cameraMotion.value.longitude||toState.latitude!==this.cameraMotion.value.latitude||toState.fov!==this.cameraMotion.value.fov)&&(this.initAnimationed=!1,this.moveToPano({workCode:toState.workCode,panoIndex:toState.panoIndex},{effect:options.effect,duration:options.duration,longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov,moveEndCallback:()=>{this.initAnimationed=!0},moveCancelCallback:()=>{this.initAnimationed=!0}},userAction)),!0}updateModel(modelScene){this.modelScene=modelScene,this.hideIntersectMesh()}updateTime(time,deltaTime,...args){var _a,_b,_c,_d,_e,_f;if(this.destroyed)return;let uniforms={},cameraPose={},cameraDirection=this.camera.getDirection(new three_webgpu.Vector3),startKeyframe=this.locationMotion.keyframes[0],endKeyframe=this.locationMotion.keyframes[this.locationMotion.keyframes.length-1],[prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),prevResource=this.panoResourceFromLocationMotionKeyframe(prevKeyframe),nextResource=this.panoResourceFromLocationMotionKeyframe(nextKeyframe),startResource=this.panoResourceFromLocationMotionKeyframe(startKeyframe),endResource=this.panoResourceFromLocationMotionKeyframe(endKeyframe),fixedTransition=!1;if(this.cameraMotion.ended===!1&&(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),this.modelAlphaMotion.ended===!1&&(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.perspToOrthoMotion.ended===!1&&(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),this.locationMotion.ended===!1){this.locationMotion.update(time);let progress=this.locationMotion.value.count-nextKeyframe.value.count+1,prevPosition=new three_webgpu.Vector3().copy(prevResource.position),nextPosition=new three_webgpu.Vector3().copy(nextResource.position);if(uniforms.progress=nextResource.effectEasing(progress),progress>=.01&&progress<=.99&&(uniforms.progress=require_memoryUsage.M(nextResource.effectEasing(progress),.01,.99)),nextResource.panoPicture&&(progress<1?prevResource.panoPicture&&(uniforms.pano0=prevResource.panoPicture):uniforms.pano0=nextResource.panoPicture,uniforms.pano1=nextResource.panoPicture),nextResource.effect===`montage`?uniforms.transition=`BLACK`:nextResource.effect===`spread`?uniforms.transition=`SPREAD`:uniforms.transition=`FADE`,nextResource.effect===`zoomin`||nextResource.effect===`zoomout`?uniforms.progress=Math.pow(progress,3):nextResource.effect===`model`&&this.camera.pose.distance<.01&&(uniforms.modelAlpha=1-Math.pow(require_memoryUsage.M(Math.abs(progress-.5)*2,0,1),4)),progress<1&&nextResource.effect!==`fly`&&nextResource.effect!==`model`){if(uniforms.pano0&&prevResource.panoPicture){let panoPicture={panoId:uniforms.pano0.panoId,map:uniforms.pano0.map,mapHistogram:uniforms.pano0.mapHistogram,mapSize:uniforms.pano0.mapSize,zoom:uniforms.pano0.zoom,matrix:prevResource.panoPicture.matrix.clone().premultiply(prevResource.fixCameraTransform).setPosition(nextResource.position),gainmap:uniforms.pano0.gainmap?{map:uniforms.pano0.gainmap.map,cfg:Object.assign({},uniforms.pano0.gainmap.cfg)}:void 0},observer=this.panoPictureObserverMap.get(uniforms.pano0);observer&&this.panoPictureObserverMap.set(panoPicture,observer),uniforms.pano0=panoPicture}prevPosition.copy(nextPosition),fixedTransition=!0}cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(prevPosition.x+(nextPosition.x-prevPosition.x)*progress,prevPosition.y+(nextPosition.y-prevPosition.y)*progress,prevPosition.z+(nextPosition.z-prevPosition.z)*progress);let keyframeKeys=[],restKeyframeKeys=[];for(let keyframe of this.locationMotion.keyframes){let{key,progress}=keyframe;key!==void 0&&(keyframeKeys.push(key),progress>this.locationMotion.progress&&restKeyframeKeys.push(key))}for(let name of Object.keys(this.panoResources)){if(restKeyframeKeys.indexOf(name)>=0)continue;let panoResource=this.panoResources[name];if(panoResource.panoPicture){let texture=panoResource.panoPicture.map;if(texture){if(texture===((_a=uniforms.pano0)==null?void 0:_a.map)||texture===((_b=uniforms.pano1)==null?void 0:_b.map))continue;texture.dispose(),panoResource.panoPicture=null}}keyframeKeys.indexOf(name)>=0||delete this.panoResources[name]}let currentPano=panoParse(nextResource.panoId);currentPano!==this.currentPano&&(this.currentPano=currentPano,this.accessibleObserverFloorCheckCount=0),this.emit(`pano.moving`,createEvent(`pano.moving`,{userAction:this.userAction,prevPano:panoParse(startResource.panoId),state:Object.assign(Object.assign(Object.assign(Object.assign({},panoParse(endResource.panoId)),{mode:this.mode}),clonePose(this.camera.pose)),cameraPose),options:{},progress:this.locationMotion.progress,error:null}))}isEmptyObject(uniforms)===!1&&this.modelScene.parameter.set(uniforms),!this.modelScene.parameter.pano0&&this.modelScene.parameter.pano1&&this.modelScene.parameter.set(`pano0`,this.modelScene.parameter.pano1),isEmptyObject(cameraPose)===!1&&this.setCamera(cameraPose);let currentObserver=this.works.getObserver(this.currentPano),forwardObserver=this.locationMotion.ended?this.getForwardObserverOrNot(this.camera):null,prevObserver=this.works.getObserver(prevResource.panoId),nextObserver=this.works.getObserver(nextResource.panoId);if(this.adjustPanoCircleMeshPositionBasedOnModel&&this.helper.visible&¤tObserver){let accessibleObservers=[],observers=currentObserver.work.observers;for(let panoIndex of currentObserver.accessibleNodes){let observer=observers[panoIndex];observer&&accessibleObservers.push(observer)}let cache=new Map;if(accessibleObservers.sort((a,b)=>{let aDistance=cache.get(a);aDistance===void 0&&(aDistance=a.standingPosition.distanceTo(currentObserver.standingPosition),cache.set(a,aDistance));let bDistance=cache.get(a);return bDistance===void 0&&(bDistance=b.standingPosition.distanceTo(currentObserver.standingPosition),cache.set(b,bDistance)),aDistance-bDistance}),accessibleObservers.length){this.accessibleObserverFloorCheckCount%=accessibleObservers.length;let observer=accessibleObservers[this.accessibleObserverFloorCheckCount],model=this.modelScene.models.find(model=>model.work===(observer==null?void 0:observer.work));if(observer&&model&&model.visible){let maxOffset=.3,antiZFighting=.005,standingPosition=observer.standingPosition.clone().applyMatrix4(observer.work.transform),panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),positions=adjustPanoCircleMeshVectors.map(vector=>{scratchRaycaster.ray.origin.copy(standingPosition),scratchRaycaster.ray.origin.add(scratchVector3$2.copy(vector).setY(maxOffset)),scratchRaycaster.ray.direction.set(0,-1,0),scratchRaycaster.firstHitOnly=!0,scratchRaycaster.floorIndex=-1;let[intersect]=model.intersectRaycaster(scratchRaycaster);return intersect&&intersect.distance-antiZFighting<=maxOffset?new three_webgpu.Vector3().copy(standingPosition).setY(intersect.point.y+antiZFighting):standingPosition});positions.sort((a,b)=>b.y-a.y);let middleValue=positions[Math.floor(positions.length/2)],[position]=positions.filter(p=>p.distanceTo(middleValue)<=.05);if(position){let fixVector=new three_webgpu.Vector4(standingPosition.x,standingPosition.y,standingPosition.z,position.y-standingPosition.y),last=this.adjustPanoCircleMeshPositionFix.get(panoId);last&&!fixVector.equals(last)&&(this.needsRender=!0),this.adjustPanoCircleMeshPositionFix.set(panoId,fixVector)}}this.accessibleObserverFloorCheckCount++}}let visibleObserverMap=new Map;if(prevObserver)for(let panoIndex of prevObserver.accessibleNodes){let observer=prevObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(nextObserver)for(let panoIndex of nextObserver.accessibleNodes){let observer=nextObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(this.panoMeshes.forEach((panoMesh,panoId)=>{visibleObserverMap.get(panoId)?visibleObserverMap.delete(panoId):(this.helper.remove(panoMesh),panoMesh.dispose(),this.panoMeshes.delete(panoId))}),visibleObserverMap.forEach((observer,panoId)=>{let panoMesh=this.panoCircleMeshCreator(observer,{aerialObserverMinHeight:this.aerialObserverMinHeight});this.panoMeshes.set(panoId,panoMesh),this.helper.add(panoMesh),visibleObserverMap.delete(panoId)}),this.panoMeshes.forEach((panoMesh,panoId)=>{let observer=this.works.getObserver(panoId);if(observer){let isAerialPhoto=observer.position.distanceTo(observer.standingPosition)>this.aerialObserverMinHeight;if(isAerialPhoto)panoMesh.position.copy(observer.position).applyMatrix4(observer.work.transform),panoMesh.scale.setScalar(18);else{panoMesh.position.copy(observer.standingPosition).applyMatrix4(observer.work.transform);let fixVector=this.adjustPanoCircleMeshPositionFix.get(observer.panoId);fixVector&&(scratchVector3$2.set(fixVector.x,fixVector.y,fixVector.z),scratchVector3$2.equals(panoMesh.position)&&(panoMesh.position.y+=fixVector.w)),panoMesh.scale.setScalar(1.2)}let origin=this.camera.position.clone().setY(panoMesh.position.y),direction=new three_webgpu.Vector3().copy(panoMesh.position).sub(origin).normalize();if(panoId===panoStringify(this.currentPano)){let delta=require_memoryUsage.M((.5-origin.distanceTo(panoMesh.position))/.5,0,1);direction.multiplyScalar(1-delta).add(cameraDirection.clone().multiplyScalar(delta))}if(direction.length()>0){let rotateX=isAerialPhoto?-Math.PI/2:0,rotateY=Math.atan2(direction.x,direction.z);panoMesh.quaternion.setFromEuler(new three_webgpu.Euler(rotateX,rotateY,0,`YXZ`))}}else panoMesh.visible=!1}),this.camera.pose.distance>.1||fixedTransition)this.panoMeshes.forEach(panoMesh=>{panoMesh.setOpacity(0),panoMesh.setCurrent(!1),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime),panoMesh.visible=!1});else if(currentObserver){let observers=currentObserver.work.observers,[,minDistance]=arrayMin(currentObserver.accessibleNodes,panoIndex=>{let accessibleObserver=observers[panoIndex];return!accessibleObserver||!accessibleObserver.active?1/0:currentObserver.standingPosition.distanceTo(accessibleObserver.standingPosition)},!0);minDistance=require_memoryUsage.M(minDistance,3,1/0);let accessibleIds=currentObserver.accessibleNodes.concat(currentObserver.panoIndex).map(panoIndex=>panoStringify({panoIndex,workCode:currentObserver.work.workCode}));this.panoMeshes.forEach((panoMesh,panoId)=>{let observer=this.works.getObserver(panoId),current=!1,opacity=1;if(accessibleIds.indexOf(panoId)===-1)current=!1,opacity=0;else if(!observer)current=!1,opacity=0;else if(!observer.loadable&&!observer.active)current=!1,opacity=0;else{let screen=panoMesh.position.clone().project(this.camera);current=Math.abs(screen.x)<1&&Math.abs(screen.y)<1&&Math.abs(screen.z)<1&&!panoMesh.loading&&panoMesh.progress===0&&forwardObserver!==null&&panoStringify({panoIndex:forwardObserver.panoIndex,workCode:forwardObserver.work.workCode})===panoId;let distance=panoMesh.position.clone().setY(this.camera.position.y).distanceTo(this.camera.position);opacity=distance<.01?0:require_memoryUsage.M(minDistance/distance,.1,.85)}observer&&observer===nextObserver&&observer.position.distanceTo(observer.standingPosition)>this.aerialObserverMinHeight&&panoMesh.position.distanceTo(this.camera.position)<35&&(opacity=0),this.modelScene.parameter.resolveValue().modelAlpha>0&&(opacity=0),panoMesh.setCurrent(current),panoMesh.setOpacity(opacity),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime)})}{let progress=(_c=this.modelScene.parameter.progress)==null?1:_c,panoNumber=Math.round(progress),pano0=this.modelScene.parameter.pano0,pano1=this.modelScene.parameter.pano1,pano=panoNumber===0?pano0:pano1,observer;if(pano&&(observer=this.works.getObserver(pano.panoId),observer||(observer=this.panoPictureObserverMap.get(pano))),this.tiling.appearDuration=this.tileAppearDuration,this.tiling.maxRequest=progress<(require_imageBitmap.t()?.6:.99)?0:this.tileMaxRequest,this.tiling.imageOptions=this.imageOptions,!observer||!pano||this.tileLevelForFov===!1||this.camera.perspToOrtho.x>0){this.tiling.setObserver(null);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:null,panoGainmap:void 0,panoMatrix:new three_webgpu.Matrix4,panoZoom:1,minLevel:0,level:0};this.tiling.update(tilingFrameState),this.modelScene.parameter.set(`refinedScreen`,null)}else{let panoLevel=require_pick.o(pano.mapSize),minLevel=panoLevel+1,viewSize=new three_webgpu.Vector2().copy(this.camera.resolution).multiplyScalar(this.camera.pixelRatio),computedLevel=Math.floor(this.tileLevelForFov(this.camera.fov,viewSize)),level=computedLevel>panoLevel?computedLevel:0;this.tiling.setObserver(observer);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:pano.map,panoGainmap:pano.gainmap,panoMatrix:pano.matrix,panoZoom:pano.zoom,minLevel,level,useHDR:this.modelScene.parameter.resolveValue(`useHDR`),maxDisplayBoost:this.modelScene.parameter.resolveValue(`maxDisplayBoost`)},tilingUpdated=this.tiling.update(tilingFrameState),refinedScreen={map:this.tiling.renderTarget.texture,matrixInverse:this.tiling.camera.matrixWorldInverse,projectionMatrix:this.tiling.camera.projectionMatrix,pano:panoNumber,opacity:(pano0==null?void 0:pano0.panoId)===(pano1==null?void 0:pano1.panoId)?1:easeInQuart(Math.abs(((_d=this.modelScene.parameter.progress)==null?0:_d)-.5)*2)},prevRefinedScreen=this.modelScene.parameter.refinedScreen;(tilingUpdated||refinedScreen.pano!==(prevRefinedScreen==null?void 0:prevRefinedScreen.pano)||refinedScreen.opacity!==(prevRefinedScreen==null?void 0:prevRefinedScreen.opacity))&&this.modelScene.parameter.set(`refinedScreen`,refinedScreen)}}if(this.panoVideo.object.position.copy(this.camera.position),this.panoVideo.updateTime(time),currentObserver&¤tObserver.images.video&&(this.needsRender=!0),this.intersectMesh&&this.intersectMesh.parent&¤tObserver&¤tObserver.position.y-currentObserver.standingPosition.y>10){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1);{let effect=nextResource.effect,{pano0,pano1}=this.modelScene.parameter;if(pano0&&pano1&&pano0!==pano1&&(effect===`fly`||effect===`model`)&&this.flyEffectUseDepthBuffer){if(((_e=this.modelScene.parameter.pano0Depth)==null?void 0:_e.panoId)!==pano0.panoId||((_f=this.modelScene.parameter.pano1Depth)==null?void 0:_f.panoId)!==pano1.panoId){this.pano0DepthCubeRenderTarget?this.pano0DepthCubeRenderTarget.width!==512&&this.pano0DepthCubeRenderTarget.setSize(512,512):this.pano0DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1}),this.pano1DepthCubeRenderTarget?this.pano1DepthCubeRenderTarget.width!==512&&this.pano1DepthCubeRenderTarget.setSize(512,512):this.pano1DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1});let pano0Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano0DepthCubeRenderTarget);pano0Camera.matrix.copy(pano0.matrix),pano0Camera.matrixWorld.copy(pano0Camera.matrix),pano0Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano0Camera,500);let pano1Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano1DepthCubeRenderTarget);pano1Camera.matrix.copy(pano1.matrix),pano1Camera.matrixWorld.copy(pano1Camera.matrix),pano1Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano1Camera,500),this.modelScene.parameter.set({pano0Depth:{panoId:pano0.panoId,map:this.pano0DepthCubeRenderTarget.texture,mapSize:this.pano0DepthCubeRenderTarget.width,maxDepth:500},pano1Depth:{panoId:pano1.panoId,map:this.pano1DepthCubeRenderTarget.texture,mapSize:this.pano1DepthCubeRenderTarget.width,maxDepth:500}})}}else this.modelScene.parameter.set({pano0Depth:null,pano1Depth:null}),this.flyEffectUseDepthBuffer||(this.pano0DepthCubeRenderTarget&&(this.pano0DepthCubeRenderTarget.dispose(),this.pano0DepthCubeRenderTarget=void 0),this.pano1DepthCubeRenderTarget&&(this.pano1DepthCubeRenderTarget.dispose(),this.pano1DepthCubeRenderTarget=void 0))}}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1],nextResource=this.panoResourceFromLocationMotionKeyframe(targetLocationKeyFrame),nextObserver=this.works.getObserver(nextResource.panoId);return{workCode:nextObserver?nextObserver.work.workCode:this.currentPano.workCode,panoIndex:nextObserver?nextObserver.panoIndex:this.currentPano.panoIndex,mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,offset:nextObserver?nextObserver.position.clone().applyMatrix4(nextObserver.work.transform):this.camera.position.clone(),distance:this.locationMotion.value.distance}}moveToPano(pano,options,userAction){var _a,_b,_c;this.userAction=userAction,this.stopMomentumMovement();let panoId=panoStringify(pano),observer=this.works.getObserver(pano);if(!observer)throw Error(`Invalid PanoId ${JSON.stringify(pano)}`);let originImageSize=require_pick.a(observer.images.up),imageSize=this.imageOptions.size;imageSize===void 0&&observer&&originImageSize&&(imageSize=Number(originImageSize)),imageSize===void 0&&(imageSize=2048);let imageURLTransform=this.imageOptions.transform,imageURLOptions=Object.assign({key:`pano.${panoId}`},require_pick.r(this.imageOptions,[`format`,`size`,`quality`,`sharpen`,`forceUseExifOrientation`,`mappings`])),colorImageURLs={right:observer.images.work.getURL(observer.images.right),left:observer.images.work.getURL(observer.images.left),up:observer.images.work.getURL(observer.images.up),down:observer.images.work.getURL(observer.images.down),front:observer.images.work.getURL(observer.images.front),back:observer.images.work.getURL(observer.images.back)},gainmapImageURLs,gainmapConfigUrl,gainmap=this.enableHDR?observer.images.gainmap:void 0;gainmap&&(gainmapImageURLs={right:observer.images.work.getURL(gainmap.right),left:observer.images.work.getURL(gainmap.left),up:observer.images.work.getURL(gainmap.up),down:observer.images.work.getURL(gainmap.down),front:observer.images.work.getURL(gainmap.front),back:observer.images.work.getURL(gainmap.back)},gainmapConfigUrl=observer.images.work.getURL(gainmap.cfg));let hash=`pano:`+jsonHash([colorImageURLs,gainmapImageURLs,imageURLOptions]);if(this.pendingTextureTask){if(this.pendingTextureTask.hash===hash)return;{let panoId=this.pendingTextureTask.panoId;(_a=this.panoMeshes.get(panoId))==null||_a.setProgress(0),this.emit(`pano.texture.abort`,createEvent(`pano.texture.abort`,{error:null,progress:0,meta:null,pano:{panoIndex:observer.panoIndex,workCode:observer.work.workCode}}))}}let pendingKey=`move-to-pano-`+panoId;this.pending.add(pendingKey);let event=createExtendableEvent(`pano.prepare`,{options,prevMode:this.mode,prevPano:this.currentPano,pano});if(this.emit(`pano.prepare`,event),event.defaultPrevented){this.pending.delete(pendingKey);return}event.options!==options&&Object.assign(options,event.options);let effect=(_b=options.effect)==null?`fly`:_b,parameter=this.modelScene.parameter,existsPano;if(parameter.pano0&¶meter.pano0.map.name===hash?existsPano=parameter.pano0:parameter.pano1&¶meter.pano1.map.name===hash&&(existsPano=parameter.pano1),existsPano){let panoResource={panoId,effect,effectEasing:(_c=options.effectEasing)==null?defaultEffectEase:_c,panoPicture:{panoId:existsPano.panoId,map:existsPano.map,mapHistogram:existsPano.mapHistogram,mapSize:existsPano.mapSize,matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap:existsPano.gainmap?{map:existsPano.gainmap.map,cfg:Object.assign({},existsPano.gainmap.cfg)}:void 0},position:observer.position.clone().applyMatrix4(observer.work.transform),fixCameraTransform:new three_webgpu.Matrix4};panoResource.panoPicture&&this.panoPictureObserverMap.set(panoResource.panoPicture,observer),this.pendingTextureTask=void 0,Promise.resolve().then(()=>waitForExtendableEvent(event)).then(()=>{require_imageBitmap.s.shared.add(()=>{this.pending.delete(pendingKey),this.doMoveToPano(pano,panoResource,options)},!0,1)}).catch(error_=>{var _a;let error=toError(error_),state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`pano.error`,createEvent(`pano.error`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`pano.cancel`,createEvent(`pano.cancel`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`error`,error),options.moveCancelCallback&&options.moveCancelCallback(),this.pending.delete(pendingKey),this.pendingTextureTask=void 0,(_a=this.panoMeshes.get(panoId))==null||_a.setProgress(0)});return}this.pendingTextureTask={panoId,hash,onLoad:(colorResponse,gainmap)=>(0,tslib.__awaiter)(this,void 0,void 0,function*(){var _a,_b;let texture=colorResponse.body;if(this.destroyed)texture.dispose();else{texture.name=hash;let image=Array.isArray(texture.image)?texture.image[0]:texture.image,mapSize=(_a=image==null?void 0:image.width)==null?2048:_a,{data}=yield getRgbaDataFromCubeTexture(this.renderer,texture,!0,sharedHistogramRgbaData),mapHistogram=new Histogram().formPixels(data),panoResource={panoId,effect,effectEasing:(_b=options.effectEasing)==null?defaultEffectEase:_b,panoPicture:{panoId,map:texture,mapSize,mapHistogram:new three_webgpu.Vector4().fromArray(mapHistogram.toArray()),matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap},position:observer.position.clone().applyMatrix4(observer.work.transform),fixCameraTransform:new three_webgpu.Matrix4};panoResource.panoPicture&&this.panoPictureObserverMap.set(panoResource.panoPicture,observer),this.doMoveToPano(pano,panoResource,options)}}),onError:error=>{let state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`pano.error`,createEvent(`pano.error`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`pano.cancel`,createEvent(`pano.cancel`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`error`,error),options.moveCancelCallback&&options.moveCancelCallback()}};let panoMesh=this.panoMeshes.get(panoId);panoMesh&&panoMesh.tap&&panoMesh.tap();let colorTextureTask=this.textureLoader.loadCubeTexture(colorImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,percent=>{var _a,_b;this.emit(`pano.texture.progress`,createEvent(`pano.texture.progress`,{error:null,progress:percent,meta:null,pano})),((_a=this.pendingTextureTask)==null?void 0:_a.hash)===hash&&((_b=this.panoMeshes.get(panoId))==null||_b.setProgress(percent))},this.renderer),gainmapTask=gainmapConfigUrl&&gainmapImageURLs?Promise.all([getFetcher(this.fiveId,observer.work).ajax(gainmapConfigUrl,{responseType:`text`}).then(response=>require_memoryUsage.A(JSON.parse(response.body))),this.textureLoader.loadCubeTexture(gainmapImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,colorSpace:three_webgpu.NoColorSpace,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer)]).then(([config,response])=>({config,map:response.body})):Promise.resolve(void 0),prepareTask=Promise.resolve().then(()=>waitForExtendableEvent(event)).then(()=>null).catch(error_=>toError(error_));Promise.all([colorTextureTask,gainmapTask,prepareTask]).then(([colorResponse,gainmap,prepareError])=>{var _a,_b,_c,_d;if(this.pending.delete(pendingKey),prepareError){colorResponse.body.dispose(),((_a=this.pendingTextureTask)==null?void 0:_a.hash)===hash&&(this.pendingTextureTask.onError(prepareError),this.pendingTextureTask=void 0,(_b=this.panoMeshes.get(panoId))==null||_b.setProgress(0));return}((_c=this.pendingTextureTask)==null?void 0:_c.hash)===hash?(this.pendingTextureTask.onLoad(colorResponse,gainmap?{map:gainmap.map,cfg:gainmap.config}:void 0),this.pendingTextureTask=void 0,(_d=this.panoMeshes.get(panoId))==null||_d.setProgress(0)):colorResponse.body.dispose(),this.emit(`pano.texture.success`,createEvent(`pano.texture.success`,{error:null,progress:1,meta:colorResponse.meta,pano}))}).catch(error=>{var _a,_b;this.pending.delete(pendingKey),((_a=this.pendingTextureTask)==null?void 0:_a.hash)===hash&&(this.pendingTextureTask.onError(error),this.pendingTextureTask=void 0,(_b=this.panoMeshes.get(panoId))==null||_b.setProgress(0)),this.emit(`pano.texture.error`,createEvent(`pano.texture.error`,{error,progress:0,meta:null,pano})),this.emit(`error`,error)}),this.emit(`pano.texture.load`,createEvent(`pano.texture.load`,{error:null,progress:0,meta:null,pano}))}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{duration,effect,userAction}=this.initial;this.userAction=userAction;let toState=PanoramaController.initAnimationEndState(this),pano={workCode:toState.workCode,panoIndex:toState.panoIndex},modelAlphaValue={modelAlpha:0},perspToOrthoValue={perspToOrtho:0},started=!1;this.moveToPano(pano,{longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov,effect,duration,moveStartCallback:state=>{started=!0,this.perspToOrthoMotion.set(perspToOrthoValue,duration).catch(require_memoryUsage.d),this.modelAlphaMotion.setKeyframes([{progress:0,value:Object.assign({},this.modelAlphaMotion.value)},{progress:.6,value:Object.assign({},this.modelAlphaMotion.value)},{progress:1,value:modelAlphaValue}],duration).catch(require_memoryUsage.d),this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state,userAction:this.userAction}))},moveEndCallback:state=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),this.initAnimationed=!0,resolve()},moveCancelCallback:()=>{let state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));started===!1&&this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state,userAction:this.userAction})),this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),this.initAnimationed=!0,resolve()}},userAction)})}panoResourceFromLocationMotionKeyframe(keyframe){return this.panoResources[keyframe.key]}locationMotionKeyframesLength(keyframes){let length=0;for(let i=1;i<keyframes.length;i++){let prevPostion=this.panoResourceFromLocationMotionKeyframe(keyframes[i-1]).position,nextPostion=this.panoResourceFromLocationMotionKeyframe(keyframes[i]).position,distance=prevPostion.distanceTo(nextPostion)*(keyframes[i].value.count-keyframes[i-1].value.count);length+=distance}return length}doMoveToPano(pano,panoResource,options={}){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l;let time=require_memoryUsage.p(),key=require_memoryUsage.N();this.panoResources[key]=panoResource;let distance,keyframes,startVeloProgresscity;if(this.locationMotion.ended){let[_prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),locationValue=this.locationMotion.value,nextPostion=((_a=this.panoResourceFromLocationMotionKeyframe(nextKeyframe))==null?this.camera:_a).position,targetPosition=panoResource.position;distance=Math.max(nextPostion.distanceTo(targetPosition),1),keyframes=[{key:nextKeyframe.key,progress:0,value:Object.assign(Object.assign({},locationValue),{count:0})},{key,progress:1,value:{distance:0,count:1}}],startVeloProgresscity=0}else{let[prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),locationValue=this.locationMotion.value,prevPostion=this.panoResourceFromLocationMotionKeyframe(prevKeyframe).position,nextPostion=this.panoResourceFromLocationMotionKeyframe(nextKeyframe).position,targetPosition=panoResource.position,distance1Progress=nextKeyframe.value.count-locationValue.count,distance1=Math.max(prevPostion.distanceTo(nextPostion),1)*distance1Progress;distance=distance1+Math.max(nextPostion.distanceTo(targetPosition),1),keyframes=[{key:prevKeyframe.key,progress:0,value:Object.assign({},locationValue)},{key:nextKeyframe.key,progress:distance1/distance,value:nextKeyframe.value},{key,progress:1,value:{count:nextKeyframe.value.count+1,distance:0}}];let prevKeyframesLength=this.locationMotionKeyframesLength(this.locationMotion.keyframes),nextKeyframesLength=this.locationMotionKeyframesLength(keyframes);startVeloProgresscity=prevKeyframesLength===0||prevKeyframesLength===0?0:this.locationMotion.getProgressVelocity(time)*prevKeyframesLength/nextKeyframesLength}let animationDuration=panoResource.effect===`instant`?0:this.calculateMovingDuration(options.duration,panoResource.effect===`fly`||panoResource.effect===`model`?distance:0),cameraPose={longitude:options.longitude,latitude:options.latitude,fov:options.fov},state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:(_b=cameraPose.longitude)==null?this.camera.pose.longitude:_b,latitude:(_c=cameraPose.latitude)==null?this.camera.pose.latitude:_c,fov:(_d=cameraPose.fov)==null?this.camera.pose.fov:_d,offset:panoResource.position.clone(),distance:this.camera.pose.distance}),prevPano=this.currentPano;if(this.emit(`pano.moveTo`,createEvent(`pano.moveTo`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveStartCallback&&options.moveStartCallback(state),this.videoTexture&&this.videoTexture.image instanceof HTMLVideoElement&&this.videoTexture.image.getAttribute(`src`)&&(this.videoTexture.image.pause(),this.videoTexture.image.removeAttribute(`uuid`),this.videoTexture.image.removeAttribute(`src`),this.videoTexture.image.oncanplay=require_memoryUsage.d,this.videoTexture.needsUpdate=!0),this.panoVideo.setMaterial(null),panoResource.effect===`fly`||panoResource.effect===`model`)this.cameraMotion.set(cameraPose,animationDuration).catch(require_memoryUsage.d);else{let prevVector=coordinatesToVector({longitude:this.cameraMotion.value.longitude,latitude:this.cameraMotion.value.latitude}),nextVector=coordinatesToVector({longitude:(_e=cameraPose.longitude)==null?this.cameraMotion.value.longitude:_e,latitude:(_f=cameraPose.latitude)==null?this.cameraMotion.value.latitude:_f}),object=new three_webgpu.Object3D;object.lookAt(prevVector);let prevMatrix=new three_webgpu.Matrix4().makeRotationFromQuaternion(object.quaternion);object.lookAt(nextVector);let nextMatrix=new three_webgpu.Matrix4().makeRotationFromQuaternion(object.quaternion),cameraTransitionMatrix=prevMatrix.clone().invert().premultiply(nextMatrix),prevFov=this.cameraMotion.value.fov,endFov=(_g=cameraPose.fov)==null?this.cameraMotion.value.fov:_g,fovScale=1;panoResource.effect===`zoomin`?fovScale=1.5:panoResource.effect===`zoomout`&&(fovScale=.4);let startFov=require_memoryUsage.M(endFov*fovScale,1,170);for(let i=0;i<keyframes.length-1;i++){let key=keyframes[i].key;if(key){let panoResource=this.panoResources[key];panoResource&&(panoResource.fixCameraTransform.copy(cameraTransitionMatrix),panoResource.panoPicture&&(panoResource.panoPicture.zoom=Math.tan(startFov/2/180*Math.PI)/Math.tan(prevFov/2/180*Math.PI)))}}this.cameraMotion.setKeyframes([{progress:0,value:{longitude:this.cameraMotion.value.longitude,latitude:this.cameraMotion.value.latitude,fov:this.cameraMotion.value.fov}},{progress:0,value:{longitude:(_h=cameraPose.longitude)==null?this.cameraMotion.value.longitude:_h,latitude:(_j=cameraPose.latitude)==null?this.cameraMotion.value.latitude:_j,fov:startFov}},{progress:1,value:{longitude:(_k=cameraPose.longitude)==null?this.cameraMotion.value.longitude:_k,latitude:(_l=cameraPose.latitude)==null?this.cameraMotion.value.latitude:_l,fov:endFov}}],animationDuration).catch(require_memoryUsage.d)}this.locationMotion.setKeyframes(keyframes,animationDuration,startVeloProgresscity).then(()=>{for(let model of this.modelScene.children)model instanceof Model&&model.show();let state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance});this.emit(`pano.arrived`,createEvent(`pano.arrived`,{options,prevPano,progress:1,state,userAction:this.userAction,error:null})),options.moveEndCallback&&options.moveEndCallback(state);let currentObserver=this.works.getObserver(pano);if(currentObserver&¤tObserver.images.video&&this.videoTexture&&this.videoTexture.image instanceof HTMLVideoElement){let panoVideoValue={map:this.videoTexture,size:currentObserver.images.video.size.clone(),matrix:currentObserver.images.video.matrix.clone(),panoMatrix:currentObserver.matrix.clone().premultiply(currentObserver.work.transform),alpha:1},playId=require_memoryUsage.N(),video=this.videoTexture.image;video.setAttribute(`uuid`,playId),video.oncanplay=require_memoryUsage.d,video.ontimeupdate=require_memoryUsage.d,canplayVideo().then(canplay=>{canplay&¤tObserver.images.video&&video.getAttribute(`uuid`)===playId&&(video.oncanplay=()=>{video.oncanplay=require_memoryUsage.d,video.play()},video.ontimeupdate=()=>{video.currentTime>.5&&(video.ontimeupdate=require_memoryUsage.d,this.panoVideo.setMaterial(panoVideoValue))},video.src=currentObserver.images.video.source)}).catch((()=>{video.removeAttribute(`uuid`)}))}else{let video=this.videoTexture.image;video.removeAttribute(`uuid`),video.oncanplay=require_memoryUsage.d,video.ontimeupdate=require_memoryUsage.d}},()=>{this.emit(`pano.cancel`,createEvent(`pano.cancel`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveCancelCallback&&options.moveCancelCallback()})}getForwardObserverOrNot(camera,raycaster){let currentObserver=this.works.getObserver(this.currentPano);if(!currentObserver)return null;let rawRaycaster=raycaster==null?new three_webgpu.Raycaster(camera.position.clone(),camera.getWorldDirection(new three_webgpu.Vector3)):raycaster;rawRaycaster.params.Points={threshold:.1},rawRaycaster.firstHitOnly=!0,rawRaycaster.floorIndex=-1;let groundPosition=currentObserver.standingPosition.clone().applyMatrix4(currentObserver.work.transform);if(currentObserver.position.clone().applyMatrix4(currentObserver.work.transform).distanceTo(rawRaycaster.ray.origin)>1){let raycaster=new three_webgpu.Raycaster(rawRaycaster.ray.origin,new three_webgpu.Vector3(0,-1,0));raycaster.firstHitOnly=rawRaycaster.firstHitOnly,raycaster.floorIndex=rawRaycaster.floorIndex;let[groundIntersect]=this.modelScene.intersectRaycaster(raycaster);groundIntersect&&groundIntersect.distance<=2?groundPosition.copy(groundIntersect.point):groundPosition.copy(rawRaycaster.ray.origin).add(new three_webgpu.Vector3(0,-1.5,0))}let[rawForwardIntersect]=this.modelScene.intersectRaycaster(rawRaycaster),forwordDirection=(rawForwardIntersect?rawForwardIntersect.point:rawRaycaster.ray.origin.clone().add(rawRaycaster.ray.direction.clone().normalize().multiplyScalar(3))).clone().sub(groundPosition).normalize();if(forwordDirection.length()===0)return null;let observers=currentObserver.work.observers,accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];if(!observer)return!1;let screen=observer.standingPosition.clone().applyMatrix4(observer.work.transform).project(camera);return Math.abs(screen.z)>1||Math.abs(screen.x)>1||Math.abs(screen.y)>1?!1:observer.loadable||observer.active}),cache=new Map,accessibleIdsOrder=accessibleNodes.slice().sort((a,b)=>{let aObserver=observers[a],aDistance=cache.get(aObserver);aDistance===void 0&&(aDistance=scratchVector3$2.copy(aObserver.standingPosition).applyMatrix4(aObserver.work.transform).distanceTo(groundPosition),cache.set(aObserver,aDistance));let bObserver=observers[b],bDistance=cache.get(bObserver);return bDistance===void 0&&(bDistance=scratchVector3$2.copy(bObserver.standingPosition).applyMatrix4(bObserver.work.transform).distanceTo(groundPosition),cache.set(bObserver,bDistance)),aDistance-bDistance});cache.clear();for(let range of[Math.PI/8,Math.PI/6,Math.PI/4,Math.PI/3])for(let panoIndex of accessibleIdsOrder){let observer=observers[panoIndex];if(observer){let vector=scratchVector3$2.copy(observer.standingPosition).applyMatrix4(observer.work.transform).sub(groundPosition);if(vector&&vector.length()!==0&&forwordDirection.angleTo(vector)<range)return observer}}let screenPosition=null;if(raycaster){let target=raycaster.ray.intersectBox(this.modelScene.boundingBox,scratchVector3$2);target&&(target.project(camera),Math.abs(target.z)<=1&&(screenPosition=target.clone()))}else screenPosition=new three_webgpu.Vector3(0,0,0);if(screenPosition){let accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];if(!observer)return!1;let screen=observer.position.clone().applyMatrix4(observer.work.transform).project(camera);return Math.abs(screen.z)>1||Math.abs(screen.x)>1||Math.abs(screen.y)>1?!1:observer.loadable||observer.active}),cache=new Map,accessibleIdsOrder=accessibleNodes.slice().sort((a,b)=>{let aObserver=observers[a],aDistance=cache.get(aObserver);aDistance===void 0&&(aDistance=scratchVector3$2.copy(aObserver.position).applyMatrix4(aObserver.work.transform).distanceTo(camera.position),cache.set(aObserver,aDistance));let bObserver=observers[b],bDistance=cache.get(bObserver);return bDistance===void 0&&(bDistance=scratchVector3$2.copy(bObserver.position).applyMatrix4(bObserver.work.transform).distanceTo(camera.position),cache.set(bObserver,bDistance)),aDistance-bDistance});cache.clear();for(let panoIndex of accessibleIdsOrder){let observer=observers[panoIndex];if(observer){let target=scratchVector3$2.copy(observer.position).applyMatrix4(observer.work.transform);if(target.project(camera),Math.abs(target.z)>1)continue;if(Math.pow(screenPosition.x-target.x,2)+Math.pow(screenPosition.y-target.y,2)<Math.pow(.4,2))return observer}}}return null}onTapGesture(event){var _a;if(this.userAction=event.userAction,this.stopMomentumMovement(),!this.initAnimationed)return;let raycaster=event.center.raycaster;raycaster.floorIndex=-1;let cameraDirection=this.camera.getDirection(new three_webgpu.Vector3).setY(0),nextObserver=null,currentObserver=this.works.getObserver(this.currentPano);if(!currentObserver)return;let observers=currentObserver.work.observers,accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];return!observer||scratchVector3$2.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(this.camera.position)>this.maxAccessibleDistance?!1:observer.loadable||observer.active}),[intersection]=this.modelScene.intersectRaycaster(raycaster);if(intersection){let[panoIndex,distance]=arrayMin(accessibleNodes,panoIndex=>{let accessibleObserver=observers[panoIndex];return accessibleObserver?scratchVector3$2.copy(accessibleObserver.standingPosition).applyMatrix4(accessibleObserver.work.transform).distanceTo(intersection.point):1/0},!0);typeof panoIndex==`number`&&distance<this.panoTapTriggerRadius&&(nextObserver=(_a=observers[panoIndex])==null?null:_a)}if(nextObserver||(nextObserver=this.getForwardObserverOrNot(this.camera,raycaster)),nextObserver&&nextObserver.panoId===panoStringify(this.currentPano)&&(nextObserver=null),nextObserver&&!this.locationMotion.ended){for(let keyframe of this.locationMotion.keyframes)if(this.panoResourceFromLocationMotionKeyframe(keyframe).panoId===nextObserver.panoId){nextObserver=null;break}}if(!nextObserver)this.emit(`gesture.tap`,event),event.defaultPrevented||this.locationMotion.ended===!0&&this.cameraBounce();else{let options={},rangeAngle=Math.PI/6,skipAngle=Math.PI/12,frontDirection=nextObserver.position.clone().applyMatrix4(nextObserver.work.transform).setY(0).sub(currentObserver.position.clone().applyMatrix4(nextObserver.work.transform).setY(0)).normalize(),leftVectors=[],rightVectors=[],frontVectors=[],observers=nextObserver.work.observers;for(let panoIndex of nextObserver.accessibleNodes){if(nextObserver.panoIndex===panoIndex||panoIndex===this.currentPano.panoIndex&&nextObserver.work.workCode===this.currentPano.workCode)continue;let targetObserver=observers[panoIndex];if(!targetObserver)continue;let targetVector=targetObserver.position.clone().applyMatrix4(targetObserver.work.transform).sub(nextObserver.position.clone().applyMatrix4(nextObserver.work.transform)).setY(0).normalize();frontDirection.angleTo(targetVector)<rangeAngle&&frontVectors.push(targetVector)}let[targetVector]=(frontVectors.length>0?frontVectors:[...leftVectors,...rightVectors]).slice().sort((a,b)=>a.angleTo(frontDirection)-b.angleTo(frontDirection));if(targetVector&&targetVector.angleTo(cameraDirection)>skipAngle&&(options.longitude=Math.atan2(-targetVector.x,-targetVector.z)),this.cameraMotion.value.latitude<-Math.PI/4){let fov=event.state.fov;options.latitude=require_memoryUsage.M(0,require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2))}let state=Object.assign({},event.state);if(state.workCode=nextObserver.work.workCode,state.panoIndex=nextObserver.panoIndex,options.longitude!==void 0&&(state.longitude=options.longitude),options.latitude!==void 0&&(state.latitude=options.latitude),options.fov!==void 0&&(state.fov=options.fov),state.distance=0,state.offset=nextObserver.position.clone(),event.state=state,this.emit(`gesture.tap`,event),!event.defaultPrevented){if(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:event.userAction,options,progress:0,error:null})),nextObserver&&!nextObserver.active){let nextPanoId=panoStringify({panoIndex:nextObserver.panoIndex,workCode:nextObserver.work.workCode}),nextPanoMesh=this.panoMeshes.get(nextPanoId);nextPanoMesh&&(nextPanoMesh.setDisabled(!1),nextPanoMesh.setLoading(!0))}nextObserver&&nextObserver.active&&this.emit(`pano.request`,createEvent(`pano.request`,{userAction:event.userAction,prevPano:this.currentPano,progress:0,state,options,error:null}))}}}},DEG_TO_RAD=Math.PI/180,RAD_TO_DEG=180/Math.PI,MIN_TIMESTEP=.001,MAX_TIMESTEP=1,isIOS=(()=>{let isIOS=typeof navigator<`u`&&/iPad|iPhone|iPod/.test(navigator.platform);return()=>isIOS})(),isSafari=(()=>{let isSafari=typeof navigator<`u`&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);return()=>isSafari})(),isFirefoxAndroid=(()=>{let isFirefoxAndroid=typeof navigator<`u`&&navigator.userAgent.indexOf(`Firefox`)!==-1&&navigator.userAgent.indexOf(`Android`)!==-1;return()=>isFirefoxAndroid})(),getChromeVersion=(()=>{let match=typeof navigator<`u`?navigator.userAgent.match(/.*Chrome\/([0-9]+)/):null,value=match?parseInt(match[1],10):null;return()=>value})(),isChromeWithoutDeviceMotion=(()=>{let value=!1;if(getChromeVersion()===65){let match=typeof navigator<`u`?navigator.userAgent.match(/.*Chrome\/([0-9\.]*)/):null;if(match){let[major,minor,branch,build]=match[1].split(`.`);value=parseInt(branch,10)===3325&&parseInt(build,10)<148}}return()=>value})(),isSafariWithoutDeviceMotion=(()=>{let value=isIOS()&&isSafari()&&typeof navigator<`u`&&navigator.userAgent.indexOf(`13_4`)!==-1;return()=>value})(),isR7=(()=>{let isR7=typeof navigator<`u`&&navigator.userAgent.indexOf(`R7 Build`)!==-1;return()=>isR7})();function isLandscapeMode(){let rtn=typeof window<`u`&&(window.orientation==90||window.orientation==-90);return isR7()?!rtn:rtn}function isTimestampDeltaValid(timestampDeltaS){return!(isNaN(timestampDeltaS)||timestampDeltaS<=MIN_TIMESTEP||timestampDeltaS>MAX_TIMESTEP)}function getQuaternionAngle(quat){return quat.w>1?0:2*Math.acos(quat.w)}var warnOnce=(()=>{let observedWarnings={};return(key,message)=>{observedWarnings[key]===void 0&&(console.warn(`cardboard: `+message),observedWarnings[key]=!0)}})();function getOriginFromUrl(url){let domainIdx,protoSepIdx=url.indexOf(`://`);domainIdx=protoSepIdx===-1?0:protoSepIdx+3;let domainEndIdx=url.indexOf(`/`,domainIdx);return domainEndIdx===-1&&(domainEndIdx=url.length),url.substring(0,domainEndIdx)}function isInsideCrossOriginIFrame(){if(typeof window>`u`||typeof document>`u`)return!1;let isFramed=window.self!==window.top,refOrigin=getOriginFromUrl(document.referrer),thisOrigin=getOriginFromUrl(window.location.href);return isFramed&&refOrigin!==thisOrigin}var updateEyeViewMatrices=(()=>{function mat4_fromRotationTranslation(out,q,v){let x=q?q[0]:0,y=q?q[1]:0,z=q?q[2]:0,w=q?q[3]:1,x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;return out[0]=1-(yy+zz),out[1]=xy+wz,out[2]=xz-wy,out[3]=0,out[4]=xy-wz,out[5]=1-(xx+zz),out[6]=yz+wx,out[7]=0,out[8]=xz+wy,out[9]=yz-wx,out[10]=1-(xx+yy),out[11]=0,out[12]=v?v[0]:0,out[13]=v?v[1]:0,out[14]=v?v[2]:0,out[15]=1,out}function mat4_translate(out,a,v){let x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;return a===out?(out[12]=a[0]*x+a[4]*y+a[8]*z+a[12],out[13]=a[1]*x+a[5]*y+a[9]*z+a[13],out[14]=a[2]*x+a[6]*y+a[10]*z+a[14],out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]):(a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],out[0]=a00,out[1]=a01,out[2]=a02,out[3]=a03,out[4]=a10,out[5]=a11,out[6]=a12,out[7]=a13,out[8]=a20,out[9]=a21,out[10]=a22,out[11]=a23,out[12]=a00*x+a10*y+a20*z+a[12],out[13]=a01*x+a11*y+a21*z+a[13],out[14]=a02*x+a12*y+a22*z+a[14],out[15]=a03*x+a13*y+a23*z+a[15]),out}function mat4_invert(out,a){let a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;return det?(det=1/det,out[0]=(a11*b11-a12*b10+a13*b09)*det,out[1]=(a02*b10-a01*b11-a03*b09)*det,out[2]=(a31*b05-a32*b04+a33*b03)*det,out[3]=(a22*b04-a21*b05-a23*b03)*det,out[4]=(a12*b08-a10*b11-a13*b07)*det,out[5]=(a00*b11-a02*b08+a03*b07)*det,out[6]=(a32*b02-a30*b05-a33*b01)*det,out[7]=(a20*b05-a22*b02+a23*b01)*det,out[8]=(a10*b10-a11*b08+a13*b06)*det,out[9]=(a01*b08-a00*b10-a03*b06)*det,out[10]=(a30*b04-a31*b02+a33*b00)*det,out[11]=(a21*b02-a20*b04-a23*b00)*det,out[12]=(a11*b07-a10*b09-a12*b06)*det,out[13]=(a00*b09-a01*b07+a02*b06)*det,out[14]=(a31*b01-a30*b03-a32*b00)*det,out[15]=(a20*b03-a21*b01+a22*b00)*det,out):null}return(view,orientation,offset)=>{mat4_fromRotationTranslation(view,orientation),offset&&mat4_translate(view,view,offset),mat4_invert(view,view)}})(),SensorSample=class{constructor(sample=new three_webgpu.Vector3,timestampS=0){this.sample=sample,this.timestampS=timestampS}set(sample,timestampS){this.sample=sample,this.timestampS=timestampS}copy(sensorSample){this.set(sensorSample.sample,sensorSample.timestampS)}},ComplementaryFilter=class{constructor(kFilter,isDebug){this.kFilter=kFilter,this.isDebug=isDebug,this.currentAccelMeasurement=new SensorSample,this.currentGyroMeasurement=new SensorSample,this.previousGyroMeasurement=new SensorSample,isIOS()?this.filterQ=new three_webgpu.Quaternion(-1,0,0,1):this.filterQ=new three_webgpu.Quaternion(1,0,0,1),this.previousFilterQ=new three_webgpu.Quaternion,this.previousFilterQ.copy(this.filterQ),this.accelQ=new three_webgpu.Quaternion,this.isOrientationInitialized=!1,this.estimatedGravity=new three_webgpu.Vector3,this.measuredGravity=new three_webgpu.Vector3,this.gyroIntegralQ=new three_webgpu.Quaternion}addAccelMeasurement(vector,timestampS){this.currentAccelMeasurement.set(vector,timestampS)}addGyroMeasurement(vector,timestampS){this.currentGyroMeasurement.set(vector,timestampS),isTimestampDeltaValid(timestampS-this.previousGyroMeasurement.timestampS)&&this.run_(),this.previousGyroMeasurement.copy(this.currentGyroMeasurement)}getOrientation(){return this.filterQ}run_(){if(!this.isOrientationInitialized){this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),this.isOrientationInitialized=!0;return}let deltaT=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,gyroDeltaQ=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,deltaT);this.gyroIntegralQ.multiply(gyroDeltaQ),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(gyroDeltaQ);let invFilterQ=new three_webgpu.Quaternion;invFilterQ.copy(this.filterQ),invFilterQ.invert(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(invFilterQ),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();let deltaQ=new three_webgpu.Quaternion;deltaQ.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),deltaQ.invert(),this.isDebug&&console.log(`Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)`,RAD_TO_DEG*getQuaternionAngle(deltaQ),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));let targetQ=new three_webgpu.Quaternion;targetQ.copy(this.filterQ),targetQ.multiply(deltaQ),this.filterQ.slerp(targetQ,1-this.kFilter),this.previousFilterQ.copy(this.filterQ)}accelToQuaternion_(accel){let normAccel=new three_webgpu.Vector3;normAccel.copy(accel),normAccel.normalize();let quat=new three_webgpu.Quaternion;return quat.setFromUnitVectors(new three_webgpu.Vector3(0,0,-1),normAccel),quat.invert(),quat}gyroToQuaternionDelta_(gyro,dt){let quat=new three_webgpu.Quaternion,axis=new three_webgpu.Vector3;return axis.copy(gyro),axis.normalize(),quat.setFromAxisAngle(axis,gyro.length()*dt),quat}},PosePredictor=class{constructor(predictionTimeS,isDebug){this.predictionTimeS=predictionTimeS,this.isDebug=isDebug,this.previousQ=new three_webgpu.Quaternion,this.previousTimestampS=null,this.deltaQ=new three_webgpu.Quaternion,this.outQ=new three_webgpu.Quaternion}getPrediction(currentQ,gyro,timestampS){if(!this.previousTimestampS)return this.previousQ.copy(currentQ),this.previousTimestampS=timestampS,currentQ;let axis=new three_webgpu.Vector3;axis.copy(gyro),axis.normalize();let angularSpeed=gyro.length();if(angularSpeed<DEG_TO_RAD*20)return this.isDebug&&console.log(`Moving slowly, at %s deg/s: no prediction`,(RAD_TO_DEG*angularSpeed).toFixed(1)),this.outQ.copy(currentQ),this.previousQ.copy(currentQ),this.outQ;let predictAngle=angularSpeed*this.predictionTimeS;return this.deltaQ.setFromAxisAngle(axis,predictAngle),this.outQ.copy(this.previousQ),this.outQ.multiply(this.deltaQ),this.previousQ.copy(currentQ),this.previousTimestampS=timestampS,this.outQ}},Distortion=class{constructor(coefficients){this.coefficients=coefficients}distortInverse(radius){let r0=0,r1=1,dr0=radius-this.distort(r0);for(;Math.abs(r1-r0)>1e-4;){let dr1=radius-this.distort(r1),r2=r1-dr1*((r1-r0)/(dr1-dr0));r0=r1,r1=r2,dr0=dr1}return r1}distort(radius){let r2=radius*radius,ret=0;for(let i=0;i<this.coefficients.length;i++)ret=r2*(ret+this.coefficients[i]);return(ret+1)*radius}},Pose=class{constructor(){this.angularAcceleration=null,this.angularVelocity=null,this.linearAcceleration=null,this.linearVelocity=null,this.orientation=null,this.position=null}},FieldOfView=class{constructor(){this.leftDegrees=0,this.rightDegrees=0,this.upDegrees=0,this.downDegrees=0}},Sensor=class{constructor(kFilter,predictionTime,yawOnly,isDebug){this.viewer={id:`CardboardV1`,label:`Cardboard I/O 2014`,fov:40,interLensDistance:.06,baselineLensDistance:.035,screenLensDistance:.042,distortionCoefficients:[.441,.156],inverseCoefficients:[-.4410035,.42756155,-.4804439,.5460139,-.58821183,.5733938,-.48303202,.33299083,-.17573841,.0651772,-.01488963,.001559834]},this.device={widthMeters:.11,heightMeters:.062,bevelMeters:.004},this.depthNear=.01,this.depthFar=1e4,this.yawOnly=yawOnly,this.accelerometer=new three_webgpu.Vector3,this.gyroscope=new three_webgpu.Vector3,this.filter=new ComplementaryFilter(kFilter,isDebug),this.posePredictor=new PosePredictor(predictionTime,isDebug),this.isFirefoxAndroid=isFirefoxAndroid(),this.isIOS=isIOS();let chromeVersion=getChromeVersion();this.isDeviceMotionInRadians=!this.isIOS&&chromeVersion!==null&&chromeVersion<66,this.isWithoutDeviceMotion=isChromeWithoutDeviceMotion()||isSafariWithoutDeviceMotion(),this.filterToWorldQ=new three_webgpu.Quaternion,isIOS()?this.filterToWorldQ.setFromAxisAngle(new three_webgpu.Vector3(1,0,0),Math.PI/2):this.filterToWorldQ.setFromAxisAngle(new three_webgpu.Vector3(1,0,0),-Math.PI/2),this.inverseWorldToScreenQ=new three_webgpu.Quaternion,this.worldToScreenQ=new three_webgpu.Quaternion,this.originalPoseAdjustQ=new three_webgpu.Quaternion;let angle=typeof window<`u`?-window.orientation*Math.PI/180:0;this.originalPoseAdjustQ.setFromAxisAngle(new three_webgpu.Vector3(0,0,1),angle),this.setScreenTransform_(),isLandscapeMode()&&this.filterToWorldQ.multiply(this.inverseWorldToScreenQ),this.resetQ=new three_webgpu.Quaternion,this.orientationOut_=new Float32Array(4),this.previousTimestampS=Date.now()}getPosition(){return null}getOrientation(){let orientation;if(this.isWithoutDeviceMotion&&this._deviceOrientationQ){this.deviceOrientationFixQ=this.deviceOrientationFixQ||(function(){let z=new three_webgpu.Quaternion().setFromAxisAngle(new three_webgpu.Vector3(0,0,-1),0),y=new three_webgpu.Quaternion;return typeof window<`u`&&window.orientation===-90?y.setFromAxisAngle(new three_webgpu.Vector3(0,1,0),Math.PI/-2):y.setFromAxisAngle(new three_webgpu.Vector3(0,1,0),Math.PI/2),z.multiply(y)})(),this.deviceOrientationFilterToWorldQ=this.deviceOrientationFilterToWorldQ||(function(){let q=new three_webgpu.Quaternion;return q.setFromAxisAngle(new three_webgpu.Vector3(1,0,0),-Math.PI/2),q})(),orientation=this._deviceOrientationQ;let out=new three_webgpu.Quaternion;return out.copy(orientation),out.multiply(this.deviceOrientationFilterToWorldQ),out.multiply(this.resetQ),out.multiply(this.worldToScreenQ),out.multiplyQuaternions(this.deviceOrientationFixQ,out),this.yawOnly&&(out.x=0,out.z=0,out.normalize()),this.orientationOut_[0]=out.x,this.orientationOut_[1]=out.y,this.orientationOut_[2]=out.z,this.orientationOut_[3]=out.w,this.orientationOut_}else{let filterOrientation=this.filter.getOrientation();orientation=this.posePredictor.getPrediction(filterOrientation,this.gyroscope,this.previousTimestampS)}let out=new three_webgpu.Quaternion;return out.copy(this.filterToWorldQ),out.multiply(this.resetQ),out.multiply(orientation),out.multiply(this.worldToScreenQ),this.yawOnly&&(out.x=0,out.z=0,out.normalize()),this.orientationOut_[0]=out.x,this.orientationOut_[1]=out.y,this.orientationOut_[2]=out.z,this.orientationOut_[3]=out.w,this.orientationOut_}getPose(){let pose=new Pose;return pose.orientation=this.getOrientation(),pose}resetPose(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)}getFrameData(frameData){let orientation=this.getOrientation(),eyeOffsets=this.getEyeOffset(),projection=this.getEyeProjectionMatrix();return frameData.pose.angularAcceleration=null,frameData.pose.angularVelocity=null,frameData.pose.linearAcceleration=null,frameData.pose.linearVelocity=null,frameData.pose.orientation=orientation,frameData.pose.position=null,frameData.timestamp=this.previousTimestampS,frameData.leftProjectionMatrix.set(projection.left),frameData.rightProjectionMatrix.set(projection.right),updateEyeViewMatrices(frameData.leftViewMatrix,orientation,eyeOffsets.left),updateEyeViewMatrices(frameData.rightViewMatrix,orientation,eyeOffsets.right),frameData}start(){if(typeof window>`u`)return()=>{};let onDeviceMotionCallback_=this.onDeviceMotion_.bind(this),onOrientationChangeCallback_=this.onOrientationChange_.bind(this),onMessageCallback_=this.onMessage_.bind(this),onDeviceOrientationCallback_=this.onDeviceOrientation_.bind(this);return isIOS()&&isInsideCrossOriginIFrame()&&window.addEventListener(`message`,onMessageCallback_),window.addEventListener(`orientationchange`,onOrientationChangeCallback_),this.isWithoutDeviceMotion?window.addEventListener(`deviceorientation`,onDeviceOrientationCallback_):window.addEventListener(`devicemotion`,onDeviceMotionCallback_),()=>{window.removeEventListener(`devicemotion`,onDeviceMotionCallback_),window.removeEventListener(`deviceorientation`,onOrientationChangeCallback_),window.removeEventListener(`orientationchange`,onOrientationChangeCallback_),window.removeEventListener(`message`,onMessageCallback_)}}getEyeOffset(){return{left:[-this.viewer.interLensDistance*.5,0,0],right:[this.viewer.interLensDistance*.5,0,0]}}getEyeProjectionMatrix(){let fieldOfView=this.getEyeFieldOfView(),near=this.depthNear,far=this.depthFar,result={left:[],right:[]};{let upTan=fieldOfView.left.upDegrees*DEG_TO_RAD,downTan=fieldOfView.left.downDegrees*DEG_TO_RAD,leftTan=fieldOfView.left.leftDegrees*DEG_TO_RAD,rightTan=fieldOfView.left.rightDegrees*DEG_TO_RAD,xScale=2/(leftTan+rightTan),yScale=2/(upTan+downTan);result.left[0]=xScale,result.left[1]=0,result.left[2]=0,result.left[3]=0,result.left[4]=0,result.left[5]=yScale,result.left[6]=0,result.left[7]=0,result.left[8]=-((leftTan-rightTan)*xScale*.5),result.left[9]=(upTan-downTan)*yScale*.5,result.left[10]=far/(near-far),result.left[11]=-1,result.left[12]=0,result.left[13]=0,result.left[14]=far*near/(near-far),result.left[15]=0}{let upTan=fieldOfView.right.upDegrees*DEG_TO_RAD,downTan=fieldOfView.right.downDegrees*DEG_TO_RAD,leftTan=fieldOfView.right.leftDegrees*DEG_TO_RAD,rightTan=fieldOfView.right.rightDegrees*DEG_TO_RAD,xScale=2/(leftTan+rightTan),yScale=2/(upTan+downTan);result.right[0]=xScale,result.right[1]=0,result.right[2]=0,result.right[3]=0,result.right[4]=0,result.right[5]=yScale,result.right[6]=0,result.right[7]=0,result.right[8]=-((leftTan-rightTan)*xScale*.5),result.right[9]=(upTan-downTan)*yScale*.5,result.right[10]=far/(near-far),result.right[11]=-1,result.right[12]=0,result.right[13]=0,result.right[14]=far*near/(near-far),result.right[15]=0}return result}getEyeFieldOfView(){let viewer=this.viewer,device=this.device,distortion=new Distortion(viewer.distortionCoefficients),eyeToScreenDistance=viewer.screenLensDistance,outerDist=(device.widthMeters-viewer.interLensDistance)/2,innerDist=viewer.interLensDistance/2,bottomDist=viewer.baselineLensDistance-device.bevelMeters,topDist=device.heightMeters-bottomDist,outerAngle=RAD_TO_DEG*Math.atan(distortion.distort(outerDist/eyeToScreenDistance)),innerAngle=RAD_TO_DEG*Math.atan(distortion.distort(innerDist/eyeToScreenDistance)),bottomAngle=RAD_TO_DEG*Math.atan(distortion.distort(bottomDist/eyeToScreenDistance)),topAngle=RAD_TO_DEG*Math.atan(distortion.distort(topDist/eyeToScreenDistance)),left=new FieldOfView,right=new FieldOfView;return left.leftDegrees=Math.min(outerAngle,viewer.fov),left.rightDegrees=Math.min(innerAngle,viewer.fov),left.downDegrees=Math.min(bottomAngle,viewer.fov),left.upDegrees=Math.min(topAngle,viewer.fov),right.leftDegrees=left.rightDegrees,right.rightDegrees=left.leftDegrees,right.upDegrees=left.upDegrees,right.downDegrees=left.downDegrees,{left,right}}onDeviceOrientation_(event){this._deviceOrientationQ=this._deviceOrientationQ||new three_webgpu.Quaternion;let{alpha,beta,gamma}=event;alpha=(alpha||0)*Math.PI/180,beta=(beta||0)*Math.PI/180,gamma=(gamma||0)*Math.PI/180,this._deviceOrientationQ.setFromEuler(new three_webgpu.Euler(alpha,beta,-gamma,`YXZ`))}onDeviceMotion_(deviceMotion){this.updateDeviceMotion_(deviceMotion)}updateDeviceMotion_(deviceMotion){let accGravity=deviceMotion.accelerationIncludingGravity,rotRate=deviceMotion.rotationRate,timestampS=deviceMotion.timeStamp/1e3,deltaS=timestampS-this.previousTimestampS;if(deltaS<0){warnOnce(`fusion-pose-sensor:invalid:non-monotonic`,`Invalid timestamps detected: non-monotonic timestamp from devicemotion`),this.previousTimestampS=timestampS;return}else if(deltaS<=MIN_TIMESTEP||deltaS>MAX_TIMESTEP){warnOnce(`fusion-pose-sensor:invalid:outside-threshold`,`Invalid timestamps detected: Timestamp from devicemotion outside expected range.`),this.previousTimestampS=timestampS;return}accGravity&&(this.accelerometer.set(-accGravity.x,-accGravity.y,-accGravity.z),rotRate&&(isR7()?this.gyroscope.set(-rotRate.beta,rotRate.alpha,rotRate.gamma):this.gyroscope.set(rotRate.alpha,rotRate.beta,rotRate.gamma),this.isDeviceMotionInRadians||this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addGyroMeasurement(this.gyroscope,timestampS)),this.filter.addAccelMeasurement(this.accelerometer,timestampS)),this.previousTimestampS=timestampS}onOrientationChange_(){this.setScreenTransform_()}onMessage_(event){let message=event.data;!message||!message.type||message.type.toLowerCase()===`devicemotion`&&this.updateDeviceMotion_(message.deviceMotionEvent)}setScreenTransform_(){switch(this.worldToScreenQ.set(0,0,0,1),typeof window<`u`?window.orientation:0){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new three_webgpu.Vector3(0,0,1),-Math.PI/2);break;case-90:this.worldToScreenQ.setFromAxisAngle(new three_webgpu.Vector3(0,0,1),Math.PI/2);break;case 180:break}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.invert()}},defaultLeftBounds=[0,0,.5,1],defaultRightBounds=[.5,0,.5,1],Cardboard=class{constructor(renderer){this.renderer=renderer,this.sensor=new Sensor(.98,.04,!1,!1),this.scale=1,this.cameraL=new three_webgpu.PerspectiveCamera,this.cameraR=new three_webgpu.PerspectiveCamera;let stopSensor=this.sensor.start();this.dispose=()=>{let size=this.renderer.getSize(new three_webgpu.Vector2);this.renderer.setScissor(0,0,size.width,size.height),this.renderer.setViewport(0,0,size.width,size.height),this.renderer.setScissorTest(!1),stopSensor()}}render(scene,camera){let size=this.renderer.getSize(new three_webgpu.Vector2);if(size.width>size.height){var autoUpdate=scene.matrixWorldAutoUpdate;autoUpdate&&(scene.updateMatrixWorld(),scene.matrixWorldAutoUpdate=!1);let renderRectL={x:Math.round(size.width*defaultLeftBounds[0]),y:Math.round(size.height*defaultLeftBounds[1]),width:Math.round(size.width*defaultLeftBounds[2]),height:Math.round(size.height*defaultLeftBounds[3])},renderRectR={x:Math.round(size.width*defaultRightBounds[0]),y:Math.round(size.height*defaultRightBounds[1]),width:Math.round(size.width*defaultRightBounds[2]),height:Math.round(size.height*defaultRightBounds[3])};this.renderer.setScissorTest(!0),this.renderer.autoClear&&this.renderer.clear(),camera.parent===null&&camera.updateMatrixWorld(),camera.matrixWorld.decompose(this.cameraL.position,this.cameraL.quaternion,this.cameraL.scale),camera.matrixWorld.decompose(this.cameraR.position,this.cameraR.quaternion,this.cameraR.scale);let eyeOffsets=this.sensor.getEyeOffset();this.cameraL.translateOnAxis(new three_webgpu.Vector3().fromArray(eyeOffsets.left),this.scale),this.cameraR.translateOnAxis(new three_webgpu.Vector3().fromArray(eyeOffsets.right),this.scale);let projections=this.sensor.getEyeProjectionMatrix();this.cameraL.projectionMatrix.fromArray(projections.left),this.cameraR.projectionMatrix.fromArray(projections.right),this.renderer.setViewport(renderRectL.x,renderRectL.y,renderRectL.width,renderRectL.height),this.renderer.setScissor(renderRectL.x,renderRectL.y,renderRectL.width,renderRectL.height),this.renderer.render(scene,this.cameraL),this.renderer.setViewport(renderRectR.x,renderRectR.y,renderRectR.width,renderRectR.height),this.renderer.setScissor(renderRectR.x,renderRectR.y,renderRectR.width,renderRectR.height),this.renderer.render(scene,this.cameraR),this.renderer.setViewport(0,0,size.width,size.height),this.renderer.setScissor(0,0,size.width,size.height),this.renderer.setScissorTest(!1),autoUpdate&&(scene.matrixWorldAutoUpdate=!0)}else this.renderer.render(scene,camera)}dispose(){}},cardboard_png_data_url_default=`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAADqCAMAAAAvZYhaAAAC/VBMVEUAAAD///99fX37+/v5+fn29vbx8fHv7+/Nzc3o6Ojq6urh4eHU1NTR0dGDg4Pl5eWSkpLHx8fj4+Pe3t7X19fAwMDZ2dnCwsKrq6uioqLb29uNjY2enp67u7t5eXmAgIC2traWlpa5ubnKysqmpqZycnKHh4eurq6ysrKKioqDg4Pd3d12dnb9/f1vb2/s7OxlZWXz8/OoqKiZmZlpaWmbm5teXl7W1tbJycnExMRiYmJsbGywsLCPj49aWlq9vb1UVFRYWFhra2t+fn7t7e1RUVFOTk6Dg4OAgICCgoKKioqEhISIiIhqamqCgoKIiIiQkJCIiIiWlpawsLBmZmaAgICenp6Li4uBgYGTk5OMjIyVlZWFhYWCgoKvr6+Ojo59fX2SkpKvr6+Ojo6QkJCurq6BgYGxsbF8fHx4eHitra2enp6srKyJiYmurq54eHj5+fl+fn57e3v////5+fnS0tLAwMCVlZWwsLCurq5QUFCtra2EhISUlJSwsLCUlJSUlJSlpaWVlZW3t7diYmLAwMCFhYV3d3f///+tra3///9XV1eampqnp6d8fHz///////9VVVVlZWVtbW3+/v5SUlKcnJytra28vLzGxsbR0dHX19doaGiWlpafn5/Hx8ezs7Nzc3Nubm7AwMCIiIjj4+NTU1P29vZbW1vl5eVkZGTMzMxYWFjq6upfX1/k5OT////4+PjV1dWkpKRoaGj4+Pizs7Pm5ubAwMCfn5+vr6+urq4wMDCxsbG2tra5ubliYmIuLi6zs7NHR0empqY0NDRCQkKqqqo5OTmoqKg7OztfX19dXV1oaGikpKRkZGStra0hISE/Pz89PT0pKSlmZmZJSUlERERbW1s2NjZVVVUmJia7u7uEhIRXV1dZWVlLS0tOTk6srKxqamojIyNTU1MrKyuAgICCgoJRUVFra2ttbW13d3dxcXFvb299fX1zc3N2dnZ5eXl8fHyHh4eSkpKenp6Ojo6VlZWMjIyYmJihoaGcnJyJiYmamprZ2YdEAAAAunRSTlMAs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7P9s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz+QSzswb9DiH3FyI57Jn1ajgu7uHYmIgr8OHHwqVOQybv6OZuUvTt3dHPrIeFSNVgLCAWD9/UqKebiH1iXVTczcvKvambhnBuY/vGrKqjlHlzVDj37s/Fw7+tpJGAeN7VzcWTgGJNQ8O9u7iko5aVjvbNsa+so1pd3mNGAAAqAElEQVR42uzZzWvTYBwH8DxNmvRlfVNr17Wl05a9dISyiugO4qVQ2g1pVyx2Q7QKCoIivgxF1HnTXbbDDnNDJ8iQHcQX8O3We1t6GnjJyYPSuTmdf4C/ZE260U5rl6bJ2g8Pu2zP5cvz++ZJhilOcOxcfPHq/NuFhVcftK8WXizeCGItFWKKX5x/23Zk3/6OPr1+j0mr1fkpkuxXv5luBbbZWPzevEWjMRja2iCrvXs3stJRFGRFEDhOT1xv5QWCkYvPPtosFg+XFZyrvSYdRUJEBA4Igg2LRuBhk+cVOndv3uWyWm0DlqMajWafXkcSNNrexA2sSQ1dvPK+86DruNUGWRn6dGoa/dvk9BjWbMLxZ7e7e3ogK5fVZtBTOKrew6Y6Xufu3Qm0d3f3dEJWGj1Fo/81dbU52isUf2T3etvZrHoG9vtxVKOJm9guF049ddrt3gBkdVCzh0DlWtO4YejT00OHnU44VwHXPgqJ4PV1bFeKDD8xH4Cs7PaAtY9AYpncfeUFSR0zc1l5B/Q4EhW9q+KCpHodXFYBjxZxWnFtk9SZrl4uK6/Hj+pmWvlxDQ2fMRq7eh0OSIpCW7Ti2iJ8/4zK7WazcloqJtUaxqLweFSl4rI6ZNOhylpxsUKpqFsF3EazS4ukNLmIKcuJpFHF6erUI8lNKeiaGrl7WcUxtu+nUUO8VsZLEDz8VBy33YCjxnko+1dsrtI5hz1q1GATcm76YCrpVnHMVgrJgWwfjCN3u1Sc3k4TkgtZNv3QcLHS3Wyly4ncqis8/qSYlFNDINl5IZ9ZDKaifFHZSCRLkzKZxZEkX1QHtUi+ZDCLQlEZ2/uQzDX2c0T4vjzuntWaatiVPiQU1YEBoahoRMNCNRBzv9zuqCNJo1BUdGU4jcOiqyDhfgmLvryoOnClkfRwhcehqDh2A4ErkGTNBa9+paLClUqSK2rkrnCjMhFK9mYMqy+4Jwhf8wjlIWcvjcYGGYbxxUZvmd6V93w9XmicHpJQmD0zifM+ZovYzFWsjMifiB0urVpRyMeJmI+pyBnCxBcaF8avQ60kL58nYkyJ78f3leUvXwqrP9e/MqzBCCaykWRp/NTKQT0fHfzN8L79WlteSm9S+MUdt2t16XR4+vVXTd2vhtVfRrL9cw9ijGB9rZDOgPRm+XxunQGnRD9Ubm8bqRgvZ0Z9woFaX81lNqQzW7MCKwy4IE5T8YfKbNWRSmG6FCtN3upSNpspKosKLBXY6jorxuPPyF+pSKWYezDIFP1YyWXYpLJlSeWFqNi0fFD7O235VFTFOWbVUjUiKRIWBaTZP5vgk/r2vZDOgkylAczD4tMCy5DW6R2V+vBlvqkohZhN8DX1dY09UkJW5b0uJMXJ/dzRIEaKpe5wmShlmEv4hOHLf84WlU8gEKLi5Zagtk5itTkR5f/trvNvj/JTsKr4Xf3366GnhKSy2WJWmZJKpypfDCoHVmHriZpu6hvzZ+zu0HH8kBj8+KvKfyfN/j/UnclvG1UcxxGnhGxKaVIIioBEosi9gVAaCSkHkFhFgAOrBEIgDixCnOAAAgmVG1cEZ7jxHzi2YzvYcWyP3cRNY6e1J2sdJ7bjbLXTLOL73rzFz88TGqip+cyLZ+kMJB++v988jwN0fSJMFb1JIFxxXXq3kq4wCIjWw/+gVT3G6+++/wOtP7wmMuUVooASqtmNQim/6djd36tUyuX9o930WnZrXagCJdwQnz3lc+JvrVb16MXW+/4P/PaRg3X0AstUUm1WRil7VIn5xzkeD74EU4fl3c0CVC0bG/iLvHi6rs7vf60ncR9E4kXbVvcbf724+a2VZpMUdCuhysgfHS5xR1KVR+dyZQdvrNdOdT9851X+IWnr/wDR0h15I2kmuSwK8eQetwG+dGP+4200rW9Oq+r8/a3NT9cPH/K3x+tRSJKx8haObvqvXx8fx8CLrokOLBp/7q69daq5An5BtrWL0trVitHFkcea4M9/FY2qGBGhQreKFNI3x68TdFXSGIaO3+P3e6a+vK1Uvc+ev7R1NT1i7pktxU3AVEU2HIee64JxDCy1lrgqrBVV3Ne7r/ztZMFq6w+NtHWdUeg604Vhu62f2/Dr277m8wQ0KqkqvnkMUSo2uWKFWKvKTxaMy1+c7Oq7Tuu9ctuZZucX/mnD5kbUpCSBkT6AG00VXNkJ0/BzYeCxk2L1Ki3AnjNtZzDaFGqPnXROw6//46vnHWmHNaMyhari/iS86EAThgYNVd0ZBM0V5U37mdXnZF51/kJbc9Mr5wmzTJSZjG7tuXVTateyK0U9WXR1oq0PHiaz9fa25kY0qp31ZIaHKn8LEYEOLDpSVI0w2dv5SvoS/F5/wkBcPYH/Is791WC3DcNuXz+3oddXzxMyXFUBmQJWZ1Kxb1oeeVPUVPF82dt6Ea4e7r+/iRnCPIG6Wit5M1zV+v6YNMDE6NiUIPmqh99aGPrs9OXH4GoY39KF+y9o4KB+XD8HNOz6vs9ek40qg4Vg7E5JUdZig83NUE7h9ZuhYLJ2vvUs6e0DfVVc6LtAwErsY9gepzTs+l8/WuPzhCQyRWPlzR6M12Bri/4Rhh6setGCKMXWz8/VzK/g6nxfczLE737ZQiQDiKpoibZ0NVeQYhcs20Kki4rfGsQY0G+JL6BhPdnX19vXS8BKbst9sVaQ5zTm+h9G0w5HGsvWbIZhzh45x+tio4pmyq4SdagqDI7br3zq+jYaVktv8/HHG8+z8ltPilBt36Sh0pNFZdzmNMvjnIzdPK5Ubh0fHsRik6oq4Fei9XP1nRBF+EDvWYXes70YyrZyTDt+56/HM2KaKtz95rkqY99pdWUdmyJURTljt/Y3C7ORqMB6ompsrZUP3doMntMpZX2L5zHtZ5uLDv5AYdswM4zk9oEw5dFUKcL0jjVWLpq5mXDIlUpM5PhDeWEMzkwzshlTmrxUNiUeMj/XiWCdBUNnhwTYwbDbVtaUO3s9OhXBkS1G55Eqind3TE636+pi9aZNGpbKxZxrenpl5Uo4HE75XC5XYC4TEb4iUpdZONBuh8DtFj3+A9Kx2sFQ+xAFGwLsYNhuC+7g9QiV1dS3Z2GKsVHxezgyWZov7Z4Y21kNTFNWgA+2Ai5CYAKf9AhhEalrR86zJO7Jl5msV3ErbG8aLrFnL1aosJD624kJUWypmyzZ6qm0qWwGgWKsEK4FwuGQJcsVMr0WoiKT1FaexkpNlt/dyaoQ84aB9uag47OXECmwbWTmCRkQP3J6JGp71xsXS9ZSOpqaBqqra1dC4USKuAKpjBdIXyRcNFtIFhC+3BjuGHsHTaqwg9De0Y5B14BuA2Xf7pw7cv2ljzBTgKxsKQJPzJWxJ+pP6lKipfs63JiBH10VcKEQ4YqSMr0CIouHa1/t7sgVhvUW8XU8Re5oAj57ic+pTOqJpqp4rImCKm5Kr0Ow5w1M18JcXQGkxwcYoSj9CF+my7KVPKhtWRjv8pb1YMfd5hKefZJUkTkVsGSZedGqVF+gfo937mZuMD+aKyaLdC3mKhWYicOVECYaVxx2PGq03JdfILLQsh7p6GjpaMGgawX1mN05//L6H0bp3S+dRagY6OrZSevGpCCCpatypxeuTduoYrkCrnAiHOC2Urk4gCvFlmkeacGy6vBlTN+7tR+QLjp25/2b61s+hSaSqq34vMBSRVuHrqtez/KXvSGIsXXFZd24weswRUC0KN64Yis6SaIlVRE+svp7Z8vdA/VnzRQ2kqurMlVrl627Ud0iBDVPPPeMYDi1cmKs4MqSFbLqMEUJRfHLRlXhYm3edCjJosKW8Hs13+PznJa7xXujaTpVwPSzSlXUAVUED1noi16JUtgtIxGGAKUEtdbOVIFAOBGCKiZrdRayLF1xflckn9M6FVtu0rbwbxN8jF/Uxrc92DKIYa0BVicfA+r26a8f/PQlqwC3IsSU7FVjXBXXpCNq8KAQ9LlCiitNFZCufIFEIsxzFQpdhSyqS9qihVjmomSLf4w+nnlq8C7QjfojqcpumKsyVfPm9pRf4lGalpYsZ3bB5fP5UgjWFRtXTJV05XNBFhEFVSA4q9mihVjA31h44k2LzhwGL14cvDhIwQaGsmaIff3c019/CQ+KHaz+qmNViklR9Lu1D5anEgn4XD7MMOHKZ+NKVQWxVFYCrhhhwzCYL2JLFuJYdRVSZQf33PMjHjngB+m+2E3BBoayBnxbX1NOe/17L1lPP0uov2pXxZt+BXE71J1NbgXhicpCEQbsVNWXNROStuIGELbkLbGi1iDwv0hldf+nkFYFWdmiSU0J4hV62wF/27PKpgv4YApFWL9haaq4K9fMTDAk8RrSFtNFu9amlMV9fUxkne/+7xjGVJ2kKrucWaWIiVXayfKu2tJ9TRUSSBRVhVdShDdOaFcM6coVDEpZ4VDUkLZEISJa62qwAKalnUTWMKV7uJuCDQxlDcS2ft5tX49WRVOFVqWqyuSnSNAxavDU+tozXdQUf4GrgH2srimqAFpclSxcnDQseLJ414q6hS0erd+JrMeH8X/UODeMcQ7IbbwAbVs/9zavHxh1ULZYq5IlaBy6qStVkx6tpe0gc4SBxSrCldtrV8AFAnNzc0wVkWUajNpoxVgFimjhcenDkHXuv+C9Uev9XzGphAqYu043hf9TlCgzh0NvgBcfXuiPXq8IV6avKa5uSFeE1NzcBI8VMJeXZbRmq6J1LBoW84UHD/fiffS5xvMTujppVeu8VUlbxZjbggdeLUEmy7+f8wFY4g2LBStVq2paUwVXMlihiYk5pgokMsvVtiCLt/g9tWWBnyFLJKvnXI8CDgiwg6GstXPsr/8UXR1kDThSSzATKbsFfvqlNS1weTtIJbHyoyvW3a+oroDqSlUVCIQhK8xVJSALCFmA1+GuejMEB1RWT2NhqnbisKS6ymQKU+5q1Dr0sNeYEWB5wop90X1tiqXfBVVXYObq1SBTJWQpXYvJyrJYyWjFGi5rBKpIr8p7V3PClZgv7ON7cApRdBG3RA+rxMOIiyCDhQFEsPRYAZtYgbmFhSCPFZivKwu2xERL6Joisp7uGRnpGenBoGsNebz+OSP214+QaRVk5SM57mpeulqOOYFbhaqSuioZmiQ2A1WGOndHt1Jc6d3K4ipkcVdqstRZ/DYVVc0SldU/Iugf6SdgpW4DrPTj9Jjd9f3szXIpmsvxUMkKNNc0VVrHKi8SR0wTT5XQhh9Zzt0VVbauUqGFxcUZ4WpmBrJAtay41eHzRJXa4oms8/2NgfWqUjIHVxzhKnqLqHLSFylLMVZegBjpCJvKfgrBkqki6K5UVZCVWFxcJKY0WUDp8HnpqfGyfnrGAdYKJlelPF7IrP/ppKI0xORhfwFCmCTmSN1nHcv+LsiQrvBoZm5x8SoTBVVclt60aLKsRZU1MDDQP9CPQdcCdV85DsQ1QL9+YDRNVBUzMCVKcFW62hyzTPFcqdECe0QVF0M3a/fJ5zQiVnbtClTFCiws5ia4KhA8QRa+Dz1ZDwzccf6i7Wx60zjCON5PEPVoq5WcRFGd+ugoN/fUSy9VT1UPTXuu1EPVr5B7T/02wAG0ZrFZMAjMshCVBRziXTCOncR2Xtqq/3nZfXZmdrdJtf15CsYiCvzyf56dmd3iH3msLv2kqvGCTnK9KcVAmNbfMf4e8xSRoor5GO29JlTlzq5UV028Ipu5EtiZyXIuKVP/r6zfWLd6Xg0ByQLUrqQo9mXqetep14D0wi3pj6m9K0dBmlw909uV2Ege4gUlVNm2nyWL9aw0Wbfv3r199zbGXUDfp9wDeh491v78Y97XF0qzwojOMw+OSgQKUWtZjXUfnVtEiVbNxuO6WOlAFLnKjFW86T5bLKZwJbFJljF3OIMqNihgJSGrWH5m3aoNU2Zj5639sKzI0nS9rD05aMJWnCQxKtpjUYVP02IFjKOgPD/Rx2sZkqocWa0zocpMVqH8FmAV2AoBqUq4Om+UFNQavOohLMzWQSV70hBPsqAqyxWeRLKEKWAh4mRKkaVPtDLLUHD/9n2M24T2c/qe7s3nRa7SGju46JZLZUOXFHbYEoUlL9GrKY7Ux/xYCFm5rurkittqLsaTKalieFClL6VlsjRKvAx37xcJjoNBNX2+AC5MVRiSPyrRKeQabFWAsn9Fj8EIT8ieiFY4SgWC5hCvwOaNPcbPkZWWrHtFuvpmJ4CrDFVwBUoYiitRi0dh4nQ7XByY+1fyMQOV+kw7h0qySBXVIGiGvh+qroZZyXLMZCmy9u7vcfANBr+X0GP6efpzfsZc9DyUpqgCJes5c0XZSs61dmqRKsCjpe9fyccCrO6eGCcGZQkKDFVN2/d9y04wHJIshiJLC1ZJytrb3t7b3vtg8Icw6J6BCdbzlKOgYNngwUrT1ZioV+ixHj8y9q8SJpC8FFdKCequmgvf8xVVubIUU/yGy9ouir3vMGtwVFOTCL+zXxaUjGRd1bUp03EFNvT9q0pEnbWskdKujlNjBejkxNBrtdzYFFylyBpklWFJytrcLoyvsHI25wsc33kHT13Zs9Sp1sUTc+9O1GEtMRLUR81+XTw5P1cHUhbfbve8ieLKlAXSZfHGymVtbCtsbG9g0L3AfGz+DMEKfNnYSRTwJ773ttyFKoZWhQ3e2RVXgO3sqftXMlR1puKg368oqgD5NHIF+pbXclxhKlZlWSmyqjkNHrKKAh1rrbgax678V1DVFclS29b1QeqqhS1nlKkoIBXNvl0zF86mKnLV8x1nbAukKbh6H1liBQuKlLX9eCc4pQv4FFX+ZVfUoJGtmxq19mRd8aZF+1cUKw7WdzWtBOk5HM1Vf4rFsStFkSur9T6yMNh/hSbr252dM2VuRa46h10AX1HTinj+xFBFsmj/KqIuwVTpmXJunlzRslkg9pDtllMdQ5USq3xZpCqRrE83dnc3djc4+AaD7kH69wT9mdOdYBD3dYnP8f7sCihYGGBtlqA0wGdaVIEUKw7e8zN1O4ZUyRIckSowgQDLpmYVkS+LhGEIWbvF8BjtfUKqkrL+mHNT+Ooq04e2VoLJsEhZZqwAzsGTLHPdzKBYgV4IAaGq6v2TVRIjlnVv9x5Gjgl6jvaYvkcVXgpVlCvBct6VtqJgiduqkiutXeNd1pOx4pAsqyYTyEjaVEtQbLdbeP9eXIGEazm5sshXXIb3igHHQlmFZIrjXXNXZYzIF6/DTnasuKxePVYFyBR84B3XUtqV2q+aUa7sFvZdrKEkocp1nZx5FonCbbGyNoOdoJUswUiVFyBYXJc6e1iqsyv9hHu/J2XVKVjSBpdVORbdioJl5Eqe7uotOp3BLBJFuMD51+VOKRL2n2Vt3tvEUH6EiUMwmcSpIledxnwOVaIQqRQv8nIFcMCrU2OnVAlZrjtiz8xuVwhVJGsKV75ZgS6YVvNk0RwrTtbDzQ8GogweYeJAswVy5b2BK6ji0Gzr1VNylXrdmU2yDFcHtus2a0oJGjPROFduZzCoWqqpmGr+Fk0JQ/giWUXwbbBzThUo8ECbu5pryXp7DFV5ripox5DFRgx1JHs6tckVSHfVA1Zn0B5MaWYF3FjXtJMnq0TJKlgWtkjbhilwI13FTYuxX08/DJKrOt4bTOnNSuro4cQyyapndHaosodVaAgVVZIpY5CzU0ozB5L1oBhZ2HHoKK6EreW8MQdQlZg/dMOnubkCIws9XK9AmmvikgW2GMpy1U+6OlkYzQqqhCxypcsSoZKmSNanRbDJtrLiXuVhCP5qxLLk/AGyXuS2q/hyxmSqaFrOmYZhP32PoZl0ZTvtk5NxiirhajY7yT4VBleA6yJZdwqR9SAIdjytBoFzCFGNuAzn3NWfx6kLHEVW33JtowRJlhWGrrp1BVRXYIj+vfRJFfUqwSxUZAE6yQpV0XGwcFmPg+DUFyQ/sveMqeLQEXHeI1dmu5IGcLzrGc2KsLETNKKjIKkiV7ZtdZbLZUtLFUxJUMqTrAk8ZJGqFFkPP32I8Z9l4XShVoEtjLeNhm6rfGLmSnMFrOm0KVxpoZJOwvHYUkrQdDVtL5erhCuJNDWdAT9TVkbPuvOwCLBL+tIHpIoFq81UUYfnvM09CkpXB3g/IzVWZIpJGWKtcJCUSapkv1qcLFcrzyhAyhXIWhqKnhVDsj5+8GFaHjx8gKF//10QvFRccU4bgFciNflQqCJZhivQw9shVXqsQD/0/YXZregw6EDVapKnCnSMCTzJolApsooAyXohRZErVOG8S1XIm/zrfzkMCqzZbGi4IlUwMsS/y1SLFR0GwxOoWoYZfV26ov5uXlN6SaqKl/UoCM6oswucKg8WG7Jn4Wb2Pq5GeCN9vQKpK3ErM/xFbl1tV1KVW12BgZsbq4z+LibwkAVSZN0pgkfsSj9SJbiAK64qttW9TlFlbqD3wzA8SDdFK+QJ/oaZ3q6gyvJWDD/jEEiEmS0LZaiKKmNA1lZxsmRjp9/e8gqqulKXtLXObVfSFZtGTXVXTXIltNg+/gq/py1w3NYKnHdm2jKQKlCCf492xvydl6FGGcnaKkjWt0FwQaakrOsGo5s4JM6beq5SN9DDxcJWelWTXAlTgNnCW5tY9GNrMmCmzpdjbXvBzBVceeSKggXgytNllVGGW1tbX3xcBNhUXsMUpQoMeKgYcSG+1qYMRqyYIj7lRBUarihV0ta4WsVmVdVf4N0vJk57xThf+i65Sq3BcBaCQWzK/L8zLzVT2AkXsu4U8IVkrePGLmWtSRRuOOdmripaCYLZYjxLqcB+BF3oOHUGoA3YDJSnaqCmapqeKuC1iYGy1mkZZVgWsm4VlCzIIleC5w2gHhCHWTUY5wr0sTttG65IlnJVaNhqA6wBIet8NfBmlkCqipuV4Wqiu1I+rOCFago3hx9t3br1ScGy6NcnvWkA0gX2kwvn9HYF3MlkYajSChAjwgonLQfv1PFDV18HZsQKjAe6q2SwvD+MYB19dKtAWeeaq+p1QpVo8jfHuisJ5Qp2sCtm6Y29T644NqGcj3+vZgX8DFcyWP6NMmtgXHNZXxTBT7jkT/t1i51GgjnP1lq7kkNr7YIptsWapCq9/kiVJHsfJkXVuKqp0j9fxb+OXTFZ7Ot7LiuFL2AQNwr5z2HJckgWY9VQmMNXKGXJvavU/fM+NsXcgxxZdhI9VUBVhaHLWjgkKuOTezrJboVb8IjLKoSfgmBFseK80GRhjPTODvQz7ljGTJLLQF1VzzBFqvKPgYJFa8AtER3jM6H8QG3vZfBDobLOhSoMwU5Dt3VE7SrzOlmbLfnSZ6HATutWZqqymxVUqXSUz8+SRei/k6IAbkC3/AuT9XkhsnByZ8XrD0NyYwTrylg3V8zLZFstv5k9tSJRdmZbp1QRslc5eqRErvRP/XvBTQlfksbXXJbGJ7CHG+NxPl/KMqwSfzc05qdQlZcr2Bni5VoyVn1KlV6Bw+liylWRK5dildHYJ06y8MSd+Zl/kNXaj0qQovX6I8j67PMCkLKqBF7B/uGhZuuEYpVx7WfPbzl+/mzBcs5ujso4nVC+Wrt5qlRXC6+ajBRhfvamfxNNGOQd6P4KWbBVmKwqgRfQNoLVmNQEGbGCnxCbYMMcV8OTqzK2MCP21yQrt7GPW51UqqSKXJ1Sa2eI0+i/C1kJPoc53KSS/xwui2KFsTxs6MlyyVVdm10JPxbCGZIqo1d1jqSpEh/gapYWK0LWn2mJ00n5BFz/MpqJ8iF9/UPdufy4FMVx/MYf4E9ghURELMQCEa/Em3gl4hWPeEYICfGKJREiQbARwULEwoYVG4nGdWk7DUHTpEbbSKudajvtdDpjiO9533POvUXNovOZ03tvaybRT76/X29Oz22HFzvOZLgaFfRk9YAqVBm+XofWIPODhVQvou9NV6pZ9Yl3XCBKbOKfIatdqlJJ4UShdNmfrVyBKAypiq0rQxU655GsUZaFVFH6XatnSVd2CQK68hNFGNrYS/rVwriRjRfVp/f0XoUpr0BMVfJTu4fUrAxTRcvQewhZmyYjW+P/CH4Jo92xkKW+nLnieUawmsKVWr6gvQmRwd9mQpoVSGWpKYrbHPn14znLl/tCr0BFKvn2z6JAVLarYlNkSgFXiTUOODt+FJCyVKzwwpx2abQwBC0RKztXdJoTf55sc2L16xkn0UrX6/VKJf+Lta5E7ItExeorXlgZ7TyBqKzAF0MsUloRYiSy1x2wdzRl+VX1fBjyzKbVCHcFW5/IH78SqmxXVeGqWahX4IrQ4k2sZKr6+jmp5tZszK+wIPTGBhNSk4AvsV7rEHaOoqzvSIbv+9EHPbMOK1IVMFcnvCITxF/0SSv/+XrG5a7ieRIrThOuSLz6NFOpXu2dEwzbEtkwkkRWD2JKMHQxV+4xh7ByPJhoMX7ieIx/eYzI0r93vwVVTJcwVtVipbl69+otWSXLVGGItq5s/XzGSdcr3FU+X5ma4E2s1StNiWVPXJhC1Jz5tTvF/qEfwhJumih62+pQFp+XrjrHkPWBEhuBKKZLUISsQFewk8RffOOuguasPgtXkYoEtvL8839wa5VTeFOILZeWvgA1YsD+4W2sXME3vBuz7eqknW5Ac5UDeNMaTVkfhKsPPzyKqxrXC7tdEZirWCxFVYXMhMqZy2FpqpIHaf+Viz9+9hejKeFLCdN0vYiVapX0UKvp6ZLIjeBTxVb9ZI84nOVE1jj8UHBggofsx+3fYbI+SFexGG9ZdMPola6YKVWD5I2WJDElZBmqECxBi5mSNOWZFycbHx78ma7U+2u1avk7KFf76pV8+ufgwPBIHIaC4ReNajXIxlFHsonI+m+kLOmq6HFcaetrmCvMXObeolUFpIrbasgLyYaoK6WL9zKurBNYm2I7lSn2Qgi2LHEkqxGtUZKlVElZvGlhgIxWgkIVrqyJ5YpRX6iMXIFMVs4vpVkBKnjP6VzYczp8mVLtCsQ3Oz7OTkS0JozDmEBRx9p9sQ8CD0tZMbgilDyOOjd9yVQZrf0bVBWTsGRXoJw37ucXdGKDUGmuCqKbdZoqtgU4Yqp4pNh2nUNQXQu2JvwvkFWWqkCu7ElcLuwVZL3mqHYFVcWUZsqeNI6TOqFPx9ViVSDEO1dFN2xIEmzw9cJ3HJ1j49HBR11WVakCLuG9cKVi9eVDEWTet3EFWz1EFQtAxG+K2po69B/Bko3KbuzAdAUWn8Xr4KjIinGw4CJX8wTy5PT1a721v3sZhalSz0tblRRF+cmvu8OI533AFEiPdGBJDtxUosSOxyp7xrFYdoVEa9qEaRLcwQg7Nh8TsqQrdKFcn67KxU7UIFf1qbdI+Bz0GkhVCVlf3OeAxWAEiiAJgzKVfL1mw+3Ektjo9ccjxWwddkK+cxu2/odF+XyZq6IUIcvQFddq8GMyR2P1UU5Z2Y2dU3quGC5I8ixXYPBfMqV2ovz08wXFRSeQ5ePAf8kSycpRW9DQ7wFN1483cpLhZaqnCEq5b/Y7p/ZbXAPi0js8tQGRLLqHK0qTS7BRZjD8Z1X22TobuCFTuN3a54SwGZWEaE2aNkmAQ3VfYf473wtZOaYK1D0D90dPNPWNLTorUlXFVFizAsrV1yxXRdi97ezeYzv2btq2gqWL2GqkG54qMrPo9DwxUdp8FdtiT1WJEjy0ywll1RVia1LHkDKkqopwRah4Js0ecXIPSqWeb6+Eq/bLPMp4BrL/yqeweMe2pdQXsdUYpI1a5gZH1n3ey7kms1OpMyuYIu1qsdOGlReQrM5tIVnVWIyqCpHljlBXOWYq9fIdxzZlXJk0wOqDPTH/c1i2aSnt9JDVGGalBrgZ677csKHBSlBxaL3TniVHaFl1LqsMVUJWqZiPeBFPo/UpQ+Yvk5+/fnylFqUZbd12lXETgL9SHTRex8+TUkQxNhpxJkKLkryv7TVFdKuRTRzc54Sigk1VTfcxafokjND76jGaLCJKuCoVInCly8LscQfrrGKsQJix7VZBjC/kQSHfiHBH8rRAv6+EAX+3Ms4Ysof2ifS2Z/kF4qoj0LOqyhUoQI/ua8CWFe4KprisRgIIYWcC/tPbWLrSEV909HNzw5DogapPgSwzddgswHCWXJ/+37JKjKmGKshqs35PmrKClYknfNx1Alh2diNk5ac2lSpgqbLbFDY8sbdObj91+OL6E84/sWrSnOlzMJgCHAB2v83jAGVYU65AOuIZXWuQuQqvwMBFoaVE1hetsG6y+ey2rSumYsGIhpkoYYjYOXhy+5RTZw5fPLdv/a7jRuH9Q7jmdALpWdSUkgU8U1bQREzblY6ZEchSvv5UJLsunpm7/eTBPZyDB08eOrR9+1xoOXP48F2Y2bd+/S5bTudsuD1n4ZyFFBxQcIBB90HgYVKGJSHrOwZk0aalhA3JVGmEqqKy8uJTIRgnnG5jyfWZC2diLMSYyVH3sQHiWOxJskrSFWa+GzRZRJiUxVWFL3S01+8Vhaosve1xupANt2f+I0hWjasCTJan6xoSrmxVGNyUvoI25mYpohK3O93Ikmv/KGs/GjxVpWSxaPnKMGx6L2z53reSuqiTHRx2uhOEawZl5oyZGHQPxLHYa7KUq3K5wWIl4wVZfzqzErK4qlRNXqkoivGc06UsucZU/R378/k+WoJKlkCWoW0K2C+BGETV57wLU9SWzNcup2vZcHvGX4Nk9clYwRVkCVHY0O2QPb1nNytAVJFPNiWuXP7DuOV0MSRc/5AsnyozWRiQZTWr4AtuMlDVOwBHTJfilNPVbJg9e8ZspgMHGHyvHuMcgCzlyp8ssqUHg393bdI38qEj0WEXJKgvDC6ta1uWDNfs9ihZ/T5V1XI6IvHYGNBOQkMueMO1g3D19he1BF3UlajE7jsltcL117KkKsiqTo1oQNeAOWllX5uUgSq46vmhXafIo9XtVcjDNWv2rNkYs+QeGI8dKBQgi4vCqBYMV16kpdefHSuooq5ycSFJ9i2ycdc7Y4ENj2f9CSSrXhZUQT5i4A0HTcT4U8VX7dcirglsjY1g0XBd+pOse5AlTYXI4t3KMsVVcVfpIFVgz3FnrLDq8R9lVZQqUImYNImq4NfAr0lxNciLlhvMky4+IbVYfGnerFnzZs3DCJRVKFSUqlqtVo/EDVnxb8SUfWUSQiWvyPoed4O5OXZyRVl5dV4495Gsalm4Av1wZZAMUIVQ+a5eS7NVgjZblzhjjYdtZeWlKmoLdgxfL4zP/mKhArwGY7+gCsMicsUZgyx7wNQsmLcAQ5rC4VMpq8aJWHxI4mMqpCryPr66eg1UInLJrs7lY87YZMPpBYE8giyVKtAXj5vJKiahpPcz/QrpqH71WjL6YdgD3JSWsN0rnbHKkkuhsmqQVeWq+oisiO6rytejv6XAEweuVKzUVRlc23hnLLPyKtUzf8F8DLbHEWT1iVBRWSMRostvq94LW/rVRzxXMcRKiBI/LFvNvc4Y5wb8mGASvi5l9YGBOGRp0Wr0MlvUl9whVr/bO3fdtmEoDPNJ0r1P0UW+oKC1GGjRJoCBdKinwB09B/DgIICHvELRIQ+RQYuHnqxdjI42ejMqVWpguUWPKNJHFKtKBZJBlD5YpucPh8c/aRLeeHSOK/vgFHzBak93bsgaY3ZIVUl+eQCgVdZPcTsE5RCJqs+/lSrSJUvrhFkBX+RkJdmBXCFr1bRA+drjpp52uS35fPPDWxYQnzFbuJo6zhPnIOt6g5s06QxEfN8PAPGytQUf0JbQRbK+x4YjlR9eDpg9dOdOFjEPv0hXiMgOoJXWe7rblnIbLuWms8mz+oX2kozqEOdrLC1hSpJWVjZB+HS1TSjbgDyWZALPmXXwhdNxOvhCWz20JVyluoIYQKiiyRhqNwG/RvLsiGdW18WI2chw2pEkpRWgLEUICk9V1zf6X56bMKMqz6s+s5QrpWuc2PIlQbBSogAO+XR1Ky6afvy0AuGKniXhPWIWI3U5vdRW4AcCkJArJN7d7SLtlx9VW8pXbdfN/6frfJPYUq58cqWivBpIlTrFRcJOObOe4SKx1Vsj20Cwjam01JODjiUpcbaE9jL4W9Hkla7tNgTI9XgxmtChiMie0F5G/930+vX6wOOsKvinKDlaFdrL4XOcipIACOpcxco820J7BfhsLH1F+jyUQxE2hvYqdEezo8lk8hQIavQFwiwN7ZV5Awa0+Mnh1nen/Z44BkLv9DljYHVorwbfgwGtf4iL2u+03weXYKJKi5pXE0J7FU5Bw8zz+N6Q0F4OD4EwvhWRJoX2UoZhUY9PZ2PYrNBewuAODLzDUMPjMQ8Kd6GIaMZaclxG8FfcIWsxGLkxGOzazl7AYKLn09idtd2qmP7ZiZsK24fHR20MLafPB6O2UTWAP1yGz7GpTmekAAAAAElFTkSuQmCC`,phone_png_data_url_default=`data:image/png;base64,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`,_a$1,LOCALE={zh:{TITLE:`眼镜模式`,HIT:`请将手机横屏放入 VR 眼镜中`},en:{TITLE:`GLASSES MODE`,HIT:`Please put the mobile phone horizontally into the VR glasses.`},ja:{TITLE:`メガネモード`,HIT:`携帯電話をVRメガネに水平に入れてください。`}},TEXT=typeof navigator<`u`?(_a$1=LOCALE[navigator.language.split(`-`)[0]])==null?LOCALE.en:_a$1:LOCALE.zh,CONTENTS=`
|
|
559
|
+
void main() { color = vec4(texture(tex, uv).rgb, 1.0); }`)),gl.linkProgram(program),!gl.getProgramParameter(program,gl.LINK_STATUS))return null;let texture=gl.createTexture();return gl.bindTexture(gl.TEXTURE_2D,texture),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE),{canvas,gl,texture,program,pixels:new Uint8Array(GL_PROBE_SIZE*GL_PROBE_SIZE*4)}}catch(_a){return null}}function disposeGLProbe(probe){var _a;let{gl}=probe;gl.deleteTexture(probe.texture),gl.deleteProgram(probe.program),(_a=gl.getExtension(`WEBGL_lose_context`))==null||_a.loseContext()}var GPU_PROBE_WIDTH=64,GPU_PROBE_HEIGHT=16,VideoTextureBridge=class{constructor(videoTexture){var _a;this.debug={path:`pending`,candidate:``,locked:!1,probe:``,updateCalls:0,skipNotReady:0,blitCount:0,rvfcCount:0,fails:0,targetSize:``,lastError:``},this.mode=`unknown`,this.device=null,this.broken=!1,this.disposed=!1,this.locked=!1,this.blacklist=new Map,this.probing=!1,this.nextProbeAt=0,this.probeInterval=300,this.consecutiveFails=0,this.failingSince=0,this.frameTexture=null,this.frameReady=!1,this.heldFrame=null,this.canvas=null,this.canvasContext=null,this.gpuTexture=null,this.externalTexture=null,this.externalReady=!1,this.width=0,this.height=0,this.frameDirty=!0,this.lastVideoTime=-1,this.videoFrameCallbackId=null,this.glProbe=null,this.glProbeFailed=!1,this.gpuProbe=null,this.probeCanvas=null,this.forced=!1,this.onSourceChange=()=>{this.forced||(this.blacklist.clear(),this.locked=!1,this.debug.locked=!1,this.probeInterval=300,this.nextProbeAt=0,this.consecutiveFails=0,this.frameDirty=!0)},this.videoTexture=videoTexture,this.current=(_a=CANDIDATE_ORDER.find(isAvailable))==null?`video`:_a,this.debug.candidate=this.current,this.scheduleVideoFrameCallback();let video=this.video;typeof(video==null?void 0:video.addEventListener)==`function`&&video.addEventListener(`loadstart`,this.onSourceChange)}get video(){return this.videoTexture.image}scheduleVideoFrameCallback(){let video=this.video;this.disposed||typeof(video==null?void 0:video.requestVideoFrameCallback)!=`function`||(this.videoFrameCallbackId=video.requestVideoFrameCallback(()=>{this.videoFrameCallbackId=null,this.frameDirty=!0,this.debug.rvfcCount++,this.scheduleVideoFrameCallback()}))}get texture(){var _a;if(this.broken||this.mode===`unknown`)return this.videoTexture;let wantsExternal=this.mode===`webgpu`&&(this.current===`videoFrame`||this.current===`video`),external=this.externalReady?this.externalTexture:null,frame=this.frameReady?this.frameTexture:null;return(_a=wantsExternal?external==null?frame:external:frame==null?external:frame)==null?getPlaceholder():_a}update(renderer){if(this.debug.updateCalls++,this.disposed||this.broken||!this.resolveMode(renderer))return;let video=this.video;if(!(video instanceof HTMLVideoElement))return;if(video.readyState<2||video.videoWidth===0||video.videoHeight===0){this.debug.skipNotReady++;return}let now=performance.now();if(!this.locked&&!this.probing&&now>=this.nextProbeAt&&this.startProbe(),!(!this.frameDirty&&(this.debug.rvfcCount>0||video.currentTime===this.lastVideoTime)))try{this.produce(this.current,video),this.frameDirty=!1,this.lastVideoTime=video.currentTime,this.consecutiveFails=0,this.debug.blitCount++}catch(error){this.onProduceFailed(error)}}forceCandidate(candidate){if(candidate===null){this.forced=!1,this.onSourceChange();return}this.forced=!0,this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}resolveMode(renderer){if(this.mode!==`unknown`)return!0;let backend=renderer==null?void 0:renderer.backend;if(!backend)return!1;if(backend.isWebGPUBackend===!0){if(!backend.device)return!1;this.device=backend.device,this.mode=`webgpu`}else this.mode=`webgl`;return this.debug.path=this.mode,this.ensureFrameTexture(),!0}ensureFrameTexture(){if(this.frameTexture)return;let source=this.videoTexture,texture=new three_webgpu.VideoFrameTexture;texture.colorSpace=three_webgpu.SRGBColorSpace,texture.generateMipmaps=!1,texture.minFilter=source.minFilter,texture.magFilter=source.magFilter,texture.wrapS=source.wrapS,texture.wrapT=source.wrapT,this.frameTexture=texture}produce(candidate,video){let webgpu=this.mode===`webgpu`;switch(candidate){case`videoFrame`:{let frame=createVideoFrame(video);if(webgpu)try{this.blit(frame,video)}finally{frame.close()}else this.setFrame(frame,frame);break}case`video`:webgpu?this.blit(video,video):this.setFrame(video,null);break;case`canvasFromVideoFrame`:{let frame=createVideoFrame(video);try{this.drawCanvas(frame,video)}finally{frame.close()}this.setFrame(this.canvas,null);break}case`canvasFromVideo`:this.drawCanvas(video,video),this.setFrame(this.canvas,null);break}}setFrame(image,owned){this.frameTexture.setFrame(image);let previous=this.heldFrame;this.heldFrame=owned,previous&&previous!==owned&&previous.close(),this.frameReady=!0}drawCanvas(source,video){let scale=Math.min(1,MAX_CANVAS_SIZE/Math.max(video.videoWidth,video.videoHeight)),width=Math.max(1,Math.floor(video.videoWidth*scale)),height=Math.max(1,Math.floor(video.videoHeight*scale));if(!this.canvas&&(this.canvas=document.createElement(`canvas`),this.canvasContext=this.canvas.getContext(`2d`,{alpha:!1}),!this.canvasContext))throw Error(`canvas 2d 上下文不可用`);this.canvas.width!==width&&(this.canvas.width=width),this.canvas.height!==height&&(this.canvas.height=height),this.canvasContext.drawImage(source,0,0,width,height)}isBlacklisted(candidate){let expiresAt=this.blacklist.get(candidate);return expiresAt===void 0?!1:performance.now()>=expiresAt?(this.blacklist.delete(candidate),!1):!0}onProduceFailed(error){var _a;let now=performance.now();if(this.consecutiveFails===0&&(this.failingSince=now),this.consecutiveFails++,this.debug.fails++,this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a),this.consecutiveFails<MAX_CONSECUTIVE_FAILS||now-this.failingSince<MIN_FAIL_DURATION_MS)return;console.warn(`[Five] 视频候选路径 ${this.current} 持续失败,暂时弃用`,error),this.blacklist.set(this.current,now+BLACKLIST_TTL_MS);let next=CANDIDATE_ORDER.find(c=>isAvailable(c)&&!this.isBlacklisted(c));this.consecutiveFails=0,next?(this.current=next,this.debug.candidate=next,this.locked=!1,this.debug.locked=!1,this.nextProbeAt=0,this.frameDirty=!0):(console.warn(`[Five] 视频所有候选路径均失败,回退为 VideoTexture 上传`),this.broken=!0,this.debug.path=`fallback`,this.releaseOutputs())}blit(source,video){this.ensureTarget(video.videoWidth,video.videoHeight);let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device),external=device.importExternalTexture({source}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoBlit`}),pass=encoder.beginRenderPass({colorAttachments:[{view:this.gpuTexture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),device.queue.submit([encoder.finish()]),this.externalReady=!0,this.debug.targetSize=`${this.width}x${this.height}`}ensureTarget(videoWidth,videoHeight){let device=this.device,maxSize=device.limits.maxTextureDimension2D,scale=Math.min(1,maxSize/Math.max(videoWidth,videoHeight)),width=Math.max(1,Math.floor(videoWidth*scale)),height=Math.max(1,Math.floor(videoHeight*scale));if(this.gpuTexture&&this.width===width&&this.height===height)return;let prevGPUTexture=this.gpuTexture,gpuTexture=device.createTexture({label:`five.videoBlit.target`,size:{width,height},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});if(this.gpuTexture=gpuTexture,this.width=width,this.height=height,this.externalTexture)this.externalTexture.sourceTexture=gpuTexture,this.externalTexture.image={width,height},this.externalTexture.dispose();else{let texture=new three_webgpu.ExternalTexture(gpuTexture);texture.colorSpace=three_webgpu.SRGBColorSpace,texture.flipY=!1,texture.generateMipmaps=!1,texture.minFilter=three_webgpu.LinearFilter,texture.magFilter=three_webgpu.LinearFilter,texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.image={width,height},this.externalTexture=texture}prevGPUTexture==null||prevGPUTexture.destroy()}startProbe(){this.probing=!0,this.runProbe().catch(error=>{var _a;this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a)}).finally(()=>{this.probing=!1,this.nextProbeAt=performance.now()+this.probeInterval,this.probeInterval=Math.min(this.probeInterval*1.5,5e3)})}runProbe(){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let results=[],chosen=null;for(let candidate of CANDIDATE_ORDER){let label=CANDIDATE_SHORT[candidate];if(this.disposed)return;if(this.isBlacklisted(candidate)||!isAvailable(candidate)){results.push(`${label}:n/a`);continue}let brightness;try{brightness=yield this.probeCandidate(candidate)}catch(_a){brightness=-1}if(results.push(`${label}:${brightness===null?`?`:brightness}`),brightness===null||brightness>=BRIGHT_THRESHOLD){chosen=candidate;break}}this.debug.probe=results.join(` `),chosen&&this.select(chosen)})}select(candidate){this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}probeCandidate(candidate){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let video=this.video;if(!(video instanceof HTMLVideoElement)||video.readyState<2)return-1;switch(candidate){case`canvasFromVideoFrame`:return this.probe2d(video,!0);case`canvasFromVideo`:return this.probe2d(video,!1);default:return this.mode===`webgpu`?this.probeGPU(video,candidate===`videoFrame`):this.probeGL(video,candidate===`videoFrame`)}})}probe2d(video,useFrame){if(!this.probeCanvas){let canvas=document.createElement(`canvas`);canvas.width=canvas.height=GL_PROBE_SIZE;let context=canvas.getContext(`2d`,{willReadFrequently:!0});if(!context)return-1;this.probeCanvas=context}let frame=useFrame?createVideoFrame(video):null;try{return this.probeCanvas.drawImage(frame==null?video:frame,0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),maxChannel(this.probeCanvas.getImageData(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE).data)}finally{frame==null||frame.close()}}probeGL(video,useFrame){!this.glProbe&&!this.glProbeFailed&&(this.glProbe=createGLProbe(),this.glProbeFailed=this.glProbe===null);let probe=this.glProbe;if(!probe)return null;let{gl}=probe,frame=useFrame?createVideoFrame(video):null;try{return gl.getError(),gl.viewport(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),gl.bindTexture(gl.TEXTURE_2D,probe.texture),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,frame==null?video:frame),gl.getError()===gl.NO_ERROR?(gl.useProgram(probe.program),gl.drawArrays(gl.TRIANGLES,0,3),gl.readPixels(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE,gl.RGBA,gl.UNSIGNED_BYTE,probe.pixels),maxChannel(probe.pixels)):-1}finally{frame==null||frame.close()}}probeGPU(video,useFrame){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device);this.gpuProbe||(this.gpuProbe={texture:device.createTexture({label:`five.videoProbe.target`,size:{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),buffer:device.createBuffer({label:`five.videoProbe.readback`,size:GPU_PROBE_WIDTH*4*GPU_PROBE_HEIGHT,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});let probe=this.gpuProbe;device.pushErrorScope(`validation`);let encodeError=null,frame=useFrame?createVideoFrame(video):null;try{let external=device.importExternalTexture({source:frame==null?video:frame}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoProbe`}),pass=encoder.beginRenderPass({colorAttachments:[{view:probe.texture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),encoder.copyTextureToBuffer({texture:probe.texture},{buffer:probe.buffer,bytesPerRow:GPU_PROBE_WIDTH*4},{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT}),device.queue.submit([encoder.finish()])}catch(error){encodeError=error}finally{frame==null||frame.close()}let scopeError=yield device.popErrorScope();if(encodeError||scopeError)return-1;yield probe.buffer.mapAsync(GPUMapMode.READ);let brightness=maxChannel(new Uint8Array(probe.buffer.getMappedRange()));return probe.buffer.unmap(),brightness})}releaseProbeResources(){this.glProbe&&(disposeGLProbe(this.glProbe),this.glProbe=null),this.glProbeFailed=!1,this.probeCanvas=null,this.gpuProbe&&(this.gpuProbe.texture.destroy(),this.gpuProbe.buffer.destroy(),this.gpuProbe=null)}releaseOutputs(){var _a,_b,_c,_d;(_a=this.heldFrame)==null||_a.close(),this.heldFrame=null,(_b=this.frameTexture)==null||_b.dispose(),this.frameTexture=null,this.frameReady=!1,(_c=this.externalTexture)==null||_c.dispose(),this.externalTexture=null,this.externalReady=!1,(_d=this.gpuTexture)==null||_d.destroy(),this.gpuTexture=null,this.width=this.height=0,this.canvas=null,this.canvasContext=null}dispose(){if(this.disposed)return;this.disposed=!0;let video=this.video;this.videoFrameCallbackId!==null&&typeof(video==null?void 0:video.cancelVideoFrameCallback)==`function`&&video.cancelVideoFrameCallback(this.videoFrameCallbackId),this.videoFrameCallbackId=null,typeof(video==null?void 0:video.removeEventListener)==`function`&&video.removeEventListener(`loadstart`,this.onSourceChange),this.releaseOutputs(),this.releaseProbeResources()}},bridges=new WeakMap;function getVideoTextureBridge(videoTexture){let bridge=bridges.get(videoTexture);if(!bridge){let created=new VideoTextureBridge(videoTexture);bridge=created,bridges.set(videoTexture,created);let onDispose=()=>{videoTexture.removeEventListener(`dispose`,onDispose),bridges.get(videoTexture)===created&&bridges.delete(videoTexture),created.dispose()};videoTexture.addEventListener(`dispose`,onDispose)}return bridge}var ROTATE_Y_PI_MATRIX=new three_webgpu.Matrix4().makeRotationAxis(new three_webgpu.Vector3(0,1,0),Math.PI),scratchMapMatrix=new three_webgpu.Matrix4,CUBE_MAP_FLIP=(0,three_tsl.float)(-1),VIDEO_UV_CENTER=(0,three_tsl.vec2)(.5,.5),sharedGeometry$1=createSimpleBoxBufferGeometry(2,2,2);sharedGeometry$1.applyMatrix4(new three_webgpu.Matrix4().makeScale(-1,1,1));function createPanoVideoMaterial(){let u={size:(0,three_tsl.uniform)(new three_webgpu.Vector2),mapMatrix:(0,three_tsl.uniform)(new three_webgpu.Matrix4),panoMatrix:(0,three_tsl.uniform)(new three_webgpu.Matrix4),alpha:(0,three_tsl.uniform)(1),map:(0,three_tsl.texture)(new three_webgpu.Texture)},cameraToVertex=three_tsl.positionWorld.sub(three_tsl.cameraPosition).normalize().toVar(`cameraToVertex`),panoDirection=u.panoMatrix.toMat3().transpose().mul(cameraToVertex).toVar(`panoDirection`),cubeDirection=(0,three_tsl.vec3)(panoDirection.x.mul(CUBE_MAP_FLIP),panoDirection.y,panoDirection.z),mapCoods=u.mapMatrix.mul((0,three_tsl.vec4)(cubeDirection,1)).toVar(`mapCoods`),videoUv=(0,three_tsl.vec2)((0,three_tsl.float)(.5).add(mapCoods.x.div(mapCoods.z).div(u.size.x)),(0,three_tsl.float)(.5).sub(mapCoods.y.div(mapCoods.z).div(u.size.y))).toVar(`videoUv`),videoColor=(0,three_tsl.texture)(u.map,videoUv),match=(0,three_tsl.float)(1).sub((0,three_tsl.step)((0,three_tsl.float)(0),mapCoods.z)).mul((0,three_tsl.float)(1).sub((0,three_tsl.step)((0,three_tsl.float)(.5),(0,three_tsl.abs)(videoUv.x.sub(.5))))).mul((0,three_tsl.float)(1).sub((0,three_tsl.step)((0,three_tsl.float)(.5),(0,three_tsl.abs)(videoUv.y.sub(.5))))),blendAlpha=(0,three_tsl.float)(5).mul((0,three_tsl.float)(1).sub((0,three_tsl.distance)(videoUv,VIDEO_UV_CENTER).div(.55).clamp(0,1))).clamp(0,1),material=new three_webgpu.NodeMaterial;return material.fragmentNode=(0,three_tsl.vec4)(videoColor.rgb,match.mul(blendAlpha).mul(u.alpha)),material.depthTest=!1,material.depthWrite=!1,material.fog=!1,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,{material,u}}var PanoVideo=class{constructor(){this.videoBridge=null;let{material,u}=createPanoVideoMaterial();this.material=material,this.u=u,this.object=new three_webgpu.Mesh(sharedGeometry$1,this.material),this.object.visible=!1,this.object.renderOrder=-1,this.object.frustumCulled=!1,this.object.name=`pano-video`,this.alphaMotion=new Motion({alpha:0}),this.active=!1,this.object.onBeforeRender=renderer=>{let bridge=this.videoBridge;bridge&&(bridge.update(renderer),this.u.map.value=bridge.texture)}}setMaterial(value){value?(this.u.size.value.copy(value.size),this.u.mapMatrix.value.copy(scratchMapMatrix.multiplyMatrices(ROTATE_Y_PI_MATRIX,value.matrix).transpose()),this.u.panoMatrix.value.copy(value.panoMatrix),value.map.colorSpace=three_webgpu.SRGBColorSpace,value.map.isVideoTexture?(this.videoBridge=getVideoTextureBridge(value.map),this.u.map.value=this.videoBridge.texture):(this.videoBridge=null,this.u.map.value=value.map),this.alphaMotion.set({alpha:value.alpha},500).catch(require_memoryUsage.d)):(this.u.size.value.setScalar(0),this.u.mapMatrix.value.identity(),this.u.panoMatrix.value.identity(),this.videoBridge=null,this.u.map.value=null,this.u.alpha.value=0,this.alphaMotion.set({alpha:0},0).catch(require_memoryUsage.d));let active=value!==null;this.active!==active&&(this.active=active,this.object.visible=active)}updateTime(time){this.alphaMotion.ended||(this.alphaMotion.update(time),this.u.alpha.value=this.alphaMotion.value.alpha)}dispose(){this.material.dispose()}},clearColor=new three_webgpu.Color(0,0,0),scratchPrevClearColor=new three_webgpu.Color;function packDepthToRGBA(depth){let r=depth.mul(256*256*256).fract(),g=depth.mul(256*256).fract().sub(r.mul(1/256)),b=depth.mul(256).fract().sub(g.mul(1/256));return(0,three_tsl.vec4)(r,g,b,depth.sub(b.mul(1/256))).mul(256/255)}var maxDepthUniform=(0,three_tsl.uniform)(0),depthFragmentNode=packDepthToRGBA((0,three_tsl.clamp)((0,three_tsl.length)(three_tsl.positionWorld.sub(three_tsl.cameraPosition)).div(maxDepthUniform),0,1)),depthMaterial=new three_webgpu.NodeMaterial;depthMaterial.fragmentNode=depthFragmentNode,depthMaterial.fog=!1;function renderDepthCube(renderer,scene,cubeCamera,maxDepth=1e3){maxDepthUniform.value=maxDepth,renderer.getClearColor(scratchPrevClearColor);let prevClearAlpha=renderer.getClearAlpha(),prevOverrideMaterial=scene.overrideMaterial;scene.overrideMaterial=depthMaterial,renderer.setClearColor(clearColor,0),cubeCamera.update(renderer,scene),renderer.setClearColor(scratchPrevClearColor,prevClearAlpha),scene.overrideMaterial=prevOverrideMaterial}function toError(error){if(error instanceof Error)return error;let type=typeof error;return Error(type&&type===`object`?JSON.stringify(error):error)}var defaultEffectEase=linear,scratchRaycaster=new three_webgpu.Raycaster,scratchVector3$2=new three_webgpu.Vector3,adjustPanoCircleMeshVectors=[new three_webgpu.Vector3(0,0,0).multiplyScalar(.1),new three_webgpu.Vector3(1,0,0).multiplyScalar(.1),new three_webgpu.Vector3(-.5,0,-Math.sqrt(3)/2).multiplyScalar(.1),new three_webgpu.Vector3(-.5,0,Math.sqrt(3)/2).multiplyScalar(.1)],defaultPanoramaControllerCustomInitArgs=Object.assign(Object.assign({},defaultPanoramaLikeControllerCustomInitArgs),{maxAccessibleDistance:5,panoTapTriggerRadius:.5,panoCircleMeshCreator:(observer,options)=>observer.position.distanceTo(observer.standingPosition)>options.aerialObserverMinHeight?new PanoCircleMeshSolid:new PanoCircleMesh,adjustPanoCircleMeshPositionBasedOnModel:!1,tileLevelForFov:((fov,viewSize)=>{var _a;let degToRad=rad=>rad/180*Math.PI,log2=(_a=Math.log2)==null?(n=>Math.log(n)*Math.LOG2E):_a,size=viewSize.height/2/Math.tan(degToRad(fov/2))*Math.tan(degToRad(45))*2,level=Math.max(log2(size/512),0);return level<2.3&&level>.1&&(level=1),level=level%1>.75?Math.ceil(level):Math.floor(level),level}),tileAppearDuration:.5,tileMaxRequest:3,flyEffectUseDepthBuffer:!1}),PanoramaController=class PanoramaController extends PanoramaLikeController{static parseArgs(args){var _a,_b,_c,_d,_e,_f,_g,_h;if(args instanceof PanoramaController)return args;let args_=super.parseArgs(args);return Object.assign(Object.assign({},args_),{maxAccessibleDistance:(_a=args.maxAccessibleDistance)==null?defaultPanoramaControllerCustomInitArgs.maxAccessibleDistance:_a,panoTapTriggerRadius:(_b=args.panoTapTriggerRadius)==null?defaultPanoramaControllerCustomInitArgs.panoTapTriggerRadius:_b,panoCircleMeshCreator:(_c=args.panoCircleMeshCreator)==null?defaultPanoramaControllerCustomInitArgs.panoCircleMeshCreator:_c,adjustPanoCircleMeshPositionBasedOnModel:(_d=args.adjustPanoCircleMeshPositionBasedOnModel)==null?defaultPanoramaControllerCustomInitArgs.adjustPanoCircleMeshPositionBasedOnModel:_d,tileLevelForFov:(_e=args.tileLevelForFov)==null?defaultPanoramaControllerCustomInitArgs.tileLevelForFov:_e,tileAppearDuration:(_f=args.tileAppearDuration)==null?defaultPanoramaControllerCustomInitArgs.tileAppearDuration:_f,tileMaxRequest:(_g=args.tileMaxRequest)==null?defaultPanoramaControllerCustomInitArgs.tileMaxRequest:_g,flyEffectUseDepthBuffer:(_h=args.flyEffectUseDepthBuffer)==null?defaultPanoramaControllerCustomInitArgs.flyEffectUseDepthBuffer:_h})}static initAnimationEndState(args){let args_=this.parseArgs(args),state=super.initAnimationEndState(args_);return Object.assign(Object.assign({},state),{mode:`Panorama`})}constructor(args){let args_=PanoramaController.parseArgs(args);super(args_),this.mode=`Panorama`,this.initAnimationed=!1,this.maxAccessibleDistance=args_.maxAccessibleDistance,this.panoTapTriggerRadius=args_.panoTapTriggerRadius,this.panoCircleMeshCreator=args_.panoCircleMeshCreator,this.adjustPanoCircleMeshPositionBasedOnModel=args_.adjustPanoCircleMeshPositionBasedOnModel,this.tileLevelForFov=args_.tileLevelForFov,this.tileAppearDuration=args_.tileAppearDuration,this.tileMaxRequest=args_.tileMaxRequest,this.flyEffectUseDepthBuffer=args_.flyEffectUseDepthBuffer,this.adjustPanoCircleMeshPositionFix=new Map;let{pano0,pano1}=this.modelScene.parameter.resolveValue();pano0&&(pano1==null?void 0:pano1.map)!==pano0.map&&(this.modelScene.parameter.set({pano0:pano1}),pano0.map.dispose());let existsPanoSet=new Set;pano0&&existsPanoSet.add(pano0),pano1&&existsPanoSet.add(pano1),this.panoMeshes=new Map,this.locationMotion=new Motion({count:0,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x}),this.panoResources={},this.panoResources[this.locationMotion.keyframes[0].key=this.locationMotion.keyframes[1].key=require_memoryUsage.N()]={panoId:panoStringify(this.currentPano),panoPicture:this.modelScene.parameter.resolveValue().pano1,position:this.camera.pose.offset.clone(),effect:`fly`,effectEasing:defaultEffectEase,fixCameraTransform:new three_webgpu.Matrix4},this.panoPictureObserverMap=new WeakMap,this.textureLoader=new require_pick.i,this.tiling=new Tiling({fiveId:this.fiveId,enableHDR:this.enableHDR}),this.panoVideo=new PanoVideo,this.scene.add(this.panoVideo.object),this.accessibleObserverFloorCheckCount=0}get tileLevel(){return this.tiling.level}updateConfiguration(args){return super.updateConfiguration(args)===!1?!1:(args.maxAccessibleDistance!==void 0&&this.maxAccessibleDistance!==args.maxAccessibleDistance&&(this.maxAccessibleDistance=args.maxAccessibleDistance),args.panoTapTriggerRadius!==void 0&&this.panoTapTriggerRadius!==args.panoTapTriggerRadius&&(this.panoTapTriggerRadius=args.panoTapTriggerRadius),args.panoCircleMeshCreator!==void 0&&this.panoCircleMeshCreator!==args.panoCircleMeshCreator&&(this.panoCircleMeshCreator=args.panoCircleMeshCreator,this.panoMeshes&&(this.panoMeshes.forEach(panoMesh=>{this.helper.remove(panoMesh),panoMesh.dispose()}),this.panoMeshes.clear())),args.tileLevelForFov!==void 0&&this.tileLevelForFov!==args.tileLevelForFov&&(this.tileLevelForFov=args.tileLevelForFov),args.tileMaxRequest!==void 0&&this.tileMaxRequest!==args.tileMaxRequest&&(this.tileMaxRequest=args.tileMaxRequest),args.flyEffectUseDepthBuffer!==void 0&&this.flyEffectUseDepthBuffer!==args.flyEffectUseDepthBuffer&&(this.flyEffectUseDepthBuffer=args.flyEffectUseDepthBuffer),args.adjustPanoCircleMeshPositionBasedOnModel!==void 0&&this.adjustPanoCircleMeshPositionBasedOnModel!==args.adjustPanoCircleMeshPositionBasedOnModel&&(this.adjustPanoCircleMeshPositionBasedOnModel=args.adjustPanoCircleMeshPositionBasedOnModel,this.adjustPanoCircleMeshPositionBasedOnModel||this.adjustPanoCircleMeshPositionFix.clear()),!0)}destroy(){super.destroy(),this.tiling.dispose(),this.modelScene.parameter.set({refinedScreen:null,pano0Depth:null,pano1Depth:null}),this.pano0DepthCubeRenderTarget&&(this.pano0DepthCubeRenderTarget.dispose(),this.pano0DepthCubeRenderTarget=void 0),this.pano1DepthCubeRenderTarget&&(this.pano1DepthCubeRenderTarget.dispose(),this.pano1DepthCubeRenderTarget=void 0),this.locationMotion.dispose(),this.pendingTextureTask=void 0,this.panoMeshes&&(this.panoMeshes.forEach(panoMesh=>{this.helper.remove(panoMesh),panoMesh.dispose()}),this.panoMeshes.clear());let video=this.videoTexture.image;video.pause(),video.oncanplay=require_memoryUsage.d,video.ontimeupdate=require_memoryUsage.d,this.scene.remove(this.panoVideo.object),this.panoVideo.setMaterial(null),this.panoVideo.dispose();let{pano0,pano1}=this.modelScene.parameter.resolveValue();for(let name of Object.keys(this.panoResources)){let panoResource=this.panoResources[name];if(panoResource.panoPicture){let texture=panoResource.panoPicture.map;texture&&texture!==(pano0==null?void 0:pano0.map)&&texture!==(pano1==null?void 0:pano1.map)&&(texture.dispose(),panoResource.panoPicture=null)}delete this.panoResources[name]}}isReady(){return this.locationMotion.ended===!0?super.isReady():!1}isTileReady(){let tilingTileReay=this.tiling.pedding<=0;return this.initAnimationed&&tilingTileReay}updateWork(works,state,options,userAction){this.userAction=userAction,this.works=works;let toState=PanoramaController.initAnimationEndState(Object.assign(Object.assign({},this),{initial:{currentState:Object.assign(Object.assign({},this.currentPano),this.camera.pose),duration:options.duration,effect:options.effect,state,userAction}}));return(toState.workCode!==this.currentPano.workCode||toState.panoIndex!==this.currentPano.panoIndex||toState.longitude!==this.cameraMotion.value.longitude||toState.latitude!==this.cameraMotion.value.latitude||toState.fov!==this.cameraMotion.value.fov)&&(this.initAnimationed=!1,this.moveToPano({workCode:toState.workCode,panoIndex:toState.panoIndex},{effect:options.effect,duration:options.duration,longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov,moveEndCallback:()=>{this.initAnimationed=!0},moveCancelCallback:()=>{this.initAnimationed=!0}},userAction)),!0}updateModel(modelScene){this.modelScene=modelScene,this.hideIntersectMesh()}syncPanoMeshHDRBoost(){let boost=this.modelScene.parameter.resolveValue(`useHDR`)?Math.max(this.modelScene.parameter.resolveValue(`maxDisplayBoost`),1):1;this.panoMeshes.forEach(panoMesh=>{var _a;(_a=panoMesh.setHDRBoost)==null||_a.call(panoMesh,boost)})}updateTime(time,deltaTime,...args){var _a,_b,_c,_d,_e,_f;if(this.destroyed)return;let uniforms={},cameraPose={},cameraDirection=this.camera.getDirection(new three_webgpu.Vector3),startKeyframe=this.locationMotion.keyframes[0],endKeyframe=this.locationMotion.keyframes[this.locationMotion.keyframes.length-1],[prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),prevResource=this.panoResourceFromLocationMotionKeyframe(prevKeyframe),nextResource=this.panoResourceFromLocationMotionKeyframe(nextKeyframe),startResource=this.panoResourceFromLocationMotionKeyframe(startKeyframe),endResource=this.panoResourceFromLocationMotionKeyframe(endKeyframe),fixedTransition=!1;if(this.cameraMotion.ended===!1&&(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),this.modelAlphaMotion.ended===!1&&(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.perspToOrthoMotion.ended===!1&&(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),this.locationMotion.ended===!1){this.locationMotion.update(time);let progress=this.locationMotion.value.count-nextKeyframe.value.count+1,prevPosition=new three_webgpu.Vector3().copy(prevResource.position),nextPosition=new three_webgpu.Vector3().copy(nextResource.position);if(uniforms.progress=nextResource.effectEasing(progress),progress>=.01&&progress<=.99&&(uniforms.progress=require_memoryUsage.M(nextResource.effectEasing(progress),.01,.99)),nextResource.panoPicture&&(progress<1?prevResource.panoPicture&&(uniforms.pano0=prevResource.panoPicture):uniforms.pano0=nextResource.panoPicture,uniforms.pano1=nextResource.panoPicture),nextResource.effect===`montage`?uniforms.transition=`BLACK`:nextResource.effect===`spread`?uniforms.transition=`SPREAD`:uniforms.transition=`FADE`,nextResource.effect===`zoomin`||nextResource.effect===`zoomout`?uniforms.progress=Math.pow(progress,3):nextResource.effect===`model`&&this.camera.pose.distance<.01&&(uniforms.modelAlpha=1-Math.pow(require_memoryUsage.M(Math.abs(progress-.5)*2,0,1),4)),progress<1&&nextResource.effect!==`fly`&&nextResource.effect!==`model`){if(uniforms.pano0&&prevResource.panoPicture){let panoPicture={panoId:uniforms.pano0.panoId,map:uniforms.pano0.map,mapHistogram:uniforms.pano0.mapHistogram,mapSize:uniforms.pano0.mapSize,zoom:uniforms.pano0.zoom,matrix:prevResource.panoPicture.matrix.clone().premultiply(prevResource.fixCameraTransform).setPosition(nextResource.position),gainmap:uniforms.pano0.gainmap?{map:uniforms.pano0.gainmap.map,cfg:Object.assign({},uniforms.pano0.gainmap.cfg)}:void 0},observer=this.panoPictureObserverMap.get(uniforms.pano0);observer&&this.panoPictureObserverMap.set(panoPicture,observer),uniforms.pano0=panoPicture}prevPosition.copy(nextPosition),fixedTransition=!0}cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(prevPosition.x+(nextPosition.x-prevPosition.x)*progress,prevPosition.y+(nextPosition.y-prevPosition.y)*progress,prevPosition.z+(nextPosition.z-prevPosition.z)*progress);let keyframeKeys=[],restKeyframeKeys=[];for(let keyframe of this.locationMotion.keyframes){let{key,progress}=keyframe;key!==void 0&&(keyframeKeys.push(key),progress>this.locationMotion.progress&&restKeyframeKeys.push(key))}for(let name of Object.keys(this.panoResources)){if(restKeyframeKeys.indexOf(name)>=0)continue;let panoResource=this.panoResources[name];if(panoResource.panoPicture){let texture=panoResource.panoPicture.map;if(texture){if(texture===((_a=uniforms.pano0)==null?void 0:_a.map)||texture===((_b=uniforms.pano1)==null?void 0:_b.map))continue;texture.dispose(),panoResource.panoPicture=null}}keyframeKeys.indexOf(name)>=0||delete this.panoResources[name]}let currentPano=panoParse(nextResource.panoId);currentPano!==this.currentPano&&(this.currentPano=currentPano,this.accessibleObserverFloorCheckCount=0),this.emit(`pano.moving`,createEvent(`pano.moving`,{userAction:this.userAction,prevPano:panoParse(startResource.panoId),state:Object.assign(Object.assign(Object.assign(Object.assign({},panoParse(endResource.panoId)),{mode:this.mode}),clonePose(this.camera.pose)),cameraPose),options:{},progress:this.locationMotion.progress,error:null}))}isEmptyObject(uniforms)===!1&&this.modelScene.parameter.set(uniforms),!this.modelScene.parameter.pano0&&this.modelScene.parameter.pano1&&this.modelScene.parameter.set(`pano0`,this.modelScene.parameter.pano1),isEmptyObject(cameraPose)===!1&&this.setCamera(cameraPose);let currentObserver=this.works.getObserver(this.currentPano),forwardObserver=this.locationMotion.ended?this.getForwardObserverOrNot(this.camera):null,prevObserver=this.works.getObserver(prevResource.panoId),nextObserver=this.works.getObserver(nextResource.panoId);if(this.adjustPanoCircleMeshPositionBasedOnModel&&this.helper.visible&¤tObserver){let accessibleObservers=[],observers=currentObserver.work.observers;for(let panoIndex of currentObserver.accessibleNodes){let observer=observers[panoIndex];observer&&accessibleObservers.push(observer)}let cache=new Map;if(accessibleObservers.sort((a,b)=>{let aDistance=cache.get(a);aDistance===void 0&&(aDistance=a.standingPosition.distanceTo(currentObserver.standingPosition),cache.set(a,aDistance));let bDistance=cache.get(a);return bDistance===void 0&&(bDistance=b.standingPosition.distanceTo(currentObserver.standingPosition),cache.set(b,bDistance)),aDistance-bDistance}),accessibleObservers.length){this.accessibleObserverFloorCheckCount%=accessibleObservers.length;let observer=accessibleObservers[this.accessibleObserverFloorCheckCount],model=this.modelScene.models.find(model=>model.work===(observer==null?void 0:observer.work));if(observer&&model&&model.visible){let maxOffset=.3,antiZFighting=.005,standingPosition=observer.standingPosition.clone().applyMatrix4(observer.work.transform),panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),positions=adjustPanoCircleMeshVectors.map(vector=>{scratchRaycaster.ray.origin.copy(standingPosition),scratchRaycaster.ray.origin.add(scratchVector3$2.copy(vector).setY(maxOffset)),scratchRaycaster.ray.direction.set(0,-1,0),scratchRaycaster.firstHitOnly=!0,scratchRaycaster.floorIndex=-1;let[intersect]=model.intersectRaycaster(scratchRaycaster);return intersect&&intersect.distance-antiZFighting<=maxOffset?new three_webgpu.Vector3().copy(standingPosition).setY(intersect.point.y+antiZFighting):standingPosition});positions.sort((a,b)=>b.y-a.y);let middleValue=positions[Math.floor(positions.length/2)],[position]=positions.filter(p=>p.distanceTo(middleValue)<=.05);if(position){let fixVector=new three_webgpu.Vector4(standingPosition.x,standingPosition.y,standingPosition.z,position.y-standingPosition.y),last=this.adjustPanoCircleMeshPositionFix.get(panoId);last&&!fixVector.equals(last)&&(this.needsRender=!0),this.adjustPanoCircleMeshPositionFix.set(panoId,fixVector)}}this.accessibleObserverFloorCheckCount++}}let visibleObserverMap=new Map;if(prevObserver)for(let panoIndex of prevObserver.accessibleNodes){let observer=prevObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(nextObserver)for(let panoIndex of nextObserver.accessibleNodes){let observer=nextObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(this.panoMeshes.forEach((panoMesh,panoId)=>{visibleObserverMap.get(panoId)?visibleObserverMap.delete(panoId):(this.helper.remove(panoMesh),panoMesh.dispose(),this.panoMeshes.delete(panoId))}),visibleObserverMap.forEach((observer,panoId)=>{let panoMesh=this.panoCircleMeshCreator(observer,{aerialObserverMinHeight:this.aerialObserverMinHeight});this.panoMeshes.set(panoId,panoMesh),this.helper.add(panoMesh),visibleObserverMap.delete(panoId)}),this.syncPanoMeshHDRBoost(),this.panoMeshes.forEach((panoMesh,panoId)=>{let observer=this.works.getObserver(panoId);if(observer){let isAerialPhoto=observer.position.distanceTo(observer.standingPosition)>this.aerialObserverMinHeight;if(isAerialPhoto)panoMesh.position.copy(observer.position).applyMatrix4(observer.work.transform),panoMesh.scale.setScalar(18);else{panoMesh.position.copy(observer.standingPosition).applyMatrix4(observer.work.transform);let fixVector=this.adjustPanoCircleMeshPositionFix.get(observer.panoId);fixVector&&(scratchVector3$2.set(fixVector.x,fixVector.y,fixVector.z),scratchVector3$2.equals(panoMesh.position)&&(panoMesh.position.y+=fixVector.w)),panoMesh.scale.setScalar(1.2)}let origin=this.camera.position.clone().setY(panoMesh.position.y),direction=new three_webgpu.Vector3().copy(panoMesh.position).sub(origin).normalize();if(panoId===panoStringify(this.currentPano)){let delta=require_memoryUsage.M((.5-origin.distanceTo(panoMesh.position))/.5,0,1);direction.multiplyScalar(1-delta).add(cameraDirection.clone().multiplyScalar(delta))}if(direction.length()>0){let rotateX=isAerialPhoto?-Math.PI/2:0,rotateY=Math.atan2(direction.x,direction.z);panoMesh.quaternion.setFromEuler(new three_webgpu.Euler(rotateX,rotateY,0,`YXZ`))}}else panoMesh.visible=!1}),this.camera.pose.distance>.1||fixedTransition)this.panoMeshes.forEach(panoMesh=>{panoMesh.setOpacity(0),panoMesh.setCurrent(!1),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime),panoMesh.visible=!1});else if(currentObserver){let observers=currentObserver.work.observers,[,minDistance]=arrayMin(currentObserver.accessibleNodes,panoIndex=>{let accessibleObserver=observers[panoIndex];return!accessibleObserver||!accessibleObserver.active?1/0:currentObserver.standingPosition.distanceTo(accessibleObserver.standingPosition)},!0);minDistance=require_memoryUsage.M(minDistance,3,1/0);let accessibleIds=currentObserver.accessibleNodes.concat(currentObserver.panoIndex).map(panoIndex=>panoStringify({panoIndex,workCode:currentObserver.work.workCode}));this.panoMeshes.forEach((panoMesh,panoId)=>{let observer=this.works.getObserver(panoId),current=!1,opacity=1;if(accessibleIds.indexOf(panoId)===-1)current=!1,opacity=0;else if(!observer)current=!1,opacity=0;else if(!observer.loadable&&!observer.active)current=!1,opacity=0;else{let screen=panoMesh.position.clone().project(this.camera);current=Math.abs(screen.x)<1&&Math.abs(screen.y)<1&&Math.abs(screen.z)<1&&!panoMesh.loading&&panoMesh.progress===0&&forwardObserver!==null&&panoStringify({panoIndex:forwardObserver.panoIndex,workCode:forwardObserver.work.workCode})===panoId;let distance=panoMesh.position.clone().setY(this.camera.position.y).distanceTo(this.camera.position);opacity=distance<.01?0:require_memoryUsage.M(minDistance/distance,.1,.85)}observer&&observer===nextObserver&&observer.position.distanceTo(observer.standingPosition)>this.aerialObserverMinHeight&&panoMesh.position.distanceTo(this.camera.position)<35&&(opacity=0),this.modelScene.parameter.resolveValue().modelAlpha>0&&(opacity=0),panoMesh.setCurrent(current),panoMesh.setOpacity(opacity),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime)})}{let progress=(_c=this.modelScene.parameter.progress)==null?1:_c,panoNumber=Math.round(progress),pano0=this.modelScene.parameter.pano0,pano1=this.modelScene.parameter.pano1,pano=panoNumber===0?pano0:pano1,observer;if(pano&&(observer=this.works.getObserver(pano.panoId),observer||(observer=this.panoPictureObserverMap.get(pano))),this.tiling.appearDuration=this.tileAppearDuration,this.tiling.maxRequest=progress<(require_imageBitmap.t()?.6:.99)?0:this.tileMaxRequest,this.tiling.imageOptions=this.imageOptions,!observer||!pano||this.tileLevelForFov===!1||this.camera.perspToOrtho.x>0){this.tiling.setObserver(null);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:null,panoGainmap:void 0,panoMatrix:new three_webgpu.Matrix4,panoZoom:1,minLevel:0,level:0};this.tiling.update(tilingFrameState),this.modelScene.parameter.set(`refinedScreen`,null)}else{let panoLevel=require_pick.o(pano.mapSize),minLevel=panoLevel+1,viewSize=new three_webgpu.Vector2().copy(this.camera.resolution).multiplyScalar(this.camera.pixelRatio),computedLevel=Math.floor(this.tileLevelForFov(this.camera.fov,viewSize)),level=computedLevel>panoLevel?computedLevel:0;this.tiling.setObserver(observer);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:pano.map,panoGainmap:pano.gainmap,panoMatrix:pano.matrix,panoZoom:pano.zoom,minLevel,level,useHDR:this.modelScene.parameter.resolveValue(`useHDR`),maxDisplayBoost:this.modelScene.parameter.resolveValue(`maxDisplayBoost`)},tilingUpdated=this.tiling.update(tilingFrameState),refinedScreen={map:this.tiling.renderTarget.texture,matrixInverse:this.tiling.camera.matrixWorldInverse,projectionMatrix:this.tiling.camera.projectionMatrix,pano:panoNumber,opacity:(pano0==null?void 0:pano0.panoId)===(pano1==null?void 0:pano1.panoId)?1:easeInQuart(Math.abs(((_d=this.modelScene.parameter.progress)==null?0:_d)-.5)*2)},prevRefinedScreen=this.modelScene.parameter.refinedScreen;(tilingUpdated||refinedScreen.pano!==(prevRefinedScreen==null?void 0:prevRefinedScreen.pano)||refinedScreen.opacity!==(prevRefinedScreen==null?void 0:prevRefinedScreen.opacity))&&this.modelScene.parameter.set(`refinedScreen`,refinedScreen)}}if(this.panoVideo.object.position.copy(this.camera.position),this.panoVideo.updateTime(time),currentObserver&¤tObserver.images.video&&(this.needsRender=!0),this.intersectMesh&&this.intersectMesh.parent&¤tObserver&¤tObserver.position.y-currentObserver.standingPosition.y>10){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1);{let effect=nextResource.effect,{pano0,pano1}=this.modelScene.parameter;if(pano0&&pano1&&pano0!==pano1&&(effect===`fly`||effect===`model`)&&this.flyEffectUseDepthBuffer){if(((_e=this.modelScene.parameter.pano0Depth)==null?void 0:_e.panoId)!==pano0.panoId||((_f=this.modelScene.parameter.pano1Depth)==null?void 0:_f.panoId)!==pano1.panoId){this.pano0DepthCubeRenderTarget?this.pano0DepthCubeRenderTarget.width!==512&&this.pano0DepthCubeRenderTarget.setSize(512,512):this.pano0DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1}),this.pano1DepthCubeRenderTarget?this.pano1DepthCubeRenderTarget.width!==512&&this.pano1DepthCubeRenderTarget.setSize(512,512):this.pano1DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1});let pano0Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano0DepthCubeRenderTarget);pano0Camera.matrix.copy(pano0.matrix),pano0Camera.matrixWorld.copy(pano0Camera.matrix),pano0Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano0Camera,500);let pano1Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano1DepthCubeRenderTarget);pano1Camera.matrix.copy(pano1.matrix),pano1Camera.matrixWorld.copy(pano1Camera.matrix),pano1Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano1Camera,500),this.modelScene.parameter.set({pano0Depth:{panoId:pano0.panoId,map:this.pano0DepthCubeRenderTarget.texture,mapSize:this.pano0DepthCubeRenderTarget.width,maxDepth:500},pano1Depth:{panoId:pano1.panoId,map:this.pano1DepthCubeRenderTarget.texture,mapSize:this.pano1DepthCubeRenderTarget.width,maxDepth:500}})}}else this.modelScene.parameter.set({pano0Depth:null,pano1Depth:null}),this.flyEffectUseDepthBuffer||(this.pano0DepthCubeRenderTarget&&(this.pano0DepthCubeRenderTarget.dispose(),this.pano0DepthCubeRenderTarget=void 0),this.pano1DepthCubeRenderTarget&&(this.pano1DepthCubeRenderTarget.dispose(),this.pano1DepthCubeRenderTarget=void 0))}}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1],nextResource=this.panoResourceFromLocationMotionKeyframe(targetLocationKeyFrame),nextObserver=this.works.getObserver(nextResource.panoId);return{workCode:nextObserver?nextObserver.work.workCode:this.currentPano.workCode,panoIndex:nextObserver?nextObserver.panoIndex:this.currentPano.panoIndex,mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,offset:nextObserver?nextObserver.position.clone().applyMatrix4(nextObserver.work.transform):this.camera.position.clone(),distance:this.locationMotion.value.distance}}moveToPano(pano,options,userAction){var _a,_b,_c;this.userAction=userAction,this.stopMomentumMovement();let panoId=panoStringify(pano),observer=this.works.getObserver(pano);if(!observer)throw Error(`Invalid PanoId ${JSON.stringify(pano)}`);let originImageSize=require_pick.a(observer.images.up),imageSize=this.imageOptions.size;imageSize===void 0&&observer&&originImageSize&&(imageSize=Number(originImageSize)),imageSize===void 0&&(imageSize=2048);let imageURLTransform=this.imageOptions.transform,imageURLOptions=Object.assign({key:`pano.${panoId}`},require_pick.r(this.imageOptions,[`format`,`size`,`quality`,`sharpen`,`forceUseExifOrientation`,`mappings`])),colorImageURLs={right:observer.images.work.getURL(observer.images.right),left:observer.images.work.getURL(observer.images.left),up:observer.images.work.getURL(observer.images.up),down:observer.images.work.getURL(observer.images.down),front:observer.images.work.getURL(observer.images.front),back:observer.images.work.getURL(observer.images.back)},gainmapImageURLs,gainmapConfigUrl,gainmap=this.enableHDR?observer.images.gainmap:void 0;gainmap&&(gainmapImageURLs={right:observer.images.work.getURL(gainmap.right),left:observer.images.work.getURL(gainmap.left),up:observer.images.work.getURL(gainmap.up),down:observer.images.work.getURL(gainmap.down),front:observer.images.work.getURL(gainmap.front),back:observer.images.work.getURL(gainmap.back)},gainmapConfigUrl=observer.images.work.getURL(gainmap.cfg));let hash=`pano:`+jsonHash([colorImageURLs,gainmapImageURLs,imageURLOptions]);if(this.pendingTextureTask){if(this.pendingTextureTask.hash===hash)return;{let panoId=this.pendingTextureTask.panoId;(_a=this.panoMeshes.get(panoId))==null||_a.setProgress(0),this.emit(`pano.texture.abort`,createEvent(`pano.texture.abort`,{error:null,progress:0,meta:null,pano:{panoIndex:observer.panoIndex,workCode:observer.work.workCode}}))}}let pendingKey=`move-to-pano-`+panoId;this.pending.add(pendingKey);let event=createExtendableEvent(`pano.prepare`,{options,prevMode:this.mode,prevPano:this.currentPano,pano});if(this.emit(`pano.prepare`,event),event.defaultPrevented){this.pending.delete(pendingKey);return}event.options!==options&&Object.assign(options,event.options);let effect=(_b=options.effect)==null?`fly`:_b,parameter=this.modelScene.parameter,existsPano;if(parameter.pano0&¶meter.pano0.map.name===hash?existsPano=parameter.pano0:parameter.pano1&¶meter.pano1.map.name===hash&&(existsPano=parameter.pano1),existsPano){let panoResource={panoId,effect,effectEasing:(_c=options.effectEasing)==null?defaultEffectEase:_c,panoPicture:{panoId:existsPano.panoId,map:existsPano.map,mapHistogram:existsPano.mapHistogram,mapSize:existsPano.mapSize,matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap:existsPano.gainmap?{map:existsPano.gainmap.map,cfg:Object.assign({},existsPano.gainmap.cfg)}:void 0},position:observer.position.clone().applyMatrix4(observer.work.transform),fixCameraTransform:new three_webgpu.Matrix4};panoResource.panoPicture&&this.panoPictureObserverMap.set(panoResource.panoPicture,observer),this.pendingTextureTask=void 0,Promise.resolve().then(()=>waitForExtendableEvent(event)).then(()=>{require_imageBitmap.s.shared.add(()=>{this.pending.delete(pendingKey),this.doMoveToPano(pano,panoResource,options)},!0,1)}).catch(error_=>{var _a;let error=toError(error_),state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`pano.error`,createEvent(`pano.error`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`pano.cancel`,createEvent(`pano.cancel`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`error`,error),options.moveCancelCallback&&options.moveCancelCallback(),this.pending.delete(pendingKey),this.pendingTextureTask=void 0,(_a=this.panoMeshes.get(panoId))==null||_a.setProgress(0)});return}this.pendingTextureTask={panoId,hash,onLoad:(colorResponse,gainmap)=>(0,tslib.__awaiter)(this,void 0,void 0,function*(){var _a,_b;let texture=colorResponse.body;if(this.destroyed)texture.dispose();else{texture.name=hash;let image=Array.isArray(texture.image)?texture.image[0]:texture.image,mapSize=(_a=image==null?void 0:image.width)==null?2048:_a,{data}=yield getRgbaDataFromCubeTexture(this.renderer,texture,!0,sharedHistogramRgbaData),mapHistogram=new Histogram().formPixels(data),panoResource={panoId,effect,effectEasing:(_b=options.effectEasing)==null?defaultEffectEase:_b,panoPicture:{panoId,map:texture,mapSize,mapHistogram:new three_webgpu.Vector4().fromArray(mapHistogram.toArray()),matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap},position:observer.position.clone().applyMatrix4(observer.work.transform),fixCameraTransform:new three_webgpu.Matrix4};panoResource.panoPicture&&this.panoPictureObserverMap.set(panoResource.panoPicture,observer),this.doMoveToPano(pano,panoResource,options)}}),onError:error=>{let state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`pano.error`,createEvent(`pano.error`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`pano.cancel`,createEvent(`pano.cancel`,{error,userAction:this.userAction,options,prevPano:this.currentPano,progress:0,state})),this.emit(`error`,error),options.moveCancelCallback&&options.moveCancelCallback()}};let panoMesh=this.panoMeshes.get(panoId);panoMesh&&panoMesh.tap&&panoMesh.tap();let colorTextureTask=this.textureLoader.loadCubeTexture(colorImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,percent=>{var _a,_b;this.emit(`pano.texture.progress`,createEvent(`pano.texture.progress`,{error:null,progress:percent,meta:null,pano})),((_a=this.pendingTextureTask)==null?void 0:_a.hash)===hash&&((_b=this.panoMeshes.get(panoId))==null||_b.setProgress(percent))},this.renderer),gainmapTask=gainmapConfigUrl&&gainmapImageURLs?Promise.all([getFetcher(this.fiveId,observer.work).ajax(gainmapConfigUrl,{responseType:`text`}).then(response=>require_memoryUsage.A(JSON.parse(response.body))),this.textureLoader.loadCubeTexture(gainmapImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,colorSpace:three_webgpu.NoColorSpace,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer)]).then(([config,response])=>({config,map:response.body})):Promise.resolve(void 0),prepareTask=Promise.resolve().then(()=>waitForExtendableEvent(event)).then(()=>null).catch(error_=>toError(error_));Promise.all([colorTextureTask,gainmapTask,prepareTask]).then(([colorResponse,gainmap,prepareError])=>{var _a,_b,_c,_d;if(this.pending.delete(pendingKey),prepareError){colorResponse.body.dispose(),((_a=this.pendingTextureTask)==null?void 0:_a.hash)===hash&&(this.pendingTextureTask.onError(prepareError),this.pendingTextureTask=void 0,(_b=this.panoMeshes.get(panoId))==null||_b.setProgress(0));return}((_c=this.pendingTextureTask)==null?void 0:_c.hash)===hash?(this.pendingTextureTask.onLoad(colorResponse,gainmap?{map:gainmap.map,cfg:gainmap.config}:void 0),this.pendingTextureTask=void 0,(_d=this.panoMeshes.get(panoId))==null||_d.setProgress(0)):colorResponse.body.dispose(),this.emit(`pano.texture.success`,createEvent(`pano.texture.success`,{error:null,progress:1,meta:colorResponse.meta,pano}))}).catch(error=>{var _a,_b;this.pending.delete(pendingKey),((_a=this.pendingTextureTask)==null?void 0:_a.hash)===hash&&(this.pendingTextureTask.onError(error),this.pendingTextureTask=void 0,(_b=this.panoMeshes.get(panoId))==null||_b.setProgress(0)),this.emit(`pano.texture.error`,createEvent(`pano.texture.error`,{error,progress:0,meta:null,pano})),this.emit(`error`,error)}),this.emit(`pano.texture.load`,createEvent(`pano.texture.load`,{error:null,progress:0,meta:null,pano}))}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{duration,effect,userAction}=this.initial;this.userAction=userAction;let toState=PanoramaController.initAnimationEndState(this),pano={workCode:toState.workCode,panoIndex:toState.panoIndex},modelAlphaValue={modelAlpha:0},perspToOrthoValue={perspToOrtho:0},started=!1;this.moveToPano(pano,{longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov,effect,duration,moveStartCallback:state=>{started=!0,this.perspToOrthoMotion.set(perspToOrthoValue,duration).catch(require_memoryUsage.d),this.modelAlphaMotion.setKeyframes([{progress:0,value:Object.assign({},this.modelAlphaMotion.value)},{progress:.6,value:Object.assign({},this.modelAlphaMotion.value)},{progress:1,value:modelAlphaValue}],duration).catch(require_memoryUsage.d),this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state,userAction:this.userAction}))},moveEndCallback:state=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),this.initAnimationed=!0,resolve()},moveCancelCallback:()=>{let state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));started===!1&&this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state,userAction:this.userAction})),this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),this.initAnimationed=!0,resolve()}},userAction)})}panoResourceFromLocationMotionKeyframe(keyframe){return this.panoResources[keyframe.key]}locationMotionKeyframesLength(keyframes){let length=0;for(let i=1;i<keyframes.length;i++){let prevPostion=this.panoResourceFromLocationMotionKeyframe(keyframes[i-1]).position,nextPostion=this.panoResourceFromLocationMotionKeyframe(keyframes[i]).position,distance=prevPostion.distanceTo(nextPostion)*(keyframes[i].value.count-keyframes[i-1].value.count);length+=distance}return length}doMoveToPano(pano,panoResource,options={}){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l;let time=require_memoryUsage.p(),key=require_memoryUsage.N();this.panoResources[key]=panoResource;let distance,keyframes,startVeloProgresscity;if(this.locationMotion.ended){let[_prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),locationValue=this.locationMotion.value,nextPostion=((_a=this.panoResourceFromLocationMotionKeyframe(nextKeyframe))==null?this.camera:_a).position,targetPosition=panoResource.position;distance=Math.max(nextPostion.distanceTo(targetPosition),1),keyframes=[{key:nextKeyframe.key,progress:0,value:Object.assign(Object.assign({},locationValue),{count:0})},{key,progress:1,value:{distance:0,count:1}}],startVeloProgresscity=0}else{let[prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),locationValue=this.locationMotion.value,prevPostion=this.panoResourceFromLocationMotionKeyframe(prevKeyframe).position,nextPostion=this.panoResourceFromLocationMotionKeyframe(nextKeyframe).position,targetPosition=panoResource.position,distance1Progress=nextKeyframe.value.count-locationValue.count,distance1=Math.max(prevPostion.distanceTo(nextPostion),1)*distance1Progress;distance=distance1+Math.max(nextPostion.distanceTo(targetPosition),1),keyframes=[{key:prevKeyframe.key,progress:0,value:Object.assign({},locationValue)},{key:nextKeyframe.key,progress:distance1/distance,value:nextKeyframe.value},{key,progress:1,value:{count:nextKeyframe.value.count+1,distance:0}}];let prevKeyframesLength=this.locationMotionKeyframesLength(this.locationMotion.keyframes),nextKeyframesLength=this.locationMotionKeyframesLength(keyframes);startVeloProgresscity=prevKeyframesLength===0||prevKeyframesLength===0?0:this.locationMotion.getProgressVelocity(time)*prevKeyframesLength/nextKeyframesLength}let animationDuration=panoResource.effect===`instant`?0:this.calculateMovingDuration(options.duration,panoResource.effect===`fly`||panoResource.effect===`model`?distance:0),cameraPose={longitude:options.longitude,latitude:options.latitude,fov:options.fov},state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:(_b=cameraPose.longitude)==null?this.camera.pose.longitude:_b,latitude:(_c=cameraPose.latitude)==null?this.camera.pose.latitude:_c,fov:(_d=cameraPose.fov)==null?this.camera.pose.fov:_d,offset:panoResource.position.clone(),distance:this.camera.pose.distance}),prevPano=this.currentPano;if(this.emit(`pano.moveTo`,createEvent(`pano.moveTo`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveStartCallback&&options.moveStartCallback(state),this.videoTexture&&this.videoTexture.image instanceof HTMLVideoElement&&this.videoTexture.image.getAttribute(`src`)&&(this.videoTexture.image.pause(),this.videoTexture.image.removeAttribute(`uuid`),this.videoTexture.image.removeAttribute(`src`),this.videoTexture.image.oncanplay=require_memoryUsage.d,this.videoTexture.needsUpdate=!0),this.panoVideo.setMaterial(null),panoResource.effect===`fly`||panoResource.effect===`model`)this.cameraMotion.set(cameraPose,animationDuration).catch(require_memoryUsage.d);else{let prevVector=coordinatesToVector({longitude:this.cameraMotion.value.longitude,latitude:this.cameraMotion.value.latitude}),nextVector=coordinatesToVector({longitude:(_e=cameraPose.longitude)==null?this.cameraMotion.value.longitude:_e,latitude:(_f=cameraPose.latitude)==null?this.cameraMotion.value.latitude:_f}),object=new three_webgpu.Object3D;object.lookAt(prevVector);let prevMatrix=new three_webgpu.Matrix4().makeRotationFromQuaternion(object.quaternion);object.lookAt(nextVector);let nextMatrix=new three_webgpu.Matrix4().makeRotationFromQuaternion(object.quaternion),cameraTransitionMatrix=prevMatrix.clone().invert().premultiply(nextMatrix),prevFov=this.cameraMotion.value.fov,endFov=(_g=cameraPose.fov)==null?this.cameraMotion.value.fov:_g,fovScale=1;panoResource.effect===`zoomin`?fovScale=1.5:panoResource.effect===`zoomout`&&(fovScale=.4);let startFov=require_memoryUsage.M(endFov*fovScale,1,170);for(let i=0;i<keyframes.length-1;i++){let key=keyframes[i].key;if(key){let panoResource=this.panoResources[key];panoResource&&(panoResource.fixCameraTransform.copy(cameraTransitionMatrix),panoResource.panoPicture&&(panoResource.panoPicture.zoom=Math.tan(startFov/2/180*Math.PI)/Math.tan(prevFov/2/180*Math.PI)))}}this.cameraMotion.setKeyframes([{progress:0,value:{longitude:this.cameraMotion.value.longitude,latitude:this.cameraMotion.value.latitude,fov:this.cameraMotion.value.fov}},{progress:0,value:{longitude:(_h=cameraPose.longitude)==null?this.cameraMotion.value.longitude:_h,latitude:(_j=cameraPose.latitude)==null?this.cameraMotion.value.latitude:_j,fov:startFov}},{progress:1,value:{longitude:(_k=cameraPose.longitude)==null?this.cameraMotion.value.longitude:_k,latitude:(_l=cameraPose.latitude)==null?this.cameraMotion.value.latitude:_l,fov:endFov}}],animationDuration).catch(require_memoryUsage.d)}this.locationMotion.setKeyframes(keyframes,animationDuration,startVeloProgresscity).then(()=>{for(let model of this.modelScene.children)model instanceof Model&&model.show();let state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance});this.emit(`pano.arrived`,createEvent(`pano.arrived`,{options,prevPano,progress:1,state,userAction:this.userAction,error:null})),options.moveEndCallback&&options.moveEndCallback(state);let currentObserver=this.works.getObserver(pano);if(currentObserver&¤tObserver.images.video&&this.videoTexture&&this.videoTexture.image instanceof HTMLVideoElement){let panoVideoValue={map:this.videoTexture,size:currentObserver.images.video.size.clone(),matrix:currentObserver.images.video.matrix.clone(),panoMatrix:currentObserver.matrix.clone().premultiply(currentObserver.work.transform),alpha:1},playId=require_memoryUsage.N(),video=this.videoTexture.image;video.setAttribute(`uuid`,playId),video.oncanplay=require_memoryUsage.d,video.ontimeupdate=require_memoryUsage.d,canplayVideo().then(canplay=>{canplay&¤tObserver.images.video&&video.getAttribute(`uuid`)===playId&&(video.oncanplay=()=>{video.oncanplay=require_memoryUsage.d,video.play()},video.ontimeupdate=()=>{video.currentTime>.5&&(video.ontimeupdate=require_memoryUsage.d,this.panoVideo.setMaterial(panoVideoValue))},video.src=currentObserver.images.video.source)}).catch((()=>{video.removeAttribute(`uuid`)}))}else{let video=this.videoTexture.image;video.removeAttribute(`uuid`),video.oncanplay=require_memoryUsage.d,video.ontimeupdate=require_memoryUsage.d}},()=>{this.emit(`pano.cancel`,createEvent(`pano.cancel`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveCancelCallback&&options.moveCancelCallback()})}getForwardObserverOrNot(camera,raycaster){let currentObserver=this.works.getObserver(this.currentPano);if(!currentObserver)return null;let rawRaycaster=raycaster==null?new three_webgpu.Raycaster(camera.position.clone(),camera.getWorldDirection(new three_webgpu.Vector3)):raycaster;rawRaycaster.params.Points={threshold:.1},rawRaycaster.firstHitOnly=!0,rawRaycaster.floorIndex=-1;let groundPosition=currentObserver.standingPosition.clone().applyMatrix4(currentObserver.work.transform);if(currentObserver.position.clone().applyMatrix4(currentObserver.work.transform).distanceTo(rawRaycaster.ray.origin)>1){let raycaster=new three_webgpu.Raycaster(rawRaycaster.ray.origin,new three_webgpu.Vector3(0,-1,0));raycaster.firstHitOnly=rawRaycaster.firstHitOnly,raycaster.floorIndex=rawRaycaster.floorIndex;let[groundIntersect]=this.modelScene.intersectRaycaster(raycaster);groundIntersect&&groundIntersect.distance<=2?groundPosition.copy(groundIntersect.point):groundPosition.copy(rawRaycaster.ray.origin).add(new three_webgpu.Vector3(0,-1.5,0))}let[rawForwardIntersect]=this.modelScene.intersectRaycaster(rawRaycaster),forwordDirection=(rawForwardIntersect?rawForwardIntersect.point:rawRaycaster.ray.origin.clone().add(rawRaycaster.ray.direction.clone().normalize().multiplyScalar(3))).clone().sub(groundPosition).normalize();if(forwordDirection.length()===0)return null;let observers=currentObserver.work.observers,accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];if(!observer)return!1;let screen=observer.standingPosition.clone().applyMatrix4(observer.work.transform).project(camera);return Math.abs(screen.z)>1||Math.abs(screen.x)>1||Math.abs(screen.y)>1?!1:observer.loadable||observer.active}),cache=new Map,accessibleIdsOrder=accessibleNodes.slice().sort((a,b)=>{let aObserver=observers[a],aDistance=cache.get(aObserver);aDistance===void 0&&(aDistance=scratchVector3$2.copy(aObserver.standingPosition).applyMatrix4(aObserver.work.transform).distanceTo(groundPosition),cache.set(aObserver,aDistance));let bObserver=observers[b],bDistance=cache.get(bObserver);return bDistance===void 0&&(bDistance=scratchVector3$2.copy(bObserver.standingPosition).applyMatrix4(bObserver.work.transform).distanceTo(groundPosition),cache.set(bObserver,bDistance)),aDistance-bDistance});cache.clear();for(let range of[Math.PI/8,Math.PI/6,Math.PI/4,Math.PI/3])for(let panoIndex of accessibleIdsOrder){let observer=observers[panoIndex];if(observer){let vector=scratchVector3$2.copy(observer.standingPosition).applyMatrix4(observer.work.transform).sub(groundPosition);if(vector&&vector.length()!==0&&forwordDirection.angleTo(vector)<range)return observer}}let screenPosition=null;if(raycaster){let target=raycaster.ray.intersectBox(this.modelScene.boundingBox,scratchVector3$2);target&&(target.project(camera),Math.abs(target.z)<=1&&(screenPosition=target.clone()))}else screenPosition=new three_webgpu.Vector3(0,0,0);if(screenPosition){let accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];if(!observer)return!1;let screen=observer.position.clone().applyMatrix4(observer.work.transform).project(camera);return Math.abs(screen.z)>1||Math.abs(screen.x)>1||Math.abs(screen.y)>1?!1:observer.loadable||observer.active}),cache=new Map,accessibleIdsOrder=accessibleNodes.slice().sort((a,b)=>{let aObserver=observers[a],aDistance=cache.get(aObserver);aDistance===void 0&&(aDistance=scratchVector3$2.copy(aObserver.position).applyMatrix4(aObserver.work.transform).distanceTo(camera.position),cache.set(aObserver,aDistance));let bObserver=observers[b],bDistance=cache.get(bObserver);return bDistance===void 0&&(bDistance=scratchVector3$2.copy(bObserver.position).applyMatrix4(bObserver.work.transform).distanceTo(camera.position),cache.set(bObserver,bDistance)),aDistance-bDistance});cache.clear();for(let panoIndex of accessibleIdsOrder){let observer=observers[panoIndex];if(observer){let target=scratchVector3$2.copy(observer.position).applyMatrix4(observer.work.transform);if(target.project(camera),Math.abs(target.z)>1)continue;if(Math.pow(screenPosition.x-target.x,2)+Math.pow(screenPosition.y-target.y,2)<Math.pow(.4,2))return observer}}}return null}onTapGesture(event){var _a;if(this.userAction=event.userAction,this.stopMomentumMovement(),!this.initAnimationed)return;let raycaster=event.center.raycaster;raycaster.floorIndex=-1;let cameraDirection=this.camera.getDirection(new three_webgpu.Vector3).setY(0),nextObserver=null,currentObserver=this.works.getObserver(this.currentPano);if(!currentObserver)return;let observers=currentObserver.work.observers,accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];return!observer||scratchVector3$2.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(this.camera.position)>this.maxAccessibleDistance?!1:observer.loadable||observer.active}),[intersection]=this.modelScene.intersectRaycaster(raycaster);if(intersection){let[panoIndex,distance]=arrayMin(accessibleNodes,panoIndex=>{let accessibleObserver=observers[panoIndex];return accessibleObserver?scratchVector3$2.copy(accessibleObserver.standingPosition).applyMatrix4(accessibleObserver.work.transform).distanceTo(intersection.point):1/0},!0);typeof panoIndex==`number`&&distance<this.panoTapTriggerRadius&&(nextObserver=(_a=observers[panoIndex])==null?null:_a)}if(nextObserver||(nextObserver=this.getForwardObserverOrNot(this.camera,raycaster)),nextObserver&&nextObserver.panoId===panoStringify(this.currentPano)&&(nextObserver=null),nextObserver&&!this.locationMotion.ended){for(let keyframe of this.locationMotion.keyframes)if(this.panoResourceFromLocationMotionKeyframe(keyframe).panoId===nextObserver.panoId){nextObserver=null;break}}if(!nextObserver)this.emit(`gesture.tap`,event),event.defaultPrevented||this.locationMotion.ended===!0&&this.cameraBounce();else{let options={},rangeAngle=Math.PI/6,skipAngle=Math.PI/12,frontDirection=nextObserver.position.clone().applyMatrix4(nextObserver.work.transform).setY(0).sub(currentObserver.position.clone().applyMatrix4(nextObserver.work.transform).setY(0)).normalize(),leftVectors=[],rightVectors=[],frontVectors=[],observers=nextObserver.work.observers;for(let panoIndex of nextObserver.accessibleNodes){if(nextObserver.panoIndex===panoIndex||panoIndex===this.currentPano.panoIndex&&nextObserver.work.workCode===this.currentPano.workCode)continue;let targetObserver=observers[panoIndex];if(!targetObserver)continue;let targetVector=targetObserver.position.clone().applyMatrix4(targetObserver.work.transform).sub(nextObserver.position.clone().applyMatrix4(nextObserver.work.transform)).setY(0).normalize();frontDirection.angleTo(targetVector)<rangeAngle&&frontVectors.push(targetVector)}let[targetVector]=(frontVectors.length>0?frontVectors:[...leftVectors,...rightVectors]).slice().sort((a,b)=>a.angleTo(frontDirection)-b.angleTo(frontDirection));if(targetVector&&targetVector.angleTo(cameraDirection)>skipAngle&&(options.longitude=Math.atan2(-targetVector.x,-targetVector.z)),this.cameraMotion.value.latitude<-Math.PI/4){let fov=event.state.fov;options.latitude=require_memoryUsage.M(0,require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2))}let state=Object.assign({},event.state);if(state.workCode=nextObserver.work.workCode,state.panoIndex=nextObserver.panoIndex,options.longitude!==void 0&&(state.longitude=options.longitude),options.latitude!==void 0&&(state.latitude=options.latitude),options.fov!==void 0&&(state.fov=options.fov),state.distance=0,state.offset=nextObserver.position.clone(),event.state=state,this.emit(`gesture.tap`,event),!event.defaultPrevented){if(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:event.userAction,options,progress:0,error:null})),nextObserver&&!nextObserver.active){let nextPanoId=panoStringify({panoIndex:nextObserver.panoIndex,workCode:nextObserver.work.workCode}),nextPanoMesh=this.panoMeshes.get(nextPanoId);nextPanoMesh&&(nextPanoMesh.setDisabled(!1),nextPanoMesh.setLoading(!0))}nextObserver&&nextObserver.active&&this.emit(`pano.request`,createEvent(`pano.request`,{userAction:event.userAction,prevPano:this.currentPano,progress:0,state,options,error:null}))}}}},DEG_TO_RAD=Math.PI/180,RAD_TO_DEG=180/Math.PI,MIN_TIMESTEP=.001,MAX_TIMESTEP=1,isIOS=(()=>{let isIOS=typeof navigator<`u`&&/iPad|iPhone|iPod/.test(navigator.platform);return()=>isIOS})(),isSafari=(()=>{let isSafari=typeof navigator<`u`&&/^((?!chrome|android).)*safari/i.test(navigator.userAgent);return()=>isSafari})(),isFirefoxAndroid=(()=>{let isFirefoxAndroid=typeof navigator<`u`&&navigator.userAgent.indexOf(`Firefox`)!==-1&&navigator.userAgent.indexOf(`Android`)!==-1;return()=>isFirefoxAndroid})(),getChromeVersion=(()=>{let match=typeof navigator<`u`?navigator.userAgent.match(/.*Chrome\/([0-9]+)/):null,value=match?parseInt(match[1],10):null;return()=>value})(),isChromeWithoutDeviceMotion=(()=>{let value=!1;if(getChromeVersion()===65){let match=typeof navigator<`u`?navigator.userAgent.match(/.*Chrome\/([0-9\.]*)/):null;if(match){let[major,minor,branch,build]=match[1].split(`.`);value=parseInt(branch,10)===3325&&parseInt(build,10)<148}}return()=>value})(),isSafariWithoutDeviceMotion=(()=>{let value=isIOS()&&isSafari()&&typeof navigator<`u`&&navigator.userAgent.indexOf(`13_4`)!==-1;return()=>value})(),isR7=(()=>{let isR7=typeof navigator<`u`&&navigator.userAgent.indexOf(`R7 Build`)!==-1;return()=>isR7})();function isLandscapeMode(){let rtn=typeof window<`u`&&(window.orientation==90||window.orientation==-90);return isR7()?!rtn:rtn}function isTimestampDeltaValid(timestampDeltaS){return!(isNaN(timestampDeltaS)||timestampDeltaS<=MIN_TIMESTEP||timestampDeltaS>MAX_TIMESTEP)}function getQuaternionAngle(quat){return quat.w>1?0:2*Math.acos(quat.w)}var warnOnce=(()=>{let observedWarnings={};return(key,message)=>{observedWarnings[key]===void 0&&(console.warn(`cardboard: `+message),observedWarnings[key]=!0)}})();function getOriginFromUrl(url){let domainIdx,protoSepIdx=url.indexOf(`://`);domainIdx=protoSepIdx===-1?0:protoSepIdx+3;let domainEndIdx=url.indexOf(`/`,domainIdx);return domainEndIdx===-1&&(domainEndIdx=url.length),url.substring(0,domainEndIdx)}function isInsideCrossOriginIFrame(){if(typeof window>`u`||typeof document>`u`)return!1;let isFramed=window.self!==window.top,refOrigin=getOriginFromUrl(document.referrer),thisOrigin=getOriginFromUrl(window.location.href);return isFramed&&refOrigin!==thisOrigin}var updateEyeViewMatrices=(()=>{function mat4_fromRotationTranslation(out,q,v){let x=q?q[0]:0,y=q?q[1]:0,z=q?q[2]:0,w=q?q[3]:1,x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;return out[0]=1-(yy+zz),out[1]=xy+wz,out[2]=xz-wy,out[3]=0,out[4]=xy-wz,out[5]=1-(xx+zz),out[6]=yz+wx,out[7]=0,out[8]=xz+wy,out[9]=yz-wx,out[10]=1-(xx+yy),out[11]=0,out[12]=v?v[0]:0,out[13]=v?v[1]:0,out[14]=v?v[2]:0,out[15]=1,out}function mat4_translate(out,a,v){let x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;return a===out?(out[12]=a[0]*x+a[4]*y+a[8]*z+a[12],out[13]=a[1]*x+a[5]*y+a[9]*z+a[13],out[14]=a[2]*x+a[6]*y+a[10]*z+a[14],out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]):(a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],out[0]=a00,out[1]=a01,out[2]=a02,out[3]=a03,out[4]=a10,out[5]=a11,out[6]=a12,out[7]=a13,out[8]=a20,out[9]=a21,out[10]=a22,out[11]=a23,out[12]=a00*x+a10*y+a20*z+a[12],out[13]=a01*x+a11*y+a21*z+a[13],out[14]=a02*x+a12*y+a22*z+a[14],out[15]=a03*x+a13*y+a23*z+a[15]),out}function mat4_invert(out,a){let a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;return det?(det=1/det,out[0]=(a11*b11-a12*b10+a13*b09)*det,out[1]=(a02*b10-a01*b11-a03*b09)*det,out[2]=(a31*b05-a32*b04+a33*b03)*det,out[3]=(a22*b04-a21*b05-a23*b03)*det,out[4]=(a12*b08-a10*b11-a13*b07)*det,out[5]=(a00*b11-a02*b08+a03*b07)*det,out[6]=(a32*b02-a30*b05-a33*b01)*det,out[7]=(a20*b05-a22*b02+a23*b01)*det,out[8]=(a10*b10-a11*b08+a13*b06)*det,out[9]=(a01*b08-a00*b10-a03*b06)*det,out[10]=(a30*b04-a31*b02+a33*b00)*det,out[11]=(a21*b02-a20*b04-a23*b00)*det,out[12]=(a11*b07-a10*b09-a12*b06)*det,out[13]=(a00*b09-a01*b07+a02*b06)*det,out[14]=(a31*b01-a30*b03-a32*b00)*det,out[15]=(a20*b03-a21*b01+a22*b00)*det,out):null}return(view,orientation,offset)=>{mat4_fromRotationTranslation(view,orientation),offset&&mat4_translate(view,view,offset),mat4_invert(view,view)}})(),SensorSample=class{constructor(sample=new three_webgpu.Vector3,timestampS=0){this.sample=sample,this.timestampS=timestampS}set(sample,timestampS){this.sample=sample,this.timestampS=timestampS}copy(sensorSample){this.set(sensorSample.sample,sensorSample.timestampS)}},ComplementaryFilter=class{constructor(kFilter,isDebug){this.kFilter=kFilter,this.isDebug=isDebug,this.currentAccelMeasurement=new SensorSample,this.currentGyroMeasurement=new SensorSample,this.previousGyroMeasurement=new SensorSample,isIOS()?this.filterQ=new three_webgpu.Quaternion(-1,0,0,1):this.filterQ=new three_webgpu.Quaternion(1,0,0,1),this.previousFilterQ=new three_webgpu.Quaternion,this.previousFilterQ.copy(this.filterQ),this.accelQ=new three_webgpu.Quaternion,this.isOrientationInitialized=!1,this.estimatedGravity=new three_webgpu.Vector3,this.measuredGravity=new three_webgpu.Vector3,this.gyroIntegralQ=new three_webgpu.Quaternion}addAccelMeasurement(vector,timestampS){this.currentAccelMeasurement.set(vector,timestampS)}addGyroMeasurement(vector,timestampS){this.currentGyroMeasurement.set(vector,timestampS),isTimestampDeltaValid(timestampS-this.previousGyroMeasurement.timestampS)&&this.run_(),this.previousGyroMeasurement.copy(this.currentGyroMeasurement)}getOrientation(){return this.filterQ}run_(){if(!this.isOrientationInitialized){this.accelQ=this.accelToQuaternion_(this.currentAccelMeasurement.sample),this.previousFilterQ.copy(this.accelQ),this.isOrientationInitialized=!0;return}let deltaT=this.currentGyroMeasurement.timestampS-this.previousGyroMeasurement.timestampS,gyroDeltaQ=this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample,deltaT);this.gyroIntegralQ.multiply(gyroDeltaQ),this.filterQ.copy(this.previousFilterQ),this.filterQ.multiply(gyroDeltaQ);let invFilterQ=new three_webgpu.Quaternion;invFilterQ.copy(this.filterQ),invFilterQ.invert(),this.estimatedGravity.set(0,0,-1),this.estimatedGravity.applyQuaternion(invFilterQ),this.estimatedGravity.normalize(),this.measuredGravity.copy(this.currentAccelMeasurement.sample),this.measuredGravity.normalize();let deltaQ=new three_webgpu.Quaternion;deltaQ.setFromUnitVectors(this.estimatedGravity,this.measuredGravity),deltaQ.invert(),this.isDebug&&console.log(`Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)`,RAD_TO_DEG*getQuaternionAngle(deltaQ),this.estimatedGravity.x.toFixed(1),this.estimatedGravity.y.toFixed(1),this.estimatedGravity.z.toFixed(1),this.measuredGravity.x.toFixed(1),this.measuredGravity.y.toFixed(1),this.measuredGravity.z.toFixed(1));let targetQ=new three_webgpu.Quaternion;targetQ.copy(this.filterQ),targetQ.multiply(deltaQ),this.filterQ.slerp(targetQ,1-this.kFilter),this.previousFilterQ.copy(this.filterQ)}accelToQuaternion_(accel){let normAccel=new three_webgpu.Vector3;normAccel.copy(accel),normAccel.normalize();let quat=new three_webgpu.Quaternion;return quat.setFromUnitVectors(new three_webgpu.Vector3(0,0,-1),normAccel),quat.invert(),quat}gyroToQuaternionDelta_(gyro,dt){let quat=new three_webgpu.Quaternion,axis=new three_webgpu.Vector3;return axis.copy(gyro),axis.normalize(),quat.setFromAxisAngle(axis,gyro.length()*dt),quat}},PosePredictor=class{constructor(predictionTimeS,isDebug){this.predictionTimeS=predictionTimeS,this.isDebug=isDebug,this.previousQ=new three_webgpu.Quaternion,this.previousTimestampS=null,this.deltaQ=new three_webgpu.Quaternion,this.outQ=new three_webgpu.Quaternion}getPrediction(currentQ,gyro,timestampS){if(!this.previousTimestampS)return this.previousQ.copy(currentQ),this.previousTimestampS=timestampS,currentQ;let axis=new three_webgpu.Vector3;axis.copy(gyro),axis.normalize();let angularSpeed=gyro.length();if(angularSpeed<DEG_TO_RAD*20)return this.isDebug&&console.log(`Moving slowly, at %s deg/s: no prediction`,(RAD_TO_DEG*angularSpeed).toFixed(1)),this.outQ.copy(currentQ),this.previousQ.copy(currentQ),this.outQ;let predictAngle=angularSpeed*this.predictionTimeS;return this.deltaQ.setFromAxisAngle(axis,predictAngle),this.outQ.copy(this.previousQ),this.outQ.multiply(this.deltaQ),this.previousQ.copy(currentQ),this.previousTimestampS=timestampS,this.outQ}},Distortion=class{constructor(coefficients){this.coefficients=coefficients}distortInverse(radius){let r0=0,r1=1,dr0=radius-this.distort(r0);for(;Math.abs(r1-r0)>1e-4;){let dr1=radius-this.distort(r1),r2=r1-dr1*((r1-r0)/(dr1-dr0));r0=r1,r1=r2,dr0=dr1}return r1}distort(radius){let r2=radius*radius,ret=0;for(let i=0;i<this.coefficients.length;i++)ret=r2*(ret+this.coefficients[i]);return(ret+1)*radius}},Pose=class{constructor(){this.angularAcceleration=null,this.angularVelocity=null,this.linearAcceleration=null,this.linearVelocity=null,this.orientation=null,this.position=null}},FieldOfView=class{constructor(){this.leftDegrees=0,this.rightDegrees=0,this.upDegrees=0,this.downDegrees=0}},Sensor=class{constructor(kFilter,predictionTime,yawOnly,isDebug){this.viewer={id:`CardboardV1`,label:`Cardboard I/O 2014`,fov:40,interLensDistance:.06,baselineLensDistance:.035,screenLensDistance:.042,distortionCoefficients:[.441,.156],inverseCoefficients:[-.4410035,.42756155,-.4804439,.5460139,-.58821183,.5733938,-.48303202,.33299083,-.17573841,.0651772,-.01488963,.001559834]},this.device={widthMeters:.11,heightMeters:.062,bevelMeters:.004},this.depthNear=.01,this.depthFar=1e4,this.yawOnly=yawOnly,this.accelerometer=new three_webgpu.Vector3,this.gyroscope=new three_webgpu.Vector3,this.filter=new ComplementaryFilter(kFilter,isDebug),this.posePredictor=new PosePredictor(predictionTime,isDebug),this.isFirefoxAndroid=isFirefoxAndroid(),this.isIOS=isIOS();let chromeVersion=getChromeVersion();this.isDeviceMotionInRadians=!this.isIOS&&chromeVersion!==null&&chromeVersion<66,this.isWithoutDeviceMotion=isChromeWithoutDeviceMotion()||isSafariWithoutDeviceMotion(),this.filterToWorldQ=new three_webgpu.Quaternion,isIOS()?this.filterToWorldQ.setFromAxisAngle(new three_webgpu.Vector3(1,0,0),Math.PI/2):this.filterToWorldQ.setFromAxisAngle(new three_webgpu.Vector3(1,0,0),-Math.PI/2),this.inverseWorldToScreenQ=new three_webgpu.Quaternion,this.worldToScreenQ=new three_webgpu.Quaternion,this.originalPoseAdjustQ=new three_webgpu.Quaternion;let angle=typeof window<`u`?-window.orientation*Math.PI/180:0;this.originalPoseAdjustQ.setFromAxisAngle(new three_webgpu.Vector3(0,0,1),angle),this.setScreenTransform_(),isLandscapeMode()&&this.filterToWorldQ.multiply(this.inverseWorldToScreenQ),this.resetQ=new three_webgpu.Quaternion,this.orientationOut_=new Float32Array(4),this.previousTimestampS=Date.now()}getPosition(){return null}getOrientation(){let orientation;if(this.isWithoutDeviceMotion&&this._deviceOrientationQ){this.deviceOrientationFixQ=this.deviceOrientationFixQ||(function(){let z=new three_webgpu.Quaternion().setFromAxisAngle(new three_webgpu.Vector3(0,0,-1),0),y=new three_webgpu.Quaternion;return typeof window<`u`&&window.orientation===-90?y.setFromAxisAngle(new three_webgpu.Vector3(0,1,0),Math.PI/-2):y.setFromAxisAngle(new three_webgpu.Vector3(0,1,0),Math.PI/2),z.multiply(y)})(),this.deviceOrientationFilterToWorldQ=this.deviceOrientationFilterToWorldQ||(function(){let q=new three_webgpu.Quaternion;return q.setFromAxisAngle(new three_webgpu.Vector3(1,0,0),-Math.PI/2),q})(),orientation=this._deviceOrientationQ;let out=new three_webgpu.Quaternion;return out.copy(orientation),out.multiply(this.deviceOrientationFilterToWorldQ),out.multiply(this.resetQ),out.multiply(this.worldToScreenQ),out.multiplyQuaternions(this.deviceOrientationFixQ,out),this.yawOnly&&(out.x=0,out.z=0,out.normalize()),this.orientationOut_[0]=out.x,this.orientationOut_[1]=out.y,this.orientationOut_[2]=out.z,this.orientationOut_[3]=out.w,this.orientationOut_}else{let filterOrientation=this.filter.getOrientation();orientation=this.posePredictor.getPrediction(filterOrientation,this.gyroscope,this.previousTimestampS)}let out=new three_webgpu.Quaternion;return out.copy(this.filterToWorldQ),out.multiply(this.resetQ),out.multiply(orientation),out.multiply(this.worldToScreenQ),this.yawOnly&&(out.x=0,out.z=0,out.normalize()),this.orientationOut_[0]=out.x,this.orientationOut_[1]=out.y,this.orientationOut_[2]=out.z,this.orientationOut_[3]=out.w,this.orientationOut_}getPose(){let pose=new Pose;return pose.orientation=this.getOrientation(),pose}resetPose(){this.resetQ.copy(this.filter.getOrientation()),this.resetQ.x=0,this.resetQ.y=0,this.resetQ.z*=-1,this.resetQ.normalize(),isLandscapeMode()&&this.resetQ.multiply(this.inverseWorldToScreenQ),this.resetQ.multiply(this.originalPoseAdjustQ)}getFrameData(frameData){let orientation=this.getOrientation(),eyeOffsets=this.getEyeOffset(),projection=this.getEyeProjectionMatrix();return frameData.pose.angularAcceleration=null,frameData.pose.angularVelocity=null,frameData.pose.linearAcceleration=null,frameData.pose.linearVelocity=null,frameData.pose.orientation=orientation,frameData.pose.position=null,frameData.timestamp=this.previousTimestampS,frameData.leftProjectionMatrix.set(projection.left),frameData.rightProjectionMatrix.set(projection.right),updateEyeViewMatrices(frameData.leftViewMatrix,orientation,eyeOffsets.left),updateEyeViewMatrices(frameData.rightViewMatrix,orientation,eyeOffsets.right),frameData}start(){if(typeof window>`u`)return()=>{};let onDeviceMotionCallback_=this.onDeviceMotion_.bind(this),onOrientationChangeCallback_=this.onOrientationChange_.bind(this),onMessageCallback_=this.onMessage_.bind(this),onDeviceOrientationCallback_=this.onDeviceOrientation_.bind(this);return isIOS()&&isInsideCrossOriginIFrame()&&window.addEventListener(`message`,onMessageCallback_),window.addEventListener(`orientationchange`,onOrientationChangeCallback_),this.isWithoutDeviceMotion?window.addEventListener(`deviceorientation`,onDeviceOrientationCallback_):window.addEventListener(`devicemotion`,onDeviceMotionCallback_),()=>{window.removeEventListener(`devicemotion`,onDeviceMotionCallback_),window.removeEventListener(`deviceorientation`,onOrientationChangeCallback_),window.removeEventListener(`orientationchange`,onOrientationChangeCallback_),window.removeEventListener(`message`,onMessageCallback_)}}getEyeOffset(){return{left:[-this.viewer.interLensDistance*.5,0,0],right:[this.viewer.interLensDistance*.5,0,0]}}getEyeProjectionMatrix(){let fieldOfView=this.getEyeFieldOfView(),near=this.depthNear,far=this.depthFar,result={left:[],right:[]};{let upTan=fieldOfView.left.upDegrees*DEG_TO_RAD,downTan=fieldOfView.left.downDegrees*DEG_TO_RAD,leftTan=fieldOfView.left.leftDegrees*DEG_TO_RAD,rightTan=fieldOfView.left.rightDegrees*DEG_TO_RAD,xScale=2/(leftTan+rightTan),yScale=2/(upTan+downTan);result.left[0]=xScale,result.left[1]=0,result.left[2]=0,result.left[3]=0,result.left[4]=0,result.left[5]=yScale,result.left[6]=0,result.left[7]=0,result.left[8]=-((leftTan-rightTan)*xScale*.5),result.left[9]=(upTan-downTan)*yScale*.5,result.left[10]=far/(near-far),result.left[11]=-1,result.left[12]=0,result.left[13]=0,result.left[14]=far*near/(near-far),result.left[15]=0}{let upTan=fieldOfView.right.upDegrees*DEG_TO_RAD,downTan=fieldOfView.right.downDegrees*DEG_TO_RAD,leftTan=fieldOfView.right.leftDegrees*DEG_TO_RAD,rightTan=fieldOfView.right.rightDegrees*DEG_TO_RAD,xScale=2/(leftTan+rightTan),yScale=2/(upTan+downTan);result.right[0]=xScale,result.right[1]=0,result.right[2]=0,result.right[3]=0,result.right[4]=0,result.right[5]=yScale,result.right[6]=0,result.right[7]=0,result.right[8]=-((leftTan-rightTan)*xScale*.5),result.right[9]=(upTan-downTan)*yScale*.5,result.right[10]=far/(near-far),result.right[11]=-1,result.right[12]=0,result.right[13]=0,result.right[14]=far*near/(near-far),result.right[15]=0}return result}getEyeFieldOfView(){let viewer=this.viewer,device=this.device,distortion=new Distortion(viewer.distortionCoefficients),eyeToScreenDistance=viewer.screenLensDistance,outerDist=(device.widthMeters-viewer.interLensDistance)/2,innerDist=viewer.interLensDistance/2,bottomDist=viewer.baselineLensDistance-device.bevelMeters,topDist=device.heightMeters-bottomDist,outerAngle=RAD_TO_DEG*Math.atan(distortion.distort(outerDist/eyeToScreenDistance)),innerAngle=RAD_TO_DEG*Math.atan(distortion.distort(innerDist/eyeToScreenDistance)),bottomAngle=RAD_TO_DEG*Math.atan(distortion.distort(bottomDist/eyeToScreenDistance)),topAngle=RAD_TO_DEG*Math.atan(distortion.distort(topDist/eyeToScreenDistance)),left=new FieldOfView,right=new FieldOfView;return left.leftDegrees=Math.min(outerAngle,viewer.fov),left.rightDegrees=Math.min(innerAngle,viewer.fov),left.downDegrees=Math.min(bottomAngle,viewer.fov),left.upDegrees=Math.min(topAngle,viewer.fov),right.leftDegrees=left.rightDegrees,right.rightDegrees=left.leftDegrees,right.upDegrees=left.upDegrees,right.downDegrees=left.downDegrees,{left,right}}onDeviceOrientation_(event){this._deviceOrientationQ=this._deviceOrientationQ||new three_webgpu.Quaternion;let{alpha,beta,gamma}=event;alpha=(alpha||0)*Math.PI/180,beta=(beta||0)*Math.PI/180,gamma=(gamma||0)*Math.PI/180,this._deviceOrientationQ.setFromEuler(new three_webgpu.Euler(alpha,beta,-gamma,`YXZ`))}onDeviceMotion_(deviceMotion){this.updateDeviceMotion_(deviceMotion)}updateDeviceMotion_(deviceMotion){let accGravity=deviceMotion.accelerationIncludingGravity,rotRate=deviceMotion.rotationRate,timestampS=deviceMotion.timeStamp/1e3,deltaS=timestampS-this.previousTimestampS;if(deltaS<0){warnOnce(`fusion-pose-sensor:invalid:non-monotonic`,`Invalid timestamps detected: non-monotonic timestamp from devicemotion`),this.previousTimestampS=timestampS;return}else if(deltaS<=MIN_TIMESTEP||deltaS>MAX_TIMESTEP){warnOnce(`fusion-pose-sensor:invalid:outside-threshold`,`Invalid timestamps detected: Timestamp from devicemotion outside expected range.`),this.previousTimestampS=timestampS;return}accGravity&&(this.accelerometer.set(-accGravity.x,-accGravity.y,-accGravity.z),rotRate&&(isR7()?this.gyroscope.set(-rotRate.beta,rotRate.alpha,rotRate.gamma):this.gyroscope.set(rotRate.alpha,rotRate.beta,rotRate.gamma),this.isDeviceMotionInRadians||this.gyroscope.multiplyScalar(Math.PI/180),this.filter.addGyroMeasurement(this.gyroscope,timestampS)),this.filter.addAccelMeasurement(this.accelerometer,timestampS)),this.previousTimestampS=timestampS}onOrientationChange_(){this.setScreenTransform_()}onMessage_(event){let message=event.data;!message||!message.type||message.type.toLowerCase()===`devicemotion`&&this.updateDeviceMotion_(message.deviceMotionEvent)}setScreenTransform_(){switch(this.worldToScreenQ.set(0,0,0,1),typeof window<`u`?window.orientation:0){case 0:break;case 90:this.worldToScreenQ.setFromAxisAngle(new three_webgpu.Vector3(0,0,1),-Math.PI/2);break;case-90:this.worldToScreenQ.setFromAxisAngle(new three_webgpu.Vector3(0,0,1),Math.PI/2);break;case 180:break}this.inverseWorldToScreenQ.copy(this.worldToScreenQ),this.inverseWorldToScreenQ.invert()}},defaultLeftBounds=[0,0,.5,1],defaultRightBounds=[.5,0,.5,1],Cardboard=class{constructor(renderer){this.renderer=renderer,this.sensor=new Sensor(.98,.04,!1,!1),this.scale=1,this.cameraL=new three_webgpu.PerspectiveCamera,this.cameraR=new three_webgpu.PerspectiveCamera;let stopSensor=this.sensor.start();this.dispose=()=>{let size=this.renderer.getSize(new three_webgpu.Vector2);this.renderer.setScissor(0,0,size.width,size.height),this.renderer.setViewport(0,0,size.width,size.height),this.renderer.setScissorTest(!1),stopSensor()}}render(scene,camera){let size=this.renderer.getSize(new three_webgpu.Vector2);if(size.width>size.height){var autoUpdate=scene.matrixWorldAutoUpdate;autoUpdate&&(scene.updateMatrixWorld(),scene.matrixWorldAutoUpdate=!1);let renderRectL={x:Math.round(size.width*defaultLeftBounds[0]),y:Math.round(size.height*defaultLeftBounds[1]),width:Math.round(size.width*defaultLeftBounds[2]),height:Math.round(size.height*defaultLeftBounds[3])},renderRectR={x:Math.round(size.width*defaultRightBounds[0]),y:Math.round(size.height*defaultRightBounds[1]),width:Math.round(size.width*defaultRightBounds[2]),height:Math.round(size.height*defaultRightBounds[3])};this.renderer.setScissorTest(!0),this.renderer.autoClear&&this.renderer.clear(),camera.parent===null&&camera.updateMatrixWorld(),camera.matrixWorld.decompose(this.cameraL.position,this.cameraL.quaternion,this.cameraL.scale),camera.matrixWorld.decompose(this.cameraR.position,this.cameraR.quaternion,this.cameraR.scale);let eyeOffsets=this.sensor.getEyeOffset();this.cameraL.translateOnAxis(new three_webgpu.Vector3().fromArray(eyeOffsets.left),this.scale),this.cameraR.translateOnAxis(new three_webgpu.Vector3().fromArray(eyeOffsets.right),this.scale);let projections=this.sensor.getEyeProjectionMatrix();this.cameraL.projectionMatrix.fromArray(projections.left),this.cameraR.projectionMatrix.fromArray(projections.right),this.renderer.setViewport(renderRectL.x,renderRectL.y,renderRectL.width,renderRectL.height),this.renderer.setScissor(renderRectL.x,renderRectL.y,renderRectL.width,renderRectL.height),this.renderer.render(scene,this.cameraL),this.renderer.setViewport(renderRectR.x,renderRectR.y,renderRectR.width,renderRectR.height),this.renderer.setScissor(renderRectR.x,renderRectR.y,renderRectR.width,renderRectR.height),this.renderer.render(scene,this.cameraR),this.renderer.setViewport(0,0,size.width,size.height),this.renderer.setScissor(0,0,size.width,size.height),this.renderer.setScissorTest(!1),autoUpdate&&(scene.matrixWorldAutoUpdate=!0)}else this.renderer.render(scene,camera)}dispose(){}},cardboard_png_data_url_default=`data:image/png;base64,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`,phone_png_data_url_default=`data:image/png;base64,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`,_a$1,LOCALE={zh:{TITLE:`眼镜模式`,HIT:`请将手机横屏放入 VR 眼镜中`},en:{TITLE:`GLASSES MODE`,HIT:`Please put the mobile phone horizontally into the VR glasses.`},ja:{TITLE:`メガネモード`,HIT:`携帯電話をVRメガネに水平に入れてください。`}},TEXT=typeof navigator<`u`?(_a$1=LOCALE[navigator.language.split(`-`)[0]])==null?LOCALE.en:_a$1:LOCALE.zh,CONTENTS=`
|
|
560
560
|
<style>
|
|
561
561
|
.$id {
|
|
562
562
|
all: initial;
|
|
@@ -817,4 +817,4 @@ Z
|
|
|
817
817
|
</svg>
|
|
818
818
|
</div>
|
|
819
819
|
</div>
|
|
820
|
-
`;function createContents(id){let viewportScale=1,metaElements=document.getElementsByTagName(`meta`);for(let i=0;i<metaElements.length;i++){let metaElement=metaElements[i];if(metaElement.getAttribute(`name`)===`viewport`){let matched=(metaElement.getAttribute(`content`)||``).match(/initial\-scale\=([\d|\.]+)/);matched&&(viewportScale=Number(matched[1])),isNaN(viewportScale)&&(viewportScale=1)}}let px=value=>Math.floor(value*viewportScale)+`px`;return CONTENTS.replace(/\n/g,` `).replace(/\ +/g,` `).replace(/\$id/g,id).replace(/(\d+)px/g,(_,value)=>px(Number(value)))}function createHelper(){let id=`five_vr_helper_`+require_memoryUsage.N(),html=createContents(id),domElement=document.createElement(`div`);return domElement.className=id,domElement.innerHTML=html,domElement}var sharedGeometry=new three_webgpu.CircleGeometry(.12,16),CENTER=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST=(0,three_tsl.float)(.017);function tslInside(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST),dist)}function tslOutside(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST),outerDist,dist))}function createRingMaterial(){let u={opacity:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)(),dist=(0,three_tsl.length)(CENTER.sub(vuv)),SD=(0,three_tsl.float)(.01),outerDist=(0,three_tsl.float)(.49),innerDist=(0,three_tsl.float)(.29),outsideVal=(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SD),outerDist,dist)),insideVal=(0,three_tsl.smoothstep)(innerDist,innerDist.add(SD),dist),bg=(0,three_tsl.vec4)(.576,.635,1,.3),gradient=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.abs)(dist.sub(outerDist.add(innerDist).div(2))).div(outerDist.sub(innerDist)).mul(1.5).add(.1).clamp(0,1)),mixed=(0,three_tsl.mix)(bg,gradient,gradient.w),material=new three_webgpu.NodeMaterial;return material.fragmentNode=(0,three_tsl.vec4)(mixed.xyz,mixed.w.mul(u.opacity).mul(outsideVal).mul(insideVal)),material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}function createPanoMaterial(){let u={circleScale:(0,three_tsl.uniform)(1),circleFade:(0,three_tsl.uniform)(0),circleOpacity:(0,three_tsl.uniform)(.5),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),disable:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)();(0,three_tsl.length)(CENTER.sub(vuv));let circleGradient=(0,three_tsl.float)(.98).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER))).mul(2)).clamp(0,1),circleColor=(0,three_tsl.vec4)((0,three_tsl.mix)((0,three_tsl.vec4)(.576,.635,1,1).xyz,(0,three_tsl.vec4)(1,1,1,1).xyz,u.circleFade.mul(.5)),circleGradient.mul(u.circleOpacity).mul(tslOutside(vuv,(0,three_tsl.float)(.3).mul(u.circleScale)))),loadAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER.x.sub(vuv.x),CENTER.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadAngle)).mul(.9).add(.1).mul(u.loadingOpacity).mul(tslInside(vuv,(0,three_tsl.float)(.2).mul(u.circleScale))).mul(tslOutside(vuv,(0,three_tsl.float)(.25).mul(u.circleScale)))),disableColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).mul(tslOutside(vuv,(0,three_tsl.float)(.32).mul(u.circleScale)))),result=(0,three_tsl.vec4)(1,1,1,0);result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,loadColor,loadColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.xyz,result.w.mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoSphereMesh=class extends three_webgpu.Object3D{constructor(){super(),this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({ringScale:1.1,ringOpacity:0,circleFade:0,circleOpacity:.85,circleScale:1}),this.opacityMotion=new Motion({opacity:0}),this.loadingMotion=new Motion({opacity:0}),this.disableMotion=new Motion({opacity:0}),this.hitTestMesh=new three_webgpu.Mesh(sharedGeometry,new three_webgpu.MeshBasicMaterial({blending:three_webgpu.CustomBlending,blendSrc:three_webgpu.SrcAlphaFactor,blendDst:three_webgpu.OneMinusSrcAlphaFactor,blendSrcAlpha:three_webgpu.OneFactor,blendDstAlpha:three_webgpu.OneMinusSrcAlphaFactor,depthWrite:!1,transparent:!0,color:0,opacity:0})),this.hitTestMesh.scale.set(1.5,1.5,1.5);let{material:ringMat,u:ringU}=createRingMaterial();this.ringMesh=new three_webgpu.Mesh(sharedGeometry,ringMat),this.ringU=ringU;let{material:panoMat,u:panoU}=createPanoMaterial();this.panoMesh=new three_webgpu.Mesh(sharedGeometry,panoMat),this.panoU=panoU,this.add(this.hitTestMesh),this.add(this.ringMesh),this.add(this.panoMesh),this.renderOrder=1e4,this.needsRender=!0}setProgress(progress){this.progress=progress,this.setLoading(progress>0)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},30).catch(require_memoryUsage.d))}setCurrent(current){if(this.current!==current){if(current)this.currentMotion.setKeyframes([{progress:0,value:{ringScale:2,ringOpacity:0,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.05,value:{ringScale:1,ringOpacity:1,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.15,value:{ringScale:1.2,ringOpacity:1,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.25,value:{ringScale:1.1,ringOpacity:1,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.8,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.85,circleScale:1}},{progress:.9,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.65,circleScale:.8}},{progress:.92,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.65,circleScale:.8}},{progress:1,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.85,circleScale:1.1}}],1500).catch(require_memoryUsage.d);else{let keyframes=[{progress:0,value:Object.assign({},this.currentMotion.value)},{progress:1,value:{ringScale:1.1,ringOpacity:0,circleFade:0,circleOpacity:.85,circleScale:1}}];this.currentMotion.setKeyframes(keyframes,200).catch(require_memoryUsage.d)}this.current=current}}setLoading(loading){this.loading!==loading&&(loading?this.loadingMotion.setKeyframes([{progress:0,value:{opacity:0}},{progress:.3,value:{opacity:0}},{progress:1,value:{opacity:.8}}],500).catch(require_memoryUsage.d):this.loadingMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.needsRender=!0)}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({opacity:+!!disabled},300).catch(require_memoryUsage.d),this.needsRender=!0)}tap(){return Promise.resolve()}updateTime(time,deltaTime){this.opacityMotion.update(time),this.currentMotion.update(time),this.loadingMotion.update(time);let baseOpacity=this.opacityMotion.value.opacity;this.visible=baseOpacity!==0;let{ringScale,ringOpacity,circleFade,circleOpacity,circleScale}=this.currentMotion.value;this.ringMesh.scale.set(ringScale,1,ringScale),this.ringU.opacity.value=ringOpacity*baseOpacity,this.panoU.opacity.value=baseOpacity,this.panoU.circleOpacity.value=circleOpacity,this.panoU.circleScale.value=circleScale,this.panoU.circleFade.value=circleFade,this.panoU.loadingOpacity.value=this.loadingMotion.value.opacity,this.panoU.disable.value=this.disableMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0}dispose(){this.hitTestMesh.material.dispose(),this.ringMesh.material.dispose(),this.panoMesh.material.dispose()}},ACTIVE_TO_CURRENT_DELAY$1=1500,defaultVRPanoramaControllerCustomInitArgs=Object.assign({},require_pick.t(defaultPanoramaControllerCustomInitArgs,[`maxLatitude`,`minLatitude`])),VRPanoramaController=class VRPanoramaController extends PanoramaController{static parseArgs(args){if(args instanceof VRPanoramaController)return args;let args_=Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2});return super.parseArgs(args_)}static initAnimationEndState(args){let args_=this.parseArgs(args),state=super.initAnimationEndState(args_);return Object.assign(Object.assign({},state),{mode:`VRPanorama`})}constructor(args){let args_=VRPanoramaController.parseArgs(args);super(args_),this.mode=`VRPanorama`,this.cardboard=new Cardboard(this.renderer);let helperElement=createHelper();this.helperElement=helperElement;let mc=new Hammer(helperElement);this.element.parentNode&&(this.element.parentNode.insertBefore(helperElement,this.element),this.updateHelperElementSize(),mc.on(`tap`,()=>this.emit(`vr.requestExit`,createEvent(`vr.requestExit`,{})))),this.destroyHelper=()=>{mc.destroy(),helperElement.parentNode&&helperElement.parentNode.removeChild(helperElement),this.helperElement=void 0}}updateConfiguration(args){return super.updateConfiguration(Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2}))}destroy(){super.destroy(),this.cardboard.dispose(),this.destroyHelper()}isReady(){return!1}updateRenderSize(){this.needsRender=!0}updateCamera(pose,duration,userAction){return Promise.resolve()}updateCameraWithKeyframes(keyframes,duration,userAction){return Promise.resolve()}updateTime(time,deltaTime,...args){var _a,_b,_c,_d,_e,_f;if(this.destroyed)return;this.updateHelperElementSize(),this.userAction=!0,this.needsRender=!0;let uniforms={},cameraPose={},startKeyframe=this.locationMotion.keyframes[0],endKeyframe=this.locationMotion.keyframes[this.locationMotion.keyframes.length-1],[prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),prevResource=this.panoResourceFromLocationMotionKeyframe(prevKeyframe),nextResource=this.panoResourceFromLocationMotionKeyframe(nextKeyframe),startResource=this.panoResourceFromLocationMotionKeyframe(startKeyframe),endResource=this.panoResourceFromLocationMotionKeyframe(endKeyframe),fixedTransition=!1;if(this.modelAlphaMotion.ended===!1&&(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.perspToOrthoMotion.ended===!1&&(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),this.locationMotion.ended===!1){this.locationMotion.update(time);let progress=this.locationMotion.value.count-nextKeyframe.value.count+1,prevPosition=new three_webgpu.Vector3().copy(prevResource.position),nextPosition=new three_webgpu.Vector3().copy(nextResource.position);if(uniforms.progress=progress,progress>=.01&&progress<=.99&&(uniforms.progress=require_memoryUsage.M(nextResource.effectEasing(progress),.01,.99)),nextResource.panoPicture&&(progress<1?prevResource.panoPicture&&(uniforms.pano0=prevResource.panoPicture):uniforms.pano0=nextResource.panoPicture,uniforms.pano1=nextResource.panoPicture),nextResource.effect===`montage`?uniforms.transition=`BLACK`:nextResource.effect===`spread`?uniforms.transition=`SPREAD`:uniforms.transition=`FADE`,nextResource.effect===`zoomin`||nextResource.effect===`zoomout`?uniforms.progress=Math.pow(progress,3):nextResource.effect===`model`&&this.camera.pose.distance<.01&&(uniforms.modelAlpha=1-Math.pow(require_memoryUsage.M(Math.abs(progress-.5)*2,0,1),4)),progress<1&&nextResource.effect!==`fly`){if(uniforms.pano0&&prevResource.panoPicture){let panoPicture={panoId:uniforms.pano0.panoId,map:uniforms.pano0.map,mapHistogram:uniforms.pano0.mapHistogram,mapSize:uniforms.pano0.mapSize,zoom:uniforms.pano0.zoom,matrix:prevResource.panoPicture.matrix.clone().setPosition(nextResource.position),gainmap:uniforms.pano0.gainmap?{map:uniforms.pano0.gainmap.map,cfg:Object.assign({},uniforms.pano0.gainmap.cfg)}:void 0},observer=this.panoPictureObserverMap.get(uniforms.pano0);observer&&this.panoPictureObserverMap.set(panoPicture,observer),uniforms.pano0=panoPicture}prevPosition.copy(nextPosition),fixedTransition=!0}cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(prevPosition.x+(nextPosition.x-prevPosition.x)*progress,prevPosition.y+(nextPosition.y-prevPosition.y)*progress,prevPosition.z+(nextPosition.z-prevPosition.z)*progress);let keyframeKeys=[],restKeyframeKeys=[];for(let keyframe of this.locationMotion.keyframes){let{key,progress}=keyframe;key!==void 0&&(keyframeKeys.push(key),progress>this.locationMotion.progress&&restKeyframeKeys.push(key))}for(let name of Object.keys(this.panoResources)){if(restKeyframeKeys.indexOf(name)>=0)continue;let panoResource=this.panoResources[name];if(panoResource.panoPicture){let texture=panoResource.panoPicture.map;if(texture){if(texture===((_a=uniforms.pano0)==null?void 0:_a.map)||texture===((_b=uniforms.pano1)==null?void 0:_b.map))continue;texture.dispose(),panoResource.panoPicture=null}}keyframeKeys.indexOf(name)>=0||delete this.panoResources[name]}this.currentPano=panoParse(nextResource.panoId),this.emit(`pano.moving`,createEvent(`pano.moving`,{userAction:this.userAction,prevPano:panoParse(startResource.panoId),state:Object.assign(Object.assign(Object.assign(Object.assign({},panoParse(endResource.panoId)),{mode:this.mode}),clonePose(this.camera.pose)),cameraPose),options:{},progress:this.locationMotion.progress,error:null}))}isEmptyObject(uniforms)===!1&&this.modelScene.parameter.set(uniforms),cameraPose.offset&&this.camera.position.copy(cameraPose.offset);let prevLongitude=this.camera.pose.longitude,prevLatitude=this.camera.pose.latitude;this.camera.quaternion.fromArray(this.cardboard.sensor.getOrientation()),this.camera.computePose(),(prevLongitude!==this.camera.pose.longitude||prevLatitude!==this.camera.pose.latitude)&&(this.cameraMotion.set(require_pick.r(this.camera.pose,[`longitude`,`latitude`]),0).catch(require_memoryUsage.d),this.emit(`camera.update`,createEvent(`camera.update`,{userAction:!0,state:Object.assign(Object.assign(Object.assign({},this.currentPano),{mode:this.mode}),clonePose(this.camera.pose))}))),this.works.getObserver(this.currentPano);let prevObserver=this.works.getObserver(prevResource.panoId),nextObserver=this.works.getObserver(nextResource.panoId),visibleObserverMap=new Map;if(prevObserver)for(let panoIndex of prevObserver.accessibleNodes){let observer=prevObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(nextObserver)for(let panoIndex of nextObserver.accessibleNodes){let observer=nextObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(this.panoMeshes.forEach((panoMesh,panoId)=>{let observer=visibleObserverMap.get(panoId);observer?(panoMesh.position.copy(observer.position).applyMatrix4(observer.work.transform),visibleObserverMap.delete(panoId)):(this.helper.remove(panoMesh),panoMesh.dispose(),this.panoMeshes.delete(panoId))}),visibleObserverMap.forEach((observer,panoId)=>{let panoMesh=new PanoSphereMesh;panoMesh.position.copy(observer.position).applyMatrix4(observer.work.transform),observer.position.distanceTo(observer.standingPosition)>this.aerialObserverMinHeight?panoMesh.scale.setScalar(15):panoMesh.scale.setScalar(1),this.panoMeshes.set(panoId,panoMesh),this.helper.add(panoMesh),visibleObserverMap.delete(panoId)}),this.camera.pose.distance>.1||fixedTransition?this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh.setOpacity(0),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime),panoMesh.visible=!1}):this.panoMeshes.forEach((panoMesh,panoId)=>{let pano=panoParse(panoId),observer=this.works.getObserver(pano);if(!observer)return;if(!observer.loadable&&!observer.active){panoMesh.setOpacity(0);return}let distance=panoMesh.position.clone().setY(this.camera.position.y).distanceTo(this.camera.position);distance<.05?panoMesh.setOpacity(0):panoMesh.setOpacity(require_memoryUsage.M(1.5/distance,0,1)),panoEqual(this.currentPano,pano)&&panoMesh.setOpacity(0),panoMesh.lookAt(this.camera.position)}),this.locationMotion.ended){let intersectPanoMesh=this.intersect(time);this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh.setCurrent(panoMesh===intersectPanoMesh),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime)})}{let progress=(_c=this.modelScene.parameter.progress)==null?1:_c,panoNumber=Math.round(progress),pano0=this.modelScene.parameter.pano0,pano1=this.modelScene.parameter.pano1,pano=panoNumber===0?pano0:pano1,observer;if(pano&&(observer=this.works.getObserver(pano.panoId),observer||(observer=this.panoPictureObserverMap.get(pano))),this.tiling.appearDuration=this.tileAppearDuration,this.tiling.maxRequest=progress<(require_imageBitmap.t()?.6:.99)?0:this.tileMaxRequest,this.tiling.imageOptions=this.imageOptions,!observer||!pano||this.tileLevelForFov===!1||this.camera.perspToOrtho.x>0){this.tiling.setObserver(null);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:null,panoGainmap:void 0,panoMatrix:new three_webgpu.Matrix4,panoZoom:1,minLevel:0,level:0};this.tiling.update(tilingFrameState),this.modelScene.parameter.set(`refinedScreen`,null)}else{let panoLevel=require_pick.o(pano.mapSize),minLevel=panoLevel+1,viewSize=new three_webgpu.Vector2().copy(this.camera.resolution).multiplyScalar(this.camera.pixelRatio),computedLevel=Math.floor(this.tileLevelForFov(this.camera.fov,viewSize)),level=computedLevel>panoLevel?computedLevel:0;this.tiling.setObserver(observer);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:pano.map,panoGainmap:pano.gainmap,panoMatrix:pano.matrix,panoZoom:pano.zoom,minLevel,level,useHDR:this.modelScene.parameter.resolveValue(`useHDR`),maxDisplayBoost:this.modelScene.parameter.resolveValue(`maxDisplayBoost`)},tilingUpdated=this.tiling.update(tilingFrameState),refinedScreen={map:this.tiling.renderTarget.texture,matrixInverse:this.tiling.camera.matrixWorldInverse,projectionMatrix:this.tiling.camera.projectionMatrix,pano:panoNumber,opacity:(pano0==null?void 0:pano0.panoId)===(pano1==null?void 0:pano1.panoId)?1:easeInQuart(Math.abs(((_d=this.modelScene.parameter.progress)==null?0:_d)-.5)*2)},prevRefinedScreen=this.modelScene.parameter.refinedScreen;(tilingUpdated||refinedScreen.pano!==(prevRefinedScreen==null?void 0:prevRefinedScreen.pano)||refinedScreen.opacity!==(prevRefinedScreen==null?void 0:prevRefinedScreen.opacity))&&this.modelScene.parameter.set(`refinedScreen`,refinedScreen)}}this.panoVideo.object.position.copy(this.camera.position),this.panoVideo.updateTime(time);{let effect=nextResource.effect,{pano0,pano1}=this.modelScene.parameter;if(pano0&&pano1&&pano0!==pano1&&(effect===`fly`||effect===`model`)&&this.flyEffectUseDepthBuffer){if(((_e=this.modelScene.parameter.pano0Depth)==null?void 0:_e.panoId)!==pano0.panoId||((_f=this.modelScene.parameter.pano1Depth)==null?void 0:_f.panoId)!==pano1.panoId){this.pano0DepthCubeRenderTarget?this.pano0DepthCubeRenderTarget.width!==512&&this.pano0DepthCubeRenderTarget.setSize(512,512):this.pano0DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1}),this.pano1DepthCubeRenderTarget?this.pano1DepthCubeRenderTarget.width!==512&&this.pano1DepthCubeRenderTarget.setSize(512,512):this.pano1DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1});let pano0Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano0DepthCubeRenderTarget);pano0Camera.matrix.copy(pano0.matrix),pano0Camera.matrixWorld.copy(pano0Camera.matrix),pano0Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano0Camera,500);let pano1Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano1DepthCubeRenderTarget);pano1Camera.matrix.copy(pano1.matrix),pano1Camera.matrixWorld.copy(pano1Camera.matrix),pano1Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano1Camera,500),this.modelScene.parameter.set({pano0Depth:{panoId:pano0.panoId,map:this.pano0DepthCubeRenderTarget.texture,mapSize:this.pano0DepthCubeRenderTarget.width,maxDepth:500},pano1Depth:{panoId:pano1.panoId,map:this.pano1DepthCubeRenderTarget.texture,mapSize:this.pano1DepthCubeRenderTarget.width,maxDepth:500}})}}else this.modelScene.parameter.set({pano0Depth:null,pano1Depth:null}),this.flyEffectUseDepthBuffer||(this.pano0DepthCubeRenderTarget&&(this.pano0DepthCubeRenderTarget.dispose(),this.pano0DepthCubeRenderTarget=void 0),this.pano1DepthCubeRenderTarget&&(this.pano1DepthCubeRenderTarget.dispose(),this.pano1DepthCubeRenderTarget=void 0))}}render(){return this.renderer.setRenderTarget(null),this.renderer.setScissorTest(!1),this.cardboard.render(this.scene,this.camera),!0}setCamera(cameraPose={}){}destroyHelper(){}updateHelperElementSize(){if(!this.helperElement)return;let size=new three_webgpu.Vector2(this.element.offsetWidth,this.element.offsetHeight),left=size.x*this.viewport.left,top=size.y*(1-this.viewport.bottom-this.viewport.height),width=size.x*this.viewport.width,height=size.y*this.viewport.height;this.helperElement.style.marginLeft!==left+`px`&&(this.helperElement.style.marginLeft=left+`px`),this.helperElement.style.marginTop!==top+`px`&&(this.helperElement.style.marginTop=top+`px`),this.helperElement.style.width!==width+`px`&&(this.helperElement.style.width=width+`px`),this.helperElement.style.height!==height+`px`&&(this.helperElement.style.height=height+`px`)}intersect(time){var _a,_b;if(this.locationMotion.ended===!1){this.intersectMesh.visible=!1,this.activePanoMesh=void 0,this.activeTime=void 0;return}if(this.activePanoMesh&&this.activeTime&&time-this.activeTime>ACTIVE_TO_CURRENT_DELAY$1){let activePanoMesh=this.activePanoMesh,activePanoId=null;return this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh===activePanoMesh&&(activePanoId=panoId)}),activePanoId!==null&&this.moveToPano(panoParse(activePanoId),{},!0),this.activePanoMesh=void 0,this.activeTime=void 0,activePanoMesh}let cameraDirection=this.camera.getDirection(new three_webgpu.Vector3),raycaster=new three_webgpu.Raycaster(this.camera.position,cameraDirection);raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.floorIndex=-1;let intersection,intersectionPanos=[],currentObserver=this.works.getObserver(this.currentPano),accessibleNodes=currentObserver?currentObserver.accessibleNodes.map(panoIndex=>panoStringify({panoIndex,workCode:currentObserver.work.workCode})):[];for(let panoId of accessibleNodes){let panoMesh=this.panoMeshes.get(panoId);if(panoMesh){let[intersection]=raycaster.intersectObject((_a=panoMesh.hitTestMesh)==null?panoMesh:_a,!0);if(intersection){let floorIndex=(_b=currentObserver==null?void 0:currentObserver.floorIndex)==null?0:_b;intersectionPanos.push({panoMesh,intersection:Object.assign({floorIndex,floor:floorIndex},intersection)})}}}let[intersectionPanoMesh]=intersectionPanos.sort((a,b)=>a.intersection.distance-b.intersection.distance);intersectionPanoMesh?(intersection=intersectionPanoMesh.intersection,this.activePanoMesh!==intersectionPanoMesh.panoMesh&&(this.activePanoMesh=intersectionPanoMesh.panoMesh,this.activeTime=time),this.intersectMesh.position.copy(intersectionPanoMesh.panoMesh.position),this.intersectMesh.lookAt(this.camera.position)):(this.activePanoMesh=void 0,this.activeTime=void 0),intersection||(intersection=this.modelScene.intersectRaycaster(raycaster)[0]);let intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection&&intersection.face){let face=intersection.face.normal,quaternion=new three_webgpu.Quaternion;quaternion.setFromUnitVectors(new three_webgpu.Vector3(0,0,1),face),this.intersectMesh.quaternion.copy(quaternion);let position=intersection.point.clone();this.intersectMesh.position.copy(position),intersectionPanoMesh?this.intersectMesh.visible=!1:this.intersectMesh.visible=!0}else this.intersectMesh.visible=!1;return intersectionPanoMesh==null?void 0:intersectionPanoMesh.panoMesh}onPanGesture(){}onTapGesture(){}onPinchGesture(){}onMouseMove(){}onMouseOut(){}},FLOOR_EPSILON=.01,VERIFIED_REVISION=`183`,XR_TARGET_FLAGS={isXRRenderTarget:!0,_hasExternalTextures:!1,_autoAllocateDepthBuffer:!0,_isOpaqueFramebuffer:!0};function createXRRenderTarget(renderer,width,height,resolveDepthStencil){let target=new three_webgpu.RenderTarget(width,height,{format:three_webgpu.RGBAFormat,type:three_webgpu.UnsignedByteType,colorSpace:renderer.outputColorSpace,stencilBuffer:renderer.stencil===!0,resolveDepthBuffer:resolveDepthStencil,resolveStencilBuffer:resolveDepthStencil});return Object.assign(target,XR_TARGET_FLAGS),target}var RenderTargetBridge=class{constructor(renderer,opts={}){var _a;this.resources=null,this.warnedRevision=!1,this._outputBufferType=null,this.clearColorScratch=new three_webgpu.Color,this.viewportScratch=new three_webgpu.Vector4,this.renderer=renderer,this.atlasSamples=(_a=opts.atlasSamples)==null?0:_a}get outputBufferType(){return this._outputBufferType}verify(){let renderer=this.renderer,problems=[],backend=renderer.backend;backend?(backend.isWebGLBackend!==!0&&problems.push(`backend.isWebGLBackend`),typeof backend.setXRTarget!=`function`&&problems.push(`backend.setXRTarget`)):problems.push(`renderer.backend`),typeof renderer.setOutputRenderTarget!=`function`&&problems.push(`renderer.setOutputRenderTarget`),typeof renderer.getOutputRenderTarget!=`function`&&problems.push(`renderer.getOutputRenderTarget`);let probe=createXRRenderTarget(this.renderer,1,1,!0);try{let record=probe;for(let[name,expected]of Object.entries(XR_TARGET_FLAGS))record[name]!==expected&&problems.push(`xrRT.${name}(期望 ${String(expected)},实际 ${String(record[name])})`);for(let name of[`multiview`,`resolveDepthBuffer`])record[name]===void 0&&problems.push(`xrRT.${name}`)}finally{probe.dispose()}if(problems.length>0)throw Error(`[RenderTargetBridge] three 内部 API 校验失败(THREE.REVISION=${three_webgpu.REVISION}),缺失或不符:${problems.join(`、`)}`);three_webgpu.REVISION!==VERIFIED_REVISION&&!this.warnedRevision&&(this.warnedRevision=!0,console.warn(`[RenderTargetBridge] THREE.REVISION=${three_webgpu.REVISION},XR 标志位语义仅在 r${VERIFIED_REVISION} 复核过,继续运行`))}verifyCameras(cameras){let expected=this.renderer.coordinateSystem,mismatched=cameras.map((camera,index)=>camera.coordinateSystem===expected?null:index).filter(index=>index!==null);if(mismatched.length>0)throw Error(`[RenderTargetBridge] Eye_Camera[${mismatched.join(`,`)}] 的 coordinateSystem 与 renderer(${expected})不一致,three 会改写其投影矩阵(THREE.REVISION=${three_webgpu.REVISION})`)}init(layer){var _a,_b,_c;this.build(layer),this._outputBufferType=(_c=(_b=(_a=this.renderer).getOutputBufferType)==null?void 0:_b.call(_a))==null?null:_c}renderFrame(layer,scene,eyes){let renderer=this.renderer,internal=renderer,backend=internal.backend,saved={autoClear:renderer.autoClear,autoClearColor:renderer.autoClearColor,autoClearDepth:renderer.autoClearDepth,autoClearStencil:renderer.autoClearStencil,viewport:renderer.getViewport(this.viewportScratch).clone(),scissorTest:renderer.getScissorTest(),clearAlpha:renderer.getClearAlpha(),output:internal.getOutputRenderTarget(),rt:renderer.getRenderTarget(),clearColor:internal.getClearColor(this.clearColorScratch).clone()};try{let{atlas,xrRT,quad,width,height}=this.syncResources(layer);renderer.setScissorTest(!1),renderer.setRenderTarget(atlas);let background=scene.background;renderer.setClearColor(background instanceof three_webgpu.Color?background:saved.clearColor,1),renderer.clear(!0,!0,!1),renderer.autoClear=!1,renderer.autoClearColor=!1,renderer.autoClearDepth=!1,renderer.autoClearStencil=!1;for(let eye of eyes){let v=eye.viewport;atlas.viewport.set(v.x,height-v.height-v.y,v.width,v.height),renderer.render(scene,eye.camera)}renderer.setScissorTest(!1),backend.setXRTarget(layer.framebuffer),renderer.setRenderTarget(null),internal.setOutputRenderTarget(xrRT);let pixelRatio=renderer.getPixelRatio();renderer.setViewport(0,0,(width+FLOOR_EPSILON)/pixelRatio,(height+FLOOR_EPSILON)/pixelRatio),quad.render(renderer)}finally{internal.setOutputRenderTarget(saved.output),backend.setXRTarget(null),renderer.setRenderTarget(saved.rt),renderer.autoClear=saved.autoClear,renderer.autoClearColor=saved.autoClearColor,renderer.autoClearDepth=saved.autoClearDepth,renderer.autoClearStencil=saved.autoClearStencil,renderer.setScissorTest(saved.scissorTest),renderer.setViewport(saved.viewport),renderer.setClearColor(saved.clearColor,saved.clearAlpha)}}dispose(){var _a,_b,_c;if(!this.resources)return;this.releaseResources();let internal=this.renderer;(_b=(_a=internal.backend)==null?void 0:_a.setXRTarget)==null||_b.call(_a,null),(_c=internal.setOutputRenderTarget)==null||_c.call(internal,null),this._outputBufferType=null}syncResources(layer){let current=this.resources;return current&¤t.layer===layer&¤t.width===layer.framebufferWidth&¤t.height===layer.framebufferHeight?current:this.build(layer)}build(layer){this.releaseResources();let width=layer.framebufferWidth,height=layer.framebufferHeight,atlas=new three_webgpu.RenderTarget(width,height,{format:three_webgpu.RGBAFormat,type:this.supportsHalfFloat()?three_webgpu.HalfFloatType:three_webgpu.UnsignedByteType,colorSpace:three_webgpu.LinearSRGBColorSpace,depthBuffer:!0,stencilBuffer:!1,samples:this.atlasSamples,generateMipmaps:!1,minFilter:three_webgpu.LinearFilter,magFilter:three_webgpu.LinearFilter}),xrRT=createXRRenderTarget(this.renderer,width,height,layer.ignoreDepthValues===!1),material=new three_webgpu.NodeMaterial;material.fragmentNode=(0,three_tsl.vec4)((0,three_tsl.texture)(atlas.texture).rgb,1),material.depthTest=!1,material.depthWrite=!1;let quad=new three_webgpu.QuadMesh(material);return this.resources={layer,width,height,atlas,xrRT,quad},this.resources}releaseResources(){let res=this.resources;res&&(this.resources=null,res.atlas.dispose(),res.xrRT.dispose(),res.quad.material.dispose())}supportsHalfFloat(){var _a;let gl=(_a=this.renderer.backend)==null?void 0:_a.gl;return gl?!!gl.getExtension(`EXT_color_buffer_float`)||!!gl.getExtension(`EXT_color_buffer_half_float`):!1}},InputSourceTracker=class{constructor(){this.root=new three_webgpu.Group,this._entries=new Map,this._dir=new three_webgpu.Vector3}add(sources){for(let source of sources){if(this._entries.has(source))continue;let targetRay=new three_webgpu.Object3D,grip=new three_webgpu.Object3D;targetRay.visible=!1,grip.visible=!1,this.root.add(targetRay,grip),this._entries.set(source,{source,targetRay,grip,rayFrame:-1})}}remove(sources){let removed=[];for(let source of sources){let entry=this._entries.get(source);entry&&(this._entries.delete(source),this.root.remove(entry.targetRay,entry.grip),removed.push(entry))}return removed}update(frame,ref,offset,frameNo){for(let entry of this._entries.values()){let{source,targetRay,grip}=entry,rayPose=frame.getPose(source.targetRaySpace,ref),gripPose=source.gripSpace?frame.getPose(source.gripSpace,ref):null;rayPose?(this._applyPose(targetRay,rayPose,offset),entry.rayFrame=frameNo):targetRay.visible=!1,rayPose&&gripPose?this._applyPose(grip,gripPose,offset):grip.visible=!1}}hideAll(){for(let{targetRay,grip}of this._entries.values())targetRay.visible=!1,grip.visible=!1}fill(source,raycaster,frameNo){let entry=this._entries.get(source);if(!entry||entry.rayFrame!==frameNo||!entry.targetRay.visible)return!1;let{matrixWorld}=entry.targetRay;return raycaster.ray.origin.setFromMatrixPosition(matrixWorld),raycaster.ray.direction.copy(this._dir.set(0,0,-1).transformDirection(matrixWorld)),!0}clear(){for(let{targetRay,grip}of this._entries.values())this.root.remove(targetRay,grip);this._entries.clear()}entries(){return this._entries}_applyPose(node,pose,offset){let{position:p,orientation:o}=pose.transform;node.position.set(offset.x+p.x,offset.y+p.y,offset.z+p.z),node.quaternion.set(o.x,o.y,o.z,o.w),node.visible=!0,node.updateMatrixWorld(!0)}},DEFAULT_REFERENCE_SPACE_TIMEOUT_MS=5e3;function buildChain(preferred){let deduped=[...new Set([preferred,`local`,`viewer`])];return deduped.slice(0,deduped.indexOf(`viewer`)+1)}function createAbortedError(){let error=Error(`会话在参考空间解析前已结束`);return error.aborted=!0,error}function formatFailures(failures){return failures.map(item=>`${item.type}(${item.reason})`).join(`, `)}function resolveReferenceSpace(session_1,preferred_1){return(0,tslib.__awaiter)(this,arguments,void 0,function*(session,preferred,opts={}){var _a,_b,_c;let timeoutMs=(_a=opts.timeoutMs)==null?DEFAULT_REFERENCE_SPACE_TIMEOUT_MS:_a,isAborted=opts.isAborted,schedule=(_b=opts.schedule)==null?((callback,ms)=>setTimeout(callback,ms)):_b,clear=(_c=opts.clear)==null?(handle=>clearTimeout(handle)):_c,chain=buildChain(preferred),failures=[];for(let type of chain){let result=yield attempt(session,type,timeoutMs,schedule,clear);if(isAborted!=null&&isAborted())throw createAbortedError();if(result.ok)return type!==preferred&&console.warn(`[XR] 参考空间降级:期望 ${preferred},实际采用 ${type};失败:${formatFailures(failures)}`),{space:result.space,type,failures};failures.push({type,reason:result.reason})}let error=Error(`所有参考空间均不可用(期望 ${preferred}):${formatFailures(failures)}`);throw error.attempts=failures,error})}function attempt(session,type,timeoutMs,schedule,clear){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let handle,settled=!1,request=new Promise(resolve=>{let onSuccess=space=>{settled||resolve({ok:!0,space})},onFailure=()=>{settled||resolve({ok:!1,reason:`rejected`})};try{session.requestReferenceSpace(type).then(onSuccess,onFailure)}catch(_a){onFailure()}}),timeout=new Promise(resolve=>{handle=schedule(()=>resolve({ok:!1,reason:`timeout`}),timeoutMs)});try{return yield Promise.race([request,timeout])}finally{settled=!0,clear(handle)}})}var DEFAULT_FIRST_FRAME_TIMEOUT_MS=5e3,ENDED_DURING_ENTER_MESSAGE=`会话在进入过程中已结束`,XRManager=class{static isBackendXRCapable(renderer){let backend=renderer.backend;return(backend==null?void 0:backend.isWebGPUBackend)!==!0}static isBrowserXRCapable(){return typeof navigator<`u`&&`xr`in navigator}get isPresenting(){return this._isPresenting}get session(){return this._session}get frame(){return this._frame}get referenceSpaceType(){return this._referenceSpaceType}constructor(renderer,options,callbacks){var _a;this.inputs=new InputSourceTracker,this._isPresenting=!1,this._session=null,this._frame=null,this._referenceSpaceType=null,this.refSpace=null,this.layer=null,this.entering=!1,this.entered=!1,this.endedDuringEnter=!1,this.snapshot=null,this.listeners=[],this.firstFrameArrived=!1,this.firstFrameWaiter=null,this.frameNo=0,this.submittedNear=NaN,this.submittedFar=NaN,this.offset=new three_webgpu.Vector3,this.info={time:0,hasPose:!1,headOrientation:new three_webgpu.Quaternion,headLocal:new three_webgpu.Vector3,views:[]},this.viewPool=[{eye:0,viewport:new three_webgpu.Vector4},{eye:1,viewport:new three_webgpu.Vector4}],this.frameViews=[],this.bridgeEyes=[],this.tmpViewport=new three_webgpu.Vector4,this.tmpSize=new three_webgpu.Vector2,this.onSessionEndEvent=()=>{var _a;if(this._session){if(!this.entered){this.endedDuringEnter=!0,(_a=this.firstFrameWaiter)==null||_a.reject(Error(ENDED_DURING_ENTER_MESSAGE));return}this.teardown()}},this.onInputSourcesChangeEvent=event=>{var _a,_b;if(!this._session)return;let{added,removed}=event;this.inputs.add(added),this.inputs.remove(removed),(_b=(_a=this.callbacks).onInputSourcesChange)==null||_b.call(_a,added,removed)},this.onSelectEvent=event=>{var _a,_b;(_b=(_a=this.callbacks).onSelect)==null||_b.call(_a,event.inputSource)},this.onReferenceSpaceReset=()=>{},this.renderer=renderer,this.options=options==null?{}:options,this.callbacks=callbacks,this.bridge=new RenderTargetBridge(renderer,{atlasSamples:(_a=this.options.atlasSamples)==null?0:_a}),this.device=detectDeviceType(),this.profile=resolveProfile(this.device,this.options.deviceProfile,field=>{console.warn(`[XR] Device_Profile 字段 ${field} 非法,已回落默认值`)});let createEyeCamera=()=>{let camera=new three_webgpu.PerspectiveCamera;return camera.coordinateSystem=renderer.coordinateSystem,camera};this.eyeCameras=[createEyeCamera(),createEyeCamera()],this.info.views=this.frameViews}enter(session){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){var _a,_b;if(!(this.entering||this.entered)){this.entering=!0,this.endedDuringEnter=!1,this.firstFrameArrived=!1,this._session=session;try{this.snapshot=this.captureRendererState(),this.bridge.verify(),this.bridge.verifyCameras(this.eyeCameras);let gl=(_a=this.renderer.backend)==null?void 0:_a.gl;if(!gl)throw Error(`[XRManager] 取不到 WebGL2 上下文(renderer.backend.gl),无法创建 XRWebGLLayer`);this.listen(session,`end`,this.onSessionEndEvent),this.listen(session,`inputsourceschange`,this.onInputSourcesChangeEvent),this.listen(session,`select`,this.onSelectEvent),yield gl.makeXRCompatible(),this.throwIfEnded();let attributes=gl.getContextAttributes(),layer=new XRWebGLLayer(session,gl,{alpha:!1,framebufferScaleFactor:1,antialias:attributes==null?void 0:attributes.antialias,depth:attributes==null?void 0:attributes.depth,stencil:attributes==null?void 0:attributes.stencil});this.layer=layer;let foveation=this.options.foveation;foveation!==void 0&&`fixedFoveation`in layer&&(layer.fixedFoveation=require_memoryUsage.M(foveation,0,1)),session.updateRenderState({baseLayer:layer}),this.submittedNear=session.renderState.depthNear,this.submittedFar=session.renderState.depthFar,this.bridge.init(layer);let resolved=yield resolveReferenceSpace(session,(_b=this.options.referenceSpaceType)==null?`local-floor`:_b,{isAborted:()=>this.endedDuringEnter});this.throwIfEnded(),this.refSpace=resolved.space,this._referenceSpaceType=resolved.type,this.listen(resolved.space,`reset`,this.onReferenceSpaceReset),require_imageBitmap.s.shared.setContext(session),yield this.waitFirstFrame(),this.throwIfEnded(),this.syncExistingInputSources(session),this.entering=!1,this.entered=!0,this._isPresenting=!0;try{this.callbacks.onSessionStart(session,this.device)}catch(error){console.error(`[XR] onSessionStart 回调抛错`,error)}}catch(error){throw this.rollback(),this.endedDuringEnter?Error(ENDED_DURING_ENTER_MESSAGE):error}}})}exit(){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let session=this._session;if(!(!this.entered||!session))try{yield session.end()}catch(_a){this._session===session&&this.teardown()}})}dispose(){var _a;let session=this._session;if(this.entering){this.endedDuringEnter=!0,(_a=this.firstFrameWaiter)==null||_a.reject(Error(ENDED_DURING_ENTER_MESSAGE)),session&&this.endQuietly(session);return}this.entered&&session&&(this.teardown(),this.endQuietly(session))}beginFrame(frame,time,station,near,far){let info=this.info;info.time=time;let session=this._session,refSpace=this.refSpace,layer=this.layer;if(!session||!refSpace||!layer)return this.markNoPose(),info;this._frame=frame,this.frameNo++,this.notifyFirstFrame();let pose=frame.getViewerPose(refSpace),views=pose==null?void 0:pose.views,viewCount=views?views.length:0;if(!pose||!views||viewCount!==1&&viewCount!==2||!this.collectViews(layer,views))return this.markNoPose(),this.inputs.hideAll(),info;let sx=0,sy=0,sz=0;for(let i=0;i<viewCount;i++){let p=views[i].transform.position;sx+=p.x,sy+=p.y,sz+=p.z}info.headLocal.set(sx/viewCount,sy/viewCount,sz/viewCount);let q=pose.transform.orientation;info.headOrientation.set(q.x,q.y,q.z,q.w),info.hasPose=!0,this.offset.copy(station).sub(info.headLocal);for(let i=0;i<viewCount;i++){let view=views[i],camera=this.eyeCameras[this.frameViews[i].eye];camera.projectionMatrix.fromArray(view.projectionMatrix),camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();let o=view.transform.orientation;camera.position.copy(station),camera.quaternion.set(o.x,o.y,o.z,o.w),camera.near=near,camera.far=far,camera.updateMatrixWorld(!0)}return this.syncDepthRange(session,near,far),this.inputs.update(frame,refSpace,this.offset,this.frameNo),info}renderEyes(scene){var _a;let layer=this.layer;if(!layer||!this._session||!this.info.hasPose)return!1;let eyes=this.bridgeEyes,views=this.frameViews;eyes.length=views.length;for(let i=0;i<views.length;i++){let entry=(_a=eyes[i])==null?eyes[i]={camera:this.eyeCameras[0],viewport:views[i].viewport}:_a;entry.camera=this.eyeCameras[views[i].eye],entry.viewport=views[i].viewport}return this.bridge.renderFrame(layer,scene,eyes),!0}fillRaycaster(source,raycaster){return this.inputs.fill(source,raycaster,this.frameNo)}markNoPose(){this.info.hasPose=!1,this.frameViews.length=0}collectViews(layer,views){let used=0;this.frameViews.length=0;for(let i=0;i<views.length;i++){let eye=+(views[i].eye===`right`);used&1<<eye&&(eye=+(eye===0)),used|=1<<eye;let viewport=layer.getViewport(views[i]);if(!viewport)return this.frameViews.length=0,!1;let entry=this.viewPool[i];entry.eye=eye,entry.viewport.set(viewport.x,viewport.y,viewport.width,viewport.height),this.frameViews.push(entry)}return!0}syncDepthRange(session,near,far){near===this.submittedNear&&far===this.submittedFar||Number.isFinite(near)&&Number.isFinite(far)&&near>0&&far>near&&(session.updateRenderState({depthNear:near,depthFar:far}),this.submittedNear=near,this.submittedFar=far)}notifyFirstFrame(){var _a;this.firstFrameArrived||(this.firstFrameArrived=!0,(_a=this.firstFrameWaiter)==null||_a.resolve())}throwIfEnded(){if(this.endedDuringEnter)throw Error(ENDED_DURING_ENTER_MESSAGE)}waitFirstFrame(){var _a;if(this.firstFrameArrived)return Promise.resolve();let timeoutMs=(_a=this.options.firstFrameTimeoutMs)==null?DEFAULT_FIRST_FRAME_TIMEOUT_MS:_a;return new Promise((resolve,reject)=>{let timer=setTimeout(()=>{this.firstFrameWaiter=null,reject(Error(`等待首帧超时(${timeoutMs}ms 内未收到首个 XRFrame)`))},timeoutMs);this.firstFrameWaiter={resolve:()=>{clearTimeout(timer),this.firstFrameWaiter=null,resolve()},reject:error=>{clearTimeout(timer),this.firstFrameWaiter=null,reject(error)}}})}syncExistingInputSources(session){var _a,_b,_c;let tracked=this.inputs.entries(),added=Array.from((_a=session.inputSources)==null?[]:_a).filter(source=>!tracked.has(source));added.length!==0&&(this.inputs.add(added),(_c=(_b=this.callbacks).onInputSourcesChange)==null||_c.call(_b,added,[]))}listen(target,type,handler){target.addEventListener(type,handler),this.listeners.push({target,type,handler})}removeListeners(){for(let{target,type,handler}of this.listeners)target.removeEventListener(type,handler);this.listeners.length=0}captureRendererState(){let renderer=this.renderer;return{viewport:renderer.getViewport(new three_webgpu.Vector4).clone(),autoClear:renderer.autoClear,autoClearColor:renderer.autoClearColor,autoClearDepth:renderer.autoClearDepth,autoClearStencil:renderer.autoClearStencil,pixelRatio:renderer.getPixelRatio(),size:renderer.getSize(new three_webgpu.Vector2).clone()}}restoreRendererState(){let saved=this.snapshot;if(!saved)return;this.snapshot=null;let renderer=this.renderer;renderer.autoClear=saved.autoClear,renderer.autoClearColor=saved.autoClearColor,renderer.autoClearDepth=saved.autoClearDepth,renderer.autoClearStencil=saved.autoClearStencil,renderer.getPixelRatio()!==saved.pixelRatio&&renderer.setPixelRatio(saved.pixelRatio),renderer.getSize(this.tmpSize).equals(saved.size)||renderer.setSize(saved.size.x,saved.size.y),renderer.getViewport(this.tmpViewport).equals(saved.viewport)||renderer.setViewport(saved.viewport)}releaseFrameSource(session){let loop=require_imageBitmap.s.shared;session&&loop.getContext()===session&&loop.setContext(null)}clearReferences(){this._session=null,this._frame=null,this.refSpace=null,this._referenceSpaceType=null,this.layer=null,this.markNoPose(),this.frameNo=0,this.firstFrameArrived=!1,this.submittedNear=NaN,this.submittedFar=NaN}rollback(){var _a;let session=this._session;(_a=this.firstFrameWaiter)==null||_a.reject(Error(ENDED_DURING_ENTER_MESSAGE)),this.removeListeners(),this.inputs.clear(),this.bridge.dispose(),this.releaseFrameSource(session),this.restoreRendererState(),this.clearReferences(),this._isPresenting=!1,this.entering=!1,this.entered=!1}teardown(){var _a,_b;let session=this._session;if(session){this._isPresenting=!1,this.entered=!1;try{(_b=(_a=this.callbacks).onSessionEnding)==null||_b.call(_a)}catch(error){console.error(`[XR] onSessionEnding 回调抛错`,error)}this.inputs.clear(),this.bridge.dispose(),this.removeListeners(),this.releaseFrameSource(session),this.restoreRendererState(),this.clearReferences(),this.callbacks.onSessionEnd(this.device)}}endQuietly(session){try{Promise.resolve(session.end()).catch(()=>{})}catch(_a){}}},MotionControllerConstants={Handedness:Object.freeze({NONE:`none`,LEFT:`left`,RIGHT:`right`}),ComponentState:Object.freeze({DEFAULT:`default`,TOUCHED:`touched`,PRESSED:`pressed`}),ComponentProperty:Object.freeze({BUTTON:`button`,X_AXIS:`xAxis`,Y_AXIS:`yAxis`,STATE:`state`}),ComponentType:Object.freeze({TRIGGER:`trigger`,SQUEEZE:`squeeze`,TOUCHPAD:`touchpad`,THUMBSTICK:`thumbstick`,BUTTON:`button`}),ButtonTouchThreshold:.05,AxisTouchThreshold:.1,VisualResponseProperty:Object.freeze({TRANSFORM:`transform`,VISIBILITY:`visibility`})};function fetchJsonFile(path){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let response=yield fetch(path);if(response.ok)return response.json();throw Error(response.statusText)})}function fetchProfilesList(basePath){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){if(!basePath)throw Error(`No basePath supplied`);return yield fetchJsonFile(`${basePath}/profilesList.json`)})}function fetchProfile(xrInputSource_1,basePath_1){return(0,tslib.__awaiter)(this,arguments,void 0,function*(xrInputSource,basePath,defaultProfile=null,getAssetPath=!0){if(!xrInputSource)throw Error(`No xrInputSource supplied`);if(!basePath)throw Error(`No basePath supplied`);let supportedProfilesList=yield fetchProfilesList(basePath),match;if(xrInputSource.profiles.some(profileId=>{let supportedProfile=supportedProfilesList[profileId];return supportedProfile&&(match={profileId,profilePath:`${basePath}/${supportedProfile.path}`,deprecated:!!supportedProfile.deprecated}),!!match}),!match){if(!defaultProfile)throw Error(`No matching profile name found`);let supportedProfile=supportedProfilesList[defaultProfile];if(!supportedProfile)throw Error(`No matching profile name found and default profile "${defaultProfile}" missing.`);match={profileId:defaultProfile,profilePath:`${basePath}/${supportedProfile.path}`,deprecated:!!supportedProfile.deprecated}}let profile=yield fetchJsonFile(match.profilePath),assetPath;if(getAssetPath){let layout;if(layout=profile.layouts[xrInputSource.handedness],!layout)throw Error(`No matching handedness, ${xrInputSource.handedness}, in profile ${match.profileId}`);layout.assetPath&&(assetPath=match.profilePath.replace(`profile.json`,layout.assetPath))}return{profile,assetPath}})}var defaultComponentValues={xAxis:0,yAxis:0,button:0,state:MotionControllerConstants.ComponentState.DEFAULT};function normalizeAxes(x=0,y=0){let xAxis=x,yAxis=y;if(Math.sqrt(x*x+y*y)>1){let theta=Math.atan2(y,x);xAxis=Math.cos(theta),yAxis=Math.sin(theta)}return{normalizedXAxis:xAxis*.5+.5,normalizedYAxis:yAxis*.5+.5}}var VisualResponse=class{constructor(visualResponseDescription){this.componentProperty=visualResponseDescription.componentProperty,this.states=visualResponseDescription.states,this.valueNodeName=visualResponseDescription.valueNodeName,this.valueNodeProperty=visualResponseDescription.valueNodeProperty,this.valueNodeProperty===MotionControllerConstants.VisualResponseProperty.TRANSFORM&&(this.minNodeName=visualResponseDescription.minNodeName,this.maxNodeName=visualResponseDescription.maxNodeName),this.value=0,this.updateFromComponent(defaultComponentValues)}updateFromComponent({xAxis,yAxis,button,state}){let{normalizedXAxis,normalizedYAxis}=normalizeAxes(xAxis,yAxis);switch(this.componentProperty){case MotionControllerConstants.ComponentProperty.X_AXIS:this.value=this.states.includes(state)?normalizedXAxis:.5;break;case MotionControllerConstants.ComponentProperty.Y_AXIS:this.value=this.states.includes(state)?normalizedYAxis:.5;break;case MotionControllerConstants.ComponentProperty.BUTTON:this.value=this.states.includes(state)?button:0;break;case MotionControllerConstants.ComponentProperty.STATE:this.valueNodeProperty===MotionControllerConstants.VisualResponseProperty.VISIBILITY?this.value=this.states.includes(state):this.value=+!!this.states.includes(state);break;default:throw Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`)}}},Component=class{constructor(componentId,componentDescription){if(!componentId||!componentDescription||!componentDescription.visualResponses||!componentDescription.gamepadIndices||Object.keys(componentDescription.gamepadIndices).length===0)throw Error(`Invalid arguments supplied`);this.id=componentId,this.type=componentDescription.type,this.rootNodeName=componentDescription.rootNodeName,this.touchPointNodeName=componentDescription.touchPointNodeName,this.visualResponses={},Object.keys(componentDescription.visualResponses).forEach(responseName=>{let visualResponse=new VisualResponse(componentDescription.visualResponses[responseName]);this.visualResponses[responseName]=visualResponse}),this.gamepadIndices=Object.assign({},componentDescription.gamepadIndices),this.values={state:MotionControllerConstants.ComponentState.DEFAULT,button:this.gamepadIndices.button===void 0?void 0:0,xAxis:this.gamepadIndices.xAxis===void 0?void 0:0,yAxis:this.gamepadIndices.yAxis===void 0?void 0:0}}get data(){return Object.assign({id:this.id},this.values)}updateFromGamepad(gamepad){if(this.values.state=MotionControllerConstants.ComponentState.DEFAULT,this.gamepadIndices.button!==void 0&&gamepad.buttons.length>this.gamepadIndices.button){let gamepadButton=gamepad.buttons[this.gamepadIndices.button];this.values.button=gamepadButton.value,this.values.button=this.values.button<0?0:this.values.button,this.values.button=this.values.button>1?1:this.values.button,gamepadButton.pressed||this.values.button===1?this.values.state=MotionControllerConstants.ComponentState.PRESSED:(gamepadButton.touched||this.values.button>MotionControllerConstants.ButtonTouchThreshold)&&(this.values.state=MotionControllerConstants.ComponentState.TOUCHED)}this.gamepadIndices.xAxis!==void 0&&gamepad.axes.length>this.gamepadIndices.xAxis&&(this.values.xAxis=gamepad.axes[this.gamepadIndices.xAxis],this.values.xAxis=this.values.xAxis<-1?-1:this.values.xAxis,this.values.xAxis=this.values.xAxis>1?1:this.values.xAxis,this.values.state===MotionControllerConstants.ComponentState.DEFAULT&&Math.abs(this.values.xAxis)>MotionControllerConstants.AxisTouchThreshold&&(this.values.state=MotionControllerConstants.ComponentState.TOUCHED)),this.gamepadIndices.yAxis!==void 0&&gamepad.axes.length>this.gamepadIndices.yAxis&&(this.values.yAxis=gamepad.axes[this.gamepadIndices.yAxis],this.values.yAxis=this.values.yAxis<-1?-1:this.values.yAxis,this.values.yAxis=this.values.yAxis>1?1:this.values.yAxis,this.values.state===MotionControllerConstants.ComponentState.DEFAULT&&Math.abs(this.values.yAxis)>MotionControllerConstants.AxisTouchThreshold&&(this.values.state=MotionControllerConstants.ComponentState.TOUCHED)),Object.values(this.visualResponses).forEach(visualResponse=>{visualResponse.updateFromComponent(this.values)})}},MotionController=class{constructor(xrInputSource,profile,assetUrl){if(!xrInputSource)throw Error(`No xrInputSource supplied`);if(!profile)throw Error(`No profile supplied`);this.xrInputSource=xrInputSource,this.assetUrl=assetUrl,this.id=profile.profileId,this.layoutDescription=profile.layouts[xrInputSource.handedness],this.components={},Object.keys(this.layoutDescription.components).forEach(componentId=>{let componentDescription=this.layoutDescription.components[componentId];this.components[componentId]=new Component(componentId,componentDescription)}),this.updateFromGamepad()}get gripSpace(){return this.xrInputSource.gripSpace}get targetRaySpace(){return this.xrInputSource.targetRaySpace}get data(){let data=[];return Object.values(this.components).forEach(component=>{data.push(component.data)}),data}updateFromGamepad(){Object.values(this.components).forEach(component=>{component.updateFromGamepad(this.xrInputSource.gamepad)})}},DEFAULT_PROFILES_PATH=`https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles`,DEFAULT_PROFILE=`generic-trigger`,XRControllerModel=class extends three_webgpu.Object3D{constructor(){super(),this.motionController=null,this.envMap=null}setEnvironmentMap(envMap){return this.envMap==envMap?this:(this.envMap=envMap,this.traverse(child=>{child instanceof three_webgpu.Mesh&&child.isMesh&&(child.material.envMap=this.envMap,child.material.needsUpdate=!0)}),this)}updateMatrixWorld(force){super.updateMatrixWorld(force),this.motionController&&(this.motionController.updateFromGamepad(),Object.values(this.motionController.components).forEach(component=>{Object.values(component.visualResponses).forEach(visualResponse=>{let{valueNode,minNode,maxNode,value,valueNodeProperty}=visualResponse;valueNode&&(valueNodeProperty===MotionControllerConstants.VisualResponseProperty.VISIBILITY?valueNode.visible=value:valueNodeProperty===MotionControllerConstants.VisualResponseProperty.TRANSFORM&&(valueNode.quaternion.copy(minNode.quaternion).slerp(maxNode.quaternion,value),valueNode.position.lerpVectors(minNode.position,maxNode.position,value)))})}))}};function findNodes(motionController,scene){Object.values(motionController.components).forEach(component=>{let{type,touchPointNodeName,visualResponses}=component;if(type===MotionControllerConstants.ComponentType.TOUCHPAD)if(component.touchPointNode=scene.getObjectByName(touchPointNodeName),component.touchPointNode){let sphere=new three_webgpu.Mesh(new three_webgpu.SphereGeometry(.001),new three_webgpu.MeshBasicMaterial({color:255}));component.touchPointNode.add(sphere)}else console.warn(`Could not find touch dot, ${component.touchPointNodeName}, in touchpad component ${component.id}`);Object.values(visualResponses).forEach(visualResponse=>{let{valueNodeName,minNodeName,maxNodeName,valueNodeProperty}=visualResponse;if(valueNodeProperty===MotionControllerConstants.VisualResponseProperty.TRANSFORM){if(visualResponse.minNode=scene.getObjectByName(minNodeName),visualResponse.maxNode=scene.getObjectByName(maxNodeName),!visualResponse.minNode){console.warn(`Could not find ${minNodeName} in the model`);return}if(!visualResponse.maxNode){console.warn(`Could not find ${maxNodeName} in the model`);return}}visualResponse.valueNode=scene.getObjectByName(valueNodeName),visualResponse.valueNode||console.warn(`Could not find ${valueNodeName} in the model`)})})}function addAssetSceneToControllerModel(controllerModel,scene){findNodes(controllerModel.motionController,scene),controllerModel.envMap&&scene.traverse(child=>{child instanceof three_webgpu.Mesh&&child.isMesh&&(child.material.envMap=controllerModel.envMap,child.material.needsUpdate=!0)}),controllerModel.add(scene)}var XRControllerModelFactory=class{constructor(gltfLoader=null){this.gltfLoader=gltfLoader,this.path=DEFAULT_PROFILES_PATH,this._assetCache={}}createControllerModel(controller){let controllerModel=new XRControllerModel,scene=null;return controller.addEventListener(`connected`,event=>{let xrInputSource=event.data;xrInputSource.targetRayMode!==`tracked-pointer`||!xrInputSource.gamepad||fetchProfile(xrInputSource,this.path,DEFAULT_PROFILE).then(({profile,assetPath})=>{controllerModel.motionController=new MotionController(xrInputSource,profile,assetPath);let cachedAsset=this._assetCache[controllerModel.motionController.assetUrl];if(cachedAsset)scene=cachedAsset.scene.clone(),addAssetSceneToControllerModel(controllerModel,scene);else{if(!this.gltfLoader)throw Error(`GLTFLoader not set.`);this.gltfLoader.load(controllerModel.motionController.assetUrl,asset=>{this._assetCache[controllerModel.motionController.assetUrl]=asset,scene=asset.scene.clone(),addAssetSceneToControllerModel(controllerModel,scene)})}}).catch(err=>{console.warn(err)})}),controller.addEventListener(`disconnected`,()=>{controllerModel.motionController=null,controllerModel.remove(scene),scene=null}),controllerModel}},ButtonStateMachine=class{constructor(){this.states=new Map}sample(source,name,pressed,time){let sourceStates=this.states.get(source),state=sourceStates==null?void 0:sourceStates.get(name);if(!state){if(!pressed)return[];let map=sourceStates;return map||(map=new Map,this.states.set(source,map)),map.set(name,{downAt:time,pressFired:!1}),[{type:`buttonDown`,name,source,time,duration:0}]}let duration=time-state.downAt,reachedThreshold=duration>=300;if(pressed)return reachedThreshold&&!state.pressFired?(state.pressFired=!0,[{type:`press`,name,source,time,duration}]):[];this.deleteState(source,name);let events=[];return state.pressFired?events.push({type:`buttonUp`,name,source,time,duration}):reachedThreshold?(events.push({type:`press`,name,source,time,duration}),events.push({type:`buttonUp`,name,source,time,duration})):(events.push({type:`buttonUp`,name,source,time,duration}),events.push({type:`tap`,name,source,time,duration})),events}removeSource(source,time){let sourceStates=this.states.get(source);if(!sourceStates)return[];let events=[];for(let[name,state]of sourceStates)events.push({type:`buttonUp`,name,source,time,duration:time-state.downAt});return this.states.delete(source),events}reset(time){let events=[];for(let[source,sourceStates]of this.states)for(let[name,state]of sourceStates)events.push({type:`buttonUp`,name,source,time,duration:time-state.downAt});return this.states.clear(),events}deleteState(source,name){let sourceStates=this.states.get(source);sourceStates&&(sourceStates.delete(name),sourceStates.size===0&&this.states.delete(source))}},defaultXRPanoramaControllerCustomInitArgs=Object.assign(Object.assign({},require_pick.t(defaultPanoramaControllerCustomInitArgs,[`maxLatitude`,`minLatitude`])),{referenceSpaceType:`local-floor`,foveation:1,showControllerModel:!0,showPointerRay:!0,deviceProfile:{}}),POINTER_RAY_LENGTH=5,POINTER_RAY_LENGTH_EPSILON=1e-4,ACTIVE_TO_CURRENT_DELAY=1500;function createGltfLoaderBridge(){return{load(url,callback){require_memoryUsage.u.ajax(url,{responseType:`arraybuffer`}).then(response=>{var _a;return require_glTF_helpers.t(response.body,{resourcePath:url.slice(0,url.lastIndexOf(`/`)+1),search:(_a=url.split(`?`)[1])==null?``:_a,fetcher:require_memoryUsage.u})}).then(result=>callback(result)).catch(error=>{console.warn(`[XRPanorama] 手柄模型 glTF 加载失败,跳过模型挂载:`,url,error)})}}}var XRPanoramaController=class XRPanoramaController extends PanoramaController{static parseArgs(args){if(args instanceof XRPanoramaController)return args;let args_=Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2});return super.parseArgs(args_)}static initAnimationEndState(args){let args_=this.parseArgs(args),state=super.initAnimationEndState(args_);return Object.assign(Object.assign({},state),{mode:`XRPanorama`})}constructor(args){var _a,_b,_c,_d,_e;let args_=XRPanoramaController.parseArgs(args);super(args_),this.controllerRayFilled={left:!1,right:!1},this.controllerModelFactory=null,this.buttonStateMachine=new ButtonStateMachine,this.inputVisuals=new Map,this.inputsDirty=!1,this.walkedThisFrame=!1,this.lastFrameTime=0,this.walkSources={left:null,right:null},this.gazeRayPool=null,this.mode=`XRPanorama`;let defaults=defaultXRPanoramaControllerCustomInitArgs,referenceSpaceType=(_a=args.referenceSpaceType)==null?defaults.referenceSpaceType:_a,foveation=(_b=args.foveation)==null?defaults.foveation:_b;this.showControllerModel=(_c=args.showControllerModel)==null?defaults.showControllerModel:_c,this.showPointerRay=(_d=args.showPointerRay)==null?defaults.showPointerRay:_d,this.controllerRaycasters={left:this.createPickingRaycaster(),right:this.createPickingRaycaster()},this.gazeRaycaster=null,this.xrManager=new XRManager(this.renderer,{referenceSpaceType,foveation,deviceProfile:(_e=args.deviceProfile)==null?defaults.deviceProfile:_e},{onSessionStart:(session,device)=>{this.emit(`xr.session.start`,createEvent(`xr.session.start`,{session,machineType:toPublicMachineType(device)}))},onSessionEnd:device=>{this.emit(`xr.session.end`,createEvent(`xr.session.end`,{session:null,machineType:toPublicMachineType(device)}))},onSessionEnding:()=>{this.resetButtonStates(),this.clearInputVisuals()},onSelect:source=>this.onXRSelect(source),onInputSourcesChange:(added,removed)=>{for(let source of removed){this.removeInputVisual(source);for(let event of this.buttonStateMachine.removeSource(source,this.lastFrameTime))this.dispatchButtonEvent(event)}for(let source of added)this.syncInputVisual(source)}}),this.buttonMaps={left:this.createButtonMap(`left`),right:this.createButtonMap(`right`)},this.scene.add(this.xrManager.inputs.root);let session=require_imageBitmap.s.shared.getContext();(session?this.xrManager.enter(session):Promise.reject(Error(`[XR] 缺少 XRSession:请经 Five.changeMode 进入 XRPanorama`))).catch(error=>{console.error(`[XR] 进入失败`,error),this.emit(`error`,error instanceof Error?error:Error(String(error)))})}updateConfiguration(args){let result=super.updateConfiguration(Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2}));return args.showControllerModel!==void 0&&args.showControllerModel!==this.showControllerModel&&(this.showControllerModel=args.showControllerModel,this.inputsDirty=!0),args.showPointerRay!==void 0&&args.showPointerRay!==this.showPointerRay&&(this.showPointerRay=args.showPointerRay,this.inputsDirty=!0),result}updateTime(time,deltaTime,...args){var _a,_b;if(this.destroyed)return;this.walkedThisFrame=!1,this.lastFrameTime=time;let frame=args[1];if(this.userAction=!0,this.needsRender=!0,!frame){this.controllerRayFilled.left=!1,this.controllerRayFilled.right=!1,this.gazeRaycaster=null,super.updateTime(time,deltaTime),this.intersect(time);return}super.updateTime(time,deltaTime);let info=this.xrManager.beginFrame(frame,time,this.camera.position,this.camera.near,this.camera.far);if(info.hasPose&&this.syncCameraFromXR(info.headOrientation),this.inputsDirty){this.inputsDirty=!1;for(let source of this.xrManager.inputs.entries().keys())this.syncInputVisual(source)}this.updateControllerHelper((_b=(_a=this.xrManager.session)==null?void 0:_a.inputSources)==null?[]:_b,time,deltaTime),this.updateGazeRay(),this.intersect(time)}syncCameraFromXR(headOrientation){this.camera.quaternion.copy(headOrientation),this.camera.matrix.compose(this.camera.position,this.camera.quaternion,this.camera.scale),this.camera.computePose(this.camera.pose.distance)}render(){return this.xrManager.isPresenting?(this.xrManager.renderEyes(this.scene),!0):!1}updateCamera(pose,duration,userAction){return Promise.resolve()}updateCameraWithKeyframes(keyframes,duration,userAction){return Promise.resolve()}setCamera(cameraPose={}){cameraPose.offset&&this.camera.position.copy(cameraPose.offset),this.camera.matrix.compose(this.camera.position,this.camera.quaternion,this.camera.scale),this.camera.computePose(this.camera.pose.distance)}updateRenderSize(){this.needsRender=!0}isReady(){return!1}createPickingRaycaster(){let raycaster=new three_webgpu.Raycaster;return raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.floorIndex=-1,raycaster}updateControllerHelper(inputSources,time,deltaTime){var _a,_b,_c;if(this.controllerRayFilled.left=!1,this.controllerRayFilled.right=!1,this.walkSources.left=null,this.walkSources.right=null,!inputSources||inputSources.length===0)return;let leftAxes={up:0,down:0,left:0,right:0},rightAxes={up:0,down:0,left:0,right:0},buttons={X:!1,Y:!1,LeftTrigger:!1,LeftPinch:!1,A:!1,B:!1,RightTrigger:!1,RightPinch:!1};for(let i=0;i<inputSources.length;i++){let inputSource=inputSources[i];if(!inputSource)continue;let hand=inputSource.handedness===`left`?`left`:`right`;this.xrManager.fillRaycaster(inputSource,this.controllerRaycasters[hand])&&(this.controllerRayFilled[hand]=!0),this.readAxes(inputSource.gamepad,hand===`left`?leftAxes:rightAxes);let gamepadButtons=(_a=inputSource.gamepad)==null?void 0:_a.buttons;for(let{name,index}of this.buttonMaps[hand]){let pressed=(_c=(_b=gamepadButtons==null?void 0:gamepadButtons[index])==null?void 0:_b.pressed)==null?!1:_c;pressed&&(buttons[name]=!0);for(let event of this.buttonStateMachine.sample(inputSource,name,pressed,time))this.dispatchButtonEvent(event)}}this.emit(`xr.controller.update`,createEvent(`xr.controller.update`,{left:{axes:leftAxes,raycaster:this.controllerRaycasters.left,deltaTime},right:{axes:rightAxes,raycaster:this.controllerRaycasters.right,deltaTime},buttons})),this.walkByTap()}createButtonMap(hand){let b=this.xrManager.profile.buttons,left=hand===`left`,candidates=[[left?`LeftTrigger`:`RightTrigger`,b.trigger],[left?`X`:`A`,b.primary],[left?`Y`:`B`,b.secondary],[left?`LeftPinch`:`RightPinch`,b.pinch]],entries=[];for(let[name,index]of candidates)index!==null&&entries.push({name,index});return entries}dispatchButtonEvent(buttonEvent){let{type,name,source}=buttonEvent,event=this.emitGesture(`xr.gesture.${type}`,name,type===`buttonDown`||type===`tap`,type===`buttonUp`||type===`tap`);type===`tap`&&!event.defaultPrevented&&(name===`RightTrigger`?this.walkSources.right=source:name===`LeftTrigger`&&(this.walkSources.left=source))}walkByTap(){this.tryWalk(this.walkSources.right,`right`),this.tryWalk(this.walkSources.left,`left`)}tryWalk(source,hand){if(!source||this.walkedThisFrame)return;let raycaster=this.controllerRaycasters[hand];this.xrManager.fillRaycaster(source,raycaster)&&(this.walkedThisFrame=!0,this.activePanoMesh=void 0,this.activeTime=void 0,this.checkSelectedPano(raycaster))}resetButtonStates(){for(let event of this.buttonStateMachine.reset(this.lastFrameTime))this.dispatchButtonEvent(event)}readAxes(gamepad,out){var _a,_b;if(!gamepad)return;let{x:xIndex,y:yIndex}=this.xrManager.profile.axes,x=(_a=xIndex===null?0:gamepad.axes[xIndex])==null?0:_a,y=(_b=yIndex===null?0:gamepad.axes[yIndex])==null?0:_b;out.right=x>0?x:0,out.left=x<0?-x:0,out.down=y>0?y:0,out.up=y<0?-y:0}getControllerModelFactory(){if(!this.controllerModelFactory){let factory=new XRControllerModelFactory;factory.gltfLoader=createGltfLoaderBridge(),this.controllerModelFactory=factory}return this.controllerModelFactory}syncInputVisual(source){let tracked=this.xrManager.inputs.entries().get(source);if(!tracked)return;let visual=this.inputVisuals.get(source);visual||(visual={},this.inputVisuals.set(source,visual));let trackedPointer=source.targetRayMode===`tracked-pointer`,wantModel=trackedPointer&&!!source.gamepad&&!!source.gripSpace&&this.showControllerModel&&this.xrManager.profile.model!==`none`;if(wantModel&&!visual.model){let connector=new three_webgpu.Object3D,model=this.getControllerModelFactory().createControllerModel(connector);connector.dispatchEvent({type:`connected`,data:source}),tracked.grip.add(model),visual.model=model}else!wantModel&&visual.model&&(visual.model.removeFromParent(),visual.model=void 0);let wantRay=trackedPointer&&this.showPointerRay;if(wantRay&&!visual.ray){let geometry=new three_webgpu.BufferGeometry;geometry.setAttribute(`position`,new three_webgpu.Float32BufferAttribute([0,0,0,0,0,-5],3));let material=new three_webgpu.LineBasicMaterial({color:16777215,depthTest:!1,depthWrite:!1,transparent:!0}),ray=new three_webgpu.LineSegments(geometry,material);ray.renderOrder=999,ray.frustumCulled=!1,tracked.targetRay.add(ray),visual.ray=ray,visual.rayLength=POINTER_RAY_LENGTH}else!wantRay&&visual.ray&&(this.disposeRay(visual.ray),visual.ray=void 0)}updatePointerRayLength(raycaster,point){for(let[source,visual]of this.inputVisuals){let ray=visual.ray;if(!ray)continue;let hand=source.handedness===`left`?`left`:`right`,length=POINTER_RAY_LENGTH;if(raycaster&&point&&raycaster===this.controllerRaycasters[hand]&&(length=Math.min(raycaster.ray.origin.distanceTo(point),POINTER_RAY_LENGTH)),visual.rayLength!==void 0&&Math.abs(visual.rayLength-length)<POINTER_RAY_LENGTH_EPSILON)continue;let position=ray.geometry.getAttribute(`position`);position.setZ(1,-length),position.needsUpdate=!0,visual.rayLength=length}}removeInputVisual(source){var _a;let visual=this.inputVisuals.get(source);visual&&((_a=visual.model)==null||_a.removeFromParent(),visual.ray&&this.disposeRay(visual.ray),this.inputVisuals.delete(source))}clearInputVisuals(){for(let source of Array.from(this.inputVisuals.keys()))this.removeInputVisual(source)}disposeRay(ray){ray.removeFromParent(),ray.geometry.dispose(),ray.material.dispose()}emitGesture(type,button,isFirst,isFinal){let event=createEvent(type,{session:this.xrManager.session,buttons:button,machineType:toPublicMachineType(this.xrManager.device),isFirst,isFinal,controllers:{raycaster:{leftRay:this.controllerRaycasters.left,rightRay:this.controllerRaycasters.right}}});return this.emit(type,event),event}updateGazeRay(){var _a,_b;let inputSources=(_a=this.xrManager.session)==null?void 0:_a.inputSources;if(!inputSources||inputSources.length===0){this.gazeRaycaster=null;return}let gazeSource=null;for(let i=0;i<inputSources.length;i++){let inputSource=inputSources[i];if(!inputSource)continue;let mode=inputSource.targetRayMode;if(mode===`transient-pointer`||mode===`gaze`||inputSource.hand!=null){gazeSource=inputSource;break}}if(!gazeSource){this.gazeRaycaster=null;return}let raycaster=(_b=this.gazeRayPool)==null?this.gazeRayPool=this.createPickingRaycaster():_b;this.gazeRaycaster=this.xrManager.fillRaycaster(gazeSource,raycaster)?raycaster:null}onXRSelect(source){var _a;if(source.targetRayMode!==`gaze`&&source.targetRayMode!==`transient-pointer`)return;let raycaster=(_a=this.gazeRayPool)==null?this.gazeRayPool=this.createPickingRaycaster():_a;this.xrManager.fillRaycaster(source,raycaster)&&this.checkSelectedPano(raycaster)}pickPickingRaycaster(){return this.gazeRaycaster?this.gazeRaycaster:this.controllerRayFilled.right?this.controllerRaycasters.right:this.controllerRayFilled.left?this.controllerRaycasters.left:null}intersect(time){var _a,_b,_c;if(this.locationMotion.ended===!1){this.intersectMesh.visible=!1,this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(null,null);return}if(this.activePanoMesh&&this.activeTime&&time-this.activeTime>ACTIVE_TO_CURRENT_DELAY){let activePanoMesh=this.activePanoMesh,activePanoId=null;return this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh===activePanoMesh&&(activePanoId=panoId)}),activePanoId!==null&&(this.moveToPano(panoParse(activePanoId),{},!0),this.walkedThisFrame=!0),this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(null,null),activePanoMesh}let raycaster=this.pickPickingRaycaster();if(!raycaster){this.intersectMesh.visible=!1,this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(null,null);return}let intersection,customIntersection=this.intersectCustomObjects(raycaster),intersectionPanos=[],currentObserver=this.works.getObserver(this.currentPano),accessibleNodes=currentObserver?currentObserver.accessibleNodes.map(panoIndex=>panoStringify({panoIndex,workCode:currentObserver.work.workCode})):[];for(let panoId of accessibleNodes){let panoMesh=this.panoMeshes.get(panoId);if(panoMesh){let[intersection]=raycaster.intersectObject((_a=panoMesh.hitTestMesh)==null?panoMesh:_a,!0);if(intersection){let floorIndex=(_b=currentObserver==null?void 0:currentObserver.floorIndex)==null?0:_b;intersectionPanos.push({panoMesh,intersection:Object.assign({floorIndex,floor:floorIndex},intersection)})}}}let[intersectionPanoMesh]=intersectionPanos.sort((a,b)=>a.intersection.distance-b.intersection.distance);if(customIntersection){let nearest=(_c=intersectionPanoMesh==null?void 0:intersectionPanoMesh.intersection)==null?this.modelScene.intersectRaycaster(raycaster)[0]:_c;if(!nearest||customIntersection.distance<=nearest.distance){this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(raycaster,customIntersection.point),this.emit(`intersect.update`,createEvent(`intersect.update`,{raycaster,intersection:customIntersection,object:this.intersectMesh})),this.hideIntersectMesh();return}}intersectionPanoMesh?(intersection=intersectionPanoMesh.intersection,this.activePanoMesh!==intersectionPanoMesh.panoMesh&&(this.activePanoMesh=intersectionPanoMesh.panoMesh,this.activeTime=time),this.intersectMesh.position.copy(intersectionPanoMesh.panoMesh.position),this.intersectMesh.lookAt(this.camera.position)):(this.activePanoMesh=void 0,this.activeTime=void 0),intersection||(intersection=this.modelScene.intersectRaycaster(raycaster)[0]),this.updatePointerRayLength(raycaster,intersection?intersection.point:null);let intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection&&intersection.face){let face=intersection.face.normal,quaternion=new three_webgpu.Quaternion;quaternion.setFromUnitVectors(new three_webgpu.Vector3(0,0,1),face),this.intersectMesh.quaternion.copy(quaternion);let position=intersection.point.clone();this.intersectMesh.position.copy(position),intersectionPanoMesh?this.intersectMesh.visible=!1:this.intersectMesh.visible=!0}else this.intersectMesh.visible=!1;return intersectionPanoMesh==null?void 0:intersectionPanoMesh.panoMesh}intersectCustomObjects(raycaster){var _a,_b;let root=this.xrCustomObjectsScene;if(!root||!root.visible||root.children.length===0)return;raycaster.camera=this.xrManager.eyeCameras[0];let intersections=raycaster.intersectObject(root,!0);for(let hit of intersections){let visible=!0;for(let node=hit.object;node&&node!==root;node=node.parent)if(!node.visible){visible=!1;break}if(!visible)continue;let floorIndex=(_b=(_a=this.works.getObserver(this.currentPano))==null?void 0:_a.floorIndex)==null?0:_b;return Object.assign({floorIndex,floor:floorIndex},hit)}}checkSelectedPano(raycaster){var _a;this.stopMomentumMovement();let currentObserver=this.works.getObserver(this.currentPano);if(!currentObserver)return;let observers=currentObserver.work.observers,accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];return!observer||observer.position.clone().applyMatrix4(observer.work.transform).distanceTo(this.camera.position)>this.maxAccessibleDistance?!1:observer.loadable||observer.active}),nextObserver=null,[intersection]=this.modelScene.intersectRaycaster(raycaster),customIntersection=this.intersectCustomObjects(raycaster);if(customIntersection&&(!intersection||customIntersection.distance<=intersection.distance))return;if(intersection){let[panoIndex,distance]=arrayMin(accessibleNodes,panoIndex=>{let accessibleObserver=observers[panoIndex];return accessibleObserver?accessibleObserver.standingPosition.clone().applyMatrix4(accessibleObserver.work.transform).distanceTo(intersection.point):1/0},!0);typeof panoIndex==`number`&&distance<this.panoTapTriggerRadius&&(nextObserver=(_a=observers[panoIndex])==null?null:_a)}if(nextObserver||(nextObserver=this.getForwardObserverOrNot(this.xrManager.eyeCameras[0],raycaster)),nextObserver&&nextObserver.panoId===panoStringify(this.currentPano)&&(nextObserver=null),nextObserver&&!this.locationMotion.ended){for(let keyframe of this.locationMotion.keyframes)if(this.panoResourceFromLocationMotionKeyframe(keyframe).panoId===nextObserver.panoId){nextObserver=null;break}}if(!nextObserver){this.locationMotion.ended===!0&&this.cameraBounce();return}let state={workCode:nextObserver.work.workCode,panoIndex:nextObserver.panoIndex,mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,distance:0,offset:nextObserver.position.clone()};if(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:!0,options:{},progress:0,error:null})),!nextObserver.active){let nextPanoMesh=this.panoMeshes.get(nextObserver.panoId);nextPanoMesh&&(nextPanoMesh.setDisabled(!1),nextPanoMesh.setLoading(!0));return}this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,state,options:{},progress:0,error:null}))}destroy(){super.destroy(),this.xrManager.dispose(),this.clearInputVisuals(),this.scene.remove(this.xrManager.inputs.root)}onPanGesture(){}onTapGesture(){}onPinchGesture(){}onMouseMove(){}onMouseOut(){}},HUMAN_EYE_POSITION=new three_webgpu.Vector3(0,1.6,0),scratchObserverBox$1=new three_webgpu.Box3,scratchVector3$1=new three_webgpu.Vector3,defaultModelControllerCustomInitArgs=Object.assign({},defaultPanoramaLikeControllerCustomInitArgs),ModelController=class ModelController extends PanoramaLikeController{static parseArgs(args){return args instanceof ModelController?args:super.parseArgs(args)}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f;let args_=this.parseArgs(args),works=args_.works,{state,currentState}=args.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex},observer=works.getObserver(pano),fov=require_memoryUsage.M((_d=state.fov)==null?!observer||isFristPersonMode(currentState.mode)?currentState.fov:args_.defaultFov:_d,args_.minFov,args_.maxFov),longitude=(_e=state.longitude)==null?currentState.longitude:_e,minLatitude=require_memoryUsage.M(typeof args_.minLatitude==`function`?args_.minLatitude(fov):args_.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof args_.maxLatitude==`function`?args_.maxLatitude(fov):args_.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M((_f=state.latitude)==null?!observer||isFristPersonMode(currentState.mode)?currentState.latitude:args_.defaultLatitude:_f,minLatitude,maxLatitude),offset=new three_webgpu.Vector3;if(args_.initial.state.offset)offset.copy(args_.initial.state.offset);else if(observer)offset.copy(observer.position).applyMatrix4(observer.work.transform);else{let vector=coordinatesToVector(currentState).setLength(currentState.distance);offset.copy(args_.initial.currentState.offset).sub(vector)}return{workCode:pano.workCode,panoIndex:pano.panoIndex,mode:`Model`,longitude,latitude,fov,offset,distance:0}}constructor(args){let args_=ModelController.parseArgs(args);super(args_),this.mode=`Model`,this.locationMotion=new Motion({x:this.camera.pose.offset.x,y:this.camera.pose.offset.y,z:this.camera.pose.offset.z,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x})}updateConfiguration(args){return super.updateConfiguration(args)}destroy(){super.destroy(),this.locationMotion.dispose()}isReady(){return this.locationMotion.ended===!1?!1:super.isReady()}updateWork(works,state,options,userAction){this.works=works;let toState=ModelController.initAnimationEndState(Object.assign(Object.assign({},this),{initial:{currentState:Object.assign(Object.assign({},this.currentPano),this.camera.pose),duration:options.duration,effect:options.effect,state,userAction}}));return(toState.workCode!==this.currentPano.workCode||toState.panoIndex!==this.currentPano.panoIndex||toState.longitude!==this.cameraMotion.value.longitude||toState.latitude!==this.cameraMotion.value.latitude||toState.fov!==this.cameraMotion.value.fov)&&this.moveToPosition(toState.offset,{duration:0,longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},userAction),!0}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationValue={},cameraValue={};return locationValue.distance=0,pose.offset!==void 0&&(locationValue.x=pose.offset.x,locationValue.y=pose.offset.y,locationValue.z=pose.offset.z),pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.locationMotion.set(locationValue,duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationKeyframe=[],cameraKeyframe=[];for(let keyframe of keyframes)locationKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{distance:0,x:keyframe.value.offset.x,y:keyframe.value.offset.x,z:keyframe.value.offset.x}}),cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.locationMotion.setKeyframes(locationKeyframe,duration).catch(require_memoryUsage.d),this.cameraMotion.setKeyframes(keyframes,duration)})}updateTime(time,deltaTime,...args){if(this.destroyed)return;let uniforms={},cameraPose={};if(this.modelAlphaMotion.ended||(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.modelScene.parameter.modelAlpha===0&&this.modelScene.parameter.progress!==1){let{pano0,pano1}=this.modelScene.parameter;pano0&&pano0.map!==(pano1==null?void 0:pano1.map)&&pano0.map.dispose(),uniforms.progress=1,uniforms.pano0=uniforms.pano1=pano1}if(this.perspToOrthoMotion.ended||(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),!this.locationMotion.ended){this.locationMotion.update(time),cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z);let currentPositon=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$1.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$1.containsPoint(currentPositon)))for(let observer of work.observers)observers.push(observer)}let observer=arrayMin(observers,observer=>scratchVector3$1.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(currentPositon));this.currentPano=observer?{workCode:observer.work.workCode,panoIndex:observer.panoIndex}:{workCode:``,panoIndex:0}}this.cameraMotion.ended||(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),isEmptyObject(uniforms)||this.modelScene.parameter.set(uniforms),isEmptyObject(cameraPose)||this.setCamera(cameraPose);let currentObserver=this.works.getObserver(this.currentPano);if(this.intersectMesh&&this.intersectMesh.parent&¤tObserver&¤tObserver.position.y-currentObserver.standingPosition.y>10){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1)}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{state,currentState,duration,userAction}=this.initial;this.userAction=userAction;let toState=ModelController.initAnimationEndState(this),modelAlphaValue={modelAlpha:1},perspToOrthoValue={perspToOrtho:0},options={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov,duration,moveStartCallback:state=>{this.perspToOrthoMotion.set(perspToOrthoValue,duration).catch(require_memoryUsage.d),this.modelAlphaMotion.set(modelAlphaValue,duration).catch(require_memoryUsage.d),this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state,userAction:this.userAction}))},moveEndCallback:state=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),resolve()},moveCancelCallback:()=>{let pano=this.currentPano,state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance});this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),resolve()}};this.moveToPosition(toState.offset,options,userAction)})}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1];return Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,offset:new three_webgpu.Vector3(targetLocationKeyFrame.value.x,targetLocationKeyFrame.value.y,targetLocationKeyFrame.value.z),distance:targetLocationKeyFrame.value.distance})}moveToPano(pano,options={},userAction){let observer=this.works.getObserver(pano);if(observer){let position=new three_webgpu.Vector3().copy(observer.position).applyMatrix4(observer.work.transform);this.moveToPosition(position,options,userAction)}}moveToPosition(position,options={},userAction){var _a,_b,_c;this.userAction=userAction,this.stopMomentumMovement();let time=require_memoryUsage.p(),currentPositon=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),distance=currentPositon.distanceTo(position),velocity=this.locationMotion.getProgressVelocity(time),totalLocationKeyframesLength=0;for(let i=1;i<this.locationMotion.keyframes.length;i++){let{x:x0,y:y0,z:z0}=this.locationMotion.keyframes[i-1].value,{x:x1,y:y1,z:z1}=this.locationMotion.keyframes[i].value;totalLocationKeyframesLength+=Math.sqrt(Math.pow(x1-x0,2)+Math.pow(y1-y0,2)+Math.pow(z1-z0,2))}let startVelocity=distance===0?0:velocity*totalLocationKeyframesLength/distance,animationDuration=this.calculateMovingDuration(options.duration,distance),locationValue={x:position.x,y:position.y,z:position.z,distance:0},cameraValue={longitude:options.longitude,latitude:options.latitude,fov:options.fov},observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$1.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$1.containsPoint(currentPositon)))for(let observer of work.observers)observers.push(observer)}let observer=arrayMin(observers,observer=>scratchVector3$1.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(currentPositon)),pano=observer?{workCode:observer.work.workCode,panoIndex:observer.panoIndex}:{workCode:``,panoIndex:0},state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:(_a=cameraValue.longitude)==null?this.camera.pose.longitude:_a,latitude:(_b=cameraValue.latitude)==null?this.camera.pose.latitude:_b,fov:(_c=cameraValue.fov)==null?this.camera.pose.fov:_c,offset:position.clone(),distance:0}),prevPano=this.currentPano;this.emit(`pano.moveTo`,createEvent(`pano.moveTo`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveStartCallback&&options.moveStartCallback(state),this.cameraMotion.set(cameraValue,animationDuration).catch(require_memoryUsage.d),this.locationMotion.set(locationValue,animationDuration,startVelocity).then(()=>{for(let model of this.modelScene.children)model instanceof Model&&model.show();let state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`pano.arrived`,createEvent(`pano.arrived`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveEndCallback&&options.moveEndCallback(state)},()=>{options.moveCancelCallback&&options.moveCancelCallback(),this.emit(`pano.cancel`,createEvent(`pano.cancel`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null}))})}onTapGesture(event){let raycaster=event.center.raycaster;this.stopMomentumMovement();let[intersection]=this.modelScene.intersectRaycaster(raycaster);if(intersection&&intersection.face){let normal=intersection.face.normal,point=intersection.point;if(new three_webgpu.Vector3(0,1,0).angleTo(normal)>Math.PI/3){let downRaycaster=new three_webgpu.Raycaster;downRaycaster.firstHitOnly=!0;let origin=normal.clone().setLength(.3).add(point);downRaycaster.set(origin,new three_webgpu.Vector3(0,-1,0)),intersection=this.modelScene.intersectRaycaster(downRaycaster)[0]}}if(intersection){let nextPosition=new three_webgpu.Vector3().copy(intersection.point).add(HUMAN_EYE_POSITION),observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$1.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$1.containsPoint(nextPosition)))for(let observer of work.observers)observers.push(observer)}let[nearestObserver,distance]=arrayMin(observers,observer=>scratchVector3$1.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(nextPosition),!0);nearestObserver&&distance<5&&(nextPosition.y=scratchVector3$1.copy(nearestObserver.position).applyMatrix4(nearestObserver.work.transform).y),event.state.offset.copy(nextPosition),event.state.distance=0,this.emit(`gesture.tap`,event),event.defaultPrevented||this.moveToPosition(nextPosition,{},!0)}else this.emit(`gesture.tap`,event),event.defaultPrevented||this.cameraBounce()}},scratchObserverBox=new three_webgpu.Box3,scratchVector3=new three_webgpu.Vector3,minDistance=.5,PANGESTURE_FORWARD_ANGLE=Math.PI/7,defaultMapviewControllerCustomInitArgs={defaultLongitude:Math.PI/4,defaultLatitude:Math.PI/4,defaultDistance:150,maxLatitude:Math.PI/2,minLatitude:0,cameraType:`auto`,cameraFence:null,intersectMeshCreator:()=>new IntersectMesh},Controllers={Floorplan:FloorplanController,Topview:TopviewController,Panorama:PanoramaController,VRPanorama:VRPanoramaController,XRPanorama:XRPanoramaController,Model:ModelController,Mapview:class MapviewController extends BaseController{static parseArgs(args){var _a,_b,_c,_d,_e,_f,_g,_h;if(args instanceof MapviewController)return args;let args_=super.parseArgs(args);return Object.assign(Object.assign({},args_),{defaultLongitude:(_a=args.defaultLongitude)==null?defaultMapviewControllerCustomInitArgs.defaultLongitude:_a,defaultLatitude:(_b=args.defaultLatitude)==null?defaultMapviewControllerCustomInitArgs.defaultLatitude:_b,defaultDistance:(_c=args.defaultDistance)==null?defaultMapviewControllerCustomInitArgs.defaultDistance:_c,maxLatitude:(_d=args.maxLatitude)==null?defaultMapviewControllerCustomInitArgs.maxLatitude:_d,minLatitude:(_e=args.minLatitude)==null?defaultMapviewControllerCustomInitArgs.minLatitude:_e,cameraType:(_f=args.cameraType)==null?defaultMapviewControllerCustomInitArgs.cameraType:_f,cameraFence:(_g=args.cameraFence)==null?defaultMapviewControllerCustomInitArgs.cameraFence:_g,intersectMeshCreator:(_h=args.intersectMeshCreator)==null?defaultMapviewControllerCustomInitArgs.intersectMeshCreator:_h})}static distanceFromModel(modelScene,fov,aspect){let boundingBox=modelScene.boundingBox,radius=boundingBox.isEmpty()?10:Math.pow(Math.pow(boundingBox.max.x-boundingBox.min.x+1,2)+Math.pow(boundingBox.max.y-boundingBox.min.y+1,2)+Math.pow(boundingBox.max.z-boundingBox.min.z+1,2),1/2);radius=isNaN(radius)||!isFinite(radius)?1:radius;let distance=radius/2/Math.tan(Math.PI*fov/360);return aspect<1&&(distance/=aspect),isNaN(distance)||!isFinite(distance)?radius:distance}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f,_g;let args_=this.parseArgs(args),works=args_.works,modelScene=args_.modelScene,{state,currentState}=args.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex},fov=(_d=state.fov)==null?60:_d,minLatitude=require_memoryUsage.M(typeof args_.minLatitude==`function`?args_.minLatitude(fov):args_.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof args_.maxLatitude==`function`?args_.maxLatitude(fov):args_.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M((_e=state.latitude)==null?isThirdPersonMode(currentState.mode)?currentState.latitude:args_.defaultLatitude:_e,minLatitude,maxLatitude),distanceFromModel=MapviewController.distanceFromModel(args_.modelScene,fov,args_.camera.aspect),offset=new three_webgpu.Vector3,distance=(_f=state.distance)==null?Math.min(args_.defaultDistance,distanceFromModel):_f,longitude=(_g=state.longitude)==null?isThirdPersonMode(currentState.mode)?currentState.longitude:args_.defaultLongitude:_g;if(state.offset)offset.copy(state.offset);else{let observer=works.getObserver(pano);args_.defaultDistance<distanceFromModel&&observer?(offset.copy(observer.position).applyMatrix4(observer.work.transform),state.longitude===void 0&&(longitude=currentState.longitude)):(modelScene.boundingBox.getCenter(offset),distance=distanceFromModel)}return Object.assign(Object.assign({},pano),{mode:`Mapview`,longitude,latitude,fov,offset,distance})}constructor(args){let args_=MapviewController.parseArgs(args);super(args_),this.mode=`Mapview`,this.defaultLongitude=args_.defaultLongitude,this.defaultLatitude=args_.defaultLatitude,this.defaultDistance=args_.defaultDistance,this.maxLatitude=args_.maxLatitude,this.minLatitude=args_.minLatitude,this.cameraType=args_.cameraType,this.cameraFence=args_.cameraFence,this.locationMotion=new Motion({x:this.camera.pose.offset.x,y:this.camera.pose.offset.y,z:this.camera.pose.offset.z,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x}),this.pendingTextureId=null,this.textureLoader=new require_pick.i,this.intersectMeshCreator=args_.intersectMeshCreator,this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=`intersect`,this.intersectMesh.visible=!1,this.helper.add(this.intersectMesh)}updateConfiguration(args){if(super.updateConfiguration(args)===!1)return!1;if(args.defaultLongitude!==void 0&&this.defaultLongitude!==args.defaultLongitude&&(this.defaultLongitude=args.defaultLongitude),args.defaultLatitude!==void 0&&this.defaultLatitude!==args.defaultLatitude&&(this.defaultLatitude=args.defaultLatitude),args.defaultDistance!==void 0&&this.defaultDistance!==args.defaultDistance&&(this.defaultDistance=args.defaultDistance),args.maxLatitude!==void 0&&this.maxLatitude!==args.maxLatitude&&(this.maxLatitude=args.maxLatitude),args.minLatitude!==void 0&&this.minLatitude!==args.minLatitude&&(this.minLatitude=args.minLatitude),args.cameraType!==void 0&&this.cameraType!==args.cameraType&&(this.cameraType=args.cameraType),this.cameraFence instanceof three_webgpu.Box3&&args.cameraFence instanceof three_webgpu.Box3||this.cameraFence instanceof three_webgpu.Sphere&&args.cameraFence instanceof three_webgpu.Sphere?this.cameraFence.equals(args.cameraFence)||(this.cameraFence=args.cameraFence):args.cameraFence!==void 0&&(this.cameraFence=args.cameraFence),args.intersectMeshCreator!==void 0&&this.intersectMeshCreator!==args.intersectMeshCreator){this.intersectMeshCreator=args.intersectMeshCreator;let lastMesh=this.intersectMesh;this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=lastMesh.name,this.intersectMesh.visible=lastMesh.visible;let parent=this.intersectMesh.parent;parent&&parent.add(this.intersectMesh),lastMesh.dispose()}return!0}destroy(){super.destroy(),this.pendingTextureId=null,this.locationMotion.dispose(),this.panState=void 0,this.intersectMesh.dispose(),this.helper.remove(this.intersectMesh)}isReady(){return this.locationMotion.ended===!1?!1:super.isReady()}updateWork(works,state,options,userAction){this.userAction=userAction,this.works=works;let toState=MapviewController.initAnimationEndState(Object.assign(Object.assign({},this),{initial:{currentState:Object.assign(Object.assign({},this.currentPano),this.camera.pose),duration:options.duration,effect:options.effect,state,userAction}}));this.currentPano={workCode:toState.workCode,panoIndex:toState.panoIndex};let cameraMotionValue={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},locationMotionValue={x:toState.offset.x,y:toState.offset.y,z:toState.offset.z,distance:toState.distance};return(cameraMotionValue.longitude!==this.cameraMotion.value.longitude||cameraMotionValue.latitude!==this.cameraMotion.value.latitude||cameraMotionValue.fov!==this.cameraMotion.value.fov)&&this.cameraMotion.set(cameraMotionValue,options.duration).catch(require_memoryUsage.d),(locationMotionValue.x!==this.locationMotion.value.x||locationMotionValue.y!==this.locationMotion.value.y||locationMotionValue.z!==this.locationMotion.value.z||locationMotionValue.distance!==this.locationMotion.value.distance)&&this.locationMotion.set(locationMotionValue,options.duration).catch(require_memoryUsage.d),!0}updateModel(modelScene){super.updateModel(modelScene),this.hideIntersectMesh()}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationValue={},cameraValue={};return pose.distance!==void 0&&(locationValue.distance=pose.distance),pose.offset!==void 0&&(locationValue.x=pose.offset.x,locationValue.y=pose.offset.y,locationValue.z=pose.offset.z),pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.locationMotion.set(locationValue,duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationKeyframe=[],cameraKeyframe=[];for(let keyframe of keyframes)locationKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{distance:keyframe.value.distance,x:keyframe.value.offset.x,y:keyframe.value.offset.x,z:keyframe.value.offset.x}}),cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.locationMotion.setKeyframes(locationKeyframe,duration).catch(require_memoryUsage.d),this.cameraMotion.setKeyframes(keyframes,duration)})}updateTime(time,deltaTime){if(this.destroyed)return;let uniforms={},cameraPose={};if(this.locationMotion.ended||(this.locationMotion.update(time),cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z)),this.cameraMotion.ended||(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),this.modelAlphaMotion.ended||(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.modelScene.parameter.modelAlpha===0&&this.modelScene.parameter.progress!==1){let{pano0,pano1}=this.modelScene.parameter;pano0&&pano0.map!==(pano1==null?void 0:pano1.map)&&pano0.map.dispose(),uniforms.progress=1,uniforms.pano0=uniforms.pano1=pano1}let perspToOrtho=0;if(this.cameraType===`auto`?perspToOrtho=+(Math.abs(Math.PI/2-this.cameraMotion.value.latitude)<.02||Math.abs(-Math.PI/2-this.cameraMotion.value.latitude)<.02):this.cameraType===`perspective`?perspToOrtho=0:this.cameraType===`orthographic`&&(perspToOrtho=1),this.perspToOrthoMotion.getTargetKeyframe().value.perspToOrtho!==perspToOrtho&&this.perspToOrthoMotion.set({perspToOrtho},500).catch(require_memoryUsage.d),this.perspToOrthoMotion.ended||(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),isEmptyObject(uniforms)||this.modelScene.parameter.set(uniforms),isEmptyObject(cameraPose)||this.setCamera(cameraPose),this.cameraFence&&!this.panState&&!this.pinchState&&!this.mouseWheelState&&!this.inMomentumMovement&&this.locationMotion.ended&&this.perspToOrthoMotion.ended&&this.cameraMotion.ended){let direction=coordinatesToVector(this.camera.pose,new three_webgpu.Vector3),position=new three_webgpu.Vector3().copy(this.camera.pose.offset).sub(direction.clone().multiplyScalar(this.camera.pose.distance));if(this.cameraFence.distanceToPoint(position)>.01){let nextPosition=this.cameraFence.clampPoint(position,new three_webgpu.Vector3),offset=this.camera.pose.offset.clone().add(nextPosition).sub(position),state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset,distance:this.camera.pose.distance});this.fixFinalState(state),this.locationMotion.set({x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance},300).catch(require_memoryUsage.d)}}if(this.intersectMesh&&this.intersectMesh.parent){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1)}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1];return Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,distance:targetLocationKeyFrame.value.distance,offset:new three_webgpu.Vector3(targetLocationKeyFrame.value.x,targetLocationKeyFrame.value.y,targetLocationKeyFrame.value.z)})}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{state,currentState,duration,userAction}=this.initial;this.userAction=userAction;let toState=MapviewController.initAnimationEndState(this),cameraValue={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},locationValue={x:toState.offset.x,y:toState.offset.y,z:toState.offset.z,distance:toState.distance};this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state:toState,userAction:this.userAction})),this.perspToOrthoMotion.set({perspToOrtho:0},duration).catch(require_memoryUsage.d),this.modelAlphaMotion.set({modelAlpha:1},duration/3).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d),this.locationMotion.set(locationValue,duration).then(()=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state:toState,userAction:this.userAction}))},error=>{let state=Object.assign(Object.assign(Object.assign({},this.currentPano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction}))}).then(()=>{resolve()})})}getForwardObserverOrNot(raycaster){let[intersection]=this.modelScene.intersectRaycaster(raycaster);if(!intersection)return null;let observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox.containsPoint(raycaster.ray.origin)||raycaster.ray.intersectsBox(scratchObserverBox)))for(let observer of work.observers)observers.push(observer)}let[observer,distance]=arrayMin(observers,observer=>scratchVector3.copy(observer.standingPosition).applyMatrix4(observer.work.transform).distanceTo(intersection.point),!0);return observer&&distance<Math.max(observer.standingPosition.distanceTo(this.camera.position)/5,10)?observer:null}coordinatesForOffset(offset){let size=this.renderer.getSize(new three_webgpu.Vector2);return{longitude:-2*offset.x/(size.x*this.viewport.width),latitude:2*offset.y/(size.y*this.viewport.height)}}requestMomentumMovement(event,isFirst,velocity,duration){if(this.inMomentumMovement===null)return;duration=Math.max(duration,1);let nextVelocity=Object.assign({},velocity),delta={longitude:0,latitude:0,x:0,y:0,z:0};for(let i=0;i<duration;i++)nextVelocity.longitude*=.996,nextVelocity.latitude*=.996*.998,nextVelocity.x*=.99,nextVelocity.y*=.99,nextVelocity.z*=.99,delta.longitude+=nextVelocity.longitude,delta.latitude+=nextVelocity.latitude,delta.x+=nextVelocity.x,delta.y+=nextVelocity.y,delta.z+=nextVelocity.z;let fov=this.cameraMotion.value.fov,longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude),offset=new three_webgpu.Vector3(this.locationMotion.value.x+delta.x,this.locationMotion.value.y+delta.y,this.locationMotion.value.z+delta.z),state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,offset,fov,distance:this.locationMotion.value.distance}),position=event.state.offset.clone().sub(coordinatesToVector(event.state).setLength(state.distance)),isFinal=!(Math.abs(nextVelocity.longitude)>1e-4||Math.abs(nextVelocity.latitude)>1e-4||Math.abs(nextVelocity.x)>1e-4||Math.abs(nextVelocity.y)>1e-4||Math.abs(nextVelocity.z)>1e-4);(this.cameraFence?this.cameraFence.containsPoint(position):!0)===!1&&(isFinal=!0);let gestureEvent=createEvent(`gesture.momentum`,Object.assign(Object.assign({},event),{isFirst,isFinal,state}));if(this.emit(`gesture.fire`,gestureEvent),this.inMomentumMovement.event=gestureEvent,this.emit(`gesture.momentum`,gestureEvent),event.defaultPrevented){this.inMomentumMovement=null;return}this.inMomentumMovement&&(this.cameraMotion.set({longitude,latitude},0).catch(require_memoryUsage.d),this.locationMotion.set({x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance},0).catch(require_memoryUsage.d),isFinal?this.inMomentumMovement=null:require_imageBitmap.s.shared.add((time,deltaTime)=>{this.requestMomentumMovement(event,!1,nextVelocity,deltaTime)},!0))}fixFinalState(state){if(this.perspToOrthoMotion.getTargetKeyframe().value.perspToOrtho===1)return;let direction=coordinatesToVector(state,new three_webgpu.Vector3),cameraPosition=new three_webgpu.Vector3().copy(state.offset).sub(direction.clone().setLength(state.distance)),raycaster=new three_webgpu.Raycaster(cameraPosition,direction);raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.hitFilter=intersect=>intersect.distance>minDistance+raycaster.near,raycaster.near=this.camera.near,raycaster.far=this.camera.far;let intersect;if(intersect=this.modelScene.intersectRaycaster(raycaster)[0],intersect&&intersect.distance<this.camera.near&&(intersect=void 0),!intersect){let plane=new three_webgpu.Plane(new three_webgpu.Vector3(0,1,0),-this.modelScene.boundingBox.min.y),intersectOnPlane=raycaster.ray.intersectPlane(plane,new three_webgpu.Vector3);if(intersectOnPlane){let distance=intersectOnPlane.distanceTo(raycaster.ray.origin);distance<1e3&&distance>=raycaster.near&&(intersect={distance,floorIndex:0,floor:0,point:intersectOnPlane,object:this.scene,face:null})}}if(!intersect){let defaultDistance=Math.max(state.distance,3);intersect={distance:defaultDistance,floorIndex:0,floor:0,point:cameraPosition.clone().add(direction.clone().setLength(defaultDistance)),object:this.scene,face:null}}intersect.distance>=this.camera.near&¬SimilarValue(state.distance,intersect.distance)&&(state.distance=intersect.distance,state.offset=intersect.point)}onPanGesture(event){this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let pointerLength=event.pointers.length,lastPanState=this.panState,buttons=0,shiftKey=!1;event.pointerType===`mouse`&&(buttons=event.center.buttons,shiftKey=event.center.shiftKey),lastPanState&&buttons===0&&lastPanState.buttons!==0&&(buttons=lastPanState.buttons);let target=lastPanState==null?void 0:lastPanState.target;if(!target){let tapPosition=this.relativeClientPosition(event.center),raycaster=this.createRaycasterFromCamera(tapPosition,this.camera);target=new three_webgpu.Vector3().copy(raycaster.ray.direction).multiplyScalar(3).add(raycaster.ray.origin);let[intersect]=this.modelScene.intersectRaycaster(raycaster);if(!intersect&&raycaster.ray.direction.y<-.3){let plane=new three_webgpu.Plane(new three_webgpu.Vector3(0,1,0),0),intersectPlane=raycaster.ray.intersectPlane(plane,new three_webgpu.Vector3);if(intersectPlane){let distance=intersectPlane.distanceTo(raycaster.ray.origin);distance<1e4&&distance>=raycaster.near&&(intersect={distance,floorIndex:0,floor:0,point:intersectPlane,object:this.scene})}}if(intersect)target.copy(intersect.point);else{let normal=new three_webgpu.Vector3().copy(this.camera.pose.offset).sub(this.camera.position).normalize(),plane=new three_webgpu.Plane().setFromNormalAndCoplanarPoint(normal,this.camera.pose.offset);raycaster.ray.intersectPlane(plane,target)||target.copy(raycaster.ray.direction).setLength(this.camera.pose.distance).add(raycaster.ray.origin)}let maxTargetDistance=Math.max(this.camera.pose.distance*2,minDistance);target.distanceTo(raycaster.ray.origin)>maxTargetDistance&&target.copy(raycaster.ray.direction).setLength(maxTargetDistance).add(raycaster.ray.origin)}if(event.isFinal?this.panState=void 0:this.panState={target,buttons,pointerLength,x:event.center.x,y:event.center.y},!(lastPanState===void 0||lastPanState.pointerLength!==pointerLength))if(pointerLength>1||buttons===2||shiftKey){let screenOffset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),cameraPosition=coordinatesToVector(this.cameraMotion.value).setLength(this.locationMotion.value.distance).add(offset),targetDistance=new three_webgpu.Vector3().copy(cameraPosition).sub(lastPanState.target).length();targetDistance*=Math.tan(this.camera.pose.fov/2*Math.PI/180);let maxPanTargetDistance=Math.max(this.locationMotion.value.distance*2,minDistance);targetDistance=Math.min(targetDistance,maxPanTargetDistance);let renderSize=this.renderer.getSize(new three_webgpu.Vector2),panLeftDistance=2*screenOffset.x*targetDistance/renderSize.y,panUpDistance=2*screenOffset.y*targetDistance/renderSize.y,axies=new three_webgpu.Vector3;axies.setFromMatrixColumn(this.camera.matrix,0),axies.multiplyScalar(-panLeftDistance),offset.add(axies),this.camera.pose.latitude<PANGESTURE_FORWARD_ANGLE?axies.setFromMatrixColumn(this.camera.matrix,1):(axies.setFromMatrixColumn(this.camera.matrix,0),axies.crossVectors(this.camera.up,axies)),axies.multiplyScalar(panUpDistance),offset.add(axies);let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset,distance:this.camera.pose.distance});if(event.state=state,this.emit(`gesture.pan`,event),event.defaultPrevented)return;if(this.locationMotion.set({x:state.offset.x,y:state.offset.y,z:state.offset.z},0).catch(require_memoryUsage.d),event.isFinal&&(this.fixFinalState(state),Object.assign(event,{__fixFinalState:!0}),this.locationMotion.set({distance:state.distance,x:state.offset.x,y:state.offset.y,z:state.offset.z},0).catch(require_memoryUsage.d)),event.isFinal){let renderSize=this.renderer.getSize(new three_webgpu.Vector2),panLeftDistance=2*event.velocityX*targetDistance/renderSize.y,panUpDistance=2*event.velocityY*targetDistance/renderSize.y,axies=new three_webgpu.Vector3,offset=new three_webgpu.Vector3;axies.setFromMatrixColumn(this.camera.matrix,0),axies.multiplyScalar(-panLeftDistance),offset.add(axies),this.camera.pose.latitude<PANGESTURE_FORWARD_ANGLE?axies.setFromMatrixColumn(this.camera.matrix,1):(axies.setFromMatrixColumn(this.camera.matrix,0),axies.crossVectors(this.camera.up,axies)),axies.multiplyScalar(panUpDistance),offset.add(axies),this.inMomentumMovement={uuid:require_memoryUsage.N()},this.requestMomentumMovement(event,!0,{longitude:0,latitude:0,x:offset.x,y:offset.y,z:offset.z},0)}}else{let screenOffset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},delta=this.coordinatesForOffset(screenOffset),longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),fov=this.camera.pose.fov,minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude);this.camera.aspect<1&&Math.abs(event.overallVelocityX)>.2&&Math.atan2(Math.abs(event.overallVelocityY),Math.abs(event.overallVelocityX))<Math.PI/6.923&&(latitude=this.cameraMotion.value.latitude);let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov,offset:this.camera.pose.offset,distance:this.camera.pose.distance});if(event.isFinal&&Object.assign(event,{__fixFinalState:!0}),event.state=state,this.emit(`gesture.pan`,event),event.defaultPrevented)return;if(event.isFinal?this.locationMotion.set({distance:state.distance,x:state.offset.x,y:state.offset.y,z:state.offset.z},0).catch(require_memoryUsage.d):this.cameraMotion.set({longitude:state.longitude,latitude:state.latitude},0).catch(require_memoryUsage.d),event.isFinal){let x=event.velocityX,y=event.velocityY;this.inMomentumMovement={uuid:require_memoryUsage.N()},this.requestMomentumMovement(event,!0,Object.assign(Object.assign({},this.coordinatesForOffset({x,y})),{x:0,y:0,z:0}),0)}}}onPinchGesture(event){var _a;if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let startDistance=(_a=this.pinchState)==null?void 0:_a.distance;if(event.isFirst){this.pinchState={x:event.center.x,y:event.center.y,scale:1,distance:this.locationMotion.value.distance};return}if(startDistance===void 0)return;let boundingCenter=this.modelScene.boundingBox.getCenter(new three_webgpu.Vector3),maxDistance=MapviewController.distanceFromModel(this.modelScene,this.cameraMotion.value.fov,this.camera.aspect),nextDistance=require_memoryUsage.M(startDistance/event.scale,minDistance,1/0),cameraPostion=event.state.offset.clone().sub(coordinatesToVector(event.state).setLength(nextDistance)),cameraInBounding=this.modelScene.boundingBox.containsPoint(cameraPostion),distance;if(!cameraInBounding&&this.pinchState&&this.pinchState.scale>event.scale&&boundingCenter.distanceTo(cameraPostion)>maxDistance?distance=event.state.distance:(distance=nextDistance,this.pinchState&&(this.pinchState.scale=event.scale)),event.state.distance=distance,this.emit(`gesture.pinch`,event),!event.defaultPrevented&&(this.locationMotion.set({distance:event.state.distance},0).catch(require_memoryUsage.d),event.pointerType!==`mouse`&&(event.type=`gesture.pan`,this.onPanGesture(event)),event.isFinal)){if(!(`__fixFinalState`in event)){let state=event.state;this.fixFinalState(event.state);let locationMotionValue={x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance};this.locationMotion.set(locationMotionValue,0).catch(require_memoryUsage.d)}this.panState=void 0,this.pinchState=void 0}}onMouseMove(event){var _a,_b;if(!this.intersectMesh.parent||this.panState||this.pinchState||this.mouseWheelState||(this.emit(`gesture.mousemove`,event),event.defaultPrevented))return;let raycaster=event.center.raycaster;if(event.isFinal&&this.intersectMesh.parent&&this.intersectMesh.visible===!0){this.hideIntersectMesh();return}let[intersection]=this.modelScene.intersectRaycaster(raycaster),intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection){let face=(_b=(_a=intersection.face)==null?void 0:_a.normal)==null?new three_webgpu.Vector3().copy(raycaster.ray.direction).multiplyScalar(-1):_b,positionVector=face.clone(),position=intersection.point.clone();this.intersectMesh.position.copy(position);let lookAtVector=position.clone().add(positionVector);if(this.intersectMesh.lookAt(lookAtVector),Math.abs(face.y)>.99){let _vector=this.camera.position.clone().sub(position);this.intersectMesh.rotation.z=-Math.atan2(_vector.z,_vector.x)}this.intersectMesh.visible=!0,this.needsRender=!0}else this.hideIntersectMesh()}onMouseWheel(event){if(this.initAnimationIsReady)if(this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh(),event.isFinal){let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:this.cameraMotion.value.longitude,latitude:this.cameraMotion.value.latitude,fov:this.cameraMotion.value.fov,offset:new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),distance:this.locationMotion.value.distance});if(this.fixFinalState(state),this.emit(`gesture.mousewheel`,event),event.defaultPrevented)return;let locationMotionValue={x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance};this.locationMotion.set(locationMotionValue,0).catch(require_memoryUsage.d)}else{let maxDistance=MapviewController.distanceFromModel(this.modelScene,this.cameraMotion.value.fov,this.camera.aspect),offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),direction=coordinatesToVector(this.cameraMotion.value,new three_webgpu.Vector3).negate(),intersect=new three_webgpu.Ray(offset,direction).intersectBox(this.modelScene.boundingBox,new three_webgpu.Vector3);intersect&&(maxDistance+=intersect.distanceTo(offset));let distance=Math.max(this.locationMotion.value.distance-this.camera.near,0),delta=event.center.delta/10*Math.max(distance/5,.1);if(distance<=maxDistance||delta>0)if(this.locationMotion.value.distance-delta>=minDistance){let nextDistance=this.locationMotion.value.distance-delta;event.state.distance=nextDistance}else{let direction=coordinatesToVector(this.cameraMotion.value);direction.setLength(delta),event.state.offset.add(direction)}if(this.emit(`gesture.mousewheel`,event),event.defaultPrevented)return;this.locationMotion.set({distance:event.state.distance,x:event.state.offset.x,y:event.state.offset.y,z:event.state.offset.z},0).catch(require_memoryUsage.d)}}onTapGesture(event){var _a;this.userAction=event.userAction,this.stopMomentumMovement();let raycaster=event.center.raycaster,observer=this.getForwardObserverOrNot(raycaster);if(!observer)this.emit(`gesture.tap`,event);else{let options={longitude:this.camera.pose.longitude,latitude:0},state=Object.assign(Object.assign({},event.state),{mode:`Panorama`,workCode:observer.work.workCode,panoIndex:observer.panoIndex,longitude:options.longitude,latitude:options.latitude,offset:observer?observer.position.clone():new three_webgpu.Vector3,distance:0});if(event.state=state,this.emit(`gesture.tap`,event),!event.defaultPrevented&&(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:event.userAction,options,progress:0,error:null})),observer&&observer.active)){let pendingTextureId=this.pendingTextureId=require_memoryUsage.N(),panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),imageURLTransform=this.imageOptions.transform,imageURLOptions=Object.assign({key:`pano.${panoId}`},require_pick.r(this.imageOptions,[`format`,`size`,`quality`,`sharpen`,`forceUseExifOrientation`,`mappings`])),colorImageURLs={right:observer.images.work.getURL(observer.images.right),left:observer.images.work.getURL(observer.images.left),up:observer.images.work.getURL(observer.images.up),down:observer.images.work.getURL(observer.images.down),front:observer.images.work.getURL(observer.images.front),back:observer.images.work.getURL(observer.images.back)},gainmapImageURLs,gainmapConfigUrl,gainmap=this.enableHDR?observer.images.gainmap:void 0;gainmap&&(gainmapImageURLs={right:observer.images.work.getURL(gainmap.right),left:observer.images.work.getURL(gainmap.left),up:observer.images.work.getURL(gainmap.up),down:observer.images.work.getURL(gainmap.down),front:observer.images.work.getURL(gainmap.front),back:observer.images.work.getURL(gainmap.back)},gainmapConfigUrl=observer.images.work.getURL(gainmap.cfg));let hash=`pano:`+jsonHash([colorImageURLs,gainmapImageURLs,imageURLOptions]),parameter=this.modelScene.parameter,existsPano;if(parameter.pano0&¶meter.pano0.map.name===hash?existsPano=parameter.pano0:parameter.pano1&¶meter.pano1.map.name===hash&&(existsPano=parameter.pano1),existsPano)parameter.pano0&¶meter.pano0.map!==existsPano.map&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==existsPano.map&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:existsPano,pano1:existsPano}),this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,progress:0,state,options,error:null}));else{let colorTextureTask=this.textureLoader.loadCubeTexture(colorImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer),gainmapTask=gainmapConfigUrl&&gainmapImageURLs?Promise.all([getFetcher(this.fiveId,observer.work).ajax(gainmapConfigUrl,{responseType:`text`}).then(response=>require_memoryUsage.A(JSON.parse(response.body))),this.textureLoader.loadCubeTexture(gainmapImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,colorSpace:three_webgpu.NoColorSpace,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer)]).then(([config,gainmapResponse])=>({config,map:gainmapResponse.body})):Promise.resolve(void 0);Promise.all([colorTextureTask,gainmapTask]).then(_a=>(0,tslib.__awaiter)(this,[_a],void 0,function*([response,gainmap]){var _b,_c;let{body:texture}=response;if(this.destroyed||this.pendingTextureId!==pendingTextureId){texture.dispose();return}this.pendingTextureId=null,texture.name=hash;let image=Array.isArray(texture.image)?texture.image[0]:texture.image,mapSize=(_b=image==null?void 0:image.width)==null?2048:_b,rgbaData=yield getRgbaDataFromCubeTexture(this.renderer,texture,!0,sharedHistogramRgbaData),mapHistogram=new Histogram().formPixels(rgbaData.data),panoPicture={panoId,map:texture,mapSize,mapHistogram:new three_webgpu.Vector4().fromArray(mapHistogram.toArray()),matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap:gainmap?{map:gainmap.map,cfg:gainmap.config}:void 0};parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_c=parameter.pano0)==null?void 0:_c.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:panoPicture,pano1:panoPicture}),this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,progress:0,state,options,error:null}))})).catch(error=>{this.destroyed||this.pendingTextureId!==pendingTextureId||(this.pendingTextureId=null)})}}}}onDblTapGesture(event){if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let state=event.state,raycaster=event.center.raycaster,offset=raycaster.ray.origin.clone().add(raycaster.ray.direction.clone().setLength(3)),distance=1,[intersect]=this.modelScene.intersectRaycaster(raycaster);if(intersect&&(offset=intersect.point.clone(),distance=intersect.distance>4/2?1:3),event.state.distance=distance,event.state.offset=offset,this.emit(`gesture.dbltap`,event),event.defaultPrevented)return;let locationMotionValue={x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance};this.locationMotion.set(locationMotionValue,360).catch(require_memoryUsage.d),this.hideIntersectMesh()}hideIntersectMesh(){this.intersectMesh.visible===!0&&(this.intersectMesh.visible=!1,this.needsRender=!0)}}},controllersDefaultInitArgs={Floorplan:defaultFloorplanControllerCustomInitArgs,Topview:defaultTopviewControllerCustomInitArgs,Panorama:defaultPanoramaControllerCustomInitArgs,VRPanorama:defaultVRPanoramaControllerCustomInitArgs,XRPanorama:defaultXRPanoramaControllerCustomInitArgs,Model:defaultModelControllerCustomInitArgs,Mapview:defaultMapviewControllerCustomInitArgs},PROXY_CONTROLLER_EVENT_NAMES=`gesture.pan,gesture.tap,gesture.dbltap,gesture.press,gesture.pinch,gesture.mousewheel,gesture.mousemove,gesture.momentum,gesture.fire,initAnimation.start,initAnimation.end,camera.update,intersect.update,pano.select,pano.moveTo,pano.moving,pano.arrived,pano.cancel,pano.error,pano.prepare,pano.texture.load,pano.texture.progress,pano.texture.success,pano.texture.error,pano.texture.abort,xr.session.start,xr.session.end,xr.gesture.tap,xr.gesture.press,xr.gesture.buttonUp,xr.gesture.buttonDown,xr.controller.update`.split(`,`);function initLegacyEvent(five){five.on(`initAnimation.start`,event=>{five.emit(`initAnimationWillStart`,event.state.panoIndex,event.state,event.userAction)}),five.on(`initAnimation.end`,event=>{five.emit(`initAnimationEnded`,event.state.panoIndex,event.state,event.userAction)}),five.on(`gesture.pan`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`pan`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsPanGesture`,event.state,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`pan`,event.pointers,event.isFinal),five.emit(`panGesture`,event.state,event.isFinal))}),five.on(`gesture.tap`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`tap`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsTapGesture`,event.center.raycaster,event.center.coords,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`tap`,event.pointers,event.isFinal),five.emit(`tapGesture`,event.center.raycaster,event.center.coords,event.isFinal))}),five.on(`gesture.dbltap`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`dbltap`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsDblTapGesture`,event.center.raycaster,event.center.coords,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`dbltap`,event.pointers,event.isFinal),five.emit(`dblTapGesture`,event.center.raycaster,event.center.coords,event.isFinal))}),five.on(`gesture.press`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`press`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsPressGesture`,event.center.raycaster,event.center.coords,event.center.delta,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`press`,event.pointers,event.isFinal),five.emit(`pressGesture`,event.center.raycaster,event.center.coords,event.center.delta,event.isFinal))}),five.on(`gesture.pinch`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`pinch`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsPinchGesture`,event.scale,event.state.fov,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`pinch`,event.pointers,event.isFinal),five.emit(`pinchGesture`,event.scale,event.state.fov,event.isFinal))}),five.on(`gesture.mousewheel`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`mouseWheel`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsMouseWheel`,event.center.delta,event.state.fov,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`mouseWheel`,event.pointers,event.isFinal),five.emit(`mouseWheel`,event.center.delta,event.state.fov,event.isFinal))}),five.on(`gesture.mousemove`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`mouseMove`,event.pointers,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`mouseMove`,event.pointers,event.isFinal),canceled=five.emit(`wantsChangeCameraFov`,event.state.fov),canceled&&event.preventDefault())}),five.on(`gesture.momentum`,event=>{let canceled=!1;canceled=five.emit(`wantsInteriaPan`,event.state),canceled&&event.preventDefault(),event.defaultPrevented||five.emit(`interiaPan`,event.state,event.isFinal)}),five.on(`camera.update`,event=>{five.emit(`cameraFovUpdate`,event.state.fov,event.userAction),five.emit(`cameraDirectionUpdate`,event.state,event.userAction);let vector=coordinatesToVector(event.state);vector.setLength(event.state.distance);let position=event.state.offset.clone().sub(vector);five.emit(`cameraPositionUpdate`,position,event.userAction),five.emit(`cameraUpdate`,event.state,event.userAction)}),five.on(`intersect.update`,event=>{if(event.intersection){let canceled=!1;canceled=five.emit(`wantsShowIntersectionOnModel`,event.raycaster),canceled&&event.preventDefault(),event.defaultPrevented||five.emit(`intersectionOnModelUpdate`,event.intersection,event.object)}else five.emit(`intersectionHidden`)}),five.on(`pano.request`,event=>{let canceled=five.emit(`wantsMoveToPano`,event.state.panoIndex,event.options,event.userAction);canceled||(canceled=five.emit(`wantsToMoveToPano`,event.state.panoIndex,event.options,event.userAction)),canceled&&event.preventDefault(),event.defaultPrevented||five.emit(`panoWillLoad`,event.state.panoIndex)}),five.on(`pano.select`,event=>{five.emit(`panoSelected`,event.state.panoIndex)}),five.on(`pano.moveTo`,event=>{five.emit(`panoLoaded`,event.state.panoIndex),five.emit(`moveToPano`,event.state.panoIndex,event.userAction),five.emit(`panoWillArrive`,event.state.panoIndex,event.state,event.userAction)}),five.on(`pano.moving`,event=>{five.emit(`movingToPano`,event.state.panoIndex,event.prevPano.panoIndex,event.progress)}),five.on(`pano.arrived`,event=>{five.emit(`panoArrived`,event.state.panoIndex,event.state,event.userAction)}),five.on(`pano.cancel`,event=>{five.emit(`moveToPanoCanceled`,event.state.panoIndex)}),five.on(`pano.error`,event=>{five.emit(`panoLoadError`,event.error,event.state.panoIndex)}),five.on(`pano.texture.load`,event=>{five.emit(`textureStartLoad`,event.pano.panoIndex)}),five.on(`pano.texture.success`,event=>{five.emit(`textureLoaded`,event.pano.panoIndex,event.meta)}),five.on(`pano.texture.error`,event=>{five.emit(`textureError`,event.error,event.pano.panoIndex)}),five.on(`pano.texture.abort`,event=>{five.emit(`textureAbort`,event.pano.panoIndex)}),five.on(`pano.texture.progress`,event=>{five.emit(`textureLoading`,event.progress,event.pano.panoIndex)}),five.on(`xr.session.start`,event=>{five.emit(`webXRSessionStart`)}),five.on(`xr.session.end`,event=>{five.emit(`webXRSessionEnd`)}),five.on(`xr.gesture.tap`,event=>{five.emit(`webXRControllerEvent`,`tap`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.gesture.press`,event=>{five.emit(`webXRControllerEvent`,`press`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.gesture.buttonUp`,event=>{five.emit(`webXRControllerEvent`,`buttonUp`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.gesture.buttonDown`,event=>{five.emit(`webXRControllerEvent`,`buttonDown`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.controller.update`,event=>{five.emit(`webXRControllerRayUpdate`,{leftRay:event.left?event.left.raycaster:void 0,rightRay:event.right?event.right.raycaster:void 0}),event.left&&five.emit(`webXRAxesUpdate`,`left`,{raycaster:{leftRay:event.left?event.left.raycaster:void 0,rightRay:event.right?event.right.raycaster:void 0},axesState:{up:event.left.axes.up,down:event.left.axes.down,left:event.left.axes.left,right:event.left.axes.right},deltaTime:event.left.deltaTime}),event.right&&five.emit(`webXRAxesUpdate`,`right`,{raycaster:{leftRay:event.left?event.left.raycaster:void 0,rightRay:event.right?event.right.raycaster:void 0},axesState:{up:event.right.axes.up,down:event.right.axes.down,left:event.right.axes.left,right:event.right.axes.right},deltaTime:event.right.deltaTime})}),five.on(`works.request`,event=>{five.emit(`willLoad`,event.input,event.works[0],five.getCurrentState())}),five.on(`works.load`,event=>{five.emit(`load`,event.input,event.works[0],five.getCurrentState())}),five.on(`works.ready`,event=>{five.emit(`loaded`,event.input,event.works[0])}),five.on(`state.change`,event=>{five.emit(`stateChange`,event.state,event.userAction)}),five.on(`currentState.change`,event=>{five.emit(`currentStateChange`,event.state,event.userAction)}),five.on(`state.set`,event=>{five.emit(`setState`,event.state)}),five.on(`state.synced`,event=>{five.emit(`stateSynced`,event.state)}),five.on(`model.request`,event=>{five.emit(`modelWillLoad`,event.work.model)}),five.on(`model.error`,event=>{five.emit(`modelLoadError`,event.error,event.model)}),five.on(`model.load`,event=>{five.emit(`modelLoaded`,event.model)}),five.on(`model.changeShownFloor`,event=>{five.emit(`modelShownFloorChange`,event.model.shownFloor,event.model.floorLength)}),five.on(`render`,event=>{five.emit(`renderFrame`,event.needsRender)}),five.on(`mode.change.request`,event=>{five.emit(`wantsChangeMode`,event.mode,event.prevMode)}),five.on(`mode.change`,event=>{five.emit(`modeChange`,event.mode,event.prevMode,event.state.panoIndex,event.state,event.userAction)}),five.on(`helpers.visible`,event=>{five.emit(`helpersVisibleChange`,event.object.visible)}),five.on(`network.resource`,event=>{five.emit(`network`,event.source,event.requestType,event.requestState,event.detail)})}function generateDefaultVideoElement(){if(typeof window<`u`){let video=document.createElement(`video`);video.loop=!0,video.autoplay=!0,video.playsInline=!0,video.muted=!0,video.crossOrigin=``;let userDoSomething=()=>{document.removeEventListener(`touchstart`,userDoSomething,!1),document.removeEventListener(`mousedown`,userDoSomething,!1),video.muted=!1};return document.addEventListener(`touchstart`,userDoSomething,!1),document.addEventListener(`mousedown`,userDoSomething,!1),video}else return{}}function initLights(){let lightGroup=new three_webgpu.Group;lightGroup.name=`internalLights`;{let light=new three_webgpu.DirectionalLight(16777215,.1*Math.PI);light.name=`direction0`,light.position.copy(new three_webgpu.Vector3(0,1,0)),lightGroup.add(light)}{let light=new three_webgpu.DirectionalLight(16777215,.1*Math.PI);light.name=`direction1`,light.position.copy(new three_webgpu.Vector3(-1,-1,-1)),lightGroup.add(light)}{let light=new three_webgpu.DirectionalLight(16777215,.3*Math.PI);light.name=`direction2`,light.position.copy(new three_webgpu.Vector3(1,1,1)),lightGroup.add(light)}{let light=new three_webgpu.AmbientLight(16777215,.6*Math.PI);light.name=`ambient0`,lightGroup.add(light)}return lightGroup}function parseKeyValue(content){var _a,_b;let result={},keyValueArray=content.split(/(\;|\,)/);for(let keyValue of keyValueArray){let pair=keyValue.split(`=`),key=(_a=pair[0])==null?void 0:_a.trim(),value=(_b=pair[1])==null?void 0:_b.trim();key&&value&&(result[key]=value)}return result}function getViewportScale(){var _a;if(typeof document<`u`){let metaElements=document.getElementsByTagName(`meta`);for(let i=0;i<metaElements.length;i++){let metaElement=metaElements[i];if(metaElement.getAttribute(`name`)===`viewport`){let data=parseKeyValue((_a=metaElement.getAttribute(`content`))==null?``:_a),scale=Number(data[`initial-scale`]);if(!isNaN(scale))return scale}}}return 1}var _a,REALSEE={zh:`data:image/png;base64,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`,en:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAA/CAMAAABEvTgEAAAANlBMVEUAAAADAwP////////////////////5+fn9/f3u7u7////7+/v+/v7////39/fT09P8/Pz4+PjGw8iqAAAAEnRSTlMABWVqWkxREjELYCtASRoHOSTOWamvAAAIpklEQVR42uyYidabIBCF9YLs6/u/bDsBQao0aY9d0ub2nBLHAfn5nGFw+a8lbUph+ehNFYNyghtwG5eP3k86Ky+4MYYbtsnlozeTzmnjhviRwD+p9L0krRONHwnig/CdFJXY8X0QvqViMiB+H4Rvq8zB+QRhlOFT1/z1ismYa4Qx2OQ3nz/ni5sVznEhQ/j5ZdYO/CQjcrDOb0JsYsvLv6Dsm1yyf/S9BPi3JgHoexEC24Pf5r826p8IQ4tB5kf+qndDaADGGN8e/LZ/CaFpfyGJv75mb4XQGDASBPHbvkEY1CjZD5aD3R6nE3Ma01YMWZ9mkS9HDuo07tlMw7+EMLUZSAfALy/rnRASwClC6TGK21bUHmTYcCRRBsYeH5iwNfbXIzNeBrB8NAtZzrHfmL18EeHaFQC8vMm/E0KwXVcIg2BgB4FYFfuoSqB3EvKAS9DloJjYKK9b1/O4gX9jFj+KkKQoKl/UGyE0jDSPwo0JZXdlJVgJr2wYV7ZLHROlgjGAOiDcTh/R9caMsweV+9YwobLtyrrAGM0qx59AGIBt6frR/T5eddATh257hjDG2xCyCUKvh9jBjjDNHk3YnWCbfoJQhKtVvxo3KkCdzD+MMAJ8XcuM0mZgthSqp3NtMsm5Nm/n0rJ7cEA4u89CORcX+Rjk0qHbeNJzhFGRB/Vq02jKzuVbopBQdKkehWq6coYl7ZjJzxDKS4R2uURof5jg+i1CTQhJi8IutcP2+8QAhJZO4OpsUSV0B5BBMieHquiriYcZQsmHXnlIExwId0ThHGGaje6ZycTR6Z9CqOI1wvijBNeLROqpfaztlrJ6tLpwM3V84pL6KtetmILJ2iQAE9otAxgOc+2waPrtVFYbjKSX54xQcgiVS6zSYkQDtEUJHfv9UThHWG95TR1N/ssQunqdaJ3pxyJ5jbOtFauOYqIFpKE2ciDFRwdLrOmXAB7fJNdFr+u3DgvJU2ytJAtRU3jXYwQBVdKDqM9Mh4LL1RRxfxTiSSKNrrgoMBd/CuE9iXQdEZZLyK+tBIysNk3ZqtxzJccaeICWvhtVbetvWxFiI2ozhwCI2J9MCDvEfQRVHaIAMr1SPfIiAH17FFJPhidRmHlhIwXj4bsIefgNCGORDLYtmad2VwZE3SaXuvLSEITiGOieocjbxcFjBSDpeuZAcd1thLAzXCvC3uuRNfde+/bs7qpIuevyvKbHbCDcUS1pJlYhJBDlKULPzGGEVpN9O27YEW7HabjwGsJRNVRwXHAqGnRZu1CCiK8evhWwhbJbm1JxFNU4cSidm2y/2gmuor5J7UqWofxKKvvwPVEIPG6itKyyyJyuuxqt0E7xgcJxinBRY38kXRGOdlUQfmOG+gmEPqwkCWxrl2uZVJWldKuFaWQKE9v9c7kSNchmDpJYNIWGcIAWTtOI9Y2i/vyucyEMCYDh9MOHpSI0R0F1MqlvimqOUCt+7M9MrgiHYY0tCM/mJ6rvvlBFNst4ETN979ItoWb6L/RVpXwqtiYBpB4168xhfIq+RijHadTXQe3tfV9ncpDZg3ErQwi6lZ0udFX7uANmTuBmCJcoQ1P2dY+153FrIk2j+UWEaT1J1UXqRFPloB9XkVaXTAZ8X+tRnowlWiYOp6dcIxxrrbRHX8vvt36dCRtrBea0Iu11aK9NJwjP/WBvPdrPEeZTnapqaynyiE+iZQzkV+E6lQ7/bEc4daCnPEWoxxer11D1CLvcWpEGwdpZfaxI50WKMMT/RxGqX4qwrk5XqptafJgNbHHRdCN0jwmAqUMYEql8ZS/MLc+3JH7vuTBzxlJ8gnCsRgCY/KMI50f7mxDGcTk3QO6vfwwVDJHk4D3HTRDOHWhvfVLODOB92xk5TNznePO50HIG9X2E2jHDRRc3zMW/LQrpkJaP8WFags0JosaEl61zGGhQfHSEcwcDyG67RuiPxE3shY3d0+rNX2eUYcZO9sJewATZlam4+esQZkAcF9e26HQCqboYRQh6vAwpsSGcOxAJ1wFdI+yQE5C6s2ij3/x1JiYw/oV9c9ttHAQCaEyAAczN//+zywRkmBIqUFZar9vzELWTASMfDwGUHKdCB7olr19OAWSLASI1DLoSMLv5F+zzVGiBZGaFXXj5gI3OnS705eGYYcyfRcF4Ow1C8cwZU1XhKAHJfyBajhRyOKdi066OcoEuKzTJXa9QosLa7il9qbcvU6aFupmv+FyG2j1Zm42deNdGzHnq0/eLZlNYkrD+QCEkVfKATR+CobRancw09ze2pcoUJBc7x5tLFfYJtTvrQ7oKZ4K/U2gcM3tq5SM2bx6IxLGkkBYhVehlawXcEx0WmwSTwhYPaSgxhbKCFtSqnhQHuV8axdRy4dUvXowUlrIocKhhU+c+xb5svE9cqArHCchhWAJfuH6vUMuckJXRE9U1hdQgrUJLHnhvOc/vQRSkLBxgrvAPihev9mF3soLdB8VlSyxOIEpabvA+rFcVUqJhiLFhowv7wRLSy2LckxXpOAEBkWPpIryRUhVuweYMCRvd56gFhfkElEuBBnuFQYMmTcFDeQcoycrrlVBj0KJfPXUhhMZrj336hMPv0Ic69DZP8Pvu9WqC3+lVupGFI7UKGyGfk85sKl6Hnqz4Ow3e6KvA2+WYGlk9exgrDLGcWXMZo5AuC7yfwnKnrqN1bhiuzuePIV6w5M/FA4K3+UPwlgovVptzo9BkMTMElFUeNNp08qtBd5dfNl3M4dQoyC7/8R0hb447hViRUkb9uDXbv2ByEKGezD0moArRHwqU8f4/890+Z7Gz2UHsjInSYklh9SdcPG5eg5X27v7tiqLMP0l4epibrCg8y09YdYC+8VLmA6qNIX3GrImB9GmFxZ/DFc6PKcBLsm4Q0UomhIu7/y2/K7DoDwHlbPydPv9r/rRHxzQAAAAIgE5n/8IGESrQ+AMAAAAAAODcAD1ClWuE0S+mAAAAAElFTkSuQmCC`},realsee_png_data_url_default=typeof navigator<`u`?(_a=REALSEE[navigator.language.split(`-`)[0]])==null?REALSEE.en:_a:REALSEE.zh,imageSize=[450,63],imageOffset=[20,20],vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,-.5,.5,0,.5,.5,0]),uvs=new Float32Array([0,0,1,0,0,1,1,1]),index=new Uint8Array([0,1,2,1,3,2]),geometry=new three_webgpu.BufferGeometry;geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),geometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),geometry.setIndex(new three_webgpu.BufferAttribute(index,1));var material=new three_webgpu.MeshBasicMaterial({transparent:!0,depthTest:!1,depthWrite:!1,stencilWrite:!1,fog:!1}),mesh=new three_webgpu.Mesh(geometry,material);mesh.matrixAutoUpdate=!1;var scene=new three_webgpu.Scene;scene.add(mesh),scene.matrixAutoUpdate=!1;var camera=new three_webgpu.OrthographicCamera(-.5,.5,.5,-.5,.1,1);camera.position.set(0,0,.5),camera.lookAt(0,0,0),camera.updateMatrixWorld(!0),camera.matrixAutoUpdate=!1;var prevViewport=new three_webgpu.Vector4,prevScissor=new three_webgpu.Vector4;function renderPoweredByRealsee(renderer){if(material.map){let viewport=renderer.getViewport(prevViewport),scissor=renderer.getScissor(prevScissor),scissorTest=renderer.getScissorTest(),autoClear=renderer.autoClear,width=imageSize[0]/3,height=imageSize[1]/3,x=scissor.x+imageOffset[0]/3,y=scissor.y+scissor.height-imageOffset[1]/3-height;renderer.setViewport(x,y,width,height),renderer.setScissor(x,y,width,height),renderer.setScissorTest(!0),renderer.autoClear=!1,renderer.render(scene,camera),renderer.setViewport(viewport),renderer.setScissor(scissor),renderer.setScissorTest(scissorTest),renderer.autoClear=autoClear}else{let texture=new three_webgpu.Texture,image=new Image;image.onload=()=>{texture.image=image,texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.minFilter=three_webgpu.LinearFilter,texture.needsUpdate=!0,texture.generateMipmaps=!1,material.needsUpdate=!0,image.onload=require_memoryUsage.d},image.src=realsee_png_data_url_default,material.map=texture}}function requestDeviceOrientationPermission(){return typeof location>`u`||location.protocol!==`https:`?Promise.reject(Error(`Request DeviceOrientation Permission denied.`)):typeof DeviceOrientationEvent<`u`&&typeof DeviceOrientationEvent.requestPermission==`function`?DeviceOrientationEvent.requestPermission().then(response=>{if(response==`granted`)return Promise.resolve();{let error=Error(`Request DeviceOrientation Permission denied.`);return Promise.reject(error)}}):Promise.resolve()}function requestXRSessionPermission(){if(`xr`in navigator)return navigator.xr.isSessionSupported(`immersive-vr`).then(supported=>supported?Promise.resolve():Promise.reject()).then(()=>navigator.xr.requestSession(`immersive-vr`,{optionalFeatures:[`local-floor`]}).then(session=>Promise.resolve(session)));{let error=Error(`Request XR Permission denied.`);return Promise.reject(error)}}var DEFAULT_MODE_CHANGE_DURATION=800,DEFAULT_CAMERA_FOV=90,DEFAULT_REQUEST_PROXY=url=>url.replace(`//vrlab-public.ljcdn.com/`,`//vr-public.realsee-cdn.cn/`).replace(`//vrlab-image4.ljcdn.com/`,`//vr-image-4.realsee-cdn.cn/`).replace(`//vrlab-image3.ljcdn.com/`,`//vr-image-3.realsee-cdn.cn/`).replace(`//vrlab-image2.ljcdn.com/`,`//vr-image-2.realsee-cdn.cn/`).replace(`//vrlab-image1.ljcdn.com/`,`//vr-image-1.realsee-cdn.cn/`),scratchSphere=new three_webgpu.Sphere,scratchBox3=new three_webgpu.Box3,scratchViewport=new three_webgpu.Vector4,scratchScissor=new three_webgpu.Vector4,scratchClearColor=new three_webgpu.Color,scratchRenderSize=new three_webgpu.Vector2,worksMap=new WeakMap,emptyWorks=createWorks([parseWork(null)]),Five_Instances={},Five=class Five extends require_memoryUsage.j{static get version(){return`1.0.0-alpha.14`}static get dracoPath(){return require_glTF_helpers.r.decoderPath}static set dracoPath(path){require_glTF_helpers.r.setDecoderPath(path)}static get ktx2Path(){return require_glTF_helpers.n.transcoderPath}static set ktx2Path(path){require_glTF_helpers.n.setTranscoderPath(path)}static get useNativeImageBitmap(){return require_imageBitmap.t()}static set useNativeImageBitmap(enable){require_imageBitmap.o(enable)}constructor(initArgs={}){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l,_m;if(super(),this.pbmGaussianSplattingRenderMesh=null,this.fiveId=require_memoryUsage.N(),Five_Instances[this.fiveId]=this,this.currentUpdateArgs={time:require_memoryUsage.p(),args:[]},this.currentMode=`Panorama`,this.pano={workCode:``,panoIndex:0},this.needsRender=!0,this.onlyRenderIfNeeds=(_a=initArgs.onlyRenderIfNeeds)==null?!0:_a,this.imageOptions=Object.assign({},(_b=initArgs.imageOptions)==null?{}:_b),this.textureOptions=Object.assign({},(_c=initArgs.textureOptions)==null?{}:_c),this.poweredByRealsee=(_d=initArgs.poweredByRealsee)==null?!0:_d,this.backgroundColor=new three_webgpu.Color((_e=initArgs.backgroundColor)==null?1579548:_e),this.backgroundAlpha=(_f=initArgs.backgroundAlpha)==null?1:_f,this.extraElements=[],this.controllerInits={Panorama:Object.assign({},initArgs.panorama),Model:Object.assign({},initArgs.model),Floorplan:Object.assign({},initArgs.floorplan),Topview:Object.assign({},initArgs.topview),Mapview:Object.assign({},initArgs.mapview),VRPanorama:Object.assign({},initArgs.vrPanorama),XRPanorama:Object.assign({},initArgs.xrPanorama)},this.fps={testCount:0,testTime:require_memoryUsage.p()},this.modeChangeDuration=(_g=initArgs.modeChangeDuration)==null?DEFAULT_MODE_CHANGE_DURATION:_g,this.enableWheel=(_h=initArgs.enableWheel)==null?!0:_h,this._enableHDR=!!initArgs.enableHDR&&canWebGPU&&!initArgs.forceWebGL,typeof window<`u`)if(`renderer`in initArgs)initArgs.renderer instanceof InternalWebGPURenderer&&this.throwError(Error(`cannot render a internal renderer`)),this.renderer=initArgs.renderer;else try{this.renderer=new InternalWebGPURenderer({outputType:this._enableHDR?three_webgpu.HalfFloatType:void 0,logarithmicDepthBuffer:initArgs.logarithmicDepthBuffer,forceWebGL:(_j=initArgs.forceWebGL)==null?!1:_j});let viewportScale=getViewportScale();this.renderer.setPixelRatio(viewportScale===1?window.devicePixelRatio:1),this.renderer.setSize(512,512),this.renderer.setClearColor(this.backgroundColor,this.backgroundAlpha)}catch(anyError){let error=anyError instanceof Error?anyError:Error(String(anyError));this.throwError(error)}this.getPixelsRenderTarget=new three_webgpu.RenderTarget(1,1,{colorSpace:(_l=(_k=this.renderer)==null?void 0:_k.outputColorSpace)==null?three_webgpu.SRGBColorSpace:_l,generateMipmaps:!1}),this.renderer&®isterPBMMaterials(this.renderer),this.viewport=Object.assign({left:0,bottom:0,width:1,height:1},initArgs.viewport),this.camera=new Camera(DEFAULT_CAMERA_FOV),this.scene=new Scene,this.scene.background=this.backgroundColor,this.xrCustomObjectsScene=new three_webgpu.Scene,this.scene.add(this.xrCustomObjectsScene),this.scene.matrixAutoUpdate=!1,this.requestProxy=(_m=initArgs.requestProxy)==null?DEFAULT_REQUEST_PROXY:_m,this.networkSubscribe=new require_memoryUsage.c,this.networkSubscribe.on(`network`,(source,type,state,detail)=>{var _a;this.emit(`network.resource`,createEvent(`network.resource`,{source,requestType:type,requestState:state,detail})),(_a=this.analysis)==null||_a.network(this.works,source,type,state,detail)}),this.readyCallbacks=[],this.syncingState=!1,this.helperGroup=new three_webgpu.Group,this.helperGroup.name=`helper`,this.helperGroup.matrixAutoUpdate=!1,this.scene.add(this.helperGroup),worksMap.set(this,emptyWorks),this.modelScene=new ModelScene({fiveId:this.fiveId}),this.modelScene.addEventListener(`model.create`,event=>{this.bindModel(event.model)}),this.scene.add(this.modelScene);let[emptyModel]=this.modelScene.setModels(emptyWorks,{forceReplaceImmediately:!0});defineProperty(emptyModel,`loaded`,{get(){return!1},set(_value){}}),this.videoTexture=new three_webgpu.VideoTexture(initArgs.videoInstance||generateDefaultVideoElement());let lights=initLights();this.scene.add(lights),this.state={mode:this.currentMode,workCode:this.pano.workCode,panoIndex:this.pano.panoIndex,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance},this.stateSynced=!1,this.destroyed=!1,this.paused=!0,typeof window<`u`&&(initArgs.play!==!1&&this.play(),this.stopAnimationLoop=require_imageBitmap.s.shared.add((time,deltaTime,...args)=>{this.updateTime(time,deltaTime,...args)},!1,0,10));let fullscreenchange=()=>{typeof document<`u`&&document.fullscreenElement===null&&this.currentMode===`VRPanorama`&&this.controller.emit(`vr.requestExit`,createEvent(`vr.requestExit`,{}))},webglcontextrestored=()=>{this.needsRender=!0},recoverContext=()=>{this.renderer instanceof InternalWebGPURenderer&&this.renderer.reconfigureContext(),this.needsRender=!0},onVisibilityChange=()=>{typeof document<`u`&&document.visibilityState===`visible`&&recoverContext()},onPageShow=()=>{recoverContext()};if(this.renderer instanceof InternalWebGPURenderer&&(this.renderer.onDeviceLostCallback=()=>{recoverContext()}),typeof document<`u`&&(document.addEventListener(`visibilitychange`,onVisibilityChange,!1),document.addEventListener(`fullscreenchange`,fullscreenchange,!1)),typeof window<`u`&&window.addEventListener(`pageshow`,onPageShow,!1),this.renderer&&this.renderer.domElement.addEventListener(`webglcontextrestored`,webglcontextrestored,!1),this.removeEventListeners=()=>{typeof document<`u`&&(document.removeEventListener(`visibilitychange`,onVisibilityChange,!1),document.removeEventListener(`fullscreenchange`,fullscreenchange,!1)),typeof window<`u`&&window.removeEventListener(`pageshow`,onPageShow,!1),this.renderer instanceof InternalWebGPURenderer&&(this.renderer.onDeviceLostCallback=void 0),this.renderer&&this.renderer.domElement.removeEventListener(`webglcontextrestored`,webglcontextrestored,!1)},this.loadWorkTask=this.prepare(),this.plugins={},initArgs.plugins&&initArgs.plugins.length){for(let pluginInit of initArgs.plugins)if(typeof pluginInit==`function`)pluginInit(this);else if(Array.isArray(pluginInit)){let[factory,instanceName,parameters]=pluginInit;if(typeof factory==`function`){let instance=factory(this,parameters);typeof instanceName==`string`&&(this.plugins[instanceName]?this.throwError(Error(`plugin name ${instanceName} is exists.`)):this.plugins[instanceName]=instance)}}}initLegacyEvent(this),this.fiveRenderer=new FiveRenderer({outputType:this._enableHDR?three_webgpu.HalfFloatType:void 0}),this.adaptiveLuminancePass=new AdaptiveLuminancePass,this.adaptiveLuminancePass.enabled=!1,this.fiveRenderer.composer.addPass(this.adaptiveLuminancePass),this.eyeDomeLightingPass=new EyeDomeLightingPass(this.camera),this.eyeDomeLightingPass.enabled=!1,this.fiveRenderer.composer.addPass(this.eyeDomeLightingPass),this.pbmGaussianSplattingRenderMesh=new PBMGaussianSplattingRenderMesh,this.scene.add(this.pbmGaussianSplattingRenderMesh)}get ident(){return this.fiveId}get panoIndex(){return this.pano.panoIndex}prepare(){return Promise.all([require_imageSupport.t().catch(require_memoryUsage.d)]).then(require_memoryUsage.d)}dispose(){var _a;if(this.destroyed===!0)return;delete Five_Instances[this.fiveId],this.emit(`dispose`),this.destroyed=!0,this.pause(),this.stopAnimationLoop&&(this.stopAnimationLoop(),this.stopAnimationLoop=void 0),this.off(),this.networkSubscribe.off(),this.controller&&(this.controller.destroy(),this.controller=void 0);let element=this.getElement();element&&element.parentNode&&element.parentNode.removeChild(element);let parameter=this.modelScene.parameter;parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.reset(`pano0`,`pano1`),this.modelScene.dispose(),worksMap.set(this,emptyWorks),this.renderer&&(!(this.renderer instanceof InternalWebGPURenderer)||this.renderer.isInitialized)&&this.renderer.render(new three_webgpu.Scene,new three_webgpu.PerspectiveCamera),this.fiveRenderer.dispose(),this.renderer instanceof InternalWebGPURenderer&&this.renderer.dispose()}setViewport(viewport){Object.assign(this.viewport,viewport),this.needsRender=!0}get boundingMesh(){return this.modelScene.boundingMesh}get helperVisible(){return this.helperGroup.visible}set helperVisible(visible){this.helperGroup.visible!==visible&&(this.helperGroup.visible=visible,this.emit(`helpers.visible`,createEvent(`helpers.visible`,{object:this.helperGroup})),this.needsRender=!0)}updateConfiguration(args,refresh=!0){let needsUpdateController=!1,forceUpdateController=!1;args.panorama&&(Object.assign(this.controllerInits.Panorama,require_pick.n(args.panorama)),this.currentMode===`Panorama`&&(needsUpdateController=!0)),args.model&&(Object.assign(this.controllerInits.Model,require_pick.n(args.model)),this.currentMode===`Model`&&(needsUpdateController=!0)),args.floorplan&&(Object.assign(this.controllerInits.Floorplan,require_pick.n(args.floorplan)),this.currentMode===`Floorplan`&&(needsUpdateController=!0)),args.topview&&(Object.assign(this.controllerInits.Topview,require_pick.n(args.topview)),this.currentMode===`Topview`&&(needsUpdateController=!0)),args.mapview&&(Object.assign(this.controllerInits.Mapview,require_pick.n(args.mapview)),this.currentMode===`Mapview`&&(needsUpdateController=!0)),args.vrPanorama&&(Object.assign(this.controllerInits.VRPanorama,require_pick.n(args.vrPanorama)),this.currentMode===`VRPanorama`&&(needsUpdateController=!0)),args.xrPanorama&&(Object.assign(this.controllerInits.XRPanorama,require_pick.n(args.xrPanorama)),this.currentMode===`XRPanorama`&&(needsUpdateController=!0)),args.imageOptions&&(Object.assign(this.imageOptions,args.imageOptions),(this.currentMode===`Panorama`||this.currentMode===`VRPanorama`||this.currentMode===`XRPanorama`)&&(forceUpdateController=!0,needsUpdateController=!0)),args.textureOptions&&Object.assign(this.textureOptions,args.textureOptions),refresh&&needsUpdateController&&this.controller&&this.currentMode&&(!this.controller.updateConfiguration(this.controllerInits[this.currentMode])||forceUpdateController)&&this.changeMode(this.currentMode,this.getCurrentState(),0,!1,!0)}appendTo(element,size={}){if(!this.renderer)return;if(!(this.renderer instanceof InternalWebGPURenderer)){this.throwError(Error(`cannot call appendTo method when render a external renderer`));return}let renderElement=this.getElement();if(!renderElement)return;element.appendChild(renderElement),this.refresh(size);let positionType=window.getComputedStyle(element).position;positionType!==`relative`&&positionType!==`absolute`&&positionType!==`fixed`&&positionType!==`sticky`&&(element.style.position=`relative`)}refresh(size={},pixelRatio){var _a,_b,_c,_d,_e,_f;if(!this.renderer)return;let container=this.renderer.domElement.parentNode,{width=(_a=container==null?void 0:container.offsetWidth)==null?512:_a,height=(_b=container==null?void 0:container.offsetHeight)==null?512:_b}=size;if(width=Math.max(1,width),height=Math.max(1,height),!pixelRatio){let viewportScale=getViewportScale(),devicePixelRatio=typeof window<`u`?window.devicePixelRatio:1;if(pixelRatio=(_c=viewportScale===1?devicePixelRatio:1)==null?1:_c,pixelRatio>1){let maxSize=Math.max(width,height)*pixelRatio,maxTextureSize=Math.min((_f=(_e=(_d=this.renderer.backend.device)==null?void 0:_d.limits)==null?void 0:_e.maxTextureDimension2D)==null?8192:_f,4096);maxSize>maxTextureSize&&(pixelRatio=Math.max(pixelRatio/maxSize*maxTextureSize,1),pixelRatio=Math.floor(pixelRatio*100)/100)}}this.renderer.setPixelRatio(pixelRatio),this.renderer.setSize(width,height),this.needsRender=!0;let time=require_memoryUsage.p(),deltaTime=time-this.currentUpdateArgs.time,args=this.currentUpdateArgs.args;this.updateTime(time,deltaTime,...args)}addExtraElement(element){return this.extraElements.indexOf(element)===-1&&(this.extraElements.push(element),this.controller&&this.controller.bindExtraElement(element)),()=>this.removeExtraElement(element)}removeExtraElement(element){let index=this.extraElements.indexOf(element);index!==-1&&(this.extraElements.splice(index,1),this.controller&&this.controller.unbindExtraElement(element))}getSize(target){if(!this.renderer)throw Error(`renderer is not initialized`);return this.renderer.getSize(target),target.x*=this.viewport.width,target.y*=this.viewport.height,target}getDrawingBufferSize(target){if(!this.renderer)throw Error(`renderer is not initialized`);return this.renderer.getDrawingBufferSize(target),target.x*=this.viewport.width,target.y*=this.viewport.height,target}updateCamera(pose,duration,userAction=!0){if(!this.controller)throw Error(`controller is not initialized.`);return this.controller.updateCamera(pose,duration,userAction)}updateCameraWithKeyframes(keyframes,duration,userAction=!0){if(!this.controller)throw Error(`controller is not initialized.`);return this.controller.updateCameraWithKeyframes(keyframes,duration,userAction)}get works(){return worksMap.get(this)||emptyWorks}get work(){return this.works[0]}get observers(){return this.work.observers}get models(){return this.modelScene.models}get model(){return this.modelScene.models[0]}load(inputWork,state,options,userAction=!0){if(!this.renderer)throw Error(`renderer is not initialized`);let task=this.loadWorkTask.then(()=>isPromise(inputWork)?inputWork.then(inputWork=>this.load_(inputWork,state,options,userAction)):this.load_(inputWork,state,options,userAction));return this.loadWorkTask=task.catch(error=>{this.throwError(error)}),task}load_(inputWork,state,options,userAction=!0){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k;let loadOptions={};typeof options==`number`?loadOptions.duration=options:typeof options==`object`&&Object.assign(loadOptions,options),this.works===emptyWorks&&(loadOptions.duration===void 0&&(loadOptions.duration=0),loadOptions.effect===void 0&&(loadOptions.effect=`instant`));let modelOptions={};Object.assign(modelOptions,loadOptions.model),!modelOptions[`3d-tiles`]&&loadOptions[`3d-tiles`]&&(modelOptions[`3d-tiles`]=loadOptions[`3d-tiles`]),!modelOptions.textureOptions&&loadOptions.textureOptions&&(modelOptions.textureOptions=loadOptions.textureOptions),!modelOptions.textureOptions&&this.textureOptions&&(modelOptions.textureOptions=this.textureOptions);let workArray=[];if(Array.isArray(inputWork))for(let input of inputWork)input instanceof Work?workArray.push(input):typeof input!=`string`&&`work`in input?workArray.push(parseWork(input.work,input)):workArray.push(parseWork(input));else inputWork instanceof Work?workArray.push(inputWork):workArray.push(parseWork(inputWork));loadOptions.mode===`add`&&(workArray=[].concat(this.works,workArray));let works;try{works=createWorks(workArray)}catch(error){return this.throwError(error),Promise.reject(error)}for(let work of works)this.bindWorkFetcher(work);state===void 0&&(state=`inherit`),state===`inherit`&&this.works===emptyWorks&&(state=`initial`);let prevMode=this.currentMode,initial=works.initial,initialObserver=initial.work.observers[0],initialPano=initialObserver?{workCode:initialObserver.work.workCode,panoIndex:initialObserver.panoIndex}:{workCode:initial.work.workCode,panoIndex:0},initialMode=(_a=initial.mode)==null?initialObserver?`Panorama`:`Mapview`:_a,initialPose={};if(state===`inherit`){let currentState=this.getCurrentState(),[currentWork]=works.filter(work=>work.workCode===currentState.workCode);if(currentWork)initialPano={workCode:currentState.workCode,panoIndex:currentState.panoIndex},initialMode=currentState.mode,initialPose={longitude:currentState.latitude,latitude:currentState.latitude,fov:currentState.fov,distance:currentState.distance,offset:currentState.offset.clone()};else{state={mode:prevMode};let observer=(_c=(_b=works[0])==null?void 0:_b.observers)==null?void 0:_c[this.panoIndex];observer?(state.workCode=observer.work.workCode,state.panoIndex=observer.panoIndex):typeof works.initial.panoIndex==`number`?(state.workCode=works.initial.work.workCode,state.panoIndex=works.initial.panoIndex):(state.mode===`Panorama`||state.mode===`VRPanorama`||state.mode===`XRPanorama`)&&(state.mode=`Mapview`),state.mode===prevMode&&(state.longitude=this.camera.pose.longitude,state.latitude=this.camera.pose.latitude,state.fov=this.camera.pose.fov)}}if(state===`initial`&&(typeof initial.panoIndex==`number`&&(initialPano={workCode:initial.work.workCode,panoIndex:initial.panoIndex}),initial.mode&&(initialMode=initial.mode),initialPose={longitude:initial.longitude,latitude:initial.latitude,fov:initial.fov,distance:initial.distance,offset:(_d=initial.offset)==null?void 0:_d.clone()}),typeof state==`object`){if(initialMode=(_e=state.mode)==null?prevMode:_e,typeof state.panoIndex==`number`){let observer=works.getObserver({workCode:(_g=(_f=state.workCode)==null?initial.work.workCode:_f)==null?``:_g,panoIndex:state.panoIndex});observer&&(initialPano={workCode:observer.work.workCode,panoIndex:observer.panoIndex})}initialPose={longitude:state.longitude,latitude:state.latitude,fov:state.fov,distance:state.distance,offset:state.offset?new three_webgpu.Vector3().copy(state.offset):void 0}}let duration=(_h=loadOptions.duration)==null?this.modeChangeDuration:_h;(initialMode===`Floorplan`||initialMode===`Topview`||initialMode===`Mapview`)&&prevMode===initialMode&&(duration=0);let effect=`fly`;(initialMode===`Panorama`||initialMode===`VRPanorama`||initialMode===`XRPanorama`)&&prevMode===initialMode&&(effect=(_j=loadOptions.effect)==null?`fade`:_j),this.emit(`works.request`,createEvent(`works.request`,{input:inputWork,works,userAction}));let applyController=(initialMode,initialPano,initialPose)=>{let currentState=this.getCurrentState(),initialState=Object.assign(Object.assign({mode:initialMode},initialPano),initialPose);state===`inherit`&&(initialState=this.getCurrentState()),this.pano=initialPano;let initialParams=Object.assign(Object.assign({initial:{state:initialState,currentState,duration,effect,userAction}},this.commonParams()),this.controllerInits[initialMode]),initAnimationEndState=Controllers[initialState.mode].initAnimationEndState(initialParams);if(this.controller&&prevMode===initialMode)this.controller.updateWork(works,initAnimationEndState,{effect,duration},userAction)===!1&&(this.controller.destroy(),this.controller=this.applyController(initialMode,initialParams));else{if(this.controller)this.controller.destroy();else{let state=Controllers[initialMode].initAnimationEndState(initialParams);this.camera.setFromPose(state),this.emit(`camera.update`,createEvent(`camera.update`,{state:this.getCurrentState(),userAction}))}this.controller=this.applyController(initialMode,initialParams);let modeChangeEvent=createEvent(`mode.change`,{prevMode,mode:initialMode,state:initAnimationEndState,userAction});try{this.emit(`mode.change`,modeChangeEvent)}catch(error){console.error(error)}}this.state.workCode=this.pano.workCode,this.state.panoIndex=this.pano.panoIndex,this.updateTime(this.currentUpdateArgs.time,0,...this.currentUpdateArgs.args)};worksMap.set(this,works);let loadModelPromise=Promise.resolve();if(initialMode===Five.Mode.Floorplan||initialMode===Five.Mode.Topview||initialMode===Five.Mode.Mapview||initialMode===Five.Mode.Model){this.modelScene.loaded===!1&&(this.camera.setFromPose(initialPose),assignPose(this.state,this.camera.pose));let models=this.modelScene.setModels(works,modelOptions);loadModelPromise=Promise.all(models.map(model=>model.loadedReady)).then(()=>{this.needsRender=!0,applyController(initialMode,initialPano,initialPose),this.emit(`camera.update`,createEvent(`camera.update`,{state:this.getCurrentState(),userAction}))})}else{applyController(initialMode,initialPano,initialPose);let controller=this.controller,callbacked=!1;this.modelScene.autoRefine=!1;let callback=()=>{this.works===works&&callbacked===!1&&(this.needsRender=!0,this.emit(`camera.update`,createEvent(`camera.update`,{state:this.getCurrentState(),userAction})),callbacked=!0,this.modelScene.autoRefine=!0),controller.off(`pano.arrived`,callback),controller.off(`pano.cancel`,callback)},models=this.modelScene.setModels(works,modelOptions);loadModelPromise=Promise.all(models.map(model=>model.initReady)).then(require_memoryUsage.d),controller.once(`pano.arrived`,callback),controller.once(`pano.cancel`,callback),setTimeout(callback,((_k=loadOptions.duration)==null?this.modeChangeDuration:_k)+1e3)}return this.emit(`works.load`,createEvent(`works.load`,{input:inputWork,userAction,works})),loadModelPromise.then(()=>this.ready()).then(()=>{var _a;this.emit(`works.ready`,createEvent(`works.ready`,{input:inputWork,userAction,works})),(_a=this.analysis)==null||_a.work(works)})}reset(){let task=this.loadWorkTask.then(()=>this.reset_());return this.loadWorkTask=task.catch(error=>{this.throwError(error)}),task}reset_(){return new Promise(resolve=>{var _a;this.controller&&(this.controller.destroy(),this.controller=void 0);let parameter=this.modelScene.parameter;parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:null,pano1:null,modelAlpha:1}),worksMap.set(this,emptyWorks),this.modelScene.setModels(emptyWorks,{forceReplaceImmediately:!0}),this.renderer&&this.modelScene.update(this.renderer,this.camera),this.needsRender=!0,this.currentMode=`Panorama`,this.pano={workCode:``,panoIndex:0},this.camera.setFromPose({distance:0,fov:DEFAULT_CAMERA_FOV,longitude:0,latitude:0,offset:new three_webgpu.Vector3(0,0,0)}),this.state={mode:this.currentMode,workCode:this.pano.workCode,panoIndex:this.pano.panoIndex,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance},this.camera.needsRender=!1,this.needsRender=!1,resolve()})}changeMode(mode,state={},options,userAction=!0,force=!1){return new Promise((resolve,reject)=>{var _a,_b,_c,_d;if(!this.renderer)throw Error(`renderer is not initialized.`);state=Object.assign({},state);let duration=0;this.controller&&(duration=typeof options==`number`?options:(_a=options==null?void 0:options.duration)==null?this.modeChangeDuration:_a);let effect=`fly`;this.controller&&typeof options==`object`&&options.effect&&(effect=options.effect);let nextPano=typeof state.panoIndex==`number`?{workCode:(_d=(_b=state.workCode)==null?(_c=this.work)==null?void 0:_c.workCode:_b)==null?``:_d,panoIndex:state.panoIndex}:this.pano;if(!Five.Mode.hasOwnProperty(mode)){let error=Error(`mode "${mode}" is not existed`);this.throwError(error),reject(error);return}if((mode===Five.Mode.Panorama||mode===Five.Mode.VRPanorama||mode===Five.Mode.XRPanorama)&&!this.works.getObserver(nextPano)){let error=Error(`PanoId ${panoStringify(nextPano)} not existed.`);this.throwError(error),reject(error);return}(mode===Five.Mode.Floorplan||mode===Five.Mode.Topview||mode===Five.Mode.Mapview||mode===Five.Mode.Model)&&this.modelScene.empty&&(duration=0);let prevController=this.controller,prevMode=this.currentMode,doChangeMode=()=>{if(this.controller&&this.controller.stopMomentumMovement(),this.controller&&force===!1&&prevMode===mode)mode===Five.Mode.Panorama||mode===Five.Mode.Model||mode===Five.Mode.VRPanorama||mode===Five.Mode.XRPanorama?!panoEqual(this.pano,nextPano)&&`moveToPano`in this.controller&&typeof this.controller.moveToPano==`function`?this.controller.moveToPano(nextPano,Object.assign({duration},state),userAction):this.controller.updateCamera(state,duration,userAction).catch(require_memoryUsage.d):(panoEqual(this.pano,nextPano)||(this.pano=nextPano),this.controller.updateCamera(state,duration,userAction).catch(require_memoryUsage.d));else{let initialState=Object.assign(Object.assign({},state),nextPano),params=Object.assign(Object.assign({initial:{state:initialState,currentState:this.getCurrentState(),duration,effect,userAction}},this.commonParams()),this.controllerInits[mode]),initAnimationEndState=Controllers[mode].initAnimationEndState(params),modeChangeEvent=createEvent(`mode.change.request`,{prevMode:this.currentMode,mode,state:initAnimationEndState,userAction});if(this.emit(`mode.change.request`,modeChangeEvent),!modeChangeEvent.defaultPrevented){prevController&&prevController.destroy(),this.controller=this.applyController(mode,params);let modeChangeEvent=createEvent(`mode.change`,{prevMode:this.currentMode,mode,state:initAnimationEndState,userAction});this.emit(`mode.change`,modeChangeEvent)}}resolve()},session=require_imageBitmap.s.shared.getContext();if(session&&(typeof XRSession<`u`&&session instanceof XRSession&&session.end(),require_imageBitmap.s.shared.setContext(null)),mode===Five.Mode.VRPanorama)this.requestFullscreen(),requestDeviceOrientationPermission().then(()=>doChangeMode()).catch(anyError=>{let error=anyError instanceof Error?anyError:Error(String(anyError));this.exitFullscreen(),this.throwError(error),reject(error)});else if(mode===Five.Mode.XRPanorama){if(!XRManager.isBackendXRCapable(this.renderer)){let error=Error(`XRPanorama 需要 WebGL2 回落后端。请在 new Five() 时传入 { forceWebGL: true }。后端在运行时无法切换,设备检测必须发生在 new Five() 之前。`);this.throwError(error),reject(error);return}if(!XRManager.isBrowserXRCapable()){let error=Error(`当前浏览器不支持 WebXR(navigator.xr 不存在)。`);this.throwError(error),reject(error);return}requestXRSessionPermission().then(session=>{require_imageBitmap.s.shared.setContext(session),force=!0;try{doChangeMode()}catch(anyError){console.error(`[XR] changeMode 建立 XRPanorama controller 失败,结束 session: ${anyError instanceof Error?anyError.message:String(anyError)}`),Promise.resolve(session.end()).catch(()=>{}),require_imageBitmap.s.shared.setContext(null);let error=anyError instanceof Error?anyError:Error(String(anyError));this.throwError(error),reject(error)}}).catch(anyError=>{let error=anyError instanceof Error?anyError:Error(String(anyError));this.throwError(error),reject(error)})}else doChangeMode()})}getPixels(xOrOptions,_y,_width,_height,_pixelRatio,_flipY,_buffer){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){if(!this.renderer)throw Error(`renderer is not initialized.`);let currentTime=require_memoryUsage.p(),prevPixelRatio=this.renderer.getPixelRatio(),prevRenderTarget=this.renderer.getRenderTarget(),renderSize=this.getSize(new three_webgpu.Vector2),x=0,y=0,width=1,height=1,pixelRatio,flipY,helperVisible,skipPanorama,buffer;typeof xOrOptions==`number`?(x=xOrOptions,typeof _y==`number`&&(y=_y),typeof _width==`number`&&(width=_width),typeof _height==`number`&&(height=_height),pixelRatio=_pixelRatio,flipY=_flipY,buffer=_buffer):(x=xOrOptions.x,y=xOrOptions.y,width=xOrOptions.width,height=xOrOptions.height,pixelRatio=xOrOptions.pixelRatio,flipY=xOrOptions.flipY,helperVisible=xOrOptions.helperVisible,skipPanorama=xOrOptions.skipPanorama,buffer=xOrOptions.buffer),x=Math.floor(x),y=Math.floor(y),width=Math.floor(width),height=Math.floor(height),pixelRatio=Math.floor(pixelRatio==null?prevPixelRatio:pixelRatio),flipY=flipY==null?!1:flipY;let prevHelperVisible=this.helperVisible,prevModelAlpha=this.modelScene.parameter.modelAlpha;this.helperVisible=helperVisible==null?this.helperVisible:helperVisible,skipPanorama&&(this.controller instanceof Controllers.Panorama||this.controller instanceof Controllers.VRPanorama||this.controller instanceof Controllers.XRPanorama)&&skipPanorama===!0&&this.modelScene.parameter.set(`modelAlpha`,1),this.modelScene.update(this.renderer,this.camera);let renderTarget=this.getPixelsRenderTarget;renderTarget.setSize(width*pixelRatio,height*pixelRatio),this.renderer.setRenderTarget(renderTarget),this.camera.pixelRatio=pixelRatio,this.camera.resolution.set(width,height),this.camera.setViewOffset(renderSize.width,renderSize.height,x,renderSize.height-y-height,width,height),this.camera.aspect=renderSize.width/renderSize.height,this.camera.updateTime(currentTime),this.scene.update(this.renderer,this.camera);let prevAutoClear=this.renderer.autoClear,prevAutoClearColor=this.renderer.autoClearColor,prevAutoClearDepth=this.renderer.autoClearDepth,prevAutoClearStencil=this.renderer.autoClearStencil,prevClearColor=this.renderer.getClearColor(scratchClearColor),prevClearAlpha=this.renderer.getClearAlpha(),prevScissorTest=this.renderer.getScissorTest();this.renderer.autoClear=!0,this.renderer.autoClearColor=!0,this.renderer.autoClearDepth=!0,this.renderer.autoClearStencil=!0,this.renderer.setScissorTest(!1);let background=this.scene.background;this.scene.background=this.camera.isOrthographicCamera||this.backgroundAlpha<1?null:background,this.renderer.render(this.scene,this.camera),this.scene.background=background,this.renderer.autoClear=prevAutoClear,this.renderer.autoClearColor=prevAutoClearColor,this.renderer.autoClearDepth=prevAutoClearDepth,this.renderer.autoClearStencil=prevAutoClearStencil,this.renderer.setClearColor(prevClearColor,prevClearAlpha),this.renderer.setScissorTest(prevScissorTest),this.helperVisible=prevHelperVisible,prevModelAlpha===void 0?this.modelScene.parameter.reset(`modelAlpha`):this.modelScene.parameter.set(`modelAlpha`,prevModelAlpha),this.renderer.setRenderTarget(prevRenderTarget),this.camera.clearViewOffset(),this.camera.pixelRatio=prevPixelRatio,this.camera.resolution.copy(renderSize),this.camera.aspect=this.camera.resolution.width/this.camera.resolution.height,this.camera.updateTime(currentTime),this.modelScene.update(this.renderer,this.camera),this.scene.update(this.renderer,this.camera);let pixelWidth=width*pixelRatio,pixelHeight=height*pixelRatio,pixelLength=pixelWidth*pixelHeight,byteLength=pixelLength*4;if(buffer){if(buffer.length!==byteLength)throw Error(`buffer length is not equals pixels ${byteLength}`)}else buffer=new Uint8Array(byteLength);let pixels=yield this.renderer.readRenderTargetPixelsAsync(renderTarget,0,0,pixelWidth,pixelHeight),rowBytes=pixelWidth*4;if(pixels.length===byteLength)buffer.set(pixels);else{let alignedRowBytes=Math.ceil(rowBytes/256)*256;for(let row=0;row<pixelHeight;row++){let srcStart=row*alignedRowBytes;buffer.set(pixels.subarray(srcStart,srcStart+rowBytes),row*rowBytes)}}if(!flipY){let halfPixelLength=pixelLength/2;for(let temp=0,index=0,rgbaIndex=0,targetIndex=0;index<halfPixelLength;index++)for(targetIndex=(pixelHeight-Math.floor(index/pixelWidth)-1)*pixelWidth+index%pixelWidth,rgbaIndex=0;rgbaIndex<4;rgbaIndex++)temp=buffer[index*4+rgbaIndex],buffer[index*4+rgbaIndex]=buffer[targetIndex*4+rgbaIndex],buffer[targetIndex*4+rgbaIndex]=temp}return buffer})}getElement(){var _a;return(_a=this.renderer)==null?void 0:_a.domElement}render(callback){let renderer=this.renderer;if(!renderer)return;let prevRenderTarget=renderer.getRenderTarget();renderer.setRenderTarget(null);let prevAutoClear=renderer.autoClear,prevAutoClearColor=renderer.autoClearColor,prevAutoClearDepth=renderer.autoClearDepth,prevAutoClearStencil=renderer.autoClearStencil,prevClearColor=renderer.getClearColor(scratchClearColor),prevClearAlpha=renderer.getClearAlpha(),prevViewport=renderer.getViewport(scratchViewport),prevScissor=renderer.getScissor(scratchScissor),prevScissorTest=renderer.getScissorTest();renderer.autoClear=!0,renderer.autoClearColor=!0,renderer.autoClearDepth=!0,renderer.autoClearStencil=!0;let renderSize=renderer.getSize(scratchRenderSize),left=Math.floor(renderSize.x*this.viewport.left),bottom=Math.floor(renderSize.y*this.viewport.bottom),width=Math.floor(renderSize.x*this.viewport.width),height=Math.floor(renderSize.y*this.viewport.height);renderer.setClearColor(this.backgroundColor,this.backgroundAlpha),renderer.setViewport(left,bottom,width,height),renderer.setScissor(left,bottom,width,height);let needsScissor=this.viewport.bottom!==0||this.viewport.left!==0||this.viewport.width!==1||this.viewport.height!==1;renderer.setScissorTest(needsScissor);let background=this.scene.background;this.scene.background=this.camera.isOrthographicCamera||this.backgroundAlpha<1?null:background;let needFiveRender=!0;if(this.controller&&this.controller.render()&&(needFiveRender=!1),needFiveRender){let rendered=this.fiveRenderer.render(renderer,this.scene,this.modelScene,this.camera,this.needsRender);this.poweredByRealsee&&rendered&&renderPoweredByRealsee(renderer)}this.scene.background=background,renderer.autoClear=prevAutoClear,renderer.autoClearColor=prevAutoClearColor,renderer.autoClearDepth=prevAutoClearDepth,renderer.autoClearStencil=prevAutoClearStencil,renderer.setClearColor(prevClearColor,prevClearAlpha),renderer.setViewport(prevViewport),renderer.setScissor(prevScissor),renderer.setScissorTest(prevScissorTest),renderer.setRenderTarget(prevRenderTarget),callback&&require_imageBitmap.s.shared.add(callback,!0)}updateTime(time,deltaTime,...args){if(this.currentUpdateArgs={time,args},this.destroyed)return;if(this.renderer&&require_glTF_helpers.n.detectSupport(this.renderer),this.syncingState=this.syncState(time,deltaTime),this.controller&&this.controller.updateTime(time,deltaTime,...args),this.renderer&&(this.camera.pixelRatio=this.renderer.getPixelRatio(),this.getSize(this.camera.resolution),this.camera.aspect=this.camera.resolution.width/this.camera.resolution.height),this.camera.controllerMode=this.currentMode,this.camera.updateTime(time),this.renderer){let lastLoaded=this.modelScene.loaded,lastRefined=this.modelScene.refined;this.modelScene.update(this.renderer,this.camera),lastLoaded===!1&&this.modelScene.loaded===!0&&(this.controller&&this.controller.updateModel(this.modelScene),require_imageBitmap.s.shared.add(()=>{this.emit(`models.load`,createEvent(`models.load`,{modelScene:this.modelScene}))},!0,0,10)),lastRefined===!1&&this.modelScene.refined===!0&&require_imageBitmap.s.shared.add(()=>{this.emit(`models.refined`,createEvent(`models.refined`,{modelScene:this.modelScene}))},!0,0,10)}if(this.camera.autoNearFar){scratchBox3.makeEmpty(),scratchBox3.expandByObject(this.modelScene.boundingMesh);let shpere=scratchBox3.getBoundingSphere(scratchSphere),boudingSize=shpere.radius*2;shpere.containsPoint(this.camera.position)||(boudingSize=this.camera.position.distanceTo(shpere.center)+shpere.radius);let near=require_memoryUsage.M(boudingSize/500,.001,.1),far=require_memoryUsage.M(boudingSize,800);this.camera.near!==near&&(this.camera.near=near),this.camera.far!==far&&(this.camera.far=far),this.camera.updateTime(time)}if(this.renderer){let modelSceneVisible=this.modelScene.visible;this.modelScene.visible=!1,this.scene.update(this.renderer,this.camera),this.modelScene.visible=modelSceneVisible}if(this.syncingState=!1,this.controller&&this.controller.needsRender===!0&&(this.controller.needsRender=!1,this.needsRender=!0),this.camera.needsRender===!0&&(this.camera.needsRender=!1,this.needsRender=!0),this.modelScene.needsRender===!0&&(this.modelScene.needsRender=!1,this.needsRender=!0),this.scene.needsRender===!0&&(this.scene.needsRender=!1,this.needsRender=!0),this.pbmGaussianSplattingRenderMesh&&this.pbmGaussianSplattingRenderMesh.needsRender===!0&&(this.pbmGaussianSplattingRenderMesh.needsRender=!1,this.needsRender=!0),this.fiveRenderer&&this.fiveRenderer.needsRender===!0&&(this.fiveRenderer.needsRender=!1,this.needsRender=!0),this.onlyRenderIfNeeds!==!0&&(this.needsRender=!0),this.paused===!0||this.renderer instanceof InternalWebGPURenderer&&!this.renderer.isInitialized)return;let renderEvent=createEvent(`render.prepare`,{needsRender:this.needsRender});this.emit(`render.prepare`,renderEvent),renderEvent.defaultPrevented&&(this.needsRender=!1);let currentNeedsRender=this.needsRender;this.render(),this.needsRender=!1,this.emit(`render`,createEvent(`render`,{needsRender:currentNeedsRender})),this.hasListener(`fps`)&&(this.fps.testTime&&time-this.fps.testTime<1e3?this.fps.testCount++:(this.emit(`fps`,this.fps.testCount),this.fps.testTime=time,this.fps.testCount=0))}pause(){this.paused=!0,this.renderer&&this.renderer instanceof InternalWebGPURenderer&&this.renderer.clear(!0,!0,!0)}play(){this.needsRender=!0,this.paused=!1}moveToPano(pano,options={},userAction=!0){let{controller,renderer}=this;if(!controller)return this.throwError(Error(`controller is not initialized.`)),Promise.resolve();if(!renderer)return this.throwError(Error(`renderer is not initialized.`)),Promise.resolve();typeof pano==`number`&&this.pano.workCode&&(pano={workCode:this.pano.workCode,panoIndex:pano});let observer=this.works.getObserver(pano);if(!observer)return this.throwError(Error(`pano ${JSON.stringify(pano)} not existed.`)),Promise.resolve();let nextPano={workCode:observer.work.workCode,panoIndex:observer.panoIndex};return`moveToPano`in controller&&typeof controller.moveToPano==`function`?controller.moveToPano(nextPano,options,userAction):observer&&(this.pano=nextPano,this.once(`initAnimation.start`,event=>{options.moveStartCallback&&options.moveStartCallback(event.state)}),this.once(`initAnimation.end`,event=>{options.moveEndCallback&&options.moveEndCallback(event.state)}),this.changeMode(Five.Mode.Panorama,options,{effect:options.effect},userAction)),this.ready()}preloadPano(pano,callback=require_memoryUsage.d){let observer=this.works.getObserver(pano);if(!observer)return Promise.reject(Error(`Pano ${JSON.stringify(pano)} never found`));let types=[`right`,`left`,`up`,`down`,`front`,`back`],startTime=require_memoryUsage.p();return Promise.all(types.map(type=>{let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),options=Object.assign({key:`pano.${panoId}.${type}`},require_pick.r(this.imageOptions,[`size`,`format`,`quality`,`forceUseExifOrientation`,`mappings`])),origin=observer.work.getURL(observer.images[type]),target=this.imageOptions.transform?this.imageOptions.transform(origin,options):require_pick.s(origin,options);return getFetcher(this.fiveId,observer.work).preload(target)})).then(()=>{let costs=require_memoryUsage.p()-startTime;return callback(costs),costs})}project2d(vector,testModel=!1){if(!this.renderer)return null;if(testModel){let origin=this.camera.position,subVector=vector.clone().sub(origin),raycaster=new three_webgpu.Raycaster(origin,subVector.clone().normalize());raycaster.params.Points={threshold:.1};let[intersect]=this.modelScene.intersectRaycaster(raycaster);if(intersect&&intersect.distance+.01<subVector.length())return null}let screen=vector.clone().project(this.camera);if(Math.abs(screen.z)>1)return null;let size=this.renderer.getSize(new three_webgpu.Vector2),width=size.x*this.viewport.width,height=size.y*this.viewport.height,left=size.x*this.viewport.left+(screen.x+1)/2*width,top=size.y*(1-this.viewport.bottom-this.viewport.height)+(-screen.y+1)/2*height;return new three_webgpu.Vector2(left,top)}getCurrentState(){return Object.assign(Object.assign({},this.camera.copyPose()),{mode:this.currentMode,workCode:this.pano.workCode,panoIndex:this.pano.panoIndex})}setState(state,immediately=!1,userAction=!0){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k;state=require_pick.r(state,[`mode`,`workCode`,`panoIndex`,`longitude`,`latitude`,`fov`,`offset`,`distance`]),state.offset&&!(state instanceof three_webgpu.Vector3)&&(state.offset=new three_webgpu.Vector3(state.offset.x,state.offset.y,state.offset.z));let pano;if(typeof state.panoIndex==`number`)if(state.workCode)pano={workCode:state.workCode,panoIndex:state.panoIndex};else{let workCode=(_b=(_a=this.work)==null?void 0:_a.workCode)==null?``:_b,prevWorkCode=this.state.workCode;this.works.filter(work=>work.workCode===prevWorkCode).length>0&&(workCode=prevWorkCode),pano={workCode,panoIndex:state.panoIndex}}let mode=(_c=state.mode)==null?this.state.mode:_c,longitude,latitude,fov,offset,distance;if(this.controller&&this.controller.stopMomentumMovement(),this.state.mode!==mode){if(mode===`VRPanorama`){this.changeMode(`VRPanorama`,void 0,void 0,!0);return}if(mode===`XRPanorama`){this.changeMode(`XRPanorama`,void 0,void 0,!0);return}let initialState={workCode:pano==null?void 0:pano.workCode,panoIndex:pano==null?void 0:pano.panoIndex};typeof state.longitude==`number`&&(initialState.longitude=state.longitude),typeof state.latitude==`number`&&(initialState.latitude=state.latitude),typeof state.fov==`number`&&(initialState.fov=state.fov),typeof state.distance==`number`&&(initialState.distance=state.distance),state.offset instanceof three_webgpu.Vector3&&(initialState.offset=state.offset);let params=Object.assign(Object.assign({initial:{state:initialState,currentState:this.getCurrentState(),duration:this.modeChangeDuration,effect:`fly`,userAction:!1}},this.commonParams()),this.controllerInits[mode]),initAnimationEndState=Controllers[mode].initAnimationEndState(params);longitude=initAnimationEndState.longitude,latitude=initAnimationEndState.latitude,fov=initAnimationEndState.fov,offset=initAnimationEndState.offset,distance=initAnimationEndState.distance}else longitude=(_d=state.longitude)==null?this.state.longitude:_d,latitude=(_e=state.latitude)==null?this.state.latitude:_e,fov=(_f=state.fov)==null?this.state.fov:_f,offset=(_g=state.offset)==null?this.state.offset:_g,distance=(_h=state.distance)==null?this.state.distance:_h;let nextState={workCode:(pano==null?this.pano:pano).workCode,panoIndex:(pano==null?this.pano:pano).panoIndex,mode,longitude,latitude,fov,offset,distance};this.emit(`state.set`,createEvent(`state.set`,{userAction,state:nextState})),stateEqual(this.state,nextState)||(this.controller&&nextState.mode===`VRPanorama`&&nextState.mode!==this.state.mode?(assignState(this.state,nextState),this.changeMode(`VRPanorama`)):this.controller&&nextState.mode===`XRPanorama`&&nextState.mode!==this.state.mode?(assignState(this.state,nextState),this.changeMode(`XRPanorama`)):(assignState(this.state,nextState),this.controller&&userAction&&(this.controller.userAction=!1),immediately&&this.state.mode===nextState.mode&&(this.syncingState=this.syncState(require_memoryUsage.p(),0,immediately),this.syncingState&&((_j=this.controller)==null||_j.updateTime(require_memoryUsage.p(),0),this.syncingState=!1)),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_k=this.analysis)==null||_k.state(this.works,this.state)))}syncState(time,deltaTime,immediately=!1){let lastStateSynced=this.stateSynced;if(this.stateSynced=!1,!this.controller)return!1;if(this.state.mode!==this.currentMode){let state={mode:this.state.mode,workCode:this.state.workCode,panoIndex:this.state.panoIndex,longitude:this.state.longitude,latitude:this.state.latitude,fov:this.state.fov,offset:this.state.offset,distance:this.state.distance};return this.changeMode(this.state.mode,state,this.modeChangeDuration,this.controller.userAction),!0}if(!this.controller.isReady())return!1;if(this.controller instanceof Controllers.Model){if(notSimilarVector3(this.camera.pose.offset,this.state.offset)){let pose={longitude:this.state.longitude,latitude:this.state.latitude,fov:this.state.fov,offset:this.state.offset};return this.controller.moveToPosition(this.state.offset,Object.assign(Object.assign({},pose),{duration:immediately?0:void 0}),!1),!0}}else{let statePano={workCode:this.state.workCode,panoIndex:this.state.panoIndex};if(!panoEqual(statePano,this.pano)&&`moveToPano`in this.controller&&typeof this.controller.moveToPano==`function`){let pose={longitude:this.state.longitude,latitude:this.state.latitude,fov:this.state.fov,offset:this.state.offset,distance:this.state.distance};return this.controller.moveToPano(statePano,pose,!1),!0}}if(this.controller instanceof Controllers.Floorplan||this.controller instanceof Controllers.Topview||this.controller instanceof Controllers.Mapview){let defaultOffsetStep=.2,defaultCoordinatesStep=Math.PI/45,nextFov=immediately?this.state.fov:stepNumber(this.camera.pose.fov,this.state.fov,1),deltaDistance=Math.abs(this.camera.pose.distance-this.state.distance),distanceStep=deltaDistance>defaultOffsetStep*15?deltaDistance/15:.2,nextDistance=immediately?this.state.distance:stepNumber(this.camera.pose.distance,this.state.distance,distanceStep),deltaOffsetDistance=this.camera.pose.offset.distanceTo(this.state.offset),offsetDtep=deltaOffsetDistance>defaultOffsetStep*15?deltaOffsetDistance/15:defaultOffsetStep,nextOffset=immediately?new three_webgpu.Vector3().copy(this.state.offset):stepVector(this.camera.pose.offset,this.state.offset,offsetDtep),{longitude:nextLongitude,latitude:nextLatitude}=immediately?{longitude:this.state.longitude,latitude:this.state.latitude}:stepCoordinates({longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude},{longitude:this.state.longitude,latitude:this.state.latitude},defaultCoordinatesStep);if(notSimilarValue(nextFov,this.camera.pose.fov)||notSimilarVector3(nextOffset,this.camera.pose.offset)||notSimilarValue(nextDistance,this.camera.pose.distance)||notSimilarValue(nextLongitude,this.camera.pose.longitude,Math.PI*2)||notSimilarValue(nextLatitude,this.camera.pose.latitude)){let nextLocationMotionValue={x:nextOffset.x,y:nextOffset.y,z:nextOffset.z},nextCameraMotionValue={fov:nextFov};return Object.assign(nextLocationMotionValue,{distance:nextDistance}),Object.assign(nextCameraMotionValue,{longitude:nextLongitude,latitude:nextLatitude}),this.controller.stopMomentumMovement(),this.controller.cameraMotion.set(nextCameraMotionValue,0).catch(require_memoryUsage.d),this.controller.locationMotion.set(nextLocationMotionValue,0).catch(require_memoryUsage.d),!0}}else{let coordinatesStep=Math.PI/45,nextFov=immediately?this.state.fov:stepNumber(this.camera.pose.fov,this.state.fov,1),{longitude:nextLongitude,latitude:nextLatitude}=immediately?{longitude:this.state.longitude,latitude:this.state.latitude}:stepCoordinates({longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude},{longitude:this.state.longitude,latitude:this.state.latitude},coordinatesStep),nextDistance=this.state.distance,nextOffset=new three_webgpu.Vector3().copy(this.state.offset);if(notSimilarValue(nextDistance,this.camera.pose.distance)&&(this.state.distance=this.camera.pose.distance),notSimilarVector3(nextOffset,this.camera.pose.offset)&&(this.state.offset=this.camera.pose.offset.clone()),notSimilarValue(nextLongitude,this.camera.pose.longitude,Math.PI*2)||notSimilarValue(nextLatitude,this.camera.pose.latitude)||notSimilarValue(nextFov,this.camera.pose.fov))return this.controller.stopMomentumMovement(),this.controller.cameraMotion.set({longitude:nextLongitude,latitude:nextLatitude,fov:nextFov},0).catch(require_memoryUsage.d),!0}if(this.stateSynced=!0,lastStateSynced===!1&&this.emit(`state.synced`,createEvent(`state.synced`,{userAction:!1,state:this.state})),this.readyCallbacks.length&&this.stateSynced){let mode=this.currentMode;if(!(mode===Five.Mode.Floorplan||mode===Five.Mode.Topview||mode===Five.Mode.Mapview||mode===Five.Mode.Model)||this.modelScene.loaded){let readyCallbacks=this.readyCallbacks.slice();this.readyCallbacks.length=0;for(let callback of readyCallbacks)this.controller instanceof Controllers.Panorama&&callback.tile===!0?this.readyCallbacks.push(callback):callback()}}return!1}ready(args={}){return new Promise(resolve=>{var _a;this.readyCallbacks.push(Object.assign(resolve,{tile:(_a=args.tile)==null?!1:_a}))}).then(()=>{var _a;return Promise.all([this.model.initReady,(_a=this.renderer)==null?void 0:_a.ready])}).then(require_memoryUsage.d)}requestFullscreen(){var _a;if(!isMobile)return;let parentNode=(_a=this.getElement())==null?void 0:_a.parentNode;parentNode&&`requestFullscreen`in parentNode&&typeof document<`u`&&document.fullscreenElement===null&&parentNode.requestFullscreen()}exitFullscreen(){typeof document<`u`&&document.fullscreenElement&&`exitFullscreen`in document&&document.exitFullscreen()}throwError(error){this.hasListener(`error`)?this.emit(`error`,error):console.error(error)}bindModel(model){let onModelLoad=()=>{require_imageBitmap.s.shared.add(()=>{this.emit(`model.load`,createEvent(`model.load`,{work:model.work,model,error:null}))},!0)},onModelError=event=>{let{error}=event;this.emit(`model.error`,createEvent(`model.error`,{work:model.work,model,error})),this.throwError(error)},onModelChangeShownFloor=()=>{this.emit(`model.changeShownFloor`,createEvent(`model.changeShownFloor`,{work:model.work,model,error:null}))},onModelTileLoad=event=>{this.emit(`models.tileLoad`,createEvent(`models.tileLoad`,{work:model.work,model,tile:event.tile}))},onModelTileUnload=event=>{this.emit(`models.tileUnload`,createEvent(`models.tileUnload`,{work:model.work,model,tile:event.tile}))},onModelDispose=()=>{model.removeEventListener(`load`,onModelLoad),model.removeEventListener(`error`,onModelError),model.removeEventListener(`changeShownFloor`,onModelChangeShownFloor),model.removeEventListener(`tileLoad`,onModelTileLoad),model.removeEventListener(`tileUnload`,onModelTileUnload),model.removeEventListener(`dispose`,onModelDispose)};model.addEventListener(`load`,onModelLoad),model.addEventListener(`error`,onModelError),model.addEventListener(`changeShownFloor`,onModelChangeShownFloor),model.addEventListener(`tileLoad`,onModelTileLoad),model.addEventListener(`tileUnload`,onModelTileUnload),model.addEventListener(`dispose`,onModelDispose),this.emit(`model.request`,createEvent(`model.request`,{work:model.work,model,error:null}))}bindWorkFetcher(work){let five=this,workCode=work.workCode,fetcher=new require_memoryUsage.a({get networkSubscribe(){return five.networkSubscribe},requestProxy(url){return five.requestProxy(url,workCode)}});registerFetcher(this.fiveId,work,fetcher)}commonParams(){return{fiveId:this.fiveId,scene:this.scene,xrCustomObjectsScene:this.xrCustomObjectsScene,helper:this.helperGroup,camera:this.camera,renderer:this.renderer,viewport:this.viewport,element:this.getElement(),works:this.works,imageOptions:this.imageOptions,enableWheel:this.enableWheel,enableHDR:this._enableHDR,extraElements:this.extraElements,videoTexture:this.videoTexture,modelScene:this.modelScene}}applyController(mode,initialParams){if(!this.renderer)throw Error(`renderer is not initialized.`);let Controller=Controllers[mode];this.currentMode=mode;let controller=new Controller(initialParams);for(let name of PROXY_CONTROLLER_EVENT_NAMES)controller.on(name,(...args)=>{if(this.emit(name,...args))return!1});{let nextState=Controllers[mode].initAnimationEndState(initialParams),userAction=initialParams.initial.userAction;stateEqual(this.state,nextState)||(assignState(this.state,nextState),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state}))),this.emit(`currentState.change`,createEvent(`currentState.change`,{userAction,state:this.getCurrentState()}))}return controller.on(`camera.update`,event=>{var _a;if(this.controller){let nextState=this.controller.getTargetState();event.userAction&&this.syncingState===!1&&this.state.mode===nextState.mode&&!stateEqual(this.state,nextState)&&(assignState(this.state,nextState),this.emit(`state.change`,createEvent(`state.change`,{userAction:event.userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}this.emit(`currentState.change`,createEvent(`currentState.change`,{userAction:event.userAction,state:this.getCurrentState()}))}),controller.on(`initAnimation.start`,event=>{var _a;let{state,userAction}=event;userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`initAnimation.end`,event=>{var _a;let{state,userAction}=event;this.pano={workCode:state.workCode,panoIndex:state.panoIndex},userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.moveTo`,event=>{var _a;let{state,userAction}=event;this.pano={workCode:state.workCode,panoIndex:state.panoIndex},userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.arrived`,event=>{var _a;let{state,userAction}=event;this.pano={workCode:state.workCode,panoIndex:state.panoIndex},userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.cancel`,event=>{var _a;let{state,userAction}=event;userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.moveTo`,event=>{let{userAction}=event;this.emit(`currentState.change`,createEvent(`currentState.change`,{userAction,state:this.getCurrentState()}))}),controller.on(`pano.request`,event=>{this.emit(`pano.request`,event),event.defaultPrevented||this.moveToPano(event.state,event.options,event.userAction)}),controller.on(`vr.requestExit`,()=>{this.currentMode===Five.Mode.VRPanorama&&(this.exitFullscreen(),this.changeMode(Five.Mode.Panorama))}),controller.on(`error`,error=>this.throwError(error)),controller}removeEventListeners(){}get internalLightsEnabled(){let internalLights=this.scene.children.find(child=>child.name===`internalLights`);return internalLights?internalLights.visible:!1}set internalLightsEnabled(value){let internalLights=this.scene.children.find(child=>child.name===`internalLights`);internalLights&&(internalLights.visible=value),internalLights=this.modelScene.children.find(child=>child.name===`internalLights`),internalLights&&(internalLights.visible=value)}get scissor(){return this.viewport}setScissor(scissor){return this.setViewport(scissor)}getPose(){let{longitude,latitude,fov,offset,distance}=this.camera.copyPose();return{longitude,latitude,fov,offset:offset.clone(),distance}}getLongitudeAndLatitude(){let{longitude,latitude}=this.getPose();return{longitude,latitude}}getOffset(){return this.getPose().offset}getCameraLocal(){if(this.pano.workCode&&this.controller&&this.works){let observer=this.works.getObserver(this.pano);if(observer){let object=new three_webgpu.Object3D;object.matrix.copy(observer.matrix).premultiply(observer.work.transform),object.matrix.decompose(object.position,object.quaternion,object.scale),object.matrixAutoUpdate=!1;let lookAtVector=new three_webgpu.Vector3(0,0,-1);lookAtVector.applyQuaternion(this.camera.quaternion);let quaternion=object.quaternion.clone().invert();return lookAtVector.applyQuaternion(quaternion),{theta:Math.atan2(lookAtVector.x,-lookAtVector.z),phi:-Math.asin(lookAtVector.y),lookAtVector}}}return null}addPass(pass){this.fiveRenderer.composer.addPass(pass)}removePass(pass){let index=this.fiveRenderer.composer.passes.indexOf(pass);index!==-1&&this.fiveRenderer.composer.passes.splice(index,1)}insertPass(pass,index){this.fiveRenderer.composer.insertPass(pass,index)}get renderMode(){return this.fiveRenderer.renderMode}set renderMode(value){this.fiveRenderer.renderMode=value}get pointCloudTransparencyMode(){return this.fiveRenderer.pointCloudTransparencyMode}set pointCloudTransparencyMode(value){this.fiveRenderer.pointCloudTransparencyMode=value}get enableEDL(){return this.eyeDomeLightingPass.enabled}set enableEDL(enable){this.eyeDomeLightingPass.enabled=enable,this.needsRender=!0}get enableAdaptiveLuminance(){return this.adaptiveLuminancePass.enabled}set enableAdaptiveLuminance(enable){this.adaptiveLuminancePass.enabled=enable,this.needsRender=!0}get enableHDR(){return this._enableHDR}};Five.Mode={Panorama:`Panorama`,Model:`Model`,Floorplan:`Floorplan`,Topview:`Topview`,Mapview:`Mapview`,VRPanorama:`VRPanorama`,XRPanorama:`XRPanorama`},typeof window<`u`&&Object.assign(window,{__FIVE_DEBUG__:{THREE:three_webgpu,constructor:Five,instances:Five_Instances}});var XRButton=class{static createButton(onClickHook){let button=document.createElement(`button`),ENTER_TEXT=`ENTER VR`,ENTER_LEFT=`calc(50% - 50px)`,ENTER_WIDTH=`100px`,resetTimer;function showEnterVR(){button.style.display=``,button.style.cursor=`pointer`,button.style.left=ENTER_LEFT,button.style.width=ENTER_WIDTH,button.textContent=ENTER_TEXT,button.onmouseenter=function(){button.style.opacity=`1.0`},button.onmouseleave=function(){button.style.opacity=`0.5`},button.onclick=function(){if(!onClickHook)return;let result;try{result=onClickHook()}catch(error){handleEnterFailed(error);return}result&&typeof result.then==`function`&&result.then(void 0,handleEnterFailed)}}function handleEnterFailed(error){let message=error instanceof Error?error.message:String(error);/forceWebGL/.test(message)&&(resetTimer&&clearTimeout(resetTimer),button.textContent=`需降级到 WebGL2`,button.style.left=`calc(50% - 75px)`,button.style.width=`150px`,resetTimer=setTimeout(function(){resetTimer=void 0,button.textContent=ENTER_TEXT,button.style.left=ENTER_LEFT,button.style.width=ENTER_WIDTH},3e3))}function disableButton(){button.style.display=``,button.style.cursor=`auto`,button.style.left=`calc(50% - 75px)`,button.style.width=`150px`,button.onmouseenter=null,button.onmouseleave=null,button.onclick=null}function showWebXRNotFound(){disableButton(),button.textContent=`VR NOT SUPPORTED`}function stylizeElement(element){element.style.position=`absolute`,element.style.bottom=`20px`,element.style.padding=`12px 6px`,element.style.border=`1px solid #fff`,element.style.borderRadius=`4px`,element.style.background=`rgba(0,0,0,0.1)`,element.style.color=`#fff`,element.style.font=`normal 13px sans-serif`,element.style.textAlign=`center`,element.style.opacity=`0.5`,element.style.outline=`none`,element.style.zIndex=`999`}if(`xr`in navigator)return button.id=`VRButton`,button.style.display=`none`,stylizeElement(button),navigator.xr.isSessionSupported(`immersive-vr`).then(function(supported){supported?showEnterVR():showWebXRNotFound()}),button;{let message=document.createElement(`a`);return window.isSecureContext===!1?(message.href=document.location.href.replace(/^http:/,`https:`),message.innerHTML=`WEBXR NEEDS HTTPS`):(message.href=`https://immersiveweb.dev/`,message.innerHTML=`WEBXR NOT AVAILABLE`),message.style.left=`calc(50% - 90px)`,message.style.width=`180px`,message.style.textDecoration=`none`,stylizeElement(message),message}}};exports.AdaptiveLuminancePass=AdaptiveLuminancePass,exports.AnimationFrameLoop=require_imageBitmap.s,exports.BoundingMesh=BoundingMesh,exports.Camera=Camera,exports.EffectComposer=EffectComposer,exports.EyeDomeLightingPass=EyeDomeLightingPass,exports.Fetcher=require_memoryUsage.a,exports.Five=Five,exports.FivePass=FivePass,exports.FiveRenderer=FiveRenderer,exports.FlowingFireworks3DPass=FlowingFireworks3DPass,exports.FlowingLight2DPass=FlowingLight2DPass,exports.FlowingLight3DPass=FlowingLight3DPass,exports.FullScreenQuad=FullScreenQuad,exports.GSPLAT_PIPELINE_AUTO=GSPLAT_PIPELINE_AUTO,exports.GSPLAT_PIPELINE_RASTER_CPU_SORT=GSPLAT_PIPELINE_RASTER_CPU_SORT,exports.GSPLAT_PIPELINE_RASTER_GPU_SORT=GSPLAT_PIPELINE_RASTER_GPU_SORT,exports.GaussianBlurPass=GaussianBlurPass,exports.Histogram=Histogram,exports.InternalWebGPURenderer=InternalWebGPURenderer,exports.Model=Model,exports.ModelScene=ModelScene,exports.Motion=Motion,exports.NetworkSubscribe=require_memoryUsage.c,exports.PBMCustomNode=require_memoryUsage.y,exports.PBMGSObject=require_pbmGaussianSplattingObject.t,exports.PBMGaussianSplattingObject=require_pbmGaussianSplattingObject.t,exports.PBMGaussianSplattingNodeMaterial=PBMGaussianSplattingNodeMaterial,exports.PBMGaussianSplattingRenderMesh=PBMGaussianSplattingRenderMesh,exports.PBMGroup=PBMGroup,exports.PBMMesh=require_pbmMeshMaterial.o,exports.PBMMeshBasicMaterial=require_pbmMeshMaterial.t,exports.PBMMeshBasicNodeMaterial=PBMMeshBasicNodeMaterial,exports.PBMMeshPanoOnlyMaterial=require_pbmMeshMaterial.n,exports.PBMMeshPanoOnlyNodeMaterial=PBMMeshPanoOnlyNodeMaterial,exports.PBMMeshPhongMaterial=require_pbmMeshMaterial.r,exports.PBMMeshPhongNodeMaterial=PBMMeshPhongNodeMaterial,exports.PBMMeshPhysicalMaterial=require_pbmMeshMaterial.i,exports.PBMMeshPhysicalNodeMaterial=PBMMeshPhysicalNodeMaterial,exports.PBMPanoFilter=require_memoryUsage.b,exports.PBMPointCloud=require_memoryUsage.m,exports.PBMPointCloudMaterial=require_memoryUsage.v,exports.PBMSkinnedMesh=require_pbmMeshMaterial.s,exports.PBMUpdateable=require_memoryUsage.x,exports.PBMVertexMarkFlag=require_memoryUsage.S,exports.PROXY_CONTROLLER_EVENT_NAMES=PROXY_CONTROLLER_EVENT_NAMES,exports.PanoCircleMesh=PanoCircleMesh,exports.PanoCircleMeshCustom=PanoCircleMeshCustom,exports.PanoCircleMeshSolid=PanoCircleMeshSolid,exports.Parameter=Parameter,exports.Scene=Scene,exports.Subscribe=require_memoryUsage.j,exports.TextureLoader=require_pick.i,exports.Tile=Tile,exports.Tile3D=Tile3D,exports.Tile3DModel=Tile3D,exports.TileCache=TileCache,exports.TileNode=TileNode,exports.TileRequestScheduler=TileRequestScheduler,exports.Tileset=Tileset,exports.Trajectory=Trajectory,exports.TrajectoryNode=TrajectoryNode,exports.Work=Work,exports.WorkResolvedObserver=WorkResolvedObserver,exports.XRButton=XRButton,exports.controllersDefaultInitArgs=controllersDefaultInitArgs,exports.coordinatesToVector=coordinatesToVector,exports.createDebugBoundingMesh=createDebugBoundingMesh,exports.createWorks=createWorks,exports.customNodesCacheKey=require_memoryUsage.E,exports.defaultImageURLTransform=require_pick.s,exports.draco=require_glTF_helpers.r,exports.getViewportScale=getViewportScale,exports.headingToLongitude=headingToLongitude,exports.imageSupport=require_imageSupport.t,exports.isBoundingVolume=isBoundingVolume,exports.isPanoId=isPanoId,exports.loadAt3d=loadAt3d,exports.loadDome=loadDome,exports.loadDomez=loadDomez,exports.loadGltf=loadGltf,exports.loadPbm=loadPbm,exports.loadPly=loadPly,exports.longitudeToHeading=longitudeToHeading,exports.makeBoundingVolume=makeBoundingVolume,exports.panoEqual=panoEqual,exports.panoParse=panoParse,exports.panoStringify=panoStringify,exports.parseWork=parseWork,exports.registerPBMMaterials=registerPBMMaterials,exports.vectorToCoordinates=vectorToCoordinates,exports.workToJson=workToJson;
|
|
820
|
+
`;function createContents(id){let viewportScale=1,metaElements=document.getElementsByTagName(`meta`);for(let i=0;i<metaElements.length;i++){let metaElement=metaElements[i];if(metaElement.getAttribute(`name`)===`viewport`){let matched=(metaElement.getAttribute(`content`)||``).match(/initial\-scale\=([\d|\.]+)/);matched&&(viewportScale=Number(matched[1])),isNaN(viewportScale)&&(viewportScale=1)}}let px=value=>Math.floor(value*viewportScale)+`px`;return CONTENTS.replace(/\n/g,` `).replace(/\ +/g,` `).replace(/\$id/g,id).replace(/(\d+)px/g,(_,value)=>px(Number(value)))}function createHelper(){let id=`five_vr_helper_`+require_memoryUsage.N(),html=createContents(id),domElement=document.createElement(`div`);return domElement.className=id,domElement.innerHTML=html,domElement}var sharedGeometry=new three_webgpu.CircleGeometry(.12,16),CENTER=(0,three_tsl.vec2)(.5,.5),SMOOTH_DIST=(0,three_tsl.float)(.017);function tslInside(vuv,innerDist){let dist=(0,three_tsl.length)(CENTER.sub(vuv));return(0,three_tsl.smoothstep)(innerDist,innerDist.add(SMOOTH_DIST),dist)}function tslOutside(vuv,outerDist){let dist=(0,three_tsl.length)(CENTER.sub(vuv));return(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SMOOTH_DIST),outerDist,dist))}function createRingMaterial(){let u={opacity:(0,three_tsl.uniform)(0),hdrBoost:(0,three_tsl.uniform)(1)},vuv=(0,three_tsl.uv)(),dist=(0,three_tsl.length)(CENTER.sub(vuv)),SD=(0,three_tsl.float)(.01),outerDist=(0,three_tsl.float)(.49),innerDist=(0,three_tsl.float)(.29),outsideVal=(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)(outerDist.sub(SD),outerDist,dist)),insideVal=(0,three_tsl.smoothstep)(innerDist,innerDist.add(SD),dist),bg=(0,three_tsl.vec4)(.576,.635,1,.3),gradient=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.abs)(dist.sub(outerDist.add(innerDist).div(2))).div(outerDist.sub(innerDist)).mul(1.5).add(.1).clamp(0,1)),mixed=(0,three_tsl.mix)(bg,gradient,gradient.w),material=new three_webgpu.NodeMaterial;return material.fragmentNode=(0,three_tsl.vec4)(mixed.xyz.mul(u.hdrBoost),mixed.w.mul(u.opacity).mul(outsideVal).mul(insideVal)),material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}function createPanoMaterial(){let u={hdrBoost:(0,three_tsl.uniform)(1),circleScale:(0,three_tsl.uniform)(1),circleFade:(0,three_tsl.uniform)(0),circleOpacity:(0,three_tsl.uniform)(.5),loadingAngle:(0,three_tsl.uniform)(0),loadingOpacity:(0,three_tsl.uniform)(0),opacity:(0,three_tsl.uniform)(0),disable:(0,three_tsl.uniform)(0)},vuv=(0,three_tsl.uv)();(0,three_tsl.length)(CENTER.sub(vuv));let circleGradient=(0,three_tsl.float)(.98).add((0,three_tsl.abs)((0,three_tsl.normalize)((0,three_tsl.vec2)(1,-1)).dot(vuv.sub(CENTER))).mul(2)).clamp(0,1),circleColor=(0,three_tsl.vec4)((0,three_tsl.mix)((0,three_tsl.vec4)(.576,.635,1,1).xyz,(0,three_tsl.vec4)(1,1,1,1).xyz,u.circleFade.mul(.5)),circleGradient.mul(u.circleOpacity).mul(tslOutside(vuv,(0,three_tsl.float)(.3).mul(u.circleScale)))),loadAngle=(0,three_tsl.mod)(three_tsl.PI.sub((0,three_tsl.atan)(CENTER.x.sub(vuv.x),CENTER.y.sub(vuv.y))).add(u.loadingAngle),three_tsl.PI2),loadColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(1).sub((0,three_tsl.smoothstep)((0,three_tsl.float)(0),three_tsl.PI2,loadAngle)).mul(.9).add(.1).mul(u.loadingOpacity).mul(tslInside(vuv,(0,three_tsl.float)(.2).mul(u.circleScale))).mul(tslOutside(vuv,(0,three_tsl.float)(.25).mul(u.circleScale)))),disableColor=(0,three_tsl.vec4)(1,1,1,(0,three_tsl.float)(.5).mul(tslOutside(vuv,(0,three_tsl.float)(.32).mul(u.circleScale)))),result=(0,three_tsl.vec4)(1,1,1,0);result=(0,three_tsl.mix)(result,circleColor,circleColor.w),result=(0,three_tsl.mix)(result,loadColor,loadColor.w),result=(0,three_tsl.mix)(result,disableColor,u.disable);let finalColor=(0,three_tsl.vec4)(result.xyz.mul(u.hdrBoost),result.w.mul(u.opacity)),material=new three_webgpu.NodeMaterial;return material.fragmentNode=finalColor,material.blending=three_webgpu.CustomBlending,material.blendSrc=three_webgpu.SrcAlphaFactor,material.blendDst=three_webgpu.OneMinusSrcAlphaFactor,material.blendSrcAlpha=three_webgpu.OneFactor,material.blendDstAlpha=three_webgpu.OneMinusSrcAlphaFactor,material.depthWrite=!1,material.transparent=!0,{material,u}}var PanoSphereMesh=class extends three_webgpu.Object3D{constructor(){super(),this.progress=0,this.opacity=0,this.loading=!1,this.current=!1,this.disabled=!1,this.currentMotion=new Motion({ringScale:1.1,ringOpacity:0,circleFade:0,circleOpacity:.85,circleScale:1}),this.opacityMotion=new Motion({opacity:0}),this.loadingMotion=new Motion({opacity:0}),this.disableMotion=new Motion({opacity:0}),this.hitTestMesh=new three_webgpu.Mesh(sharedGeometry,new three_webgpu.MeshBasicMaterial({blending:three_webgpu.CustomBlending,blendSrc:three_webgpu.SrcAlphaFactor,blendDst:three_webgpu.OneMinusSrcAlphaFactor,blendSrcAlpha:three_webgpu.OneFactor,blendDstAlpha:three_webgpu.OneMinusSrcAlphaFactor,depthWrite:!1,transparent:!0,color:0,opacity:0})),this.hitTestMesh.scale.set(1.5,1.5,1.5);let{material:ringMat,u:ringU}=createRingMaterial();this.ringMesh=new three_webgpu.Mesh(sharedGeometry,ringMat),this.ringU=ringU;let{material:panoMat,u:panoU}=createPanoMaterial();this.panoMesh=new three_webgpu.Mesh(sharedGeometry,panoMat),this.panoU=panoU,this.add(this.hitTestMesh),this.add(this.ringMesh),this.add(this.panoMesh),this.renderOrder=1e4,this.needsRender=!0}setProgress(progress){this.progress=progress,this.setLoading(progress>0)}setHDRBoost(boost){this.panoU.hdrBoost.value!==boost&&(this.panoU.hdrBoost.value=boost,this.ringU.hdrBoost.value=boost,this.needsRender=!0)}setOpacity(opacity){this.opacity!==opacity&&(this.opacity=opacity=require_memoryUsage.M(opacity,0,1),this.opacityMotion.set({opacity},30).catch(require_memoryUsage.d))}setCurrent(current){if(this.current!==current){if(current)this.currentMotion.setKeyframes([{progress:0,value:{ringScale:2,ringOpacity:0,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.05,value:{ringScale:1,ringOpacity:1,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.15,value:{ringScale:1.2,ringOpacity:1,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.25,value:{ringScale:1.1,ringOpacity:1,circleFade:0,circleOpacity:.85,circleScale:1}},{progress:.8,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.85,circleScale:1}},{progress:.9,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.65,circleScale:.8}},{progress:.92,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.65,circleScale:.8}},{progress:1,value:{ringScale:1.1,ringOpacity:1,circleFade:1,circleOpacity:.85,circleScale:1.1}}],1500).catch(require_memoryUsage.d);else{let keyframes=[{progress:0,value:Object.assign({},this.currentMotion.value)},{progress:1,value:{ringScale:1.1,ringOpacity:0,circleFade:0,circleOpacity:.85,circleScale:1}}];this.currentMotion.setKeyframes(keyframes,200).catch(require_memoryUsage.d)}this.current=current}}setLoading(loading){this.loading!==loading&&(loading?this.loadingMotion.setKeyframes([{progress:0,value:{opacity:0}},{progress:.3,value:{opacity:0}},{progress:1,value:{opacity:.8}}],500).catch(require_memoryUsage.d):this.loadingMotion.set({opacity:0},0).catch(require_memoryUsage.d),this.loading=loading,this.disabled===!0&&this.setDisabled(!1),this.needsRender=!0)}setDisabled(disabled){this.disabled!==disabled&&(this.disabled=disabled,this.loading===!0&&this.setLoading(!1),this.disableMotion.set({opacity:+!!disabled},300).catch(require_memoryUsage.d),this.needsRender=!0)}tap(){return Promise.resolve()}updateTime(time,deltaTime){this.opacityMotion.update(time),this.currentMotion.update(time),this.loadingMotion.update(time);let baseOpacity=this.opacityMotion.value.opacity;this.visible=baseOpacity!==0;let{ringScale,ringOpacity,circleFade,circleOpacity,circleScale}=this.currentMotion.value;this.ringMesh.scale.set(ringScale,1,ringScale),this.ringU.opacity.value=ringOpacity*baseOpacity,this.panoU.opacity.value=baseOpacity,this.panoU.circleOpacity.value=circleOpacity,this.panoU.circleScale.value=circleScale,this.panoU.circleFade.value=circleFade,this.panoU.loadingOpacity.value=this.loadingMotion.value.opacity,this.panoU.disable.value=this.disableMotion.value.opacity,this.panoU.loadingAngle.value=time/120%(Math.PI*2),this.needsRender=!0}dispose(){this.hitTestMesh.material.dispose(),this.ringMesh.material.dispose(),this.panoMesh.material.dispose()}},ACTIVE_TO_CURRENT_DELAY$1=1500,defaultVRPanoramaControllerCustomInitArgs=Object.assign({},require_pick.t(defaultPanoramaControllerCustomInitArgs,[`maxLatitude`,`minLatitude`])),VRPanoramaController=class VRPanoramaController extends PanoramaController{static parseArgs(args){if(args instanceof VRPanoramaController)return args;let args_=Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2});return super.parseArgs(args_)}static initAnimationEndState(args){let args_=this.parseArgs(args),state=super.initAnimationEndState(args_);return Object.assign(Object.assign({},state),{mode:`VRPanorama`})}constructor(args){let args_=VRPanoramaController.parseArgs(args);super(args_),this.mode=`VRPanorama`,this.cardboard=new Cardboard(this.renderer);let helperElement=createHelper();this.helperElement=helperElement;let mc=new Hammer(helperElement);this.element.parentNode&&(this.element.parentNode.insertBefore(helperElement,this.element),this.updateHelperElementSize(),mc.on(`tap`,()=>this.emit(`vr.requestExit`,createEvent(`vr.requestExit`,{})))),this.destroyHelper=()=>{mc.destroy(),helperElement.parentNode&&helperElement.parentNode.removeChild(helperElement),this.helperElement=void 0}}updateConfiguration(args){return super.updateConfiguration(Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2}))}destroy(){super.destroy(),this.cardboard.dispose(),this.destroyHelper()}isReady(){return!1}updateRenderSize(){this.needsRender=!0}updateCamera(pose,duration,userAction){return Promise.resolve()}updateCameraWithKeyframes(keyframes,duration,userAction){return Promise.resolve()}updateTime(time,deltaTime,...args){var _a,_b,_c,_d,_e,_f;if(this.destroyed)return;this.updateHelperElementSize(),this.userAction=!0,this.needsRender=!0;let uniforms={},cameraPose={},startKeyframe=this.locationMotion.keyframes[0],endKeyframe=this.locationMotion.keyframes[this.locationMotion.keyframes.length-1],[prevKeyframe,nextKeyframe]=this.locationMotion.getKeyFrameSegment(time),prevResource=this.panoResourceFromLocationMotionKeyframe(prevKeyframe),nextResource=this.panoResourceFromLocationMotionKeyframe(nextKeyframe),startResource=this.panoResourceFromLocationMotionKeyframe(startKeyframe),endResource=this.panoResourceFromLocationMotionKeyframe(endKeyframe),fixedTransition=!1;if(this.modelAlphaMotion.ended===!1&&(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.perspToOrthoMotion.ended===!1&&(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),this.locationMotion.ended===!1){this.locationMotion.update(time);let progress=this.locationMotion.value.count-nextKeyframe.value.count+1,prevPosition=new three_webgpu.Vector3().copy(prevResource.position),nextPosition=new three_webgpu.Vector3().copy(nextResource.position);if(uniforms.progress=progress,progress>=.01&&progress<=.99&&(uniforms.progress=require_memoryUsage.M(nextResource.effectEasing(progress),.01,.99)),nextResource.panoPicture&&(progress<1?prevResource.panoPicture&&(uniforms.pano0=prevResource.panoPicture):uniforms.pano0=nextResource.panoPicture,uniforms.pano1=nextResource.panoPicture),nextResource.effect===`montage`?uniforms.transition=`BLACK`:nextResource.effect===`spread`?uniforms.transition=`SPREAD`:uniforms.transition=`FADE`,nextResource.effect===`zoomin`||nextResource.effect===`zoomout`?uniforms.progress=Math.pow(progress,3):nextResource.effect===`model`&&this.camera.pose.distance<.01&&(uniforms.modelAlpha=1-Math.pow(require_memoryUsage.M(Math.abs(progress-.5)*2,0,1),4)),progress<1&&nextResource.effect!==`fly`){if(uniforms.pano0&&prevResource.panoPicture){let panoPicture={panoId:uniforms.pano0.panoId,map:uniforms.pano0.map,mapHistogram:uniforms.pano0.mapHistogram,mapSize:uniforms.pano0.mapSize,zoom:uniforms.pano0.zoom,matrix:prevResource.panoPicture.matrix.clone().setPosition(nextResource.position),gainmap:uniforms.pano0.gainmap?{map:uniforms.pano0.gainmap.map,cfg:Object.assign({},uniforms.pano0.gainmap.cfg)}:void 0},observer=this.panoPictureObserverMap.get(uniforms.pano0);observer&&this.panoPictureObserverMap.set(panoPicture,observer),uniforms.pano0=panoPicture}prevPosition.copy(nextPosition),fixedTransition=!0}cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(prevPosition.x+(nextPosition.x-prevPosition.x)*progress,prevPosition.y+(nextPosition.y-prevPosition.y)*progress,prevPosition.z+(nextPosition.z-prevPosition.z)*progress);let keyframeKeys=[],restKeyframeKeys=[];for(let keyframe of this.locationMotion.keyframes){let{key,progress}=keyframe;key!==void 0&&(keyframeKeys.push(key),progress>this.locationMotion.progress&&restKeyframeKeys.push(key))}for(let name of Object.keys(this.panoResources)){if(restKeyframeKeys.indexOf(name)>=0)continue;let panoResource=this.panoResources[name];if(panoResource.panoPicture){let texture=panoResource.panoPicture.map;if(texture){if(texture===((_a=uniforms.pano0)==null?void 0:_a.map)||texture===((_b=uniforms.pano1)==null?void 0:_b.map))continue;texture.dispose(),panoResource.panoPicture=null}}keyframeKeys.indexOf(name)>=0||delete this.panoResources[name]}this.currentPano=panoParse(nextResource.panoId),this.emit(`pano.moving`,createEvent(`pano.moving`,{userAction:this.userAction,prevPano:panoParse(startResource.panoId),state:Object.assign(Object.assign(Object.assign(Object.assign({},panoParse(endResource.panoId)),{mode:this.mode}),clonePose(this.camera.pose)),cameraPose),options:{},progress:this.locationMotion.progress,error:null}))}isEmptyObject(uniforms)===!1&&this.modelScene.parameter.set(uniforms),cameraPose.offset&&this.camera.position.copy(cameraPose.offset);let prevLongitude=this.camera.pose.longitude,prevLatitude=this.camera.pose.latitude;this.camera.quaternion.fromArray(this.cardboard.sensor.getOrientation()),this.camera.computePose(),(prevLongitude!==this.camera.pose.longitude||prevLatitude!==this.camera.pose.latitude)&&(this.cameraMotion.set(require_pick.r(this.camera.pose,[`longitude`,`latitude`]),0).catch(require_memoryUsage.d),this.emit(`camera.update`,createEvent(`camera.update`,{userAction:!0,state:Object.assign(Object.assign(Object.assign({},this.currentPano),{mode:this.mode}),clonePose(this.camera.pose))}))),this.works.getObserver(this.currentPano);let prevObserver=this.works.getObserver(prevResource.panoId),nextObserver=this.works.getObserver(nextResource.panoId),visibleObserverMap=new Map;if(prevObserver)for(let panoIndex of prevObserver.accessibleNodes){let observer=prevObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(nextObserver)for(let panoIndex of nextObserver.accessibleNodes){let observer=nextObserver.work.observers[panoIndex];if(observer){let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode});visibleObserverMap.set(panoId,observer)}}if(this.panoMeshes.forEach((panoMesh,panoId)=>{let observer=visibleObserverMap.get(panoId);observer?(panoMesh.position.copy(observer.position).applyMatrix4(observer.work.transform),visibleObserverMap.delete(panoId)):(this.helper.remove(panoMesh),panoMesh.dispose(),this.panoMeshes.delete(panoId))}),visibleObserverMap.forEach((observer,panoId)=>{let panoMesh=new PanoSphereMesh;panoMesh.position.copy(observer.position).applyMatrix4(observer.work.transform),observer.position.distanceTo(observer.standingPosition)>this.aerialObserverMinHeight?panoMesh.scale.setScalar(15):panoMesh.scale.setScalar(1),this.panoMeshes.set(panoId,panoMesh),this.helper.add(panoMesh),visibleObserverMap.delete(panoId)}),this.syncPanoMeshHDRBoost(),this.camera.pose.distance>.1||fixedTransition?this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh.setOpacity(0),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime),panoMesh.visible=!1}):this.panoMeshes.forEach((panoMesh,panoId)=>{let pano=panoParse(panoId),observer=this.works.getObserver(pano);if(!observer)return;if(!observer.loadable&&!observer.active){panoMesh.setOpacity(0);return}let distance=panoMesh.position.clone().setY(this.camera.position.y).distanceTo(this.camera.position);distance<.05?panoMesh.setOpacity(0):panoMesh.setOpacity(require_memoryUsage.M(1.5/distance,0,1)),panoEqual(this.currentPano,pano)&&panoMesh.setOpacity(0),panoMesh.lookAt(this.camera.position)}),this.locationMotion.ended){let intersectPanoMesh=this.intersect(time);this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh.setCurrent(panoMesh===intersectPanoMesh),panoMesh.updateTime&&panoMesh.updateTime(time,deltaTime)})}{let progress=(_c=this.modelScene.parameter.progress)==null?1:_c,panoNumber=Math.round(progress),pano0=this.modelScene.parameter.pano0,pano1=this.modelScene.parameter.pano1,pano=panoNumber===0?pano0:pano1,observer;if(pano&&(observer=this.works.getObserver(pano.panoId),observer||(observer=this.panoPictureObserverMap.get(pano))),this.tiling.appearDuration=this.tileAppearDuration,this.tiling.maxRequest=progress<(require_imageBitmap.t()?.6:.99)?0:this.tileMaxRequest,this.tiling.imageOptions=this.imageOptions,!observer||!pano||this.tileLevelForFov===!1||this.camera.perspToOrtho.x>0){this.tiling.setObserver(null);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:null,panoGainmap:void 0,panoMatrix:new three_webgpu.Matrix4,panoZoom:1,minLevel:0,level:0};this.tiling.update(tilingFrameState),this.modelScene.parameter.set(`refinedScreen`,null)}else{let panoLevel=require_pick.o(pano.mapSize),minLevel=panoLevel+1,viewSize=new three_webgpu.Vector2().copy(this.camera.resolution).multiplyScalar(this.camera.pixelRatio),computedLevel=Math.floor(this.tileLevelForFov(this.camera.fov,viewSize)),level=computedLevel>panoLevel?computedLevel:0;this.tiling.setObserver(observer);let tilingFrameState={renderer:this.renderer,resolution:this.camera.resolution,pixelRatio:this.camera.pixelRatio,time:this.camera.time,cameraMatrix:this.camera.matrixWorld,cameraProjectionMatrix:this.camera.projectionMatrix,panoMap:pano.map,panoGainmap:pano.gainmap,panoMatrix:pano.matrix,panoZoom:pano.zoom,minLevel,level,useHDR:this.modelScene.parameter.resolveValue(`useHDR`),maxDisplayBoost:this.modelScene.parameter.resolveValue(`maxDisplayBoost`)},tilingUpdated=this.tiling.update(tilingFrameState),refinedScreen={map:this.tiling.renderTarget.texture,matrixInverse:this.tiling.camera.matrixWorldInverse,projectionMatrix:this.tiling.camera.projectionMatrix,pano:panoNumber,opacity:(pano0==null?void 0:pano0.panoId)===(pano1==null?void 0:pano1.panoId)?1:easeInQuart(Math.abs(((_d=this.modelScene.parameter.progress)==null?0:_d)-.5)*2)},prevRefinedScreen=this.modelScene.parameter.refinedScreen;(tilingUpdated||refinedScreen.pano!==(prevRefinedScreen==null?void 0:prevRefinedScreen.pano)||refinedScreen.opacity!==(prevRefinedScreen==null?void 0:prevRefinedScreen.opacity))&&this.modelScene.parameter.set(`refinedScreen`,refinedScreen)}}this.panoVideo.object.position.copy(this.camera.position),this.panoVideo.updateTime(time);{let effect=nextResource.effect,{pano0,pano1}=this.modelScene.parameter;if(pano0&&pano1&&pano0!==pano1&&(effect===`fly`||effect===`model`)&&this.flyEffectUseDepthBuffer){if(((_e=this.modelScene.parameter.pano0Depth)==null?void 0:_e.panoId)!==pano0.panoId||((_f=this.modelScene.parameter.pano1Depth)==null?void 0:_f.panoId)!==pano1.panoId){this.pano0DepthCubeRenderTarget?this.pano0DepthCubeRenderTarget.width!==512&&this.pano0DepthCubeRenderTarget.setSize(512,512):this.pano0DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1}),this.pano1DepthCubeRenderTarget?this.pano1DepthCubeRenderTarget.width!==512&&this.pano1DepthCubeRenderTarget.setSize(512,512):this.pano1DepthCubeRenderTarget=new three_webgpu.CubeRenderTarget(512,{minFilter:three_webgpu.NearestFilter,magFilter:three_webgpu.NearestFilter,generateMipmaps:!1});let pano0Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano0DepthCubeRenderTarget);pano0Camera.matrix.copy(pano0.matrix),pano0Camera.matrixWorld.copy(pano0Camera.matrix),pano0Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano0Camera,500);let pano1Camera=new three_webgpu.CubeCamera(this.camera.near,this.camera.far,this.pano1DepthCubeRenderTarget);pano1Camera.matrix.copy(pano1.matrix),pano1Camera.matrixWorld.copy(pano1Camera.matrix),pano1Camera.matrixAutoUpdate=!1,renderDepthCube(this.renderer,this.modelScene,pano1Camera,500),this.modelScene.parameter.set({pano0Depth:{panoId:pano0.panoId,map:this.pano0DepthCubeRenderTarget.texture,mapSize:this.pano0DepthCubeRenderTarget.width,maxDepth:500},pano1Depth:{panoId:pano1.panoId,map:this.pano1DepthCubeRenderTarget.texture,mapSize:this.pano1DepthCubeRenderTarget.width,maxDepth:500}})}}else this.modelScene.parameter.set({pano0Depth:null,pano1Depth:null}),this.flyEffectUseDepthBuffer||(this.pano0DepthCubeRenderTarget&&(this.pano0DepthCubeRenderTarget.dispose(),this.pano0DepthCubeRenderTarget=void 0),this.pano1DepthCubeRenderTarget&&(this.pano1DepthCubeRenderTarget.dispose(),this.pano1DepthCubeRenderTarget=void 0))}}render(){return this.renderer.setRenderTarget(null),this.renderer.setScissorTest(!1),this.cardboard.render(this.scene,this.camera),!0}setCamera(cameraPose={}){}destroyHelper(){}updateHelperElementSize(){if(!this.helperElement)return;let size=new three_webgpu.Vector2(this.element.offsetWidth,this.element.offsetHeight),left=size.x*this.viewport.left,top=size.y*(1-this.viewport.bottom-this.viewport.height),width=size.x*this.viewport.width,height=size.y*this.viewport.height;this.helperElement.style.marginLeft!==left+`px`&&(this.helperElement.style.marginLeft=left+`px`),this.helperElement.style.marginTop!==top+`px`&&(this.helperElement.style.marginTop=top+`px`),this.helperElement.style.width!==width+`px`&&(this.helperElement.style.width=width+`px`),this.helperElement.style.height!==height+`px`&&(this.helperElement.style.height=height+`px`)}intersect(time){var _a,_b;if(this.locationMotion.ended===!1){this.intersectMesh.visible=!1,this.activePanoMesh=void 0,this.activeTime=void 0;return}if(this.activePanoMesh&&this.activeTime&&time-this.activeTime>ACTIVE_TO_CURRENT_DELAY$1){let activePanoMesh=this.activePanoMesh,activePanoId=null;return this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh===activePanoMesh&&(activePanoId=panoId)}),activePanoId!==null&&this.moveToPano(panoParse(activePanoId),{},!0),this.activePanoMesh=void 0,this.activeTime=void 0,activePanoMesh}let cameraDirection=this.camera.getDirection(new three_webgpu.Vector3),raycaster=new three_webgpu.Raycaster(this.camera.position,cameraDirection);raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.floorIndex=-1;let intersection,intersectionPanos=[],currentObserver=this.works.getObserver(this.currentPano),accessibleNodes=currentObserver?currentObserver.accessibleNodes.map(panoIndex=>panoStringify({panoIndex,workCode:currentObserver.work.workCode})):[];for(let panoId of accessibleNodes){let panoMesh=this.panoMeshes.get(panoId);if(panoMesh){let[intersection]=raycaster.intersectObject((_a=panoMesh.hitTestMesh)==null?panoMesh:_a,!0);if(intersection){let floorIndex=(_b=currentObserver==null?void 0:currentObserver.floorIndex)==null?0:_b;intersectionPanos.push({panoMesh,intersection:Object.assign({floorIndex,floor:floorIndex},intersection)})}}}let[intersectionPanoMesh]=intersectionPanos.sort((a,b)=>a.intersection.distance-b.intersection.distance);intersectionPanoMesh?(intersection=intersectionPanoMesh.intersection,this.activePanoMesh!==intersectionPanoMesh.panoMesh&&(this.activePanoMesh=intersectionPanoMesh.panoMesh,this.activeTime=time),this.intersectMesh.position.copy(intersectionPanoMesh.panoMesh.position),this.intersectMesh.lookAt(this.camera.position)):(this.activePanoMesh=void 0,this.activeTime=void 0),intersection||(intersection=this.modelScene.intersectRaycaster(raycaster)[0]);let intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection&&intersection.face){let face=intersection.face.normal,quaternion=new three_webgpu.Quaternion;quaternion.setFromUnitVectors(new three_webgpu.Vector3(0,0,1),face),this.intersectMesh.quaternion.copy(quaternion);let position=intersection.point.clone();this.intersectMesh.position.copy(position),intersectionPanoMesh?this.intersectMesh.visible=!1:this.intersectMesh.visible=!0}else this.intersectMesh.visible=!1;return intersectionPanoMesh==null?void 0:intersectionPanoMesh.panoMesh}onPanGesture(){}onTapGesture(){}onPinchGesture(){}onMouseMove(){}onMouseOut(){}},FLOOR_EPSILON=.01,VERIFIED_REVISION=`183`,XR_TARGET_FLAGS={isXRRenderTarget:!0,_hasExternalTextures:!1,_autoAllocateDepthBuffer:!0,_isOpaqueFramebuffer:!0};function createXRRenderTarget(renderer,width,height,resolveDepthStencil){let target=new three_webgpu.RenderTarget(width,height,{format:three_webgpu.RGBAFormat,type:three_webgpu.UnsignedByteType,colorSpace:renderer.outputColorSpace,stencilBuffer:renderer.stencil===!0,resolveDepthBuffer:resolveDepthStencil,resolveStencilBuffer:resolveDepthStencil});return Object.assign(target,XR_TARGET_FLAGS),target}var RenderTargetBridge=class{constructor(renderer,opts={}){var _a;this.resources=null,this.warnedRevision=!1,this._outputBufferType=null,this.clearColorScratch=new three_webgpu.Color,this.viewportScratch=new three_webgpu.Vector4,this.renderer=renderer,this.atlasSamples=(_a=opts.atlasSamples)==null?0:_a}get outputBufferType(){return this._outputBufferType}verify(){let renderer=this.renderer,problems=[],backend=renderer.backend;backend?(backend.isWebGLBackend!==!0&&problems.push(`backend.isWebGLBackend`),typeof backend.setXRTarget!=`function`&&problems.push(`backend.setXRTarget`)):problems.push(`renderer.backend`),typeof renderer.setOutputRenderTarget!=`function`&&problems.push(`renderer.setOutputRenderTarget`),typeof renderer.getOutputRenderTarget!=`function`&&problems.push(`renderer.getOutputRenderTarget`);let probe=createXRRenderTarget(this.renderer,1,1,!0);try{let record=probe;for(let[name,expected]of Object.entries(XR_TARGET_FLAGS))record[name]!==expected&&problems.push(`xrRT.${name}(期望 ${String(expected)},实际 ${String(record[name])})`);for(let name of[`multiview`,`resolveDepthBuffer`])record[name]===void 0&&problems.push(`xrRT.${name}`)}finally{probe.dispose()}if(problems.length>0)throw Error(`[RenderTargetBridge] three 内部 API 校验失败(THREE.REVISION=${three_webgpu.REVISION}),缺失或不符:${problems.join(`、`)}`);three_webgpu.REVISION!==VERIFIED_REVISION&&!this.warnedRevision&&(this.warnedRevision=!0,console.warn(`[RenderTargetBridge] THREE.REVISION=${three_webgpu.REVISION},XR 标志位语义仅在 r${VERIFIED_REVISION} 复核过,继续运行`))}verifyCameras(cameras){let expected=this.renderer.coordinateSystem,mismatched=cameras.map((camera,index)=>camera.coordinateSystem===expected?null:index).filter(index=>index!==null);if(mismatched.length>0)throw Error(`[RenderTargetBridge] Eye_Camera[${mismatched.join(`,`)}] 的 coordinateSystem 与 renderer(${expected})不一致,three 会改写其投影矩阵(THREE.REVISION=${three_webgpu.REVISION})`)}init(layer){var _a,_b,_c;this.build(layer),this._outputBufferType=(_c=(_b=(_a=this.renderer).getOutputBufferType)==null?void 0:_b.call(_a))==null?null:_c}renderFrame(layer,scene,eyes){let renderer=this.renderer,internal=renderer,backend=internal.backend,saved={autoClear:renderer.autoClear,autoClearColor:renderer.autoClearColor,autoClearDepth:renderer.autoClearDepth,autoClearStencil:renderer.autoClearStencil,viewport:renderer.getViewport(this.viewportScratch).clone(),scissorTest:renderer.getScissorTest(),clearAlpha:renderer.getClearAlpha(),output:internal.getOutputRenderTarget(),rt:renderer.getRenderTarget(),clearColor:internal.getClearColor(this.clearColorScratch).clone()};try{let{atlas,xrRT,quad,width,height}=this.syncResources(layer);renderer.setScissorTest(!1),renderer.setRenderTarget(atlas);let background=scene.background;renderer.setClearColor(background instanceof three_webgpu.Color?background:saved.clearColor,1),renderer.clear(!0,!0,!1),renderer.autoClear=!1,renderer.autoClearColor=!1,renderer.autoClearDepth=!1,renderer.autoClearStencil=!1;for(let eye of eyes){let v=eye.viewport;atlas.viewport.set(v.x,height-v.height-v.y,v.width,v.height),renderer.render(scene,eye.camera)}renderer.setScissorTest(!1),backend.setXRTarget(layer.framebuffer),renderer.setRenderTarget(null),internal.setOutputRenderTarget(xrRT);let pixelRatio=renderer.getPixelRatio();renderer.setViewport(0,0,(width+FLOOR_EPSILON)/pixelRatio,(height+FLOOR_EPSILON)/pixelRatio),quad.render(renderer)}finally{internal.setOutputRenderTarget(saved.output),backend.setXRTarget(null),renderer.setRenderTarget(saved.rt),renderer.autoClear=saved.autoClear,renderer.autoClearColor=saved.autoClearColor,renderer.autoClearDepth=saved.autoClearDepth,renderer.autoClearStencil=saved.autoClearStencil,renderer.setScissorTest(saved.scissorTest),renderer.setViewport(saved.viewport),renderer.setClearColor(saved.clearColor,saved.clearAlpha)}}dispose(){var _a,_b,_c;if(!this.resources)return;this.releaseResources();let internal=this.renderer;(_b=(_a=internal.backend)==null?void 0:_a.setXRTarget)==null||_b.call(_a,null),(_c=internal.setOutputRenderTarget)==null||_c.call(internal,null),this._outputBufferType=null}syncResources(layer){let current=this.resources;return current&¤t.layer===layer&¤t.width===layer.framebufferWidth&¤t.height===layer.framebufferHeight?current:this.build(layer)}build(layer){this.releaseResources();let width=layer.framebufferWidth,height=layer.framebufferHeight,atlas=new three_webgpu.RenderTarget(width,height,{format:three_webgpu.RGBAFormat,type:this.supportsHalfFloat()?three_webgpu.HalfFloatType:three_webgpu.UnsignedByteType,colorSpace:three_webgpu.LinearSRGBColorSpace,depthBuffer:!0,stencilBuffer:!1,samples:this.atlasSamples,generateMipmaps:!1,minFilter:three_webgpu.LinearFilter,magFilter:three_webgpu.LinearFilter}),xrRT=createXRRenderTarget(this.renderer,width,height,layer.ignoreDepthValues===!1),material=new three_webgpu.NodeMaterial;material.fragmentNode=(0,three_tsl.vec4)((0,three_tsl.texture)(atlas.texture).rgb,1),material.depthTest=!1,material.depthWrite=!1;let quad=new three_webgpu.QuadMesh(material);return this.resources={layer,width,height,atlas,xrRT,quad},this.resources}releaseResources(){let res=this.resources;res&&(this.resources=null,res.atlas.dispose(),res.xrRT.dispose(),res.quad.material.dispose())}supportsHalfFloat(){var _a;let gl=(_a=this.renderer.backend)==null?void 0:_a.gl;return gl?!!gl.getExtension(`EXT_color_buffer_float`)||!!gl.getExtension(`EXT_color_buffer_half_float`):!1}},InputSourceTracker=class{constructor(){this.root=new three_webgpu.Group,this._entries=new Map,this._dir=new three_webgpu.Vector3}add(sources){for(let source of sources){if(this._entries.has(source))continue;let targetRay=new three_webgpu.Object3D,grip=new three_webgpu.Object3D;targetRay.visible=!1,grip.visible=!1,this.root.add(targetRay,grip),this._entries.set(source,{source,targetRay,grip,rayFrame:-1})}}remove(sources){let removed=[];for(let source of sources){let entry=this._entries.get(source);entry&&(this._entries.delete(source),this.root.remove(entry.targetRay,entry.grip),removed.push(entry))}return removed}update(frame,ref,offset,frameNo){for(let entry of this._entries.values()){let{source,targetRay,grip}=entry,rayPose=frame.getPose(source.targetRaySpace,ref),gripPose=source.gripSpace?frame.getPose(source.gripSpace,ref):null;rayPose?(this._applyPose(targetRay,rayPose,offset),entry.rayFrame=frameNo):targetRay.visible=!1,rayPose&&gripPose?this._applyPose(grip,gripPose,offset):grip.visible=!1}}hideAll(){for(let{targetRay,grip}of this._entries.values())targetRay.visible=!1,grip.visible=!1}fill(source,raycaster,frameNo){let entry=this._entries.get(source);if(!entry||entry.rayFrame!==frameNo||!entry.targetRay.visible)return!1;let{matrixWorld}=entry.targetRay;return raycaster.ray.origin.setFromMatrixPosition(matrixWorld),raycaster.ray.direction.copy(this._dir.set(0,0,-1).transformDirection(matrixWorld)),!0}clear(){for(let{targetRay,grip}of this._entries.values())this.root.remove(targetRay,grip);this._entries.clear()}entries(){return this._entries}_applyPose(node,pose,offset){let{position:p,orientation:o}=pose.transform;node.position.set(offset.x+p.x,offset.y+p.y,offset.z+p.z),node.quaternion.set(o.x,o.y,o.z,o.w),node.visible=!0,node.updateMatrixWorld(!0)}},DEFAULT_REFERENCE_SPACE_TIMEOUT_MS=5e3;function buildChain(preferred){let deduped=[...new Set([preferred,`local`,`viewer`])];return deduped.slice(0,deduped.indexOf(`viewer`)+1)}function createAbortedError(){let error=Error(`会话在参考空间解析前已结束`);return error.aborted=!0,error}function formatFailures(failures){return failures.map(item=>`${item.type}(${item.reason})`).join(`, `)}function resolveReferenceSpace(session_1,preferred_1){return(0,tslib.__awaiter)(this,arguments,void 0,function*(session,preferred,opts={}){var _a,_b,_c;let timeoutMs=(_a=opts.timeoutMs)==null?DEFAULT_REFERENCE_SPACE_TIMEOUT_MS:_a,isAborted=opts.isAborted,schedule=(_b=opts.schedule)==null?((callback,ms)=>setTimeout(callback,ms)):_b,clear=(_c=opts.clear)==null?(handle=>clearTimeout(handle)):_c,chain=buildChain(preferred),failures=[];for(let type of chain){let result=yield attempt(session,type,timeoutMs,schedule,clear);if(isAborted!=null&&isAborted())throw createAbortedError();if(result.ok)return type!==preferred&&console.warn(`[XR] 参考空间降级:期望 ${preferred},实际采用 ${type};失败:${formatFailures(failures)}`),{space:result.space,type,failures};failures.push({type,reason:result.reason})}let error=Error(`所有参考空间均不可用(期望 ${preferred}):${formatFailures(failures)}`);throw error.attempts=failures,error})}function attempt(session,type,timeoutMs,schedule,clear){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let handle,settled=!1,request=new Promise(resolve=>{let onSuccess=space=>{settled||resolve({ok:!0,space})},onFailure=()=>{settled||resolve({ok:!1,reason:`rejected`})};try{session.requestReferenceSpace(type).then(onSuccess,onFailure)}catch(_a){onFailure()}}),timeout=new Promise(resolve=>{handle=schedule(()=>resolve({ok:!1,reason:`timeout`}),timeoutMs)});try{return yield Promise.race([request,timeout])}finally{settled=!0,clear(handle)}})}var DEFAULT_FIRST_FRAME_TIMEOUT_MS=5e3,ENDED_DURING_ENTER_MESSAGE=`会话在进入过程中已结束`,XRManager=class{static isBackendXRCapable(renderer){let backend=renderer.backend;return(backend==null?void 0:backend.isWebGPUBackend)!==!0}static isBrowserXRCapable(){return typeof navigator<`u`&&`xr`in navigator}get isPresenting(){return this._isPresenting}get session(){return this._session}get frame(){return this._frame}get referenceSpaceType(){return this._referenceSpaceType}constructor(renderer,options,callbacks){var _a;this.inputs=new InputSourceTracker,this._isPresenting=!1,this._session=null,this._frame=null,this._referenceSpaceType=null,this.refSpace=null,this.layer=null,this.entering=!1,this.entered=!1,this.endedDuringEnter=!1,this.snapshot=null,this.listeners=[],this.firstFrameArrived=!1,this.firstFrameWaiter=null,this.frameNo=0,this.submittedNear=NaN,this.submittedFar=NaN,this.offset=new three_webgpu.Vector3,this.info={time:0,hasPose:!1,headOrientation:new three_webgpu.Quaternion,headLocal:new three_webgpu.Vector3,views:[]},this.viewPool=[{eye:0,viewport:new three_webgpu.Vector4},{eye:1,viewport:new three_webgpu.Vector4}],this.frameViews=[],this.bridgeEyes=[],this.tmpViewport=new three_webgpu.Vector4,this.tmpSize=new three_webgpu.Vector2,this.onSessionEndEvent=()=>{var _a;if(this._session){if(!this.entered){this.endedDuringEnter=!0,(_a=this.firstFrameWaiter)==null||_a.reject(Error(ENDED_DURING_ENTER_MESSAGE));return}this.teardown()}},this.onInputSourcesChangeEvent=event=>{var _a,_b;if(!this._session)return;let{added,removed}=event;this.inputs.add(added),this.inputs.remove(removed),(_b=(_a=this.callbacks).onInputSourcesChange)==null||_b.call(_a,added,removed)},this.onSelectEvent=event=>{var _a,_b;(_b=(_a=this.callbacks).onSelect)==null||_b.call(_a,event.inputSource)},this.onReferenceSpaceReset=()=>{},this.renderer=renderer,this.options=options==null?{}:options,this.callbacks=callbacks,this.bridge=new RenderTargetBridge(renderer,{atlasSamples:(_a=this.options.atlasSamples)==null?0:_a}),this.device=detectDeviceType(),this.profile=resolveProfile(this.device,this.options.deviceProfile,field=>{console.warn(`[XR] Device_Profile 字段 ${field} 非法,已回落默认值`)});let createEyeCamera=()=>{let camera=new three_webgpu.PerspectiveCamera;return camera.coordinateSystem=renderer.coordinateSystem,camera};this.eyeCameras=[createEyeCamera(),createEyeCamera()],this.info.views=this.frameViews}enter(session){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){var _a,_b;if(!(this.entering||this.entered)){this.entering=!0,this.endedDuringEnter=!1,this.firstFrameArrived=!1,this._session=session;try{this.snapshot=this.captureRendererState(),this.bridge.verify(),this.bridge.verifyCameras(this.eyeCameras);let gl=(_a=this.renderer.backend)==null?void 0:_a.gl;if(!gl)throw Error(`[XRManager] 取不到 WebGL2 上下文(renderer.backend.gl),无法创建 XRWebGLLayer`);this.listen(session,`end`,this.onSessionEndEvent),this.listen(session,`inputsourceschange`,this.onInputSourcesChangeEvent),this.listen(session,`select`,this.onSelectEvent),yield gl.makeXRCompatible(),this.throwIfEnded();let attributes=gl.getContextAttributes(),layer=new XRWebGLLayer(session,gl,{alpha:!1,framebufferScaleFactor:1,antialias:attributes==null?void 0:attributes.antialias,depth:attributes==null?void 0:attributes.depth,stencil:attributes==null?void 0:attributes.stencil});this.layer=layer;let foveation=this.options.foveation;foveation!==void 0&&`fixedFoveation`in layer&&(layer.fixedFoveation=require_memoryUsage.M(foveation,0,1)),session.updateRenderState({baseLayer:layer}),this.submittedNear=session.renderState.depthNear,this.submittedFar=session.renderState.depthFar,this.bridge.init(layer);let resolved=yield resolveReferenceSpace(session,(_b=this.options.referenceSpaceType)==null?`local-floor`:_b,{isAborted:()=>this.endedDuringEnter});this.throwIfEnded(),this.refSpace=resolved.space,this._referenceSpaceType=resolved.type,this.listen(resolved.space,`reset`,this.onReferenceSpaceReset),require_imageBitmap.s.shared.setContext(session),yield this.waitFirstFrame(),this.throwIfEnded(),this.syncExistingInputSources(session),this.entering=!1,this.entered=!0,this._isPresenting=!0;try{this.callbacks.onSessionStart(session,this.device)}catch(error){console.error(`[XR] onSessionStart 回调抛错`,error)}}catch(error){throw this.rollback(),this.endedDuringEnter?Error(ENDED_DURING_ENTER_MESSAGE):error}}})}exit(){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let session=this._session;if(!(!this.entered||!session))try{yield session.end()}catch(_a){this._session===session&&this.teardown()}})}dispose(){var _a;let session=this._session;if(this.entering){this.endedDuringEnter=!0,(_a=this.firstFrameWaiter)==null||_a.reject(Error(ENDED_DURING_ENTER_MESSAGE)),session&&this.endQuietly(session);return}this.entered&&session&&(this.teardown(),this.endQuietly(session))}beginFrame(frame,time,station,near,far){let info=this.info;info.time=time;let session=this._session,refSpace=this.refSpace,layer=this.layer;if(!session||!refSpace||!layer)return this.markNoPose(),info;this._frame=frame,this.frameNo++,this.notifyFirstFrame();let pose=frame.getViewerPose(refSpace),views=pose==null?void 0:pose.views,viewCount=views?views.length:0;if(!pose||!views||viewCount!==1&&viewCount!==2||!this.collectViews(layer,views))return this.markNoPose(),this.inputs.hideAll(),info;let sx=0,sy=0,sz=0;for(let i=0;i<viewCount;i++){let p=views[i].transform.position;sx+=p.x,sy+=p.y,sz+=p.z}info.headLocal.set(sx/viewCount,sy/viewCount,sz/viewCount);let q=pose.transform.orientation;info.headOrientation.set(q.x,q.y,q.z,q.w),info.hasPose=!0,this.offset.copy(station).sub(info.headLocal);for(let i=0;i<viewCount;i++){let view=views[i],camera=this.eyeCameras[this.frameViews[i].eye];camera.projectionMatrix.fromArray(view.projectionMatrix),camera.projectionMatrixInverse.copy(camera.projectionMatrix).invert();let o=view.transform.orientation;camera.position.copy(station),camera.quaternion.set(o.x,o.y,o.z,o.w),camera.near=near,camera.far=far,camera.updateMatrixWorld(!0)}return this.syncDepthRange(session,near,far),this.inputs.update(frame,refSpace,this.offset,this.frameNo),info}renderEyes(scene){var _a;let layer=this.layer;if(!layer||!this._session||!this.info.hasPose)return!1;let eyes=this.bridgeEyes,views=this.frameViews;eyes.length=views.length;for(let i=0;i<views.length;i++){let entry=(_a=eyes[i])==null?eyes[i]={camera:this.eyeCameras[0],viewport:views[i].viewport}:_a;entry.camera=this.eyeCameras[views[i].eye],entry.viewport=views[i].viewport}return this.bridge.renderFrame(layer,scene,eyes),!0}fillRaycaster(source,raycaster){return this.inputs.fill(source,raycaster,this.frameNo)}markNoPose(){this.info.hasPose=!1,this.frameViews.length=0}collectViews(layer,views){let used=0;this.frameViews.length=0;for(let i=0;i<views.length;i++){let eye=+(views[i].eye===`right`);used&1<<eye&&(eye=+(eye===0)),used|=1<<eye;let viewport=layer.getViewport(views[i]);if(!viewport)return this.frameViews.length=0,!1;let entry=this.viewPool[i];entry.eye=eye,entry.viewport.set(viewport.x,viewport.y,viewport.width,viewport.height),this.frameViews.push(entry)}return!0}syncDepthRange(session,near,far){near===this.submittedNear&&far===this.submittedFar||Number.isFinite(near)&&Number.isFinite(far)&&near>0&&far>near&&(session.updateRenderState({depthNear:near,depthFar:far}),this.submittedNear=near,this.submittedFar=far)}notifyFirstFrame(){var _a;this.firstFrameArrived||(this.firstFrameArrived=!0,(_a=this.firstFrameWaiter)==null||_a.resolve())}throwIfEnded(){if(this.endedDuringEnter)throw Error(ENDED_DURING_ENTER_MESSAGE)}waitFirstFrame(){var _a;if(this.firstFrameArrived)return Promise.resolve();let timeoutMs=(_a=this.options.firstFrameTimeoutMs)==null?DEFAULT_FIRST_FRAME_TIMEOUT_MS:_a;return new Promise((resolve,reject)=>{let timer=setTimeout(()=>{this.firstFrameWaiter=null,reject(Error(`等待首帧超时(${timeoutMs}ms 内未收到首个 XRFrame)`))},timeoutMs);this.firstFrameWaiter={resolve:()=>{clearTimeout(timer),this.firstFrameWaiter=null,resolve()},reject:error=>{clearTimeout(timer),this.firstFrameWaiter=null,reject(error)}}})}syncExistingInputSources(session){var _a,_b,_c;let tracked=this.inputs.entries(),added=Array.from((_a=session.inputSources)==null?[]:_a).filter(source=>!tracked.has(source));added.length!==0&&(this.inputs.add(added),(_c=(_b=this.callbacks).onInputSourcesChange)==null||_c.call(_b,added,[]))}listen(target,type,handler){target.addEventListener(type,handler),this.listeners.push({target,type,handler})}removeListeners(){for(let{target,type,handler}of this.listeners)target.removeEventListener(type,handler);this.listeners.length=0}captureRendererState(){let renderer=this.renderer;return{viewport:renderer.getViewport(new three_webgpu.Vector4).clone(),autoClear:renderer.autoClear,autoClearColor:renderer.autoClearColor,autoClearDepth:renderer.autoClearDepth,autoClearStencil:renderer.autoClearStencil,pixelRatio:renderer.getPixelRatio(),size:renderer.getSize(new three_webgpu.Vector2).clone()}}restoreRendererState(){let saved=this.snapshot;if(!saved)return;this.snapshot=null;let renderer=this.renderer;renderer.autoClear=saved.autoClear,renderer.autoClearColor=saved.autoClearColor,renderer.autoClearDepth=saved.autoClearDepth,renderer.autoClearStencil=saved.autoClearStencil,renderer.getPixelRatio()!==saved.pixelRatio&&renderer.setPixelRatio(saved.pixelRatio),renderer.getSize(this.tmpSize).equals(saved.size)||renderer.setSize(saved.size.x,saved.size.y),renderer.getViewport(this.tmpViewport).equals(saved.viewport)||renderer.setViewport(saved.viewport)}releaseFrameSource(session){let loop=require_imageBitmap.s.shared;session&&loop.getContext()===session&&loop.setContext(null)}clearReferences(){this._session=null,this._frame=null,this.refSpace=null,this._referenceSpaceType=null,this.layer=null,this.markNoPose(),this.frameNo=0,this.firstFrameArrived=!1,this.submittedNear=NaN,this.submittedFar=NaN}rollback(){var _a;let session=this._session;(_a=this.firstFrameWaiter)==null||_a.reject(Error(ENDED_DURING_ENTER_MESSAGE)),this.removeListeners(),this.inputs.clear(),this.bridge.dispose(),this.releaseFrameSource(session),this.restoreRendererState(),this.clearReferences(),this._isPresenting=!1,this.entering=!1,this.entered=!1}teardown(){var _a,_b;let session=this._session;if(session){this._isPresenting=!1,this.entered=!1;try{(_b=(_a=this.callbacks).onSessionEnding)==null||_b.call(_a)}catch(error){console.error(`[XR] onSessionEnding 回调抛错`,error)}this.inputs.clear(),this.bridge.dispose(),this.removeListeners(),this.releaseFrameSource(session),this.restoreRendererState(),this.clearReferences(),this.callbacks.onSessionEnd(this.device)}}endQuietly(session){try{Promise.resolve(session.end()).catch(()=>{})}catch(_a){}}},MotionControllerConstants={Handedness:Object.freeze({NONE:`none`,LEFT:`left`,RIGHT:`right`}),ComponentState:Object.freeze({DEFAULT:`default`,TOUCHED:`touched`,PRESSED:`pressed`}),ComponentProperty:Object.freeze({BUTTON:`button`,X_AXIS:`xAxis`,Y_AXIS:`yAxis`,STATE:`state`}),ComponentType:Object.freeze({TRIGGER:`trigger`,SQUEEZE:`squeeze`,TOUCHPAD:`touchpad`,THUMBSTICK:`thumbstick`,BUTTON:`button`}),ButtonTouchThreshold:.05,AxisTouchThreshold:.1,VisualResponseProperty:Object.freeze({TRANSFORM:`transform`,VISIBILITY:`visibility`})};function fetchJsonFile(path){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let response=yield fetch(path);if(response.ok)return response.json();throw Error(response.statusText)})}function fetchProfilesList(basePath){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){if(!basePath)throw Error(`No basePath supplied`);return yield fetchJsonFile(`${basePath}/profilesList.json`)})}function fetchProfile(xrInputSource_1,basePath_1){return(0,tslib.__awaiter)(this,arguments,void 0,function*(xrInputSource,basePath,defaultProfile=null,getAssetPath=!0){if(!xrInputSource)throw Error(`No xrInputSource supplied`);if(!basePath)throw Error(`No basePath supplied`);let supportedProfilesList=yield fetchProfilesList(basePath),match;if(xrInputSource.profiles.some(profileId=>{let supportedProfile=supportedProfilesList[profileId];return supportedProfile&&(match={profileId,profilePath:`${basePath}/${supportedProfile.path}`,deprecated:!!supportedProfile.deprecated}),!!match}),!match){if(!defaultProfile)throw Error(`No matching profile name found`);let supportedProfile=supportedProfilesList[defaultProfile];if(!supportedProfile)throw Error(`No matching profile name found and default profile "${defaultProfile}" missing.`);match={profileId:defaultProfile,profilePath:`${basePath}/${supportedProfile.path}`,deprecated:!!supportedProfile.deprecated}}let profile=yield fetchJsonFile(match.profilePath),assetPath;if(getAssetPath){let layout;if(layout=profile.layouts[xrInputSource.handedness],!layout)throw Error(`No matching handedness, ${xrInputSource.handedness}, in profile ${match.profileId}`);layout.assetPath&&(assetPath=match.profilePath.replace(`profile.json`,layout.assetPath))}return{profile,assetPath}})}var defaultComponentValues={xAxis:0,yAxis:0,button:0,state:MotionControllerConstants.ComponentState.DEFAULT};function normalizeAxes(x=0,y=0){let xAxis=x,yAxis=y;if(Math.sqrt(x*x+y*y)>1){let theta=Math.atan2(y,x);xAxis=Math.cos(theta),yAxis=Math.sin(theta)}return{normalizedXAxis:xAxis*.5+.5,normalizedYAxis:yAxis*.5+.5}}var VisualResponse=class{constructor(visualResponseDescription){this.componentProperty=visualResponseDescription.componentProperty,this.states=visualResponseDescription.states,this.valueNodeName=visualResponseDescription.valueNodeName,this.valueNodeProperty=visualResponseDescription.valueNodeProperty,this.valueNodeProperty===MotionControllerConstants.VisualResponseProperty.TRANSFORM&&(this.minNodeName=visualResponseDescription.minNodeName,this.maxNodeName=visualResponseDescription.maxNodeName),this.value=0,this.updateFromComponent(defaultComponentValues)}updateFromComponent({xAxis,yAxis,button,state}){let{normalizedXAxis,normalizedYAxis}=normalizeAxes(xAxis,yAxis);switch(this.componentProperty){case MotionControllerConstants.ComponentProperty.X_AXIS:this.value=this.states.includes(state)?normalizedXAxis:.5;break;case MotionControllerConstants.ComponentProperty.Y_AXIS:this.value=this.states.includes(state)?normalizedYAxis:.5;break;case MotionControllerConstants.ComponentProperty.BUTTON:this.value=this.states.includes(state)?button:0;break;case MotionControllerConstants.ComponentProperty.STATE:this.valueNodeProperty===MotionControllerConstants.VisualResponseProperty.VISIBILITY?this.value=this.states.includes(state):this.value=+!!this.states.includes(state);break;default:throw Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`)}}},Component=class{constructor(componentId,componentDescription){if(!componentId||!componentDescription||!componentDescription.visualResponses||!componentDescription.gamepadIndices||Object.keys(componentDescription.gamepadIndices).length===0)throw Error(`Invalid arguments supplied`);this.id=componentId,this.type=componentDescription.type,this.rootNodeName=componentDescription.rootNodeName,this.touchPointNodeName=componentDescription.touchPointNodeName,this.visualResponses={},Object.keys(componentDescription.visualResponses).forEach(responseName=>{let visualResponse=new VisualResponse(componentDescription.visualResponses[responseName]);this.visualResponses[responseName]=visualResponse}),this.gamepadIndices=Object.assign({},componentDescription.gamepadIndices),this.values={state:MotionControllerConstants.ComponentState.DEFAULT,button:this.gamepadIndices.button===void 0?void 0:0,xAxis:this.gamepadIndices.xAxis===void 0?void 0:0,yAxis:this.gamepadIndices.yAxis===void 0?void 0:0}}get data(){return Object.assign({id:this.id},this.values)}updateFromGamepad(gamepad){if(this.values.state=MotionControllerConstants.ComponentState.DEFAULT,this.gamepadIndices.button!==void 0&&gamepad.buttons.length>this.gamepadIndices.button){let gamepadButton=gamepad.buttons[this.gamepadIndices.button];this.values.button=gamepadButton.value,this.values.button=this.values.button<0?0:this.values.button,this.values.button=this.values.button>1?1:this.values.button,gamepadButton.pressed||this.values.button===1?this.values.state=MotionControllerConstants.ComponentState.PRESSED:(gamepadButton.touched||this.values.button>MotionControllerConstants.ButtonTouchThreshold)&&(this.values.state=MotionControllerConstants.ComponentState.TOUCHED)}this.gamepadIndices.xAxis!==void 0&&gamepad.axes.length>this.gamepadIndices.xAxis&&(this.values.xAxis=gamepad.axes[this.gamepadIndices.xAxis],this.values.xAxis=this.values.xAxis<-1?-1:this.values.xAxis,this.values.xAxis=this.values.xAxis>1?1:this.values.xAxis,this.values.state===MotionControllerConstants.ComponentState.DEFAULT&&Math.abs(this.values.xAxis)>MotionControllerConstants.AxisTouchThreshold&&(this.values.state=MotionControllerConstants.ComponentState.TOUCHED)),this.gamepadIndices.yAxis!==void 0&&gamepad.axes.length>this.gamepadIndices.yAxis&&(this.values.yAxis=gamepad.axes[this.gamepadIndices.yAxis],this.values.yAxis=this.values.yAxis<-1?-1:this.values.yAxis,this.values.yAxis=this.values.yAxis>1?1:this.values.yAxis,this.values.state===MotionControllerConstants.ComponentState.DEFAULT&&Math.abs(this.values.yAxis)>MotionControllerConstants.AxisTouchThreshold&&(this.values.state=MotionControllerConstants.ComponentState.TOUCHED)),Object.values(this.visualResponses).forEach(visualResponse=>{visualResponse.updateFromComponent(this.values)})}},MotionController=class{constructor(xrInputSource,profile,assetUrl){if(!xrInputSource)throw Error(`No xrInputSource supplied`);if(!profile)throw Error(`No profile supplied`);this.xrInputSource=xrInputSource,this.assetUrl=assetUrl,this.id=profile.profileId,this.layoutDescription=profile.layouts[xrInputSource.handedness],this.components={},Object.keys(this.layoutDescription.components).forEach(componentId=>{let componentDescription=this.layoutDescription.components[componentId];this.components[componentId]=new Component(componentId,componentDescription)}),this.updateFromGamepad()}get gripSpace(){return this.xrInputSource.gripSpace}get targetRaySpace(){return this.xrInputSource.targetRaySpace}get data(){let data=[];return Object.values(this.components).forEach(component=>{data.push(component.data)}),data}updateFromGamepad(){Object.values(this.components).forEach(component=>{component.updateFromGamepad(this.xrInputSource.gamepad)})}},DEFAULT_PROFILES_PATH=`https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles`,DEFAULT_PROFILE=`generic-trigger`,XRControllerModel=class extends three_webgpu.Object3D{constructor(){super(),this.motionController=null,this.envMap=null}setEnvironmentMap(envMap){return this.envMap==envMap?this:(this.envMap=envMap,this.traverse(child=>{child instanceof three_webgpu.Mesh&&child.isMesh&&(child.material.envMap=this.envMap,child.material.needsUpdate=!0)}),this)}updateMatrixWorld(force){super.updateMatrixWorld(force),this.motionController&&(this.motionController.updateFromGamepad(),Object.values(this.motionController.components).forEach(component=>{Object.values(component.visualResponses).forEach(visualResponse=>{let{valueNode,minNode,maxNode,value,valueNodeProperty}=visualResponse;valueNode&&(valueNodeProperty===MotionControllerConstants.VisualResponseProperty.VISIBILITY?valueNode.visible=value:valueNodeProperty===MotionControllerConstants.VisualResponseProperty.TRANSFORM&&(valueNode.quaternion.copy(minNode.quaternion).slerp(maxNode.quaternion,value),valueNode.position.lerpVectors(minNode.position,maxNode.position,value)))})}))}};function findNodes(motionController,scene){Object.values(motionController.components).forEach(component=>{let{type,touchPointNodeName,visualResponses}=component;if(type===MotionControllerConstants.ComponentType.TOUCHPAD)if(component.touchPointNode=scene.getObjectByName(touchPointNodeName),component.touchPointNode){let sphere=new three_webgpu.Mesh(new three_webgpu.SphereGeometry(.001),new three_webgpu.MeshBasicMaterial({color:255}));component.touchPointNode.add(sphere)}else console.warn(`Could not find touch dot, ${component.touchPointNodeName}, in touchpad component ${component.id}`);Object.values(visualResponses).forEach(visualResponse=>{let{valueNodeName,minNodeName,maxNodeName,valueNodeProperty}=visualResponse;if(valueNodeProperty===MotionControllerConstants.VisualResponseProperty.TRANSFORM){if(visualResponse.minNode=scene.getObjectByName(minNodeName),visualResponse.maxNode=scene.getObjectByName(maxNodeName),!visualResponse.minNode){console.warn(`Could not find ${minNodeName} in the model`);return}if(!visualResponse.maxNode){console.warn(`Could not find ${maxNodeName} in the model`);return}}visualResponse.valueNode=scene.getObjectByName(valueNodeName),visualResponse.valueNode||console.warn(`Could not find ${valueNodeName} in the model`)})})}function addAssetSceneToControllerModel(controllerModel,scene){findNodes(controllerModel.motionController,scene),controllerModel.envMap&&scene.traverse(child=>{child instanceof three_webgpu.Mesh&&child.isMesh&&(child.material.envMap=controllerModel.envMap,child.material.needsUpdate=!0)}),controllerModel.add(scene)}var XRControllerModelFactory=class{constructor(gltfLoader=null){this.gltfLoader=gltfLoader,this.path=DEFAULT_PROFILES_PATH,this._assetCache={}}createControllerModel(controller){let controllerModel=new XRControllerModel,scene=null;return controller.addEventListener(`connected`,event=>{let xrInputSource=event.data;xrInputSource.targetRayMode!==`tracked-pointer`||!xrInputSource.gamepad||fetchProfile(xrInputSource,this.path,DEFAULT_PROFILE).then(({profile,assetPath})=>{controllerModel.motionController=new MotionController(xrInputSource,profile,assetPath);let cachedAsset=this._assetCache[controllerModel.motionController.assetUrl];if(cachedAsset)scene=cachedAsset.scene.clone(),addAssetSceneToControllerModel(controllerModel,scene);else{if(!this.gltfLoader)throw Error(`GLTFLoader not set.`);this.gltfLoader.load(controllerModel.motionController.assetUrl,asset=>{this._assetCache[controllerModel.motionController.assetUrl]=asset,scene=asset.scene.clone(),addAssetSceneToControllerModel(controllerModel,scene)})}}).catch(err=>{console.warn(err)})}),controller.addEventListener(`disconnected`,()=>{controllerModel.motionController=null,controllerModel.remove(scene),scene=null}),controllerModel}},ButtonStateMachine=class{constructor(){this.states=new Map}sample(source,name,pressed,time){let sourceStates=this.states.get(source),state=sourceStates==null?void 0:sourceStates.get(name);if(!state){if(!pressed)return[];let map=sourceStates;return map||(map=new Map,this.states.set(source,map)),map.set(name,{downAt:time,pressFired:!1}),[{type:`buttonDown`,name,source,time,duration:0}]}let duration=time-state.downAt,reachedThreshold=duration>=300;if(pressed)return reachedThreshold&&!state.pressFired?(state.pressFired=!0,[{type:`press`,name,source,time,duration}]):[];this.deleteState(source,name);let events=[];return state.pressFired?events.push({type:`buttonUp`,name,source,time,duration}):reachedThreshold?(events.push({type:`press`,name,source,time,duration}),events.push({type:`buttonUp`,name,source,time,duration})):(events.push({type:`buttonUp`,name,source,time,duration}),events.push({type:`tap`,name,source,time,duration})),events}removeSource(source,time){let sourceStates=this.states.get(source);if(!sourceStates)return[];let events=[];for(let[name,state]of sourceStates)events.push({type:`buttonUp`,name,source,time,duration:time-state.downAt});return this.states.delete(source),events}reset(time){let events=[];for(let[source,sourceStates]of this.states)for(let[name,state]of sourceStates)events.push({type:`buttonUp`,name,source,time,duration:time-state.downAt});return this.states.clear(),events}deleteState(source,name){let sourceStates=this.states.get(source);sourceStates&&(sourceStates.delete(name),sourceStates.size===0&&this.states.delete(source))}},defaultXRPanoramaControllerCustomInitArgs=Object.assign(Object.assign({},require_pick.t(defaultPanoramaControllerCustomInitArgs,[`maxLatitude`,`minLatitude`])),{referenceSpaceType:`local-floor`,foveation:1,showControllerModel:!0,showPointerRay:!0,deviceProfile:{}}),POINTER_RAY_LENGTH=5,POINTER_RAY_LENGTH_EPSILON=1e-4,ACTIVE_TO_CURRENT_DELAY=1500;function createGltfLoaderBridge(){return{load(url,callback){require_memoryUsage.u.ajax(url,{responseType:`arraybuffer`}).then(response=>{var _a;return require_glTF_helpers.t(response.body,{resourcePath:url.slice(0,url.lastIndexOf(`/`)+1),search:(_a=url.split(`?`)[1])==null?``:_a,fetcher:require_memoryUsage.u})}).then(result=>callback(result)).catch(error=>{console.warn(`[XRPanorama] 手柄模型 glTF 加载失败,跳过模型挂载:`,url,error)})}}}var XRPanoramaController=class XRPanoramaController extends PanoramaController{static parseArgs(args){if(args instanceof XRPanoramaController)return args;let args_=Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2});return super.parseArgs(args_)}static initAnimationEndState(args){let args_=this.parseArgs(args),state=super.initAnimationEndState(args_);return Object.assign(Object.assign({},state),{mode:`XRPanorama`})}constructor(args){var _a,_b,_c,_d,_e;let args_=XRPanoramaController.parseArgs(args);super(args_),this.controllerRayFilled={left:!1,right:!1},this.controllerModelFactory=null,this.buttonStateMachine=new ButtonStateMachine,this.inputVisuals=new Map,this.inputsDirty=!1,this.walkedThisFrame=!1,this.lastFrameTime=0,this.walkSources={left:null,right:null},this.gazeRayPool=null,this.mode=`XRPanorama`;let defaults=defaultXRPanoramaControllerCustomInitArgs,referenceSpaceType=(_a=args.referenceSpaceType)==null?defaults.referenceSpaceType:_a,foveation=(_b=args.foveation)==null?defaults.foveation:_b;this.showControllerModel=(_c=args.showControllerModel)==null?defaults.showControllerModel:_c,this.showPointerRay=(_d=args.showPointerRay)==null?defaults.showPointerRay:_d,this.controllerRaycasters={left:this.createPickingRaycaster(),right:this.createPickingRaycaster()},this.gazeRaycaster=null,this.xrManager=new XRManager(this.renderer,{referenceSpaceType,foveation,deviceProfile:(_e=args.deviceProfile)==null?defaults.deviceProfile:_e},{onSessionStart:(session,device)=>{this.emit(`xr.session.start`,createEvent(`xr.session.start`,{session,machineType:toPublicMachineType(device)}))},onSessionEnd:device=>{this.emit(`xr.session.end`,createEvent(`xr.session.end`,{session:null,machineType:toPublicMachineType(device)}))},onSessionEnding:()=>{this.resetButtonStates(),this.clearInputVisuals()},onSelect:source=>this.onXRSelect(source),onInputSourcesChange:(added,removed)=>{for(let source of removed){this.removeInputVisual(source);for(let event of this.buttonStateMachine.removeSource(source,this.lastFrameTime))this.dispatchButtonEvent(event)}for(let source of added)this.syncInputVisual(source)}}),this.buttonMaps={left:this.createButtonMap(`left`),right:this.createButtonMap(`right`)},this.scene.add(this.xrManager.inputs.root);let session=require_imageBitmap.s.shared.getContext();(session?this.xrManager.enter(session):Promise.reject(Error(`[XR] 缺少 XRSession:请经 Five.changeMode 进入 XRPanorama`))).catch(error=>{console.error(`[XR] 进入失败`,error),this.emit(`error`,error instanceof Error?error:Error(String(error)))})}updateConfiguration(args){let result=super.updateConfiguration(Object.assign(Object.assign({},args),{maxLatitude:Math.PI/2,minLatitude:-Math.PI/2}));return args.showControllerModel!==void 0&&args.showControllerModel!==this.showControllerModel&&(this.showControllerModel=args.showControllerModel,this.inputsDirty=!0),args.showPointerRay!==void 0&&args.showPointerRay!==this.showPointerRay&&(this.showPointerRay=args.showPointerRay,this.inputsDirty=!0),result}updateTime(time,deltaTime,...args){var _a,_b;if(this.destroyed)return;this.walkedThisFrame=!1,this.lastFrameTime=time;let frame=args[1];if(this.userAction=!0,this.needsRender=!0,!frame){this.controllerRayFilled.left=!1,this.controllerRayFilled.right=!1,this.gazeRaycaster=null,super.updateTime(time,deltaTime),this.intersect(time);return}super.updateTime(time,deltaTime);let info=this.xrManager.beginFrame(frame,time,this.camera.position,this.camera.near,this.camera.far);if(info.hasPose&&this.syncCameraFromXR(info.headOrientation),this.inputsDirty){this.inputsDirty=!1;for(let source of this.xrManager.inputs.entries().keys())this.syncInputVisual(source)}this.updateControllerHelper((_b=(_a=this.xrManager.session)==null?void 0:_a.inputSources)==null?[]:_b,time,deltaTime),this.updateGazeRay(),this.intersect(time)}syncCameraFromXR(headOrientation){this.camera.quaternion.copy(headOrientation),this.camera.matrix.compose(this.camera.position,this.camera.quaternion,this.camera.scale),this.camera.computePose(this.camera.pose.distance)}render(){return this.xrManager.isPresenting?(this.xrManager.renderEyes(this.scene),!0):!1}updateCamera(pose,duration,userAction){return Promise.resolve()}updateCameraWithKeyframes(keyframes,duration,userAction){return Promise.resolve()}setCamera(cameraPose={}){cameraPose.offset&&this.camera.position.copy(cameraPose.offset),this.camera.matrix.compose(this.camera.position,this.camera.quaternion,this.camera.scale),this.camera.computePose(this.camera.pose.distance)}updateRenderSize(){this.needsRender=!0}isReady(){return!1}createPickingRaycaster(){let raycaster=new three_webgpu.Raycaster;return raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.floorIndex=-1,raycaster}updateControllerHelper(inputSources,time,deltaTime){var _a,_b,_c;if(this.controllerRayFilled.left=!1,this.controllerRayFilled.right=!1,this.walkSources.left=null,this.walkSources.right=null,!inputSources||inputSources.length===0)return;let leftAxes={up:0,down:0,left:0,right:0},rightAxes={up:0,down:0,left:0,right:0},buttons={X:!1,Y:!1,LeftTrigger:!1,LeftPinch:!1,A:!1,B:!1,RightTrigger:!1,RightPinch:!1};for(let i=0;i<inputSources.length;i++){let inputSource=inputSources[i];if(!inputSource)continue;let hand=inputSource.handedness===`left`?`left`:`right`;this.xrManager.fillRaycaster(inputSource,this.controllerRaycasters[hand])&&(this.controllerRayFilled[hand]=!0),this.readAxes(inputSource.gamepad,hand===`left`?leftAxes:rightAxes);let gamepadButtons=(_a=inputSource.gamepad)==null?void 0:_a.buttons;for(let{name,index}of this.buttonMaps[hand]){let pressed=(_c=(_b=gamepadButtons==null?void 0:gamepadButtons[index])==null?void 0:_b.pressed)==null?!1:_c;pressed&&(buttons[name]=!0);for(let event of this.buttonStateMachine.sample(inputSource,name,pressed,time))this.dispatchButtonEvent(event)}}this.emit(`xr.controller.update`,createEvent(`xr.controller.update`,{left:{axes:leftAxes,raycaster:this.controllerRaycasters.left,deltaTime},right:{axes:rightAxes,raycaster:this.controllerRaycasters.right,deltaTime},buttons})),this.walkByTap()}createButtonMap(hand){let b=this.xrManager.profile.buttons,left=hand===`left`,candidates=[[left?`LeftTrigger`:`RightTrigger`,b.trigger],[left?`X`:`A`,b.primary],[left?`Y`:`B`,b.secondary],[left?`LeftPinch`:`RightPinch`,b.pinch]],entries=[];for(let[name,index]of candidates)index!==null&&entries.push({name,index});return entries}dispatchButtonEvent(buttonEvent){let{type,name,source}=buttonEvent,event=this.emitGesture(`xr.gesture.${type}`,name,type===`buttonDown`||type===`tap`,type===`buttonUp`||type===`tap`);type===`tap`&&!event.defaultPrevented&&(name===`RightTrigger`?this.walkSources.right=source:name===`LeftTrigger`&&(this.walkSources.left=source))}walkByTap(){this.tryWalk(this.walkSources.right,`right`),this.tryWalk(this.walkSources.left,`left`)}tryWalk(source,hand){if(!source||this.walkedThisFrame)return;let raycaster=this.controllerRaycasters[hand];this.xrManager.fillRaycaster(source,raycaster)&&(this.walkedThisFrame=!0,this.activePanoMesh=void 0,this.activeTime=void 0,this.checkSelectedPano(raycaster))}resetButtonStates(){for(let event of this.buttonStateMachine.reset(this.lastFrameTime))this.dispatchButtonEvent(event)}readAxes(gamepad,out){var _a,_b;if(!gamepad)return;let{x:xIndex,y:yIndex}=this.xrManager.profile.axes,x=(_a=xIndex===null?0:gamepad.axes[xIndex])==null?0:_a,y=(_b=yIndex===null?0:gamepad.axes[yIndex])==null?0:_b;out.right=x>0?x:0,out.left=x<0?-x:0,out.down=y>0?y:0,out.up=y<0?-y:0}getControllerModelFactory(){if(!this.controllerModelFactory){let factory=new XRControllerModelFactory;factory.gltfLoader=createGltfLoaderBridge(),this.controllerModelFactory=factory}return this.controllerModelFactory}syncInputVisual(source){let tracked=this.xrManager.inputs.entries().get(source);if(!tracked)return;let visual=this.inputVisuals.get(source);visual||(visual={},this.inputVisuals.set(source,visual));let trackedPointer=source.targetRayMode===`tracked-pointer`,wantModel=trackedPointer&&!!source.gamepad&&!!source.gripSpace&&this.showControllerModel&&this.xrManager.profile.model!==`none`;if(wantModel&&!visual.model){let connector=new three_webgpu.Object3D,model=this.getControllerModelFactory().createControllerModel(connector);connector.dispatchEvent({type:`connected`,data:source}),tracked.grip.add(model),visual.model=model}else!wantModel&&visual.model&&(visual.model.removeFromParent(),visual.model=void 0);let wantRay=trackedPointer&&this.showPointerRay;if(wantRay&&!visual.ray){let geometry=new three_webgpu.BufferGeometry;geometry.setAttribute(`position`,new three_webgpu.Float32BufferAttribute([0,0,0,0,0,-5],3));let material=new three_webgpu.LineBasicMaterial({color:16777215,depthTest:!1,depthWrite:!1,transparent:!0}),ray=new three_webgpu.LineSegments(geometry,material);ray.renderOrder=999,ray.frustumCulled=!1,tracked.targetRay.add(ray),visual.ray=ray,visual.rayLength=POINTER_RAY_LENGTH}else!wantRay&&visual.ray&&(this.disposeRay(visual.ray),visual.ray=void 0)}updatePointerRayLength(raycaster,point){for(let[source,visual]of this.inputVisuals){let ray=visual.ray;if(!ray)continue;let hand=source.handedness===`left`?`left`:`right`,length=POINTER_RAY_LENGTH;if(raycaster&&point&&raycaster===this.controllerRaycasters[hand]&&(length=Math.min(raycaster.ray.origin.distanceTo(point),POINTER_RAY_LENGTH)),visual.rayLength!==void 0&&Math.abs(visual.rayLength-length)<POINTER_RAY_LENGTH_EPSILON)continue;let position=ray.geometry.getAttribute(`position`);position.setZ(1,-length),position.needsUpdate=!0,visual.rayLength=length}}removeInputVisual(source){var _a;let visual=this.inputVisuals.get(source);visual&&((_a=visual.model)==null||_a.removeFromParent(),visual.ray&&this.disposeRay(visual.ray),this.inputVisuals.delete(source))}clearInputVisuals(){for(let source of Array.from(this.inputVisuals.keys()))this.removeInputVisual(source)}disposeRay(ray){ray.removeFromParent(),ray.geometry.dispose(),ray.material.dispose()}emitGesture(type,button,isFirst,isFinal){let event=createEvent(type,{session:this.xrManager.session,buttons:button,machineType:toPublicMachineType(this.xrManager.device),isFirst,isFinal,controllers:{raycaster:{leftRay:this.controllerRaycasters.left,rightRay:this.controllerRaycasters.right}}});return this.emit(type,event),event}updateGazeRay(){var _a,_b;let inputSources=(_a=this.xrManager.session)==null?void 0:_a.inputSources;if(!inputSources||inputSources.length===0){this.gazeRaycaster=null;return}let gazeSource=null;for(let i=0;i<inputSources.length;i++){let inputSource=inputSources[i];if(!inputSource)continue;let mode=inputSource.targetRayMode;if(mode===`transient-pointer`||mode===`gaze`||inputSource.hand!=null){gazeSource=inputSource;break}}if(!gazeSource){this.gazeRaycaster=null;return}let raycaster=(_b=this.gazeRayPool)==null?this.gazeRayPool=this.createPickingRaycaster():_b;this.gazeRaycaster=this.xrManager.fillRaycaster(gazeSource,raycaster)?raycaster:null}onXRSelect(source){var _a;if(source.targetRayMode!==`gaze`&&source.targetRayMode!==`transient-pointer`)return;let raycaster=(_a=this.gazeRayPool)==null?this.gazeRayPool=this.createPickingRaycaster():_a;this.xrManager.fillRaycaster(source,raycaster)&&this.checkSelectedPano(raycaster)}pickPickingRaycaster(){return this.gazeRaycaster?this.gazeRaycaster:this.controllerRayFilled.right?this.controllerRaycasters.right:this.controllerRayFilled.left?this.controllerRaycasters.left:null}intersect(time){var _a,_b,_c;if(this.locationMotion.ended===!1){this.intersectMesh.visible=!1,this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(null,null);return}if(this.activePanoMesh&&this.activeTime&&time-this.activeTime>ACTIVE_TO_CURRENT_DELAY){let activePanoMesh=this.activePanoMesh,activePanoId=null;return this.panoMeshes.forEach((panoMesh,panoId)=>{panoMesh===activePanoMesh&&(activePanoId=panoId)}),activePanoId!==null&&(this.moveToPano(panoParse(activePanoId),{},!0),this.walkedThisFrame=!0),this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(null,null),activePanoMesh}let raycaster=this.pickPickingRaycaster();if(!raycaster){this.intersectMesh.visible=!1,this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(null,null);return}let intersection,customIntersection=this.intersectCustomObjects(raycaster),intersectionPanos=[],currentObserver=this.works.getObserver(this.currentPano),accessibleNodes=currentObserver?currentObserver.accessibleNodes.map(panoIndex=>panoStringify({panoIndex,workCode:currentObserver.work.workCode})):[];for(let panoId of accessibleNodes){let panoMesh=this.panoMeshes.get(panoId);if(panoMesh){let[intersection]=raycaster.intersectObject((_a=panoMesh.hitTestMesh)==null?panoMesh:_a,!0);if(intersection){let floorIndex=(_b=currentObserver==null?void 0:currentObserver.floorIndex)==null?0:_b;intersectionPanos.push({panoMesh,intersection:Object.assign({floorIndex,floor:floorIndex},intersection)})}}}let[intersectionPanoMesh]=intersectionPanos.sort((a,b)=>a.intersection.distance-b.intersection.distance);if(customIntersection){let nearest=(_c=intersectionPanoMesh==null?void 0:intersectionPanoMesh.intersection)==null?this.modelScene.intersectRaycaster(raycaster)[0]:_c;if(!nearest||customIntersection.distance<=nearest.distance){this.activePanoMesh=void 0,this.activeTime=void 0,this.updatePointerRayLength(raycaster,customIntersection.point),this.emit(`intersect.update`,createEvent(`intersect.update`,{raycaster,intersection:customIntersection,object:this.intersectMesh})),this.hideIntersectMesh();return}}intersectionPanoMesh?(intersection=intersectionPanoMesh.intersection,this.activePanoMesh!==intersectionPanoMesh.panoMesh&&(this.activePanoMesh=intersectionPanoMesh.panoMesh,this.activeTime=time),this.intersectMesh.position.copy(intersectionPanoMesh.panoMesh.position),this.intersectMesh.lookAt(this.camera.position)):(this.activePanoMesh=void 0,this.activeTime=void 0),intersection||(intersection=this.modelScene.intersectRaycaster(raycaster)[0]),this.updatePointerRayLength(raycaster,intersection?intersection.point:null);let intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection&&intersection.face){let face=intersection.face.normal,quaternion=new three_webgpu.Quaternion;quaternion.setFromUnitVectors(new three_webgpu.Vector3(0,0,1),face),this.intersectMesh.quaternion.copy(quaternion);let position=intersection.point.clone();this.intersectMesh.position.copy(position),intersectionPanoMesh?this.intersectMesh.visible=!1:this.intersectMesh.visible=!0}else this.intersectMesh.visible=!1;return intersectionPanoMesh==null?void 0:intersectionPanoMesh.panoMesh}intersectCustomObjects(raycaster){var _a,_b;let root=this.xrCustomObjectsScene;if(!root||!root.visible||root.children.length===0)return;raycaster.camera=this.xrManager.eyeCameras[0];let intersections=raycaster.intersectObject(root,!0);for(let hit of intersections){let visible=!0;for(let node=hit.object;node&&node!==root;node=node.parent)if(!node.visible){visible=!1;break}if(!visible)continue;let floorIndex=(_b=(_a=this.works.getObserver(this.currentPano))==null?void 0:_a.floorIndex)==null?0:_b;return Object.assign({floorIndex,floor:floorIndex},hit)}}checkSelectedPano(raycaster){var _a;this.stopMomentumMovement();let currentObserver=this.works.getObserver(this.currentPano);if(!currentObserver)return;let observers=currentObserver.work.observers,accessibleNodes=currentObserver.accessibleNodes.filter(panoIndex=>{if(panoIndex===this.currentPano.panoIndex&¤tObserver.work.workCode===this.currentPano.workCode)return!1;let observer=observers[panoIndex];return!observer||observer.position.clone().applyMatrix4(observer.work.transform).distanceTo(this.camera.position)>this.maxAccessibleDistance?!1:observer.loadable||observer.active}),nextObserver=null,[intersection]=this.modelScene.intersectRaycaster(raycaster),customIntersection=this.intersectCustomObjects(raycaster);if(customIntersection&&(!intersection||customIntersection.distance<=intersection.distance))return;if(intersection){let[panoIndex,distance]=arrayMin(accessibleNodes,panoIndex=>{let accessibleObserver=observers[panoIndex];return accessibleObserver?accessibleObserver.standingPosition.clone().applyMatrix4(accessibleObserver.work.transform).distanceTo(intersection.point):1/0},!0);typeof panoIndex==`number`&&distance<this.panoTapTriggerRadius&&(nextObserver=(_a=observers[panoIndex])==null?null:_a)}if(nextObserver||(nextObserver=this.getForwardObserverOrNot(this.xrManager.eyeCameras[0],raycaster)),nextObserver&&nextObserver.panoId===panoStringify(this.currentPano)&&(nextObserver=null),nextObserver&&!this.locationMotion.ended){for(let keyframe of this.locationMotion.keyframes)if(this.panoResourceFromLocationMotionKeyframe(keyframe).panoId===nextObserver.panoId){nextObserver=null;break}}if(!nextObserver){this.locationMotion.ended===!0&&this.cameraBounce();return}let state={workCode:nextObserver.work.workCode,panoIndex:nextObserver.panoIndex,mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,distance:0,offset:nextObserver.position.clone()};if(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:!0,options:{},progress:0,error:null})),!nextObserver.active){let nextPanoMesh=this.panoMeshes.get(nextObserver.panoId);nextPanoMesh&&(nextPanoMesh.setDisabled(!1),nextPanoMesh.setLoading(!0));return}this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,state,options:{},progress:0,error:null}))}destroy(){super.destroy(),this.xrManager.dispose(),this.clearInputVisuals(),this.scene.remove(this.xrManager.inputs.root)}onPanGesture(){}onTapGesture(){}onPinchGesture(){}onMouseMove(){}onMouseOut(){}},HUMAN_EYE_POSITION=new three_webgpu.Vector3(0,1.6,0),scratchObserverBox$1=new three_webgpu.Box3,scratchVector3$1=new three_webgpu.Vector3,defaultModelControllerCustomInitArgs=Object.assign({},defaultPanoramaLikeControllerCustomInitArgs),ModelController=class ModelController extends PanoramaLikeController{static parseArgs(args){return args instanceof ModelController?args:super.parseArgs(args)}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f;let args_=this.parseArgs(args),works=args_.works,{state,currentState}=args.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex},observer=works.getObserver(pano),fov=require_memoryUsage.M((_d=state.fov)==null?!observer||isFristPersonMode(currentState.mode)?currentState.fov:args_.defaultFov:_d,args_.minFov,args_.maxFov),longitude=(_e=state.longitude)==null?currentState.longitude:_e,minLatitude=require_memoryUsage.M(typeof args_.minLatitude==`function`?args_.minLatitude(fov):args_.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof args_.maxLatitude==`function`?args_.maxLatitude(fov):args_.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M((_f=state.latitude)==null?!observer||isFristPersonMode(currentState.mode)?currentState.latitude:args_.defaultLatitude:_f,minLatitude,maxLatitude),offset=new three_webgpu.Vector3;if(args_.initial.state.offset)offset.copy(args_.initial.state.offset);else if(observer)offset.copy(observer.position).applyMatrix4(observer.work.transform);else{let vector=coordinatesToVector(currentState).setLength(currentState.distance);offset.copy(args_.initial.currentState.offset).sub(vector)}return{workCode:pano.workCode,panoIndex:pano.panoIndex,mode:`Model`,longitude,latitude,fov,offset,distance:0}}constructor(args){let args_=ModelController.parseArgs(args);super(args_),this.mode=`Model`,this.locationMotion=new Motion({x:this.camera.pose.offset.x,y:this.camera.pose.offset.y,z:this.camera.pose.offset.z,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x})}updateConfiguration(args){return super.updateConfiguration(args)}destroy(){super.destroy(),this.locationMotion.dispose()}isReady(){return this.locationMotion.ended===!1?!1:super.isReady()}updateWork(works,state,options,userAction){this.works=works;let toState=ModelController.initAnimationEndState(Object.assign(Object.assign({},this),{initial:{currentState:Object.assign(Object.assign({},this.currentPano),this.camera.pose),duration:options.duration,effect:options.effect,state,userAction}}));return(toState.workCode!==this.currentPano.workCode||toState.panoIndex!==this.currentPano.panoIndex||toState.longitude!==this.cameraMotion.value.longitude||toState.latitude!==this.cameraMotion.value.latitude||toState.fov!==this.cameraMotion.value.fov)&&this.moveToPosition(toState.offset,{duration:0,longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},userAction),!0}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationValue={},cameraValue={};return locationValue.distance=0,pose.offset!==void 0&&(locationValue.x=pose.offset.x,locationValue.y=pose.offset.y,locationValue.z=pose.offset.z),pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.locationMotion.set(locationValue,duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationKeyframe=[],cameraKeyframe=[];for(let keyframe of keyframes)locationKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{distance:0,x:keyframe.value.offset.x,y:keyframe.value.offset.x,z:keyframe.value.offset.x}}),cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.locationMotion.setKeyframes(locationKeyframe,duration).catch(require_memoryUsage.d),this.cameraMotion.setKeyframes(keyframes,duration)})}updateTime(time,deltaTime,...args){if(this.destroyed)return;let uniforms={},cameraPose={};if(this.modelAlphaMotion.ended||(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.modelScene.parameter.modelAlpha===0&&this.modelScene.parameter.progress!==1){let{pano0,pano1}=this.modelScene.parameter;pano0&&pano0.map!==(pano1==null?void 0:pano1.map)&&pano0.map.dispose(),uniforms.progress=1,uniforms.pano0=uniforms.pano1=pano1}if(this.perspToOrthoMotion.ended||(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),!this.locationMotion.ended){this.locationMotion.update(time),cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z);let currentPositon=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$1.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$1.containsPoint(currentPositon)))for(let observer of work.observers)observers.push(observer)}let observer=arrayMin(observers,observer=>scratchVector3$1.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(currentPositon));this.currentPano=observer?{workCode:observer.work.workCode,panoIndex:observer.panoIndex}:{workCode:``,panoIndex:0}}this.cameraMotion.ended||(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),isEmptyObject(uniforms)||this.modelScene.parameter.set(uniforms),isEmptyObject(cameraPose)||this.setCamera(cameraPose);let currentObserver=this.works.getObserver(this.currentPano);if(this.intersectMesh&&this.intersectMesh.parent&¤tObserver&¤tObserver.position.y-currentObserver.standingPosition.y>10){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1)}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{state,currentState,duration,userAction}=this.initial;this.userAction=userAction;let toState=ModelController.initAnimationEndState(this),modelAlphaValue={modelAlpha:1},perspToOrthoValue={perspToOrtho:0},options={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov,duration,moveStartCallback:state=>{this.perspToOrthoMotion.set(perspToOrthoValue,duration).catch(require_memoryUsage.d),this.modelAlphaMotion.set(modelAlphaValue,duration).catch(require_memoryUsage.d),this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state,userAction:this.userAction}))},moveEndCallback:state=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),resolve()},moveCancelCallback:()=>{let pano=this.currentPano,state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance});this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction})),resolve()}};this.moveToPosition(toState.offset,options,userAction)})}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1];return Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,offset:new three_webgpu.Vector3(targetLocationKeyFrame.value.x,targetLocationKeyFrame.value.y,targetLocationKeyFrame.value.z),distance:targetLocationKeyFrame.value.distance})}moveToPano(pano,options={},userAction){let observer=this.works.getObserver(pano);if(observer){let position=new three_webgpu.Vector3().copy(observer.position).applyMatrix4(observer.work.transform);this.moveToPosition(position,options,userAction)}}moveToPosition(position,options={},userAction){var _a,_b,_c;this.userAction=userAction,this.stopMomentumMovement();let time=require_memoryUsage.p(),currentPositon=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),distance=currentPositon.distanceTo(position),velocity=this.locationMotion.getProgressVelocity(time),totalLocationKeyframesLength=0;for(let i=1;i<this.locationMotion.keyframes.length;i++){let{x:x0,y:y0,z:z0}=this.locationMotion.keyframes[i-1].value,{x:x1,y:y1,z:z1}=this.locationMotion.keyframes[i].value;totalLocationKeyframesLength+=Math.sqrt(Math.pow(x1-x0,2)+Math.pow(y1-y0,2)+Math.pow(z1-z0,2))}let startVelocity=distance===0?0:velocity*totalLocationKeyframesLength/distance,animationDuration=this.calculateMovingDuration(options.duration,distance),locationValue={x:position.x,y:position.y,z:position.z,distance:0},cameraValue={longitude:options.longitude,latitude:options.latitude,fov:options.fov},observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$1.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$1.containsPoint(currentPositon)))for(let observer of work.observers)observers.push(observer)}let observer=arrayMin(observers,observer=>scratchVector3$1.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(currentPositon)),pano=observer?{workCode:observer.work.workCode,panoIndex:observer.panoIndex}:{workCode:``,panoIndex:0},state=Object.assign(Object.assign({},pano),{mode:this.mode,longitude:(_a=cameraValue.longitude)==null?this.camera.pose.longitude:_a,latitude:(_b=cameraValue.latitude)==null?this.camera.pose.latitude:_b,fov:(_c=cameraValue.fov)==null?this.camera.pose.fov:_c,offset:position.clone(),distance:0}),prevPano=this.currentPano;this.emit(`pano.moveTo`,createEvent(`pano.moveTo`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveStartCallback&&options.moveStartCallback(state),this.cameraMotion.set(cameraValue,animationDuration).catch(require_memoryUsage.d),this.locationMotion.set(locationValue,animationDuration,startVelocity).then(()=>{for(let model of this.modelScene.children)model instanceof Model&&model.show();let state=Object.assign(Object.assign(Object.assign({},pano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`pano.arrived`,createEvent(`pano.arrived`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null})),options.moveEndCallback&&options.moveEndCallback(state)},()=>{options.moveCancelCallback&&options.moveCancelCallback(),this.emit(`pano.cancel`,createEvent(`pano.cancel`,{options,prevPano,progress:0,state,userAction:this.userAction,error:null}))})}onTapGesture(event){let raycaster=event.center.raycaster;this.stopMomentumMovement();let[intersection]=this.modelScene.intersectRaycaster(raycaster);if(intersection&&intersection.face){let normal=intersection.face.normal,point=intersection.point;if(new three_webgpu.Vector3(0,1,0).angleTo(normal)>Math.PI/3){let downRaycaster=new three_webgpu.Raycaster;downRaycaster.firstHitOnly=!0;let origin=normal.clone().setLength(.3).add(point);downRaycaster.set(origin,new three_webgpu.Vector3(0,-1,0)),intersection=this.modelScene.intersectRaycaster(downRaycaster)[0]}}if(intersection){let nextPosition=new three_webgpu.Vector3().copy(intersection.point).add(HUMAN_EYE_POSITION),observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox$1.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox$1.containsPoint(nextPosition)))for(let observer of work.observers)observers.push(observer)}let[nearestObserver,distance]=arrayMin(observers,observer=>scratchVector3$1.copy(observer.position).applyMatrix4(observer.work.transform).distanceTo(nextPosition),!0);nearestObserver&&distance<5&&(nextPosition.y=scratchVector3$1.copy(nearestObserver.position).applyMatrix4(nearestObserver.work.transform).y),event.state.offset.copy(nextPosition),event.state.distance=0,this.emit(`gesture.tap`,event),event.defaultPrevented||this.moveToPosition(nextPosition,{},!0)}else this.emit(`gesture.tap`,event),event.defaultPrevented||this.cameraBounce()}},scratchObserverBox=new three_webgpu.Box3,scratchVector3=new three_webgpu.Vector3,minDistance=.5,PANGESTURE_FORWARD_ANGLE=Math.PI/7,defaultMapviewControllerCustomInitArgs={defaultLongitude:Math.PI/4,defaultLatitude:Math.PI/4,defaultDistance:150,maxLatitude:Math.PI/2,minLatitude:0,cameraType:`auto`,cameraFence:null,intersectMeshCreator:()=>new IntersectMesh},Controllers={Floorplan:FloorplanController,Topview:TopviewController,Panorama:PanoramaController,VRPanorama:VRPanoramaController,XRPanorama:XRPanoramaController,Model:ModelController,Mapview:class MapviewController extends BaseController{static parseArgs(args){var _a,_b,_c,_d,_e,_f,_g,_h;if(args instanceof MapviewController)return args;let args_=super.parseArgs(args);return Object.assign(Object.assign({},args_),{defaultLongitude:(_a=args.defaultLongitude)==null?defaultMapviewControllerCustomInitArgs.defaultLongitude:_a,defaultLatitude:(_b=args.defaultLatitude)==null?defaultMapviewControllerCustomInitArgs.defaultLatitude:_b,defaultDistance:(_c=args.defaultDistance)==null?defaultMapviewControllerCustomInitArgs.defaultDistance:_c,maxLatitude:(_d=args.maxLatitude)==null?defaultMapviewControllerCustomInitArgs.maxLatitude:_d,minLatitude:(_e=args.minLatitude)==null?defaultMapviewControllerCustomInitArgs.minLatitude:_e,cameraType:(_f=args.cameraType)==null?defaultMapviewControllerCustomInitArgs.cameraType:_f,cameraFence:(_g=args.cameraFence)==null?defaultMapviewControllerCustomInitArgs.cameraFence:_g,intersectMeshCreator:(_h=args.intersectMeshCreator)==null?defaultMapviewControllerCustomInitArgs.intersectMeshCreator:_h})}static distanceFromModel(modelScene,fov,aspect){let boundingBox=modelScene.boundingBox,radius=boundingBox.isEmpty()?10:Math.pow(Math.pow(boundingBox.max.x-boundingBox.min.x+1,2)+Math.pow(boundingBox.max.y-boundingBox.min.y+1,2)+Math.pow(boundingBox.max.z-boundingBox.min.z+1,2),1/2);radius=isNaN(radius)||!isFinite(radius)?1:radius;let distance=radius/2/Math.tan(Math.PI*fov/360);return aspect<1&&(distance/=aspect),isNaN(distance)||!isFinite(distance)?radius:distance}static initAnimationEndState(args){var _a,_b,_c,_d,_e,_f,_g;let args_=this.parseArgs(args),works=args_.works,modelScene=args_.modelScene,{state,currentState}=args.initial,pano=typeof state.panoIndex==`number`?{workCode:(_c=(_a=state.workCode)==null?(_b=args_.works[0])==null?void 0:_b.workCode:_a)==null?``:_c,panoIndex:state.panoIndex}:{workCode:currentState.workCode,panoIndex:currentState.panoIndex},fov=(_d=state.fov)==null?60:_d,minLatitude=require_memoryUsage.M(typeof args_.minLatitude==`function`?args_.minLatitude(fov):args_.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof args_.maxLatitude==`function`?args_.maxLatitude(fov):args_.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M((_e=state.latitude)==null?isThirdPersonMode(currentState.mode)?currentState.latitude:args_.defaultLatitude:_e,minLatitude,maxLatitude),distanceFromModel=MapviewController.distanceFromModel(args_.modelScene,fov,args_.camera.aspect),offset=new three_webgpu.Vector3,distance=(_f=state.distance)==null?Math.min(args_.defaultDistance,distanceFromModel):_f,longitude=(_g=state.longitude)==null?isThirdPersonMode(currentState.mode)?currentState.longitude:args_.defaultLongitude:_g;if(state.offset)offset.copy(state.offset);else{let observer=works.getObserver(pano);args_.defaultDistance<distanceFromModel&&observer?(offset.copy(observer.position).applyMatrix4(observer.work.transform),state.longitude===void 0&&(longitude=currentState.longitude)):(modelScene.boundingBox.getCenter(offset),distance=distanceFromModel)}return Object.assign(Object.assign({},pano),{mode:`Mapview`,longitude,latitude,fov,offset,distance})}constructor(args){let args_=MapviewController.parseArgs(args);super(args_),this.mode=`Mapview`,this.defaultLongitude=args_.defaultLongitude,this.defaultLatitude=args_.defaultLatitude,this.defaultDistance=args_.defaultDistance,this.maxLatitude=args_.maxLatitude,this.minLatitude=args_.minLatitude,this.cameraType=args_.cameraType,this.cameraFence=args_.cameraFence,this.locationMotion=new Motion({x:this.camera.pose.offset.x,y:this.camera.pose.offset.y,z:this.camera.pose.offset.z,distance:this.camera.pose.distance}),this.modelAlphaMotion=new Motion({modelAlpha:this.modelScene.parameter.resolveValue().modelAlpha}),this.perspToOrthoMotion=new Motion({perspToOrtho:this.camera.perspToOrtho.x}),this.pendingTextureId=null,this.textureLoader=new require_pick.i,this.intersectMeshCreator=args_.intersectMeshCreator,this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=`intersect`,this.intersectMesh.visible=!1,this.helper.add(this.intersectMesh)}updateConfiguration(args){if(super.updateConfiguration(args)===!1)return!1;if(args.defaultLongitude!==void 0&&this.defaultLongitude!==args.defaultLongitude&&(this.defaultLongitude=args.defaultLongitude),args.defaultLatitude!==void 0&&this.defaultLatitude!==args.defaultLatitude&&(this.defaultLatitude=args.defaultLatitude),args.defaultDistance!==void 0&&this.defaultDistance!==args.defaultDistance&&(this.defaultDistance=args.defaultDistance),args.maxLatitude!==void 0&&this.maxLatitude!==args.maxLatitude&&(this.maxLatitude=args.maxLatitude),args.minLatitude!==void 0&&this.minLatitude!==args.minLatitude&&(this.minLatitude=args.minLatitude),args.cameraType!==void 0&&this.cameraType!==args.cameraType&&(this.cameraType=args.cameraType),this.cameraFence instanceof three_webgpu.Box3&&args.cameraFence instanceof three_webgpu.Box3||this.cameraFence instanceof three_webgpu.Sphere&&args.cameraFence instanceof three_webgpu.Sphere?this.cameraFence.equals(args.cameraFence)||(this.cameraFence=args.cameraFence):args.cameraFence!==void 0&&(this.cameraFence=args.cameraFence),args.intersectMeshCreator!==void 0&&this.intersectMeshCreator!==args.intersectMeshCreator){this.intersectMeshCreator=args.intersectMeshCreator;let lastMesh=this.intersectMesh;this.intersectMesh=this.intersectMeshCreator(),this.intersectMesh.name=lastMesh.name,this.intersectMesh.visible=lastMesh.visible;let parent=this.intersectMesh.parent;parent&&parent.add(this.intersectMesh),lastMesh.dispose()}return!0}destroy(){super.destroy(),this.pendingTextureId=null,this.locationMotion.dispose(),this.panState=void 0,this.intersectMesh.dispose(),this.helper.remove(this.intersectMesh)}isReady(){return this.locationMotion.ended===!1?!1:super.isReady()}updateWork(works,state,options,userAction){this.userAction=userAction,this.works=works;let toState=MapviewController.initAnimationEndState(Object.assign(Object.assign({},this),{initial:{currentState:Object.assign(Object.assign({},this.currentPano),this.camera.pose),duration:options.duration,effect:options.effect,state,userAction}}));this.currentPano={workCode:toState.workCode,panoIndex:toState.panoIndex};let cameraMotionValue={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},locationMotionValue={x:toState.offset.x,y:toState.offset.y,z:toState.offset.z,distance:toState.distance};return(cameraMotionValue.longitude!==this.cameraMotion.value.longitude||cameraMotionValue.latitude!==this.cameraMotion.value.latitude||cameraMotionValue.fov!==this.cameraMotion.value.fov)&&this.cameraMotion.set(cameraMotionValue,options.duration).catch(require_memoryUsage.d),(locationMotionValue.x!==this.locationMotion.value.x||locationMotionValue.y!==this.locationMotion.value.y||locationMotionValue.z!==this.locationMotion.value.z||locationMotionValue.distance!==this.locationMotion.value.distance)&&this.locationMotion.set(locationMotionValue,options.duration).catch(require_memoryUsage.d),!0}updateModel(modelScene){super.updateModel(modelScene),this.hideIntersectMesh()}updateCamera(pose,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationValue={},cameraValue={};return pose.distance!==void 0&&(locationValue.distance=pose.distance),pose.offset!==void 0&&(locationValue.x=pose.offset.x,locationValue.y=pose.offset.y,locationValue.z=pose.offset.z),pose.longitude!==void 0&&(cameraValue.longitude=pose.longitude),pose.latitude!==void 0&&(cameraValue.latitude=pose.latitude),pose.fov!==void 0&&(cameraValue.fov=pose.fov),this.locationMotion.set(locationValue,duration).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d)})}updateCameraWithKeyframes(keyframes,duration,userAction){return this.initAnimationReady.then(()=>{this.userAction=userAction,this.stopMomentumMovement();let locationKeyframe=[],cameraKeyframe=[];for(let keyframe of keyframes)locationKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{distance:keyframe.value.distance,x:keyframe.value.offset.x,y:keyframe.value.offset.x,z:keyframe.value.offset.x}}),cameraKeyframe.push({key:keyframe.key,progress:keyframe.progress,value:{longitude:keyframe.value.longitude,latitude:keyframe.value.latitude,fov:keyframe.value.fov}});return this.locationMotion.setKeyframes(locationKeyframe,duration).catch(require_memoryUsage.d),this.cameraMotion.setKeyframes(keyframes,duration)})}updateTime(time,deltaTime){if(this.destroyed)return;let uniforms={},cameraPose={};if(this.locationMotion.ended||(this.locationMotion.update(time),cameraPose.distance=this.locationMotion.value.distance,cameraPose.offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z)),this.cameraMotion.ended||(this.cameraMotion.update(time),cameraPose.longitude=this.cameraMotion.value.longitude,cameraPose.latitude=this.cameraMotion.value.latitude,cameraPose.fov=this.cameraMotion.value.fov),this.modelAlphaMotion.ended||(this.modelAlphaMotion.update(time),uniforms.modelAlpha=this.modelAlphaMotion.value.modelAlpha),this.modelScene.parameter.modelAlpha===0&&this.modelScene.parameter.progress!==1){let{pano0,pano1}=this.modelScene.parameter;pano0&&pano0.map!==(pano1==null?void 0:pano1.map)&&pano0.map.dispose(),uniforms.progress=1,uniforms.pano0=uniforms.pano1=pano1}let perspToOrtho=0;if(this.cameraType===`auto`?perspToOrtho=+(Math.abs(Math.PI/2-this.cameraMotion.value.latitude)<.02||Math.abs(-Math.PI/2-this.cameraMotion.value.latitude)<.02):this.cameraType===`perspective`?perspToOrtho=0:this.cameraType===`orthographic`&&(perspToOrtho=1),this.perspToOrthoMotion.getTargetKeyframe().value.perspToOrtho!==perspToOrtho&&this.perspToOrthoMotion.set({perspToOrtho},500).catch(require_memoryUsage.d),this.perspToOrthoMotion.ended||(this.perspToOrthoMotion.update(time),this.camera.perspToOrtho.setScalar(require_memoryUsage.M(this.perspToOrthoMotion.value.perspToOrtho,0,1))),isEmptyObject(uniforms)||this.modelScene.parameter.set(uniforms),isEmptyObject(cameraPose)||this.setCamera(cameraPose),this.cameraFence&&!this.panState&&!this.pinchState&&!this.mouseWheelState&&!this.inMomentumMovement&&this.locationMotion.ended&&this.perspToOrthoMotion.ended&&this.cameraMotion.ended){let direction=coordinatesToVector(this.camera.pose,new three_webgpu.Vector3),position=new three_webgpu.Vector3().copy(this.camera.pose.offset).sub(direction.clone().multiplyScalar(this.camera.pose.distance));if(this.cameraFence.distanceToPoint(position)>.01){let nextPosition=this.cameraFence.clampPoint(position,new three_webgpu.Vector3),offset=this.camera.pose.offset.clone().add(nextPosition).sub(position),state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset,distance:this.camera.pose.distance});this.fixFinalState(state),this.locationMotion.set({x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance},300).catch(require_memoryUsage.d)}}if(this.intersectMesh&&this.intersectMesh.parent){let scale=require_memoryUsage.M(this.camera.position.distanceTo(this.intersectMesh.position)*(2*Math.tan(.5*this.camera.fov/180*Math.PI))/5,.5);this.intersectMesh.scale.setScalar(scale)}else this.intersectMesh.scale.setScalar(1)}getTargetState(){let targetCameraKeyFrame=this.cameraMotion.getKeyFrameSegment(require_memoryUsage.p())[1],targetLocationKeyFrame=this.locationMotion.getKeyFrameSegment(require_memoryUsage.p())[1];return Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:targetCameraKeyFrame.value.longitude,latitude:targetCameraKeyFrame.value.latitude,fov:targetCameraKeyFrame.value.fov,distance:targetLocationKeyFrame.value.distance,offset:new three_webgpu.Vector3(targetLocationKeyFrame.value.x,targetLocationKeyFrame.value.y,targetLocationKeyFrame.value.z)})}initAnimation(){return this.destroyed?Promise.resolve():new Promise(resolve=>{let{state,currentState,duration,userAction}=this.initial;this.userAction=userAction;let toState=MapviewController.initAnimationEndState(this),cameraValue={longitude:toState.longitude,latitude:toState.latitude,fov:toState.fov},locationValue={x:toState.offset.x,y:toState.offset.y,z:toState.offset.z,distance:toState.distance};this.emit(`initAnimation.start`,createEvent(`initAnimation.start`,{state:toState,userAction:this.userAction})),this.perspToOrthoMotion.set({perspToOrtho:0},duration).catch(require_memoryUsage.d),this.modelAlphaMotion.set({modelAlpha:1},duration/3).catch(require_memoryUsage.d),this.cameraMotion.set(cameraValue,duration).catch(require_memoryUsage.d),this.locationMotion.set(locationValue,duration).then(()=>{this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state:toState,userAction:this.userAction}))},error=>{let state=Object.assign(Object.assign(Object.assign({},this.currentPano),{mode:this.mode}),clonePose(this.camera.pose));this.emit(`initAnimation.end`,createEvent(`initAnimation.end`,{state,userAction:this.userAction}))}).then(()=>{resolve()})})}getForwardObserverOrNot(raycaster){let[intersection]=this.modelScene.intersectRaycaster(raycaster);if(!intersection)return null;let observers=[];for(let work of this.works){let model=this.modelScene.models.find(model=>model.work===work);if(!(!model||model.visible===!1)&&!(work.observers.length<=0)&&(scratchObserverBox.copy(work.observerBox).expandByScalar(10).applyMatrix4(work.transform),scratchObserverBox.containsPoint(raycaster.ray.origin)||raycaster.ray.intersectsBox(scratchObserverBox)))for(let observer of work.observers)observers.push(observer)}let[observer,distance]=arrayMin(observers,observer=>scratchVector3.copy(observer.standingPosition).applyMatrix4(observer.work.transform).distanceTo(intersection.point),!0);return observer&&distance<Math.max(observer.standingPosition.distanceTo(this.camera.position)/5,10)?observer:null}coordinatesForOffset(offset){let size=this.renderer.getSize(new three_webgpu.Vector2);return{longitude:-2*offset.x/(size.x*this.viewport.width),latitude:2*offset.y/(size.y*this.viewport.height)}}requestMomentumMovement(event,isFirst,velocity,duration){if(this.inMomentumMovement===null)return;duration=Math.max(duration,1);let nextVelocity=Object.assign({},velocity),delta={longitude:0,latitude:0,x:0,y:0,z:0};for(let i=0;i<duration;i++)nextVelocity.longitude*=.996,nextVelocity.latitude*=.996*.998,nextVelocity.x*=.99,nextVelocity.y*=.99,nextVelocity.z*=.99,delta.longitude+=nextVelocity.longitude,delta.latitude+=nextVelocity.latitude,delta.x+=nextVelocity.x,delta.y+=nextVelocity.y,delta.z+=nextVelocity.z;let fov=this.cameraMotion.value.fov,longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude),offset=new three_webgpu.Vector3(this.locationMotion.value.x+delta.x,this.locationMotion.value.y+delta.y,this.locationMotion.value.z+delta.z),state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,offset,fov,distance:this.locationMotion.value.distance}),position=event.state.offset.clone().sub(coordinatesToVector(event.state).setLength(state.distance)),isFinal=!(Math.abs(nextVelocity.longitude)>1e-4||Math.abs(nextVelocity.latitude)>1e-4||Math.abs(nextVelocity.x)>1e-4||Math.abs(nextVelocity.y)>1e-4||Math.abs(nextVelocity.z)>1e-4);(this.cameraFence?this.cameraFence.containsPoint(position):!0)===!1&&(isFinal=!0);let gestureEvent=createEvent(`gesture.momentum`,Object.assign(Object.assign({},event),{isFirst,isFinal,state}));if(this.emit(`gesture.fire`,gestureEvent),this.inMomentumMovement.event=gestureEvent,this.emit(`gesture.momentum`,gestureEvent),event.defaultPrevented){this.inMomentumMovement=null;return}this.inMomentumMovement&&(this.cameraMotion.set({longitude,latitude},0).catch(require_memoryUsage.d),this.locationMotion.set({x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance},0).catch(require_memoryUsage.d),isFinal?this.inMomentumMovement=null:require_imageBitmap.s.shared.add((time,deltaTime)=>{this.requestMomentumMovement(event,!1,nextVelocity,deltaTime)},!0))}fixFinalState(state){if(this.perspToOrthoMotion.getTargetKeyframe().value.perspToOrtho===1)return;let direction=coordinatesToVector(state,new three_webgpu.Vector3),cameraPosition=new three_webgpu.Vector3().copy(state.offset).sub(direction.clone().setLength(state.distance)),raycaster=new three_webgpu.Raycaster(cameraPosition,direction);raycaster.params.Points={threshold:.1},raycaster.firstHitOnly=!0,raycaster.hitFilter=intersect=>intersect.distance>minDistance+raycaster.near,raycaster.near=this.camera.near,raycaster.far=this.camera.far;let intersect;if(intersect=this.modelScene.intersectRaycaster(raycaster)[0],intersect&&intersect.distance<this.camera.near&&(intersect=void 0),!intersect){let plane=new three_webgpu.Plane(new three_webgpu.Vector3(0,1,0),-this.modelScene.boundingBox.min.y),intersectOnPlane=raycaster.ray.intersectPlane(plane,new three_webgpu.Vector3);if(intersectOnPlane){let distance=intersectOnPlane.distanceTo(raycaster.ray.origin);distance<1e3&&distance>=raycaster.near&&(intersect={distance,floorIndex:0,floor:0,point:intersectOnPlane,object:this.scene,face:null})}}if(!intersect){let defaultDistance=Math.max(state.distance,3);intersect={distance:defaultDistance,floorIndex:0,floor:0,point:cameraPosition.clone().add(direction.clone().setLength(defaultDistance)),object:this.scene,face:null}}intersect.distance>=this.camera.near&¬SimilarValue(state.distance,intersect.distance)&&(state.distance=intersect.distance,state.offset=intersect.point)}onPanGesture(event){this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let pointerLength=event.pointers.length,lastPanState=this.panState,buttons=0,shiftKey=!1;event.pointerType===`mouse`&&(buttons=event.center.buttons,shiftKey=event.center.shiftKey),lastPanState&&buttons===0&&lastPanState.buttons!==0&&(buttons=lastPanState.buttons);let target=lastPanState==null?void 0:lastPanState.target;if(!target){let tapPosition=this.relativeClientPosition(event.center),raycaster=this.createRaycasterFromCamera(tapPosition,this.camera);target=new three_webgpu.Vector3().copy(raycaster.ray.direction).multiplyScalar(3).add(raycaster.ray.origin);let[intersect]=this.modelScene.intersectRaycaster(raycaster);if(!intersect&&raycaster.ray.direction.y<-.3){let plane=new three_webgpu.Plane(new three_webgpu.Vector3(0,1,0),0),intersectPlane=raycaster.ray.intersectPlane(plane,new three_webgpu.Vector3);if(intersectPlane){let distance=intersectPlane.distanceTo(raycaster.ray.origin);distance<1e4&&distance>=raycaster.near&&(intersect={distance,floorIndex:0,floor:0,point:intersectPlane,object:this.scene})}}if(intersect)target.copy(intersect.point);else{let normal=new three_webgpu.Vector3().copy(this.camera.pose.offset).sub(this.camera.position).normalize(),plane=new three_webgpu.Plane().setFromNormalAndCoplanarPoint(normal,this.camera.pose.offset);raycaster.ray.intersectPlane(plane,target)||target.copy(raycaster.ray.direction).setLength(this.camera.pose.distance).add(raycaster.ray.origin)}let maxTargetDistance=Math.max(this.camera.pose.distance*2,minDistance);target.distanceTo(raycaster.ray.origin)>maxTargetDistance&&target.copy(raycaster.ray.direction).setLength(maxTargetDistance).add(raycaster.ray.origin)}if(event.isFinal?this.panState=void 0:this.panState={target,buttons,pointerLength,x:event.center.x,y:event.center.y},!(lastPanState===void 0||lastPanState.pointerLength!==pointerLength))if(pointerLength>1||buttons===2||shiftKey){let screenOffset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),cameraPosition=coordinatesToVector(this.cameraMotion.value).setLength(this.locationMotion.value.distance).add(offset),targetDistance=new three_webgpu.Vector3().copy(cameraPosition).sub(lastPanState.target).length();targetDistance*=Math.tan(this.camera.pose.fov/2*Math.PI/180);let maxPanTargetDistance=Math.max(this.locationMotion.value.distance*2,minDistance);targetDistance=Math.min(targetDistance,maxPanTargetDistance);let renderSize=this.renderer.getSize(new three_webgpu.Vector2),panLeftDistance=2*screenOffset.x*targetDistance/renderSize.y,panUpDistance=2*screenOffset.y*targetDistance/renderSize.y,axies=new three_webgpu.Vector3;axies.setFromMatrixColumn(this.camera.matrix,0),axies.multiplyScalar(-panLeftDistance),offset.add(axies),this.camera.pose.latitude<PANGESTURE_FORWARD_ANGLE?axies.setFromMatrixColumn(this.camera.matrix,1):(axies.setFromMatrixColumn(this.camera.matrix,0),axies.crossVectors(this.camera.up,axies)),axies.multiplyScalar(panUpDistance),offset.add(axies);let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset,distance:this.camera.pose.distance});if(event.state=state,this.emit(`gesture.pan`,event),event.defaultPrevented)return;if(this.locationMotion.set({x:state.offset.x,y:state.offset.y,z:state.offset.z},0).catch(require_memoryUsage.d),event.isFinal&&(this.fixFinalState(state),Object.assign(event,{__fixFinalState:!0}),this.locationMotion.set({distance:state.distance,x:state.offset.x,y:state.offset.y,z:state.offset.z},0).catch(require_memoryUsage.d)),event.isFinal){let renderSize=this.renderer.getSize(new three_webgpu.Vector2),panLeftDistance=2*event.velocityX*targetDistance/renderSize.y,panUpDistance=2*event.velocityY*targetDistance/renderSize.y,axies=new three_webgpu.Vector3,offset=new three_webgpu.Vector3;axies.setFromMatrixColumn(this.camera.matrix,0),axies.multiplyScalar(-panLeftDistance),offset.add(axies),this.camera.pose.latitude<PANGESTURE_FORWARD_ANGLE?axies.setFromMatrixColumn(this.camera.matrix,1):(axies.setFromMatrixColumn(this.camera.matrix,0),axies.crossVectors(this.camera.up,axies)),axies.multiplyScalar(panUpDistance),offset.add(axies),this.inMomentumMovement={uuid:require_memoryUsage.N()},this.requestMomentumMovement(event,!0,{longitude:0,latitude:0,x:offset.x,y:offset.y,z:offset.z},0)}}else{let screenOffset={x:event.center.x-lastPanState.x,y:event.center.y-lastPanState.y},delta=this.coordinatesForOffset(screenOffset),longitude=formatRad$1(this.cameraMotion.value.longitude+delta.longitude),fov=this.camera.pose.fov,minLatitude=require_memoryUsage.M(typeof this.minLatitude==`function`?this.minLatitude(fov):this.minLatitude,-Math.PI/2,Math.PI/2),maxLatitude=require_memoryUsage.M(typeof this.maxLatitude==`function`?this.maxLatitude(fov):this.maxLatitude,-Math.PI/2,Math.PI/2),latitude=require_memoryUsage.M(this.cameraMotion.value.latitude+delta.latitude,minLatitude,maxLatitude);this.camera.aspect<1&&Math.abs(event.overallVelocityX)>.2&&Math.atan2(Math.abs(event.overallVelocityY),Math.abs(event.overallVelocityX))<Math.PI/6.923&&(latitude=this.cameraMotion.value.latitude);let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude,latitude,fov,offset:this.camera.pose.offset,distance:this.camera.pose.distance});if(event.isFinal&&Object.assign(event,{__fixFinalState:!0}),event.state=state,this.emit(`gesture.pan`,event),event.defaultPrevented)return;if(event.isFinal?this.locationMotion.set({distance:state.distance,x:state.offset.x,y:state.offset.y,z:state.offset.z},0).catch(require_memoryUsage.d):this.cameraMotion.set({longitude:state.longitude,latitude:state.latitude},0).catch(require_memoryUsage.d),event.isFinal){let x=event.velocityX,y=event.velocityY;this.inMomentumMovement={uuid:require_memoryUsage.N()},this.requestMomentumMovement(event,!0,Object.assign(Object.assign({},this.coordinatesForOffset({x,y})),{x:0,y:0,z:0}),0)}}}onPinchGesture(event){var _a;if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let startDistance=(_a=this.pinchState)==null?void 0:_a.distance;if(event.isFirst){this.pinchState={x:event.center.x,y:event.center.y,scale:1,distance:this.locationMotion.value.distance};return}if(startDistance===void 0)return;let boundingCenter=this.modelScene.boundingBox.getCenter(new three_webgpu.Vector3),maxDistance=MapviewController.distanceFromModel(this.modelScene,this.cameraMotion.value.fov,this.camera.aspect),nextDistance=require_memoryUsage.M(startDistance/event.scale,minDistance,1/0),cameraPostion=event.state.offset.clone().sub(coordinatesToVector(event.state).setLength(nextDistance)),cameraInBounding=this.modelScene.boundingBox.containsPoint(cameraPostion),distance;if(!cameraInBounding&&this.pinchState&&this.pinchState.scale>event.scale&&boundingCenter.distanceTo(cameraPostion)>maxDistance?distance=event.state.distance:(distance=nextDistance,this.pinchState&&(this.pinchState.scale=event.scale)),event.state.distance=distance,this.emit(`gesture.pinch`,event),!event.defaultPrevented&&(this.locationMotion.set({distance:event.state.distance},0).catch(require_memoryUsage.d),event.pointerType!==`mouse`&&(event.type=`gesture.pan`,this.onPanGesture(event)),event.isFinal)){if(!(`__fixFinalState`in event)){let state=event.state;this.fixFinalState(event.state);let locationMotionValue={x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance};this.locationMotion.set(locationMotionValue,0).catch(require_memoryUsage.d)}this.panState=void 0,this.pinchState=void 0}}onMouseMove(event){var _a,_b;if(!this.intersectMesh.parent||this.panState||this.pinchState||this.mouseWheelState||(this.emit(`gesture.mousemove`,event),event.defaultPrevented))return;let raycaster=event.center.raycaster;if(event.isFinal&&this.intersectMesh.parent&&this.intersectMesh.visible===!0){this.hideIntersectMesh();return}let[intersection]=this.modelScene.intersectRaycaster(raycaster),intersectEvent=createEvent(`intersect.update`,{raycaster,intersection:intersection==null?null:intersection,object:this.intersectMesh});if(this.emit(`intersect.update`,intersectEvent),intersectEvent.defaultPrevented){this.hideIntersectMesh();return}if(intersection){let face=(_b=(_a=intersection.face)==null?void 0:_a.normal)==null?new three_webgpu.Vector3().copy(raycaster.ray.direction).multiplyScalar(-1):_b,positionVector=face.clone(),position=intersection.point.clone();this.intersectMesh.position.copy(position);let lookAtVector=position.clone().add(positionVector);if(this.intersectMesh.lookAt(lookAtVector),Math.abs(face.y)>.99){let _vector=this.camera.position.clone().sub(position);this.intersectMesh.rotation.z=-Math.atan2(_vector.z,_vector.x)}this.intersectMesh.visible=!0,this.needsRender=!0}else this.hideIntersectMesh()}onMouseWheel(event){if(this.initAnimationIsReady)if(this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh(),event.isFinal){let state=Object.assign(Object.assign({},this.currentPano),{mode:this.mode,longitude:this.cameraMotion.value.longitude,latitude:this.cameraMotion.value.latitude,fov:this.cameraMotion.value.fov,offset:new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),distance:this.locationMotion.value.distance});if(this.fixFinalState(state),this.emit(`gesture.mousewheel`,event),event.defaultPrevented)return;let locationMotionValue={x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance};this.locationMotion.set(locationMotionValue,0).catch(require_memoryUsage.d)}else{let maxDistance=MapviewController.distanceFromModel(this.modelScene,this.cameraMotion.value.fov,this.camera.aspect),offset=new three_webgpu.Vector3(this.locationMotion.value.x,this.locationMotion.value.y,this.locationMotion.value.z),direction=coordinatesToVector(this.cameraMotion.value,new three_webgpu.Vector3).negate(),intersect=new three_webgpu.Ray(offset,direction).intersectBox(this.modelScene.boundingBox,new three_webgpu.Vector3);intersect&&(maxDistance+=intersect.distanceTo(offset));let distance=Math.max(this.locationMotion.value.distance-this.camera.near,0),delta=event.center.delta/10*Math.max(distance/5,.1);if(distance<=maxDistance||delta>0)if(this.locationMotion.value.distance-delta>=minDistance){let nextDistance=this.locationMotion.value.distance-delta;event.state.distance=nextDistance}else{let direction=coordinatesToVector(this.cameraMotion.value);direction.setLength(delta),event.state.offset.add(direction)}if(this.emit(`gesture.mousewheel`,event),event.defaultPrevented)return;this.locationMotion.set({distance:event.state.distance,x:event.state.offset.x,y:event.state.offset.y,z:event.state.offset.z},0).catch(require_memoryUsage.d)}}onTapGesture(event){var _a;this.userAction=event.userAction,this.stopMomentumMovement();let raycaster=event.center.raycaster,observer=this.getForwardObserverOrNot(raycaster);if(!observer)this.emit(`gesture.tap`,event);else{let options={longitude:this.camera.pose.longitude,latitude:0},state=Object.assign(Object.assign({},event.state),{mode:`Panorama`,workCode:observer.work.workCode,panoIndex:observer.panoIndex,longitude:options.longitude,latitude:options.latitude,offset:observer?observer.position.clone():new three_webgpu.Vector3,distance:0});if(event.state=state,this.emit(`gesture.tap`,event),!event.defaultPrevented&&(this.emit(`pano.select`,createEvent(`pano.select`,{prevPano:this.currentPano,state,userAction:event.userAction,options,progress:0,error:null})),observer&&observer.active)){let pendingTextureId=this.pendingTextureId=require_memoryUsage.N(),panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),imageURLTransform=this.imageOptions.transform,imageURLOptions=Object.assign({key:`pano.${panoId}`},require_pick.r(this.imageOptions,[`format`,`size`,`quality`,`sharpen`,`forceUseExifOrientation`,`mappings`])),colorImageURLs={right:observer.images.work.getURL(observer.images.right),left:observer.images.work.getURL(observer.images.left),up:observer.images.work.getURL(observer.images.up),down:observer.images.work.getURL(observer.images.down),front:observer.images.work.getURL(observer.images.front),back:observer.images.work.getURL(observer.images.back)},gainmapImageURLs,gainmapConfigUrl,gainmap=this.enableHDR?observer.images.gainmap:void 0;gainmap&&(gainmapImageURLs={right:observer.images.work.getURL(gainmap.right),left:observer.images.work.getURL(gainmap.left),up:observer.images.work.getURL(gainmap.up),down:observer.images.work.getURL(gainmap.down),front:observer.images.work.getURL(gainmap.front),back:observer.images.work.getURL(gainmap.back)},gainmapConfigUrl=observer.images.work.getURL(gainmap.cfg));let hash=`pano:`+jsonHash([colorImageURLs,gainmapImageURLs,imageURLOptions]),parameter=this.modelScene.parameter,existsPano;if(parameter.pano0&¶meter.pano0.map.name===hash?existsPano=parameter.pano0:parameter.pano1&¶meter.pano1.map.name===hash&&(existsPano=parameter.pano1),existsPano)parameter.pano0&¶meter.pano0.map!==existsPano.map&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==existsPano.map&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:existsPano,pano1:existsPano}),this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,progress:0,state,options,error:null}));else{let colorTextureTask=this.textureLoader.loadCubeTexture(colorImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer),gainmapTask=gainmapConfigUrl&&gainmapImageURLs?Promise.all([getFetcher(this.fiveId,observer.work).ajax(gainmapConfigUrl,{responseType:`text`}).then(response=>require_memoryUsage.A(JSON.parse(response.body))),this.textureLoader.loadCubeTexture(gainmapImageURLs,{imageURL:{transform:imageURLTransform,options:imageURLOptions},format:three_webgpu.RGBAFormat,colorSpace:three_webgpu.NoColorSpace,viaAjax:!0,fetcher:getFetcher(this.fiveId,observer.work)},void 0,void 0,void 0,this.renderer)]).then(([config,gainmapResponse])=>({config,map:gainmapResponse.body})):Promise.resolve(void 0);Promise.all([colorTextureTask,gainmapTask]).then(_a=>(0,tslib.__awaiter)(this,[_a],void 0,function*([response,gainmap]){var _b,_c;let{body:texture}=response;if(this.destroyed||this.pendingTextureId!==pendingTextureId){texture.dispose();return}this.pendingTextureId=null,texture.name=hash;let image=Array.isArray(texture.image)?texture.image[0]:texture.image,mapSize=(_b=image==null?void 0:image.width)==null?2048:_b,rgbaData=yield getRgbaDataFromCubeTexture(this.renderer,texture,!0,sharedHistogramRgbaData),mapHistogram=new Histogram().formPixels(rgbaData.data),panoPicture={panoId,map:texture,mapSize,mapHistogram:new three_webgpu.Vector4().fromArray(mapHistogram.toArray()),matrix:observer.matrix.clone().premultiply(observer.work.transform),zoom:1,gainmap:gainmap?{map:gainmap.map,cfg:gainmap.config}:void 0};parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_c=parameter.pano0)==null?void 0:_c.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:panoPicture,pano1:panoPicture}),this.emit(`pano.request`,createEvent(`pano.request`,{userAction:!0,prevPano:this.currentPano,progress:0,state,options,error:null}))})).catch(error=>{this.destroyed||this.pendingTextureId!==pendingTextureId||(this.pendingTextureId=null)})}}}}onDblTapGesture(event){if(!this.initAnimationIsReady)return;this.userAction=event.userAction,this.stopMomentumMovement(),this.hideIntersectMesh();let state=event.state,raycaster=event.center.raycaster,offset=raycaster.ray.origin.clone().add(raycaster.ray.direction.clone().setLength(3)),distance=1,[intersect]=this.modelScene.intersectRaycaster(raycaster);if(intersect&&(offset=intersect.point.clone(),distance=intersect.distance>4/2?1:3),event.state.distance=distance,event.state.offset=offset,this.emit(`gesture.dbltap`,event),event.defaultPrevented)return;let locationMotionValue={x:state.offset.x,y:state.offset.y,z:state.offset.z,distance:state.distance};this.locationMotion.set(locationMotionValue,360).catch(require_memoryUsage.d),this.hideIntersectMesh()}hideIntersectMesh(){this.intersectMesh.visible===!0&&(this.intersectMesh.visible=!1,this.needsRender=!0)}}},controllersDefaultInitArgs={Floorplan:defaultFloorplanControllerCustomInitArgs,Topview:defaultTopviewControllerCustomInitArgs,Panorama:defaultPanoramaControllerCustomInitArgs,VRPanorama:defaultVRPanoramaControllerCustomInitArgs,XRPanorama:defaultXRPanoramaControllerCustomInitArgs,Model:defaultModelControllerCustomInitArgs,Mapview:defaultMapviewControllerCustomInitArgs},PROXY_CONTROLLER_EVENT_NAMES=`gesture.pan,gesture.tap,gesture.dbltap,gesture.press,gesture.pinch,gesture.mousewheel,gesture.mousemove,gesture.momentum,gesture.fire,initAnimation.start,initAnimation.end,camera.update,intersect.update,pano.select,pano.moveTo,pano.moving,pano.arrived,pano.cancel,pano.error,pano.prepare,pano.texture.load,pano.texture.progress,pano.texture.success,pano.texture.error,pano.texture.abort,xr.session.start,xr.session.end,xr.gesture.tap,xr.gesture.press,xr.gesture.buttonUp,xr.gesture.buttonDown,xr.controller.update`.split(`,`);function initLegacyEvent(five){five.on(`initAnimation.start`,event=>{five.emit(`initAnimationWillStart`,event.state.panoIndex,event.state,event.userAction)}),five.on(`initAnimation.end`,event=>{five.emit(`initAnimationEnded`,event.state.panoIndex,event.state,event.userAction)}),five.on(`gesture.pan`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`pan`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsPanGesture`,event.state,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`pan`,event.pointers,event.isFinal),five.emit(`panGesture`,event.state,event.isFinal))}),five.on(`gesture.tap`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`tap`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsTapGesture`,event.center.raycaster,event.center.coords,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`tap`,event.pointers,event.isFinal),five.emit(`tapGesture`,event.center.raycaster,event.center.coords,event.isFinal))}),five.on(`gesture.dbltap`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`dbltap`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsDblTapGesture`,event.center.raycaster,event.center.coords,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`dbltap`,event.pointers,event.isFinal),five.emit(`dblTapGesture`,event.center.raycaster,event.center.coords,event.isFinal))}),five.on(`gesture.press`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`press`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsPressGesture`,event.center.raycaster,event.center.coords,event.center.delta,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`press`,event.pointers,event.isFinal),five.emit(`pressGesture`,event.center.raycaster,event.center.coords,event.center.delta,event.isFinal))}),five.on(`gesture.pinch`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`pinch`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsPinchGesture`,event.scale,event.state.fov,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`pinch`,event.pointers,event.isFinal),five.emit(`pinchGesture`,event.scale,event.state.fov,event.isFinal))}),five.on(`gesture.mousewheel`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`mouseWheel`,event.pointers,event.isFinal),canceled&&event.preventDefault(),canceled=five.emit(`wantsMouseWheel`,event.center.delta,event.state.fov,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`mouseWheel`,event.pointers,event.isFinal),five.emit(`mouseWheel`,event.center.delta,event.state.fov,event.isFinal))}),five.on(`gesture.mousemove`,event=>{let canceled=!1;canceled=five.emit(`wantsGesture`,`mouseMove`,event.pointers,event.isFinal),canceled&&event.preventDefault(),event.defaultPrevented||(five.emit(`gesture`,`mouseMove`,event.pointers,event.isFinal),canceled=five.emit(`wantsChangeCameraFov`,event.state.fov),canceled&&event.preventDefault())}),five.on(`gesture.momentum`,event=>{let canceled=!1;canceled=five.emit(`wantsInteriaPan`,event.state),canceled&&event.preventDefault(),event.defaultPrevented||five.emit(`interiaPan`,event.state,event.isFinal)}),five.on(`camera.update`,event=>{five.emit(`cameraFovUpdate`,event.state.fov,event.userAction),five.emit(`cameraDirectionUpdate`,event.state,event.userAction);let vector=coordinatesToVector(event.state);vector.setLength(event.state.distance);let position=event.state.offset.clone().sub(vector);five.emit(`cameraPositionUpdate`,position,event.userAction),five.emit(`cameraUpdate`,event.state,event.userAction)}),five.on(`intersect.update`,event=>{if(event.intersection){let canceled=!1;canceled=five.emit(`wantsShowIntersectionOnModel`,event.raycaster),canceled&&event.preventDefault(),event.defaultPrevented||five.emit(`intersectionOnModelUpdate`,event.intersection,event.object)}else five.emit(`intersectionHidden`)}),five.on(`pano.request`,event=>{let canceled=five.emit(`wantsMoveToPano`,event.state.panoIndex,event.options,event.userAction);canceled||(canceled=five.emit(`wantsToMoveToPano`,event.state.panoIndex,event.options,event.userAction)),canceled&&event.preventDefault(),event.defaultPrevented||five.emit(`panoWillLoad`,event.state.panoIndex)}),five.on(`pano.select`,event=>{five.emit(`panoSelected`,event.state.panoIndex)}),five.on(`pano.moveTo`,event=>{five.emit(`panoLoaded`,event.state.panoIndex),five.emit(`moveToPano`,event.state.panoIndex,event.userAction),five.emit(`panoWillArrive`,event.state.panoIndex,event.state,event.userAction)}),five.on(`pano.moving`,event=>{five.emit(`movingToPano`,event.state.panoIndex,event.prevPano.panoIndex,event.progress)}),five.on(`pano.arrived`,event=>{five.emit(`panoArrived`,event.state.panoIndex,event.state,event.userAction)}),five.on(`pano.cancel`,event=>{five.emit(`moveToPanoCanceled`,event.state.panoIndex)}),five.on(`pano.error`,event=>{five.emit(`panoLoadError`,event.error,event.state.panoIndex)}),five.on(`pano.texture.load`,event=>{five.emit(`textureStartLoad`,event.pano.panoIndex)}),five.on(`pano.texture.success`,event=>{five.emit(`textureLoaded`,event.pano.panoIndex,event.meta)}),five.on(`pano.texture.error`,event=>{five.emit(`textureError`,event.error,event.pano.panoIndex)}),five.on(`pano.texture.abort`,event=>{five.emit(`textureAbort`,event.pano.panoIndex)}),five.on(`pano.texture.progress`,event=>{five.emit(`textureLoading`,event.progress,event.pano.panoIndex)}),five.on(`xr.session.start`,event=>{five.emit(`webXRSessionStart`)}),five.on(`xr.session.end`,event=>{five.emit(`webXRSessionEnd`)}),five.on(`xr.gesture.tap`,event=>{five.emit(`webXRControllerEvent`,`tap`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.gesture.press`,event=>{five.emit(`webXRControllerEvent`,`press`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.gesture.buttonUp`,event=>{five.emit(`webXRControllerEvent`,`buttonUp`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.gesture.buttonDown`,event=>{five.emit(`webXRControllerEvent`,`buttonDown`,event.buttons,{raycaster:event.controllers.raycaster})}),five.on(`xr.controller.update`,event=>{five.emit(`webXRControllerRayUpdate`,{leftRay:event.left?event.left.raycaster:void 0,rightRay:event.right?event.right.raycaster:void 0}),event.left&&five.emit(`webXRAxesUpdate`,`left`,{raycaster:{leftRay:event.left?event.left.raycaster:void 0,rightRay:event.right?event.right.raycaster:void 0},axesState:{up:event.left.axes.up,down:event.left.axes.down,left:event.left.axes.left,right:event.left.axes.right},deltaTime:event.left.deltaTime}),event.right&&five.emit(`webXRAxesUpdate`,`right`,{raycaster:{leftRay:event.left?event.left.raycaster:void 0,rightRay:event.right?event.right.raycaster:void 0},axesState:{up:event.right.axes.up,down:event.right.axes.down,left:event.right.axes.left,right:event.right.axes.right},deltaTime:event.right.deltaTime})}),five.on(`works.request`,event=>{five.emit(`willLoad`,event.input,event.works[0],five.getCurrentState())}),five.on(`works.load`,event=>{five.emit(`load`,event.input,event.works[0],five.getCurrentState())}),five.on(`works.ready`,event=>{five.emit(`loaded`,event.input,event.works[0])}),five.on(`state.change`,event=>{five.emit(`stateChange`,event.state,event.userAction)}),five.on(`currentState.change`,event=>{five.emit(`currentStateChange`,event.state,event.userAction)}),five.on(`state.set`,event=>{five.emit(`setState`,event.state)}),five.on(`state.synced`,event=>{five.emit(`stateSynced`,event.state)}),five.on(`model.request`,event=>{five.emit(`modelWillLoad`,event.work.model)}),five.on(`model.error`,event=>{five.emit(`modelLoadError`,event.error,event.model)}),five.on(`model.load`,event=>{five.emit(`modelLoaded`,event.model)}),five.on(`model.changeShownFloor`,event=>{five.emit(`modelShownFloorChange`,event.model.shownFloor,event.model.floorLength)}),five.on(`render`,event=>{five.emit(`renderFrame`,event.needsRender)}),five.on(`mode.change.request`,event=>{five.emit(`wantsChangeMode`,event.mode,event.prevMode)}),five.on(`mode.change`,event=>{five.emit(`modeChange`,event.mode,event.prevMode,event.state.panoIndex,event.state,event.userAction)}),five.on(`helpers.visible`,event=>{five.emit(`helpersVisibleChange`,event.object.visible)}),five.on(`network.resource`,event=>{five.emit(`network`,event.source,event.requestType,event.requestState,event.detail)})}function generateDefaultVideoElement(){if(typeof window<`u`){let video=document.createElement(`video`);video.loop=!0,video.autoplay=!0,video.playsInline=!0,video.muted=!0,video.crossOrigin=``;let userDoSomething=()=>{document.removeEventListener(`touchstart`,userDoSomething,!1),document.removeEventListener(`mousedown`,userDoSomething,!1),video.muted=!1};return document.addEventListener(`touchstart`,userDoSomething,!1),document.addEventListener(`mousedown`,userDoSomething,!1),video}else return{}}function initLights(){let lightGroup=new three_webgpu.Group;lightGroup.name=`internalLights`;{let light=new three_webgpu.DirectionalLight(16777215,.1*Math.PI);light.name=`direction0`,light.position.copy(new three_webgpu.Vector3(0,1,0)),lightGroup.add(light)}{let light=new three_webgpu.DirectionalLight(16777215,.1*Math.PI);light.name=`direction1`,light.position.copy(new three_webgpu.Vector3(-1,-1,-1)),lightGroup.add(light)}{let light=new three_webgpu.DirectionalLight(16777215,.3*Math.PI);light.name=`direction2`,light.position.copy(new three_webgpu.Vector3(1,1,1)),lightGroup.add(light)}{let light=new three_webgpu.AmbientLight(16777215,.6*Math.PI);light.name=`ambient0`,lightGroup.add(light)}return lightGroup}function parseKeyValue(content){var _a,_b;let result={},keyValueArray=content.split(/(\;|\,)/);for(let keyValue of keyValueArray){let pair=keyValue.split(`=`),key=(_a=pair[0])==null?void 0:_a.trim(),value=(_b=pair[1])==null?void 0:_b.trim();key&&value&&(result[key]=value)}return result}function getViewportScale(){var _a;if(typeof document<`u`){let metaElements=document.getElementsByTagName(`meta`);for(let i=0;i<metaElements.length;i++){let metaElement=metaElements[i];if(metaElement.getAttribute(`name`)===`viewport`){let data=parseKeyValue((_a=metaElement.getAttribute(`content`))==null?``:_a),scale=Number(data[`initial-scale`]);if(!isNaN(scale))return scale}}}return 1}var _a,REALSEE={zh:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAA/BAMAAACBTdUFAAAAKlBMVEUAAAAFBQX////////////////h4eH7+/v////6+vr+/v7y8vL39/f////F8IQiAAAADnRSTlMABWZXSF4LK042PRYhY9/9jA4AAAeTSURBVGje7dr5axNBFAfwKWqiJj9kUOMR/eWl0ZgmYBNTxCpoTBEv0MSx9YLUSryhrUfxAq0HHghavA+o94FCUvGsglWsBwoa8db/xfdmmm5io4ZmrVrzhWbH2ey6n30zswst+8O5MzrCunNWHPT59rLuG8PzbWGfbx7rtrk1yUcZ012H6cqDfl+3FppxgHZv4SOfr3sLDb40oSHKulv6pApxTgarVf+S/R1vxrMY+4vSnLwaUzP7WXqkCFdsCAaD05Vm304mc+cK5oFsGr/S1nyFsi6nqR+kTNmU26yAUUylN0SyFIpz8j+WwHP+0diuZma/wMyjotatERc3MXZeUD7kcnVGUCnvWqE/AUHKVClEGOYT6ylksHj3abuw0SxUGnMS0vIdAijpSuFCAE+KcJsII1rEqiqam5vviGoSUkqM4gT23PNPyEkoJ/ldKOxCYQg0IWWFf2c0ulw8qKqgeUPCJXV1davFfiO1mSFH4QFOaYIHXSeENCERtuA62yYklcyhioiewsHQ2GVCfxZC2pbKtimmj9AGWxjlRxeo9Ru0T9XqIIz8Qjg+K+F13GLbtKNRH6EVZlnweVTm2BPDTvlM6nNFztDL9K2znrHVsityO0GXscH75iJuZMtxOE24zGufTP1XGZObTgoNZfNk2yxyFA5sFxZzbkwAwEhi0ykXATkbXIwZ6rHfGSHASrw2xpYCRj6lF2PDEUsRrvCqXbVORgkVdUpI/9wp26YchQVJ4VCYyK0Bz+5nM/DyDPCK4TXKZdbrZuwGjK07CvMJcAPefGWmkP3i+noHVtvqdUx+Vv8ZituFN5wnN4TsMdZLzkgz2jsnfCxK9RUOwe1gmM+5KYRFq0cWC+DVIXYmKl0F3LLZUcAHgbe0wMB7QCMVHPf0hBLOBzqh2KJONwjq8XxL8ci+eH9of3XnhCa/qIjoIeRJYa0nzlc54tiqgjivdXFuCQWGc9x/mg/GH2rVoNBZic0GlzxkBOdN9kpq4RAnIt2CkRwPrXdzE90atsoT6ZyQXm8adRJeiEajK1fTlQXwhyRb+SKslw3uI6E/tKCcGNw7EwHvaM4m5nBMP/wSUqiFQk5nwy/IXQ/ttAvRtYWsc8JDKCzXSdiWiZwn3nGMxTscLzTOB9v7F3LUcaoopcGN/aqa9ImlbbESjTpowwpIeECRK/nDQipmUVbCHbiq9E0VmsVoURaO6SmcxrkNi0c5UyTH7iDXQA9Ww4W0EVwWZgQCWiStRi1ONTa6MXQkCSnqC3wIbnp5KnHHqGyErKwUF6lwRBNWiTrxTOzMXViAlt3Hjh3bdJOuWJWGQFSbRW4rtBCXB5y7KPUuWVsaubtk4HTbIVZNiMVT96DtZ39WwkPluGDPZprw1GyjaN0xVx/hAa6iLTo0JYfz2tfce4CHZuEEBJXCNkC/9pGdPCShCZOnIjbVMSvhDVw3z5enCF+WGMWD6+91F55OCmmdDEzkDcU26gu4jskcIaGs4WXVUZM8pEMN6ayBIpqLWQl70rtLSYqw6gEKjSXGr9i/37Bwiz5CmlSUM25cYAp5qIY3DR8McdWhAdQsU8kwD+PJeUhTOODmlmyEZrHgEcI0oYmhkMVMV3Cxudp6vFoPoTab6ouwTB4bYgaM6GeXRU0XasdY1eI09PuVpj9BB3isieLshOxQ2D+PaUIMCSl9BRaX6SPkXrcqyCxCPENb/8Imwj10csq1LyQkkHIN+drCQ0WypQlVUVd55FCto5NnIyTHhczCqrBfP6GS9IcaeqhfGolOT0ORKoyStwnbnvNN7Y/KRSlCSW4YKQu8CyqzFPYRCMooXDuvLBchU8K0ApyxUztA1bFCqFja5su3uRoSKlscd3pH4EjETmylCO24a6B6dwjg6vtDoSN9lApRmlFo8s/XUWgLOVutT+GLrCfMomKpvWc8J/iSUCFPCofAx7h1LUxEC7harY+d3nahI1Aet50hN53D/WOhUxNSCefiG0wm4VLRmJuwQBNilgIkqAiYYbKeDRBXiz98BepQQur3JGSB+GOAEJSkCKvAAXST5HNz1o+Fo1OEhvOierEozSA07aiI6Cnkh3D0nObts5E32VX/dQAYxzWhzQtgb5GtfQCfKqWQSSG/hvWJ87an4o+EnopginC5KGcGLKIUmlOFq9Gdm5Dx9KzchIQMsdW1pnfcwi+mt5Insz7ZKLfq/TvT08ILb7YHU4VlYdQsFiVV4RcvXjzXhEiviLHzc29GI7mspjrF0uFk9EbznbAnAcPbxhBOExp2jJOf83sKmVi7cDM9Qx4Ln29CbkXUxZphRATc3wtNPp9/9MllwXQhOytNSyeY/AScqxaftyi8QXSjROcWHYiWjqewqoUmLU99k2OsjyaczCjNar2JsSXHMCjDmDYSLqJ+I3WZ6ZNchOmnyLzQkOImY6nCaSzL/HGiJcM4GNBhoaGkC6tZFycLSebhnGmo1zppx0+F09kfiGJkWSkNmIEYjeIRPxNO3fgX/bWC8qVCtIL+bM1iPxFevMn+6WhF7xAjPe+ntLJ/PljBzDGc+7sG6G/Ikil/1V+S5JNPPvnkk08++eSTTz75/Mf5Bj4kNYKQE/CLAAAAAElFTkSuQmCC`,en:`data:image/png;base64,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`},realsee_png_data_url_default=typeof navigator<`u`?(_a=REALSEE[navigator.language.split(`-`)[0]])==null?REALSEE.en:_a:REALSEE.zh,imageSize=[450,63],imageOffset=[20,20],vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,-.5,.5,0,.5,.5,0]),uvs=new Float32Array([0,0,1,0,0,1,1,1]),index=new Uint8Array([0,1,2,1,3,2]),geometry=new three_webgpu.BufferGeometry;geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),geometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),geometry.setIndex(new three_webgpu.BufferAttribute(index,1));var material=new three_webgpu.MeshBasicMaterial({transparent:!0,depthTest:!1,depthWrite:!1,stencilWrite:!1,fog:!1}),mesh=new three_webgpu.Mesh(geometry,material);mesh.matrixAutoUpdate=!1;var scene=new three_webgpu.Scene;scene.add(mesh),scene.matrixAutoUpdate=!1;var camera=new three_webgpu.OrthographicCamera(-.5,.5,.5,-.5,.1,1);camera.position.set(0,0,.5),camera.lookAt(0,0,0),camera.updateMatrixWorld(!0),camera.matrixAutoUpdate=!1;var prevViewport=new three_webgpu.Vector4,prevScissor=new three_webgpu.Vector4;function renderPoweredByRealsee(renderer){if(material.map){let viewport=renderer.getViewport(prevViewport),scissor=renderer.getScissor(prevScissor),scissorTest=renderer.getScissorTest(),autoClear=renderer.autoClear,width=imageSize[0]/3,height=imageSize[1]/3,x=scissor.x+imageOffset[0]/3,y=scissor.y+scissor.height-imageOffset[1]/3-height;renderer.setViewport(x,y,width,height),renderer.setScissor(x,y,width,height),renderer.setScissorTest(!0),renderer.autoClear=!1,renderer.render(scene,camera),renderer.setViewport(viewport),renderer.setScissor(scissor),renderer.setScissorTest(scissorTest),renderer.autoClear=autoClear}else{let texture=new three_webgpu.Texture,image=new Image;image.onload=()=>{texture.image=image,texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.minFilter=three_webgpu.LinearFilter,texture.needsUpdate=!0,texture.generateMipmaps=!1,material.needsUpdate=!0,image.onload=require_memoryUsage.d},image.src=realsee_png_data_url_default,material.map=texture}}function requestDeviceOrientationPermission(){return typeof location>`u`||location.protocol!==`https:`?Promise.reject(Error(`Request DeviceOrientation Permission denied.`)):typeof DeviceOrientationEvent<`u`&&typeof DeviceOrientationEvent.requestPermission==`function`?DeviceOrientationEvent.requestPermission().then(response=>{if(response==`granted`)return Promise.resolve();{let error=Error(`Request DeviceOrientation Permission denied.`);return Promise.reject(error)}}):Promise.resolve()}function requestXRSessionPermission(){if(`xr`in navigator)return navigator.xr.isSessionSupported(`immersive-vr`).then(supported=>supported?Promise.resolve():Promise.reject()).then(()=>navigator.xr.requestSession(`immersive-vr`,{optionalFeatures:[`local-floor`]}).then(session=>Promise.resolve(session)));{let error=Error(`Request XR Permission denied.`);return Promise.reject(error)}}var DEFAULT_MODE_CHANGE_DURATION=800,DEFAULT_CAMERA_FOV=90,DEFAULT_REQUEST_PROXY=url=>url.replace(`//vrlab-public.ljcdn.com/`,`//vr-public.realsee-cdn.cn/`).replace(`//vrlab-image4.ljcdn.com/`,`//vr-image-4.realsee-cdn.cn/`).replace(`//vrlab-image3.ljcdn.com/`,`//vr-image-3.realsee-cdn.cn/`).replace(`//vrlab-image2.ljcdn.com/`,`//vr-image-2.realsee-cdn.cn/`).replace(`//vrlab-image1.ljcdn.com/`,`//vr-image-1.realsee-cdn.cn/`),scratchSphere=new three_webgpu.Sphere,scratchBox3=new three_webgpu.Box3,scratchViewport=new three_webgpu.Vector4,scratchScissor=new three_webgpu.Vector4,scratchClearColor=new three_webgpu.Color,scratchRenderSize=new three_webgpu.Vector2,worksMap=new WeakMap,emptyWorks=createWorks([parseWork(null)]),Five_Instances={},Five=class Five extends require_memoryUsage.j{static get version(){return`1.0.0-alpha.15`}static get dracoPath(){return require_glTF_helpers.r.decoderPath}static set dracoPath(path){require_glTF_helpers.r.setDecoderPath(path)}static get ktx2Path(){return require_glTF_helpers.n.transcoderPath}static set ktx2Path(path){require_glTF_helpers.n.setTranscoderPath(path)}static get useNativeImageBitmap(){return require_imageBitmap.t()}static set useNativeImageBitmap(enable){require_imageBitmap.o(enable)}constructor(initArgs={}){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l,_m;if(super(),this.pbmGaussianSplattingRenderMesh=null,this.fiveId=require_memoryUsage.N(),Five_Instances[this.fiveId]=this,this.currentUpdateArgs={time:require_memoryUsage.p(),args:[]},this.currentMode=`Panorama`,this.pano={workCode:``,panoIndex:0},this.needsRender=!0,this.onlyRenderIfNeeds=(_a=initArgs.onlyRenderIfNeeds)==null?!0:_a,this.imageOptions=Object.assign({},(_b=initArgs.imageOptions)==null?{}:_b),this.textureOptions=Object.assign({},(_c=initArgs.textureOptions)==null?{}:_c),this.poweredByRealsee=(_d=initArgs.poweredByRealsee)==null?!0:_d,this.backgroundColor=new three_webgpu.Color((_e=initArgs.backgroundColor)==null?1579548:_e),this.backgroundAlpha=(_f=initArgs.backgroundAlpha)==null?1:_f,this.extraElements=[],this.controllerInits={Panorama:Object.assign({},initArgs.panorama),Model:Object.assign({},initArgs.model),Floorplan:Object.assign({},initArgs.floorplan),Topview:Object.assign({},initArgs.topview),Mapview:Object.assign({},initArgs.mapview),VRPanorama:Object.assign({},initArgs.vrPanorama),XRPanorama:Object.assign({},initArgs.xrPanorama)},this.fps={testCount:0,testTime:require_memoryUsage.p()},this.modeChangeDuration=(_g=initArgs.modeChangeDuration)==null?DEFAULT_MODE_CHANGE_DURATION:_g,this.enableWheel=(_h=initArgs.enableWheel)==null?!0:_h,this._enableHDR=!!initArgs.enableHDR&&canWebGPU&&!initArgs.forceWebGL,typeof window<`u`)if(`renderer`in initArgs)initArgs.renderer instanceof InternalWebGPURenderer&&this.throwError(Error(`cannot render a internal renderer`)),this.renderer=initArgs.renderer;else try{this.renderer=new InternalWebGPURenderer({outputType:this._enableHDR?three_webgpu.HalfFloatType:void 0,logarithmicDepthBuffer:initArgs.logarithmicDepthBuffer,forceWebGL:(_j=initArgs.forceWebGL)==null?!1:_j});let viewportScale=getViewportScale();this.renderer.setPixelRatio(viewportScale===1?window.devicePixelRatio:1),this.renderer.setSize(512,512),this.renderer.setClearColor(this.backgroundColor,this.backgroundAlpha)}catch(anyError){let error=anyError instanceof Error?anyError:Error(String(anyError));this.throwError(error)}this.getPixelsRenderTarget=new three_webgpu.RenderTarget(1,1,{colorSpace:(_l=(_k=this.renderer)==null?void 0:_k.outputColorSpace)==null?three_webgpu.SRGBColorSpace:_l,generateMipmaps:!1}),this.renderer&®isterPBMMaterials(this.renderer),this.viewport=Object.assign({left:0,bottom:0,width:1,height:1},initArgs.viewport),this.camera=new Camera(DEFAULT_CAMERA_FOV),this.scene=new Scene,this.scene.background=this.backgroundColor,this.xrCustomObjectsScene=new three_webgpu.Scene,this.scene.add(this.xrCustomObjectsScene),this.scene.matrixAutoUpdate=!1,this.requestProxy=(_m=initArgs.requestProxy)==null?DEFAULT_REQUEST_PROXY:_m,this.networkSubscribe=new require_memoryUsage.c,this.networkSubscribe.on(`network`,(source,type,state,detail)=>{var _a;this.emit(`network.resource`,createEvent(`network.resource`,{source,requestType:type,requestState:state,detail})),(_a=this.analysis)==null||_a.network(this.works,source,type,state,detail)}),this.readyCallbacks=[],this.syncingState=!1,this.helperGroup=new three_webgpu.Group,this.helperGroup.name=`helper`,this.helperGroup.matrixAutoUpdate=!1,this.scene.add(this.helperGroup),worksMap.set(this,emptyWorks),this.modelScene=new ModelScene({fiveId:this.fiveId}),this.modelScene.addEventListener(`model.create`,event=>{this.bindModel(event.model)}),this.scene.add(this.modelScene);let[emptyModel]=this.modelScene.setModels(emptyWorks,{forceReplaceImmediately:!0});defineProperty(emptyModel,`loaded`,{get(){return!1},set(_value){}}),this.videoTexture=new three_webgpu.VideoTexture(initArgs.videoInstance||generateDefaultVideoElement());let lights=initLights();this.scene.add(lights),this.state={mode:this.currentMode,workCode:this.pano.workCode,panoIndex:this.pano.panoIndex,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance},this.stateSynced=!1,this.destroyed=!1,this.paused=!0,typeof window<`u`&&(initArgs.play!==!1&&this.play(),this.stopAnimationLoop=require_imageBitmap.s.shared.add((time,deltaTime,...args)=>{this.updateTime(time,deltaTime,...args)},!1,0,10));let fullscreenchange=()=>{typeof document<`u`&&document.fullscreenElement===null&&this.currentMode===`VRPanorama`&&this.controller.emit(`vr.requestExit`,createEvent(`vr.requestExit`,{}))},webglcontextrestored=()=>{this.needsRender=!0},recoverContext=()=>{this.renderer instanceof InternalWebGPURenderer&&this.renderer.reconfigureContext(),this.needsRender=!0},onVisibilityChange=()=>{typeof document<`u`&&document.visibilityState===`visible`&&recoverContext()},onPageShow=()=>{recoverContext()};if(this.renderer instanceof InternalWebGPURenderer&&(this.renderer.onDeviceLostCallback=()=>{recoverContext()}),typeof document<`u`&&(document.addEventListener(`visibilitychange`,onVisibilityChange,!1),document.addEventListener(`fullscreenchange`,fullscreenchange,!1)),typeof window<`u`&&window.addEventListener(`pageshow`,onPageShow,!1),this.renderer&&this.renderer.domElement.addEventListener(`webglcontextrestored`,webglcontextrestored,!1),this.removeEventListeners=()=>{typeof document<`u`&&(document.removeEventListener(`visibilitychange`,onVisibilityChange,!1),document.removeEventListener(`fullscreenchange`,fullscreenchange,!1)),typeof window<`u`&&window.removeEventListener(`pageshow`,onPageShow,!1),this.renderer instanceof InternalWebGPURenderer&&(this.renderer.onDeviceLostCallback=void 0),this.renderer&&this.renderer.domElement.removeEventListener(`webglcontextrestored`,webglcontextrestored,!1)},this.loadWorkTask=this.prepare(),this.plugins={},initArgs.plugins&&initArgs.plugins.length){for(let pluginInit of initArgs.plugins)if(typeof pluginInit==`function`)pluginInit(this);else if(Array.isArray(pluginInit)){let[factory,instanceName,parameters]=pluginInit;if(typeof factory==`function`){let instance=factory(this,parameters);typeof instanceName==`string`&&(this.plugins[instanceName]?this.throwError(Error(`plugin name ${instanceName} is exists.`)):this.plugins[instanceName]=instance)}}}initLegacyEvent(this),this.fiveRenderer=new FiveRenderer({outputType:this._enableHDR?three_webgpu.HalfFloatType:void 0}),this.adaptiveLuminancePass=new AdaptiveLuminancePass,this.adaptiveLuminancePass.enabled=!1,this.fiveRenderer.composer.addPass(this.adaptiveLuminancePass),this.eyeDomeLightingPass=new EyeDomeLightingPass(this.camera),this.eyeDomeLightingPass.enabled=!1,this.fiveRenderer.composer.addPass(this.eyeDomeLightingPass),this.pbmGaussianSplattingRenderMesh=new PBMGaussianSplattingRenderMesh,this.scene.add(this.pbmGaussianSplattingRenderMesh)}get ident(){return this.fiveId}get panoIndex(){return this.pano.panoIndex}prepare(){return Promise.all([require_imageSupport.t().catch(require_memoryUsage.d)]).then(require_memoryUsage.d)}dispose(){var _a;if(this.destroyed===!0)return;delete Five_Instances[this.fiveId],this.emit(`dispose`),this.destroyed=!0,this.pause(),this.stopAnimationLoop&&(this.stopAnimationLoop(),this.stopAnimationLoop=void 0),this.off(),this.networkSubscribe.off(),this.controller&&(this.controller.destroy(),this.controller=void 0);let element=this.getElement();element&&element.parentNode&&element.parentNode.removeChild(element);let parameter=this.modelScene.parameter;parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.reset(`pano0`,`pano1`),this.modelScene.dispose(),worksMap.set(this,emptyWorks),this.renderer&&(!(this.renderer instanceof InternalWebGPURenderer)||this.renderer.isInitialized)&&this.renderer.render(new three_webgpu.Scene,new three_webgpu.PerspectiveCamera),this.fiveRenderer.dispose(),this.renderer instanceof InternalWebGPURenderer&&this.renderer.dispose()}setViewport(viewport){Object.assign(this.viewport,viewport),this.needsRender=!0}get boundingMesh(){return this.modelScene.boundingMesh}get helperVisible(){return this.helperGroup.visible}set helperVisible(visible){this.helperGroup.visible!==visible&&(this.helperGroup.visible=visible,this.emit(`helpers.visible`,createEvent(`helpers.visible`,{object:this.helperGroup})),this.needsRender=!0)}updateConfiguration(args,refresh=!0){let needsUpdateController=!1,forceUpdateController=!1;args.panorama&&(Object.assign(this.controllerInits.Panorama,require_pick.n(args.panorama)),this.currentMode===`Panorama`&&(needsUpdateController=!0)),args.model&&(Object.assign(this.controllerInits.Model,require_pick.n(args.model)),this.currentMode===`Model`&&(needsUpdateController=!0)),args.floorplan&&(Object.assign(this.controllerInits.Floorplan,require_pick.n(args.floorplan)),this.currentMode===`Floorplan`&&(needsUpdateController=!0)),args.topview&&(Object.assign(this.controllerInits.Topview,require_pick.n(args.topview)),this.currentMode===`Topview`&&(needsUpdateController=!0)),args.mapview&&(Object.assign(this.controllerInits.Mapview,require_pick.n(args.mapview)),this.currentMode===`Mapview`&&(needsUpdateController=!0)),args.vrPanorama&&(Object.assign(this.controllerInits.VRPanorama,require_pick.n(args.vrPanorama)),this.currentMode===`VRPanorama`&&(needsUpdateController=!0)),args.xrPanorama&&(Object.assign(this.controllerInits.XRPanorama,require_pick.n(args.xrPanorama)),this.currentMode===`XRPanorama`&&(needsUpdateController=!0)),args.imageOptions&&(Object.assign(this.imageOptions,args.imageOptions),(this.currentMode===`Panorama`||this.currentMode===`VRPanorama`||this.currentMode===`XRPanorama`)&&(forceUpdateController=!0,needsUpdateController=!0)),args.textureOptions&&Object.assign(this.textureOptions,args.textureOptions),refresh&&needsUpdateController&&this.controller&&this.currentMode&&(!this.controller.updateConfiguration(this.controllerInits[this.currentMode])||forceUpdateController)&&this.changeMode(this.currentMode,this.getCurrentState(),0,!1,!0)}appendTo(element,size={}){if(!this.renderer)return;if(!(this.renderer instanceof InternalWebGPURenderer)){this.throwError(Error(`cannot call appendTo method when render a external renderer`));return}let renderElement=this.getElement();if(!renderElement)return;element.appendChild(renderElement),this.refresh(size);let positionType=window.getComputedStyle(element).position;positionType!==`relative`&&positionType!==`absolute`&&positionType!==`fixed`&&positionType!==`sticky`&&(element.style.position=`relative`)}refresh(size={},pixelRatio){var _a,_b,_c,_d,_e,_f;if(!this.renderer)return;let container=this.renderer.domElement.parentNode,{width=(_a=container==null?void 0:container.offsetWidth)==null?512:_a,height=(_b=container==null?void 0:container.offsetHeight)==null?512:_b}=size;if(width=Math.max(1,width),height=Math.max(1,height),!pixelRatio){let viewportScale=getViewportScale(),devicePixelRatio=typeof window<`u`?window.devicePixelRatio:1;if(pixelRatio=(_c=viewportScale===1?devicePixelRatio:1)==null?1:_c,pixelRatio>1){let maxSize=Math.max(width,height)*pixelRatio,maxTextureSize=Math.min((_f=(_e=(_d=this.renderer.backend.device)==null?void 0:_d.limits)==null?void 0:_e.maxTextureDimension2D)==null?8192:_f,4096);maxSize>maxTextureSize&&(pixelRatio=Math.max(pixelRatio/maxSize*maxTextureSize,1),pixelRatio=Math.floor(pixelRatio*100)/100)}}this.renderer.setPixelRatio(pixelRatio),this.renderer.setSize(width,height),this.needsRender=!0;let time=require_memoryUsage.p(),deltaTime=time-this.currentUpdateArgs.time,args=this.currentUpdateArgs.args;this.updateTime(time,deltaTime,...args)}addExtraElement(element){return this.extraElements.indexOf(element)===-1&&(this.extraElements.push(element),this.controller&&this.controller.bindExtraElement(element)),()=>this.removeExtraElement(element)}removeExtraElement(element){let index=this.extraElements.indexOf(element);index!==-1&&(this.extraElements.splice(index,1),this.controller&&this.controller.unbindExtraElement(element))}getSize(target){if(!this.renderer)throw Error(`renderer is not initialized`);return this.renderer.getSize(target),target.x*=this.viewport.width,target.y*=this.viewport.height,target}getDrawingBufferSize(target){if(!this.renderer)throw Error(`renderer is not initialized`);return this.renderer.getDrawingBufferSize(target),target.x*=this.viewport.width,target.y*=this.viewport.height,target}updateCamera(pose,duration,userAction=!0){if(!this.controller)throw Error(`controller is not initialized.`);return this.controller.updateCamera(pose,duration,userAction)}updateCameraWithKeyframes(keyframes,duration,userAction=!0){if(!this.controller)throw Error(`controller is not initialized.`);return this.controller.updateCameraWithKeyframes(keyframes,duration,userAction)}get works(){return worksMap.get(this)||emptyWorks}get work(){return this.works[0]}get observers(){return this.work.observers}get models(){return this.modelScene.models}get model(){return this.modelScene.models[0]}load(inputWork,state,options,userAction=!0){if(!this.renderer)throw Error(`renderer is not initialized`);let task=this.loadWorkTask.then(()=>isPromise(inputWork)?inputWork.then(inputWork=>this.load_(inputWork,state,options,userAction)):this.load_(inputWork,state,options,userAction));return this.loadWorkTask=task.catch(error=>{this.throwError(error)}),task}load_(inputWork,state,options,userAction=!0){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k;let loadOptions={};typeof options==`number`?loadOptions.duration=options:typeof options==`object`&&Object.assign(loadOptions,options),this.works===emptyWorks&&(loadOptions.duration===void 0&&(loadOptions.duration=0),loadOptions.effect===void 0&&(loadOptions.effect=`instant`));let modelOptions={};Object.assign(modelOptions,loadOptions.model),!modelOptions[`3d-tiles`]&&loadOptions[`3d-tiles`]&&(modelOptions[`3d-tiles`]=loadOptions[`3d-tiles`]),!modelOptions.textureOptions&&loadOptions.textureOptions&&(modelOptions.textureOptions=loadOptions.textureOptions),!modelOptions.textureOptions&&this.textureOptions&&(modelOptions.textureOptions=this.textureOptions);let workArray=[];if(Array.isArray(inputWork))for(let input of inputWork)input instanceof Work?workArray.push(input):typeof input!=`string`&&`work`in input?workArray.push(parseWork(input.work,input)):workArray.push(parseWork(input));else inputWork instanceof Work?workArray.push(inputWork):workArray.push(parseWork(inputWork));loadOptions.mode===`add`&&(workArray=[].concat(this.works,workArray));let works;try{works=createWorks(workArray)}catch(error){return this.throwError(error),Promise.reject(error)}for(let work of works)this.bindWorkFetcher(work);state===void 0&&(state=`inherit`),state===`inherit`&&this.works===emptyWorks&&(state=`initial`);let prevMode=this.currentMode,initial=works.initial,initialObserver=initial.work.observers[0],initialPano=initialObserver?{workCode:initialObserver.work.workCode,panoIndex:initialObserver.panoIndex}:{workCode:initial.work.workCode,panoIndex:0},initialMode=(_a=initial.mode)==null?initialObserver?`Panorama`:`Mapview`:_a,initialPose={};if(state===`inherit`){let currentState=this.getCurrentState(),[currentWork]=works.filter(work=>work.workCode===currentState.workCode);if(currentWork)initialPano={workCode:currentState.workCode,panoIndex:currentState.panoIndex},initialMode=currentState.mode,initialPose={longitude:currentState.latitude,latitude:currentState.latitude,fov:currentState.fov,distance:currentState.distance,offset:currentState.offset.clone()};else{state={mode:prevMode};let observer=(_c=(_b=works[0])==null?void 0:_b.observers)==null?void 0:_c[this.panoIndex];observer?(state.workCode=observer.work.workCode,state.panoIndex=observer.panoIndex):typeof works.initial.panoIndex==`number`?(state.workCode=works.initial.work.workCode,state.panoIndex=works.initial.panoIndex):(state.mode===`Panorama`||state.mode===`VRPanorama`||state.mode===`XRPanorama`)&&(state.mode=`Mapview`),state.mode===prevMode&&(state.longitude=this.camera.pose.longitude,state.latitude=this.camera.pose.latitude,state.fov=this.camera.pose.fov)}}if(state===`initial`&&(typeof initial.panoIndex==`number`&&(initialPano={workCode:initial.work.workCode,panoIndex:initial.panoIndex}),initial.mode&&(initialMode=initial.mode),initialPose={longitude:initial.longitude,latitude:initial.latitude,fov:initial.fov,distance:initial.distance,offset:(_d=initial.offset)==null?void 0:_d.clone()}),typeof state==`object`){if(initialMode=(_e=state.mode)==null?prevMode:_e,typeof state.panoIndex==`number`){let observer=works.getObserver({workCode:(_g=(_f=state.workCode)==null?initial.work.workCode:_f)==null?``:_g,panoIndex:state.panoIndex});observer&&(initialPano={workCode:observer.work.workCode,panoIndex:observer.panoIndex})}initialPose={longitude:state.longitude,latitude:state.latitude,fov:state.fov,distance:state.distance,offset:state.offset?new three_webgpu.Vector3().copy(state.offset):void 0}}let duration=(_h=loadOptions.duration)==null?this.modeChangeDuration:_h;(initialMode===`Floorplan`||initialMode===`Topview`||initialMode===`Mapview`)&&prevMode===initialMode&&(duration=0);let effect=`fly`;(initialMode===`Panorama`||initialMode===`VRPanorama`||initialMode===`XRPanorama`)&&prevMode===initialMode&&(effect=(_j=loadOptions.effect)==null?`fade`:_j),this.emit(`works.request`,createEvent(`works.request`,{input:inputWork,works,userAction}));let applyController=(initialMode,initialPano,initialPose)=>{let currentState=this.getCurrentState(),initialState=Object.assign(Object.assign({mode:initialMode},initialPano),initialPose);state===`inherit`&&(initialState=this.getCurrentState()),this.pano=initialPano;let initialParams=Object.assign(Object.assign({initial:{state:initialState,currentState,duration,effect,userAction}},this.commonParams()),this.controllerInits[initialMode]),initAnimationEndState=Controllers[initialState.mode].initAnimationEndState(initialParams);if(this.controller&&prevMode===initialMode)this.controller.updateWork(works,initAnimationEndState,{effect,duration},userAction)===!1&&(this.controller.destroy(),this.controller=this.applyController(initialMode,initialParams));else{if(this.controller)this.controller.destroy();else{let state=Controllers[initialMode].initAnimationEndState(initialParams);this.camera.setFromPose(state),this.emit(`camera.update`,createEvent(`camera.update`,{state:this.getCurrentState(),userAction}))}this.controller=this.applyController(initialMode,initialParams);let modeChangeEvent=createEvent(`mode.change`,{prevMode,mode:initialMode,state:initAnimationEndState,userAction});try{this.emit(`mode.change`,modeChangeEvent)}catch(error){console.error(error)}}this.state.workCode=this.pano.workCode,this.state.panoIndex=this.pano.panoIndex,this.updateTime(this.currentUpdateArgs.time,0,...this.currentUpdateArgs.args)};worksMap.set(this,works);let loadModelPromise=Promise.resolve();if(initialMode===Five.Mode.Floorplan||initialMode===Five.Mode.Topview||initialMode===Five.Mode.Mapview||initialMode===Five.Mode.Model){this.modelScene.loaded===!1&&(this.camera.setFromPose(initialPose),assignPose(this.state,this.camera.pose));let models=this.modelScene.setModels(works,modelOptions);loadModelPromise=Promise.all(models.map(model=>model.loadedReady)).then(()=>{this.needsRender=!0,applyController(initialMode,initialPano,initialPose),this.emit(`camera.update`,createEvent(`camera.update`,{state:this.getCurrentState(),userAction}))})}else{applyController(initialMode,initialPano,initialPose);let controller=this.controller,callbacked=!1;this.modelScene.autoRefine=!1;let callback=()=>{this.works===works&&callbacked===!1&&(this.needsRender=!0,this.emit(`camera.update`,createEvent(`camera.update`,{state:this.getCurrentState(),userAction})),callbacked=!0,this.modelScene.autoRefine=!0),controller.off(`pano.arrived`,callback),controller.off(`pano.cancel`,callback)},models=this.modelScene.setModels(works,modelOptions);loadModelPromise=Promise.all(models.map(model=>model.initReady)).then(require_memoryUsage.d),controller.once(`pano.arrived`,callback),controller.once(`pano.cancel`,callback),setTimeout(callback,((_k=loadOptions.duration)==null?this.modeChangeDuration:_k)+1e3)}return this.emit(`works.load`,createEvent(`works.load`,{input:inputWork,userAction,works})),loadModelPromise.then(()=>this.ready()).then(()=>{var _a;this.emit(`works.ready`,createEvent(`works.ready`,{input:inputWork,userAction,works})),(_a=this.analysis)==null||_a.work(works)})}reset(){let task=this.loadWorkTask.then(()=>this.reset_());return this.loadWorkTask=task.catch(error=>{this.throwError(error)}),task}reset_(){return new Promise(resolve=>{var _a;this.controller&&(this.controller.destroy(),this.controller=void 0);let parameter=this.modelScene.parameter;parameter.pano0&¶meter.pano0.map.dispose(),parameter.pano1&¶meter.pano1.map!==((_a=parameter.pano0)==null?void 0:_a.map)&¶meter.pano1.map.dispose(),parameter.set({pano0:null,pano1:null,modelAlpha:1}),worksMap.set(this,emptyWorks),this.modelScene.setModels(emptyWorks,{forceReplaceImmediately:!0}),this.renderer&&this.modelScene.update(this.renderer,this.camera),this.needsRender=!0,this.currentMode=`Panorama`,this.pano={workCode:``,panoIndex:0},this.camera.setFromPose({distance:0,fov:DEFAULT_CAMERA_FOV,longitude:0,latitude:0,offset:new three_webgpu.Vector3(0,0,0)}),this.state={mode:this.currentMode,workCode:this.pano.workCode,panoIndex:this.pano.panoIndex,longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude,fov:this.camera.pose.fov,offset:this.camera.pose.offset.clone(),distance:this.camera.pose.distance},this.camera.needsRender=!1,this.needsRender=!1,resolve()})}changeMode(mode,state={},options,userAction=!0,force=!1){return new Promise((resolve,reject)=>{var _a,_b,_c,_d;if(!this.renderer)throw Error(`renderer is not initialized.`);state=Object.assign({},state);let duration=0;this.controller&&(duration=typeof options==`number`?options:(_a=options==null?void 0:options.duration)==null?this.modeChangeDuration:_a);let effect=`fly`;this.controller&&typeof options==`object`&&options.effect&&(effect=options.effect);let nextPano=typeof state.panoIndex==`number`?{workCode:(_d=(_b=state.workCode)==null?(_c=this.work)==null?void 0:_c.workCode:_b)==null?``:_d,panoIndex:state.panoIndex}:this.pano;if(!Five.Mode.hasOwnProperty(mode)){let error=Error(`mode "${mode}" is not existed`);this.throwError(error),reject(error);return}if((mode===Five.Mode.Panorama||mode===Five.Mode.VRPanorama||mode===Five.Mode.XRPanorama)&&!this.works.getObserver(nextPano)){let error=Error(`PanoId ${panoStringify(nextPano)} not existed.`);this.throwError(error),reject(error);return}(mode===Five.Mode.Floorplan||mode===Five.Mode.Topview||mode===Five.Mode.Mapview||mode===Five.Mode.Model)&&this.modelScene.empty&&(duration=0);let prevController=this.controller,prevMode=this.currentMode,doChangeMode=()=>{if(this.controller&&this.controller.stopMomentumMovement(),this.controller&&force===!1&&prevMode===mode)mode===Five.Mode.Panorama||mode===Five.Mode.Model||mode===Five.Mode.VRPanorama||mode===Five.Mode.XRPanorama?!panoEqual(this.pano,nextPano)&&`moveToPano`in this.controller&&typeof this.controller.moveToPano==`function`?this.controller.moveToPano(nextPano,Object.assign({duration},state),userAction):this.controller.updateCamera(state,duration,userAction).catch(require_memoryUsage.d):(panoEqual(this.pano,nextPano)||(this.pano=nextPano),this.controller.updateCamera(state,duration,userAction).catch(require_memoryUsage.d));else{let initialState=Object.assign(Object.assign({},state),nextPano),params=Object.assign(Object.assign({initial:{state:initialState,currentState:this.getCurrentState(),duration,effect,userAction}},this.commonParams()),this.controllerInits[mode]),initAnimationEndState=Controllers[mode].initAnimationEndState(params),modeChangeEvent=createEvent(`mode.change.request`,{prevMode:this.currentMode,mode,state:initAnimationEndState,userAction});if(this.emit(`mode.change.request`,modeChangeEvent),!modeChangeEvent.defaultPrevented){prevController&&prevController.destroy(),this.controller=this.applyController(mode,params);let modeChangeEvent=createEvent(`mode.change`,{prevMode:this.currentMode,mode,state:initAnimationEndState,userAction});this.emit(`mode.change`,modeChangeEvent)}}resolve()},session=require_imageBitmap.s.shared.getContext();if(session&&(typeof XRSession<`u`&&session instanceof XRSession&&session.end(),require_imageBitmap.s.shared.setContext(null)),mode===Five.Mode.VRPanorama)this.requestFullscreen(),requestDeviceOrientationPermission().then(()=>doChangeMode()).catch(anyError=>{let error=anyError instanceof Error?anyError:Error(String(anyError));this.exitFullscreen(),this.throwError(error),reject(error)});else if(mode===Five.Mode.XRPanorama){if(!XRManager.isBackendXRCapable(this.renderer)){let error=Error(`XRPanorama 需要 WebGL2 回落后端。请在 new Five() 时传入 { forceWebGL: true }。后端在运行时无法切换,设备检测必须发生在 new Five() 之前。`);this.throwError(error),reject(error);return}if(!XRManager.isBrowserXRCapable()){let error=Error(`当前浏览器不支持 WebXR(navigator.xr 不存在)。`);this.throwError(error),reject(error);return}requestXRSessionPermission().then(session=>{require_imageBitmap.s.shared.setContext(session),force=!0;try{doChangeMode()}catch(anyError){console.error(`[XR] changeMode 建立 XRPanorama controller 失败,结束 session: ${anyError instanceof Error?anyError.message:String(anyError)}`),Promise.resolve(session.end()).catch(()=>{}),require_imageBitmap.s.shared.setContext(null);let error=anyError instanceof Error?anyError:Error(String(anyError));this.throwError(error),reject(error)}}).catch(anyError=>{let error=anyError instanceof Error?anyError:Error(String(anyError));this.throwError(error),reject(error)})}else doChangeMode()})}getPixels(xOrOptions,_y,_width,_height,_pixelRatio,_flipY,_buffer){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){if(!this.renderer)throw Error(`renderer is not initialized.`);let currentTime=require_memoryUsage.p(),prevPixelRatio=this.renderer.getPixelRatio(),prevRenderTarget=this.renderer.getRenderTarget(),renderSize=this.getSize(new three_webgpu.Vector2),x=0,y=0,width=1,height=1,pixelRatio,flipY,helperVisible,skipPanorama,buffer;typeof xOrOptions==`number`?(x=xOrOptions,typeof _y==`number`&&(y=_y),typeof _width==`number`&&(width=_width),typeof _height==`number`&&(height=_height),pixelRatio=_pixelRatio,flipY=_flipY,buffer=_buffer):(x=xOrOptions.x,y=xOrOptions.y,width=xOrOptions.width,height=xOrOptions.height,pixelRatio=xOrOptions.pixelRatio,flipY=xOrOptions.flipY,helperVisible=xOrOptions.helperVisible,skipPanorama=xOrOptions.skipPanorama,buffer=xOrOptions.buffer),x=Math.floor(x),y=Math.floor(y),width=Math.floor(width),height=Math.floor(height),pixelRatio=Math.floor(pixelRatio==null?prevPixelRatio:pixelRatio),flipY=flipY==null?!1:flipY;let prevHelperVisible=this.helperVisible,prevModelAlpha=this.modelScene.parameter.modelAlpha;this.helperVisible=helperVisible==null?this.helperVisible:helperVisible,skipPanorama&&(this.controller instanceof Controllers.Panorama||this.controller instanceof Controllers.VRPanorama||this.controller instanceof Controllers.XRPanorama)&&skipPanorama===!0&&this.modelScene.parameter.set(`modelAlpha`,1),this.modelScene.update(this.renderer,this.camera);let renderTarget=this.getPixelsRenderTarget;renderTarget.setSize(width*pixelRatio,height*pixelRatio),this.renderer.setRenderTarget(renderTarget),this.camera.pixelRatio=pixelRatio,this.camera.resolution.set(width,height),this.camera.setViewOffset(renderSize.width,renderSize.height,x,renderSize.height-y-height,width,height),this.camera.aspect=renderSize.width/renderSize.height,this.camera.updateTime(currentTime),this.scene.update(this.renderer,this.camera);let prevAutoClear=this.renderer.autoClear,prevAutoClearColor=this.renderer.autoClearColor,prevAutoClearDepth=this.renderer.autoClearDepth,prevAutoClearStencil=this.renderer.autoClearStencil,prevClearColor=this.renderer.getClearColor(scratchClearColor),prevClearAlpha=this.renderer.getClearAlpha(),prevScissorTest=this.renderer.getScissorTest();this.renderer.autoClear=!0,this.renderer.autoClearColor=!0,this.renderer.autoClearDepth=!0,this.renderer.autoClearStencil=!0,this.renderer.setScissorTest(!1);let background=this.scene.background;this.scene.background=this.camera.isOrthographicCamera||this.backgroundAlpha<1?null:background,this.renderer.render(this.scene,this.camera),this.scene.background=background,this.renderer.autoClear=prevAutoClear,this.renderer.autoClearColor=prevAutoClearColor,this.renderer.autoClearDepth=prevAutoClearDepth,this.renderer.autoClearStencil=prevAutoClearStencil,this.renderer.setClearColor(prevClearColor,prevClearAlpha),this.renderer.setScissorTest(prevScissorTest),this.helperVisible=prevHelperVisible,prevModelAlpha===void 0?this.modelScene.parameter.reset(`modelAlpha`):this.modelScene.parameter.set(`modelAlpha`,prevModelAlpha),this.renderer.setRenderTarget(prevRenderTarget),this.camera.clearViewOffset(),this.camera.pixelRatio=prevPixelRatio,this.camera.resolution.copy(renderSize),this.camera.aspect=this.camera.resolution.width/this.camera.resolution.height,this.camera.updateTime(currentTime),this.modelScene.update(this.renderer,this.camera),this.scene.update(this.renderer,this.camera);let pixelWidth=width*pixelRatio,pixelHeight=height*pixelRatio,pixelLength=pixelWidth*pixelHeight,byteLength=pixelLength*4;if(buffer){if(buffer.length!==byteLength)throw Error(`buffer length is not equals pixels ${byteLength}`)}else buffer=new Uint8Array(byteLength);let pixels=yield this.renderer.readRenderTargetPixelsAsync(renderTarget,0,0,pixelWidth,pixelHeight),rowBytes=pixelWidth*4;if(pixels.length===byteLength)buffer.set(pixels);else{let alignedRowBytes=Math.ceil(rowBytes/256)*256;for(let row=0;row<pixelHeight;row++){let srcStart=row*alignedRowBytes;buffer.set(pixels.subarray(srcStart,srcStart+rowBytes),row*rowBytes)}}if(!flipY){let halfPixelLength=pixelLength/2;for(let temp=0,index=0,rgbaIndex=0,targetIndex=0;index<halfPixelLength;index++)for(targetIndex=(pixelHeight-Math.floor(index/pixelWidth)-1)*pixelWidth+index%pixelWidth,rgbaIndex=0;rgbaIndex<4;rgbaIndex++)temp=buffer[index*4+rgbaIndex],buffer[index*4+rgbaIndex]=buffer[targetIndex*4+rgbaIndex],buffer[targetIndex*4+rgbaIndex]=temp}return buffer})}getElement(){var _a;return(_a=this.renderer)==null?void 0:_a.domElement}render(callback){let renderer=this.renderer;if(!renderer)return;let prevRenderTarget=renderer.getRenderTarget();renderer.setRenderTarget(null);let prevAutoClear=renderer.autoClear,prevAutoClearColor=renderer.autoClearColor,prevAutoClearDepth=renderer.autoClearDepth,prevAutoClearStencil=renderer.autoClearStencil,prevClearColor=renderer.getClearColor(scratchClearColor),prevClearAlpha=renderer.getClearAlpha(),prevViewport=renderer.getViewport(scratchViewport),prevScissor=renderer.getScissor(scratchScissor),prevScissorTest=renderer.getScissorTest();renderer.autoClear=!0,renderer.autoClearColor=!0,renderer.autoClearDepth=!0,renderer.autoClearStencil=!0;let renderSize=renderer.getSize(scratchRenderSize),left=Math.floor(renderSize.x*this.viewport.left),bottom=Math.floor(renderSize.y*this.viewport.bottom),width=Math.floor(renderSize.x*this.viewport.width),height=Math.floor(renderSize.y*this.viewport.height);renderer.setClearColor(this.backgroundColor,this.backgroundAlpha),renderer.setViewport(left,bottom,width,height),renderer.setScissor(left,bottom,width,height);let needsScissor=this.viewport.bottom!==0||this.viewport.left!==0||this.viewport.width!==1||this.viewport.height!==1;renderer.setScissorTest(needsScissor);let background=this.scene.background;this.scene.background=this.camera.isOrthographicCamera||this.backgroundAlpha<1?null:background;let needFiveRender=!0;if(this.controller&&this.controller.render()&&(needFiveRender=!1),needFiveRender){let rendered=this.fiveRenderer.render(renderer,this.scene,this.modelScene,this.camera,this.needsRender);this.poweredByRealsee&&rendered&&renderPoweredByRealsee(renderer)}this.scene.background=background,renderer.autoClear=prevAutoClear,renderer.autoClearColor=prevAutoClearColor,renderer.autoClearDepth=prevAutoClearDepth,renderer.autoClearStencil=prevAutoClearStencil,renderer.setClearColor(prevClearColor,prevClearAlpha),renderer.setViewport(prevViewport),renderer.setScissor(prevScissor),renderer.setScissorTest(prevScissorTest),renderer.setRenderTarget(prevRenderTarget),callback&&require_imageBitmap.s.shared.add(callback,!0)}updateTime(time,deltaTime,...args){if(this.currentUpdateArgs={time,args},this.destroyed)return;if(this.renderer&&require_glTF_helpers.n.detectSupport(this.renderer),this.syncingState=this.syncState(time,deltaTime),this.controller&&this.controller.updateTime(time,deltaTime,...args),this.renderer&&(this.camera.pixelRatio=this.renderer.getPixelRatio(),this.getSize(this.camera.resolution),this.camera.aspect=this.camera.resolution.width/this.camera.resolution.height),this.camera.controllerMode=this.currentMode,this.camera.updateTime(time),this.renderer){let lastLoaded=this.modelScene.loaded,lastRefined=this.modelScene.refined;this.modelScene.update(this.renderer,this.camera),lastLoaded===!1&&this.modelScene.loaded===!0&&(this.controller&&this.controller.updateModel(this.modelScene),require_imageBitmap.s.shared.add(()=>{this.emit(`models.load`,createEvent(`models.load`,{modelScene:this.modelScene}))},!0,0,10)),lastRefined===!1&&this.modelScene.refined===!0&&require_imageBitmap.s.shared.add(()=>{this.emit(`models.refined`,createEvent(`models.refined`,{modelScene:this.modelScene}))},!0,0,10)}if(this.camera.autoNearFar){scratchBox3.makeEmpty(),scratchBox3.expandByObject(this.modelScene.boundingMesh);let shpere=scratchBox3.getBoundingSphere(scratchSphere),boudingSize=shpere.radius*2;shpere.containsPoint(this.camera.position)||(boudingSize=this.camera.position.distanceTo(shpere.center)+shpere.radius);let near=require_memoryUsage.M(boudingSize/500,.001,.1),far=require_memoryUsage.M(boudingSize,800);this.camera.near!==near&&(this.camera.near=near),this.camera.far!==far&&(this.camera.far=far),this.camera.updateTime(time)}if(this.renderer){let modelSceneVisible=this.modelScene.visible;this.modelScene.visible=!1,this.scene.update(this.renderer,this.camera),this.modelScene.visible=modelSceneVisible}if(this.syncingState=!1,this.controller&&this.controller.needsRender===!0&&(this.controller.needsRender=!1,this.needsRender=!0),this.camera.needsRender===!0&&(this.camera.needsRender=!1,this.needsRender=!0),this.modelScene.needsRender===!0&&(this.modelScene.needsRender=!1,this.needsRender=!0),this.scene.needsRender===!0&&(this.scene.needsRender=!1,this.needsRender=!0),this.pbmGaussianSplattingRenderMesh&&this.pbmGaussianSplattingRenderMesh.needsRender===!0&&(this.pbmGaussianSplattingRenderMesh.needsRender=!1,this.needsRender=!0),this.fiveRenderer&&this.fiveRenderer.needsRender===!0&&(this.fiveRenderer.needsRender=!1,this.needsRender=!0),this.onlyRenderIfNeeds!==!0&&(this.needsRender=!0),this.paused===!0||this.renderer instanceof InternalWebGPURenderer&&!this.renderer.isInitialized)return;let renderEvent=createEvent(`render.prepare`,{needsRender:this.needsRender});this.emit(`render.prepare`,renderEvent),renderEvent.defaultPrevented&&(this.needsRender=!1);let currentNeedsRender=this.needsRender;this.render(),this.needsRender=!1,this.emit(`render`,createEvent(`render`,{needsRender:currentNeedsRender})),this.hasListener(`fps`)&&(this.fps.testTime&&time-this.fps.testTime<1e3?this.fps.testCount++:(this.emit(`fps`,this.fps.testCount),this.fps.testTime=time,this.fps.testCount=0))}pause(){this.paused=!0,this.renderer&&this.renderer instanceof InternalWebGPURenderer&&this.renderer.clear(!0,!0,!0)}play(){this.needsRender=!0,this.paused=!1}moveToPano(pano,options={},userAction=!0){let{controller,renderer}=this;if(!controller)return this.throwError(Error(`controller is not initialized.`)),Promise.resolve();if(!renderer)return this.throwError(Error(`renderer is not initialized.`)),Promise.resolve();typeof pano==`number`&&this.pano.workCode&&(pano={workCode:this.pano.workCode,panoIndex:pano});let observer=this.works.getObserver(pano);if(!observer)return this.throwError(Error(`pano ${JSON.stringify(pano)} not existed.`)),Promise.resolve();let nextPano={workCode:observer.work.workCode,panoIndex:observer.panoIndex};return`moveToPano`in controller&&typeof controller.moveToPano==`function`?controller.moveToPano(nextPano,options,userAction):observer&&(this.pano=nextPano,this.once(`initAnimation.start`,event=>{options.moveStartCallback&&options.moveStartCallback(event.state)}),this.once(`initAnimation.end`,event=>{options.moveEndCallback&&options.moveEndCallback(event.state)}),this.changeMode(Five.Mode.Panorama,options,{effect:options.effect},userAction)),this.ready()}preloadPano(pano,callback=require_memoryUsage.d){let observer=this.works.getObserver(pano);if(!observer)return Promise.reject(Error(`Pano ${JSON.stringify(pano)} never found`));let types=[`right`,`left`,`up`,`down`,`front`,`back`],startTime=require_memoryUsage.p();return Promise.all(types.map(type=>{let panoId=panoStringify({panoIndex:observer.panoIndex,workCode:observer.work.workCode}),options=Object.assign({key:`pano.${panoId}.${type}`},require_pick.r(this.imageOptions,[`size`,`format`,`quality`,`forceUseExifOrientation`,`mappings`])),origin=observer.work.getURL(observer.images[type]),target=this.imageOptions.transform?this.imageOptions.transform(origin,options):require_pick.s(origin,options);return getFetcher(this.fiveId,observer.work).preload(target)})).then(()=>{let costs=require_memoryUsage.p()-startTime;return callback(costs),costs})}project2d(vector,testModel=!1){if(!this.renderer)return null;if(testModel){let origin=this.camera.position,subVector=vector.clone().sub(origin),raycaster=new three_webgpu.Raycaster(origin,subVector.clone().normalize());raycaster.params.Points={threshold:.1};let[intersect]=this.modelScene.intersectRaycaster(raycaster);if(intersect&&intersect.distance+.01<subVector.length())return null}let screen=vector.clone().project(this.camera);if(Math.abs(screen.z)>1)return null;let size=this.renderer.getSize(new three_webgpu.Vector2),width=size.x*this.viewport.width,height=size.y*this.viewport.height,left=size.x*this.viewport.left+(screen.x+1)/2*width,top=size.y*(1-this.viewport.bottom-this.viewport.height)+(-screen.y+1)/2*height;return new three_webgpu.Vector2(left,top)}getCurrentState(){return Object.assign(Object.assign({},this.camera.copyPose()),{mode:this.currentMode,workCode:this.pano.workCode,panoIndex:this.pano.panoIndex})}setState(state,immediately=!1,userAction=!0){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k;state=require_pick.r(state,[`mode`,`workCode`,`panoIndex`,`longitude`,`latitude`,`fov`,`offset`,`distance`]),state.offset&&!(state instanceof three_webgpu.Vector3)&&(state.offset=new three_webgpu.Vector3(state.offset.x,state.offset.y,state.offset.z));let pano;if(typeof state.panoIndex==`number`)if(state.workCode)pano={workCode:state.workCode,panoIndex:state.panoIndex};else{let workCode=(_b=(_a=this.work)==null?void 0:_a.workCode)==null?``:_b,prevWorkCode=this.state.workCode;this.works.filter(work=>work.workCode===prevWorkCode).length>0&&(workCode=prevWorkCode),pano={workCode,panoIndex:state.panoIndex}}let mode=(_c=state.mode)==null?this.state.mode:_c,longitude,latitude,fov,offset,distance;if(this.controller&&this.controller.stopMomentumMovement(),this.state.mode!==mode){if(mode===`VRPanorama`){this.changeMode(`VRPanorama`,void 0,void 0,!0);return}if(mode===`XRPanorama`){this.changeMode(`XRPanorama`,void 0,void 0,!0);return}let initialState={workCode:pano==null?void 0:pano.workCode,panoIndex:pano==null?void 0:pano.panoIndex};typeof state.longitude==`number`&&(initialState.longitude=state.longitude),typeof state.latitude==`number`&&(initialState.latitude=state.latitude),typeof state.fov==`number`&&(initialState.fov=state.fov),typeof state.distance==`number`&&(initialState.distance=state.distance),state.offset instanceof three_webgpu.Vector3&&(initialState.offset=state.offset);let params=Object.assign(Object.assign({initial:{state:initialState,currentState:this.getCurrentState(),duration:this.modeChangeDuration,effect:`fly`,userAction:!1}},this.commonParams()),this.controllerInits[mode]),initAnimationEndState=Controllers[mode].initAnimationEndState(params);longitude=initAnimationEndState.longitude,latitude=initAnimationEndState.latitude,fov=initAnimationEndState.fov,offset=initAnimationEndState.offset,distance=initAnimationEndState.distance}else longitude=(_d=state.longitude)==null?this.state.longitude:_d,latitude=(_e=state.latitude)==null?this.state.latitude:_e,fov=(_f=state.fov)==null?this.state.fov:_f,offset=(_g=state.offset)==null?this.state.offset:_g,distance=(_h=state.distance)==null?this.state.distance:_h;let nextState={workCode:(pano==null?this.pano:pano).workCode,panoIndex:(pano==null?this.pano:pano).panoIndex,mode,longitude,latitude,fov,offset,distance};this.emit(`state.set`,createEvent(`state.set`,{userAction,state:nextState})),stateEqual(this.state,nextState)||(this.controller&&nextState.mode===`VRPanorama`&&nextState.mode!==this.state.mode?(assignState(this.state,nextState),this.changeMode(`VRPanorama`)):this.controller&&nextState.mode===`XRPanorama`&&nextState.mode!==this.state.mode?(assignState(this.state,nextState),this.changeMode(`XRPanorama`)):(assignState(this.state,nextState),this.controller&&userAction&&(this.controller.userAction=!1),immediately&&this.state.mode===nextState.mode&&(this.syncingState=this.syncState(require_memoryUsage.p(),0,immediately),this.syncingState&&((_j=this.controller)==null||_j.updateTime(require_memoryUsage.p(),0),this.syncingState=!1)),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_k=this.analysis)==null||_k.state(this.works,this.state)))}syncState(time,deltaTime,immediately=!1){let lastStateSynced=this.stateSynced;if(this.stateSynced=!1,!this.controller)return!1;if(this.state.mode!==this.currentMode){let state={mode:this.state.mode,workCode:this.state.workCode,panoIndex:this.state.panoIndex,longitude:this.state.longitude,latitude:this.state.latitude,fov:this.state.fov,offset:this.state.offset,distance:this.state.distance};return this.changeMode(this.state.mode,state,this.modeChangeDuration,this.controller.userAction),!0}if(!this.controller.isReady())return!1;if(this.controller instanceof Controllers.Model){if(notSimilarVector3(this.camera.pose.offset,this.state.offset)){let pose={longitude:this.state.longitude,latitude:this.state.latitude,fov:this.state.fov,offset:this.state.offset};return this.controller.moveToPosition(this.state.offset,Object.assign(Object.assign({},pose),{duration:immediately?0:void 0}),!1),!0}}else{let statePano={workCode:this.state.workCode,panoIndex:this.state.panoIndex};if(!panoEqual(statePano,this.pano)&&`moveToPano`in this.controller&&typeof this.controller.moveToPano==`function`){let pose={longitude:this.state.longitude,latitude:this.state.latitude,fov:this.state.fov,offset:this.state.offset,distance:this.state.distance};return this.controller.moveToPano(statePano,pose,!1),!0}}if(this.controller instanceof Controllers.Floorplan||this.controller instanceof Controllers.Topview||this.controller instanceof Controllers.Mapview){let defaultOffsetStep=.2,defaultCoordinatesStep=Math.PI/45,nextFov=immediately?this.state.fov:stepNumber(this.camera.pose.fov,this.state.fov,1),deltaDistance=Math.abs(this.camera.pose.distance-this.state.distance),distanceStep=deltaDistance>defaultOffsetStep*15?deltaDistance/15:.2,nextDistance=immediately?this.state.distance:stepNumber(this.camera.pose.distance,this.state.distance,distanceStep),deltaOffsetDistance=this.camera.pose.offset.distanceTo(this.state.offset),offsetDtep=deltaOffsetDistance>defaultOffsetStep*15?deltaOffsetDistance/15:defaultOffsetStep,nextOffset=immediately?new three_webgpu.Vector3().copy(this.state.offset):stepVector(this.camera.pose.offset,this.state.offset,offsetDtep),{longitude:nextLongitude,latitude:nextLatitude}=immediately?{longitude:this.state.longitude,latitude:this.state.latitude}:stepCoordinates({longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude},{longitude:this.state.longitude,latitude:this.state.latitude},defaultCoordinatesStep);if(notSimilarValue(nextFov,this.camera.pose.fov)||notSimilarVector3(nextOffset,this.camera.pose.offset)||notSimilarValue(nextDistance,this.camera.pose.distance)||notSimilarValue(nextLongitude,this.camera.pose.longitude,Math.PI*2)||notSimilarValue(nextLatitude,this.camera.pose.latitude)){let nextLocationMotionValue={x:nextOffset.x,y:nextOffset.y,z:nextOffset.z},nextCameraMotionValue={fov:nextFov};return Object.assign(nextLocationMotionValue,{distance:nextDistance}),Object.assign(nextCameraMotionValue,{longitude:nextLongitude,latitude:nextLatitude}),this.controller.stopMomentumMovement(),this.controller.cameraMotion.set(nextCameraMotionValue,0).catch(require_memoryUsage.d),this.controller.locationMotion.set(nextLocationMotionValue,0).catch(require_memoryUsage.d),!0}}else{let coordinatesStep=Math.PI/45,nextFov=immediately?this.state.fov:stepNumber(this.camera.pose.fov,this.state.fov,1),{longitude:nextLongitude,latitude:nextLatitude}=immediately?{longitude:this.state.longitude,latitude:this.state.latitude}:stepCoordinates({longitude:this.camera.pose.longitude,latitude:this.camera.pose.latitude},{longitude:this.state.longitude,latitude:this.state.latitude},coordinatesStep),nextDistance=this.state.distance,nextOffset=new three_webgpu.Vector3().copy(this.state.offset);if(notSimilarValue(nextDistance,this.camera.pose.distance)&&(this.state.distance=this.camera.pose.distance),notSimilarVector3(nextOffset,this.camera.pose.offset)&&(this.state.offset=this.camera.pose.offset.clone()),notSimilarValue(nextLongitude,this.camera.pose.longitude,Math.PI*2)||notSimilarValue(nextLatitude,this.camera.pose.latitude)||notSimilarValue(nextFov,this.camera.pose.fov))return this.controller.stopMomentumMovement(),this.controller.cameraMotion.set({longitude:nextLongitude,latitude:nextLatitude,fov:nextFov},0).catch(require_memoryUsage.d),!0}if(this.stateSynced=!0,lastStateSynced===!1&&this.emit(`state.synced`,createEvent(`state.synced`,{userAction:!1,state:this.state})),this.readyCallbacks.length&&this.stateSynced){let mode=this.currentMode;if(!(mode===Five.Mode.Floorplan||mode===Five.Mode.Topview||mode===Five.Mode.Mapview||mode===Five.Mode.Model)||this.modelScene.loaded){let readyCallbacks=this.readyCallbacks.slice();this.readyCallbacks.length=0;for(let callback of readyCallbacks)this.controller instanceof Controllers.Panorama&&callback.tile===!0?this.readyCallbacks.push(callback):callback()}}return!1}ready(args={}){return new Promise(resolve=>{var _a;this.readyCallbacks.push(Object.assign(resolve,{tile:(_a=args.tile)==null?!1:_a}))}).then(()=>{var _a;return Promise.all([this.model.initReady,(_a=this.renderer)==null?void 0:_a.ready])}).then(require_memoryUsage.d)}requestFullscreen(){var _a;if(!isMobile)return;let parentNode=(_a=this.getElement())==null?void 0:_a.parentNode;parentNode&&`requestFullscreen`in parentNode&&typeof document<`u`&&document.fullscreenElement===null&&parentNode.requestFullscreen()}exitFullscreen(){typeof document<`u`&&document.fullscreenElement&&`exitFullscreen`in document&&document.exitFullscreen()}throwError(error){this.hasListener(`error`)?this.emit(`error`,error):console.error(error)}bindModel(model){let onModelLoad=()=>{require_imageBitmap.s.shared.add(()=>{this.emit(`model.load`,createEvent(`model.load`,{work:model.work,model,error:null}))},!0)},onModelError=event=>{let{error}=event;this.emit(`model.error`,createEvent(`model.error`,{work:model.work,model,error})),this.throwError(error)},onModelChangeShownFloor=()=>{this.emit(`model.changeShownFloor`,createEvent(`model.changeShownFloor`,{work:model.work,model,error:null}))},onModelTileLoad=event=>{this.emit(`models.tileLoad`,createEvent(`models.tileLoad`,{work:model.work,model,tile:event.tile}))},onModelTileUnload=event=>{this.emit(`models.tileUnload`,createEvent(`models.tileUnload`,{work:model.work,model,tile:event.tile}))},onModelDispose=()=>{model.removeEventListener(`load`,onModelLoad),model.removeEventListener(`error`,onModelError),model.removeEventListener(`changeShownFloor`,onModelChangeShownFloor),model.removeEventListener(`tileLoad`,onModelTileLoad),model.removeEventListener(`tileUnload`,onModelTileUnload),model.removeEventListener(`dispose`,onModelDispose)};model.addEventListener(`load`,onModelLoad),model.addEventListener(`error`,onModelError),model.addEventListener(`changeShownFloor`,onModelChangeShownFloor),model.addEventListener(`tileLoad`,onModelTileLoad),model.addEventListener(`tileUnload`,onModelTileUnload),model.addEventListener(`dispose`,onModelDispose),this.emit(`model.request`,createEvent(`model.request`,{work:model.work,model,error:null}))}bindWorkFetcher(work){let five=this,workCode=work.workCode,fetcher=new require_memoryUsage.a({get networkSubscribe(){return five.networkSubscribe},requestProxy(url){return five.requestProxy(url,workCode)}});registerFetcher(this.fiveId,work,fetcher)}commonParams(){return{fiveId:this.fiveId,scene:this.scene,xrCustomObjectsScene:this.xrCustomObjectsScene,helper:this.helperGroup,camera:this.camera,renderer:this.renderer,viewport:this.viewport,element:this.getElement(),works:this.works,imageOptions:this.imageOptions,enableWheel:this.enableWheel,enableHDR:this._enableHDR,extraElements:this.extraElements,videoTexture:this.videoTexture,modelScene:this.modelScene}}applyController(mode,initialParams){if(!this.renderer)throw Error(`renderer is not initialized.`);let Controller=Controllers[mode];this.currentMode=mode;let controller=new Controller(initialParams);for(let name of PROXY_CONTROLLER_EVENT_NAMES)controller.on(name,(...args)=>{if(this.emit(name,...args))return!1});{let nextState=Controllers[mode].initAnimationEndState(initialParams),userAction=initialParams.initial.userAction;stateEqual(this.state,nextState)||(assignState(this.state,nextState),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state}))),this.emit(`currentState.change`,createEvent(`currentState.change`,{userAction,state:this.getCurrentState()}))}return controller.on(`camera.update`,event=>{var _a;if(this.controller){let nextState=this.controller.getTargetState();event.userAction&&this.syncingState===!1&&this.state.mode===nextState.mode&&!stateEqual(this.state,nextState)&&(assignState(this.state,nextState),this.emit(`state.change`,createEvent(`state.change`,{userAction:event.userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}this.emit(`currentState.change`,createEvent(`currentState.change`,{userAction:event.userAction,state:this.getCurrentState()}))}),controller.on(`initAnimation.start`,event=>{var _a;let{state,userAction}=event;userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`initAnimation.end`,event=>{var _a;let{state,userAction}=event;this.pano={workCode:state.workCode,panoIndex:state.panoIndex},userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.moveTo`,event=>{var _a;let{state,userAction}=event;this.pano={workCode:state.workCode,panoIndex:state.panoIndex},userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.arrived`,event=>{var _a;let{state,userAction}=event;this.pano={workCode:state.workCode,panoIndex:state.panoIndex},userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.cancel`,event=>{var _a;let{state,userAction}=event;userAction&&this.state.mode===state.mode&&!stateEqual(this.state,state)&&(assignState(this.state,state),this.emit(`state.change`,createEvent(`state.change`,{userAction,state:this.state})),(_a=this.analysis)==null||_a.state(this.works,this.state))}),controller.on(`pano.moveTo`,event=>{let{userAction}=event;this.emit(`currentState.change`,createEvent(`currentState.change`,{userAction,state:this.getCurrentState()}))}),controller.on(`pano.request`,event=>{this.emit(`pano.request`,event),event.defaultPrevented||this.moveToPano(event.state,event.options,event.userAction)}),controller.on(`vr.requestExit`,()=>{this.currentMode===Five.Mode.VRPanorama&&(this.exitFullscreen(),this.changeMode(Five.Mode.Panorama))}),controller.on(`error`,error=>this.throwError(error)),controller}removeEventListeners(){}get internalLightsEnabled(){let internalLights=this.scene.children.find(child=>child.name===`internalLights`);return internalLights?internalLights.visible:!1}set internalLightsEnabled(value){let internalLights=this.scene.children.find(child=>child.name===`internalLights`);internalLights&&(internalLights.visible=value),internalLights=this.modelScene.children.find(child=>child.name===`internalLights`),internalLights&&(internalLights.visible=value)}get scissor(){return this.viewport}setScissor(scissor){return this.setViewport(scissor)}getPose(){let{longitude,latitude,fov,offset,distance}=this.camera.copyPose();return{longitude,latitude,fov,offset:offset.clone(),distance}}getLongitudeAndLatitude(){let{longitude,latitude}=this.getPose();return{longitude,latitude}}getOffset(){return this.getPose().offset}getCameraLocal(){if(this.pano.workCode&&this.controller&&this.works){let observer=this.works.getObserver(this.pano);if(observer){let object=new three_webgpu.Object3D;object.matrix.copy(observer.matrix).premultiply(observer.work.transform),object.matrix.decompose(object.position,object.quaternion,object.scale),object.matrixAutoUpdate=!1;let lookAtVector=new three_webgpu.Vector3(0,0,-1);lookAtVector.applyQuaternion(this.camera.quaternion);let quaternion=object.quaternion.clone().invert();return lookAtVector.applyQuaternion(quaternion),{theta:Math.atan2(lookAtVector.x,-lookAtVector.z),phi:-Math.asin(lookAtVector.y),lookAtVector}}}return null}addPass(pass){this.fiveRenderer.composer.addPass(pass)}removePass(pass){let index=this.fiveRenderer.composer.passes.indexOf(pass);index!==-1&&this.fiveRenderer.composer.passes.splice(index,1)}insertPass(pass,index){this.fiveRenderer.composer.insertPass(pass,index)}get renderMode(){return this.fiveRenderer.renderMode}set renderMode(value){this.fiveRenderer.renderMode=value}get pointCloudTransparencyMode(){return this.fiveRenderer.pointCloudTransparencyMode}set pointCloudTransparencyMode(value){this.fiveRenderer.pointCloudTransparencyMode=value}get enableEDL(){return this.eyeDomeLightingPass.enabled}set enableEDL(enable){this.eyeDomeLightingPass.enabled=enable,this.needsRender=!0}get enableAdaptiveLuminance(){return this.adaptiveLuminancePass.enabled}set enableAdaptiveLuminance(enable){this.adaptiveLuminancePass.enabled=enable,this.needsRender=!0}get enableHDR(){return this._enableHDR}};Five.Mode={Panorama:`Panorama`,Model:`Model`,Floorplan:`Floorplan`,Topview:`Topview`,Mapview:`Mapview`,VRPanorama:`VRPanorama`,XRPanorama:`XRPanorama`},typeof window<`u`&&Object.assign(window,{__FIVE_DEBUG__:{THREE:three_webgpu,constructor:Five,instances:Five_Instances}});var XRButton=class{static createButton(onClickHook){let button=document.createElement(`button`),ENTER_TEXT=`ENTER VR`,ENTER_LEFT=`calc(50% - 50px)`,ENTER_WIDTH=`100px`,resetTimer;function showEnterVR(){button.style.display=``,button.style.cursor=`pointer`,button.style.left=ENTER_LEFT,button.style.width=ENTER_WIDTH,button.textContent=ENTER_TEXT,button.onmouseenter=function(){button.style.opacity=`1.0`},button.onmouseleave=function(){button.style.opacity=`0.5`},button.onclick=function(){if(!onClickHook)return;let result;try{result=onClickHook()}catch(error){handleEnterFailed(error);return}result&&typeof result.then==`function`&&result.then(void 0,handleEnterFailed)}}function handleEnterFailed(error){let message=error instanceof Error?error.message:String(error);/forceWebGL/.test(message)&&(resetTimer&&clearTimeout(resetTimer),button.textContent=`需降级到 WebGL2`,button.style.left=`calc(50% - 75px)`,button.style.width=`150px`,resetTimer=setTimeout(function(){resetTimer=void 0,button.textContent=ENTER_TEXT,button.style.left=ENTER_LEFT,button.style.width=ENTER_WIDTH},3e3))}function disableButton(){button.style.display=``,button.style.cursor=`auto`,button.style.left=`calc(50% - 75px)`,button.style.width=`150px`,button.onmouseenter=null,button.onmouseleave=null,button.onclick=null}function showWebXRNotFound(){disableButton(),button.textContent=`VR NOT SUPPORTED`}function stylizeElement(element){element.style.position=`absolute`,element.style.bottom=`20px`,element.style.padding=`12px 6px`,element.style.border=`1px solid #fff`,element.style.borderRadius=`4px`,element.style.background=`rgba(0,0,0,0.1)`,element.style.color=`#fff`,element.style.font=`normal 13px sans-serif`,element.style.textAlign=`center`,element.style.opacity=`0.5`,element.style.outline=`none`,element.style.zIndex=`999`}if(`xr`in navigator)return button.id=`VRButton`,button.style.display=`none`,stylizeElement(button),navigator.xr.isSessionSupported(`immersive-vr`).then(function(supported){supported?showEnterVR():showWebXRNotFound()}),button;{let message=document.createElement(`a`);return window.isSecureContext===!1?(message.href=document.location.href.replace(/^http:/,`https:`),message.innerHTML=`WEBXR NEEDS HTTPS`):(message.href=`https://immersiveweb.dev/`,message.innerHTML=`WEBXR NOT AVAILABLE`),message.style.left=`calc(50% - 90px)`,message.style.width=`180px`,message.style.textDecoration=`none`,stylizeElement(message),message}}};exports.AdaptiveLuminancePass=AdaptiveLuminancePass,exports.AnimationFrameLoop=require_imageBitmap.s,exports.BoundingMesh=BoundingMesh,exports.Camera=Camera,exports.EffectComposer=EffectComposer,exports.EyeDomeLightingPass=EyeDomeLightingPass,exports.Fetcher=require_memoryUsage.a,exports.Five=Five,exports.FivePass=FivePass,exports.FiveRenderer=FiveRenderer,exports.FlowingFireworks3DPass=FlowingFireworks3DPass,exports.FlowingLight2DPass=FlowingLight2DPass,exports.FlowingLight3DPass=FlowingLight3DPass,exports.FullScreenQuad=FullScreenQuad,exports.GSPLAT_PIPELINE_AUTO=GSPLAT_PIPELINE_AUTO,exports.GSPLAT_PIPELINE_RASTER_CPU_SORT=GSPLAT_PIPELINE_RASTER_CPU_SORT,exports.GSPLAT_PIPELINE_RASTER_GPU_SORT=GSPLAT_PIPELINE_RASTER_GPU_SORT,exports.GaussianBlurPass=GaussianBlurPass,exports.Histogram=Histogram,exports.InternalWebGPURenderer=InternalWebGPURenderer,exports.Model=Model,exports.ModelScene=ModelScene,exports.Motion=Motion,exports.NetworkSubscribe=require_memoryUsage.c,exports.PBMCustomNode=require_memoryUsage.y,exports.PBMGSObject=require_pbmGaussianSplattingObject.t,exports.PBMGaussianSplattingObject=require_pbmGaussianSplattingObject.t,exports.PBMGaussianSplattingNodeMaterial=PBMGaussianSplattingNodeMaterial,exports.PBMGaussianSplattingRenderMesh=PBMGaussianSplattingRenderMesh,exports.PBMGroup=PBMGroup,exports.PBMMesh=require_pbmMeshMaterial.o,exports.PBMMeshBasicMaterial=require_pbmMeshMaterial.t,exports.PBMMeshBasicNodeMaterial=PBMMeshBasicNodeMaterial,exports.PBMMeshPanoOnlyMaterial=require_pbmMeshMaterial.n,exports.PBMMeshPanoOnlyNodeMaterial=PBMMeshPanoOnlyNodeMaterial,exports.PBMMeshPhongMaterial=require_pbmMeshMaterial.r,exports.PBMMeshPhongNodeMaterial=PBMMeshPhongNodeMaterial,exports.PBMMeshPhysicalMaterial=require_pbmMeshMaterial.i,exports.PBMMeshPhysicalNodeMaterial=PBMMeshPhysicalNodeMaterial,exports.PBMPanoFilter=require_memoryUsage.b,exports.PBMPointCloud=require_memoryUsage.m,exports.PBMPointCloudMaterial=require_memoryUsage.v,exports.PBMSkinnedMesh=require_pbmMeshMaterial.s,exports.PBMUpdateable=require_memoryUsage.x,exports.PBMVertexMarkFlag=require_memoryUsage.S,exports.PROXY_CONTROLLER_EVENT_NAMES=PROXY_CONTROLLER_EVENT_NAMES,exports.PanoCircleMesh=PanoCircleMesh,exports.PanoCircleMeshCustom=PanoCircleMeshCustom,exports.PanoCircleMeshSolid=PanoCircleMeshSolid,exports.Parameter=Parameter,exports.Scene=Scene,exports.Subscribe=require_memoryUsage.j,exports.TextureLoader=require_pick.i,exports.Tile=Tile,exports.Tile3D=Tile3D,exports.Tile3DModel=Tile3D,exports.TileCache=TileCache,exports.TileNode=TileNode,exports.TileRequestScheduler=TileRequestScheduler,exports.Tileset=Tileset,exports.Trajectory=Trajectory,exports.TrajectoryNode=TrajectoryNode,exports.Work=Work,exports.WorkResolvedObserver=WorkResolvedObserver,exports.XRButton=XRButton,exports.controllersDefaultInitArgs=controllersDefaultInitArgs,exports.coordinatesToVector=coordinatesToVector,exports.createDebugBoundingMesh=createDebugBoundingMesh,exports.createWorks=createWorks,exports.customNodesCacheKey=require_memoryUsage.E,exports.defaultImageURLTransform=require_pick.s,exports.draco=require_glTF_helpers.r,exports.getViewportScale=getViewportScale,exports.headingToLongitude=headingToLongitude,exports.imageSupport=require_imageSupport.t,exports.isBoundingVolume=isBoundingVolume,exports.isPanoId=isPanoId,exports.loadAt3d=loadAt3d,exports.loadDome=loadDome,exports.loadDomez=loadDomez,exports.loadGltf=loadGltf,exports.loadPbm=loadPbm,exports.loadPly=loadPly,exports.longitudeToHeading=longitudeToHeading,exports.makeBoundingVolume=makeBoundingVolume,exports.panoEqual=panoEqual,exports.panoParse=panoParse,exports.panoStringify=panoStringify,exports.parseWork=parseWork,exports.registerPBMMaterials=registerPBMMaterials,exports.vectorToCoordinates=vectorToCoordinates,exports.workToJson=workToJson;
|